fixed exidental overwriting of nested api objects by adding the writable properties

pull/12/head
Langenfeld 2021-11-16 16:54:44 +01:00
rodzic f4ca29bfc8
commit a14fda209f
4 zmienionych plików z 23 dodań i 22 usunięć

Wyświetl plik

@ -18,7 +18,7 @@ class Organization(ApiObject):
ORG_HEATMAP = """/users/%s/heatmap""" # <username>
def __init__(self, gitea):
super(Organization, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Organization): return False
@ -122,7 +122,7 @@ class User(ApiObject):
USER_HEATMAP = """/users/%s/heatmap""" # <username>
def __init__(self, gitea):
super(User, self).__init__(gitea)
super().__init__(gitea)
self._emails = []
def __eq__(self, other):
@ -222,7 +222,7 @@ class User(ApiObject):
class Branch(ReadonlyApiObject):
def __init__(self, gitea):
super(Branch, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Branch):
@ -258,7 +258,7 @@ class Repository(ApiObject):
REPO_MILESTONES = """/repos/{owner}/{repo}/milestones"""
def __init__(self, gitea):
super(Repository, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Repository): return False
@ -469,7 +469,7 @@ class Milestone(ApiObject):
API_OBJECT = """/repos/{owner}/{repo}/milestones/{number}""" # <owner, repo>
def __init__(self, gitea):
super(Milestone, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Milestone): return False
@ -508,7 +508,7 @@ class Milestone(ApiObject):
class Comment(ApiObject):
def __init__(self, gitea):
super(Comment, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Comment): return False
@ -525,8 +525,9 @@ class Comment(ApiObject):
class Commit(ReadonlyApiObject):
def __init__(self, gitea):
super(Commit, self).__init__(gitea)
super().__init__(gitea)
_fields_to_parsers = {
# NOTE: api may return None for commiters that are no gitea users
@ -560,7 +561,7 @@ class Issue(ApiObject):
CLOSED = "closed"
def __init__(self, gitea):
super(Issue, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Issue): return False
@ -660,7 +661,7 @@ class Team(ApiObject):
GET_REPOS = """/teams/%s/repos""" # <id>
def __init__(self, gitea):
super(Team, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Team): return False
@ -708,7 +709,7 @@ class Content(ReadonlyApiObject):
FILE = "file"
def __init__(self, gitea):
super(Content, self).__init__(gitea)
super().__init__(gitea)
def __eq__(self, other):
if not isinstance(other, Team): return False

Wyświetl plik

@ -21,7 +21,7 @@ class ReadonlyApiObject:
_fields_to_parsers = {}
@classmethod
def request(cls, gitea, id):
def request(cls, gitea):
if hasattr("API_OBJECT", cls):
return cls._request(gitea)
else:
@ -47,6 +47,7 @@ class ReadonlyApiObject:
@classmethod
def _initialize(cls, gitea, api_object, result):
x = 1
for name, value in result.items():
if name in cls._fields_to_parsers and value is not None:
parse_func = cls._fields_to_parsers[name]
@ -60,10 +61,10 @@ class ReadonlyApiObject:
@classmethod
def _add_read_property(cls, name, value, api_object):
if not hasattr(api_object, name):
setattr(api_object, "_" + name, value)
prop = property(
(lambda name: lambda self: self._get_var(name))(name))
setattr(cls, name, prop)
setattr(api_object, "_" + name, value)
else:
raise AttributeError(f"Attribute {name} already exists on api object.")
@ -98,21 +99,17 @@ class ApiObject(ReadonlyApiObject):
@classmethod
def _initialize(cls, gitea, api_object, result):
super()._initialize(gitea, api_object, result)
for name, value in result.items():
if name in cls._patchable_fields:
cls._add_write_property(name, value, api_object)
# add all patchable fields missing in the request to be writable
for name in cls._patchable_fields:
if not hasattr(api_object, name):
cls._add_write_property(name, None, api_object)
cls._add_write_property(name, None, api_object)
@classmethod
def _add_write_property(cls, name, value, api_object):
if not hasattr(api_object, "_" + name):
setattr(api_object, "_" + name, value)
prop = property(
(lambda name: lambda self: self._get_var(name))(name),
(lambda name: lambda self, v: self.__set_var(name, v))(name))
setattr(cls, name, prop)
setattr(api_object, "_" + name, value)
def __set_var(self, name, i):
if self.deleted:

Wyświetl plik

@ -5,7 +5,7 @@ with open('README.md') as readme_file:
setup_args = dict(
name='py-gitea',
version='0.1.9',
version='0.1.10',
description='A python wrapper for the Gitea API',
long_description_content_type="text/markdown",
long_description=README,

Wyświetl plik

@ -230,9 +230,12 @@ def test_change_issue(instance):
issue2.milestone = milestone
issue2.commit()
del issue2
issue3 = Issue.request(instance, org.username, repo.name, number)
assert issue3.milestone is not None
assert issue3.milestone.description == "this is only a teststone2"
issues = repo.get_issues()
#assert len([issue for issue in issues
# if issue.milestone is not None and issue.milestone.title == ms_title]) > 0
assert len([issue for issue in issues
if issue.milestone is not None and issue.milestone.title == ms_title]) > 0
def test_team_get_org(instance):
org = Organization.request(instance, test_org)