While trying to rebiuld packages from Copr's git in Copr, I'm facing several issues. Probably the first batch of patches is attached:
[PATCH 1/3] [cli] fix packaging for epel-6+ and fedora-22+ [PATCH 2/3] [python] fixes for epel-6+ and fedora-22+ [PATCH 3/3] [backend] fix packaging issues in epel-7+
The status is available here: https://copr.fedoraproject.org/coprs/praiskup/copr-respin-test-2015-12-20/mo...
Pavel
--- cli/copr-cli.spec | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/cli/copr-cli.spec b/cli/copr-cli.spec index 2b9c6ed..3a38bb5 100644 --- a/cli/copr-cli.spec +++ b/cli/copr-cli.spec @@ -1,7 +1,11 @@ -%if 0%{?rhel} < 7 && 0%{?rhel} > 0 +%if 0%{?rhel} > 0 +%if 0%{?rhel} <= 7 %global _pkgdocdir %{_docdir}/%{name}-%{version} +%endif +%if 0%{?rhel} <= 6 %global __python2 %{__python} %endif +%endif
Name: copr-cli Version: 1.46 @@ -76,6 +80,7 @@ install -p -m 644 man/copr-cli.1 %{buildroot}/%{_mandir}/man1/ install -p man/copr.1 %{buildroot}/%{_mandir}/man1/
%files +%{!?_licensedir:%global license %doc} %license LICENSE %doc README.rst %{_bindir}/copr-cli @@ -86,8 +91,9 @@ install -p man/copr.1 %{buildroot}/%{_mandir}/man1/
%if 0%{?fedora} -%license LICENSE %files doc +%{!?_licensedir:%global license %doc} +%license LICENSE %endif
%changelog
- missing @pytest.yield_fixture in epel-6 - portable (Python 2.6) format strings - to_json() hashes do not guarantee item order --- python/copr/client/client.py | 6 ++-- python/copr/client_v2/common.py | 6 ++-- python/copr/client_v2/entities.py | 25 ++++++++--------- python/copr/client_v2/handlers.py | 32 ++++++++++----------- python/copr/client_v2/net_client.py | 10 +++---- python/copr/client_v2/resources.py | 4 +-- python/copr/test/client_v2/test_entities.py | 4 +-- python/copr/test/client_v2/test_handlers.py | 2 +- python/copr/test/client_v2/test_net_client.py | 40 ++++++++++++--------------- python/docs/client_v1/Examples.rst | 10 +++---- python/run_tmp.py | 6 ++-- 11 files changed, 70 insertions(+), 75 deletions(-)
diff --git a/python/copr/client/client.py b/python/copr/client/client.py index 01929b1..79f233f 100644 --- a/python/copr/client/client.py +++ b/python/copr/client/client.py @@ -93,7 +93,7 @@ class CoprClient(UnicodeMixin):
def __unicode__(self): return ( - u"<Copr client. username: {}, api url: {}, login presents: {}, token presents: {}>" + u"<Copr client. username: {0}, api url: {1}, login presents: {2}, token presents: {3}>" .format(self.username, self.api_url, bool(self.login), bool(self.token)) )
@@ -211,8 +211,8 @@ class CoprClient(UnicodeMixin): output = json.loads(response.text) except ValueError: raise CoprUnknownResponseException( - "Unknown response from the server. Code: {}, raw response:" - " \n {}".format(response.status_code, response.text)) + "Unknown response from the server. Code: {0}, raw response:" + " \n {1}".format(response.status_code, response.text)) if response.status_code != 200: raise CoprRequestException(output["error"])
diff --git a/python/copr/client_v2/common.py b/python/copr/client_v2/common.py index 2ccd3ec..bdfe0ba 100644 --- a/python/copr/client_v2/common.py +++ b/python/copr/client_v2/common.py @@ -19,7 +19,7 @@ class BuiltPackage(UnicodeMixin): self.version = version
def __unicode__(self): - return u"{} {}".format(self.name, self.version) + return u"{0} {1}".format(self.name, self.version)
class BuildStateValues(object): @@ -33,7 +33,7 @@ class BuildStateValues(object): IMPORTING = "importing" UNKNOWN = "unknown"
-ALLOWED_BUILD_STATES = { +ALLOWED_BUILD_STATES = set([ BuildStateValues.FAILED, BuildStateValues.SUCCEEDED, BuildStateValues.CANCELED, @@ -43,4 +43,4 @@ ALLOWED_BUILD_STATES = { BuildStateValues.STARTING, BuildStateValues.IMPORTING, BuildStateValues.UNKNOWN, -} +]) diff --git a/python/copr/client_v2/entities.py b/python/copr/client_v2/entities.py index 9750338..de0ae49 100644 --- a/python/copr/client_v2/entities.py +++ b/python/copr/client_v2/entities.py @@ -11,15 +11,14 @@ class Link(UnicodeMixin): self.href = href
def __unicode__(self): - return u"<Link: role: {}, href: {}".format(self.role, self.href) + return u"<Link: role: {0}, href: {1}".format(self.role, self.href)
@classmethod def from_dict(cls, data_dict): - return { - role_name: - cls(role_name, definition["href"]) - for role_name, definition in data_dict.items() - } + retval = {} + for role_name, definition in data_dict.items(): + retval[role_name] = cls(role_name, definition["href"]) + return retval
# pylint: disable=E1101 @@ -46,21 +45,21 @@ class ProjectEntity(Entity): _schema = ProjectSchema(strict=True)
def __unicode__(self): - return "<Project #{}: {}/{}>".format(self.id, self.owner, self.name) + return "<Project #{0}: {1}/{2}>".format(self.id, self.owner, self.name)
class ProjectCreateEntity(Entity): _schema = ProjectCreateSchema(strict=True)
def __unicode__(self): - return "<New project {}/{}>".format(self.owner, self.name) + return "<New project {0}/{1}>".format(self.owner, self.name)
class ProjectChrootEntity(Entity): _schema = ProjectChrootSchema(strict=True)
def __unicode__(self): - return "<Project chroot: {}, additional " \ - "packages: {}, comps size if any: {}>"\ + return "<Project chroot: {0}, additional " \ + "packages: {1}, comps size if any: {2}>"\ .format(self.name, self.buildroot_pkgs, self.comps_len,)
@@ -68,7 +67,7 @@ class BuildEntity(Entity): _schema = BuildSchema(strict=True)
def __unicode__(self): - return "<Build #{} state: {}>".format(self.id, self.state) + return "<Build #{0} state: {1}>".format(self.id, self.state)
def is_finished(self): """ @@ -87,7 +86,7 @@ class BuildTaskEntity(Entity): _schema = BuildTaskSchema(strict=True)
def __unicode__(self): - return "<Build task #{}-{}, state: {}>".format( + return "<Build task #{0}-{1}, state: {2}>".format( self.build_id, self.chroot_name, self.state )
@@ -96,6 +95,6 @@ class MockChrootEntity(Entity): _schema = MockChrootSchema(strict=True)
def __unicode__(self): - return "<Mock chroot: {} is active: {}>".format( + return "<Mock chroot: {0} is active: {1}>".format( self.name, self.is_active ) diff --git a/python/copr/client_v2/handlers.py b/python/copr/client_v2/handlers.py index ee745d9..da9fa07 100644 --- a/python/copr/client_v2/handlers.py +++ b/python/copr/client_v2/handlers.py @@ -32,7 +32,7 @@ class BuildHandle(AbstractHandle): def __init__(self, client, nc, root_url, builds_href): super(BuildHandle, self).__init__(client, nc, root_url) self.builds_href = builds_href - self._base_url = "{}{}".format(self.root_url, builds_href) + self._base_url = "{0}{1}".format(self.root_url, builds_href)
def get_base_url(self): return self._base_url @@ -45,7 +45,7 @@ class BuildHandle(AbstractHandle): """
options = {"build_id": build_id} - url = "{}/{}".format(self.get_base_url(), build_id) + url = "{0}/{1}".format(self.get_base_url(), build_id) response = self.nc.request(url) return Build.from_response( handle=self, @@ -85,7 +85,7 @@ class BuildHandle(AbstractHandle): build_id = build_entity.id build_entity.state = "canceled"
- url = "{}/{}".format(self.get_base_url(), build_id) + url = "{0}/{1}".format(self.get_base_url(), build_id) response = self.nc.request(url, data=build_entity.to_json(), method="PUT", do_auth=True) return OperationResult(self, response)
@@ -97,7 +97,7 @@ class BuildHandle(AbstractHandle): :rtype: :py:class:`.OperationResult` """
- url = "{}/{}".format(self.get_base_url(), build_id) + url = "{0}/{1}".format(self.get_base_url(), build_id) response = self.nc.request(url, method="delete", do_auth=True) return OperationResult(self, response, expected_status=204)
@@ -212,7 +212,7 @@ class BuildTaskHandle(AbstractHandle): def __init__(self, client, nc, root_url, build_tasks_href): super(BuildTaskHandle, self).__init__(client, nc, root_url) self.build_tasks_href = build_tasks_href - self._base_url = "{}{}".format(self.root_url, build_tasks_href) + self._base_url = "{0}{1}".format(self.root_url, build_tasks_href)
def get_base_url(self): return self._base_url @@ -256,7 +256,7 @@ class BuildTaskHandle(AbstractHandle): :rtype: :py:class:`~.resources.BuildTask` """
- url = "{}/{}/{}".format(self.get_base_url(), build_id, chroot_name) + url = "{0}/{1}/{2}".format(self.get_base_url(), build_id, chroot_name) response = self.nc.request(url) return BuildTask.from_response( handle=self, @@ -270,7 +270,7 @@ class ProjectHandle(AbstractHandle): def __init__(self, client, nc, root_url, projects_href): super(ProjectHandle, self).__init__(client, nc, root_url) self.projects_href = projects_href - self._base_url = "{}{}".format(self.root_url, projects_href) + self._base_url = "{0}{1}".format(self.root_url, projects_href)
def get_base_url(self): return self._base_url @@ -309,7 +309,7 @@ class ProjectHandle(AbstractHandle): # "show_chroots": show_chroots }
- url = "{}/{}".format(self.get_base_url(), project_id) + url = "{0}/{1}".format(self.get_base_url(), project_id) response = self.nc.request(url, query_params=query_params) return Project.from_response( handle=self, @@ -374,7 +374,7 @@ class ProjectHandle(AbstractHandle): :type project_entity: :py:class:`~.ProjectEntity` :rtype: OperationResult """ - url = "{}/{}".format(self.get_base_url(), project_entity.id) + url = "{0}/{1}".format(self.get_base_url(), project_entity.id) data = project_entity.to_json()
response = self.nc.request(url, method="put", data=data, do_auth=True) @@ -386,7 +386,7 @@ class ProjectHandle(AbstractHandle): :param int project_id: project identifier :rtype: OperationResult """ - url = "{}/{}".format(self.get_base_url(), project_id) + url = "{0}/{1}".format(self.get_base_url(), project_id) response = self.nc.request(url, method="delete", do_auth=True) return OperationResult(self, response, expected_status=204)
@@ -415,7 +415,7 @@ class ProjectChrootHandle(AbstractHandle): """ :type project: copr.client_v2.resources.Project """ - return "{}{}".format(self.root_url, project.get_href_by_name("chroots")) + return "{0}{1}".format(self.root_url, project.get_href_by_name("chroots"))
def get_one(self, project, name): """ Retrieves project chroot object. @@ -427,7 +427,7 @@ class ProjectChrootHandle(AbstractHandle): :rtype: :py:class:`~copr.client_v2.resources.ProjectChroot` """
- url = "{}/{}".format(self.get_base_url(project), name) + url = "{0}/{1}".format(self.get_base_url(project), name) response = self.nc.request(url)
return ProjectChroot.from_response( @@ -460,7 +460,7 @@ class ProjectChrootHandle(AbstractHandle):
:param str name: chroot name to disable """ - url = "{}/{}".format(self.get_base_url(project), name) + url = "{0}/{1}".format(self.get_base_url(project), name) response = self.nc.request(url, method="DELETE", do_auth=True) return OperationResult(self, response)
@@ -498,7 +498,7 @@ class ProjectChrootHandle(AbstractHandle):
:rtype: :py:class:`.OperationResult` """ - url = "{}/{}".format(self.get_base_url(project), chroot_entity.name) + url = "{0}/{1}".format(self.get_base_url(project), chroot_entity.name) response = self.nc.request( url, method="PUT", @@ -513,7 +513,7 @@ class MockChrootHandle(AbstractHandle): def __init__(self, client, nc, root_url, href): super(MockChrootHandle, self).__init__(client, nc, root_url) self._href = href - self._base_url = "{}{}".format(self.root_url, href) + self._base_url = "{0}{1}".format(self.root_url, href)
def get_base_url(self): return self._base_url @@ -525,7 +525,7 @@ class MockChrootHandle(AbstractHandle):
:rtype: :py:class:`~copr.client_v2.resources.MockChroot` """ - url = "{}/{}".format(self.get_base_url(), name) + url = "{0}/{1}".format(self.get_base_url(), name) response = self.nc.get(url) return MockChroot.from_response( handle=self, diff --git a/python/copr/client_v2/net_client.py b/python/copr/client_v2/net_client.py index f44073d..369b651 100644 --- a/python/copr/client_v2/net_client.py +++ b/python/copr/client_v2/net_client.py @@ -34,7 +34,7 @@ class RequestError(Exception, UnicodeMixin): except (ValueError, AttributeError): raise ValueError( "Malformed response, couldn't " - "get json content, raw:\n{}" + "get json content, raw:\n{0}" .format(self.response.text) )
@@ -43,10 +43,10 @@ class RequestError(Exception, UnicodeMixin): return None
def __unicode__(self): - res = "Error occurred while accessing {}: {}\n".format( + res = "Error occurred while accessing {0}: {1}\n".format( self.url, self.msg) if self.response is not None: - res += "code {}: {}\n".format(self.response.status_code, self.response_json["message"]) + res += "code {0}: {1}\n".format(self.response.status_code, self.response_json["message"]) return res
@@ -58,7 +58,7 @@ class NetworkError(RequestError):
def __unicode__(self): res = super(NetworkError, self).__unicode__() - res += u"Original error: {}\n".format(self.requests_error) + res += u"Original error: {0}\n".format(self.requests_error) return res
@@ -134,7 +134,7 @@ class NetClient(object): if method is None: method = "get" elif method.lower() not in ["get", "post", "delete", "put"]: - raise RequestError("Method {} not allowed".format(method), url) + raise RequestError("Method {0} not allowed".format(method), url)
kwargs = {} headers = headers or {} diff --git a/python/copr/client_v2/resources.py b/python/copr/client_v2/resources.py index b4abcc4..b60f207 100644 --- a/python/copr/client_v2/resources.py +++ b/python/copr/client_v2/resources.py @@ -116,7 +116,7 @@ class Root(IndividualResource): """ :param str resource_name: """ - return "{}{}".format(self.root_url, self.get_href_by_name(resource_name)) + return "{0}{1}".format(self.root_url, self.get_href_by_name(resource_name))
@classmethod def from_response(cls, response, root_url): @@ -412,7 +412,7 @@ class OperationResult(IndividualResource): def __unicode__(self): out = u"<Result: " if self._response: - out += u" status: {}".format(self._response.status_code) + out += u" status: {0}".format(self._response.status_code) out += u">"
return out diff --git a/python/copr/test/client_v2/test_entities.py b/python/copr/test/client_v2/test_entities.py index 44b008d..ff00c79 100644 --- a/python/copr/test/client_v2/test_entities.py +++ b/python/copr/test/client_v2/test_entities.py @@ -35,6 +35,6 @@ class TestEntities(object): set([("foo", "baz"), ("bar", 123)])
def test_to_json(self): - assert self.entity.to_json() == \ - '{"foo": "baz", "bar": 123}' + assert self.entity.to_json() == '{"foo": "baz", "bar": 123}' \ + or self.entity.to_json() == '{"bar": 123, "foo": "baz"}'
diff --git a/python/copr/test/client_v2/test_handlers.py b/python/copr/test/client_v2/test_handlers.py index 8af03ba..73a4fe3 100644 --- a/python/copr/test/client_v2/test_handlers.py +++ b/python/copr/test/client_v2/test_handlers.py @@ -210,4 +210,4 @@ class TestProjectHandle(TestHandleBase): ca = self.nc.request.call_args
assert ca[1]["method"] == "delete" - assert ca[0][0] == self.root_url + "/api_2/projects/{}".format(self.project_1_id) + assert ca[0][0] == self.root_url + "/api_2/projects/{0}".format(self.project_1_id) diff --git a/python/copr/test/client_v2/test_net_client.py b/python/copr/test/client_v2/test_net_client.py index 826452f..80470a1 100644 --- a/python/copr/test/client_v2/test_net_client.py +++ b/python/copr/test/client_v2/test_net_client.py @@ -14,12 +14,6 @@ import pytest from copr.client_v2.net_client import NetClient, RequestError
-@pytest.yield_fixture -def mc_request(): - with mock.patch('copr.client_v2.net_client.request') as handle: - yield handle - - class TestNetClient(object):
def setup_method(self, method): @@ -42,20 +36,22 @@ class TestNetClient(object): self.nc = NetClient() self.nc_with_auth = NetClient(self.login, self.password)
- def test_get_simple(self, mc_request): - mc_request.return_value = self.base_response - res = self.nc.request(self.base_url) - # import ipdb; ipdb.set_trace() - assert res.status_code == self.base_response.status_code - assert res.json == self.content - assert res.headers == self.base_response.headers - - def test_unsupported_method(self, mc_request): - with pytest.raises(RequestError) as exc_info: - self.nc.request(self.base_url, method="non_existing_method") - - # some coverage for Request error - assert str(exc_info.value) is not None - with pytest.raises(ValueError): + def test_get_simple(self): + with mock.patch('copr.client_v2.net_client.request') as mc_request: + mc_request.return_value = self.base_response + res = self.nc.request(self.base_url) # import ipdb; ipdb.set_trace() - assert exc_info.value.response_json + assert res.status_code == self.base_response.status_code + assert res.json == self.content + assert res.headers == self.base_response.headers + + def test_unsupported_method(self): + with mock.patch('copr.client_v2.net_client.request') as mc_request: + with pytest.raises(RequestError) as exc_info: + self.nc.request(self.base_url, method="non_existing_method") + + # some coverage for Request error + assert str(exc_info.value) is not None + with pytest.raises(ValueError): + # import ipdb; ipdb.set_trace() + assert exc_info.value.response_json diff --git a/python/docs/client_v1/Examples.rst b/python/docs/client_v1/Examples.rst index 37171e2..d298a8b 100644 --- a/python/docs/client_v1/Examples.rst +++ b/python/docs/client_v1/Examples.rst @@ -73,7 +73,7 @@ Work with builds
# retrieve build statuses for bw in result.builds_list: - print("{}:{}".format(bw.build_id, bw.handle.get_build_details().status)) + print("{0}:{1}".format(bw.build_id, bw.handle.get_build_details().status))
# cancel all created build for bw in result.builds_list: @@ -81,21 +81,21 @@ Work with builds
# get build status for each chroot for bw in result.builds_list: - print("build: {}".format(bw.build_id)) + print("build: {0}".format(bw.build_id)) for ch, status in bw.handle.get_build_details().data["chroots"].items(): - print("\t chroot {}:\t {}".format(ch, status)) + print("\t chroot {0}:\t {1}".format(ch, status))
# simple build progress: import time, datetime watched = set(result.builds_list) done = set() while watched != done: - print("time: {}".format(datetime.datetime.now())) + print("time: {0}".format(datetime.datetime.now())) for bw in watched: if bw in done: continue status = bw.handle.get_build_details().status - print("{}: {}".format(bw.build_id, status)) + print("{0}: {1}".format(bw.build_id, status)) if status in ["skipped", "failed", "succeeded"]: done.add(bw) time.sleep(10) diff --git a/python/run_tmp.py b/python/run_tmp.py index 780db44..de0d827 100644 --- a/python/run_tmp.py +++ b/python/run_tmp.py @@ -23,7 +23,7 @@ def main(): )
def pp(project): - print("Project: {} id {}, {}\n {}\n{}".format( + print("Project: {0} id {1}, {2}\n {3}\n{4}".format( project.name, project.id, project.description, @@ -145,9 +145,9 @@ if __name__ == "__main__": main() except RequestError as err: log.exception(err) - log.error("error occurred while fetching: {}, with params: {}" + log.error("error occurred while fetching: {0}, with params: {1}" .format(err.url, err.request_kwargs)) - log.error("status code: {}, message: {} {}" + log.error("status code: {0}, message: {1} {2}" .format(err.response.status_code, err.msg, err.response_json)) except Exception: log.exception("something went wrong")
--- backend/copr-backend.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/copr-backend.spec b/backend/copr-backend.spec index 50f350f..559a97b 100644 --- a/backend/copr-backend.spec +++ b/backend/copr-backend.spec @@ -1,4 +1,4 @@ -%if 0%{?rhel} < 7 && 0%{?rhel} > 0 +%if 0%{?rhel} <= 7 && 0%{?rhel} > 0 %global _pkgdocdir %{_docdir}/%{name}-%{version} %endif
Dne 21.12.2015 v 01:40 Pavel Raiskup napsal(a):
While trying to rebiuld packages from Copr's git in Copr, I'm facing several issues. Probably the first batch of patches is attached:
[PATCH 1/3] [cli] fix packaging for epel-6+ and fedora-22+ [PATCH 2/3] [python] fixes for epel-6+ and fedora-22+ [PATCH 3/3] [backend] fix packaging issues in epel-7+
The status is available here: https://copr.fedoraproject.org/coprs/praiskup/copr-respin-test-2015-12-20/mo...
Committed and pushed. Thank you.
copr-devel@lists.fedorahosted.org