Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Path not supported for some path arguments #769

Open
AlexandreKempf opened this issue Feb 5, 2024 · 6 comments
Open

Path not supported for some path arguments #769

AlexandreKempf opened this issue Feb 5, 2024 · 6 comments
Labels
A: dvcyaml Area: `live.make_dvcyaml` bug Did we break something? p2-medium

Comments

@AlexandreKempf
Copy link
Contributor

Most of the path arguments handle both str and pathlib.Path object.

It is not the case for Live's dvcyaml while it should probably be.

@dberenbaum dberenbaum added bug Did we break something? A: dvcyaml Area: `live.make_dvcyaml` labels Feb 5, 2024
@AbdullahMakhdoom
Copy link
Contributor

AbdullahMakhdoom commented Jun 1, 2024

Hi @dberenbaum, I'm interested in contributing to dvclive, and I believe this issue is a great starting point.
If I'm not mistaken, it appears that the Live's dvcyaml argument should also accept pathlib.Path objects. Therefore, the argument should be defined as dvcyaml: Optional[Union[str, pathlib.Path]] = "dvc.yaml"
Could you confirm if my understanding is correct?

@dberenbaum
Copy link
Collaborator

If I'm not mistaken, it appears that the Live's dvcyaml argument should also accept pathlib.Path objects.

Correct.

Therefore, the argument should be defined as dvcyaml: Optional[Union[str, pathlib.Path]] = "dvc.yaml"

Partially correct. Fixing the type hint would be nice, but the underlying issue goes deeper. If you try an example with dvcyaml set to some pathlib.Path value, you should see where it breaks. This issue is to fix any underlying problems so that pathlib.Path values work.

@AbdullahMakhdoom
Copy link
Contributor

@dberenbaum I tried passing dvcyaml arguments a pathlib.Path value, it did not break but rather silently defaulted to "dvc.yaml" as mentioned by this function.

One solution I could think of is type converting to string, like....

  def _init_dvc_file(self) -> str:
      if isinstance(self._dvcyaml, Path):
          self._dvcyaml = str(self._dvcyaml)
      if isinstance(self._dvcyaml, str):
          if os.path.basename(self._dvcyaml) == "dvc.yaml":
              return self._dvcyaml
          raise InvalidDvcyamlError
      return "dvc.yaml"

I've manually tested the changes, and they work as expected. What do you think of this solution?

@shcheklein
Copy link
Member

@AbdullahMakhdoom I think it's fine to fix it this way. I would also add something like:

if self._dvcyaml:
raise InvalidDvcyamlError("DVC file path mush be of str or Path type")

before the return dvc.yaml

so that we don't silently return some default value

@AbdullahMakhdoom
Copy link
Contributor

Alright @shcheklein. One quick question before I open a PR: Do you think it's worth adding a test case for this change, or is it too minor to require one?

@AbdullahMakhdoom
Copy link
Contributor

I can parametrize this test for dvcyaml argument, something like....

@pytest.mark.parametrize("dvcyaml_path", ["dvc.yaml", Path("dvcyaml/dvc.yaml")])
def test_test_mode(tmp_dir, monkeypatch, mocked_dvc_repo, dvcyaml_path):
    monkeypatch.setenv(DVCLIVE_TEST, "true")
    live = Live("dir", dvcyaml=dvcyaml_path)
    live.make_dvcyaml()
    assert live._dir != "dir"
    assert live._dvc_file != "dvc.yaml"
    assert live._save_dvc_exp is False
    assert not os.path.exists("dir")
    assert not os.path.exists(dvcyaml_path)

Took inspiration from this sibling function, which is in the same test_dvc.py file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A: dvcyaml Area: `live.make_dvcyaml` bug Did we break something? p2-medium
Projects
None yet
Development

No branches or pull requests

4 participants