Skip to content

Commit f84a56e

Browse files
committed
refactor(git)!: Use dataclass for GitRemote
1 parent d19609f commit f84a56e

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

libvcs/projects/git.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
- [`GitProject.get_revision`](libvcs.git.GitProject.get_revision)
1515
- [`GitProject.get_git_version`](libvcs.git.GitProject.get_git_version)
1616
""" # NOQA: E501
17+
import dataclasses
1718
import logging
1819
import pathlib
1920
import re
@@ -26,23 +27,27 @@
2627
logger = logging.getLogger(__name__)
2728

2829

29-
class GitRemote(NamedTuple):
30-
"""Structure containing git repo information.
31-
32-
Supports `collections.namedtuple._asdict()`
33-
"""
30+
class GitRemoteDict(TypedDict):
31+
"""For use when hydrating GitProject via dict."""
3432

35-
name: str
3633
fetch_url: str
3734
push_url: str
3835

3936

40-
class GitRemoteDict(TypedDict):
41-
"""For use when hydrating GitProject via dict."""
37+
@dataclasses.dataclass
38+
class GitRemote:
39+
"""Structure containing git working copy information."""
4240

41+
name: str
4342
fetch_url: str
4443
push_url: str
4544

45+
def to_dict(self):
46+
return dataclasses.asdict(self)
47+
48+
def to_tuple(self):
49+
return dataclasses.astuple(self)
50+
4651

4752
GitProjectRemoteDict = Dict[str, GitRemote]
4853
GitFullRemoteDict = Dict[str, GitRemoteDict]
@@ -487,7 +492,7 @@ def remotes(self, flat=False) -> Dict:
487492

488493
for remote_name in ret:
489494
remotes[remote_name] = (
490-
self.remote(remote_name) if flat else self.remote(remote_name)._asdict()
495+
self.remote(remote_name) if flat else self.remote(remote_name).to_dict()
491496
)
492497
return remotes
493498

tests/projects/test_git.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ def test_remotes(
315315
expected_remote_name,
316316
expected_remote_url,
317317
expected_remote_url,
318-
) == git_repo.remote(expected_remote_name)
318+
) == git_repo.remote(expected_remote_name).to_tuple()
319319

320320

321321
@pytest.mark.parametrize(
@@ -493,7 +493,7 @@ def test_remotes_preserves_git_ssh(
493493
git_repo.set_remote(name=remote_name, url=remote_url)
494494

495495
assert (
496-
GitRemote(remote_name, remote_url, remote_url)._asdict()
496+
GitRemote(remote_name, remote_url, remote_url).to_dict()
497497
in git_repo.remotes().values()
498498
)
499499

@@ -553,9 +553,12 @@ def test_get_remotes(git_repo: GitProject):
553553
def test_set_remote(git_repo: GitProject, repo_name: str, new_repo_url: str):
554554
mynewremote = git_repo.set_remote(name=repo_name, url="file:///")
555555

556-
assert "file:///" in mynewremote, "set_remote returns remote"
556+
assert "file:///" in mynewremote.fetch_url, "set_remote returns remote"
557557

558-
assert "file:///" in git_repo.remote(name=repo_name), "remote returns remote"
558+
assert isinstance(
559+
git_repo.remote(name=repo_name), GitRemote
560+
), "remote() returns GitRemote"
561+
assert "file:///" in git_repo.remote(name=repo_name).fetch_url, "new value set"
559562

560563
assert "myrepo" in git_repo.remotes(), ".remotes() returns new remote"
561564

@@ -567,8 +570,8 @@ def test_set_remote(git_repo: GitProject, repo_name: str, new_repo_url: str):
567570

568571
mynewremote = git_repo.set_remote(name="myrepo", url=new_repo_url, overwrite=True)
569572

570-
assert new_repo_url in git_repo.remote(
571-
name="myrepo"
573+
assert (
574+
new_repo_url in git_repo.remote(name="myrepo").fetch_url
572575
), "Running remove_set should overwrite previous remote"
573576

574577

0 commit comments

Comments
 (0)