From a2382fb4b4450fb1abb262df0b8cd9b93ca4c650 Mon Sep 17 00:00:00 2001 From: Gonchik Tsymzhitov Date: Sat, 3 Dec 2022 21:14:26 +0200 Subject: [PATCH 1/4] Add support of imports Python 2.7 --- atlassian/bamboo.py | 286 +++++-- atlassian/bitbucket/__init__.py | 760 +++++++++++++---- atlassian/bitbucket/base.py | 31 +- atlassian/bitbucket/cloud/__init__.py | 8 +- atlassian/bitbucket/cloud/base.py | 19 +- atlassian/bitbucket/cloud/common/builds.py | 4 +- atlassian/bitbucket/cloud/common/comments.py | 9 +- atlassian/bitbucket/cloud/common/users.py | 8 +- .../bitbucket/cloud/repositories/__init__.py | 60 +- .../cloud/repositories/branchRestrictions.py | 4 +- .../bitbucket/cloud/repositories/commits.py | 29 +- .../cloud/repositories/defaultReviewers.py | 10 +- .../bitbucket/cloud/repositories/diffstat.py | 15 +- .../bitbucket/cloud/repositories/issues.py | 4 +- .../bitbucket/cloud/repositories/pipelines.py | 48 +- .../cloud/repositories/pullRequests.py | 42 +- .../bitbucket/cloud/repositories/refs.py | 12 +- .../bitbucket/cloud/workspaces/__init__.py | 12 +- .../bitbucket/cloud/workspaces/projects.py | 18 +- atlassian/bitbucket/server/__init__.py | 16 +- atlassian/bitbucket/server/base.py | 10 +- .../bitbucket/server/common/permissions.py | 18 +- .../bitbucket/server/globalPermissions.py | 28 +- .../bitbucket/server/projects/__init__.py | 22 +- .../server/projects/repos/__init__.py | 33 +- atlassian/confluence.py | 572 ++++++++++--- atlassian/crowd.py | 58 +- atlassian/insight.py | 87 +- atlassian/jira.py | 768 ++++++++++++++---- atlassian/portfolio.py | 31 +- atlassian/rest_client.py | 63 +- atlassian/service_desk.py | 274 +++++-- atlassian/utils.py | 4 +- atlassian/xray.py | 115 ++- 34 files changed, 2679 insertions(+), 799 deletions(-) diff --git a/atlassian/bamboo.py b/atlassian/bamboo.py index a5248855e..9e6fe0ca1 100755 --- a/atlassian/bamboo.py +++ b/atlassian/bamboo.py @@ -62,7 +62,15 @@ def _get_generator( yield response def base_list_call( - self, resource, expand, favourite, clover_enabled, max_results, label=None, start_index=0, **kwargs + self, + resource, + expand, + favourite, + clover_enabled, + max_results, + label=None, + start_index=0, + **kwargs ): flags = [] params = {"max-results": max_results} @@ -85,11 +93,19 @@ def base_list_call( max_results=max_results, ) params["start-index"] = start_index - return self.get(self.resource_url(resource), flags=flags, params=params) + return self.get( + self.resource_url(resource), flags=flags, params=params + ) """ Projects & Plans """ - def projects(self, expand=None, favourite=False, clover_enabled=False, max_results=25): + def projects( + self, + expand=None, + favourite=False, + clover_enabled=False, + max_results=25, + ): return self.base_list_call( "project", expand=expand, @@ -100,7 +116,9 @@ def projects(self, expand=None, favourite=False, clover_enabled=False, max_resul element_key="project", ) - def project(self, project_key, expand=None, favourite=False, clover_enabled=False): + def project( + self, project_key, expand=None, favourite=False, clover_enabled=False + ): resource = "project/{}".format(project_key) return self.base_list_call( resource=resource, @@ -174,7 +192,9 @@ def get_plan(self, plan_key, expand=None): resource = "rest/api/latest/plan/{}".format(plan_key) return self.get(resource, params=params) - def search_plans(self, search_term, fuzzy=True, start_index=0, max_results=25): + def search_plans( + self, search_term, fuzzy=True, start_index=0, max_results=25 + ): """ Search plans by name :param search_term: str @@ -187,7 +207,12 @@ def search_plans(self, search_term, fuzzy=True, start_index=0, max_results=25): resource = "rest/api/latest/search/plans" return self.get( resource, - params={"fuzzy": fuzzy, "searchTerm": search_term, "max-results": max_results, "start-index": start_index}, + params={ + "fuzzy": fuzzy, + "searchTerm": search_term, + "max-results": max_results, + "start-index": start_index, + }, ) def delete_plan(self, plan_key): @@ -219,7 +244,9 @@ def enable_plan(self, plan_key): """ Branches """ - def search_branches(self, plan_key, include_default_branch=True, max_results=25, start=0): + def search_branches( + self, plan_key, include_default_branch=True, max_results=25, start=0 + ): params = { "max-result": max_results, "start-index": start, @@ -228,7 +255,9 @@ def search_branches(self, plan_key, include_default_branch=True, max_results=25, } size = 1 while params["start-index"] < size: - results = self.get(self.resource_url("search/branches"), params=params) + results = self.get( + self.resource_url("search/branches"), params=params + ) size = results["size"] for r in results["searchResults"]: yield r @@ -261,7 +290,9 @@ def get_branch_info(self, plan_key, branch_name): :param branch_name: :return: """ - resource = "plan/{plan_key}/branch/{branch_name}".format(plan_key=plan_key, branch_name=branch_name) + resource = "plan/{plan_key}/branch/{branch_name}".format( + plan_key=plan_key, branch_name=branch_name + ) return self.get(self.resource_url(resource)) def create_branch( @@ -284,7 +315,9 @@ def create_branch( :param cleanup_enabled: bool :return: PUT request """ - resource = "plan/{plan_key}/branch/{branch_name}".format(plan_key=plan_key, branch_name=branch_name) + resource = "plan/{plan_key}/branch/{branch_name}".format( + plan_key=plan_key, branch_name=branch_name + ) params = {} if vcs_branch: params = dict( @@ -346,7 +379,9 @@ def results( """ resource = "result" if project_key and plan_key and job_key and build_number: - resource += "/{}-{}-{}/{}".format(project_key, plan_key, job_key, build_number) + resource += "/{}-{}-{}/{}".format( + project_key, plan_key, job_key, build_number + ) elif project_key and plan_key and build_number: resource += "/{}-{}/{}".format(project_key, plan_key, build_number) elif project_key and plan_key: @@ -483,7 +518,14 @@ def plan_results( include_all_states=include_all_states, ) - def build_result(self, build_key, expand=None, include_all_states=False, start=0, max_results=25): + def build_result( + self, + build_key, + expand=None, + include_all_states=False, + start=0, + max_results=25, + ): """ Returns details of a specific build result :param expand: expands build result details on request. Possible values are: artifacts, comments, labels, @@ -508,9 +550,15 @@ def build_result(self, build_key, expand=None, include_all_states=False, start=0 include_all_states=include_all_states, ) except ValueError: - raise ValueError('The key "{}" does not correspond to a build result'.format(build_key)) + raise ValueError( + 'The key "{}" does not correspond to a build result'.format( + build_key + ) + ) - def build_latest_result(self, plan_key, expand=None, include_all_states=False): + def build_latest_result( + self, plan_key, expand=None, include_all_states=False + ): """ Returns details of a latest build result :param expand: expands build result details on request. Possible values are: artifacts, comments, labels, @@ -531,7 +579,11 @@ def build_latest_result(self, plan_key, expand=None, include_all_states=False): include_all_states=include_all_states, ) except ValueError: - raise ValueError('The key "{}" does not correspond to the latest build result'.format(plan_key)) + raise ValueError( + 'The key "{}" does not correspond to the latest build result'.format( + plan_key + ) + ) def delete_build_result(self, build_key): """ @@ -543,9 +595,18 @@ def delete_build_result(self, build_key): plan_key = "{}-{}".format(build_key[0], build_key[1]) build_number = build_key[2] params = {"buildKey": plan_key, "buildNumber": build_number} - return self.post(custom_resource, params=params, headers=self.form_token_headers) + return self.post( + custom_resource, params=params, headers=self.form_token_headers + ) - def execute_build(self, plan_key, stage=None, execute_all_stages=True, custom_revision=None, **bamboo_variables): + def execute_build( + self, + plan_key, + stage=None, + execute_all_stages=True, + custom_revision=None, + **bamboo_variables + ): """ Fire build execution for specified plan. !IMPORTANT! NOTE: for some reason, this method always execute all stages @@ -581,30 +642,56 @@ def stop_build(self, plan_key): """ Comments & Labels """ - def comments(self, project_key, plan_key, build_number, start_index=0, max_results=25): - resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number) + def comments( + self, + project_key, + plan_key, + build_number, + start_index=0, + max_results=25, + ): + resource = "result/{}-{}-{}/comment".format( + project_key, plan_key, build_number + ) params = {"start-index": start_index, "max-results": max_results} return self.get(self.resource_url(resource), params=params) - def create_comment(self, project_key, plan_key, build_number, comment, author=None): - resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number) + def create_comment( + self, project_key, plan_key, build_number, comment, author=None + ): + resource = "result/{}-{}-{}/comment".format( + project_key, plan_key, build_number + ) comment_data = { "author": author if author else self.username, "content": comment, } return self.post(self.resource_url(resource), data=comment_data) - def labels(self, project_key, plan_key, build_number, start_index=0, max_results=25): - resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number) + def labels( + self, + project_key, + plan_key, + build_number, + start_index=0, + max_results=25, + ): + resource = "result/{}-{}-{}/label".format( + project_key, plan_key, build_number + ) params = {"start-index": start_index, "max-results": max_results} return self.get(self.resource_url(resource), params=params) def create_label(self, project_key, plan_key, build_number, label): - resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number) + resource = "result/{}-{}-{}/label".format( + project_key, plan_key, build_number + ) return self.post(self.resource_url(resource), data={"name": label}) def delete_label(self, project_key, plan_key, build_number, label): - resource = "result/{}-{}-{}/label/{}".format(project_key, plan_key, build_number, label) + resource = "result/{}-{}-{}/label/{}".format( + project_key, plan_key, build_number, label + ) return self.delete(self.resource_url(resource)) def get_projects(self): @@ -614,7 +701,9 @@ def get_projects(self): max_results = 25 while True: - resource = "project?start-index={}&max-result={}".format(start_idx, max_results) + resource = "project?start-index={}&max-result={}".format( + start_idx, max_results + ) r = self.get(self.resource_url(resource)) @@ -656,8 +745,12 @@ def delete_deployment_project(self, project_id): resource = "deploy/project/{}".format(project_id) return self.delete(self.resource_url(resource)) - def deployment_environment_results(self, env_id, expand=None, max_results=25): - resource = "deploy/environment/{environmentId}/results".format(environmentId=env_id) + def deployment_environment_results( + self, env_id, expand=None, max_results=25 + ): + resource = "deploy/environment/{environmentId}/results".format( + environmentId=env_id + ) params = {"max-result": max_results, "start-index": 0} size = 1 if expand: @@ -674,7 +767,11 @@ def deployment_dashboard(self, project_id=None): Returns the current status of each deployment environment If no project id is provided, returns all projects. """ - resource = "deploy/dashboard/{}".format(project_id) if project_id else "deploy/dashboard" + resource = ( + "deploy/dashboard/{}".format(project_id) + if project_id + else "deploy/dashboard" + ) return self.get(self.resource_url(resource)) """ Users & Groups """ @@ -747,7 +844,9 @@ def remove_users_from_group(self, group_name, users): url = "rest/api/latest/admin/groups/{}/remove-users".format(group_name) return self.delete(url, data=users) - def get_users_from_group(self, group_name, filter_users=None, start=0, limit=25): + def get_users_from_group( + self, group_name, filter_users=None, start=0, limit=25 + ): """ Retrieves a list of users that are members of a specified group. The authenticated user must have restricted administrative permission or higher to use this resource. @@ -763,7 +862,9 @@ def get_users_from_group(self, group_name, filter_users=None, start=0, limit=25) url = "rest/api/latest/admin/groups/{}/more-members".format(group_name) return self.get(url, params=params) - def get_users_not_in_group(self, group_name, filter_users="", start=0, limit=25): + def get_users_not_in_group( + self, group_name, filter_users="", start=0, limit=25 + ): """ Retrieves a list of users that are not members of a specified group. The authenticated user must have restricted administrative permission or higher to use this resource. @@ -777,7 +878,9 @@ def get_users_not_in_group(self, group_name, filter_users="", start=0, limit=25) if filter_users: params = {"filter": filter_users} - url = "rest/api/latest/admin/groups/{}/more-non-members".format(group_name) + url = "rest/api/latest/admin/groups/{}/more-non-members".format( + group_name + ) return self.get(url, params=params) def get_build_queue(self, expand="queuedBuilds"): @@ -789,7 +892,9 @@ def get_build_queue(self, expand="queuedBuilds"): params = {"expand": expand} return self.get("rest/api/latest/queue", params=params) - def get_deployment_users(self, deployment_id, filter_name=None, start=0, limit=25): + def get_deployment_users( + self, deployment_id, filter_name=None, start=0, limit=25 + ): """ Retrieve a list of users with their explicit permissions to given resource. The list can be filtered by some attributes. @@ -806,7 +911,9 @@ def get_deployment_users(self, deployment_id, filter_name=None, start=0, limit=2 resource = "permissions/deployment/{}/users".format(deployment_id) return self.get(self.resource_url(resource), params=params) - def revoke_user_from_deployment(self, deployment_id, user, permissions=["READ", "WRITE", "BUILD"]): + def revoke_user_from_deployment( + self, deployment_id, user, permissions=["READ", "WRITE", "BUILD"] + ): """ Revokes deployment project permissions from a given user. :param deployment_id: @@ -814,7 +921,9 @@ def revoke_user_from_deployment(self, deployment_id, user, permissions=["READ", :param permissions: :return: """ - resource = "permissions/deployment/{}/users/{}".format(deployment_id, user) + resource = "permissions/deployment/{}/users/{}".format( + deployment_id, user + ) return self.delete(self.resource_url(resource), data=permissions) def grant_user_to_deployment(self, deployment_id, user, permissions): @@ -825,10 +934,14 @@ def grant_user_to_deployment(self, deployment_id, user, permissions): :param permissions: :return: """ - resource = "permissions/deployment/{}/users/{}".format(deployment_id, user) + resource = "permissions/deployment/{}/users/{}".format( + deployment_id, user + ) return self.put(self.resource_url(resource), data=permissions) - def get_deployment_groups(self, deployment_id, filter_name=None, start=0, limit=25): + def get_deployment_groups( + self, deployment_id, filter_name=None, start=0, limit=25 + ): """ Retrieve a list of groups with their deployment project permissions. The list can be filtered by some attributes. @@ -845,7 +958,9 @@ def get_deployment_groups(self, deployment_id, filter_name=None, start=0, limit= resource = "permissions/deployment/{}/groups".format(deployment_id) return self.get(self.resource_url(resource), params=params) - def revoke_group_from_deployment(self, deployment_id, group, permissions=["READ", "WRITE", "BUILD"]): + def revoke_group_from_deployment( + self, deployment_id, group, permissions=["READ", "WRITE", "BUILD"] + ): """ Revokes deployment project permissions from a given group. :param deployment_id: @@ -853,7 +968,9 @@ def revoke_group_from_deployment(self, deployment_id, group, permissions=["READ" :param permissions: :return: """ - resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group) + resource = "permissions/deployment/{}/groups/{}".format( + deployment_id, group + ) return self.delete(self.resource_url(resource), data=permissions) def grant_group_to_deployment(self, deployment_id, group, permissions): @@ -864,10 +981,14 @@ def grant_group_to_deployment(self, deployment_id, group, permissions): :param permissions: :return: """ - resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group) + resource = "permissions/deployment/{}/groups/{}".format( + deployment_id, group + ) return self.put(self.resource_url(resource), data=permissions) - def get_environment_users(self, environment_id, filter_name=None, start=0, limit=25): + def get_environment_users( + self, environment_id, filter_name=None, start=0, limit=25 + ): """ Retrieve a list of users with their explicit permissions to given resource. The list can be filtered by some attributes. @@ -884,7 +1005,9 @@ def get_environment_users(self, environment_id, filter_name=None, start=0, limit resource = "permissions/environment/{}/users".format(environment_id) return self.get(self.resource_url(resource), params=params) - def revoke_user_from_environment(self, environment_id, user, permissions=["READ", "WRITE", "BUILD"]): + def revoke_user_from_environment( + self, environment_id, user, permissions=["READ", "WRITE", "BUILD"] + ): """ Revokes deployment environment permissions from a given user. :param environment_id: @@ -892,7 +1015,9 @@ def revoke_user_from_environment(self, environment_id, user, permissions=["READ" :param permissions: :return: """ - resource = "permissions/environment/{}/users/{}".format(environment_id, user) + resource = "permissions/environment/{}/users/{}".format( + environment_id, user + ) return self.delete(self.resource_url(resource), data=permissions) def grant_user_to_environment(self, environment_id, user, permissions): @@ -903,10 +1028,14 @@ def grant_user_to_environment(self, environment_id, user, permissions): :param permissions: :return: """ - resource = "permissions/environment/{}/users/{}".format(environment_id, user) + resource = "permissions/environment/{}/users/{}".format( + environment_id, user + ) return self.put(self.resource_url(resource), data=permissions) - def get_environment_groups(self, environment_id, filter_name=None, start=0, limit=25): + def get_environment_groups( + self, environment_id, filter_name=None, start=0, limit=25 + ): """ Retrieve a list of groups with their deployment environment permissions. The list can be filtered by some attributes. @@ -923,7 +1052,9 @@ def get_environment_groups(self, environment_id, filter_name=None, start=0, limi resource = "permissions/environment/{}/groups".format(environment_id) return self.get(self.resource_url(resource), params=params) - def revoke_group_from_environment(self, environment_id, group, permissions=["READ", "WRITE", "BUILD"]): + def revoke_group_from_environment( + self, environment_id, group, permissions=["READ", "WRITE", "BUILD"] + ): """ Revokes deployment environment permissions from a given group. :param environment_id: @@ -931,7 +1062,9 @@ def revoke_group_from_environment(self, environment_id, group, permissions=["REA :param permissions: :return: """ - resource = "permissions/environment/{}/groups/{}".format(environment_id, group) + resource = "permissions/environment/{}/groups/{}".format( + environment_id, group + ) return self.delete(self.resource_url(resource), data=permissions) def grant_group_to_environment(self, environment_id, group, permissions): @@ -942,7 +1075,9 @@ def grant_group_to_environment(self, environment_id, group, permissions): :param permissions: :return: """ - resource = "permissions/environment/{}/groups/{}".format(environment_id, group) + resource = "permissions/environment/{}/groups/{}".format( + environment_id, group + ) return self.put(self.resource_url(resource), data=permissions) """Other actions""" @@ -966,7 +1101,9 @@ def agent_is_online(self, agent_id): :param agent_id: Bamboo agent ID (integer number) :return: True/False """ - response = self.get(self.resource_url("agent/{}/status".format(agent_id))) + response = self.get( + self.resource_url("agent/{}/status".format(agent_id)) + ) return response["online"] def agent_enable(self, agent_id): @@ -994,7 +1131,9 @@ def agent_remote(self, online=False): :param online: list only online agents (default False = all) :return: list of agent-describing dictionaries """ - return self.get(self.resource_url("agent/remote"), params={"online": online}) + return self.get( + self.resource_url("agent/remote"), params={"online": online} + ) def agent_details(self, agent_id, expand=None): """ @@ -1007,7 +1146,9 @@ def agent_details(self, agent_id, expand=None): params = None if expand: params = {"expand": expand} - return self.get(self.resource_url("agent/{}".format(agent_id)), params=params) + return self.get( + self.resource_url("agent/{}".format(agent_id)), params=params + ) def agent_capabilities(self, agent_id, include_shared=True): """ @@ -1018,7 +1159,8 @@ def agent_capabilities(self, agent_id, include_shared=True): :return: agents """ return self.get( - self.resource_url("agent/{}/capability".format(agent_id)), params={"includeShared": include_shared} + self.resource_url("agent/{}/capability".format(agent_id)), + params={"includeShared": include_shared}, ) def activity(self): @@ -1100,29 +1242,15 @@ def health_check(self): response = self.get("rest/supportHealthCheck/1.0/check/") return response - def upload_plugin(self, plugin_path): - """ - Provide plugin path for upload into Jira e.g. useful for auto deploy - :param plugin_path: - :return: - """ - files = {"plugin": open(plugin_path, "rb")} - upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, - ).headers["upm-token"] - url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) - return self.post(url, files=files, headers=self.no_check_headers) - def get_elastic_instance_logs(self, instance_id): """ Get logs from an EC2 instance :param instance_id: :return: """ - resource = "/elasticInstances/instance/{instance_id}/logs".format(instance_id=instance_id) + resource = "/elasticInstances/instance/{instance_id}/logs".format( + instance_id=instance_id + ) return self.get(self.resource_url(resource)) def get_elastic_configurations(self): @@ -1149,7 +1277,9 @@ def get_elastic_configuration(self, configuration_id): :return: """ - resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) + resource = "elasticConfiguration/{configuration_id}".format( + configuration_id=configuration_id + ) return self.get(self.resource_url(resource)) def update_elastic_configuration(self, configuration_id, data): @@ -1160,7 +1290,9 @@ def update_elastic_configuration(self, configuration_id, data): :return: """ - resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) + resource = "elasticConfiguration/{configuration_id}".format( + configuration_id=configuration_id + ) return self.put(self.resource_url(resource), data=data) def delete_elastic_configuration(self, configuration_id): @@ -1170,7 +1302,9 @@ def delete_elastic_configuration(self, configuration_id): :return: """ - resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) + resource = "elasticConfiguration/{configuration_id}".format( + configuration_id=configuration_id + ) return self.delete(self.resource_url(resource)) def get_plugins_info(self): @@ -1194,7 +1328,9 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) + url = "rest/plugins/1.0/{plugin_key}-key/license".format( + plugin_key=plugin_key + ) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -1224,7 +1360,9 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request(method="GET", path=url, headers=self.safe_mode_headers) + return self.request( + method="GET", path=url, headers=self.safe_mode_headers + ) def update_plugin_license(self, plugin_key, raw_license): """ diff --git a/atlassian/bitbucket/__init__.py b/atlassian/bitbucket/__init__.py index 25498863b..a633c208d 100644 --- a/atlassian/bitbucket/__init__.py +++ b/atlassian/bitbucket/__init__.py @@ -15,9 +15,13 @@ def __init__(self, url, *args, **kwargs): if "cloud" not in kwargs and ("bitbucket.org" in url): kwargs["cloud"] = True if "api_version" not in kwargs: - kwargs["api_version"] = "2.0" if "cloud" in kwargs and kwargs["cloud"] else "1.0" + kwargs["api_version"] = ( + "2.0" if "cloud" in kwargs and kwargs["cloud"] else "1.0" + ) if "cloud" in kwargs: - kwargs["api_root"] = "" if "api.bitbucket.org" in url else "rest/api" + kwargs["api_root"] = ( + "" if "api.bitbucket.org" in url else "rest/api" + ) super(Bitbucket, self).__init__(url, *args, **kwargs) @@ -65,13 +69,19 @@ def all_project_administrators(self): :return: A generator object containing a map with the project_key, project_name and project_administrators """ for project in self.project_list(): - log.info("Processing project: {0} - {1}".format(project.get("key"), project.get("name"))) + log.info( + "Processing project: {0} - {1}".format( + project.get("key"), project.get("name") + ) + ) yield { "project_key": project.get("key"), "project_name": project.get("name"), "project_administrators": [ {"email": x["emailAddress"], "name": x["displayName"]} - for x in self.project_users_with_administrator_permissions(project["key"]) + for x in self.project_users_with_administrator_permissions( + project["key"] + ) ], } @@ -80,7 +90,9 @@ def reindex(self): Rebuild the bundled Elasticsearch indexes for Bitbucket Server :return: """ - url = self.resource_url("sync", api_root="rest/indexing", api_version="latest") + url = self.resource_url( + "sync", api_root="rest/indexing", api_version="latest" + ) return self.post(url) def check_reindexing_status(self): @@ -88,7 +100,9 @@ def check_reindexing_status(self): Check reindexing status :return: """ - url = self.resource_url("status", api_root="rest/indexing", api_version="latest") + url = self.resource_url( + "status", api_root="rest/indexing", api_version="latest" + ) return self.get(url) def get_users(self, user_filter=None, limit=25, start=0): @@ -201,7 +215,10 @@ def get_associated_build_statuses(self, commit): :commit: str- commit id :return: """ - url = self.resource_url("commits/{commitId}".format(commitId=commit), api_root="rest/build-status") + url = self.resource_url( + "commits/{commitId}".format(commitId=commit), + api_root="rest/build-status", + ) return self.get(url) def _url_announcement_banner(self): @@ -265,7 +282,9 @@ def get_categories(self, project_key, repository_slug=None): url = "project/{}".format(project_key) if repository_slug: url = "{}/repository/{}".format(url, repository_slug) - url = self.resource_url(url, api_root="rest/categories", api_version="latest") + url = self.resource_url( + url, api_root="rest/categories", api_version="latest" + ) data = self.get(url) return data.get("result").get("categories") @@ -308,7 +327,9 @@ def create_project(self, key, name, description=""): ################################################################################################ def _url_project(self, project_key, api_root=None, api_version=None): - return "{}/{}".format(self._url_projects(api_root, api_version), project_key) + return "{}/{}".format( + self._url_projects(api_root, api_version), project_key + ) def project(self, key): """ @@ -438,14 +459,18 @@ def project_users_with_administrator_permissions(self, key): :return: List of project administrators """ project_administrators = [ - user["user"] for user in self.project_users(key) if user["permission"] == "PROJECT_ADMIN" + user["user"] + for user in self.project_users(key) + if user["permission"] == "PROJECT_ADMIN" ] for group in self.project_groups_with_administrator_permissions(key): for user in self.group_members(group): project_administrators.append(user) return project_administrators - def project_grant_user_permissions(self, project_key, username, permission): + def project_grant_user_permissions( + self, project_key, username, permission + ): """ Grant the specified project permission to a specific user :param project_key: The project key @@ -494,7 +519,9 @@ def project_groups(self, key, start=0, limit=None, filter_str=None): params["filter"] = filter_str return self._get_paged(url, params=params) - def project_grant_group_permissions(self, project_key, group_name, permission): + def project_grant_group_permissions( + self, project_key, group_name, permission + ): """ Grant the specified project permission to a specific group :param project_key: The project key @@ -528,7 +555,9 @@ def project_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) + url = "{}/permissions/{}/all".format( + self._url_project(project_key), permission + ) return self.get(url) def project_grant_default_permissions(self, project_key, permission): @@ -538,7 +567,9 @@ def project_grant_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) + url = "{}/permissions/{}/all".format( + self._url_project(project_key), permission + ) return self.post(url, params={"allow": True}) def project_remove_default_permissions(self, project_key, permission): @@ -548,13 +579,17 @@ def project_remove_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) + url = "{}/permissions/{}/all".format( + self._url_project(project_key), permission + ) return self.post(url, params={"allow": False}) def _url_project_repo_hook_settings(self, project_key): return "{}/settings/hooks".format(self._url_project(project_key)) - def all_project_repo_hook_settings(self, project_key, start=0, limit=None, filter_type=None): + def all_project_repo_hook_settings( + self, project_key, start=0, limit=None, filter_type=None + ): """ Get all repository hooks for a given project :param project_key: The project key @@ -582,7 +617,9 @@ def get_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}".format(self._url_project_repo_hook_settings(project_key), hook_key) + url = "{}/{}".format( + self._url_project_repo_hook_settings(project_key), hook_key + ) return self.get(url) def enable_project_repo_hook_settings(self, project_key, hook_key): @@ -592,7 +629,9 @@ def enable_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_project_repo_hook_settings(project_key), hook_key) + url = "{}/{}/enabled".format( + self._url_project_repo_hook_settings(project_key), hook_key + ) return self.put(url) def disable_project_repo_hook_settings(self, project_key, hook_key): @@ -602,12 +641,18 @@ def disable_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_project_repo_hook_settings(project_key), hook_key) + url = "{}/{}/enabled".format( + self._url_project_repo_hook_settings(project_key), hook_key + ) return self.delete(url) def _url_project_conditions(self, project_key): return "{}/conditions".format( - self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0") + self._url_project( + project_key, + api_root="rest/default-reviewers", + api_version="1.0", + ) ) def get_project_conditions(self, project_key): @@ -624,7 +669,11 @@ def get_project_conditions(self, project_key): def _url_project_condition(self, project_key, id_condition=None): url = "{}/condition".format( - self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0") + self._url_project( + project_key, + api_root="rest/default-reviewers", + api_version="1.0", + ) ) if id_condition is not None: url += "/{}".format(id_condition) @@ -699,7 +748,9 @@ def _url_project_audit_log(self, project_key): if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - return "{}/events".format(self._url_project(project_key, api_root="rest/audit")) + return "{}/events".format( + self._url_project(project_key, api_root="rest/audit") + ) def get_project_audit_log(self, project_key, start=0, limit=None): """ @@ -718,7 +769,9 @@ def get_project_audit_log(self, project_key, start=0, limit=None): return self._get_paged(url, params=params) def _url_repos(self, project_key, api_root=None, api_version=None): - return "{}/repos".format(self._url_project(project_key, api_root, api_version)) + return "{}/repos".format( + self._url_project(project_key, api_root, api_version) + ) def repo_list(self, project_key, start=0, limit=25): """ @@ -745,7 +798,9 @@ def repo_all_list(self, project_key): """ return self.repo_list(project_key, limit=None) - def create_repo(self, project_key, repository_slug, forkable=False, is_private=True): + def create_repo( + self, project_key, repository_slug, forkable=False, is_private=True + ): """Create a new repository. Requires an existing project in which this repository will be created. The only parameters which will be used @@ -781,7 +836,9 @@ def create_repo(self, project_key, repository_slug, forkable=False, is_private=T ################################################################################################ def _url_repo(self, project_key, repo, api_root=None, api_version=None): - return "{}/{}".format(self._url_repos(project_key, api_root, api_version), repo) + return "{}/{}".format( + self._url_repos(project_key, api_root, api_version), repo + ) def reindex_repo(self, project_key, repository_slug): """ @@ -810,7 +867,11 @@ def reindex_repo_dev_panel(self, project_key, repository_slug): :param repository_slug: :return: """ - url = "{}/reindex".format(self._url_repo(project_key, repository_slug, api_root="rest/jira-dev")) + url = "{}/reindex".format( + self._url_repo( + project_key, repository_slug, api_root="rest/jira-dev" + ) + ) return self.post(url) def get_repo(self, project_key, repository_slug): @@ -862,7 +923,9 @@ def delete_repo(self, project_key, repository_slug): url = self._url_repo(project_key, repository_slug) return self.delete(url) - def fork_repository(self, project_key, repository_slug, new_repository_slug): + def fork_repository( + self, project_key, repository_slug, new_repository_slug + ): """ Forks a repository within the same project. :param project_key: @@ -877,7 +940,13 @@ def fork_repository(self, project_key, repository_slug, new_repository_slug): body["project"] = {"key": project_key} return self.post(url, data=body) - def fork_repository_new_project(self, project_key, repository_slug, new_project_key, new_repository_slug): + def fork_repository_new_project( + self, + project_key, + repository_slug, + new_project_key, + new_repository_slug, + ): """ Forks a repository to a separate project. :param project_key: Origin Project Key @@ -893,7 +962,9 @@ def fork_repository_new_project(self, project_key, repository_slug, new_project_ body["project"] = {"key": new_project_key} return self.post(url, data=body) - def repo_keys(self, project_key, repo_key, start=0, limit=None, filter_str=None): + def repo_keys( + self, project_key, repo_key, start=0, limit=None, filter_str=None + ): """ Get SSH access keys added to the repository :param start: @@ -903,7 +974,9 @@ def repo_keys(self, project_key, repo_key, start=0, limit=None, filter_str=None) :param filter_str: OPTIONAL: users filter string :return: """ - url = "{}/ssh".format(self._url_repo(project_key, repo_key, api_root="rest/keys")) + url = "{}/ssh".format( + self._url_repo(project_key, repo_key, api_root="rest/keys") + ) params = {} if start: params["start"] = start @@ -916,7 +989,9 @@ def repo_keys(self, project_key, repo_key, start=0, limit=None, filter_str=None) def _url_repo_users(self, project_key, repo): return "{}/permissions/users".format(self._url_repo(project_key, repo)) - def repo_users(self, project_key, repo_key, start=0, limit=None, filter_str=None): + def repo_users( + self, project_key, repo_key, start=0, limit=None, filter_str=None + ): """ Get users with permission in repository :param start: @@ -936,7 +1011,9 @@ def repo_users(self, project_key, repo_key, start=0, limit=None, filter_str=None params["filter"] = filter_str return self._get_paged(url, params=params) - def repo_grant_user_permissions(self, project_key, repo_key, username, permission): + def repo_grant_user_permissions( + self, project_key, repo_key, username, permission + ): """ Grant the specified repository permission to a specific user :param project_key: The project key @@ -966,9 +1043,13 @@ def repo_remove_user_permissions(self, project_key, repo_key, username): return self.delete(url, params=params) def _url_repo_groups(self, project_key, repo): - return "{}/permissions/groups".format(self._url_repo(project_key, repo)) + return "{}/permissions/groups".format( + self._url_repo(project_key, repo) + ) - def repo_groups(self, project_key, repo_key, start=0, limit=None, filter_str=None): + def repo_groups( + self, project_key, repo_key, start=0, limit=None, filter_str=None + ): """ Get repository Groups :param start: @@ -994,7 +1075,11 @@ def project_groups_with_administrator_permissions(self, key): :param key: :return: """ - return [group["group"]["name"] for group in self.project_groups(key) if group["permission"] == "PROJECT_ADMIN"] + return [ + group["group"]["name"] + for group in self.project_groups(key) + if group["permission"] == "PROJECT_ADMIN" + ] def repo_users_with_administrator_permissions(self, project_key, repo_key): """ @@ -1007,15 +1092,23 @@ def repo_users_with_administrator_permissions(self, project_key, repo_key): for user in self.repo_users(project_key, repo_key): if user["permission"] == "REPO_ADMIN": repo_administrators.append(user) - for group in self.repo_groups_with_administrator_permissions(project_key, repo_key): + for group in self.repo_groups_with_administrator_permissions( + project_key, repo_key + ): for user in self.group_members(group): repo_administrators.append(user) - for user in self.project_users_with_administrator_permissions(project_key): + for user in self.project_users_with_administrator_permissions( + project_key + ): repo_administrators.append(user) # We convert to a set to ensure uniqueness then back to a list for later useability - return list({user["id"]: user for user in repo_administrators}.values()) + return list( + {user["id"]: user for user in repo_administrators}.values() + ) - def repo_groups_with_administrator_permissions(self, project_key, repo_key): + def repo_groups_with_administrator_permissions( + self, project_key, repo_key + ): """ Get groups with admin permissions :param project_key: @@ -1026,12 +1119,16 @@ def repo_groups_with_administrator_permissions(self, project_key, repo_key): for group in self.repo_groups(project_key, repo_key): if group["permission"] == "REPO_ADMIN": repo_group_administrators.append(group["group"]["name"]) - for group in self.project_groups_with_administrator_permissions(project_key): + for group in self.project_groups_with_administrator_permissions( + project_key + ): repo_group_administrators.append(group) # We convert to a set to ensure uniqueness, then back to a list for later useability return list(set(repo_group_administrators)) - def repo_grant_group_permissions(self, project_key, repo_key, groupname, permission): + def repo_grant_group_permissions( + self, project_key, repo_key, groupname, permission + ): """ Grant the specified repository permission to a specific group Promote or demote a group's permission level for the specified repository. Available repository permissions are: @@ -1053,7 +1150,9 @@ def repo_grant_group_permissions(self, project_key, repo_key, groupname, permiss params = {"permission": permission, "name": groupname} return self.put(url, params=params) - def repo_remove_group_permissions(self, project_key, repo_key, groupname, permission): + def repo_remove_group_permissions( + self, project_key, repo_key, groupname, permission + ): """ Revoke all permissions for the specified repository for a group. The authenticated user must have REPO_ADMIN permission for the specified repository @@ -1105,9 +1204,13 @@ def _url_repo_audit_log(self, project_key, repository_slug): if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - return "{}/events".format(self._url_repo(project_key, repository_slug, api_root="rest/audit")) + return "{}/events".format( + self._url_repo(project_key, repository_slug, api_root="rest/audit") + ) - def get_repo_audit_log(self, project_key, repository_slug, start=0, limit=None): + def get_repo_audit_log( + self, project_key, repository_slug, start=0, limit=None + ): """ Get the audit log of the repository :param start: @@ -1125,7 +1228,9 @@ def get_repo_audit_log(self, project_key, repository_slug, start=0, limit=None): return self._get_paged(url, params=params) def _url_repo_branches(self, project_key, repository_slug, api_root=None): - return "{}/branches".format(self._url_repo(project_key, repository_slug, api_root=api_root)) + return "{}/branches".format( + self._url_repo(project_key, repository_slug, api_root=api_root) + ) def get_branches( self, @@ -1168,7 +1273,9 @@ def get_branches( return self._get_paged(url, params=params) def _url_repo_default_branche(self, project_key, repository_slug): - return "{}/default".format(self._url_repo_branches(project_key, repository_slug)) + return "{}/default".format( + self._url_repo_branches(project_key, repository_slug) + ) def get_default_branch(self, project_key, repository_slug): """ @@ -1181,7 +1288,9 @@ def get_default_branch(self, project_key, repository_slug): url = self._url_repo_default_branche(project_key, repository_slug) return self.get(url) - def set_default_branch(self, project_key, repository_slug, ref_branch_name): + def set_default_branch( + self, project_key, repository_slug, ref_branch_name + ): """ Update the default branch of a repository. The authenticated user must have REPO_ADMIN permission for the specified repository to call this resource. @@ -1194,7 +1303,9 @@ def set_default_branch(self, project_key, repository_slug, ref_branch_name): data = {"id": ref_branch_name} return self.put(url, data=data) - def create_branch(self, project_key, repository_slug, name, start_point, message=""): + def create_branch( + self, project_key, repository_slug, name, start_point, message="" + ): """Creates a branch using the information provided in the request. The authenticated user must have REPO_WRITE permission for the context repository to call this resource. @@ -1218,7 +1329,9 @@ def create_branch(self, project_key, repository_slug, name, start_point, message data = {"name": name, "startPoint": start_point, "message": message} return self.post(url, data=data) - def delete_branch(self, project_key, repository_slug, name, end_point=None): + def delete_branch( + self, project_key, repository_slug, name, end_point=None + ): """ Delete branch from related repo :param self: @@ -1228,7 +1341,9 @@ def delete_branch(self, project_key, repository_slug, name, end_point=None): :param end_point: :return: """ - url = self._url_repo_branches(project_key, repository_slug, api_root="rest/branch-utils") + url = self._url_repo_branches( + project_key, repository_slug, api_root="rest/branch-utils" + ) data = {"name": str(name)} if end_point: data["endPoint"] = end_point @@ -1236,9 +1351,13 @@ def delete_branch(self, project_key, repository_slug, name, end_point=None): def _url_repo_tags(self, project_key, repository_slug, api_root=None): if self.cloud: - return "{}/refs/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root)) + return "{}/refs/tags".format( + self._url_repo(project_key, repository_slug, api_root=api_root) + ) else: - return "{}/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root)) + return "{}/tags".format( + self._url_repo(project_key, repository_slug, api_root=api_root) + ) def get_tags( self, @@ -1289,7 +1408,14 @@ def get_project_tags(self, project_key, repository_slug, tag_name=None): return self._get_paged(url) - def set_tag(self, project_key, repository_slug, tag_name, commit_revision, description=None): + def set_tag( + self, + project_key, + repository_slug, + tag_name, + commit_revision, + description=None, + ): """ Creates a tag using the information provided in the {@link RestCreateTagRequest request} The authenticated user must have REPO_WRITE permission for the context repository to call this resource. @@ -1320,15 +1446,26 @@ def delete_tag(self, project_key, repository_slug, tag_name): :return: """ url = "{}/{}".format( - self._url_repo_tags(project_key, repository_slug, api_root="rest/git"), + self._url_repo_tags( + project_key, repository_slug, api_root="rest/git" + ), tag_name, ) return self.delete(url) def _url_repo_hook_settings(self, project_key, repository_slug): - return "{}/settings/hooks".format(self._url_repo(project_key, repository_slug)) + return "{}/settings/hooks".format( + self._url_repo(project_key, repository_slug) + ) - def all_repo_hook_settings(self, project_key, repository_slug, start=0, limit=None, filter_type=None): + def all_repo_hook_settings( + self, + project_key, + repository_slug, + start=0, + limit=None, + filter_type=None, + ): """ Get all repository hooks for a given repo :param project_key: The project key @@ -1358,10 +1495,15 @@ def get_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key) + url = "{}/{}".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.get(url) - def enable_repo_hook_settings(self, project_key, repository_slug, hook_key): + def enable_repo_hook_settings( + self, project_key, repository_slug, hook_key + ): """ Enable a repository hook for a given repo :param project_key: The project key @@ -1369,10 +1511,15 @@ def enable_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key) + url = "{}/{}/enabled".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.put(url) - def disable_repo_hook_settings(self, project_key, repository_slug, hook_key): + def disable_repo_hook_settings( + self, project_key, repository_slug, hook_key + ): """ Disable a repository hook for a given repo :param project_key: The project key @@ -1380,18 +1527,19 @@ def disable_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key) + url = "{}/{}/enabled".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.delete(url) def _url_webhooks(self, project_key, repository_slug): - return "{}/webhooks".format(self._url_repo(project_key, repository_slug)) + return "{}/webhooks".format( + self._url_repo(project_key, repository_slug) + ) def get_webhooks( - self, - project_key, - repository_slug, - event=None, - statistics=False, + self, project_key, repository_slug, event=None, statistics=False, ): """ Get webhooks @@ -1444,7 +1592,9 @@ def create_webhook( return self.post(url, data=body) def _url_webhook(self, project_key, repository_slug, webhook_id): - return "{}/{}".format(self._url_webhooks(project_key, repository_slug), webhook_id) + return "{}/{}".format( + self._url_webhooks(project_key, repository_slug), webhook_id + ) def get_webhook(self, project_key, repository_slug, webhook_id): """ @@ -1458,7 +1608,9 @@ def get_webhook(self, project_key, repository_slug, webhook_id): url = self._url_webhook(project_key, repository_slug, webhook_id) return self.get(url) - def update_webhook(self, project_key, repository_slug, webhook_id, **params): + def update_webhook( + self, project_key, repository_slug, webhook_id, **params + ): """ Update a webhook. The authenticated user must have REPO_ADMIN permission for the context repository to call this resource. @@ -1483,7 +1635,9 @@ def delete_webhook(self, project_key, repository_slug, webhook_id): return self.delete(url) def _url_pull_request_settings(self, project_key, repository_slug): - return "{}/settings/pull-requests".format(self._url_repo(project_key, repository_slug)) + return "{}/settings/pull-requests".format( + self._url_repo(project_key, repository_slug) + ) def get_pull_request_settings(self, project_key, repository_slug): """ @@ -1508,9 +1662,15 @@ def set_pull_request_settings(self, project_key, repository_slug, data): def _url_pull_requests(self, project_key, repository_slug): if self.cloud: - return self.resource_url("repositories/{}/{}/pullrequests".format(project_key, repository_slug)) + return self.resource_url( + "repositories/{}/{}/pullrequests".format( + project_key, repository_slug + ) + ) else: - return "{}/pull-requests".format(self._url_repo(project_key, repository_slug)) + return "{}/pull-requests".format( + self._url_repo(project_key, repository_slug) + ) def get_pull_requests( self, @@ -1622,7 +1782,10 @@ def create_pull_request(self, project_key, repository_slug, data): return self.post(url, data=data) def _url_pull_request(self, project_key, repository_slug, pull_request_id): - return "{}/{}".format(self._url_pull_requests(project_key, repository_slug), pull_request_id) + return "{}/{}".format( + self._url_pull_requests(project_key, repository_slug), + pull_request_id, + ) def get_pull_request(self, project_key, repository_slug, pull_request_id): """ @@ -1634,7 +1797,9 @@ def get_pull_request(self, project_key, repository_slug, pull_request_id): :param pull_request_id: the ID of the pull request within the repository :return: """ - url = self._url_pull_request(project_key, repository_slug, pull_request_id) + url = self._url_pull_request( + project_key, repository_slug, pull_request_id + ) return self.get(url) @deprecated(version="1.15.1", reason="Use get_pull_request()") @@ -1644,7 +1809,13 @@ def get_pullrequest(self, *args, **kwargs): """ return self.get_pull_request(*args, **kwargs) - def delete_pull_request(self, project_key, repository_slug, pull_request_id, pull_request_version): + def delete_pull_request( + self, + project_key, + repository_slug, + pull_request_id, + pull_request_version, + ): """ Delete a pull request. @@ -1654,11 +1825,20 @@ def delete_pull_request(self, project_key, repository_slug, pull_request_id, pul :param pull_request_version: the version of the pull request :return: """ - url = self._url_pull_request(project_key, repository_slug, pull_request_id) + url = self._url_pull_request( + project_key, repository_slug, pull_request_id + ) data = {"version": pull_request_version} return self.delete(url, data=data) - def get_pull_requests_activities(self, project_key, repository_slug, pull_request_id, start=0, limit=None): + def get_pull_requests_activities( + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, + ): """ Get pull requests activities :param limit: @@ -1668,7 +1848,11 @@ def get_pull_requests_activities(self, project_key, repository_slug, pull_reques :param start: :return: """ - url = "{}/activities".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) + url = "{}/activities".format( + self._url_pull_request( + project_key, repository_slug, pull_request_id + ) + ) params = {} if start: params["start"] = start @@ -1676,7 +1860,14 @@ def get_pull_requests_activities(self, project_key, repository_slug, pull_reques params["limit"] = limit return self._get_paged(url, params) - def get_pull_requests_changes(self, project_key, repository_slug, pull_request_id, start=0, limit=None): + def get_pull_requests_changes( + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, + ): """ Get pull requests changes :param start: @@ -1686,7 +1877,11 @@ def get_pull_requests_changes(self, project_key, repository_slug, pull_request_i :param pull_request_id: the ID of the pull request within the repository :return: """ - url = "{}/changes".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) + url = "{}/changes".format( + self._url_pull_request( + project_key, repository_slug, pull_request_id + ) + ) params = {} if start: params["start"] = start @@ -1694,7 +1889,14 @@ def get_pull_requests_changes(self, project_key, repository_slug, pull_request_i params["limit"] = limit return self._get_paged(url, params) - def get_pull_requests_commits(self, project_key, repository_slug, pull_request_id, start=0, limit=None): + def get_pull_requests_commits( + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, + ): """ Get pull requests commits :param start: @@ -1706,7 +1908,11 @@ def get_pull_requests_commits(self, project_key, repository_slug, pull_request_i :limit :return: """ - url = "{}/commits".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) + url = "{}/commits".format( + self._url_pull_request( + project_key, repository_slug, pull_request_id + ) + ) params = {} if start: params["start"] = start @@ -1714,10 +1920,22 @@ def get_pull_requests_commits(self, project_key, repository_slug, pull_request_i params["limit"] = limit return self._get_paged(url, params) - def _url_pull_request_participants(self, project_key, repository_slug, pull_request_id): - return "{}/{}/participants".format(self._url_pull_requests(project_key, repository_slug), pull_request_id) + def _url_pull_request_participants( + self, project_key, repository_slug, pull_request_id + ): + return "{}/{}/participants".format( + self._url_pull_requests(project_key, repository_slug), + pull_request_id, + ) - def get_pull_requests_participants(self, project_key, repository_slug, pull_request_id, start=0, limit=None): + def get_pull_requests_participants( + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, + ): """ Get all participants of a pull request :param start: @@ -1727,7 +1945,9 @@ def get_pull_requests_participants(self, project_key, repository_slug, pull_requ :param pull_request_id: :return: """ - url = self._url_pull_request_participants(project_key, repository_slug, pull_request_id) + url = self._url_pull_request_participants( + project_key, repository_slug, pull_request_id + ) params = {} if start: params["start"] = start @@ -1735,7 +1955,9 @@ def get_pull_requests_participants(self, project_key, repository_slug, pull_requ params["limit"] = limit return self._get_paged(url, params) - def change_reviewed_status(self, project_key, repository_slug, pull_request_id, status, user_slug): + def change_reviewed_status( + self, project_key, repository_slug, pull_request_id, status, user_slug + ): """ Change the current user's status for a pull request. Implicitly adds the user as a participant if they are not already. @@ -1748,18 +1970,37 @@ def change_reviewed_status(self, project_key, repository_slug, pull_request_id, :return: """ url = "{}/{}".format( - self._url_pull_request_participants(project_key, repository_slug, pull_request_id), + self._url_pull_request_participants( + project_key, repository_slug, pull_request_id + ), user_slug, ) approved = True if status == "APPROVED" else False - data = {"user": {"name": user_slug}, "approved": approved, "status": status} + data = { + "user": {"name": user_slug}, + "approved": approved, + "status": status, + } return self.put(url, data) - def _url_pull_request_comments(self, project_key, repository_slug, pull_request_id): - url = "{}/comments".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) + def _url_pull_request_comments( + self, project_key, repository_slug, pull_request_id + ): + url = "{}/comments".format( + self._url_pull_request( + project_key, repository_slug, pull_request_id + ) + ) return url - def add_pull_request_comment(self, project_key, repository_slug, pull_request_id, text, parent_id=None): + def add_pull_request_comment( + self, + project_key, + repository_slug, + pull_request_id, + text, + parent_id=None, + ): """ Add comment into pull request :param project_key: @@ -1770,20 +2011,28 @@ def add_pull_request_comment(self, project_key, repository_slug, pull_request_id :return: """ - url = self._url_pull_request_comments(project_key, repository_slug, pull_request_id) + url = self._url_pull_request_comments( + project_key, repository_slug, pull_request_id + ) body = {"text": text} if parent_id: body["parent"] = {"id": parent_id} return self.post(url, data=body) - def _url_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id): + def _url_pull_request_comment( + self, project_key, repository_slug, pull_request_id, comment_id + ): url = "{}/{}".format( - self._url_pull_request_comments(project_key, repository_slug, pull_request_id), + self._url_pull_request_comments( + project_key, repository_slug, pull_request_id + ), comment_id, ) return url - def get_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id): + def get_pull_request_comment( + self, project_key, repository_slug, pull_request_id, comment_id + ): """ Retrieves a pull request comment. The authenticated user must have REPO_READ permission @@ -1794,7 +2043,9 @@ def get_pull_request_comment(self, project_key, repository_slug, pull_request_id :param comment_id: the ID of the comment to retrieve :return: """ - url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) + url = self._url_pull_request_comment( + project_key, repository_slug, pull_request_id, comment_id + ) return self.get(url) def update_pull_request_comment( @@ -1814,20 +2065,40 @@ def update_pull_request_comment( that must match the server's version of the comment or the update will fail. """ - url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) + url = self._url_pull_request_comment( + project_key, repository_slug, pull_request_id, comment_id + ) data = {"version": comment_version, "text": comment} return self.put(url, data=data) @deprecated(version="2.4.2", reason="Use delete_pull_request_comment()") - def delete_pull_reques_comment(self, project_key, repository_slug, pull_request_id, comment_id, comment_version): + def delete_pull_reques_comment( + self, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, + ): """ Deprecated name since 2.4.2. Let's use the get_pull_request() """ return self.delete_pull_request_comment( - project_key, repository_slug, pull_request_id, comment_id, comment_version + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, ) - def delete_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id, comment_version): + def delete_pull_request_comment( + self, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, + ): """ Delete a comment. Only the repository admin or user who created a comment may update it. @@ -1836,11 +2107,15 @@ def delete_pull_request_comment(self, project_key, repository_slug, pull_request that must match the server's version of the comment or delete will fail. """ - url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) + url = self._url_pull_request_comment( + project_key, repository_slug, pull_request_id, comment_id + ) data = {"version": comment_version} return self.delete(url, params=data) - def decline_pull_request(self, project_key, repository_slug, pr_id, pr_version): + def decline_pull_request( + self, project_key, repository_slug, pr_id, pr_version + ): """ Decline a pull request. The authenticated user must have REPO_READ permission for the repository @@ -1852,7 +2127,9 @@ def decline_pull_request(self, project_key, repository_slug, pr_id, pr_version): :param pr_version: 12 :return: """ - url = "{}/decline".format(self._url_pull_request(project_key, repository_slug, pr_id)) + url = "{}/decline".format( + self._url_pull_request(project_key, repository_slug, pr_id) + ) params = {} if not self.cloud: params["version"] = pr_version @@ -1868,7 +2145,11 @@ def get_tasks(self, project_key, repository_slug, pull_request_id): """ if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - url = "{}/tasks".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) + url = "{}/tasks".format( + self._url_pull_request( + project_key, repository_slug, pull_request_id + ) + ) return self.get(url) def _url_tasks(self): @@ -1924,7 +2205,9 @@ def update_task(self, task_id, text=None, state=None): data["state"] = state return self.put(url, data=data) - def is_pull_request_can_be_merged(self, project_key, repository_slug, pr_id): + def is_pull_request_can_be_merged( + self, project_key, repository_slug, pr_id + ): """ Test whether a pull request can be merged. A pull request may not be merged if: @@ -1938,10 +2221,14 @@ def is_pull_request_can_be_merged(self, project_key, repository_slug, pr_id): :param pr_id: 2341 :return: """ - url = "{}/merge".format(self._url_pull_request(project_key, repository_slug, pr_id)) + url = "{}/merge".format( + self._url_pull_request(project_key, repository_slug, pr_id) + ) return self.get(url) - def merge_pull_request(self, project_key, repository_slug, pr_id, pr_version): + def merge_pull_request( + self, project_key, repository_slug, pr_id, pr_version + ): """ Merge pull request The authenticated user must have REPO_READ permission for the repository @@ -1953,13 +2240,17 @@ def merge_pull_request(self, project_key, repository_slug, pr_id, pr_version): :param pr_version: :return: """ - url = "{}/merge".format(self._url_pull_request(project_key, repository_slug, pr_id)) + url = "{}/merge".format( + self._url_pull_request(project_key, repository_slug, pr_id) + ) params = {} if not self.cloud: params["version"] = pr_version return self.post(url, params=params) - def reopen_pull_request(self, project_key, repository_slug, pr_id, pr_version): + def reopen_pull_request( + self, project_key, repository_slug, pr_id, pr_version + ): """ Re-open a declined pull request. The authenticated user must have REPO_READ permission for the repository @@ -1971,7 +2262,9 @@ def reopen_pull_request(self, project_key, repository_slug, pr_id, pr_version): :param pr_version: 12 :return: """ - url = "{}/reopen".format(self._url_pull_request(project_key, repository_slug, pr_id)) + url = "{}/reopen".format( + self._url_pull_request(project_key, repository_slug, pr_id) + ) params = {"version": pr_version} return self.post(url, params=params) @@ -2002,7 +2295,9 @@ def _url_repo_compare(self, project_key, repository_slug): url = "{}/compare".format(self._url_repo(project_key, repository_slug)) return url - def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest): + def get_diff( + self, project_key, repository_slug, path, hash_oldest, hash_newest + ): """ Gets a diff of the changes available in the {@code from} commit but not in the {@code to} commit. If either the {@code from} or {@code to} commit are not specified, @@ -2014,7 +2309,9 @@ def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest) :param hash_newest: the target commit (can be a partial/full commit ID or qualified/unqualified ref name) :return: """ - url = "{}/diff/{}".format(self._url_repo_compare(project_key, repository_slug), path) + url = "{}/diff/{}".format( + self._url_repo_compare(project_key, repository_slug), path + ) params = {} if hash_oldest: params["from"] = hash_oldest @@ -2022,9 +2319,16 @@ def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest) params["to"] = hash_newest return (self.get(url, params=params) or {}).get("diffs") - def _url_commits(self, project_key, repository_slug, api_root=None, api_version=None): + def _url_commits( + self, project_key, repository_slug, api_root=None, api_version=None + ): return "{}/commits".format( - self._url_repo(project_key, repository_slug, api_root=api_root, api_version=api_version) + self._url_repo( + project_key, + repository_slug, + api_root=api_root, + api_version=api_version, + ) ) def get_commits( @@ -2077,9 +2381,21 @@ def get_commits( params["limit"] = limit return self._get_paged(url, params=params) - def _url_commit(self, project_key, repository_slug, commit_id, api_root=None, api_version=None): + def _url_commit( + self, + project_key, + repository_slug, + commit_id, + api_root=None, + api_version=None, + ): return "{}/{}".format( - self._url_commits(project_key, repository_slug, api_root=api_root, api_version=api_version), + self._url_commits( + project_key, + repository_slug, + api_root=api_root, + api_version=api_version, + ), commit_id, ) @@ -2104,14 +2420,30 @@ def get_commit_info(self, project_key, repository_slug, commit, path=None): params["path"] = path return self.get(url, params=params) - def _url_commit_pull_requests(self, project_key, repository_slug, commit_id): - return "{}/pull-requests".format(self._url_commit(project_key, repository_slug, commit_id)) + def _url_commit_pull_requests( + self, project_key, repository_slug, commit_id + ): + return "{}/pull-requests".format( + self._url_commit(project_key, repository_slug, commit_id) + ) - def get_pull_requests_contain_commit(self, project_key, repository_slug, commit): - url = self._url_commit_pull_requests(project_key, repository_slug, commit) + def get_pull_requests_contain_commit( + self, project_key, repository_slug, commit + ): + url = self._url_commit_pull_requests( + project_key, repository_slug, commit + ) return (self.get(url) or {}).get("values") - def get_changelog(self, project_key, repository_slug, ref_from, ref_to, start=0, limit=None): + def get_changelog( + self, + project_key, + repository_slug, + ref_from, + ref_to, + start=0, + limit=None, + ): """ Get change log between 2 refs :param start: @@ -2123,7 +2455,9 @@ def get_changelog(self, project_key, repository_slug, ref_from, ref_to, start=0, fixed system limits. Default by built-in method: None :return: """ - url = "{}/compare/commits".format(self._url_repo(project_key, repository_slug)) + url = "{}/compare/commits".format( + self._url_repo(project_key, repository_slug) + ) params = {} if ref_from: params["from"] = ref_from @@ -2135,7 +2469,9 @@ def get_changelog(self, project_key, repository_slug, ref_from, ref_to, start=0, params["limit"] = limit return self._get_paged(url, params=params) - def _url_code_insights_annotations(self, project_key, repository_slug, commit_id, report_key): + def _url_code_insights_annotations( + self, project_key, repository_slug, commit_id, report_key + ): return "{}/reports/{}/annotations".format( self._url_commit( project_key, @@ -2147,7 +2483,9 @@ def _url_code_insights_annotations(self, project_key, repository_slug, commit_id report_key, ) - def add_code_insights_annotations_to_report(self, project_key, repository_slug, commit_id, report_key, annotations): + def add_code_insights_annotations_to_report( + self, project_key, repository_slug, commit_id, report_key, annotations + ): """ Adds annotations to an existing insight report. For further information visit: @@ -2158,11 +2496,15 @@ def add_code_insights_annotations_to_report(self, project_key, repository_slug, :report_key: str :annotations: list """ - url = self._url_code_insights_annotations(project_key, repository_slug, commit_id, report_key) + url = self._url_code_insights_annotations( + project_key, repository_slug, commit_id, report_key + ) data = {"annotations": annotations} return self.post(url, data=data) - def _url_code_insights_report(self, project_key, repository_slug, commit_id, report_key): + def _url_code_insights_report( + self, project_key, repository_slug, commit_id, report_key + ): return "{}/reports/{}".format( self._url_commit( project_key, @@ -2174,7 +2516,9 @@ def _url_code_insights_report(self, project_key, repository_slug, commit_id, rep report_key, ) - def get_code_insights_report(self, project_key, repository_slug, commit_id, report_key): + def get_code_insights_report( + self, project_key, repository_slug, commit_id, report_key + ): """ Retrieve the specified code-insights report. :projectKey: str @@ -2182,10 +2526,14 @@ def get_code_insights_report(self, project_key, repository_slug, commit_id, repo :commitId: str :report_key: str """ - url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) + url = self._url_code_insights_report( + project_key, repository_slug, commit_id, report_key + ) return self.get(url) - def delete_code_insights_report(self, project_key, repository_slug, commit_id, report_key): + def delete_code_insights_report( + self, project_key, repository_slug, commit_id, report_key + ): """ Delete a report for the given commit. Also deletes any annotations associated with this report. :projectKey: str @@ -2193,11 +2541,19 @@ def delete_code_insights_report(self, project_key, repository_slug, commit_id, r :commitId: str :report_key: str """ - url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) + url = self._url_code_insights_report( + project_key, repository_slug, commit_id, report_key + ) return self.delete(url) def create_code_insights_report( - self, project_key, repository_slug, commit_id, report_key, report_title, **report_params + self, + project_key, + repository_slug, + commit_id, + report_key, + report_title, + **report_params ): """ Create a new insight report, or replace the existing one @@ -2213,7 +2569,9 @@ def create_code_insights_report( :report_title: str :report_params: """ - url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) + url = self._url_code_insights_report( + project_key, repository_slug, commit_id, report_key + ) data = {"title": report_title} data.update(report_params) return self.put(url, data=data) @@ -2252,7 +2610,9 @@ def get_file_list( params["limit"] = limit return self._get_paged(url, params=params) - def get_content_of_file(self, project_key, repository_slug, filename, at=None, markup=None): + def get_content_of_file( + self, project_key, repository_slug, filename, at=None, markup=None + ): """ Retrieve the raw content for a file path at a specified revision. The authenticated user must have REPO_READ permission for the specified repository to call this resource. @@ -2264,18 +2624,28 @@ def get_content_of_file(self, project_key, repository_slug, filename, at=None, m otherwise, if not specified, or any value other than "true" the content is streamed without markup. :return: """ - url = "{}/raw/{}".format(self._url_repo(project_key, repository_slug), filename) + url = "{}/raw/{}".format( + self._url_repo(project_key, repository_slug), filename + ) params = {} if at is not None: params["at"] = at if markup is not None: params["markup"] = markup headers = self.form_token_headers - return self.get(url, params=params, not_json_response=True, headers=headers) + return self.get( + url, params=params, not_json_response=True, headers=headers + ) - def _url_branches_permissions(self, project_key, permission_id=None, repository_slug=None): + def _url_branches_permissions( + self, project_key, permission_id=None, repository_slug=None + ): if repository_slug is None: - base = self._url_project(project_key, api_root="rest/branch-permissions", api_version="2.0") + base = self._url_project( + project_key, + api_root="rest/branch-permissions", + api_version="2.0", + ) else: base = self._url_repo( project_key, @@ -2284,9 +2654,18 @@ def _url_branches_permissions(self, project_key, permission_id=None, repository_ api_version="2.0", ) - return "{}/restrictions/{}".format(base, "" if permission_id is None else str(permission_id)) + return "{}/restrictions/{}".format( + base, "" if permission_id is None else str(permission_id) + ) - def get_branches_permissions(self, project_key, permission_id, repository_slug=None, start=0, limit=25): + def get_branches_permissions( + self, + project_key, + permission_id, + repository_slug=None, + start=0, + limit=25, + ): """ Get branches permissions from a given repo :param project_key: @@ -2296,7 +2675,9 @@ def get_branches_permissions(self, project_key, permission_id, repository_slug=N :param limit: :return: """ - url = self._url_branches_permissions(project_key, permission_id, repository_slug) + url = self._url_branches_permissions( + project_key, permission_id, repository_slug + ) params = {} if limit: params["limit"] = limit @@ -2337,7 +2718,9 @@ def set_branches_permissions( :param limit: :return: """ - url = self._url_branches_permissions(project_key=project_key, repository_slug=repository_slug) + url = self._url_branches_permissions( + project_key=project_key, repository_slug=repository_slug + ) if except_users is None: except_users = [] if except_groups is None: @@ -2367,7 +2750,9 @@ def set_branches_permissions( params = {"start": start, "limit": limit} return self.post(url, data=restriction, params=params, headers=headers) - def delete_branch_permission(self, project_key, permission_id, repository_slug=None): + def delete_branch_permission( + self, project_key, permission_id, repository_slug=None + ): """ Deletes a restriction as specified by a restriction id. The authenticated user must have REPO_ADMIN permission or higher to call this resource. @@ -2377,10 +2762,14 @@ def delete_branch_permission(self, project_key, permission_id, repository_slug=N :param permission_id: :return: """ - url = self._url_branches_permissions(project_key, permission_id, repository_slug) + url = self._url_branches_permissions( + project_key, permission_id, repository_slug + ) return self.delete(url) - def get_branch_permission(self, project_key, permission_id, repository_slug=None): + def get_branch_permission( + self, project_key, permission_id, repository_slug=None + ): """ Returns a restriction as specified by a restriction id. The authenticated user must have REPO_ADMIN permission or higher to call this resource. @@ -2390,10 +2779,14 @@ def get_branch_permission(self, project_key, permission_id, repository_slug=None :param permission_id: :return: """ - url = self._url_branches_permissions(project_key, permission_id, repository_slug) + url = self._url_branches_permissions( + project_key, permission_id, repository_slug + ) return self._get_paged(url) - def all_branches_permissions(self, project_key, permission_id, repository_slug=None): + def all_branches_permissions( + self, project_key, permission_id, repository_slug=None + ): """ Get branches permissions from a given repo :param project_key: @@ -2401,7 +2794,9 @@ def all_branches_permissions(self, project_key, permission_id, repository_slug=N :param repository_slug: :return: """ - url = self._url_branches_permissions(project_key, permission_id, repository_slug) + url = self._url_branches_permissions( + project_key, permission_id, repository_slug + ) return self._get_paged(url) def _url_branching_model(self, project_key, repository_slug): @@ -2471,7 +2866,9 @@ def enable_branching_model(self, project_key, repository_slug): }, ], } - return self.set_branching_model(project_key, repository_slug, default_model_data) + return self.set_branching_model( + project_key, repository_slug, default_model_data + ) def disable_branching_model(self, project_key, repository_slug): """ @@ -2480,12 +2877,18 @@ def disable_branching_model(self, project_key, repository_slug): :param repository_slug: :return: """ - return self.delete(self._url_branching_model(project_key, repository_slug)) + return self.delete( + self._url_branching_model(project_key, repository_slug) + ) def _url_file(self, project_key, repository_slug, filename): - return "{}/browse/{}".format(self._url_repo(project_key, repository_slug), filename) + return "{}/browse/{}".format( + self._url_repo(project_key, repository_slug), filename + ) - def upload_file(self, project_key, repository_slug, content, message, branch, filename): + def upload_file( + self, project_key, repository_slug, content, message, branch, filename + ): """ Upload new file for given branch. :param project_key: @@ -2537,7 +2940,14 @@ def search_code(self, team, search_query, page=1, limit=10): :search_query: str """ url = self.resource_url("teams/{team}/search/code".format(team=team)) - return self.get(url, params={"search_query": search_query, "page": page, "pagelen": limit}) + return self.get( + url, + params={ + "search_query": search_query, + "page": page, + "pagelen": limit, + }, + ) def get_lfs_repo_status(self, project_key, repo): url = "rest/git-lfs/admin/projects/{projectKey}/repos/{repositorySlug}/enabled".format( @@ -2662,7 +3072,9 @@ def create_repo_condition(self, project_key, repo_key, condition): url = self._url_repo_condition(project_key, repo_key) return self.post(url, data=condition) or {} - def update_repo_condition(self, project_key, repo_key, condition, id_condition): + def update_repo_condition( + self, project_key, repo_key, condition, id_condition + ): """ Request type: PUT Update a specific condition for this repository slug inside project. @@ -2741,7 +3153,9 @@ def download_repo_archive( if prefix is not None: params["prefix"] = prefix headers = {"Accept": "*/*"} - response = self.get(url, params=params, headers=headers, advanced_mode=True) + response = self.get( + url, params=params, headers=headers, advanced_mode=True + ) for chunk in response.iter_content(chunk_size=chunk_size): dest_fd.write(chunk) @@ -2770,7 +3184,9 @@ def get_repositories(self, workspace, role=None, query=None, sort=None): version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipelines(self, workspace, repository_slug, number=10, sort_by="-created_on"): + def get_pipelines( + self, workspace, repository_slug, number=10, sort_by="-created_on" + ): """ Get information about latest pipelines runs. @@ -2798,7 +3214,14 @@ def get_pipelines(self, workspace, repository_slug, number=10, sort_by="-created version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def trigger_pipeline(self, workspace, repository_slug, branch="master", revision=None, name=None): + def trigger_pipeline( + self, + workspace, + repository_slug, + branch="master", + revision=None, + name=None, + ): """ Trigger a new pipeline. The following options are possible (1 and 2 trigger the pipeline that the branch is associated with in the Pipelines @@ -2883,7 +3306,9 @@ def get_pipeline_steps(self, workspace, repository_slug, uuid): version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipeline_step(self, workspace, repository_slug, pipeline_uuid, step_uuid): + def get_pipeline_step( + self, workspace, repository_slug, pipeline_uuid, step_uuid + ): """ Get information about a step of a pipeline, specified by respective UUIDs. :param workspace: @@ -2904,7 +3329,9 @@ def get_pipeline_step(self, workspace, repository_slug, pipeline_uuid, step_uuid version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipeline_step_log(self, workspace, repository_slug, pipeline_uuid, step_uuid): + def get_pipeline_step_log( + self, workspace, repository_slug, pipeline_uuid, step_uuid + ): """ Get log of a step of a pipeline, specified by respective UUIDs. :param workspace: @@ -2948,7 +3375,12 @@ def create_issue( Cloud(self.url, **self._new_session_args) .workspaces.get(workspace) .repositories.get(repository_slug) - .issues.create(title=title, description=description, kind=kind, priority=priority) + .issues.create( + title=title, + description=description, + kind=kind, + priority=priority, + ) .data ) @@ -3087,7 +3519,9 @@ def add_branch_restriction( version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_branch_restrictions(self, workspace, repository_slug, kind=None, pattern=None, number=10): + def get_branch_restrictions( + self, workspace, repository_slug, kind=None, pattern=None, number=10 + ): """ Get all branch permissions. """ @@ -3108,7 +3542,9 @@ def get_branch_restrictions(self, workspace, repository_slug, kind=None, pattern version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def update_branch_restriction(self, workspace, repository_slug, id, **fields): + def update_branch_restriction( + self, workspace, repository_slug, id, **fields + ): """ Update an existing branch restriction identified by ``id``. Consult the official API documentation for valid fields. diff --git a/atlassian/bitbucket/base.py b/atlassian/bitbucket/base.py index e5c69677d..8a4af73a0 100644 --- a/atlassian/bitbucket/base.py +++ b/atlassian/bitbucket/base.py @@ -31,14 +31,26 @@ def __init__(self, url, *args, **kwargs): url = self.get_link("self") if isinstance(url, list): # Server has a list of links url = url[0] - self.timeformat_lambda = kwargs.pop("timeformat_lambda", lambda x: self._default_timeformat_lambda(x)) + self.timeformat_lambda = kwargs.pop( + "timeformat_lambda", lambda x: self._default_timeformat_lambda(x) + ) self._check_timeformat_lambda() super(BitbucketBase, self).__init__(url, *args, **kwargs) def __str__(self): - return PrettyPrinter(indent=4).pformat(self.__data if self.__data else self) + return PrettyPrinter(indent=4).pformat( + self.__data if self.__data else self + ) - def _get_paged(self, url, params=None, data=None, flags=None, trailing=None, absolute=False): + def _get_paged( + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, + ): """ Used to get the paged data @@ -56,7 +68,14 @@ def _get_paged(self, url, params=None, data=None, flags=None, trailing=None, abs params = {} while True: - response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute) + response = self.get( + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, + ) if "values" not in response: return @@ -101,7 +120,9 @@ def _check_timeformat_lambda(self): ): return True else: - ValueError("Expected [None] or [lambda function] for argument [timeformat_func]") + ValueError( + "Expected [None] or [lambda function] for argument [timeformat_func]" + ) def _sub_url(self, url): """ diff --git a/atlassian/bitbucket/cloud/__init__.py b/atlassian/bitbucket/cloud/__init__.py index 3b156a58f..ca2f80652 100644 --- a/atlassian/bitbucket/cloud/__init__.py +++ b/atlassian/bitbucket/cloud/__init__.py @@ -12,8 +12,12 @@ def __init__(self, url="https://api.bitbucket.org/", *args, **kwargs): kwargs["api_version"] = "2.0" url = url.strip("/") + "/{}".format(kwargs["api_version"]) super(Cloud, self).__init__(url, *args, **kwargs) - self.__workspaces = Workspaces("{}/workspaces".format(self.url), **self._new_session_args) - self.__repositories = Repositories("{}/repositories".format(self.url), **self._new_session_args) + self.__workspaces = Workspaces( + "{}/workspaces".format(self.url), **self._new_session_args + ) + self.__repositories = Repositories( + "{}/repositories".format(self.url), **self._new_session_args + ) @property def workspaces(self): diff --git a/atlassian/bitbucket/cloud/base.py b/atlassian/bitbucket/cloud/base.py index 37f45ae9e..ec6bcd78d 100644 --- a/atlassian/bitbucket/cloud/base.py +++ b/atlassian/bitbucket/cloud/base.py @@ -21,8 +21,14 @@ def __init__(self, url, *args, **kwargs): """ expected_type = kwargs.pop("expected_type", None) super(BitbucketCloudBase, self).__init__(url, *args, **kwargs) - if expected_type is not None and not expected_type == self.get_data("type"): - raise ValueError("Expected type of data is [{}], got [{}].".format(expected_type, self.get_data("type"))) + if expected_type is not None and not expected_type == self.get_data( + "type" + ): + raise ValueError( + "Expected type of data is [{}], got [{}].".format( + expected_type, self.get_data("type") + ) + ) def get_link(self, link): """ @@ -38,7 +44,14 @@ def get_link(self, link): return links[link]["href"] def _get_paged( - self, url, params=None, data=None, flags=None, trailing=None, absolute=False, paging_workaround=False + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, + paging_workaround=False, ): """ Used to get the paged data diff --git a/atlassian/bitbucket/cloud/common/builds.py b/atlassian/bitbucket/cloud/common/builds.py index dfd03efdb..cc7d0e4ad 100644 --- a/atlassian/bitbucket/cloud/common/builds.py +++ b/atlassian/bitbucket/cloud/common/builds.py @@ -8,7 +8,9 @@ class Build(BitbucketCloudBase): STATE_SUCCESSFUL = "SUCCESSFUL" def __init__(self, data, *args, **kwargs): - super(Build, self).__init__(None, None, *args, data=data, expected_type="build", **kwargs) + super(Build, self).__init__( + None, None, *args, data=data, expected_type="build", **kwargs + ) @property def key(self): diff --git a/atlassian/bitbucket/cloud/common/comments.py b/atlassian/bitbucket/cloud/common/comments.py index b24a2d7cc..1e0af1351 100644 --- a/atlassian/bitbucket/cloud/common/comments.py +++ b/atlassian/bitbucket/cloud/common/comments.py @@ -4,7 +4,14 @@ class Comment(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Comment, self).__init__(None, None, *args, data=data, expected_type="pullrequest_comment", **kwargs) + super(Comment, self).__init__( + None, + None, + *args, + data=data, + expected_type="pullrequest_comment", + **kwargs + ) @property def raw(self): diff --git a/atlassian/bitbucket/cloud/common/users.py b/atlassian/bitbucket/cloud/common/users.py index 51484bc1c..071819c07 100644 --- a/atlassian/bitbucket/cloud/common/users.py +++ b/atlassian/bitbucket/cloud/common/users.py @@ -3,7 +3,9 @@ class User(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(User, self).__init__(url, *args, data=data, expected_type="user", **kwargs) + super(User, self).__init__( + url, *args, data=data, expected_type="user", **kwargs + ) @property def display_name(self): @@ -37,7 +39,9 @@ class Participant(BitbucketCloudBase): CHANGES_REQUESTED = "changes_requested" def __init__(self, data, *args, **kwargs): - super(Participant, self).__init__(None, None, *args, data=data, expected_type="participant", **kwargs) + super(Participant, self).__init__( + None, None, *args, data=data, expected_type="participant", **kwargs + ) @property def user(self): diff --git a/atlassian/bitbucket/cloud/repositories/__init__.py b/atlassian/bitbucket/cloud/repositories/__init__.py index b932b856d..a7067b1f3 100644 --- a/atlassian/bitbucket/cloud/repositories/__init__.py +++ b/atlassian/bitbucket/cloud/repositories/__init__.py @@ -79,7 +79,9 @@ def get(self, workspace, repo_slug): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/#api-repositories-workspace-repo-slug-get """ - return self._get_object(super(Repositories, self).get("{}/{}".format(workspace, repo_slug))) + return self._get_object( + super(Repositories, self).get("{}/{}".format(workspace, repo_slug)) + ) class WorkspaceRepositories(RepositoriesBase): @@ -95,7 +97,9 @@ class WorkspaceRepositories(RepositoriesBase): def __init__(self, url, *args, **kwargs): super(WorkspaceRepositories, self).__init__(url, *args, **kwargs) - def create(self, repo_slug, project_key=None, is_private=None, fork_policy=None): + def create( + self, repo_slug, project_key=None, is_private=None, fork_policy=None + ): """ Creates a new repository with the given repo_slug. @@ -119,7 +123,9 @@ def create(self, repo_slug, project_key=None, is_private=None, fork_policy=None) data["is_private"] = is_private if fork_policy is not None: if fork_policy not in self.FORK_POLICIES: - raise ValueError("fork_policy must be one of {}".format(self.FORK_POLICIES)) + raise ValueError( + "fork_policy must be one of {}".format(self.FORK_POLICIES) + ) data["fork_policy"] = fork_policy return self._get_object(self.post(repo_slug, data=data)) @@ -165,13 +171,19 @@ def get(self, repository, by="slug"): https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D#get """ if by == "slug": - return self._get_object(super(WorkspaceRepositories, self).get(repository)) + return self._get_object( + super(WorkspaceRepositories, self).get(repository) + ) elif by == "name": for r in self.each(): if r.name == repository: return r else: - ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) + ValueError( + "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( + by + ) + ) raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -235,10 +247,16 @@ def get(self, repository, by="slug"): https://developer.atlassian.com/bitbucket/api/2/reference/resource/workspaces/%7Bworkspace%7D/projects/%7Bproject_key%7D#get """ if by not in ("slug", "name"): - ValueError("Unknown value '{}' for argument [by], expected 'slug' or 'name'".format(by)) + ValueError( + "Unknown value '{}' for argument [by], expected 'slug' or 'name'".format( + by + ) + ) for r in self.each(): - if ((by == "slug") and (r.slug == repository)) or ((by == "name") and (r.name == repository)): + if ((by == "slug") and (r.slug == repository)) or ( + (by == "name") and (r.name == repository) + ): return r raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -246,21 +264,35 @@ def get(self, repository, by="slug"): class Repository(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Repository, self).__init__(None, *args, data=data, expected_type="repository", **kwargs) + super(Repository, self).__init__( + None, *args, data=data, expected_type="repository", **kwargs + ) self.__branch_restrictions = BranchRestrictions( "{}/branch-restrictions".format(self.url), **self._new_session_args ) - self.__branches = Branches("{}/refs/branches".format(self.url), **self._new_session_args) + self.__branches = Branches( + "{}/refs/branches".format(self.url), **self._new_session_args + ) self.__commits = Commits( "{}/commits".format(self.url), data={"links": {"commit": {"href": "{}/commit".format(self.url)}}}, **self._new_session_args ) - self.__default_reviewers = DefaultReviewers("{}/default-reviewers".format(self.url), **self._new_session_args) - self.__issues = Issues("{}/issues".format(self.url), **self._new_session_args) - self.__pipelines = Pipelines("{}/pipelines".format(self.url), **self._new_session_args) - self.__pullrequests = PullRequests("{}/pullrequests".format(self.url), **self._new_session_args) - self.__tags = Tags("{}/refs/tags".format(self.url), **self._new_session_args) + self.__default_reviewers = DefaultReviewers( + "{}/default-reviewers".format(self.url), **self._new_session_args + ) + self.__issues = Issues( + "{}/issues".format(self.url), **self._new_session_args + ) + self.__pipelines = Pipelines( + "{}/pipelines".format(self.url), **self._new_session_args + ) + self.__pullrequests = PullRequests( + "{}/pullrequests".format(self.url), **self._new_session_args + ) + self.__tags = Tags( + "{}/refs/tags".format(self.url), **self._new_session_args + ) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py index 64cf72bbd..ba617e2d3 100644 --- a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py +++ b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py @@ -110,7 +110,9 @@ def get(self, id): class BranchRestriction(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(BranchRestriction, self).__init__(None, *args, data=data, expected_type="branchrestriction", **kwargs) + super(BranchRestriction, self).__init__( + None, *args, data=data, expected_type="branchrestriction", **kwargs + ) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/commits.py b/atlassian/bitbucket/cloud/repositories/commits.py index 3b713ac14..9c6ee99b3 100644 --- a/atlassian/bitbucket/cloud/repositories/commits.py +++ b/atlassian/bitbucket/cloud/repositories/commits.py @@ -48,7 +48,10 @@ def get(self, commit_hash): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get """ return self.__get_object( - super(Commits, self).get(self.url_joiner(self.get_link("commit"), commit_hash), absolute=True) + super(Commits, self).get( + self.url_joiner(self.get_link("commit"), commit_hash), + absolute=True, + ) ) @@ -60,7 +63,9 @@ class Commit(BitbucketCloudBase): """ def __init__(self, data, *args, **kwargs): - super(Commit, self).__init__(None, *args, data=data, expected_type="commit", **kwargs) + super(Commit, self).__init__( + None, *args, data=data, expected_type="commit", **kwargs + ) @property def hash(self): @@ -106,7 +111,14 @@ def builds(self): for build in builds: yield Build(build, **self._new_session_args) - def add_build(self, key, url=None, description=None, refname=None, state=Build.STATE_INPROGRESS): + def add_build( + self, + key, + url=None, + description=None, + refname=None, + state=Build.STATE_INPROGRESS, + ): """ Add new build status to commit. @@ -128,7 +140,10 @@ def get_build(self, key): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-get """ - return Build(super(Commit, self).get(self.url_joiner("statuses/build", key)), **self._new_session_args) + return Build( + super(Commit, self).get(self.url_joiner("statuses/build", key)), + **self._new_session_args + ) def comments(self): """ @@ -148,11 +163,7 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = { - "content": { - "raw": raw_message, - } - } + data = {"content": {"raw": raw_message, }} return self.post("comments", data) diff --git a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py index c9691b292..653a1f8d6 100644 --- a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py +++ b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py @@ -11,7 +11,11 @@ def __init__(self, url, *args, **kwargs): super(DefaultReviewers, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return DefaultReviewer(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args) + return DefaultReviewer( + self.url_joiner(self.url, data["uuid"]), + data, + **self._new_session_args + ) def add(self, user): """ @@ -65,7 +69,9 @@ def get(self, user): """ default_reviewer = None try: - default_reviewer = self.__get_object(super(DefaultReviewers, self).get(user)) + default_reviewer = self.__get_object( + super(DefaultReviewers, self).get(user) + ) except HTTPError as e: # A 404 indicates that the specified user is not a default reviewer. if not e.response.status_code == 404: diff --git a/atlassian/bitbucket/cloud/repositories/diffstat.py b/atlassian/bitbucket/cloud/repositories/diffstat.py index 8de0fe040..bb5a5c55c 100644 --- a/atlassian/bitbucket/cloud/repositories/diffstat.py +++ b/atlassian/bitbucket/cloud/repositories/diffstat.py @@ -22,7 +22,9 @@ class DiffStat(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(DiffStat, self).__init__(None, None, *args, data=data, expected_type="diffstat", **kwargs) + super(DiffStat, self).__init__( + None, None, *args, data=data, expected_type="diffstat", **kwargs + ) @property def lines_removed(self): @@ -69,8 +71,15 @@ class CommitFile(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" if data is None: # handles add/remove - data = {"path": None, "escaped_path": None, "links": {}, "type": "commit_file"} - super(CommitFile, self).__init__(None, None, *args, data=data, expected_type="commit_file", **kwargs) + data = { + "path": None, + "escaped_path": None, + "links": {}, + "type": "commit_file", + } + super(CommitFile, self).__init__( + None, None, *args, data=data, expected_type="commit_file", **kwargs + ) @property def path(self): diff --git a/atlassian/bitbucket/cloud/repositories/issues.py b/atlassian/bitbucket/cloud/repositories/issues.py index 33629ee69..ea3aea0c6 100644 --- a/atlassian/bitbucket/cloud/repositories/issues.py +++ b/atlassian/bitbucket/cloud/repositories/issues.py @@ -69,7 +69,9 @@ def get(self, id): class Issue(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Issue, self).__init__(None, *args, data=data, expected_type="issue", **kwargs) + super(Issue, self).__init__( + None, *args, data=data, expected_type="issue", **kwargs + ) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/pipelines.py b/atlassian/bitbucket/cloud/repositories/pipelines.py index 0b7ae61ca..a2a921a0d 100644 --- a/atlassian/bitbucket/cloud/repositories/pipelines.py +++ b/atlassian/bitbucket/cloud/repositories/pipelines.py @@ -11,9 +11,15 @@ def __init__(self, url, *args, **kwargs): super(Pipelines, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return Pipeline(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args) - - def trigger(self, branch="master", commit=None, pattern=None, variables=None): + return Pipeline( + self.url_joiner(self.url, data["uuid"]), + data, + **self._new_session_args + ) + + def trigger( + self, branch="master", commit=None, pattern=None, variables=None + ): """ Trigger a new pipeline. The following options are possible (1 and 2 trigger the pipeline that the branch is associated with in the Pipelines @@ -76,10 +82,7 @@ def each(self, q=None, sort=None): if q is not None: params["q"] = q for pipeline in self._get_paged( - None, - trailing=True, - paging_workaround=True, - params=params, + None, trailing=True, paging_workaround=True, params=params, ): yield self.__get_object(pipeline) @@ -100,10 +103,16 @@ def get(self, uuid): class Pipeline(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(Pipeline, self).__init__(url, *args, data=data, expected_type="pipeline", **kwargs) + super(Pipeline, self).__init__( + url, *args, data=data, expected_type="pipeline", **kwargs + ) def __get_object(self, data): - return Step("{}/steps/{}".format(self.url, data["uuid"]), data, **self._new_session_args) + return Step( + "{}/steps/{}".format(self.url, data["uuid"]), + data, + **self._new_session_args + ) @property def uuid(self): @@ -136,7 +145,9 @@ def pullrequest(self): target = self.get_data("target") if target["type"] == "pipeline_pullrequest_target": return PullRequest( - target["pullrequest"]["links"]["self"]["href"], target["pullrequest"], **self._new_session_args + target["pullrequest"]["links"]["self"]["href"], + target["pullrequest"], + **self._new_session_args ) else: return None @@ -175,7 +186,9 @@ def step(self, uuid): class Step(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(Step, self).__init__(url, *args, data=data, expected_type="pipeline_step", **kwargs) + super(Step, self).__init__( + url, *args, data=data, expected_type="pipeline_step", **kwargs + ) @property def uuid(self): @@ -230,7 +243,9 @@ def log(self, start=None, end=None): API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pipelines/%7Bpipeline_uuid%7D/steps/%7Bstep_uuid%7D/log#get """ headers = {"Accept": "application/octet-stream"} - if ((start is not None) and (end is None)) or ((start is None) and (end is not None)): + if ((start is not None) and (end is None)) or ( + (start is None) and (end is not None) + ): raise ValueError("For a range [start] and [end] are needed.") if start is not None: start = int(start) @@ -238,7 +253,9 @@ def log(self, start=None, end=None): if (start >= 0) and (start < end): headers["Range"] = "bytes={}-{}".format(start, end) else: - raise ValueError("Value of [start] must be o or greater and [end] must be greater than [start].") + raise ValueError( + "Value of [start] must be o or greater and [end] must be greater than [start]." + ) response = None try: @@ -258,4 +275,7 @@ def log(self, start=None, end=None): if start is None: return response.content - return response.headers["Content-Range"].split("/")[1], response.content + return ( + response.headers["Content-Range"].split("/")[1], + response.content, + ) diff --git a/atlassian/bitbucket/cloud/repositories/pullRequests.py b/atlassian/bitbucket/cloud/repositories/pullRequests.py index 44d38f631..0cdce0b5a 100644 --- a/atlassian/bitbucket/cloud/repositories/pullRequests.py +++ b/atlassian/bitbucket/cloud/repositories/pullRequests.py @@ -75,7 +75,9 @@ def each(self, q=None, sort=None): if q is not None: params["q"] = q for pr in self._get_paged(None, trailing=True, params=params): - yield self.__get_object(super(PullRequests, self).get(pr.get("id"))) + yield self.__get_object( + super(PullRequests, self).get(pr.get("id")) + ) return @@ -113,7 +115,9 @@ class PullRequest(BitbucketCloudBase): STATE_SUPERSEDED = "SUPERSEDED" def __init__(self, data, *args, **kwargs): - super(PullRequest, self).__init__(None, *args, data=data, expected_type="pullrequest", **kwargs) + super(PullRequest, self).__init__( + None, *args, data=data, expected_type="pullrequest", **kwargs + ) def _check_if_open(self): if not self.is_open: @@ -243,7 +247,9 @@ def patch(self, encoding="utf-8"): API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pullrequests/%7Bpull_request_id%7D/patch """ - return str(self.get("patch", not_json_response=True), encoding=encoding) + return str( + self.get("patch", not_json_response=True), encoding=encoding + ) def statuses(self): """ @@ -293,11 +299,7 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = { - "content": { - "raw": raw_message, - } - } + data = {"content": {"raw": raw_message, }} return self.post("comments", data) @@ -321,11 +323,7 @@ def add_task(self, raw_message): if not raw_message: raise ValueError("No message set") - data = { - "content": { - "raw": raw_message, - } - } + data = {"content": {"raw": raw_message, }} return Task(self.post("tasks", data), **self._new_session_args) @@ -388,8 +386,12 @@ def merge(self, merge_strategy=None, close_source_branch=None): """ self._check_if_open() - if merge_strategy is not None and merge_strategy not in self.MERGE_STRATEGIES: - raise ValueError("merge_strategy must be {}".format(self.MERGE_STRATEGIES)) + if ( + merge_strategy is not None and merge_strategy not in self.MERGE_STRATEGIES + ): + raise ValueError( + "merge_strategy must be {}".format(self.MERGE_STRATEGIES) + ) data = { "close_source_branch": close_source_branch or self.close_source_branch, @@ -439,7 +441,9 @@ def creator(self): @property def resolved_by(self): """User object with user information of the task resolver""" - return User(None, self.get_data("resolved_by"), **self._new_session_args) + return User( + None, self.get_data("resolved_by"), **self._new_session_args + ) def update(self, raw_message): """ @@ -450,11 +454,7 @@ def update(self, raw_message): if not raw_message: raise ValueError("No message set") - data = { - "content": { - "raw": raw_message, - } - } + data = {"content": {"raw": raw_message, }} return self._update_data(self.put(None, data=data)) def delete(self): diff --git a/atlassian/bitbucket/cloud/repositories/refs.py b/atlassian/bitbucket/cloud/repositories/refs.py index 0af321801..84ef1e4dd 100644 --- a/atlassian/bitbucket/cloud/repositories/refs.py +++ b/atlassian/bitbucket/cloud/repositories/refs.py @@ -16,9 +16,7 @@ def __init__(self, url, *args, **kwargs): super(Refs, self).__init__(url, *args, **kwargs) def create( - self, - name, - commit, + self, name, commit, ): """ Creates a ref with the given target commit @@ -112,7 +110,9 @@ class Branch(Ref): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(Branch, self).__init__(None, *args, data=data, expected_type="branch", **kwargs) + super(Branch, self).__init__( + None, *args, data=data, expected_type="branch", **kwargs + ) @property def author(self): @@ -129,7 +129,9 @@ class Tag(Ref): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(Tag, self).__init__(None, *args, data=data, expected_type="tag", **kwargs) + super(Tag, self).__init__( + None, *args, data=data, expected_type="tag", **kwargs + ) @property def author(self): diff --git a/atlassian/bitbucket/cloud/workspaces/__init__.py b/atlassian/bitbucket/cloud/workspaces/__init__.py index ff95f0b1e..1ce597e27 100644 --- a/atlassian/bitbucket/cloud/workspaces/__init__.py +++ b/atlassian/bitbucket/cloud/workspaces/__init__.py @@ -83,9 +83,15 @@ def exists(self, workspace): class Workspace(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Workspace, self).__init__(None, *args, data=data, expected_type="workspace", **kwargs) - self.__projects = Projects(self.get_link("projects"), **self._new_session_args) - self.__repositories = WorkspaceRepositories(self.get_link("repositories"), **self._new_session_args) + super(Workspace, self).__init__( + None, *args, data=data, expected_type="workspace", **kwargs + ) + self.__projects = Projects( + self.get_link("projects"), **self._new_session_args + ) + self.__repositories = WorkspaceRepositories( + self.get_link("repositories"), **self._new_session_args + ) @property def name(self): diff --git a/atlassian/bitbucket/cloud/workspaces/projects.py b/atlassian/bitbucket/cloud/workspaces/projects.py index daa821beb..dc091061e 100644 --- a/atlassian/bitbucket/cloud/workspaces/projects.py +++ b/atlassian/bitbucket/cloud/workspaces/projects.py @@ -92,7 +92,11 @@ def get(self, project, by="key"): if p.name == project: return p else: - ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) + ValueError( + "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( + by + ) + ) raise Exception("Unknown project {} '{}'".format(by, project)) @@ -122,13 +126,19 @@ def exists(self, project, by="key"): class Project(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Project, self).__init__(None, *args, data=data, expected_type="project", **kwargs) + super(Project, self).__init__( + None, *args, data=data, expected_type="project", **kwargs + ) try: url = self.get_link("repositories") except KeyError: workspace = self.get_data("workspace") - url = '{}/?q=project.key="{}"'.format(workspace["links"]["self"], workspace["slug"]) - self.__repositories = ProjectRepositories(url, **self._new_session_args) + url = '{}/?q=project.key="{}"'.format( + workspace["links"]["self"], workspace["slug"] + ) + self.__repositories = ProjectRepositories( + url, **self._new_session_args + ) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/server/__init__.py b/atlassian/bitbucket/server/__init__.py index aa5199d56..548a687b1 100644 --- a/atlassian/bitbucket/server/__init__.py +++ b/atlassian/bitbucket/server/__init__.py @@ -15,11 +15,19 @@ def __init__(self, url, *args, **kwargs): kwargs["cloud"] = False kwargs["api_root"] = "rest/api" kwargs["api_version"] = "1.0" - url = url.strip("/") + "/{}/{}".format(kwargs["api_root"], kwargs["api_version"]) + url = url.strip("/") + "/{}/{}".format( + kwargs["api_root"], kwargs["api_version"] + ) super(Server, self).__init__(url, *args, **kwargs) - self.__projects = Projects(self._sub_url("projects"), **self._new_session_args) - self.__groups = Groups(self._sub_url("admin/permissions/groups"), **self._new_session_args) - self.__users = Users(self._sub_url("admin/permissions/users"), **self._new_session_args) + self.__projects = Projects( + self._sub_url("projects"), **self._new_session_args + ) + self.__groups = Groups( + self._sub_url("admin/permissions/groups"), **self._new_session_args + ) + self.__users = Users( + self._sub_url("admin/permissions/users"), **self._new_session_args + ) @property def groups(self): diff --git a/atlassian/bitbucket/server/base.py b/atlassian/bitbucket/server/base.py index 90c8ffb76..7d23b5f28 100644 --- a/atlassian/bitbucket/server/base.py +++ b/atlassian/bitbucket/server/base.py @@ -17,7 +17,15 @@ def get_link(self, link): return None return [x["href"] for x in links[link]] - def _get_paged(self, url, params=None, data=None, flags=None, trailing=False, absolute=False): + def _get_paged( + self, + url, + params=None, + data=None, + flags=None, + trailing=False, + absolute=False, + ): """ Used to get the paged data diff --git a/atlassian/bitbucket/server/common/permissions.py b/atlassian/bitbucket/server/common/permissions.py index e9d3a89d2..459176366 100644 --- a/atlassian/bitbucket/server/common/permissions.py +++ b/atlassian/bitbucket/server/common/permissions.py @@ -131,13 +131,19 @@ def delete(self): :return: The response on success """ if self.url is None: - raise NotImplementedError("Delete not implemented for this object type.") - return super(BitbucketServerBase, self).delete(None, params={"name": self.name}) + raise NotImplementedError( + "Delete not implemented for this object type." + ) + return super(BitbucketServerBase, self).delete( + None, params={"name": self.name} + ) @property def permission(self): if self.url is None: - raise NotImplementedError("Pemission not implemented for this object type.") + raise NotImplementedError( + "Pemission not implemented for this object type." + ) return self.get_data("permission") @property @@ -158,7 +164,11 @@ def is_read(self): @property def can_write(self): """True if group/user can write""" - return True if self.permission in (Permissions.ADMIN, Permissions.WRITE) else False + return ( + True + if self.permission in (Permissions.ADMIN, Permissions.WRITE) + else False + ) class Group(PermissionBase): diff --git a/atlassian/bitbucket/server/globalPermissions.py b/atlassian/bitbucket/server/globalPermissions.py index 2db8a47d1..0f36a1bd5 100644 --- a/atlassian/bitbucket/server/globalPermissions.py +++ b/atlassian/bitbucket/server/globalPermissions.py @@ -123,16 +123,26 @@ class PermissionBase(BitbucketServerBase): @property def permission(self): if self.url is None: - raise NotImplementedError("Permission not implemented for this object type.") + raise NotImplementedError( + "Permission not implemented for this object type." + ) return self.get_data("permission") @property def is_licensed_user(self): - return True if self.permission == GlobalPermissions.LICENSED_USER else False + return ( + True + if self.permission == GlobalPermissions.LICENSED_USER + else False + ) @property def is_project_create(self): - return True if self.permission == GlobalPermissions.PROJECT_CREATE else False + return ( + True + if self.permission == GlobalPermissions.PROJECT_CREATE + else False + ) @property def is_admin(self): @@ -140,7 +150,9 @@ def is_admin(self): @property def is_sys_admin(self): - return True if self.permission == GlobalPermissions.SYS_ADMIN else False + return ( + True if self.permission == GlobalPermissions.SYS_ADMIN else False + ) def delete(self): """ @@ -149,8 +161,12 @@ def delete(self): :return: The response on success """ if self.url is None: - raise NotImplementedError("Delete not implemented for this object type.") - return super(PermissionBase, self).delete(None, params={"name": self.name}) + raise NotImplementedError( + "Delete not implemented for this object type." + ) + return super(PermissionBase, self).delete( + None, params={"name": self.name} + ) class Group(PermissionBase): diff --git a/atlassian/bitbucket/server/projects/__init__.py b/atlassian/bitbucket/server/projects/__init__.py index 902ec422d..9b71ad793 100644 --- a/atlassian/bitbucket/server/projects/__init__.py +++ b/atlassian/bitbucket/server/projects/__init__.py @@ -81,7 +81,11 @@ def get(self, project, by="key"): if p.name == project: return p else: - ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) + ValueError( + "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( + by + ) + ) raise Exception("Unknown project {} '{}'".format(by, project)) @@ -110,9 +114,19 @@ def exists(self, project, by="key"): class Project(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Project, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups(self._sub_url("permissions/groups"), "PROJECT", **self._new_session_args) - self.__users = Users(self._sub_url("permissions/users"), "PROJECT", **self._new_session_args) - self.__repos = Repositories(self._sub_url("repos"), **self._new_session_args) + self.__groups = Groups( + self._sub_url("permissions/groups"), + "PROJECT", + **self._new_session_args + ) + self.__users = Users( + self._sub_url("permissions/users"), + "PROJECT", + **self._new_session_args + ) + self.__repos = Repositories( + self._sub_url("repos"), **self._new_session_args + ) def delete(self): """ diff --git a/atlassian/bitbucket/server/projects/repos/__init__.py b/atlassian/bitbucket/server/projects/repos/__init__.py index 6d7b7827f..d2351e4bb 100644 --- a/atlassian/bitbucket/server/projects/repos/__init__.py +++ b/atlassian/bitbucket/server/projects/repos/__init__.py @@ -52,7 +52,11 @@ def get(self, repository, by="slug"): if r.name == repository: return r else: - ValueError("Unknown value '{}' for argument [by], expected 'slug' or 'name'".format(by)) + ValueError( + "Unknown value '{}' for argument [by], expected 'slug' or 'name'".format( + by + ) + ) raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -81,8 +85,16 @@ def exists(self, repository, by="slug"): class Repository(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Repository, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups(self._sub_url("permissions/groups"), "REPO", **self._new_session_args) - self.__users = Users(self._sub_url("permissions/users"), "REPO", **self._new_session_args) + self.__groups = Groups( + self._sub_url("permissions/groups"), + "REPO", + **self._new_session_args + ) + self.__users = Users( + self._sub_url("permissions/users"), + "REPO", + **self._new_session_args + ) def __get_object(self, data): return Repository(data, **self._new_session_args) @@ -276,7 +288,16 @@ def users(self): """ return self.__users - def download_archive(self, dest_fd, at=None, filename=None, format=None, path=None, prefix=None, chunk_size=128): + def download_archive( + self, + dest_fd, + at=None, + filename=None, + format=None, + path=None, + prefix=None, + chunk_size=128, + ): """ Downloads a repository archive. Note that the data is written to the specified file-like object, @@ -305,6 +326,8 @@ def download_archive(self, dest_fd, at=None, filename=None, format=None, path=No if prefix is not None: params["prefix"] = prefix headers = {"Accept": "*/*"} - response = self.get("archive", params=params, headers=headers, advanced_mode=True) + response = self.get( + "archive", params=params, headers=headers, advanced_mode=True + ) for chunk in response.iter_content(chunk_size=chunk_size): dest_fd.write(chunk) diff --git a/atlassian/confluence.py b/atlassian/confluence.py index f8600ddbf..cda40bc92 100644 --- a/atlassian/confluence.py +++ b/atlassian/confluence.py @@ -32,7 +32,9 @@ class Confluence(AtlassianRestAPI): } def __init__(self, url, *args, **kwargs): - if ("atlassian.net" in url or "jira.com" in url) and ("/wiki" not in url): + if ("atlassian.net" in url or "jira.com" in url) and ( + "/wiki" not in url + ): url = AtlassianRestAPI.url_joiner(url, "/wiki") if "cloud" not in kwargs: kwargs["cloud"] = True @@ -40,12 +42,30 @@ def __init__(self, url, *args, **kwargs): @staticmethod def _create_body(body, representation): - if representation not in ["editor", "export_view", "view", "storage", "wiki"]: - raise ValueError("Wrong value for representation, it should be either wiki or storage") + if representation not in [ + "editor", + "export_view", + "view", + "storage", + "wiki", + ]: + raise ValueError( + "Wrong value for representation, it should be either wiki or storage" + ) - return {representation: {"value": body, "representation": representation}} + return { + representation: {"value": body, "representation": representation} + } - def _get_paged(self, url, params=None, data=None, flags=None, trailing=None, absolute=False): + def _get_paged( + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, + ): """ Used to get the paged data @@ -63,7 +83,14 @@ def _get_paged(self, url, params=None, data=None, flags=None, trailing=None, abs params = {} while True: - response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute) + response = self.get( + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, + ) if "results" not in response: return @@ -115,7 +142,9 @@ def page_exists(self, space, title): else: return False - def get_page_child_by_type(self, page_id, type="page", start=None, limit=None, expand=None): + def get_page_child_by_type( + self, page_id, type="page", start=None, limit=None, expand=None + ): """ Provide content by type (page, blog, comment) :param page_id: A string containing the id of the type content container. @@ -133,7 +162,9 @@ def get_page_child_by_type(self, page_id, type="page", start=None, limit=None, e if expand is not None: params["expand"] = expand - url = "rest/api/content/{page_id}/child/{type}".format(page_id=page_id, type=type) + url = "rest/api/content/{page_id}/child/{type}".format( + page_id=page_id, type=type + ) log.info(url) try: @@ -155,7 +186,9 @@ def get_page_child_by_type(self, page_id, type="page", start=None, limit=None, e raise - def get_child_title_list(self, page_id, type="page", start=None, limit=None): + def get_child_title_list( + self, page_id, type="page", start=None, limit=None + ): """ Find a list of Child title :param page_id: A string containing the id of the type content container. @@ -206,9 +239,11 @@ def get_parent_content_id(self, page_id): """ parent_content_id = None try: - parent_content_id = (self.get_page_by_id(page_id=page_id, expand="ancestors").get("ancestors") or {})[ - -1 - ].get("id") or None + parent_content_id = ( + self.get_page_by_id(page_id=page_id, expand="ancestors").get( + "ancestors" + ) or {} + )[-1].get("id") or None except Exception as e: log.error(e) return parent_content_id @@ -221,9 +256,10 @@ def get_parent_content_title(self, page_id): """ parent_content_title = None try: - parent_content_title = (self.get_page_by_id(page_id=page_id, expand="ancestors").get("ancestors") or {})[ - -1 - ].get("title") or None + parent_content_title = ( + self.get_page_by_id(page_id=page_id, expand="ancestors") + .get("ancestors") or {} + )[-1].get("title") or None except Exception as e: log.error(e) return parent_content_title @@ -234,9 +270,13 @@ def get_page_space(self, page_id): :param page_id: content ID :return: """ - return ((self.get_page_by_id(page_id, expand="space") or {}).get("space") or {}).get("key") + return ( + (self.get_page_by_id(page_id, expand="space") or {}) + .get("space") or {}).get("key") or None - def get_pages_by_title(self, space, title, start=0, limit=200, expand=None): + def get_pages_by_title( + self, space, title, start=0, limit=200, expand=None + ): """ Provide pages by title search :param space: Space key @@ -292,7 +332,11 @@ def get_page_by_title(self, space, title, start=0, limit=1, expand=None): try: return response.get("results")[0] except (IndexError, TypeError) as e: - log.error("Can't find '{title}' page on the {url}!".format(title=title, url=self.url)) + log.error( + "Can't find '{title}' page on the {url}!".format( + title=title, url=self.url + ) + ) log.debug(e) return None @@ -425,7 +469,9 @@ def get_draft_page_by_id(self, page_id, status="draft"): :param status: :return: """ - url = "rest/api/content/{page_id}?status={status}".format(page_id=page_id, status=status) + url = "rest/api/content/{page_id}?status={status}".format( + page_id=page_id, status=status + ) try: response = self.get(url) @@ -452,7 +498,9 @@ def get_all_pages_by_label(self, label, start=0, limit=50): url = "rest/api/content/search" params = {} if label: - params["cql"] = 'type={type} AND label="{label}"'.format(type="page", label=label) + params["cql"] = 'type={type} AND label="{label}"'.format( + type="page", label=label + ) if start: params["start"] = start if limit: @@ -468,7 +516,15 @@ def get_all_pages_by_label(self, label, start=0, limit=50): return response.get("results") - def get_all_pages_from_space(self, space, start=0, limit=50, status=None, expand=None, content_type="page"): + def get_all_pages_from_space( + self, + space, + start=0, + limit=50, + status=None, + expand=None, + content_type="page", + ): """ Get all pages from space @@ -513,7 +569,9 @@ def get_all_pages_from_space(self, space, start=0, limit=50, status=None, expand return response.get("results") - def get_all_pages_from_space_trash(self, space, start=0, limit=500, status="trashed", content_type="page"): + def get_all_pages_from_space_trash( + self, space, start=0, limit=500, status="trashed", content_type="page" + ): """ Get list of pages from trash :param space: @@ -524,9 +582,13 @@ def get_all_pages_from_space_trash(self, space, start=0, limit=500, status="tras :param content_type: the content type to return. Default value: page. Valid values: page, blogpost. :return: """ - return self.get_all_pages_from_space(space, start, limit, status, content_type=content_type) + return self.get_all_pages_from_space( + space, start, limit, status, content_type=content_type + ) - def get_all_draft_pages_from_space(self, space, start=0, limit=500, status="draft"): + def get_all_draft_pages_from_space( + self, space, start=0, limit=500, status="draft" + ): """ Get list of draft pages from space Use case is cleanup old drafts from Confluence @@ -539,7 +601,9 @@ def get_all_draft_pages_from_space(self, space, start=0, limit=500, status="draf """ return self.get_all_pages_from_space(space, start, limit, status) - def get_all_draft_pages_from_space_through_cql(self, space, start=0, limit=500, status="draft"): + def get_all_draft_pages_from_space_through_cql( + self, space, start=0, limit=500, status="draft" + ): """ Search list of draft pages by space key Use case is cleanup old drafts from Confluence @@ -550,7 +614,9 @@ def get_all_draft_pages_from_space_through_cql(self, space, start=0, limit=500, fixed system limits. Default: 500 :return: """ - url = "rest/api/content?cql=space=spaceKey={space} and status={status}".format(space=space, status=status) + url = "rest/api/content?cql=space=spaceKey={space} and status={status}".format( + space=space, status=status + ) params = {} if limit: params["limit"] = limit @@ -570,7 +636,9 @@ def get_all_draft_pages_from_space_through_cql(self, space, start=0, limit=500, return response.get("results") - @deprecated(version="2.4.2", reason="Use get_all_restrictions_for_content()") + @deprecated( + version="2.4.2", reason="Use get_all_restrictions_for_content()" + ) def get_all_restictions_for_content(self, content_id): """Let's use the get_all_restrictions_for_content()""" log.warning("Please, be informed that is deprecated as typo naming") @@ -687,7 +755,11 @@ def create_page( :param full_width: DEFAULT: False :return: """ - log.info('Creating {type} "{space}" -> "{title}"'.format(space=space, title=title, type=type)) + log.info( + 'Creating {type} "{space}" -> "{title}"'.format( + space=space, title=title, type=type + ) + ) url = "rest/api/content/" data = { "type": type, @@ -701,8 +773,12 @@ def create_page( if editor is not None and editor in ["v1", "v2"]: data["metadata"]["properties"]["editor"] = {"value": editor} if full_width is True: - data["metadata"]["properties"]["content-appearance-draft"] = {"value": "full-width"} - data["metadata"]["properties"]["content-appearance-published"] = {"value": "full-width"} + data["metadata"]["properties"]["content-appearance-draft"] = { + "value": "full-width" + } + data["metadata"]["properties"]["content-appearance-published"] = { + "value": "full-width" + } try: response = self.post(url, data=data) except HTTPError as e: @@ -716,7 +792,14 @@ def create_page( return response - def move_page(self, space_key, page_id, target_id=None, target_title=None, position="append"): + def move_page( + self, + space_key, + page_id, + target_id=None, + target_title=None, + position="append", + ): """ Move page method :param space_key: @@ -737,7 +820,14 @@ def move_page(self, space_key, page_id, target_id=None, target_title=None, posit return self.post(url, params=params, headers=self.no_check_headers) def create_or_update_template( - self, name, body, template_type="page", template_id=None, description=None, labels=None, space=None + self, + name, + body, + template_type="page", + template_id=None, + description=None, + labels=None, + space=None, ): """ Creates a new or updates an existing content template. @@ -795,7 +885,9 @@ def get_template_by_id(self, template_id): Get user template by id. Experimental API Use case is get template body and create page from that """ - url = "rest/experimental/template/{template_id}".format(template_id=template_id) + url = "rest/experimental/template/{template_id}".format( + template_id=template_id + ) try: response = self.get(url) @@ -838,7 +930,9 @@ def get_content_template(self, template_id): return response @deprecated(version="3.7.0", reason="Use get_blueprint_templates()") - def get_all_blueprints_from_space(self, space, start=0, limit=None, expand=None): + def get_all_blueprints_from_space( + self, space, start=0, limit=None, expand=None + ): """ Get all users blue prints from space. Experimental API :param space: Space Key @@ -871,7 +965,9 @@ def get_all_blueprints_from_space(self, space, start=0, limit=None, expand=None) return response.get("results") or [] - def get_blueprint_templates(self, space=None, start=0, limit=None, expand=None): + def get_blueprint_templates( + self, space=None, start=0, limit=None, expand=None + ): """ Gets all templates provided by blueprints. @@ -908,7 +1004,9 @@ def get_blueprint_templates(self, space=None, start=0, limit=None, expand=None): return response.get("results") or [] @deprecated(version="3.7.0", reason="Use get_content_templates()") - def get_all_templates_from_space(self, space, start=0, limit=None, expand=None): + def get_all_templates_from_space( + self, space, start=0, limit=None, expand=None + ): """ Get all users templates from space. Experimental API ref: https://docs.atlassian.com/atlassian-confluence/1000.73.0/com/atlassian/confluence/plugins/restapi\ @@ -942,7 +1040,9 @@ def get_all_templates_from_space(self, space, start=0, limit=None, expand=None): return response.get("results") or [] - def get_content_templates(self, space=None, start=0, limit=None, expand=None): + def get_content_templates( + self, space=None, start=0, limit=None, expand=None + ): """ Get all content templates. Use this method to retrieve all global content templates or all content templates in a space. @@ -995,7 +1095,14 @@ def remove_template(self, template_id): """ return self.delete("rest/api/template/{}".format(template_id)) - def get_all_spaces(self, start=0, limit=500, expand=None, space_type=None, space_status=None): + def get_all_spaces( + self, + start=0, + limit=500, + expand=None, + space_type=None, + space_status=None, + ): """ Get all spaces with provided limit :param start: OPTIONAL: The start point of the collection to return. Default: None (0). @@ -1072,10 +1179,18 @@ def attach_content( :param comment: A comment describing this upload/file :type comment: ``str`` """ - page_id = self.get_page_id(space=space, title=title) if page_id is None else page_id + page_id = ( + self.get_page_id(space=space, title=title) + if page_id is None + else page_id + ) type = "attachment" if page_id is not None: - comment = comment if comment else "Uploaded {filename}.".format(filename=name) + comment = ( + comment + if comment + else "Uploaded {filename}.".format(filename=name) + ) data = { "type": type, "fileName": name, @@ -1083,10 +1198,17 @@ def attach_content( "comment": comment, "minorEdit": "true", } - headers = {"X-Atlassian-Token": "no-check", "Accept": "application/json"} - path = "rest/api/content/{page_id}/child/attachment".format(page_id=page_id) + headers = { + "X-Atlassian-Token": "no-check", + "Accept": "application/json", + } + path = "rest/api/content/{page_id}/child/attachment".format( + page_id=page_id + ) # Check if there is already a file with the same name - attachments = self.get(path=path, headers=headers, params={"filename": name}) + attachments = self.get( + path=path, headers=headers, params={"filename": name} + ) if attachments.get("size"): path = path + "/" + attachments["results"][0]["id"] + "/data" @@ -1155,7 +1277,9 @@ def attach_file( name = os.path.basename(filename) if content_type is None: extension = os.path.splitext(filename)[-1] - content_type = self.content_types.get(extension, "application/binary") + content_type = self.content_types.get( + extension, "application/binary" + ) with open(filename, "rb") as infile: content = infile.read() @@ -1194,10 +1318,14 @@ def delete_attachment_by_id(self, attachment_id, version): :return: """ return self.delete( - "rest/experimental/content/{id}/version/{versionId}".format(id=attachment_id, versionId=version) + "rest/experimental/content/{id}/version/{versionId}".format( + id=attachment_id, versionId=version + ) ) - def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versions): + def remove_page_attachment_keep_version( + self, page_id, filename, keep_last_versions + ): """ Keep last versions :param filename: @@ -1205,12 +1333,14 @@ def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versi :param keep_last_versions: :return: """ - attachment = self.get_attachments_from_content(page_id=page_id, expand="version", filename=filename).get( - "results" - )[0] + attachment = self.get_attachments_from_content( + page_id=page_id, expand="version", filename=filename + ).get("results")[0] attachment_versions = self.get_attachment_history(attachment.get("id")) while len(attachment_versions) > keep_last_versions: - remove_version_attachment_number = attachment_versions[keep_last_versions].get("number") + remove_version_attachment_number = attachment_versions[ + keep_last_versions + ].get("number") self.delete_attachment_by_id( attachment_id=attachment.get("id"), version=remove_version_attachment_number, @@ -1220,8 +1350,14 @@ def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versi attachment.get("title"), len(attachment_versions) ) ) - attachment_versions = self.get_attachment_history(attachment.get("id")) - log.info("Kept versions {} for {}".format(keep_last_versions, attachment.get("title"))) + attachment_versions = self.get_attachment_history( + attachment.get("id") + ) + log.info( + "Kept versions {} for {}".format( + keep_last_versions, attachment.get("title") + ) + ) def get_attachment_history(self, attachment_id, limit=200, start=0): """ @@ -1236,7 +1372,15 @@ def get_attachment_history(self, attachment_id, limit=200, start=0): return (self.get(url, params=params) or {}).get("results") # @todo prepare more attachments info - def get_attachments_from_content(self, page_id, start=0, limit=50, expand=None, filename=None, media_type=None): + def get_attachments_from_content( + self, + page_id, + start=0, + limit=50, + expand=None, + filename=None, + media_type=None, + ): """ Get attachments for page :param page_id: @@ -1315,7 +1459,8 @@ def remove_page_label(self, page_id, label): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The user has view permission, " "but no edit permission to the content", + "The user has view permission, " + "but no edit permission to the content", reason=e, ) if e.response.status_code == 404: @@ -1350,14 +1495,18 @@ def history(self, page_id): def get_content_history(self, content_id): return self.history(content_id) - def get_content_history_by_version_number(self, content_id, version_number): + def get_content_history_by_version_number( + self, content_id, version_number + ): """ Get content history by version number :param content_id: :param version_number: :return: """ - url = "rest/api/content/{id}/version/{versionNumber}".format(id=content_id, versionNumber=version_number) + url = "rest/api/content/{id}/version/{versionNumber}".format( + id=content_id, versionNumber=version_number + ) return self.get(url) def remove_content_history(self, page_id, version_number): @@ -1367,7 +1516,9 @@ def remove_content_history(self, page_id, version_number): :param version_number: version number :return: """ - url = "rest/api/content/{id}/version/{versionNumber}".format(id=page_id, versionNumber=version_number) + url = "rest/api/content/{id}/version/{versionNumber}".format( + id=page_id, versionNumber=version_number + ) self.delete(url) def remove_page_history(self, page_id, version_number): @@ -1386,7 +1537,9 @@ def remove_content_history_in_cloud(self, page_id, version_id): :param version_id: :return: """ - url = "rest/api/content/{id}/version/{versionId}".format(id=page_id, versionId=version_id) + url = "rest/api/content/{id}/version/{versionId}".format( + id=page_id, versionId=version_id + ) self.delete(url) def remove_page_history_keep_version(self, page_id, keep_last_versions): @@ -1402,8 +1555,16 @@ def remove_page_history_keep_version(self, page_id, keep_last_versions): self.remove_page_history(page_id=page_id, version_number=1) page = self.get_page_by_id(page_id=page_id, expand="version") page_number = page.get("version").get("number") - log.info("Removed oldest version for {}, now it's {}".format(page.get("title"), page_number)) - log.info("Kept versions {} for {}".format(keep_last_versions, page.get("title"))) + log.info( + "Removed oldest version for {}, now it's {}".format( + page.get("title"), page_number + ) + ) + log.info( + "Kept versions {} for {}".format( + keep_last_versions, page.get("title") + ) + ) def has_unknown_attachment_error(self, page_id): """ @@ -1411,13 +1572,19 @@ def has_unknown_attachment_error(self, page_id): :param page_id: :return: """ - unknown_attachment_identifier = "plugins/servlet/confluence/placeholder/unknown-attachment" + unknown_attachment_identifier = ( + "plugins/servlet/confluence/placeholder/unknown-attachment" + ) result = self.get_page_by_id(page_id, expand="body.view") if len(result) == 0: return "" - body = ((result.get("body") or {}).get("view") or {}).get("value") or {} + body = ((result.get("body") or {}).get("view") or {}).get( + "value" + ) or {} if unknown_attachment_identifier in body: - return result.get("_links").get("base") + result.get("_links").get("tinyui") + return result.get("_links").get("base") + result.get("_links").get( + "tinyui" + ) return "" def is_page_content_is_already_updated(self, page_id, body, title=None): @@ -1432,29 +1599,43 @@ def is_page_content_is_already_updated(self, page_id, body, title=None): if title: current_title = confluence_content.get("title", None) if title != current_title: - log.info("Title of {page_id} is different".format(page_id=page_id)) + log.info( + "Title of {page_id} is different".format(page_id=page_id) + ) return False if self.advanced_mode: confluence_content = ( - (self.get_page_by_id(page_id, expand="body.storage").json() or {}).get("body") or {} + ( + self.get_page_by_id(page_id, expand="body.storage").json() + or {} + ).get("body") or {} ).get("storage") or {} else: - confluence_content = ((self.get_page_by_id(page_id, expand="body.storage") or {}).get("body") or {}).get( - "storage" - ) or {} + confluence_content = ( + ( + self.get_page_by_id(page_id, expand="body.storage") or {} + ).get("body") or {}).get("storage") or {} confluence_body_content = confluence_content.get("value") if confluence_body_content: # @todo move into utils - confluence_body_content = utils.symbol_normalizer(confluence_body_content) + confluence_body_content = utils.symbol_normalizer( + confluence_body_content + ) - log.debug('Old Content: """{body}"""'.format(body=confluence_body_content)) + log.debug( + 'Old Content: """{body}"""'.format(body=confluence_body_content) + ) log.debug('New Content: """{body}"""'.format(body=body)) if confluence_body_content.strip() == body.strip(): - log.info("Content of {page_id} is exactly the same".format(page_id=page_id)) + log.info( + "Content of {page_id} is exactly the same".format( + page_id=page_id + ) + ) return True else: log.info("Content of {page_id} differs".format(page_id=page_id)) @@ -1512,18 +1693,30 @@ def update_page( """ # update current page params = {"status": "current"} - log.info('Updating {type} "{title}" with {parent_id}'.format(title=title, type=type, parent_id=parent_id)) + log.info( + 'Updating {type} "{title}" with {parent_id}'.format( + title=title, type=type, parent_id=parent_id + ) + ) - if not always_update and body is not None and self.is_page_content_is_already_updated(page_id, body, title): + if ( + not always_update + and body is not None + and self.is_page_content_is_already_updated(page_id, body, title) + ): return self.get_page_by_id(page_id) try: if self.advanced_mode: - version = self.history(page_id).json()["lastUpdated"]["number"] + 1 + version = ( + self.history(page_id).json()["lastUpdated"]["number"] + 1 + ) else: version = self.history(page_id)["lastUpdated"]["number"] + 1 except (IndexError, TypeError) as e: - log.error("Can't find '{title}' {type}!".format(title=title, type=type)) + log.error( + "Can't find '{title}' {type}!".format(title=title, type=type) + ) log.debug(e) return None @@ -1542,10 +1735,18 @@ def update_page( data["version"]["message"] = version_comment if full_width is True: - data["metadata"]["properties"]["content-appearance-draft"] = {"value": "full-width"} - data["metadata"]["properties"]["content-appearance-published"] = {"value": "full-width"} + data["metadata"]["properties"]["content-appearance-draft"] = { + "value": "full-width" + } + data["metadata"]["properties"]["content-appearance-published"] = { + "value": "full-width" + } try: - response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params) + response = self.put( + "rest/api/content/{0}".format(page_id), + data=data, + params=params, + ) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1555,7 +1756,9 @@ def update_page( reason=e, ) if e.response.status_code == 404: - raise ApiNotFoundError("Can not find draft with current content", reason=e) + raise ApiNotFoundError( + "Can not find draft with current content", reason=e + ) raise @@ -1590,15 +1793,27 @@ def _insert_to_existing_page( # update current page params = {"status": "current"} - if self.is_page_content_is_already_updated(page_id, insert_body, title): + if self.is_page_content_is_already_updated( + page_id, insert_body, title + ): return self.get_page_by_id(page_id) else: version = self.history(page_id)["lastUpdated"]["number"] + 1 previous_body = ( - (self.get_page_by_id(page_id, expand="body.storage").get("body") or {}).get("storage").get("value") + ( + self.get_page_by_id(page_id, expand="body.storage").get( + "body" + ) or {} + ) + .get("storage") + .get("value") ) previous_body = previous_body.replace("ó", "ó") - body = insert_body + previous_body if top_of_page else previous_body + insert_body + body = ( + insert_body + previous_body + if top_of_page + else previous_body + insert_body + ) data = { "id": page_id, "type": type, @@ -1613,7 +1828,11 @@ def _insert_to_existing_page( data["version"]["message"] = version_comment try: - response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params) + response = self.put( + "rest/api/content/{0}".format(page_id), + data=data, + params=params, + ) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1623,7 +1842,9 @@ def _insert_to_existing_page( reason=e, ) if e.response.status_code == 404: - raise ApiNotFoundError("Can not find draft with current content", reason=e) + raise ApiNotFoundError( + "Can not find draft with current content", reason=e + ) raise @@ -1726,7 +1947,11 @@ def update_or_create( if self.page_exists(space, title): page_id = self.get_page_id(space, title) - parent_id = parent_id if parent_id is not None else self.get_parent_content_id(page_id) + parent_id = ( + parent_id + if parent_id is not None + else self.get_parent_content_id(page_id) + ) result = self.update_page( parent_id=parent_id, page_id=page_id, @@ -1750,7 +1975,8 @@ def update_or_create( log.info( "You may access your page at: {host}{url}".format( - host=self.url, url=((result or {}).get("_links") or {}).get("tinyui") + host=self.url, + url=((result or {}).get("_links") or {}).get("tinyui"), ) ) return result @@ -1795,7 +2021,8 @@ def set_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " "edit the content with the given id", + "The user does not have permission to " + "edit the content with the given id", reason=e, ) if e.response.status_code == 413: @@ -1814,7 +2041,9 @@ def update_page_property(self, page_id, data): :data: property data in json format :return: """ - url = "rest/api/content/{page_id}/property/{key}".format(page_id=page_id, key=data.get("key")) + url = "rest/api/content/{page_id}/property/{key}".format( + page_id=page_id, key=data.get("key") + ) try: response = self.put(path=url, data=data) except HTTPError as e: @@ -1827,7 +2056,8 @@ def update_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " "edit the content with the given id", + "The user does not have permission to " + "edit the content with the given id", reason=e, ) if e.response.status_code == 404: @@ -1838,7 +2068,8 @@ def update_page_property(self, page_id, data): ) if e.response.status_code == 409: raise ApiConflictError( - "The given version is does not match the expected " "target version of the updated property", + "The given version is does not match the expected " + "target version of the updated property", reason=e, ) if e.response.status_code == 413: @@ -1878,7 +2109,9 @@ def get_page_property(self, page_id, page_property_key): :param page_property_key: key of property :return: """ - url = "rest/api/content/{page_id}/property/{key}".format(page_id=page_id, key=str(page_property_key)) + url = "rest/api/content/{page_id}/property/{key}".format( + page_id=page_id, key=str(page_property_key) + ) try: response = self.get(path=url) except HTTPError as e: @@ -1924,7 +2157,9 @@ def get_page_ancestors(self, page_id): :param page_id: content_id format :return: get properties """ - url = "rest/api/content/{page_id}?expand=ancestors".format(page_id=page_id) + url = "rest/api/content/{page_id}?expand=ancestors".format( + page_id=page_id + ) try: response = self.get(path=url) @@ -1942,7 +2177,9 @@ def get_page_ancestors(self, page_id): def clean_all_caches(self): """Clean all caches from cache management""" headers = self.form_token_headers - return self.delete("rest/cacheManagement/1.0/cacheEntries", headers=headers) + return self.delete( + "rest/cacheManagement/1.0/cacheEntries", headers=headers + ) def clean_package_cache(self, cache_name="com.gliffy.cache.gon"): """Clean caches from cache management @@ -1952,7 +2189,9 @@ def clean_package_cache(self, cache_name="com.gliffy.cache.gon"): """ headers = self.form_token_headers data = {"cacheName": cache_name} - return self.delete("rest/cacheManagement/1.0/cacheEntries", data=data, headers=headers) + return self.delete( + "rest/cacheManagement/1.0/cacheEntries", data=data, headers=headers + ) def get_all_groups(self, start=0, limit=1000): """ @@ -1962,19 +2201,26 @@ def get_all_groups(self, start=0, limit=1000): fixed system limits. Default: 1000 :return: """ - url = "rest/api/group?limit={limit}&start={start}".format(limit=limit, start=start) + url = "rest/api/group?limit={limit}&start={start}".format( + limit=limit, start=start + ) try: response = self.get(url) except HTTPError as e: if e.response.status_code == 403: - raise ApiPermissionError("The calling user does not have permission to view groups", reason=e) + raise ApiPermissionError( + "The calling user does not have permission to view groups", + reason=e, + ) raise return response.get("results") - def get_group_members(self, group_name="confluence-users", start=0, limit=1000, expand=None): + def get_group_members( + self, group_name="confluence-users", start=0, limit=1000, expand=None + ): """ Get a paginated collection of users in the given group :param group_name @@ -1992,7 +2238,10 @@ def get_group_members(self, group_name="confluence-users", start=0, limit=1000, response = self.get(url) except HTTPError as e: if e.response.status_code == 403: - raise ApiPermissionError("The calling user does not have permission to view users", reason=e) + raise ApiPermissionError( + "The calling user does not have permission to view users", + reason=e, + ) raise @@ -2010,17 +2259,28 @@ def get_all_members(self, group_name="confluence-users", expand=None): step = 0 members = [] while flag: - values = self.get_group_members(group_name=group_name, start=len(members), limit=limit, expand=expand) + values = self.get_group_members( + group_name=group_name, + start=len(members), + limit=limit, + expand=expand, + ) step += 1 if len(values) == 0: flag = False else: members.extend(values) if not members: - print("Did not get members from {} group, please check permissions or connectivity".format(group_name)) + print( + "Did not get members from {} group, please check permissions or connectivity".format( + group_name + ) + ) return members - def get_space(self, space_key, expand="description.plain,homepage", params=None): + def get_space( + self, space_key, expand="description.plain,homepage", params=None + ): """ Get information about a space through space key :param space_key: The unique space key name @@ -2071,7 +2331,9 @@ def get_space_content( """ content_type = "{}".format("/" + content_type if content_type else "") - url = "rest/api/space/{space_key}/content{content_type}".format(space_key=space_key, content_type=content_type) + url = "rest/api/space/{space_key}/content{content_type}".format( + space_key=space_key, content_type=content_type + ) params = { "depth": depth, "start": start, @@ -2171,7 +2433,10 @@ def get_user_details_by_username(self, username, expand=None): response = self.get(url, params=params) except HTTPError as e: if e.response.status_code == 403: - raise ApiPermissionError("The calling user does not have permission to view users", reason=e) + raise ApiPermissionError( + "The calling user does not have permission to view users", + reason=e, + ) if e.response.status_code == 404: raise ApiNotFoundError( "The user with the given username or userkey does not exist", @@ -2199,11 +2464,13 @@ def get_user_details_by_accountid(self, accountid, expand=None): response = self.get(url, params=params) except HTTPError as e: if e.response.status_code == 403: - raise ApiPermissionError("The calling user does not have permission to view users", reason=e) + raise ApiPermissionError( + "The calling user does not have permission to view users", + reason=e, + ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given account does not exist", - reason=e, + "The user with the given account does not exist", reason=e, ) raise @@ -2227,7 +2494,10 @@ def get_user_details_by_userkey(self, userkey, expand=None): response = self.get(url, params=params) except HTTPError as e: if e.response.status_code == 403: - raise ApiPermissionError("The calling user does not have permission to view users", reason=e) + raise ApiPermissionError( + "The calling user does not have permission to view users", + reason=e, + ) if e.response.status_code == 404: raise ApiNotFoundError( "The user with the given username or userkey does not exist", @@ -2293,7 +2563,9 @@ def get_page_as_pdf(self, page_id): :return: PDF File """ headers = self.form_token_headers - url = "spaces/flyingpdf/pdfpageexport.action?pageId={pageId}".format(pageId=page_id) + url = "spaces/flyingpdf/pdfpageexport.action?pageId={pageId}".format( + pageId=page_id + ) if self.api_version == "cloud": url = self.get_pdf_download_url_for_confluence_cloud(url) @@ -2327,7 +2599,9 @@ def get_descendant_page_id(self, space, parent_id, title): """ page_id = "" - url = 'rest/api/content/search?cql=parent={}%20AND%20space="{}"'.format(parent_id, space) + url = 'rest/api/content/search?cql=parent={}%20AND%20space="{}"'.format( + parent_id, space + ) try: response = self.get(url, {}) @@ -2432,7 +2706,9 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) + url = "rest/plugins/1.0/{plugin_key}-key/license".format( + plugin_key=plugin_key + ) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -2462,7 +2738,9 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request(method="GET", path=url, headers=self.safe_mode_headers) + return self.request( + method="GET", path=url, headers=self.safe_mode_headers + ) def update_plugin_license(self, plugin_key, raw_license): """ @@ -2479,7 +2757,6 @@ def update_plugin_license(self, plugin_key, raw_license): data = {"rawLicense": raw_license} return self.put(url, data=data, headers=app_headers) - def check_long_tasks_result(self, start=None, limit=None, expand=None): """ Get result of long tasks @@ -2510,12 +2787,15 @@ def check_long_task_result(self, task_id, expand=None): params = {"expand": expand} try: - response = self.get("rest/api/longtask/{}".format(task_id), params=params) + response = self.get( + "rest/api/longtask/{}".format(task_id), params=params + ) except HTTPError as e: if e.response.status_code == 404: # Raise ApiError as the documented reason is ambiguous raise ApiError( - "There is no task with the given key, " "or the calling user does not have permission to view it", + "There is no task with the given key, " + "or the calling user does not have permission to view it", reason=e, ) @@ -2539,15 +2819,25 @@ def get_pdf_download_url_for_confluence_cloud(self, url): headers = self.form_token_headers log.info("Initiate PDF export from Confluence Cloud") response = self.get(url, headers=headers, not_json_response=True) - response_string = response.decode(encoding="utf-8", errors="strict") - task_id = response_string.split('name="ajs-taskId" content="')[1].split('">')[0] + response_string = response.decode( + encoding="utf-8", errors="strict" + ) + task_id = response_string.split('name="ajs-taskId" content="')[ + 1 + ].split('">')[0] poll_url = "runningtaskxml.action?taskId={0}".format(task_id) while long_running_task: - long_running_task_response = self.get(poll_url, headers=headers, not_json_response=True) + long_running_task_response = self.get( + poll_url, headers=headers, not_json_response=True + ) long_running_task_response_parts = long_running_task_response.decode( encoding="utf-8", errors="strict" - ).split("\n") - percentage_complete = long_running_task_response_parts[6].strip() + ).split( + "\n" + ) + percentage_complete = long_running_task_response_parts[ + 6 + ].strip() is_successful = long_running_task_response_parts[7].strip() is_complete = long_running_task_response_parts[8].strip() log.info("Sleep for 5s.") @@ -2559,7 +2849,9 @@ def get_pdf_download_url_for_confluence_cloud(self, url): log.info("Downloading content...") log.debug("Extract taskId and download PDF.") current_status = long_running_task_response_parts[3] - download_url = current_status.split("href="/wiki/")[1].split(""")[0] + download_url = current_status.split( + "href="/wiki/" + )[1].split(""")[0] long_running_task = False elif is_successful == "false": log.error("PDF conversion not successful.") @@ -2572,7 +2864,14 @@ def get_pdf_download_url_for_confluence_cloud(self, url): return download_url - def audit(self, start_date=None, end_date=None, start=None, limit=None, search_string=None): + def audit( + self, + start_date=None, + end_date=None, + start=None, + limit=None, + search_string=None, + ): """ Fetch a paginated list of AuditRecord instances dating back to a certain time :param start_date: @@ -2602,7 +2901,9 @@ def audit(self, start_date=None, end_date=None, start=None, limit=None, search_s ############################################################################################## """ - def team_calendars_get_sub_calendars(self, include=None, viewing_space_key=None, calendar_context=None): + def team_calendars_get_sub_calendars( + self, include=None, viewing_space_key=None, calendar_context=None + ): """ Get subscribed calendars :param include: @@ -2621,13 +2922,17 @@ def team_calendars_get_sub_calendars(self, include=None, viewing_space_key=None, return self.get(url, params=params) def team_calendars_get_sub_calendars_watching_status(self, include=None): - url = "rest/calendar-services/1.0/calendar/subcalendars/watching/status" + url = ( + "rest/calendar-services/1.0/calendar/subcalendars/watching/status" + ) params = {} if include: params["include"] = include return self.get(url, params=params) - def team_calendar_events(self, sub_calendar_id, start, end, user_time_zone_id=None): + def team_calendar_events( + self, sub_calendar_id, start, end, user_time_zone_id=None + ): """ Get calendar event status :param sub_calendar_id: @@ -2681,7 +2986,11 @@ def add_user(self, email, fullname, username, password): """ params = {"email": email, "fullname": fullname, "name": username} url = "rpc/json-rpc/confluenceservice-v2" - data = {"jsonrpc": "2.0", "method": "addUser", "params": [params, password]} + data = { + "jsonrpc": "2.0", + "method": "addUser", + "params": [params, password], + } self.post(url, data=data) def add_user_to_group(self, username, group_name): @@ -2697,7 +3006,14 @@ def add_user_to_group(self, username, group_name): data = {"name": username} return self.post(url, params=params, data=data) - def add_space_permissions(self, space_key, subject_type, subject_id, operation_key, operation_target): + def add_space_permissions( + self, + space_key, + subject_type, + subject_id, + operation_key, + operation_target, + ): """ Add permissions to a space @@ -2756,7 +3072,9 @@ def set_inline_tasks_checkbox(self, page_id, task_id, status): status is CHECKED or UNCHECKED :return: """ - url = "rest/inlinetasks/1/task/{page_id}/{task_id}/".format(page_id=page_id, task_id=task_id) + url = "rest/inlinetasks/1/task/{page_id}/{task_id}/".format( + page_id=page_id, task_id=task_id + ) data = {"status": status, "trigger": "VIEW_PAGE"} return self.post(url, json=data) diff --git a/atlassian/crowd.py b/atlassian/crowd.py index fd03c0113..33ae1d5cd 100644 --- a/atlassian/crowd.py +++ b/atlassian/crowd.py @@ -11,8 +11,18 @@ class Crowd(AtlassianRestAPI): Important to note that you will have to use an application credentials, not user credentials, in order to access Crowd APIs""" - def __init__(self, url, username, password, timeout=60, api_root="rest", api_version="latest"): - super(Crowd, self).__init__(url, username, password, timeout, api_root, api_version) + def __init__( + self, + url, + username, + password, + timeout=60, + api_root="rest", + api_version="latest", + ): + super(Crowd, self).__init__( + url, username, password, timeout, api_root, api_version + ) def _crowd_api_url(self, api, resource): return "/{api_root}/{api}/{version}/{resource}".format( @@ -44,11 +54,17 @@ def _user_change_status(self, username, active): params = {"username": username} - return self.put(self._crowd_api_url("usermanagement", "user"), params=params, data=user_object) + return self.put( + self._crowd_api_url("usermanagement", "user"), + params=params, + data=user_object, + ) def user(self, username): params = {"username": username} - return self.get(self._crowd_api_url("usermanagement", "user"), params=params) + return self.get( + self._crowd_api_url("usermanagement", "user"), params=params + ) def user_activate(self, username): """ @@ -57,7 +73,16 @@ def user_activate(self, username): return self._user_change_status(username, True) - def user_create(self, username, active, first_name, last_name, display_name, email, password): + def user_create( + self, + username, + active, + first_name, + last_name, + display_name, + email, + password, + ): """ Create new user method :param active: bool: @@ -81,7 +106,9 @@ def user_create(self, username, active, first_name, last_name, display_name, ema "email": email, } - return self.post(self._crowd_api_url("usermanagement", "user"), data=user_object) + return self.post( + self._crowd_api_url("usermanagement", "user"), data=user_object + ) def user_deactivate(self, username): """ @@ -101,7 +128,9 @@ def user_delete(self, username): params = {"username": username} - return self.delete(self._crowd_api_url("usermanagement", "user"), params=params) + return self.delete( + self._crowd_api_url("usermanagement", "user"), params=params + ) def group_add_user(self, username, groupname): """ @@ -113,7 +142,11 @@ def group_add_user(self, username, groupname): params = {"username": username} - return self.post(self._crowd_api_url("usermanagement", "user/group/direct"), params=params, json=data) + return self.post( + self._crowd_api_url("usermanagement", "user/group/direct"), + params=params, + json=data, + ) def group_nested_members(self, group): params = {"groupname": group} @@ -153,7 +186,9 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) + url = "rest/plugins/1.0/{plugin_key}-key/license".format( + plugin_key=plugin_key + ) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -183,7 +218,9 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request(method="GET", path=url, headers=self.safe_mode_headers) + return self.request( + method="GET", path=url, headers=self.safe_mode_headers + ) def update_plugin_license(self, plugin_key, raw_license): """ @@ -199,4 +236,3 @@ def update_plugin_license(self, plugin_key, raw_license): url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key) data = {"rawLicense": raw_license} return self.put(url, data=data, headers=app_headers) - diff --git a/atlassian/insight.py b/atlassian/insight.py index 978b1d848..521be2d28 100644 --- a/atlassian/insight.py +++ b/atlassian/insight.py @@ -37,7 +37,9 @@ def __cloud_init(self, *args, **kwargs): del kwargs["cloud"] temp = Insight(*args, **kwargs) # retrieve cloud workspace id and generate the api_root - kwargs["api_root"] = "/jsm/insight/workspace/{}/v1/".format(temp.__get_workspace_id()) + kwargs["api_root"] = "/jsm/insight/workspace/{}/v1/".format( + temp.__get_workspace_id() + ) # insight cloud uses the atlassian base url, not custom instnace urls kwargs["url"] = "https://api.atlassian.com" # set cloud back to true and return @@ -47,9 +49,10 @@ def __cloud_init(self, *args, **kwargs): return args, kwargs def __get_workspace_id(self): - return self.get("rest/servicedeskapi/insight/workspace", headers=self.default_headers,)["values"][ - 0 - ]["workspaceId"] + return self.get( + "rest/servicedeskapi/insight/workspace", + headers=self.default_headers, + )["values"][0]["workspaceId"] # Attachments def get_attachments_of_objects(self, object_id): @@ -84,7 +87,10 @@ def get_attachments_of_objects(self, object_id): """ if self.cloud: raise NotImplementedError - url = self.url_joiner(self.api_root, "attachments/object/{objectId}".format(objectId=object_id)) + url = self.url_joiner( + self.api_root, + "attachments/object/{objectId}".format(objectId=object_id), + ) return self.get(url) def upload_attachment_to_object(self, object_id, filename): @@ -96,7 +102,9 @@ def upload_attachment_to_object(self, object_id, filename): if self.cloud: raise NotImplementedError log.warning("Adding attachment...") - url = "rest/insight/1.0/attachments/object/{objectId}".format(objectId=object_id) + url = "rest/insight/1.0/attachments/object/{objectId}".format( + objectId=object_id + ) with open(filename, "rb") as attachment: files = {"file": attachment} return self.post(url, headers=self.no_check_headers, files=files) @@ -109,7 +117,9 @@ def delete_attachment(self, attachment_id): if self.cloud: raise NotImplementedError log.warning("Adding attachment...") - url = "rest/insight/1.0/attachments/{attachmentId}".format(attachmentId=attachment_id) + url = "rest/insight/1.0/attachments/{attachmentId}".format( + attachmentId=attachment_id + ) return self.delete(url) # Comments @@ -161,7 +171,9 @@ def get_comment_of_object(self, object_id): """ if self.cloud: raise NotImplementedError - url = "rest/insight/1.0/comment/object/{objectId}".format(objectId=object_id) + url = "rest/insight/1.0/comment/object/{objectId}".format( + objectId=object_id + ) return self.get(url) # Icon @@ -200,7 +212,10 @@ def start_import_configuration(self, import_id): :param import_id: :return: """ - url = self.url_joiner(self.api_root, "import/start/{import_id}".format(import_id=import_id)) + url = self.url_joiner( + self.api_root, + "import/start/{import_id}".format(import_id=import_id), + ) return self.post(url) # Index @@ -281,10 +296,19 @@ def get_object(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}".format(id=object_id) + ) return self.get(url) - def update_object(self, object_id, object_type_id, attributes, has_avatar=False, avatar_uuid=""): + def update_object( + self, + object_id, + object_type_id, + attributes, + has_avatar=False, + avatar_uuid="", + ): """ Update an existing object in Insight @@ -301,7 +325,9 @@ def update_object(self, object_id, object_type_id, attributes, has_avatar=False, "avatarUUID": avatar_uuid, "hasAvatar": has_avatar, } - url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}".format(id=object_id) + ) return self.put(url, data=body) def delete_object(self, object_id): @@ -311,7 +337,9 @@ def delete_object(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}".format(id=object_id) + ) return self.delete(url) def get_object_attributes(self, object_id): @@ -321,7 +349,9 @@ def get_object_attributes(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "object/{id}/attributes".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}/attributes".format(id=object_id) + ) return self.get(url) def get_object_history(self, object_id, asc=False, abbreviate=True): @@ -334,7 +364,9 @@ def get_object_history(self, object_id, asc=False, abbreviate=True): :return: """ params = {"asc": asc, "abbreviate": abbreviate} - url = self.url_joiner(self.api_root, "object/{id}/history".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}/history".format(id=object_id) + ) return self.get(url, params=params) @deprecated(version="3.29.0", reason="Use get_object_reference_info()") @@ -350,10 +382,14 @@ def get_object_reference_info(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "object/{id}/referenceinfo".format(id=object_id)) + url = self.url_joiner( + self.api_root, "object/{id}/referenceinfo".format(id=object_id) + ) return self.get(url) - def create_object(self, object_type_id, attributes, has_avatar=False, avatar_uuid=""): + def create_object( + self, object_type_id, attributes, has_avatar=False, avatar_uuid="" + ): """ Create a new object in Insight @@ -429,7 +465,10 @@ def get_object_connected_tickets(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "objectconnectedtickets/{id}/tickets".format(id=object_id)) + url = self.url_joiner( + self.api_root, + "objectconnectedtickets/{id}/tickets".format(id=object_id), + ) return self.get(url) # Object schema @@ -471,7 +510,9 @@ def get_object_schema(self, schema_id): Find a schema by id :param schema_id: """ - url = self.url_joiner(self.api_root, "objectschema/{id}".format(id=schema_id)) + url = self.url_joiner( + self.api_root, "objectschema/{id}".format(id=schema_id) + ) return self.get(url) def update_object_schema(self, schema_id): @@ -526,7 +567,13 @@ def get_object_type_attributes( kwargs = locals().items() params = dict() - params.update({k: v for k, v in kwargs if v is not None and k not in ["self", "type_id"]}) + params.update( + { + k: v + for k, v in kwargs + if v is not None and k not in ["self", "type_id"] + } + ) return self.get( "{0}objecttype/{1}/attributes".format(self.api_root, type_id), diff --git a/atlassian/jira.py b/atlassian/jira.py index 8c448c572..e50eeddde 100644 --- a/atlassian/jira.py +++ b/atlassian/jira.py @@ -23,7 +23,14 @@ def __init__(self, url, *args, **kwargs): super(Jira, self).__init__(url, *args, **kwargs) - def get_permissions(self, permissions, project_id=None, project_key=None, issue_id=None, issue_key=None): + def get_permissions( + self, + permissions, + project_id=None, + project_key=None, + issue_id=None, + issue_key=None, + ): """ Returns a list of permissions indicating which permissions the user has. Details of the user's permissions can be obtained in a global, project, issue or comment context. @@ -114,7 +121,9 @@ def set_property(self, property_id, value): :return: """ base_url = self.resource_url("application-properties") - url = "{base_url}/{property_id}".format(base_url=base_url, property_id=property_id) + url = "{base_url}/{property_id}".format( + base_url=base_url, property_id=property_id + ) data = {"id": property_id, "value": value} return self.put(url, data=data) @@ -148,7 +157,9 @@ def get_application_role(self, role_key): :return: """ base_url = self.resource_url("applicationrole") - url = "{base_url}/{role_key}".format(base_url=base_url, role_key=role_key) + url = "{base_url}/{role_key}".format( + base_url=base_url, role_key=role_key + ) return self.get(url) or {} """ @@ -163,7 +174,9 @@ def get_attachment(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) + url = "{base_url}/{attachment_id}".format( + base_url=base_url, attachment_id=attachment_id + ) return self.get(url) def get_attachment_content(self, attachment_id): @@ -173,7 +186,9 @@ def get_attachment_content(self, attachment_id): :return: json """ base_url = self.resource_url("attachment") - url = "{base_url}/content/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) + url = "{base_url}/content/{attachment_id}".format( + base_url=base_url, attachment_id=attachment_id + ) return self.get(url) def remove_attachment(self, attachment_id): @@ -183,7 +198,9 @@ def remove_attachment(self, attachment_id): :return: if success, return None """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) + url = "{base_url}/{attachment_id}".format( + base_url=base_url, attachment_id=attachment_id + ) return self.delete(url) def get_attachment_meta(self): @@ -202,7 +219,9 @@ def get_attachment_expand_human(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}/expand/human".format(base_url=base_url, attachment_id=attachment_id) + url = "{base_url}/{attachment_id}/expand/human".format( + base_url=base_url, attachment_id=attachment_id + ) return self.get(url) def get_attachment_expand_raw(self, attachment_id): @@ -212,7 +231,9 @@ def get_attachment_expand_raw(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}/expand/raw".format(base_url=base_url, attachment_id=attachment_id) + url = "{base_url}/{attachment_id}/expand/raw".format( + base_url=base_url, attachment_id=attachment_id + ) return self.get(url) """ @@ -220,7 +241,14 @@ def get_attachment_expand_raw(self, attachment_id): Reference: https://docs.atlassian.com/software/jira/docs/api/REST/8.5.0/#api/2/auditing """ - def get_audit_records(self, offset=None, limit=None, filter=None, from_date=None, to_date=None): + def get_audit_records( + self, + offset=None, + limit=None, + filter=None, + from_date=None, + to_date=None, + ): """ Returns auditing records filtered using provided parameters :param offset: the number of record from which search starts @@ -272,7 +300,9 @@ def get_all_system_avatars(self, avatar_type="user"): A map is returned to be consistent with the shape of the project/KEY/avatars REST end point. """ base_url = self.resource_url("avatar") - url = "{base_url}/{type}/system".format(base_url=base_url, type=avatar_type) + url = "{base_url}/{type}/system".format( + base_url=base_url, type=avatar_type + ) return self.get(url) """ @@ -301,7 +331,9 @@ def set_node_to_offline(self, node_id): :return: """ base_url = self.resource_url("cluster/node") - url = "{base_url}/{node_id}/offline".format(base_url=base_url, node_id=node_id) + url = "{base_url}/{node_id}/offline".format( + base_url=base_url, node_id=node_id + ) return self.put(url) def get_cluster_alive_nodes(self): @@ -341,7 +373,9 @@ def check_support_zip_status(self, cluster_task_id): :param cluster_task_id: str :return: """ - url = "/rest/troubleshooting/latest/support-zip/status/cluster/{}".format(cluster_task_id) + url = "/rest/troubleshooting/latest/support-zip/status/cluster/{}".format( + cluster_task_id + ) return self.get(url) def download_support_zip(self, file_name): @@ -350,7 +384,9 @@ def download_support_zip(self, file_name): :param file_name: str :return: bytes of zip file """ - url = "/rest/troubleshooting/latest/support-zip/download/{}".format(file_name) + url = "/rest/troubleshooting/latest/support-zip/download/{}".format( + file_name + ) return self.get(url, advanced_mode=True).content """ @@ -371,7 +407,9 @@ def issue_get_comments(self, issue_id): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id}/comment".format(base_url=base_url, issue_id=issue_id) + url = "{base_url}/{issue_id}/comment".format( + base_url=base_url, issue_id=issue_id + ) return self.get(url) def issues_get_comments_by_id(self, *args): @@ -382,7 +420,9 @@ def issues_get_comments_by_id(self, *args): :return: """ if not all([isinstance(i, int) for i in args]): - raise TypeError("Arguments to `issues_get_comments_by_id` must be int") + raise TypeError( + "Arguments to `issues_get_comments_by_id` must be int" + ) data = {"ids": list(args)} base_url = self.resource_url("comment") url = "{base_url}/list".format(base_url=base_url) @@ -414,7 +454,9 @@ def get_comment_properties_keys(self, comment_id): :return: """ base_url = self.resource_url("comment") - url = "{base_url}/{commentId}/properties".format(base_url=base_url, commentId=comment_id) + url = "{base_url}/{commentId}/properties".format( + base_url=base_url, commentId=comment_id + ) return self.get(url) def get_comment_property(self, comment_id, property_key): @@ -465,7 +507,11 @@ def delete_comment_property(self, comment_id, property_key): def component(self, component_id): base_url = self.resource_url("component") - return self.get("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id)) + return self.get( + "{base_url}/{component_id}".format( + base_url=base_url, component_id=component_id + ) + ) def get_component_related_issues(self, component_id): """ @@ -474,24 +520,41 @@ def get_component_related_issues(self, component_id): :return: """ base_url = self.resource_url("component") - url = "{base_url}/{component_id}/relatedIssueCounts".format(base_url=base_url, component_id=component_id) + url = "{base_url}/{component_id}/relatedIssueCounts".format( + base_url=base_url, component_id=component_id + ) return self.get(url) def create_component(self, component): - log.warning('Creating component "{name}"'.format(name=component["name"])) + log.warning( + 'Creating component "{name}"'.format(name=component["name"]) + ) base_url = self.resource_url("component") url = "{base_url}/".format(base_url=base_url) return self.post(url, data=component) def delete_component(self, component_id): - log.warning('Deleting component "{component_id}"'.format(component_id=component_id)) + log.warning( + 'Deleting component "{component_id}"'.format( + component_id=component_id + ) + ) base_url = self.resource_url("component") - return self.delete("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id)) + return self.delete( + "{base_url}/{component_id}".format( + base_url=base_url, component_id=component_id + ) + ) def update_component_lead(self, component_id, lead): data = {"id": component_id, "leadUserName": lead} base_url = self.resource_url("component") - return self.put("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id), data=data) + return self.put( + "{base_url}/{component_id}".format( + base_url=base_url, component_id=component_id + ), + data=data, + ) """ Configurations of Jira @@ -550,7 +613,9 @@ def get_all_fields(self): url = self.resource_url("field") return self.get(url) - def create_custom_field(self, name, type, search_key=None, description=None): + def create_custom_field( + self, name, type, search_key=None, description=None + ): """ Creates a custom field with the given name and type :param name: str @@ -617,7 +682,9 @@ def create_filter(self, name, jql, description=None, favourite=False): url = self.resource_url("filter") return self.post(url, data=data) - def edit_filter(self, filter_id, name, jql=None, description=None, favourite=None): + def edit_filter( + self, filter_id, name, jql=None, description=None, favourite=None + ): """ Updates an existing filter. :param filter_id: Filter Id @@ -681,7 +748,9 @@ def get_filter_share_permissions(self, filter_id): :return: Returns current share permissions of filter """ base_url = self.resource_url("filter") - url = "{base_url}/{id}/permission".format(base_url=base_url, id=filter_id) + url = "{base_url}/{id}/permission".format( + base_url=base_url, id=filter_id + ) return self.get(url) def add_filter_share_permission( @@ -708,7 +777,9 @@ def add_filter_share_permission( :return: Returns updated share permissions """ base_url = self.resource_url("filter") - url = "{base_url}/{id}/permission".format(base_url=base_url, id=filter_id) + url = "{base_url}/{id}/permission".format( + base_url=base_url, id=filter_id + ) data = {"type": type} if project_id: data["projectId"] = project_id @@ -800,7 +871,9 @@ def remove_group(self, name, swap_group=None): return self.delete(url, params=params) - def get_all_users_from_group(self, group, include_inactive_users=False, start=0, limit=50): + def get_all_users_from_group( + self, group, include_inactive_users=False, start=0, limit=50 + ): """ Just wrapping method user group members :param group: @@ -819,7 +892,9 @@ def get_all_users_from_group(self, group, include_inactive_users=False, start=0, params["maxResults"] = limit return self.get(url, params=params) - def add_user_to_group(self, username=None, group_name=None, account_id=None): + def add_user_to_group( + self, username=None, group_name=None, account_id=None + ): """ Add given user to a group @@ -842,7 +917,9 @@ def add_user_to_group(self, username=None, group_name=None, account_id=None): data = {"name": username} return self.post(url, params=params, data=data) - def remove_user_from_group(self, username=None, group_name=None, account_id=None): + def remove_user_from_group( + self, username=None, group_name=None, account_id=None + ): """ Remove given user from a group @@ -902,13 +979,21 @@ def get_users_with_browse_permission_to_a_project( def issue(self, key, fields="*all", expand=None): base_url = self.resource_url("issue") - url = "{base_url}/{key}?fields={fields}".format(base_url=base_url, key=key, fields=fields) + url = "{base_url}/{key}?fields={fields}".format( + base_url=base_url, key=key, fields=fields + ) params = {} if expand: params["expand"] = expand return self.get(url, params=params) - def get_issue(self, issue_id_or_key, fields=None, properties=None, update_history=True): + def get_issue( + self, + issue_id_or_key, + fields=None, + properties=None, + update_history=True, + ): """ Returns a full representation of the issue for the given issue key By default, all fields are returned in this get-issue resource @@ -920,7 +1005,9 @@ def get_issue(self, issue_id_or_key, fields=None, properties=None, update_histor :return: issue """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) + url = "{base_url}/{issue_id_or_key}".format( + base_url=base_url, issue_id_or_key=issue_id_or_key + ) params = {} if fields is not None: @@ -948,8 +1035,12 @@ def epic_issues(self, epic, fields="*all", expand=None): :returns: Issues within the epic :rtype: list """ - base_url = self.resource_url("epic", api_root="rest/agile", api_version="1.0") - url = "{base_url}/{key}/issue?fields={fields}".format(base_url=base_url, key=epic, fields=fields) + base_url = self.resource_url( + "epic", api_root="rest/agile", api_version="1.0" + ) + url = "{base_url}/{key}/issue?fields={fields}".format( + base_url=base_url, key=epic, fields=fields + ) params = {} if expand: params["expand"] = expand @@ -993,15 +1084,21 @@ def issue_createmeta(self, project, expand="projects.issuetypes.fields"): params = {} if expand: params["expand"] = expand - url = self.resource_url("issue/createmeta?projectKeys={}".format(project)) + url = self.resource_url( + "issue/createmeta?projectKeys={}".format(project) + ) return self.get(url, params=params) def issue_createmeta_issuetypes(self, project): - url = self.resource_url("issue/createmeta/{}/issuetypes".format(project)) + url = self.resource_url( + "issue/createmeta/{}/issuetypes".format(project) + ) return self.get(url) def issue_createmeta_fieldtypes(self, project, issue_type_id): - url = self.resource_url("issue/createmeta/{}/issuetypes/{}".format(project, issue_type_id)) + url = self.resource_url( + "issue/createmeta/{}/issuetypes/{}".format(project, issue_type_id) + ) return self.get(url) def issue_editmeta(self, key): @@ -1016,7 +1113,9 @@ def get_issue_changelog(self, issue_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?expand=changelog".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}?expand=changelog".format( + base_url=base_url, issue_key=issue_key + ) return (self.get(url) or {}).get("changelog") def issue_add_json_worklog(self, key, worklog): @@ -1051,7 +1150,9 @@ def issue_get_worklog(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/worklog".format(base_url=base_url, issueIdOrKey=issue_id_or_key) + url = "{base_url}/{issueIdOrKey}/worklog".format( + base_url=base_url, issueIdOrKey=issue_id_or_key + ) return self.get(url) @@ -1062,7 +1163,9 @@ def issue_archive(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/archive".format(base_url=base_url, issueIdOrKey=issue_id_or_key) + url = "{base_url}/{issueIdOrKey}/archive".format( + base_url=base_url, issueIdOrKey=issue_id_or_key + ) return self.put(url) def issue_restore(self, issue_id_or_key): @@ -1072,12 +1175,18 @@ def issue_restore(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/restore".format(base_url=base_url, issueIdOrKey=issue_id_or_key) + url = "{base_url}/{issueIdOrKey}/restore".format( + base_url=base_url, issueIdOrKey=issue_id_or_key + ) return self.put(url) def issue_field_value(self, key, field): base_url = self.resource_url("issue") - issue = self.get("{base_url}/{key}?fields={field}".format(base_url=base_url, key=key, field=field)) + issue = self.get( + "{base_url}/{key}?fields={field}".format( + base_url=base_url, key=key, field=field + ) + ) return issue["fields"][field] def issue_fields(self, key): @@ -1087,7 +1196,10 @@ def issue_fields(self, key): def update_issue_field(self, key, fields="*all"): base_url = self.resource_url("issue") - return self.put("{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields}) + return self.put( + "{base_url}/{key}".format(base_url=base_url, key=key), + data={"fields": fields}, + ) def bulk_update_issue_field(self, key_list, fields="*all"): """ @@ -1098,7 +1210,10 @@ def bulk_update_issue_field(self, key_list, fields="*all"): base_url = self.resource_url("issue") try: for key in key_list: - self.put("{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields}) + self.put( + "{base_url}/{key}".format(base_url=base_url, key=key), + data={"fields": fields}, + ) except Exception as e: log.error(e) return False @@ -1111,7 +1226,9 @@ def get_issue_labels(self, issue_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=labels".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}?fields=labels".format( + base_url=base_url, issue_key=issue_key + ) if self.advanced_mode: return self.get(url) return (self.get(url) or {}).get("fields").get("labels") @@ -1124,7 +1241,9 @@ def add_attachment(self, issue_key, filename): """ log.warning("Adding attachment...") base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/attachments".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}/attachments".format( + base_url=base_url, issue_key=issue_key + ) with open(filename, "rb") as attachment: files = {"file": attachment} return self.post(url, headers=self.no_check_headers, files=files) @@ -1135,7 +1254,11 @@ def issue_exists(self, issue_key): try: resp = self.issue(issue_key, fields="*none") if resp.status_code == 404: - log.info('Issue "{issue_key}" does not exists'.format(issue_key=issue_key)) + log.info( + 'Issue "{issue_key}" does not exists'.format( + issue_key=issue_key + ) + ) return False resp.raise_for_status() log.info('Issue "{issue_key}" exists'.format(issue_key=issue_key)) @@ -1146,9 +1269,15 @@ def issue_exists(self, issue_key): def issue_deleted(self, issue_key): exists = self.issue_exists(issue_key) if exists: - log.info('Issue "{issue_key}" is not deleted'.format(issue_key=issue_key)) + log.info( + 'Issue "{issue_key}" is not deleted'.format( + issue_key=issue_key + ) + ) else: - log.info('Issue "{issue_key}" is deleted'.format(issue_key=issue_key)) + log.info( + 'Issue "{issue_key}" is deleted'.format(issue_key=issue_key) + ) return not exists def delete_issue(self, issue_id_or_key, delete_subtasks=True): @@ -1161,7 +1290,9 @@ def delete_issue(self, issue_id_or_key, delete_subtasks=True): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) + url = "{base_url}/{issue_id_or_key}".format( + base_url=base_url, issue_id_or_key=issue_id_or_key + ) params = {} if delete_subtasks is True: @@ -1175,9 +1306,15 @@ def delete_issue(self, issue_id_or_key, delete_subtasks=True): # @todo merge with edit_issue method def issue_update(self, issue_key, fields): - log.warning('Updating issue "{issue_key}" with "{fields}"'.format(issue_key=issue_key, fields=fields)) + log.warning( + 'Updating issue "{issue_key}" with "{fields}"'.format( + issue_key=issue_key, fields=fields + ) + ) base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}".format( + base_url=base_url, issue_key=issue_key + ) return self.put(url, data={"fields": fields}) def edit_issue(self, issue_id_or_key, fields, notify_users=True): @@ -1192,7 +1329,9 @@ def edit_issue(self, issue_id_or_key, fields, notify_users=True): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) + url = "{base_url}/{issue_id_or_key}".format( + base_url=base_url, issue_id_or_key=issue_id_or_key + ) params = {} data = {"update": fields} @@ -1209,11 +1348,17 @@ def issue_add_watcher(self, issue_key, user): :param user: :return: """ - log.warning('Adding user {user} to "{issue_key}" watchers'.format(issue_key=issue_key, user=user)) + log.warning( + 'Adding user {user} to "{issue_key}" watchers'.format( + issue_key=issue_key, user=user + ) + ) data = user base_url = self.resource_url("issue") return self.post( - "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), + "{base_url}/{issue_key}/watchers".format( + base_url=base_url, issue_key=issue_key + ), data=data, ) @@ -1224,11 +1369,17 @@ def issue_delete_watcher(self, issue_key, user): :param user: :return: """ - log.warning('Deleting user {user} from "{issue_key}" watchers'.format(issue_key=issue_key, user=user)) + log.warning( + 'Deleting user {user} from "{issue_key}" watchers'.format( + issue_key=issue_key, user=user + ) + ) params = {"username": user} base_url = self.resource_url("issue") return self.delete( - "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), + "{base_url}/{issue_key}/watchers".format( + base_url=base_url, issue_key=issue_key + ), params=params, ) @@ -1239,7 +1390,11 @@ def issue_get_watchers(self, issue_key): :return: List of watchers for issue """ base_url = self.resource_url("issue") - return self.get("{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key)) + return self.get( + "{base_url}/{issue_key}/watchers".format( + base_url=base_url, issue_key=issue_key + ) + ) def assign_issue(self, issue, account_id=None): """Assign an issue to a user. None will set it to unassigned. -1 will set it to Automatic. @@ -1251,7 +1406,9 @@ def assign_issue(self, issue, account_id=None): :rtype: bool """ base_url = self.resource_url("issue") - url = "{base_url}/{issue}/assignee".format(base_url=base_url, issue=issue) + url = "{base_url}/{issue}/assignee".format( + base_url=base_url, issue=issue + ) if self.cloud: data = {"accountId": account_id} else: @@ -1310,7 +1467,9 @@ def create_issues(self, list_of_issues_data): # @todo refactor and merge with create_issue method def issue_create(self, fields): - log.warning('Creating issue "{summary}"'.format(summary=fields["summary"])) + log.warning( + 'Creating issue "{summary}"'.format(summary=fields["summary"]) + ) url = self.resource_url("issue") return self.post(url, data={"fields": fields}) @@ -1318,15 +1477,25 @@ def issue_create_or_update(self, fields): issue_key = fields.get("issuekey", None) if not issue_key or not self.issue_exists(issue_key): - log.info("IssueKey is not provided or does not exists in destination. Will attempt to create an issue") + log.info( + "IssueKey is not provided or does not exists in destination. Will attempt to create an issue" + ) fields.pop("issuekey", None) return self.issue_create(fields) if self.issue_deleted(issue_key): - log.warning('Issue "{issue_key}" deleted, skipping'.format(issue_key=issue_key)) + log.warning( + 'Issue "{issue_key}" deleted, skipping'.format( + issue_key=issue_key + ) + ) return None - log.info('Issue "{issue_key}" exists, will update'.format(issue_key=issue_key)) + log.info( + 'Issue "{issue_key}" exists, will update'.format( + issue_key=issue_key + ) + ) fields.pop("issuekey", None) return self.issue_update(issue_key, fields) @@ -1339,13 +1508,17 @@ def issue_add_comment(self, issue_key, comment, visibility=None): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/comment".format(base_url=base_url, issueIdOrKey=issue_key) + url = "{base_url}/{issueIdOrKey}/comment".format( + base_url=base_url, issueIdOrKey=issue_key + ) data = {"body": comment} if visibility: data["visibility"] = visibility return self.post(url, data=data) - def issue_edit_comment(self, issue_key, comment_id, comment, visibility=None): + def issue_edit_comment( + self, issue_key, comment_id, comment, visibility=None + ): """ Updates an existing comment :param issue_key: str @@ -1363,13 +1536,17 @@ def issue_edit_comment(self, issue_key, comment_id, comment, visibility=None): data["visibility"] = visibility return self.put(url, data=data) - def get_issue_remotelinks(self, issue_key, global_id=None, internal_id=None): + def get_issue_remotelinks( + self, issue_key, global_id=None, internal_id=None + ): """ Compatibility naming method with get_issue_remote_links() """ return self.get_issue_remote_links(issue_key, global_id, internal_id) - def get_issue_remote_links(self, issue_key, global_id=None, internal_id=None): + def get_issue_remote_links( + self, issue_key, global_id=None, internal_id=None + ): """ Finding all Remote Links on an issue, also with filtering by Global ID and internal ID :param issue_key: @@ -1378,7 +1555,9 @@ def get_issue_remote_links(self, issue_key, global_id=None, internal_id=None): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/remotelink".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}/remotelink".format( + base_url=base_url, issue_key=issue_key + ) params = {} if global_id: params["globalId"] = global_id @@ -1387,7 +1566,14 @@ def get_issue_remote_links(self, issue_key, global_id=None, internal_id=None): return self.get(url, params=params) def create_or_update_issue_remote_links( - self, issue_key, link_url, title, global_id=None, relationship=None, icon_url=None, icon_title=None + self, + issue_key, + link_url, + title, + global_id=None, + relationship=None, + icon_url=None, + icon_title=None, ): """ Add Remote Link to Issue, update url if global_id is passed @@ -1400,7 +1586,9 @@ def create_or_update_issue_remote_links( :param icon_title: str, OPTIONAL: Text for the tooltip of the main icon describing the type of the object in the remote system """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/remotelink".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}/remotelink".format( + base_url=base_url, issue_key=issue_key + ) data = {"object": {"url": link_url, "title": title}} if global_id: data["globalId"] = global_id @@ -1422,7 +1610,9 @@ def get_issue_remote_link_by_id(self, issue_key, link_id): ) return self.get(url) - def update_issue_remote_link_by_id(self, issue_key, link_id, url, title, global_id=None, relationship=None): + def update_issue_remote_link_by_id( + self, issue_key, link_id, url, title, global_id=None, relationship=None + ): """ Update existing Remote Link on Issue :param issue_key: str @@ -1464,7 +1654,9 @@ def get_issue_transitions(self, issue_key): "id": int(transition["id"]), "to": transition["to"]["name"], } - for transition in (self.get_issue_transitions_full(issue_key).json() or {}).get("transitions") + for transition in ( + self.get_issue_transitions_full(issue_key).json() or {} + ).get("transitions") ] else: return [ @@ -1473,13 +1665,17 @@ def get_issue_transitions(self, issue_key): "id": int(transition["id"]), "to": transition["to"]["name"], } - for transition in (self.get_issue_transitions_full(issue_key) or {}).get("transitions") + for transition in ( + self.get_issue_transitions_full(issue_key) or {} + ).get("transitions") ] def issue_transition(self, issue_key, status): return self.set_issue_status(issue_key, status) - def set_issue_status(self, issue_key, status_name, fields=None, update=None): + def set_issue_status( + self, issue_key, status_name, fields=None, update=None + ): """ Setting status by status_name. fields defaults to None for transitions without mandatory fields. If there are mandatory fields for the transition, these can be set using a dict in 'fields'. @@ -1494,8 +1690,12 @@ def set_issue_status(self, issue_key, status_name, fields=None, update=None): :param update: dict, optional """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) - transition_id = self.get_transition_id_to_status_name(issue_key, status_name) + url = "{base_url}/{issue_key}/transitions".format( + base_url=base_url, issue_key=issue_key + ) + transition_id = self.get_transition_id_to_status_name( + issue_key, status_name + ) data = {"transition": {"id": transition_id}} if fields is not None: data["fields"] = fields @@ -1510,20 +1710,30 @@ def set_issue_status_by_transition_id(self, issue_key, transition_id): :param transition_id: int """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}/transitions".format( + base_url=base_url, issue_key=issue_key + ) return self.post(url, data={"transition": {"id": transition_id}}) def get_issue_status(self, issue_key): base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key) - return (((self.get(url) or {}).get("fields") or {}).get("status") or {}).get("name") or {} + url = "{base_url}/{issue_key}?fields=status".format( + base_url=base_url, issue_key=issue_key + ) + return ( + ((self.get(url) or {}).get("fields") or {}).get("status") or {} + ).get("name") or {} def get_issue_status_id(self, issue_key): base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}?fields=status".format( + base_url=base_url, issue_key=issue_key + ) return (self.get(url) or {}).get("fields").get("status").get("id") - def get_issue_transitions_full(self, issue_key, transition_id=None, expand=None): + def get_issue_transitions_full( + self, issue_key, transition_id=None, expand=None + ): """ Get a list of the transitions possible for this issue by the current user, along with fields that are required and their types. @@ -1536,7 +1746,9 @@ def get_issue_transitions_full(self, issue_key, transition_id=None, expand=None) :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) + url = "{base_url}/{issue_key}/transitions".format( + base_url=base_url, issue_key=issue_key + ) params = {} if transition_id: params["transitionId"] = transition_id @@ -1602,7 +1814,9 @@ def user(self, username=None, key=None, account_id=None, expand=None): elif not major_parameter_enabled and not username and key: params = {"key": key} elif not major_parameter_enabled and username and key: - return "You cannot specify both the username and the key parameters" + return ( + "You cannot specify both the username and the key parameters" + ) elif not account_id and not key and not username: return "You must specify at least one parameter: username or key or account_id" if expand: @@ -1645,7 +1859,9 @@ def user_update(self, username, data): :return: """ base_url = self.resource_url("user") - url = "{base_url}?username={username}".format(base_url=base_url, username=username) + url = "{base_url}?username={username}".format( + base_url=base_url, username=username + ) return self.put(url, data=data) def user_update_username(self, old_username, new_username): @@ -1668,7 +1884,9 @@ def user_update_email(self, username, email): data = {"name": username, "emailAddress": email} return self.user_update(username, data=data) - def user_create(self, username, email, display_name, password=None, notification=None): + def user_create( + self, username, email, display_name, password=None, notification=None + ): """ Create a user in Jira :param username: @@ -1680,7 +1898,11 @@ def user_create(self, username, email, display_name, password=None, notification :return: """ log.warning("Creating user {}".format(display_name)) - data = {"name": username, "emailAddress": email, "displayName": display_name} + data = { + "name": username, + "emailAddress": email, + "displayName": display_name, + } if password is not None: data["password"] = password else: @@ -1702,9 +1924,13 @@ def user_properties(self, username=None, account_id=None): base_url = self.resource_url("user/properties") url = "" if username or not self.cloud: - url = "{base_url}?accountId={username}".format(base_url=base_url, username=username) + url = "{base_url}?accountId={username}".format( + base_url=base_url, username=username + ) elif account_id or self.cloud: - url = "{base_url}?accountId={account_id}".format(base_url=base_url, account_id=account_id) + url = "{base_url}?accountId={account_id}".format( + base_url=base_url, account_id=account_id + ) return self.get(url) def user_property(self, username=None, account_id=None, key_property=None): @@ -1721,9 +1947,20 @@ def user_property(self, username=None, account_id=None, key_property=None): elif account_id or self.cloud: params = {"accountId": account_id} base_url = self.resource_url("user/properties") - return self.get("{base_url}/{key_property}".format(base_url=base_url, key_property=key_property), params=params) + return self.get( + "{base_url}/{key_property}".format( + base_url=base_url, key_property=key_property + ), + params=params, + ) - def user_set_property(self, username=None, account_id=None, key_property=None, value_property=None): + def user_set_property( + self, + username=None, + account_id=None, + key_property=None, + value_property=None, + ): """ Set property for user :param username: @@ -1740,12 +1977,16 @@ def user_set_property(self, username=None, account_id=None, key_property=None, v ) elif account_id or self.cloud: url = "{base_url}/{key_property}?accountId={account_id}".format( - base_url=base_url, key_property=key_property, account_id=account_id + base_url=base_url, + key_property=key_property, + account_id=account_id, ) return self.put(url, data=value_property) - def user_delete_property(self, username=None, account_id=None, key_property=None): + def user_delete_property( + self, username=None, account_id=None, key_property=None + ): """ Delete property for user :param username: @@ -1754,7 +1995,9 @@ def user_delete_property(self, username=None, account_id=None, key_property=None :return: """ base_url = self.resource_url("user/properties") - url = "{base_url}/{key_property}".format(base_url=base_url, key_property=key_property) + url = "{base_url}/{key_property}".format( + base_url=base_url, key_property=key_property + ) params = {} if username or not self.cloud: params = {"username": username} @@ -1762,7 +2005,9 @@ def user_delete_property(self, username=None, account_id=None, key_property=None params = {"accountId": account_id} return self.delete(url, params=params) - def user_update_or_create_property_through_rest_point(self, username, key, value): + def user_update_or_create_property_through_rest_point( + self, username, key, value + ): """ ATTENTION! This method used after configuration of rest endpoint on Jira side @@ -1806,11 +2051,15 @@ def user_get_websudo(self): "webSudoPassword": self.password, "webSudoIsPost": "false", } - answer = self.get("secure/admin/WebSudoAuthenticate.jspa", self.form_token_headers) + answer = self.get( + "secure/admin/WebSudoAuthenticate.jspa", self.form_token_headers + ) atl_token = None if answer: atl_token = ( - answer.split(' {} {}".format(method, path, response.status_code, response.reason)) + log.debug( + "HTTP: {} {} -> {} {}".format( + method, path, response.status_code, response.reason + ) + ) log.debug("HTTP: Response text -> {}".format(response.text)) if self.advanced_mode or advanced_mode: return response @@ -424,7 +456,10 @@ def raise_for_status(self, response): error_msg = "\n".join([k + ": " + v for k, v in j.items()]) else: error_msg = "\n".join( - j.get("errorMessages", list()) + [k + ": " + v for k, v in j.get("errors", dict()).items()] + j.get("errorMessages", list()) + [ + k + ": " + v + for k, v in j.get("errors", dict()).items() + ] ) except Exception as e: log.error(e) diff --git a/atlassian/service_desk.py b/atlassian/service_desk.py index 2484bbdcd..cf517a348 100644 --- a/atlassian/service_desk.py +++ b/atlassian/service_desk.py @@ -15,7 +15,9 @@ class ServiceDesk(AtlassianRestAPI): def get_info(self): """Get info about Service Desk app""" - return self.get("rest/servicedeskapi/info", headers=self.experimental_headers) + return self.get( + "rest/servicedeskapi/info", headers=self.experimental_headers + ) def get_service_desks(self): """ @@ -24,7 +26,10 @@ def get_service_desks(self): :return: Service Desks """ - service_desks_list = self.get("rest/servicedeskapi/servicedesk", headers=self.experimental_headers) + service_desks_list = self.get( + "rest/servicedeskapi/servicedesk", + headers=self.experimental_headers, + ) if self.advanced_mode: return service_desks_list else: @@ -55,7 +60,11 @@ def create_customer(self, full_name, email): log.warning("Creating customer...") data = {"fullName": full_name, "email": email} - return self.post("rest/servicedeskapi/customer", headers=self.experimental_headers, data=data) + return self.post( + "rest/servicedeskapi/customer", + headers=self.experimental_headers, + data=data, + ) def get_customer_request(self, issue_id_or_key): """ @@ -72,18 +81,20 @@ def get_customer_request(self, issue_id_or_key): def get_my_customer_requests(self): """Returning requests where you are the assignee""" - response = self.get("rest/servicedeskapi/request", headers=self.experimental_headers) + response = self.get( + "rest/servicedeskapi/request", headers=self.experimental_headers + ) if self.advanced_mode: return response return (response or {}).get("values") def create_customer_request( - self, - service_desk_id, - request_type_id, - values_dict, - raise_on_behalf_of=None, - request_participants=None, + self, + service_desk_id, + request_type_id, + values_dict, + raise_on_behalf_of=None, + request_participants=None, ): """ Creating customer request @@ -142,7 +153,9 @@ def get_customer_transitions(self, issue_id_or_key): :param issue_id_or_key: str :return: """ - url = "rest/servicedeskapi/request/{}/transition".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/transition".format( + issue_id_or_key + ) return self.get(url, headers=self.experimental_headers) @@ -155,7 +168,9 @@ def get_request_types(self, service_desk_id): """ return self.get( - "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id), + "rest/servicedeskapi/servicedesk/{}/requesttype".format( + service_desk_id + ), headers=self.experimental_headers, ) @@ -169,14 +184,18 @@ def get_request_participants(self, issue_id_or_key, start=0, limit=50): :param limit: OPTIONAL: int :return: Request participants """ - url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/participant".format( + issue_id_or_key + ) params = {} if start is not None: params["start"] = int(start) if limit is not None: params["limit"] = int(limit) - response = self.get(url, params=params, headers=self.experimental_headers) + response = self.get( + url, params=params, headers=self.experimental_headers + ) if self.advanced_mode: return response return (response or {}).get("values") @@ -190,7 +209,9 @@ def add_request_participants(self, issue_id_or_key, users_list): :param users_list: list :return: """ - url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/participant".format( + issue_id_or_key + ) data = {"usernames": users_list} return self.post(url, data=data, headers=self.experimental_headers) @@ -204,7 +225,9 @@ def remove_request_participants(self, issue_id_or_key, users_list): :param users_list: list :return: """ - url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/participant".format( + issue_id_or_key + ) data = {"usernames": users_list} return self.delete(url, data=data, headers=self.experimental_headers) @@ -222,7 +245,9 @@ def perform_transition(self, issue_id_or_key, transition_id, comment=None): """ log.warning("Performing transition...") data = {"id": transition_id, "additionalComment": {"body": comment}} - url = "rest/servicedeskapi/request/{}/transition".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/transition".format( + issue_id_or_key + ) return self.post(url, headers=self.experimental_headers, data=data) @@ -240,9 +265,13 @@ def create_request_comment(self, issue_id_or_key, body, public=True): data = {"body": body, "public": public} url = "rest/servicedeskapi/request/{}/comment".format(issue_id_or_key) - return self.post(path=url, data=data, headers=self.experimental_headers) + return self.post( + path=url, data=data, headers=self.experimental_headers + ) - def get_request_comments(self, issue_id_or_key, start=0, limit=50, public=True, internal=True): + def get_request_comments( + self, issue_id_or_key, start=0, limit=50, public=True, internal=True + ): """ Get all comments in issue @@ -264,7 +293,9 @@ def get_request_comments(self, issue_id_or_key, start=0, limit=50, public=True, if internal is not None: params["internal"] = bool(internal) - response = self.get(url, params=params, headers=self.experimental_headers) + response = self.get( + url, params=params, headers=self.experimental_headers + ) if self.advanced_mode: return response return (response or {}).get("values") @@ -284,7 +315,9 @@ def get_request_comment_by_id(self, issue_id_or_key, comment_id): """ return self.get( - "rest/servicedeskapi/request/{}/comment/{}".format(issue_id_or_key, comment_id), + "rest/servicedeskapi/request/{}/comment/{}".format( + issue_id_or_key, comment_id + ), headers=self.experimental_headers, ) @@ -302,7 +335,9 @@ def get_organisations(self, service_desk_id=None, start=0, limit=50): :return: """ url_without_sd_id = "rest/servicedeskapi/organization" - url_with_sd_id = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) + url_with_sd_id = "rest/servicedeskapi/servicedesk/{}/organization".format( + service_desk_id + ) params = {} if start is not None: params["start"] = int(start) @@ -310,8 +345,14 @@ def get_organisations(self, service_desk_id=None, start=0, limit=50): params["limit"] = int(limit) if service_desk_id is None: - return self.get(url_without_sd_id, headers=self.experimental_headers, params=params) - return self.get(url_with_sd_id, headers=self.experimental_headers, params=params) + return self.get( + url_without_sd_id, + headers=self.experimental_headers, + params=params, + ) + return self.get( + url_with_sd_id, headers=self.experimental_headers, params=params + ) def get_organization(self, organization_id): """ @@ -333,7 +374,9 @@ def get_users_in_organization(self, organization_id, start=0, limit=50): :param limit: OPTIONAL: int :return: Users list in organization """ - url = "rest/servicedeskapi/organization/{}/user".format(organization_id) + url = "rest/servicedeskapi/organization/{}/user".format( + organization_id + ) params = {} if start is not None: params["start"] = int(start) @@ -365,7 +408,9 @@ def add_organization(self, service_desk_id, organization_id): :return: """ log.warning("Adding organization...") - url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/organization".format( + service_desk_id + ) data = {"organizationId": organization_id} return self.post(url, headers=self.experimental_headers, data=data) @@ -379,7 +424,9 @@ def remove_organization(self, service_desk_id, organization_id): :return: """ log.warning("Removing organization...") - url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/organization".format( + service_desk_id + ) data = {"organizationId": organization_id} return self.delete(url, headers=self.experimental_headers, data=data) @@ -396,7 +443,9 @@ def delete_organization(self, organization_id): return self.delete(url, headers=self.experimental_headers) - def add_users_to_organization(self, organization_id, users_list=[], account_list=[]): + def add_users_to_organization( + self, organization_id, users_list=[], account_list=[] + ): """ Adds users to an organization users_list is a list of strings @@ -408,12 +457,16 @@ def add_users_to_organization(self, organization_id, users_list=[], account_list :return: """ log.warning("Adding users...") - url = "rest/servicedeskapi/organization/{}/user".format(organization_id) + url = "rest/servicedeskapi/organization/{}/user".format( + organization_id + ) data = {"usernames": users_list, "accountIds": account_list} return self.post(url, headers=self.experimental_headers, data=data) - def remove_users_from_organization(self, organization_id, users_list=[], account_list=[]): + def remove_users_from_organization( + self, organization_id, users_list=[], account_list=[] + ): """ Removes users from an organization users_list is a list of strings @@ -425,13 +478,22 @@ def remove_users_from_organization(self, organization_id, users_list=[], account :return: """ log.warning("Removing users...") - url = "rest/servicedeskapi/organization/{}/user".format(organization_id) + url = "rest/servicedeskapi/organization/{}/user".format( + organization_id + ) data = {"usernames": users_list, "accountIds": account_list} return self.delete(url, headers=self.experimental_headers, data=data) # Attachments actions - def create_attachments(self, service_desk_id, issue_id_or_key, filenames, public=True, comment=None): + def create_attachments( + self, + service_desk_id, + issue_id_or_key, + filenames, + public=True, + comment=None, + ): """ Add attachment as a comment. Setting attachment visibility is dependent on the user's permission. For example, @@ -452,13 +514,24 @@ def create_attachments(self, service_desk_id, issue_id_or_key, filenames, public filenames = [filenames] for filename in filenames: - temp_attachment_id = self.attach_temporary_file(service_desk_id, filename) + temp_attachment_id = self.attach_temporary_file( + service_desk_id, filename + ) temp_attachment_ids.append(temp_attachment_id) # Add attachments - return self.add_attachments(issue_id_or_key, temp_attachment_ids, public, comment) + return self.add_attachments( + issue_id_or_key, temp_attachment_ids, public, comment + ) - def create_attachment(self, service_desk_id, issue_id_or_key, filename, public=True, comment=None): + def create_attachment( + self, + service_desk_id, + issue_id_or_key, + filename, + public=True, + comment=None, + ): """ Add attachment as a comment. Setting attachment visibility is dependent on the user's permission. For example, @@ -474,7 +547,13 @@ def create_attachment(self, service_desk_id, issue_id_or_key, filename, public=T :return: Request info """ log.info("Creating attachment...") - return self.create_attachments(service_desk_id, issue_id_or_key, filename, public=public, comment=comment) + return self.create_attachments( + service_desk_id, + issue_id_or_key, + filename, + public=public, + comment=comment, + ) def attach_temporary_file(self, service_desk_id, filename): """ @@ -483,7 +562,9 @@ def attach_temporary_file(self, service_desk_id, filename): :param filename: str :return: Temporary Attachment ID """ - url = "rest/servicedeskapi/servicedesk/{}/attachTemporaryFile".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/attachTemporaryFile".format( + service_desk_id + ) # no application/json content type and an additional X-Atlassian-Token header # https://docs.atlassian.com/jira-servicedesk/REST/4.14.1/#servicedeskapi/servicedesk/{serviceDeskId}/attachTemporaryFile-attachTemporaryFile @@ -493,15 +574,21 @@ def attach_temporary_file(self, service_desk_id, filename): with open(filename, "rb") as file: result = ( - self.post(path=url, headers=experimental_headers, files={"file": file}) - .json() - .get("temporaryAttachments") + self.post( + path=url, + headers=experimental_headers, + files={"file": file}, + ) + .json() + .get("temporaryAttachments") ) temp_attachment_id = result[0].get("temporaryAttachmentId") return temp_attachment_id - def add_attachments(self, issue_id_or_key, temp_attachment_ids, public=True, comment=None): + def add_attachments( + self, issue_id_or_key, temp_attachment_ids, public=True, comment=None + ): """ Adds temporary attachment to customer request using attach_temporary_file function :param issue_id_or_key: str @@ -515,11 +602,15 @@ def add_attachments(self, issue_id_or_key, temp_attachment_ids, public=True, com "public": public, "additionalComment": {"body": comment}, } - url = "rest/servicedeskapi/request/{}/attachment".format(issue_id_or_key) + url = "rest/servicedeskapi/request/{}/attachment".format( + issue_id_or_key + ) return self.post(url, headers=self.experimental_headers, data=data) - def add_attachment(self, issue_id_or_key, temp_attachment_id, public=True, comment=None): + def add_attachment( + self, issue_id_or_key, temp_attachment_id, public=True, comment=None + ): """ Adds temporary attachment to customer request using attach_temporary_file function :param issue_id_or_key: str @@ -529,7 +620,12 @@ def add_attachment(self, issue_id_or_key, temp_attachment_id, public=True, comme :return: """ log.info("Adding attachment") - return self.add_attachments(issue_id_or_key, [temp_attachment_id], public=public, comment=comment) + return self.add_attachments( + issue_id_or_key, + [temp_attachment_id], + public=public, + comment=comment, + ) # SLA actions def get_sla(self, issue_id_or_key, start=0, limit=50): @@ -550,7 +646,9 @@ def get_sla(self, issue_id_or_key, start=0, limit=50): if limit is not None: params["limit"] = int(limit) - response = self.get(url, params=params, headers=self.experimental_headers) + response = self.get( + url, params=params, headers=self.experimental_headers + ) if self.advanced_mode: return response return (response or {}).get("values") @@ -564,7 +662,9 @@ def get_sla_by_id(self, issue_id_or_key, sla_id): :param sla_id: str :return: SLA information """ - url = "rest/servicedeskapi/request/{0}/sla/{1}".format(issue_id_or_key, sla_id) + url = "rest/servicedeskapi/request/{0}/sla/{1}".format( + issue_id_or_key, sla_id + ) return self.get(url, headers=self.experimental_headers) @@ -586,7 +686,9 @@ def get_approvals(self, issue_id_or_key, start=0, limit=50): if limit is not None: params["limit"] = int(limit) - response = self.get(url, headers=self.experimental_headers, params=params) + response = self.get( + url, headers=self.experimental_headers, params=params + ) if self.advanced_mode: return response return (response or {}).get("values") @@ -599,7 +701,9 @@ def get_approval_by_id(self, issue_id_or_key, approval_id): :param approval_id: str :return: """ - url = "rest/servicedeskapi/request/{0}/approval/{1}".format(issue_id_or_key, approval_id) + url = "rest/servicedeskapi/request/{0}/approval/{1}".format( + issue_id_or_key, approval_id + ) return self.get(url, headers=self.experimental_headers) @@ -612,7 +716,9 @@ def answer_approval(self, issue_id_or_key, approval_id, decision): :param decision: str :return: """ - url = "rest/servicedeskapi/request/{0}/approval/{1}".format(issue_id_or_key, approval_id) + url = "rest/servicedeskapi/request/{0}/approval/{1}".format( + issue_id_or_key, approval_id + ) data = {"decision": decision} return self.post(url, headers=self.experimental_headers, data=data) @@ -643,7 +749,9 @@ def get_customers(self, service_desk_id, query=None, start=0, limit=50): :param service_desk_id: str :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/customer".format( + service_desk_id + ) params = {} if start is not None: params["start"] = int(start) @@ -654,7 +762,9 @@ def get_customers(self, service_desk_id, query=None, start=0, limit=50): return self.get(url, headers=self.experimental_headers, params=params) - def add_customers(self, service_desk_id, list_of_usernames=[], list_of_accountids=[]): + def add_customers( + self, service_desk_id, list_of_usernames=[], list_of_accountids=[] + ): """ Adds one or more existing customers to the given service desk. If you need to create a customer, see Create customer method. @@ -667,13 +777,20 @@ def add_customers(self, service_desk_id, list_of_usernames=[], list_of_accountid :param list_of_accountids: list :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) - data = {"usernames": list_of_usernames, "accountIds": list_of_accountids} + url = "rest/servicedeskapi/servicedesk/{}/customer".format( + service_desk_id + ) + data = { + "usernames": list_of_usernames, + "accountIds": list_of_accountids, + } log.info("Adding customers...") return self.post(url, headers=self.experimental_headers, data=data) - def remove_customers(self, service_desk_id, list_of_usernames=[], list_of_accountids=[]): + def remove_customers( + self, service_desk_id, list_of_usernames=[], list_of_accountids=[] + ): """ Removes one or more customers from a service desk. The service desk must have closed access. If any of the passed customers are @@ -685,13 +802,20 @@ def remove_customers(self, service_desk_id, list_of_usernames=[], list_of_accoun :param list_of_accountids: list :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) - data = {"usernames": list_of_usernames, "accountIds": list_of_accountids} + url = "rest/servicedeskapi/servicedesk/{}/customer".format( + service_desk_id + ) + data = { + "usernames": list_of_usernames, + "accountIds": list_of_accountids, + } log.info("Removing customers...") return self.delete(url, headers=self.experimental_headers, data=data) - def get_queues(self, service_desk_id, include_count=False, start=0, limit=50): + def get_queues( + self, service_desk_id, include_count=False, start=0, limit=50 + ): """ Returns a page of queues defined inside a service desk, for a given service desk ID. The returned queues will include issue counts for each queue (issueCount field) @@ -705,7 +829,9 @@ def get_queues(self, service_desk_id, include_count=False, start=0, limit=50): :param limit: int :return: a page of queues """ - url = "rest/servicedeskapi/servicedesk/{}/queue".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/queue".format( + service_desk_id + ) params = {} if include_count is not None: @@ -717,7 +843,9 @@ def get_queues(self, service_desk_id, include_count=False, start=0, limit=50): return self.get(url, headers=self.experimental_headers, params=params) - def get_issues_in_queue(self, service_desk_id, queue_id, start=0, limit=50): + def get_issues_in_queue( + self, service_desk_id, queue_id, start=0, limit=50 + ): """ Returns a page of issues inside a queue for a given queue ID. Only fields that the queue is configured to show are returned. @@ -733,7 +861,9 @@ def get_issues_in_queue(self, service_desk_id, queue_id, start=0, limit=50): :param limit: int :return: a page of issues """ - url = "rest/servicedeskapi/servicedesk/{0}/queue/{1}/issue".format(service_desk_id, queue_id) + url = "rest/servicedeskapi/servicedesk/{0}/queue/{1}/issue".format( + service_desk_id, queue_id + ) params = {} if start is not None: @@ -764,7 +894,9 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) + url = "rest/plugins/1.0/{plugin_key}-key/license".format( + plugin_key=plugin_key + ) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -794,7 +926,9 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request(method="GET", path=url, headers=self.safe_mode_headers) + return self.request( + method="GET", path=url, headers=self.safe_mode_headers + ) def update_plugin_license(self, plugin_key, raw_license): """ @@ -812,12 +946,12 @@ def update_plugin_license(self, plugin_key, raw_license): return self.put(url, data=data, headers=app_headers) def create_request_type( - self, - service_desk_id, - request_type_id, - request_name, - request_description, - request_help_text, + self, + service_desk_id, + request_type_id, + request_name, + request_description, + request_help_text, ): """ Creating a request type @@ -835,5 +969,7 @@ def create_request_type( "helpText": request_help_text, } - url = "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id) + url = "rest/servicedeskapi/servicedesk/{}/requesttype".format( + service_desk_id + ) return self.post(url, headers=self.experimental_headers, data=data) diff --git a/atlassian/utils.py b/atlassian/utils.py index d812f67a2..5513a8966 100644 --- a/atlassian/utils.py +++ b/atlassian/utils.py @@ -27,7 +27,9 @@ def html_email(email, title=None): if not title: title = email - return '{title}'.format(email=email, title=title) + return '{title}'.format( + email=email, title=title + ) def html_list(data): diff --git a/atlassian/xray.py b/atlassian/xray.py index 00956ced1..2f0d5bde3 100755 --- a/atlassian/xray.py +++ b/atlassian/xray.py @@ -45,7 +45,9 @@ def get_test_runs_with_environment(self, test_key, test_environments): :param test_environments: Test execution environments separated by ','. :return: Returns the exported test runs. """ - env = "?testEnvironments={0}".format(",".join([re.escape(env) for env in test_environments])) + env = "?testEnvironments={0}".format( + ",".join([re.escape(env) for env in test_environments]) + ) url = "rest/raven/1.0/api/test/{0}/testruns{1}".format(test_key, env) return self.get(url) @@ -101,7 +103,9 @@ def get_test_step(self, test_key, test_step_id): :param test_step_id: ID of the test step. :return: Return the test step with the given id. """ - url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format( + test_key, test_step_id + ) return self.get(url) def get_test_steps(self, test_key): @@ -123,7 +127,12 @@ def create_test_step(self, test_key, step, data, result): :param result: Test Step results (eg. 'Example results'). :return: """ - create = {"step": step, "data": data, "result": result, "attachments": []} + create = { + "step": step, + "data": data, + "result": result, + "attachments": [], + } url = "rest/raven/1.0/api/test/{0}/step".format(test_key) return self.put(url, create) @@ -144,7 +153,9 @@ def update_test_step(self, test_key, test_step_id, step, data, result): "result": result, "attachments": {"add": [], "remove": []}, } - url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format( + test_key, test_step_id + ) return self.post(url, update) def delete_test_step(self, test_key, test_step_id): @@ -154,7 +165,9 @@ def delete_test_step(self, test_key, test_step_id): :param test_step_id: ID of the test step. :return: """ - url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format( + test_key, test_step_id + ) return self.delete(url) # Pre-Conditions API @@ -164,7 +177,9 @@ def get_tests_with_precondition(self, precondition_key): :param precondition_key: Precondition key (eg. 'TEST-001'). :return: Return a list of the test associated with the pre-condition. """ - url = "rest/raven/1.0/api/precondition/{0}/test".format(precondition_key) + url = "rest/raven/1.0/api/precondition/{0}/test".format( + precondition_key + ) return self.get(url) def update_precondition(self, precondition_key, add=None, remove=None): @@ -180,7 +195,9 @@ def update_precondition(self, precondition_key, add=None, remove=None): if add is None: add = [] update = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/precondition/{0}/test".format(precondition_key) + url = "rest/raven/1.0/api/precondition/{0}/test".format( + precondition_key + ) return self.post(url, update) def delete_test_from_precondition(self, precondition_key, test_key): @@ -190,7 +207,9 @@ def delete_test_from_precondition(self, precondition_key, test_key): :param test_key: Test Key which should no longer be associate with the pre-condition (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/precondition/{0}/test/{1}".format(precondition_key, test_key) + url = "rest/raven/1.0/api/precondition/{0}/test/{1}".format( + precondition_key, test_key + ) return self.delete(url) # Test Set API @@ -235,7 +254,9 @@ def delete_test_from_test_set(self, test_set_key, test_key): :param test_key: Test Key which should no longer be associate with the test set (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testset/{0}/test/{1}".format(test_set_key, test_key) + url = "rest/raven/1.0/api/testset/{0}/test/{1}".format( + test_set_key, test_key + ) return self.delete(url) # Test Plans API @@ -280,7 +301,9 @@ def delete_test_from_test_plan(self, test_plan_key, test_key): :param test_key: Test Key which should no longer be associate with the test plan (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testplan/{0}/test/{1}".format(test_plan_key, test_key) + url = "rest/raven/1.0/api/testplan/{0}/test/{1}".format( + test_plan_key, test_key + ) return self.delete(url) def get_test_executions_with_test_plan(self, test_plan_key): @@ -289,10 +312,14 @@ def get_test_executions_with_test_plan(self, test_plan_key): :param test_plan_key: Test plan key (eg. 'PLAN-001'). :return: Return a list of the test executions associated with the test plan. """ - url = "rest/raven/1.0/api/testplan/{0}/testexecution".format(test_plan_key) + url = "rest/raven/1.0/api/testplan/{0}/testexecution".format( + test_plan_key + ) return self.get(url) - def update_test_plan_test_executions(self, test_plan_key, add=None, remove=None): + def update_test_plan_test_executions( + self, test_plan_key, add=None, remove=None + ): """ Associate test executions with the given test plan. :param test_plan_key: Test plan key (eg. 'PLAN-001'). @@ -305,21 +332,29 @@ def update_test_plan_test_executions(self, test_plan_key, add=None, remove=None) if remove is None: remove = [] update = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/testplan/{0}/testexecution".format(test_plan_key) + url = "rest/raven/1.0/api/testplan/{0}/testexecution".format( + test_plan_key + ) return self.post(url, update) - def delete_test_execution_from_test_plan(self, test_plan_key, test_exec_key): + def delete_test_execution_from_test_plan( + self, test_plan_key, test_exec_key + ): """ Remove association of the specified tests execution from the given test plan. :param test_plan_key: Test plan key (eg. 'PLAN-001'). :param test_exec_key: Test execution Key which should no longer be associate with the test plan (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testplan/{0}/testexecution/{1}".format(test_plan_key, test_exec_key) + url = "rest/raven/1.0/api/testplan/{0}/testexecution/{1}".format( + test_plan_key, test_exec_key + ) return self.delete(url) # Test Executions API - def get_tests_with_test_execution(self, test_exec_key, detailed=False, limit=None, page=None): + def get_tests_with_test_execution( + self, test_exec_key, detailed=False, limit=None, page=None + ): """ Retrieve the tests associated with the given test execution. :param test_exec_key: Test execution key (eg. 'EXEC-001'). @@ -364,7 +399,9 @@ def delete_test_from_test_execution(self, test_exec_key, test_key): :param test_key: Test Key which should no longer be associate with the test execution (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testexec/{0}/test/{1}".format(test_exec_key, test_key) + url = "rest/raven/1.0/api/testexec/{0}/test/{1}".format( + test_exec_key, test_key + ) return self.delete(url) # Test Runs API @@ -477,7 +514,9 @@ def get_test_repo_folders(self, project_key): :param project_key: Project key (eg. 'FOO'). :return: Returns the list of test repository folders. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders".format(project_key) + url = "rest/raven/1.0/api/testrepository/{0}/folders".format( + project_key + ) return self.get(url) def get_test_repo_folder(self, project_key, folder_id): @@ -487,10 +526,14 @@ def get_test_repo_folder(self, project_key, folder_id): :param folder_id: Internal folder Id. :return: Returns the test repository folder. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( + project_key, folder_id + ) return self.get(url) - def create_test_repo_folder(self, project_key, folder_name, parent_folder_id=-1): + def create_test_repo_folder( + self, project_key, folder_name, parent_folder_id=-1 + ): """ Create test repository folder for a project. :param project_key: Project key (eg. 'FOO'). @@ -499,10 +542,14 @@ def create_test_repo_folder(self, project_key, folder_name, parent_folder_id=-1) :return: Returns the created test repository folder. """ data = {"name": folder_name} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, parent_folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( + project_key, parent_folder_id + ) return self.post(url, data=data) - def update_test_repo_folder(self, project_key, folder_id, folder_name, rank=1): + def update_test_repo_folder( + self, project_key, folder_id, folder_name, rank=1 + ): """ Update test repository folder for a project. :param project_key: Project key (eg. 'FOO'). @@ -512,7 +559,9 @@ def update_test_repo_folder(self, project_key, folder_id, folder_name, rank=1): :return: Returns the updated test repository folder. """ data = {"name": folder_name, "rank": rank} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( + project_key, folder_id + ) return self.put(url, data=data) def delete_test_repo_folder(self, project_key, folder_id): @@ -522,10 +571,14 @@ def delete_test_repo_folder(self, project_key, folder_id): :param folder_id: Internal folder Id. :return: Returns the delete results. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( + project_key, folder_id + ) return self.delete(url) - def get_test_repo_folder_tests(self, project_key, folder_id, all_descendants=False, page=1, limit=50): + def get_test_repo_folder_tests( + self, project_key, folder_id, all_descendants=False, page=1, limit=50 + ): """ Retrieve tests of a test repository folder. :param project_key: Project key (eg. 'FOO'). @@ -536,7 +589,9 @@ def get_test_repo_folder_tests(self, project_key, folder_id, all_descendants=Fal :return: Returns list of the Tests contained in a given folder of the test repository. Note: param "page" and "limit" must coexist, otherwise rest api will raise 400 """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format(project_key, folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format( + project_key, folder_id + ) params = {} if all_descendants: @@ -548,7 +603,9 @@ def get_test_repo_folder_tests(self, project_key, folder_id, all_descendants=Fal return self.get(url, params=params) - def update_test_repo_folder_tests(self, project_key, folder_id, add=None, remove=None): + def update_test_repo_folder_tests( + self, project_key, folder_id, add=None, remove=None + ): """ Update tests of a test repository folder. :param project_key: Project key (eg. 'FOO'). @@ -562,5 +619,7 @@ def update_test_repo_folder_tests(self, project_key, folder_id, add=None, remove if remove is None: remove = [] data = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format(project_key, folder_id) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format( + project_key, folder_id + ) return self.put(url, data=data) From eeafed86502a59ddef95835641771f94c0d14bac Mon Sep 17 00:00:00 2001 From: Gonchik Tsymzhitov Date: Sat, 3 Dec 2022 21:27:16 +0200 Subject: [PATCH 2/4] Time to remove python 2.7 --- LICENSE | 2 +- atlassian/bamboo.py | 6 ++--- atlassian/bitbucket/__init__.py | 2 +- atlassian/bitbucket/base.py | 3 ++- atlassian/bitbucket/cloud/common/comments.py | 2 +- .../bitbucket/cloud/repositories/__init__.py | 2 +- .../bitbucket/cloud/repositories/commits.py | 4 ++-- .../cloud/repositories/defaultReviewers.py | 2 +- .../bitbucket/cloud/repositories/pipelines.py | 6 ++--- .../cloud/repositories/pullRequests.py | 12 ++++++---- .../bitbucket/server/projects/__init__.py | 4 ++-- .../server/projects/repos/__init__.py | 4 ++-- atlassian/confluence.py | 24 ++++++++++++------- atlassian/rest_client.py | 3 ++- 14 files changed, 44 insertions(+), 32 deletions(-) diff --git a/LICENSE b/LICENSE index 8eb7853c5..73ef90e89 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Mateusz Harasymczuk + Copyright 2014 Mateusz Harasymczuk, Gonchik Tsymzhitov Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/atlassian/bamboo.py b/atlassian/bamboo.py index 9e6fe0ca1..f4d7b5784 100755 --- a/atlassian/bamboo.py +++ b/atlassian/bamboo.py @@ -70,7 +70,7 @@ def base_list_call( max_results, label=None, start_index=0, - **kwargs + **kwargs, ): flags = [] params = {"max-results": max_results} @@ -404,7 +404,7 @@ def results( elements_key="results", element_key="result", label=label, - **params + **params, ) def latest_results( @@ -605,7 +605,7 @@ def execute_build( stage=None, execute_all_stages=True, custom_revision=None, - **bamboo_variables + **bamboo_variables, ): """ Fire build execution for specified plan. diff --git a/atlassian/bitbucket/__init__.py b/atlassian/bitbucket/__init__.py index a633c208d..2f61b4152 100644 --- a/atlassian/bitbucket/__init__.py +++ b/atlassian/bitbucket/__init__.py @@ -2553,7 +2553,7 @@ def create_code_insights_report( commit_id, report_key, report_title, - **report_params + **report_params, ): """ Create a new insight report, or replace the existing one diff --git a/atlassian/bitbucket/base.py b/atlassian/bitbucket/base.py index 8a4af73a0..479bb645e 100644 --- a/atlassian/bitbucket/base.py +++ b/atlassian/bitbucket/base.py @@ -116,7 +116,8 @@ def _check_timeformat_lambda(self): """ LAMBDA = lambda: 0 # noqa: E731 if self.timeformat_lambda is None or ( - isinstance(self.timeformat_lambda, type(LAMBDA)) and self.timeformat_lambda.__name__ == LAMBDA.__name__ + isinstance(self.timeformat_lambda, type(LAMBDA)) + and self.timeformat_lambda.__name__ == LAMBDA.__name__ ): return True else: diff --git a/atlassian/bitbucket/cloud/common/comments.py b/atlassian/bitbucket/cloud/common/comments.py index 1e0af1351..e8a705f25 100644 --- a/atlassian/bitbucket/cloud/common/comments.py +++ b/atlassian/bitbucket/cloud/common/comments.py @@ -10,7 +10,7 @@ def __init__(self, data, *args, **kwargs): *args, data=data, expected_type="pullrequest_comment", - **kwargs + **kwargs, ) @property diff --git a/atlassian/bitbucket/cloud/repositories/__init__.py b/atlassian/bitbucket/cloud/repositories/__init__.py index a7067b1f3..1edf953ee 100644 --- a/atlassian/bitbucket/cloud/repositories/__init__.py +++ b/atlassian/bitbucket/cloud/repositories/__init__.py @@ -276,7 +276,7 @@ def __init__(self, data, *args, **kwargs): self.__commits = Commits( "{}/commits".format(self.url), data={"links": {"commit": {"href": "{}/commit".format(self.url)}}}, - **self._new_session_args + **self._new_session_args, ) self.__default_reviewers = DefaultReviewers( "{}/default-reviewers".format(self.url), **self._new_session_args diff --git a/atlassian/bitbucket/cloud/repositories/commits.py b/atlassian/bitbucket/cloud/repositories/commits.py index 9c6ee99b3..7bb0aa2e2 100644 --- a/atlassian/bitbucket/cloud/repositories/commits.py +++ b/atlassian/bitbucket/cloud/repositories/commits.py @@ -142,7 +142,7 @@ def get_build(self, key): """ return Build( super(Commit, self).get(self.url_joiner("statuses/build", key)), - **self._new_session_args + **self._new_session_args, ) def comments(self): @@ -163,7 +163,7 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message, }} + data = {"content": {"raw": raw_message,}} return self.post("comments", data) diff --git a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py index 653a1f8d6..19036136b 100644 --- a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py +++ b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py @@ -14,7 +14,7 @@ def __get_object(self, data): return DefaultReviewer( self.url_joiner(self.url, data["uuid"]), data, - **self._new_session_args + **self._new_session_args, ) def add(self, user): diff --git a/atlassian/bitbucket/cloud/repositories/pipelines.py b/atlassian/bitbucket/cloud/repositories/pipelines.py index a2a921a0d..2ceb98976 100644 --- a/atlassian/bitbucket/cloud/repositories/pipelines.py +++ b/atlassian/bitbucket/cloud/repositories/pipelines.py @@ -14,7 +14,7 @@ def __get_object(self, data): return Pipeline( self.url_joiner(self.url, data["uuid"]), data, - **self._new_session_args + **self._new_session_args, ) def trigger( @@ -111,7 +111,7 @@ def __get_object(self, data): return Step( "{}/steps/{}".format(self.url, data["uuid"]), data, - **self._new_session_args + **self._new_session_args, ) @property @@ -147,7 +147,7 @@ def pullrequest(self): return PullRequest( target["pullrequest"]["links"]["self"]["href"], target["pullrequest"], - **self._new_session_args + **self._new_session_args, ) else: return None diff --git a/atlassian/bitbucket/cloud/repositories/pullRequests.py b/atlassian/bitbucket/cloud/repositories/pullRequests.py index 0cdce0b5a..dadf0bfb5 100644 --- a/atlassian/bitbucket/cloud/repositories/pullRequests.py +++ b/atlassian/bitbucket/cloud/repositories/pullRequests.py @@ -299,7 +299,7 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message, }} + data = {"content": {"raw": raw_message,}} return self.post("comments", data) @@ -323,7 +323,7 @@ def add_task(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message, }} + data = {"content": {"raw": raw_message,}} return Task(self.post("tasks", data), **self._new_session_args) @@ -387,14 +387,16 @@ def merge(self, merge_strategy=None, close_source_branch=None): self._check_if_open() if ( - merge_strategy is not None and merge_strategy not in self.MERGE_STRATEGIES + merge_strategy is not None + and merge_strategy not in self.MERGE_STRATEGIES ): raise ValueError( "merge_strategy must be {}".format(self.MERGE_STRATEGIES) ) data = { - "close_source_branch": close_source_branch or self.close_source_branch, + "close_source_branch": close_source_branch + or self.close_source_branch, "merge_strategy": merge_strategy, } @@ -454,7 +456,7 @@ def update(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message, }} + data = {"content": {"raw": raw_message,}} return self._update_data(self.put(None, data=data)) def delete(self): diff --git a/atlassian/bitbucket/server/projects/__init__.py b/atlassian/bitbucket/server/projects/__init__.py index 9b71ad793..c41b2cf47 100644 --- a/atlassian/bitbucket/server/projects/__init__.py +++ b/atlassian/bitbucket/server/projects/__init__.py @@ -117,12 +117,12 @@ def __init__(self, data, *args, **kwargs): self.__groups = Groups( self._sub_url("permissions/groups"), "PROJECT", - **self._new_session_args + **self._new_session_args, ) self.__users = Users( self._sub_url("permissions/users"), "PROJECT", - **self._new_session_args + **self._new_session_args, ) self.__repos = Repositories( self._sub_url("repos"), **self._new_session_args diff --git a/atlassian/bitbucket/server/projects/repos/__init__.py b/atlassian/bitbucket/server/projects/repos/__init__.py index d2351e4bb..d17ca0772 100644 --- a/atlassian/bitbucket/server/projects/repos/__init__.py +++ b/atlassian/bitbucket/server/projects/repos/__init__.py @@ -88,12 +88,12 @@ def __init__(self, data, *args, **kwargs): self.__groups = Groups( self._sub_url("permissions/groups"), "REPO", - **self._new_session_args + **self._new_session_args, ) self.__users = Users( self._sub_url("permissions/users"), "REPO", - **self._new_session_args + **self._new_session_args, ) def __get_object(self, data): diff --git a/atlassian/confluence.py b/atlassian/confluence.py index cda40bc92..5c4b603e3 100644 --- a/atlassian/confluence.py +++ b/atlassian/confluence.py @@ -242,7 +242,8 @@ def get_parent_content_id(self, page_id): parent_content_id = ( self.get_page_by_id(page_id=page_id, expand="ancestors").get( "ancestors" - ) or {} + ) + or {} )[-1].get("id") or None except Exception as e: log.error(e) @@ -257,8 +258,10 @@ def get_parent_content_title(self, page_id): parent_content_title = None try: parent_content_title = ( - self.get_page_by_id(page_id=page_id, expand="ancestors") - .get("ancestors") or {} + self.get_page_by_id(page_id=page_id, expand="ancestors").get( + "ancestors" + ) + or {} )[-1].get("title") or None except Exception as e: log.error(e) @@ -271,8 +274,9 @@ def get_page_space(self, page_id): :return: """ return ( - (self.get_page_by_id(page_id, expand="space") or {}) - .get("space") or {}).get("key") or None + (self.get_page_by_id(page_id, expand="space") or {}).get("space") + or {} + ).get("key") or None def get_pages_by_title( self, space, title, start=0, limit=200, expand=None @@ -1609,13 +1613,16 @@ def is_page_content_is_already_updated(self, page_id, body, title=None): ( self.get_page_by_id(page_id, expand="body.storage").json() or {} - ).get("body") or {} + ).get("body") + or {} ).get("storage") or {} else: confluence_content = ( ( self.get_page_by_id(page_id, expand="body.storage") or {} - ).get("body") or {}).get("storage") or {} + ).get("body") + or {} + ).get("storage") or {} confluence_body_content = confluence_content.get("value") @@ -1803,7 +1810,8 @@ def _insert_to_existing_page( ( self.get_page_by_id(page_id, expand="body.storage").get( "body" - ) or {} + ) + or {} ) .get("storage") .get("value") diff --git a/atlassian/rest_client.py b/atlassian/rest_client.py index b442d703a..bb0ad7c75 100644 --- a/atlassian/rest_client.py +++ b/atlassian/rest_client.py @@ -456,7 +456,8 @@ def raise_for_status(self, response): error_msg = "\n".join([k + ": " + v for k, v in j.items()]) else: error_msg = "\n".join( - j.get("errorMessages", list()) + [ + j.get("errorMessages", list()) + + [ k + ": " + v for k, v in j.get("errors", dict()).items() ] From 398c3426ee0240f44e2b9a38c4ba76d314cef188 Mon Sep 17 00:00:00 2001 From: Gonchik Tsymzhitov Date: Sat, 3 Dec 2022 21:41:54 +0200 Subject: [PATCH 3/4] Remove locked version --- atlassian/bamboo.py | 306 ++---- atlassian/bitbucket/__init__.py | 947 ++++-------------- atlassian/bitbucket/base.py | 32 +- atlassian/bitbucket/cloud/__init__.py | 8 +- atlassian/bitbucket/cloud/base.py | 26 +- atlassian/bitbucket/cloud/common/builds.py | 4 +- atlassian/bitbucket/cloud/common/comments.py | 7 +- atlassian/bitbucket/cloud/common/users.py | 8 +- .../bitbucket/cloud/repositories/__init__.py | 60 +- .../cloud/repositories/branchRestrictions.py | 13 +- .../bitbucket/cloud/repositories/commits.py | 21 +- .../cloud/repositories/defaultReviewers.py | 10 +- .../bitbucket/cloud/repositories/diffstat.py | 8 +- .../bitbucket/cloud/repositories/issues.py | 4 +- .../bitbucket/cloud/repositories/pipelines.py | 46 +- .../cloud/repositories/pullRequests.py | 36 +- .../bitbucket/cloud/repositories/refs.py | 8 +- .../bitbucket/cloud/workspaces/__init__.py | 12 +- .../bitbucket/cloud/workspaces/projects.py | 18 +- atlassian/bitbucket/server/__init__.py | 16 +- atlassian/bitbucket/server/base.py | 15 +- .../bitbucket/server/common/permissions.py | 18 +- .../bitbucket/server/globalPermissions.py | 28 +- .../bitbucket/server/projects/__init__.py | 22 +- .../server/projects/repos/__init__.py | 31 +- atlassian/confluence.py | 694 +++---------- atlassian/crowd.py | 63 +- atlassian/insight.py | 85 +- atlassian/jira.py | 810 ++++----------- atlassian/portfolio.py | 31 +- atlassian/rest_client.py | 67 +- atlassian/service_desk.py | 263 ++--- atlassian/utils.py | 4 +- atlassian/xray.py | 108 +- tox.ini | 2 +- 35 files changed, 828 insertions(+), 3003 deletions(-) diff --git a/atlassian/bamboo.py b/atlassian/bamboo.py index f4d7b5784..2f8902b3b 100755 --- a/atlassian/bamboo.py +++ b/atlassian/bamboo.py @@ -62,15 +62,7 @@ def _get_generator( yield response def base_list_call( - self, - resource, - expand, - favourite, - clover_enabled, - max_results, - label=None, - start_index=0, - **kwargs, + self, resource, expand, favourite, clover_enabled, max_results, label=None, start_index=0, **kwargs, ): flags = [] params = {"max-results": max_results} @@ -93,18 +85,12 @@ def base_list_call( max_results=max_results, ) params["start-index"] = start_index - return self.get( - self.resource_url(resource), flags=flags, params=params - ) + return self.get(self.resource_url(resource), flags=flags, params=params) """ Projects & Plans """ def projects( - self, - expand=None, - favourite=False, - clover_enabled=False, - max_results=25, + self, expand=None, favourite=False, clover_enabled=False, max_results=25, ): return self.base_list_call( "project", @@ -116,9 +102,7 @@ def projects( element_key="project", ) - def project( - self, project_key, expand=None, favourite=False, clover_enabled=False - ): + def project(self, project_key, expand=None, favourite=False, clover_enabled=False): resource = "project/{}".format(project_key) return self.base_list_call( resource=resource, @@ -150,12 +134,7 @@ def project_plans(self, project_key, start_index=0, max_results=25): ) def plans( - self, - expand=None, - favourite=False, - clover_enabled=False, - start_index=0, - max_results=25, + self, expand=None, favourite=False, clover_enabled=False, start_index=0, max_results=25, ): return self.base_list_call( "plan", @@ -192,9 +171,7 @@ def get_plan(self, plan_key, expand=None): resource = "rest/api/latest/plan/{}".format(plan_key) return self.get(resource, params=params) - def search_plans( - self, search_term, fuzzy=True, start_index=0, max_results=25 - ): + def search_plans(self, search_term, fuzzy=True, start_index=0, max_results=25): """ Search plans by name :param search_term: str @@ -207,12 +184,7 @@ def search_plans( resource = "rest/api/latest/search/plans" return self.get( resource, - params={ - "fuzzy": fuzzy, - "searchTerm": search_term, - "max-results": max_results, - "start-index": start_index, - }, + params={"fuzzy": fuzzy, "searchTerm": search_term, "max-results": max_results, "start-index": start_index,}, ) def delete_plan(self, plan_key): @@ -244,9 +216,7 @@ def enable_plan(self, plan_key): """ Branches """ - def search_branches( - self, plan_key, include_default_branch=True, max_results=25, start=0 - ): + def search_branches(self, plan_key, include_default_branch=True, max_results=25, start=0): params = { "max-result": max_results, "start-index": start, @@ -255,32 +225,19 @@ def search_branches( } size = 1 while params["start-index"] < size: - results = self.get( - self.resource_url("search/branches"), params=params - ) + results = self.get(self.resource_url("search/branches"), params=params) size = results["size"] for r in results["searchResults"]: yield r params["start-index"] += results["max-result"] def plan_branches( - self, - plan_key, - expand=None, - favourite=False, - clover_enabled=False, - max_results=25, + self, plan_key, expand=None, favourite=False, clover_enabled=False, max_results=25, ): """api/1.0/plan/{projectKey}-{buildKey}/branch""" resource = "plan/{}/branch".format(plan_key) return self.base_list_call( - resource, - expand, - favourite, - clover_enabled, - max_results, - elements_key="branches", - element_key="branch", + resource, expand, favourite, clover_enabled, max_results, elements_key="branches", element_key="branch", ) def get_branch_info(self, plan_key, branch_name): @@ -290,18 +247,11 @@ def get_branch_info(self, plan_key, branch_name): :param branch_name: :return: """ - resource = "plan/{plan_key}/branch/{branch_name}".format( - plan_key=plan_key, branch_name=branch_name - ) + resource = "plan/{plan_key}/branch/{branch_name}".format(plan_key=plan_key, branch_name=branch_name) return self.get(self.resource_url(resource)) def create_branch( - self, - plan_key, - branch_name, - vcs_branch=None, - enabled=False, - cleanup_enabled=False, + self, plan_key, branch_name, vcs_branch=None, enabled=False, cleanup_enabled=False, ): """ Method for creating branch for a specified plan. @@ -315,9 +265,7 @@ def create_branch( :param cleanup_enabled: bool :return: PUT request """ - resource = "plan/{plan_key}/branch/{branch_name}".format( - plan_key=plan_key, branch_name=branch_name - ) + resource = "plan/{plan_key}/branch/{branch_name}".format(plan_key=plan_key, branch_name=branch_name) params = {} if vcs_branch: params = dict( @@ -336,12 +284,7 @@ def get_vcs_branches(self, plan_key, max_results=25): """ resource = "plan/{plan_key}/vcsBranches".format(plan_key=plan_key) return self.base_list_call( - resource, - start_index=0, - max_results=max_results, - clover_enabled=None, - expand=None, - favourite=None, + resource, start_index=0, max_results=max_results, clover_enabled=None, expand=None, favourite=None, ) """ Build results """ @@ -379,9 +322,7 @@ def results( """ resource = "result" if project_key and plan_key and job_key and build_number: - resource += "/{}-{}-{}/{}".format( - project_key, plan_key, job_key, build_number - ) + resource += "/{}-{}-{}/{}".format(project_key, plan_key, job_key, build_number) elif project_key and plan_key and build_number: resource += "/{}-{}/{}".format(project_key, plan_key, build_number) elif project_key and plan_key: @@ -519,12 +460,7 @@ def plan_results( ) def build_result( - self, - build_key, - expand=None, - include_all_states=False, - start=0, - max_results=25, + self, build_key, expand=None, include_all_states=False, start=0, max_results=25, ): """ Returns details of a specific build result @@ -550,15 +486,9 @@ def build_result( include_all_states=include_all_states, ) except ValueError: - raise ValueError( - 'The key "{}" does not correspond to a build result'.format( - build_key - ) - ) + raise ValueError('The key "{}" does not correspond to a build result'.format(build_key)) - def build_latest_result( - self, plan_key, expand=None, include_all_states=False - ): + def build_latest_result(self, plan_key, expand=None, include_all_states=False): """ Returns details of a latest build result :param expand: expands build result details on request. Possible values are: artifacts, comments, labels, @@ -579,11 +509,7 @@ def build_latest_result( include_all_states=include_all_states, ) except ValueError: - raise ValueError( - 'The key "{}" does not correspond to the latest build result'.format( - plan_key - ) - ) + raise ValueError('The key "{}" does not correspond to the latest build result'.format(plan_key)) def delete_build_result(self, build_key): """ @@ -595,17 +521,10 @@ def delete_build_result(self, build_key): plan_key = "{}-{}".format(build_key[0], build_key[1]) build_number = build_key[2] params = {"buildKey": plan_key, "buildNumber": build_number} - return self.post( - custom_resource, params=params, headers=self.form_token_headers - ) + return self.post(custom_resource, params=params, headers=self.form_token_headers) def execute_build( - self, - plan_key, - stage=None, - execute_all_stages=True, - custom_revision=None, - **bamboo_variables, + self, plan_key, stage=None, execute_all_stages=True, custom_revision=None, **bamboo_variables, ): """ Fire build execution for specified plan. @@ -643,25 +562,14 @@ def stop_build(self, plan_key): """ Comments & Labels """ def comments( - self, - project_key, - plan_key, - build_number, - start_index=0, - max_results=25, + self, project_key, plan_key, build_number, start_index=0, max_results=25, ): - resource = "result/{}-{}-{}/comment".format( - project_key, plan_key, build_number - ) + resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number) params = {"start-index": start_index, "max-results": max_results} return self.get(self.resource_url(resource), params=params) - def create_comment( - self, project_key, plan_key, build_number, comment, author=None - ): - resource = "result/{}-{}-{}/comment".format( - project_key, plan_key, build_number - ) + def create_comment(self, project_key, plan_key, build_number, comment, author=None): + resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number) comment_data = { "author": author if author else self.username, "content": comment, @@ -669,29 +577,18 @@ def create_comment( return self.post(self.resource_url(resource), data=comment_data) def labels( - self, - project_key, - plan_key, - build_number, - start_index=0, - max_results=25, + self, project_key, plan_key, build_number, start_index=0, max_results=25, ): - resource = "result/{}-{}-{}/label".format( - project_key, plan_key, build_number - ) + resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number) params = {"start-index": start_index, "max-results": max_results} return self.get(self.resource_url(resource), params=params) def create_label(self, project_key, plan_key, build_number, label): - resource = "result/{}-{}-{}/label".format( - project_key, plan_key, build_number - ) + resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number) return self.post(self.resource_url(resource), data={"name": label}) def delete_label(self, project_key, plan_key, build_number, label): - resource = "result/{}-{}-{}/label/{}".format( - project_key, plan_key, build_number, label - ) + resource = "result/{}-{}-{}/label/{}".format(project_key, plan_key, build_number, label) return self.delete(self.resource_url(resource)) def get_projects(self): @@ -701,9 +598,7 @@ def get_projects(self): max_results = 25 while True: - resource = "project?start-index={}&max-result={}".format( - start_idx, max_results - ) + resource = "project?start-index={}&max-result={}".format(start_idx, max_results) r = self.get(self.resource_url(resource)) @@ -745,12 +640,8 @@ def delete_deployment_project(self, project_id): resource = "deploy/project/{}".format(project_id) return self.delete(self.resource_url(resource)) - def deployment_environment_results( - self, env_id, expand=None, max_results=25 - ): - resource = "deploy/environment/{environmentId}/results".format( - environmentId=env_id - ) + def deployment_environment_results(self, env_id, expand=None, max_results=25): + resource = "deploy/environment/{environmentId}/results".format(environmentId=env_id) params = {"max-result": max_results, "start-index": 0} size = 1 if expand: @@ -767,11 +658,7 @@ def deployment_dashboard(self, project_id=None): Returns the current status of each deployment environment If no project id is provided, returns all projects. """ - resource = ( - "deploy/dashboard/{}".format(project_id) - if project_id - else "deploy/dashboard" - ) + resource = "deploy/dashboard/{}".format(project_id) if project_id else "deploy/dashboard" return self.get(self.resource_url(resource)) """ Users & Groups """ @@ -844,9 +731,7 @@ def remove_users_from_group(self, group_name, users): url = "rest/api/latest/admin/groups/{}/remove-users".format(group_name) return self.delete(url, data=users) - def get_users_from_group( - self, group_name, filter_users=None, start=0, limit=25 - ): + def get_users_from_group(self, group_name, filter_users=None, start=0, limit=25): """ Retrieves a list of users that are members of a specified group. The authenticated user must have restricted administrative permission or higher to use this resource. @@ -862,9 +747,7 @@ def get_users_from_group( url = "rest/api/latest/admin/groups/{}/more-members".format(group_name) return self.get(url, params=params) - def get_users_not_in_group( - self, group_name, filter_users="", start=0, limit=25 - ): + def get_users_not_in_group(self, group_name, filter_users="", start=0, limit=25): """ Retrieves a list of users that are not members of a specified group. The authenticated user must have restricted administrative permission or higher to use this resource. @@ -878,9 +761,7 @@ def get_users_not_in_group( if filter_users: params = {"filter": filter_users} - url = "rest/api/latest/admin/groups/{}/more-non-members".format( - group_name - ) + url = "rest/api/latest/admin/groups/{}/more-non-members".format(group_name) return self.get(url, params=params) def get_build_queue(self, expand="queuedBuilds"): @@ -892,9 +773,7 @@ def get_build_queue(self, expand="queuedBuilds"): params = {"expand": expand} return self.get("rest/api/latest/queue", params=params) - def get_deployment_users( - self, deployment_id, filter_name=None, start=0, limit=25 - ): + def get_deployment_users(self, deployment_id, filter_name=None, start=0, limit=25): """ Retrieve a list of users with their explicit permissions to given resource. The list can be filtered by some attributes. @@ -911,9 +790,7 @@ def get_deployment_users( resource = "permissions/deployment/{}/users".format(deployment_id) return self.get(self.resource_url(resource), params=params) - def revoke_user_from_deployment( - self, deployment_id, user, permissions=["READ", "WRITE", "BUILD"] - ): + def revoke_user_from_deployment(self, deployment_id, user, permissions=["READ", "WRITE", "BUILD"]): """ Revokes deployment project permissions from a given user. :param deployment_id: @@ -921,9 +798,7 @@ def revoke_user_from_deployment( :param permissions: :return: """ - resource = "permissions/deployment/{}/users/{}".format( - deployment_id, user - ) + resource = "permissions/deployment/{}/users/{}".format(deployment_id, user) return self.delete(self.resource_url(resource), data=permissions) def grant_user_to_deployment(self, deployment_id, user, permissions): @@ -934,14 +809,10 @@ def grant_user_to_deployment(self, deployment_id, user, permissions): :param permissions: :return: """ - resource = "permissions/deployment/{}/users/{}".format( - deployment_id, user - ) + resource = "permissions/deployment/{}/users/{}".format(deployment_id, user) return self.put(self.resource_url(resource), data=permissions) - def get_deployment_groups( - self, deployment_id, filter_name=None, start=0, limit=25 - ): + def get_deployment_groups(self, deployment_id, filter_name=None, start=0, limit=25): """ Retrieve a list of groups with their deployment project permissions. The list can be filtered by some attributes. @@ -958,9 +829,7 @@ def get_deployment_groups( resource = "permissions/deployment/{}/groups".format(deployment_id) return self.get(self.resource_url(resource), params=params) - def revoke_group_from_deployment( - self, deployment_id, group, permissions=["READ", "WRITE", "BUILD"] - ): + def revoke_group_from_deployment(self, deployment_id, group, permissions=["READ", "WRITE", "BUILD"]): """ Revokes deployment project permissions from a given group. :param deployment_id: @@ -968,9 +837,7 @@ def revoke_group_from_deployment( :param permissions: :return: """ - resource = "permissions/deployment/{}/groups/{}".format( - deployment_id, group - ) + resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group) return self.delete(self.resource_url(resource), data=permissions) def grant_group_to_deployment(self, deployment_id, group, permissions): @@ -981,14 +848,10 @@ def grant_group_to_deployment(self, deployment_id, group, permissions): :param permissions: :return: """ - resource = "permissions/deployment/{}/groups/{}".format( - deployment_id, group - ) + resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group) return self.put(self.resource_url(resource), data=permissions) - def get_environment_users( - self, environment_id, filter_name=None, start=0, limit=25 - ): + def get_environment_users(self, environment_id, filter_name=None, start=0, limit=25): """ Retrieve a list of users with their explicit permissions to given resource. The list can be filtered by some attributes. @@ -1005,9 +868,7 @@ def get_environment_users( resource = "permissions/environment/{}/users".format(environment_id) return self.get(self.resource_url(resource), params=params) - def revoke_user_from_environment( - self, environment_id, user, permissions=["READ", "WRITE", "BUILD"] - ): + def revoke_user_from_environment(self, environment_id, user, permissions=["READ", "WRITE", "BUILD"]): """ Revokes deployment environment permissions from a given user. :param environment_id: @@ -1015,9 +876,7 @@ def revoke_user_from_environment( :param permissions: :return: """ - resource = "permissions/environment/{}/users/{}".format( - environment_id, user - ) + resource = "permissions/environment/{}/users/{}".format(environment_id, user) return self.delete(self.resource_url(resource), data=permissions) def grant_user_to_environment(self, environment_id, user, permissions): @@ -1028,14 +887,10 @@ def grant_user_to_environment(self, environment_id, user, permissions): :param permissions: :return: """ - resource = "permissions/environment/{}/users/{}".format( - environment_id, user - ) + resource = "permissions/environment/{}/users/{}".format(environment_id, user) return self.put(self.resource_url(resource), data=permissions) - def get_environment_groups( - self, environment_id, filter_name=None, start=0, limit=25 - ): + def get_environment_groups(self, environment_id, filter_name=None, start=0, limit=25): """ Retrieve a list of groups with their deployment environment permissions. The list can be filtered by some attributes. @@ -1052,9 +907,7 @@ def get_environment_groups( resource = "permissions/environment/{}/groups".format(environment_id) return self.get(self.resource_url(resource), params=params) - def revoke_group_from_environment( - self, environment_id, group, permissions=["READ", "WRITE", "BUILD"] - ): + def revoke_group_from_environment(self, environment_id, group, permissions=["READ", "WRITE", "BUILD"]): """ Revokes deployment environment permissions from a given group. :param environment_id: @@ -1062,9 +915,7 @@ def revoke_group_from_environment( :param permissions: :return: """ - resource = "permissions/environment/{}/groups/{}".format( - environment_id, group - ) + resource = "permissions/environment/{}/groups/{}".format(environment_id, group) return self.delete(self.resource_url(resource), data=permissions) def grant_group_to_environment(self, environment_id, group, permissions): @@ -1075,9 +926,7 @@ def grant_group_to_environment(self, environment_id, group, permissions): :param permissions: :return: """ - resource = "permissions/environment/{}/groups/{}".format( - environment_id, group - ) + resource = "permissions/environment/{}/groups/{}".format(environment_id, group) return self.put(self.resource_url(resource), data=permissions) """Other actions""" @@ -1101,9 +950,7 @@ def agent_is_online(self, agent_id): :param agent_id: Bamboo agent ID (integer number) :return: True/False """ - response = self.get( - self.resource_url("agent/{}/status".format(agent_id)) - ) + response = self.get(self.resource_url("agent/{}/status".format(agent_id))) return response["online"] def agent_enable(self, agent_id): @@ -1131,9 +978,7 @@ def agent_remote(self, online=False): :param online: list only online agents (default False = all) :return: list of agent-describing dictionaries """ - return self.get( - self.resource_url("agent/remote"), params={"online": online} - ) + return self.get(self.resource_url("agent/remote"), params={"online": online}) def agent_details(self, agent_id, expand=None): """ @@ -1146,9 +991,7 @@ def agent_details(self, agent_id, expand=None): params = None if expand: params = {"expand": expand} - return self.get( - self.resource_url("agent/{}".format(agent_id)), params=params - ) + return self.get(self.resource_url("agent/{}".format(agent_id)), params=params) def agent_capabilities(self, agent_id, include_shared=True): """ @@ -1159,8 +1002,7 @@ def agent_capabilities(self, agent_id, include_shared=True): :return: agents """ return self.get( - self.resource_url("agent/{}/capability".format(agent_id)), - params={"includeShared": include_shared}, + self.resource_url("agent/{}/capability".format(agent_id)), params={"includeShared": include_shared}, ) def activity(self): @@ -1178,10 +1020,7 @@ def get_custom_expiry(self, limit=25): def reports(self, max_results=25): params = {"max-results": max_results} return self._get_generator( - self.resource_url("chart/reports"), - elements_key="reports", - element_key="report", - params=params, + self.resource_url("chart/reports"), elements_key="reports", element_key="report", params=params, ) def chart( @@ -1248,9 +1087,7 @@ def get_elastic_instance_logs(self, instance_id): :param instance_id: :return: """ - resource = "/elasticInstances/instance/{instance_id}/logs".format( - instance_id=instance_id - ) + resource = "/elasticInstances/instance/{instance_id}/logs".format(instance_id=instance_id) return self.get(self.resource_url(resource)) def get_elastic_configurations(self): @@ -1277,9 +1114,7 @@ def get_elastic_configuration(self, configuration_id): :return: """ - resource = "elasticConfiguration/{configuration_id}".format( - configuration_id=configuration_id - ) + resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) return self.get(self.resource_url(resource)) def update_elastic_configuration(self, configuration_id, data): @@ -1290,9 +1125,7 @@ def update_elastic_configuration(self, configuration_id, data): :return: """ - resource = "elasticConfiguration/{configuration_id}".format( - configuration_id=configuration_id - ) + resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) return self.put(self.resource_url(resource), data=data) def delete_elastic_configuration(self, configuration_id): @@ -1302,9 +1135,7 @@ def delete_elastic_configuration(self, configuration_id): :return: """ - resource = "elasticConfiguration/{configuration_id}".format( - configuration_id=configuration_id - ) + resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id) return self.delete(self.resource_url(resource)) def get_plugins_info(self): @@ -1328,9 +1159,7 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format( - plugin_key=plugin_key - ) + url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -1341,10 +1170,7 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, + method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -1360,9 +1186,7 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request( - method="GET", path=url, headers=self.safe_mode_headers - ) + return self.request(method="GET", path=url, headers=self.safe_mode_headers) def update_plugin_license(self, plugin_key, raw_license): """ diff --git a/atlassian/bitbucket/__init__.py b/atlassian/bitbucket/__init__.py index 2f61b4152..4b4c26834 100644 --- a/atlassian/bitbucket/__init__.py +++ b/atlassian/bitbucket/__init__.py @@ -15,13 +15,9 @@ def __init__(self, url, *args, **kwargs): if "cloud" not in kwargs and ("bitbucket.org" in url): kwargs["cloud"] = True if "api_version" not in kwargs: - kwargs["api_version"] = ( - "2.0" if "cloud" in kwargs and kwargs["cloud"] else "1.0" - ) + kwargs["api_version"] = "2.0" if "cloud" in kwargs and kwargs["cloud"] else "1.0" if "cloud" in kwargs: - kwargs["api_root"] = ( - "" if "api.bitbucket.org" in url else "rest/api" - ) + kwargs["api_root"] = "" if "api.bitbucket.org" in url else "rest/api" super(Bitbucket, self).__init__(url, *args, **kwargs) @@ -69,19 +65,13 @@ def all_project_administrators(self): :return: A generator object containing a map with the project_key, project_name and project_administrators """ for project in self.project_list(): - log.info( - "Processing project: {0} - {1}".format( - project.get("key"), project.get("name") - ) - ) + log.info("Processing project: {0} - {1}".format(project.get("key"), project.get("name"))) yield { "project_key": project.get("key"), "project_name": project.get("name"), "project_administrators": [ {"email": x["emailAddress"], "name": x["displayName"]} - for x in self.project_users_with_administrator_permissions( - project["key"] - ) + for x in self.project_users_with_administrator_permissions(project["key"]) ], } @@ -90,9 +80,7 @@ def reindex(self): Rebuild the bundled Elasticsearch indexes for Bitbucket Server :return: """ - url = self.resource_url( - "sync", api_root="rest/indexing", api_version="latest" - ) + url = self.resource_url("sync", api_root="rest/indexing", api_version="latest") return self.post(url) def check_reindexing_status(self): @@ -100,9 +88,7 @@ def check_reindexing_status(self): Check reindexing status :return: """ - url = self.resource_url( - "status", api_root="rest/indexing", api_version="latest" - ) + url = self.resource_url("status", api_root="rest/indexing", api_version="latest") return self.get(url) def get_users(self, user_filter=None, limit=25, start=0): @@ -215,10 +201,7 @@ def get_associated_build_statuses(self, commit): :commit: str- commit id :return: """ - url = self.resource_url( - "commits/{commitId}".format(commitId=commit), - api_root="rest/build-status", - ) + url = self.resource_url("commits/{commitId}".format(commitId=commit), api_root="rest/build-status",) return self.get(url) def _url_announcement_banner(self): @@ -262,10 +245,7 @@ def upload_plugin(self, plugin_path): :return: """ upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, + method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={}".format(upm_token) files = {"plugin": open(plugin_path, "rb")} @@ -282,9 +262,7 @@ def get_categories(self, project_key, repository_slug=None): url = "project/{}".format(project_key) if repository_slug: url = "{}/repository/{}".format(url, repository_slug) - url = self.resource_url( - url, api_root="rest/categories", api_version="latest" - ) + url = self.resource_url(url, api_root="rest/categories", api_version="latest") data = self.get(url) return data.get("result").get("categories") @@ -327,9 +305,7 @@ def create_project(self, key, name, description=""): ################################################################################################ def _url_project(self, project_key, api_root=None, api_version=None): - return "{}/{}".format( - self._url_projects(api_root, api_version), project_key - ) + return "{}/{}".format(self._url_projects(api_root, api_version), project_key) def project(self, key): """ @@ -459,18 +435,14 @@ def project_users_with_administrator_permissions(self, key): :return: List of project administrators """ project_administrators = [ - user["user"] - for user in self.project_users(key) - if user["permission"] == "PROJECT_ADMIN" + user["user"] for user in self.project_users(key) if user["permission"] == "PROJECT_ADMIN" ] for group in self.project_groups_with_administrator_permissions(key): for user in self.group_members(group): project_administrators.append(user) return project_administrators - def project_grant_user_permissions( - self, project_key, username, permission - ): + def project_grant_user_permissions(self, project_key, username, permission): """ Grant the specified project permission to a specific user :param project_key: The project key @@ -519,9 +491,7 @@ def project_groups(self, key, start=0, limit=None, filter_str=None): params["filter"] = filter_str return self._get_paged(url, params=params) - def project_grant_group_permissions( - self, project_key, group_name, permission - ): + def project_grant_group_permissions(self, project_key, group_name, permission): """ Grant the specified project permission to a specific group :param project_key: The project key @@ -555,9 +525,7 @@ def project_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format( - self._url_project(project_key), permission - ) + url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) return self.get(url) def project_grant_default_permissions(self, project_key, permission): @@ -567,9 +535,7 @@ def project_grant_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format( - self._url_project(project_key), permission - ) + url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) return self.post(url, params={"allow": True}) def project_remove_default_permissions(self, project_key, permission): @@ -579,17 +545,13 @@ def project_remove_default_permissions(self, project_key, permission): :param permission: the project permissions available are 'PROJECT_ADMIN', 'PROJECT_WRITE' and 'PROJECT_READ' :return: """ - url = "{}/permissions/{}/all".format( - self._url_project(project_key), permission - ) + url = "{}/permissions/{}/all".format(self._url_project(project_key), permission) return self.post(url, params={"allow": False}) def _url_project_repo_hook_settings(self, project_key): return "{}/settings/hooks".format(self._url_project(project_key)) - def all_project_repo_hook_settings( - self, project_key, start=0, limit=None, filter_type=None - ): + def all_project_repo_hook_settings(self, project_key, start=0, limit=None, filter_type=None): """ Get all repository hooks for a given project :param project_key: The project key @@ -617,9 +579,7 @@ def get_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}".format( - self._url_project_repo_hook_settings(project_key), hook_key - ) + url = "{}/{}".format(self._url_project_repo_hook_settings(project_key), hook_key) return self.get(url) def enable_project_repo_hook_settings(self, project_key, hook_key): @@ -629,9 +589,7 @@ def enable_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format( - self._url_project_repo_hook_settings(project_key), hook_key - ) + url = "{}/{}/enabled".format(self._url_project_repo_hook_settings(project_key), hook_key) return self.put(url) def disable_project_repo_hook_settings(self, project_key, hook_key): @@ -641,18 +599,12 @@ def disable_project_repo_hook_settings(self, project_key, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format( - self._url_project_repo_hook_settings(project_key), hook_key - ) + url = "{}/{}/enabled".format(self._url_project_repo_hook_settings(project_key), hook_key) return self.delete(url) def _url_project_conditions(self, project_key): return "{}/conditions".format( - self._url_project( - project_key, - api_root="rest/default-reviewers", - api_version="1.0", - ) + self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0",) ) def get_project_conditions(self, project_key): @@ -669,11 +621,7 @@ def get_project_conditions(self, project_key): def _url_project_condition(self, project_key, id_condition=None): url = "{}/condition".format( - self._url_project( - project_key, - api_root="rest/default-reviewers", - api_version="1.0", - ) + self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0",) ) if id_condition is not None: url += "/{}".format(id_condition) @@ -748,9 +696,7 @@ def _url_project_audit_log(self, project_key): if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - return "{}/events".format( - self._url_project(project_key, api_root="rest/audit") - ) + return "{}/events".format(self._url_project(project_key, api_root="rest/audit")) def get_project_audit_log(self, project_key, start=0, limit=None): """ @@ -769,9 +715,7 @@ def get_project_audit_log(self, project_key, start=0, limit=None): return self._get_paged(url, params=params) def _url_repos(self, project_key, api_root=None, api_version=None): - return "{}/repos".format( - self._url_project(project_key, api_root, api_version) - ) + return "{}/repos".format(self._url_project(project_key, api_root, api_version)) def repo_list(self, project_key, start=0, limit=25): """ @@ -798,9 +742,7 @@ def repo_all_list(self, project_key): """ return self.repo_list(project_key, limit=None) - def create_repo( - self, project_key, repository_slug, forkable=False, is_private=True - ): + def create_repo(self, project_key, repository_slug, forkable=False, is_private=True): """Create a new repository. Requires an existing project in which this repository will be created. The only parameters which will be used @@ -836,9 +778,7 @@ def create_repo( ################################################################################################ def _url_repo(self, project_key, repo, api_root=None, api_version=None): - return "{}/{}".format( - self._url_repos(project_key, api_root, api_version), repo - ) + return "{}/{}".format(self._url_repos(project_key, api_root, api_version), repo) def reindex_repo(self, project_key, repository_slug): """ @@ -848,12 +788,7 @@ def reindex_repo(self, project_key, repository_slug): :return: """ url = "{urlRepo}/sync".format( - urlRepo=self._url_repo( - project_key, - repository_slug, - api_root="rest/indexing", - api_version="1.0", - ) + urlRepo=self._url_repo(project_key, repository_slug, api_root="rest/indexing", api_version="1.0",) ) return self.post(url) @@ -867,11 +802,7 @@ def reindex_repo_dev_panel(self, project_key, repository_slug): :param repository_slug: :return: """ - url = "{}/reindex".format( - self._url_repo( - project_key, repository_slug, api_root="rest/jira-dev" - ) - ) + url = "{}/reindex".format(self._url_repo(project_key, repository_slug, api_root="rest/jira-dev")) return self.post(url) def get_repo(self, project_key, repository_slug): @@ -923,9 +854,7 @@ def delete_repo(self, project_key, repository_slug): url = self._url_repo(project_key, repository_slug) return self.delete(url) - def fork_repository( - self, project_key, repository_slug, new_repository_slug - ): + def fork_repository(self, project_key, repository_slug, new_repository_slug): """ Forks a repository within the same project. :param project_key: @@ -941,11 +870,7 @@ def fork_repository( return self.post(url, data=body) def fork_repository_new_project( - self, - project_key, - repository_slug, - new_project_key, - new_repository_slug, + self, project_key, repository_slug, new_project_key, new_repository_slug, ): """ Forks a repository to a separate project. @@ -962,9 +887,7 @@ def fork_repository_new_project( body["project"] = {"key": new_project_key} return self.post(url, data=body) - def repo_keys( - self, project_key, repo_key, start=0, limit=None, filter_str=None - ): + def repo_keys(self, project_key, repo_key, start=0, limit=None, filter_str=None): """ Get SSH access keys added to the repository :param start: @@ -974,9 +897,7 @@ def repo_keys( :param filter_str: OPTIONAL: users filter string :return: """ - url = "{}/ssh".format( - self._url_repo(project_key, repo_key, api_root="rest/keys") - ) + url = "{}/ssh".format(self._url_repo(project_key, repo_key, api_root="rest/keys")) params = {} if start: params["start"] = start @@ -989,9 +910,7 @@ def repo_keys( def _url_repo_users(self, project_key, repo): return "{}/permissions/users".format(self._url_repo(project_key, repo)) - def repo_users( - self, project_key, repo_key, start=0, limit=None, filter_str=None - ): + def repo_users(self, project_key, repo_key, start=0, limit=None, filter_str=None): """ Get users with permission in repository :param start: @@ -1011,9 +930,7 @@ def repo_users( params["filter"] = filter_str return self._get_paged(url, params=params) - def repo_grant_user_permissions( - self, project_key, repo_key, username, permission - ): + def repo_grant_user_permissions(self, project_key, repo_key, username, permission): """ Grant the specified repository permission to a specific user :param project_key: The project key @@ -1043,13 +960,9 @@ def repo_remove_user_permissions(self, project_key, repo_key, username): return self.delete(url, params=params) def _url_repo_groups(self, project_key, repo): - return "{}/permissions/groups".format( - self._url_repo(project_key, repo) - ) + return "{}/permissions/groups".format(self._url_repo(project_key, repo)) - def repo_groups( - self, project_key, repo_key, start=0, limit=None, filter_str=None - ): + def repo_groups(self, project_key, repo_key, start=0, limit=None, filter_str=None): """ Get repository Groups :param start: @@ -1075,11 +988,7 @@ def project_groups_with_administrator_permissions(self, key): :param key: :return: """ - return [ - group["group"]["name"] - for group in self.project_groups(key) - if group["permission"] == "PROJECT_ADMIN" - ] + return [group["group"]["name"] for group in self.project_groups(key) if group["permission"] == "PROJECT_ADMIN"] def repo_users_with_administrator_permissions(self, project_key, repo_key): """ @@ -1092,23 +1001,15 @@ def repo_users_with_administrator_permissions(self, project_key, repo_key): for user in self.repo_users(project_key, repo_key): if user["permission"] == "REPO_ADMIN": repo_administrators.append(user) - for group in self.repo_groups_with_administrator_permissions( - project_key, repo_key - ): + for group in self.repo_groups_with_administrator_permissions(project_key, repo_key): for user in self.group_members(group): repo_administrators.append(user) - for user in self.project_users_with_administrator_permissions( - project_key - ): + for user in self.project_users_with_administrator_permissions(project_key): repo_administrators.append(user) # We convert to a set to ensure uniqueness then back to a list for later useability - return list( - {user["id"]: user for user in repo_administrators}.values() - ) + return list({user["id"]: user for user in repo_administrators}.values()) - def repo_groups_with_administrator_permissions( - self, project_key, repo_key - ): + def repo_groups_with_administrator_permissions(self, project_key, repo_key): """ Get groups with admin permissions :param project_key: @@ -1119,16 +1020,12 @@ def repo_groups_with_administrator_permissions( for group in self.repo_groups(project_key, repo_key): if group["permission"] == "REPO_ADMIN": repo_group_administrators.append(group["group"]["name"]) - for group in self.project_groups_with_administrator_permissions( - project_key - ): + for group in self.project_groups_with_administrator_permissions(project_key): repo_group_administrators.append(group) # We convert to a set to ensure uniqueness, then back to a list for later useability return list(set(repo_group_administrators)) - def repo_grant_group_permissions( - self, project_key, repo_key, groupname, permission - ): + def repo_grant_group_permissions(self, project_key, repo_key, groupname, permission): """ Grant the specified repository permission to a specific group Promote or demote a group's permission level for the specified repository. Available repository permissions are: @@ -1150,9 +1047,7 @@ def repo_grant_group_permissions( params = {"permission": permission, "name": groupname} return self.put(url, params=params) - def repo_remove_group_permissions( - self, project_key, repo_key, groupname, permission - ): + def repo_remove_group_permissions(self, project_key, repo_key, groupname, permission): """ Revoke all permissions for the specified repository for a group. The authenticated user must have REPO_ADMIN permission for the specified repository @@ -1204,13 +1099,9 @@ def _url_repo_audit_log(self, project_key, repository_slug): if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - return "{}/events".format( - self._url_repo(project_key, repository_slug, api_root="rest/audit") - ) + return "{}/events".format(self._url_repo(project_key, repository_slug, api_root="rest/audit")) - def get_repo_audit_log( - self, project_key, repository_slug, start=0, limit=None - ): + def get_repo_audit_log(self, project_key, repository_slug, start=0, limit=None): """ Get the audit log of the repository :param start: @@ -1228,9 +1119,7 @@ def get_repo_audit_log( return self._get_paged(url, params=params) def _url_repo_branches(self, project_key, repository_slug, api_root=None): - return "{}/branches".format( - self._url_repo(project_key, repository_slug, api_root=api_root) - ) + return "{}/branches".format(self._url_repo(project_key, repository_slug, api_root=api_root)) def get_branches( self, @@ -1273,9 +1162,7 @@ def get_branches( return self._get_paged(url, params=params) def _url_repo_default_branche(self, project_key, repository_slug): - return "{}/default".format( - self._url_repo_branches(project_key, repository_slug) - ) + return "{}/default".format(self._url_repo_branches(project_key, repository_slug)) def get_default_branch(self, project_key, repository_slug): """ @@ -1288,9 +1175,7 @@ def get_default_branch(self, project_key, repository_slug): url = self._url_repo_default_branche(project_key, repository_slug) return self.get(url) - def set_default_branch( - self, project_key, repository_slug, ref_branch_name - ): + def set_default_branch(self, project_key, repository_slug, ref_branch_name): """ Update the default branch of a repository. The authenticated user must have REPO_ADMIN permission for the specified repository to call this resource. @@ -1303,9 +1188,7 @@ def set_default_branch( data = {"id": ref_branch_name} return self.put(url, data=data) - def create_branch( - self, project_key, repository_slug, name, start_point, message="" - ): + def create_branch(self, project_key, repository_slug, name, start_point, message=""): """Creates a branch using the information provided in the request. The authenticated user must have REPO_WRITE permission for the context repository to call this resource. @@ -1329,9 +1212,7 @@ def create_branch( data = {"name": name, "startPoint": start_point, "message": message} return self.post(url, data=data) - def delete_branch( - self, project_key, repository_slug, name, end_point=None - ): + def delete_branch(self, project_key, repository_slug, name, end_point=None): """ Delete branch from related repo :param self: @@ -1341,9 +1222,7 @@ def delete_branch( :param end_point: :return: """ - url = self._url_repo_branches( - project_key, repository_slug, api_root="rest/branch-utils" - ) + url = self._url_repo_branches(project_key, repository_slug, api_root="rest/branch-utils") data = {"name": str(name)} if end_point: data["endPoint"] = end_point @@ -1351,22 +1230,12 @@ def delete_branch( def _url_repo_tags(self, project_key, repository_slug, api_root=None): if self.cloud: - return "{}/refs/tags".format( - self._url_repo(project_key, repository_slug, api_root=api_root) - ) + return "{}/refs/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root)) else: - return "{}/tags".format( - self._url_repo(project_key, repository_slug, api_root=api_root) - ) + return "{}/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root)) def get_tags( - self, - project_key, - repository_slug, - filter="", - limit=1000, - order_by=None, - start=0, + self, project_key, repository_slug, filter="", limit=1000, order_by=None, start=0, ): """ Retrieve the tags matching the supplied filterText param. @@ -1409,12 +1278,7 @@ def get_project_tags(self, project_key, repository_slug, tag_name=None): return self._get_paged(url) def set_tag( - self, - project_key, - repository_slug, - tag_name, - commit_revision, - description=None, + self, project_key, repository_slug, tag_name, commit_revision, description=None, ): """ Creates a tag using the information provided in the {@link RestCreateTagRequest request} @@ -1445,26 +1309,14 @@ def delete_tag(self, project_key, repository_slug, tag_name): :param tag_name: :return: """ - url = "{}/{}".format( - self._url_repo_tags( - project_key, repository_slug, api_root="rest/git" - ), - tag_name, - ) + url = "{}/{}".format(self._url_repo_tags(project_key, repository_slug, api_root="rest/git"), tag_name,) return self.delete(url) def _url_repo_hook_settings(self, project_key, repository_slug): - return "{}/settings/hooks".format( - self._url_repo(project_key, repository_slug) - ) + return "{}/settings/hooks".format(self._url_repo(project_key, repository_slug)) def all_repo_hook_settings( - self, - project_key, - repository_slug, - start=0, - limit=None, - filter_type=None, + self, project_key, repository_slug, start=0, limit=None, filter_type=None, ): """ Get all repository hooks for a given repo @@ -1495,15 +1347,10 @@ def get_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}".format( - self._url_repo_hook_settings(project_key, repository_slug), - hook_key, - ) + url = "{}/{}".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) return self.get(url) - def enable_repo_hook_settings( - self, project_key, repository_slug, hook_key - ): + def enable_repo_hook_settings(self, project_key, repository_slug, hook_key): """ Enable a repository hook for a given repo :param project_key: The project key @@ -1511,15 +1358,10 @@ def enable_repo_hook_settings( :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format( - self._url_repo_hook_settings(project_key, repository_slug), - hook_key, - ) + url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) return self.put(url) - def disable_repo_hook_settings( - self, project_key, repository_slug, hook_key - ): + def disable_repo_hook_settings(self, project_key, repository_slug, hook_key): """ Disable a repository hook for a given repo :param project_key: The project key @@ -1527,16 +1369,11 @@ def disable_repo_hook_settings( :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format( - self._url_repo_hook_settings(project_key, repository_slug), - hook_key, - ) + url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) return self.delete(url) def _url_webhooks(self, project_key, repository_slug): - return "{}/webhooks".format( - self._url_repo(project_key, repository_slug) - ) + return "{}/webhooks".format(self._url_repo(project_key, repository_slug)) def get_webhooks( self, project_key, repository_slug, event=None, statistics=False, @@ -1558,14 +1395,7 @@ def get_webhooks( return self._get_paged(url, params=params) def create_webhook( - self, - project_key, - repository_slug, - name, - events, - webhook_url, - active, - secret=None, + self, project_key, repository_slug, name, events, webhook_url, active, secret=None, ): """Creates a webhook using the information provided in the request. @@ -1592,9 +1422,7 @@ def create_webhook( return self.post(url, data=body) def _url_webhook(self, project_key, repository_slug, webhook_id): - return "{}/{}".format( - self._url_webhooks(project_key, repository_slug), webhook_id - ) + return "{}/{}".format(self._url_webhooks(project_key, repository_slug), webhook_id) def get_webhook(self, project_key, repository_slug, webhook_id): """ @@ -1608,9 +1436,7 @@ def get_webhook(self, project_key, repository_slug, webhook_id): url = self._url_webhook(project_key, repository_slug, webhook_id) return self.get(url) - def update_webhook( - self, project_key, repository_slug, webhook_id, **params - ): + def update_webhook(self, project_key, repository_slug, webhook_id, **params): """ Update a webhook. The authenticated user must have REPO_ADMIN permission for the context repository to call this resource. @@ -1635,9 +1461,7 @@ def delete_webhook(self, project_key, repository_slug, webhook_id): return self.delete(url) def _url_pull_request_settings(self, project_key, repository_slug): - return "{}/settings/pull-requests".format( - self._url_repo(project_key, repository_slug) - ) + return "{}/settings/pull-requests".format(self._url_repo(project_key, repository_slug)) def get_pull_request_settings(self, project_key, repository_slug): """ @@ -1662,25 +1486,12 @@ def set_pull_request_settings(self, project_key, repository_slug, data): def _url_pull_requests(self, project_key, repository_slug): if self.cloud: - return self.resource_url( - "repositories/{}/{}/pullrequests".format( - project_key, repository_slug - ) - ) + return self.resource_url("repositories/{}/{}/pullrequests".format(project_key, repository_slug)) else: - return "{}/pull-requests".format( - self._url_repo(project_key, repository_slug) - ) + return "{}/pull-requests".format(self._url_repo(project_key, repository_slug)) def get_pull_requests( - self, - project_key, - repository_slug, - state="OPEN", - order="newest", - limit=100, - start=0, - at=None, + self, project_key, repository_slug, state="OPEN", order="newest", limit=100, start=0, at=None, ): """ Get pull requests @@ -1741,19 +1552,11 @@ def open_pull_request( "description": description, "fromRef": { "id": source_branch, - "repository": { - "slug": source_repo, - "name": source_repo, - "project": {"key": source_project}, - }, + "repository": {"slug": source_repo, "name": source_repo, "project": {"key": source_project},}, }, "toRef": { "id": destination_branch, - "repository": { - "slug": dest_repo, - "name": dest_repo, - "project": {"key": dest_project}, - }, + "repository": {"slug": dest_repo, "name": dest_repo, "project": {"key": dest_project},}, }, "reviewers": [], } @@ -1782,10 +1585,7 @@ def create_pull_request(self, project_key, repository_slug, data): return self.post(url, data=data) def _url_pull_request(self, project_key, repository_slug, pull_request_id): - return "{}/{}".format( - self._url_pull_requests(project_key, repository_slug), - pull_request_id, - ) + return "{}/{}".format(self._url_pull_requests(project_key, repository_slug), pull_request_id,) def get_pull_request(self, project_key, repository_slug, pull_request_id): """ @@ -1797,9 +1597,7 @@ def get_pull_request(self, project_key, repository_slug, pull_request_id): :param pull_request_id: the ID of the pull request within the repository :return: """ - url = self._url_pull_request( - project_key, repository_slug, pull_request_id - ) + url = self._url_pull_request(project_key, repository_slug, pull_request_id) return self.get(url) @deprecated(version="1.15.1", reason="Use get_pull_request()") @@ -1810,11 +1608,7 @@ def get_pullrequest(self, *args, **kwargs): return self.get_pull_request(*args, **kwargs) def delete_pull_request( - self, - project_key, - repository_slug, - pull_request_id, - pull_request_version, + self, project_key, repository_slug, pull_request_id, pull_request_version, ): """ Delete a pull request. @@ -1825,19 +1619,12 @@ def delete_pull_request( :param pull_request_version: the version of the pull request :return: """ - url = self._url_pull_request( - project_key, repository_slug, pull_request_id - ) + url = self._url_pull_request(project_key, repository_slug, pull_request_id) data = {"version": pull_request_version} return self.delete(url, data=data) def get_pull_requests_activities( - self, - project_key, - repository_slug, - pull_request_id, - start=0, - limit=None, + self, project_key, repository_slug, pull_request_id, start=0, limit=None, ): """ Get pull requests activities @@ -1848,11 +1635,7 @@ def get_pull_requests_activities( :param start: :return: """ - url = "{}/activities".format( - self._url_pull_request( - project_key, repository_slug, pull_request_id - ) - ) + url = "{}/activities".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) params = {} if start: params["start"] = start @@ -1861,12 +1644,7 @@ def get_pull_requests_activities( return self._get_paged(url, params) def get_pull_requests_changes( - self, - project_key, - repository_slug, - pull_request_id, - start=0, - limit=None, + self, project_key, repository_slug, pull_request_id, start=0, limit=None, ): """ Get pull requests changes @@ -1877,11 +1655,7 @@ def get_pull_requests_changes( :param pull_request_id: the ID of the pull request within the repository :return: """ - url = "{}/changes".format( - self._url_pull_request( - project_key, repository_slug, pull_request_id - ) - ) + url = "{}/changes".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) params = {} if start: params["start"] = start @@ -1890,12 +1664,7 @@ def get_pull_requests_changes( return self._get_paged(url, params) def get_pull_requests_commits( - self, - project_key, - repository_slug, - pull_request_id, - start=0, - limit=None, + self, project_key, repository_slug, pull_request_id, start=0, limit=None, ): """ Get pull requests commits @@ -1908,11 +1677,7 @@ def get_pull_requests_commits( :limit :return: """ - url = "{}/commits".format( - self._url_pull_request( - project_key, repository_slug, pull_request_id - ) - ) + url = "{}/commits".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) params = {} if start: params["start"] = start @@ -1920,21 +1685,11 @@ def get_pull_requests_commits( params["limit"] = limit return self._get_paged(url, params) - def _url_pull_request_participants( - self, project_key, repository_slug, pull_request_id - ): - return "{}/{}/participants".format( - self._url_pull_requests(project_key, repository_slug), - pull_request_id, - ) + def _url_pull_request_participants(self, project_key, repository_slug, pull_request_id): + return "{}/{}/participants".format(self._url_pull_requests(project_key, repository_slug), pull_request_id,) def get_pull_requests_participants( - self, - project_key, - repository_slug, - pull_request_id, - start=0, - limit=None, + self, project_key, repository_slug, pull_request_id, start=0, limit=None, ): """ Get all participants of a pull request @@ -1945,9 +1700,7 @@ def get_pull_requests_participants( :param pull_request_id: :return: """ - url = self._url_pull_request_participants( - project_key, repository_slug, pull_request_id - ) + url = self._url_pull_request_participants(project_key, repository_slug, pull_request_id) params = {} if start: params["start"] = start @@ -1955,9 +1708,7 @@ def get_pull_requests_participants( params["limit"] = limit return self._get_paged(url, params) - def change_reviewed_status( - self, project_key, repository_slug, pull_request_id, status, user_slug - ): + def change_reviewed_status(self, project_key, repository_slug, pull_request_id, status, user_slug): """ Change the current user's status for a pull request. Implicitly adds the user as a participant if they are not already. @@ -1970,10 +1721,7 @@ def change_reviewed_status( :return: """ url = "{}/{}".format( - self._url_pull_request_participants( - project_key, repository_slug, pull_request_id - ), - user_slug, + self._url_pull_request_participants(project_key, repository_slug, pull_request_id), user_slug, ) approved = True if status == "APPROVED" else False data = { @@ -1983,23 +1731,12 @@ def change_reviewed_status( } return self.put(url, data) - def _url_pull_request_comments( - self, project_key, repository_slug, pull_request_id - ): - url = "{}/comments".format( - self._url_pull_request( - project_key, repository_slug, pull_request_id - ) - ) + def _url_pull_request_comments(self, project_key, repository_slug, pull_request_id): + url = "{}/comments".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) return url def add_pull_request_comment( - self, - project_key, - repository_slug, - pull_request_id, - text, - parent_id=None, + self, project_key, repository_slug, pull_request_id, text, parent_id=None, ): """ Add comment into pull request @@ -2011,28 +1748,19 @@ def add_pull_request_comment( :return: """ - url = self._url_pull_request_comments( - project_key, repository_slug, pull_request_id - ) + url = self._url_pull_request_comments(project_key, repository_slug, pull_request_id) body = {"text": text} if parent_id: body["parent"] = {"id": parent_id} return self.post(url, data=body) - def _url_pull_request_comment( - self, project_key, repository_slug, pull_request_id, comment_id - ): + def _url_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id): url = "{}/{}".format( - self._url_pull_request_comments( - project_key, repository_slug, pull_request_id - ), - comment_id, + self._url_pull_request_comments(project_key, repository_slug, pull_request_id), comment_id, ) return url - def get_pull_request_comment( - self, project_key, repository_slug, pull_request_id, comment_id - ): + def get_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id): """ Retrieves a pull request comment. The authenticated user must have REPO_READ permission @@ -2043,19 +1771,11 @@ def get_pull_request_comment( :param comment_id: the ID of the comment to retrieve :return: """ - url = self._url_pull_request_comment( - project_key, repository_slug, pull_request_id, comment_id - ) + url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) return self.get(url) def update_pull_request_comment( - self, - project_key, - repository_slug, - pull_request_id, - comment_id, - comment, - comment_version, + self, project_key, repository_slug, pull_request_id, comment_id, comment, comment_version, ): """ Update the text of a comment. @@ -2065,39 +1785,23 @@ def update_pull_request_comment( that must match the server's version of the comment or the update will fail. """ - url = self._url_pull_request_comment( - project_key, repository_slug, pull_request_id, comment_id - ) + url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) data = {"version": comment_version, "text": comment} return self.put(url, data=data) @deprecated(version="2.4.2", reason="Use delete_pull_request_comment()") def delete_pull_reques_comment( - self, - project_key, - repository_slug, - pull_request_id, - comment_id, - comment_version, + self, project_key, repository_slug, pull_request_id, comment_id, comment_version, ): """ Deprecated name since 2.4.2. Let's use the get_pull_request() """ return self.delete_pull_request_comment( - project_key, - repository_slug, - pull_request_id, - comment_id, - comment_version, + project_key, repository_slug, pull_request_id, comment_id, comment_version, ) def delete_pull_request_comment( - self, - project_key, - repository_slug, - pull_request_id, - comment_id, - comment_version, + self, project_key, repository_slug, pull_request_id, comment_id, comment_version, ): """ Delete a comment. @@ -2107,15 +1811,11 @@ def delete_pull_request_comment( that must match the server's version of the comment or delete will fail. """ - url = self._url_pull_request_comment( - project_key, repository_slug, pull_request_id, comment_id - ) + url = self._url_pull_request_comment(project_key, repository_slug, pull_request_id, comment_id) data = {"version": comment_version} return self.delete(url, params=data) - def decline_pull_request( - self, project_key, repository_slug, pr_id, pr_version - ): + def decline_pull_request(self, project_key, repository_slug, pr_id, pr_version): """ Decline a pull request. The authenticated user must have REPO_READ permission for the repository @@ -2127,9 +1827,7 @@ def decline_pull_request( :param pr_version: 12 :return: """ - url = "{}/decline".format( - self._url_pull_request(project_key, repository_slug, pr_id) - ) + url = "{}/decline".format(self._url_pull_request(project_key, repository_slug, pr_id)) params = {} if not self.cloud: params["version"] = pr_version @@ -2145,11 +1843,7 @@ def get_tasks(self, project_key, repository_slug, pull_request_id): """ if self.cloud: raise Exception("Not supported in Bitbucket Cloud") - url = "{}/tasks".format( - self._url_pull_request( - project_key, repository_slug, pull_request_id - ) - ) + url = "{}/tasks".format(self._url_pull_request(project_key, repository_slug, pull_request_id)) return self.get(url) def _url_tasks(self): @@ -2205,9 +1899,7 @@ def update_task(self, task_id, text=None, state=None): data["state"] = state return self.put(url, data=data) - def is_pull_request_can_be_merged( - self, project_key, repository_slug, pr_id - ): + def is_pull_request_can_be_merged(self, project_key, repository_slug, pr_id): """ Test whether a pull request can be merged. A pull request may not be merged if: @@ -2221,14 +1913,10 @@ def is_pull_request_can_be_merged( :param pr_id: 2341 :return: """ - url = "{}/merge".format( - self._url_pull_request(project_key, repository_slug, pr_id) - ) + url = "{}/merge".format(self._url_pull_request(project_key, repository_slug, pr_id)) return self.get(url) - def merge_pull_request( - self, project_key, repository_slug, pr_id, pr_version - ): + def merge_pull_request(self, project_key, repository_slug, pr_id, pr_version): """ Merge pull request The authenticated user must have REPO_READ permission for the repository @@ -2240,17 +1928,13 @@ def merge_pull_request( :param pr_version: :return: """ - url = "{}/merge".format( - self._url_pull_request(project_key, repository_slug, pr_id) - ) + url = "{}/merge".format(self._url_pull_request(project_key, repository_slug, pr_id)) params = {} if not self.cloud: params["version"] = pr_version return self.post(url, params=params) - def reopen_pull_request( - self, project_key, repository_slug, pr_id, pr_version - ): + def reopen_pull_request(self, project_key, repository_slug, pr_id, pr_version): """ Re-open a declined pull request. The authenticated user must have REPO_READ permission for the repository @@ -2262,9 +1946,7 @@ def reopen_pull_request( :param pr_version: 12 :return: """ - url = "{}/reopen".format( - self._url_pull_request(project_key, repository_slug, pr_id) - ) + url = "{}/reopen".format(self._url_pull_request(project_key, repository_slug, pr_id)) params = {"version": pr_version} return self.post(url, params=params) @@ -2295,9 +1977,7 @@ def _url_repo_compare(self, project_key, repository_slug): url = "{}/compare".format(self._url_repo(project_key, repository_slug)) return url - def get_diff( - self, project_key, repository_slug, path, hash_oldest, hash_newest - ): + def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest): """ Gets a diff of the changes available in the {@code from} commit but not in the {@code to} commit. If either the {@code from} or {@code to} commit are not specified, @@ -2309,9 +1989,7 @@ def get_diff( :param hash_newest: the target commit (can be a partial/full commit ID or qualified/unqualified ref name) :return: """ - url = "{}/diff/{}".format( - self._url_repo_compare(project_key, repository_slug), path - ) + url = "{}/diff/{}".format(self._url_repo_compare(project_key, repository_slug), path) params = {} if hash_oldest: params["from"] = hash_oldest @@ -2319,16 +1997,9 @@ def get_diff( params["to"] = hash_newest return (self.get(url, params=params) or {}).get("diffs") - def _url_commits( - self, project_key, repository_slug, api_root=None, api_version=None - ): + def _url_commits(self, project_key, repository_slug, api_root=None, api_version=None): return "{}/commits".format( - self._url_repo( - project_key, - repository_slug, - api_root=api_root, - api_version=api_version, - ) + self._url_repo(project_key, repository_slug, api_root=api_root, api_version=api_version,) ) def get_commits( @@ -2382,21 +2053,10 @@ def get_commits( return self._get_paged(url, params=params) def _url_commit( - self, - project_key, - repository_slug, - commit_id, - api_root=None, - api_version=None, + self, project_key, repository_slug, commit_id, api_root=None, api_version=None, ): return "{}/{}".format( - self._url_commits( - project_key, - repository_slug, - api_root=api_root, - api_version=api_version, - ), - commit_id, + self._url_commits(project_key, repository_slug, api_root=api_root, api_version=api_version,), commit_id, ) def get_commit_info(self, project_key, repository_slug, commit, path=None): @@ -2420,29 +2080,15 @@ def get_commit_info(self, project_key, repository_slug, commit, path=None): params["path"] = path return self.get(url, params=params) - def _url_commit_pull_requests( - self, project_key, repository_slug, commit_id - ): - return "{}/pull-requests".format( - self._url_commit(project_key, repository_slug, commit_id) - ) + def _url_commit_pull_requests(self, project_key, repository_slug, commit_id): + return "{}/pull-requests".format(self._url_commit(project_key, repository_slug, commit_id)) - def get_pull_requests_contain_commit( - self, project_key, repository_slug, commit - ): - url = self._url_commit_pull_requests( - project_key, repository_slug, commit - ) + def get_pull_requests_contain_commit(self, project_key, repository_slug, commit): + url = self._url_commit_pull_requests(project_key, repository_slug, commit) return (self.get(url) or {}).get("values") def get_changelog( - self, - project_key, - repository_slug, - ref_from, - ref_to, - start=0, - limit=None, + self, project_key, repository_slug, ref_from, ref_to, start=0, limit=None, ): """ Get change log between 2 refs @@ -2455,9 +2101,7 @@ def get_changelog( fixed system limits. Default by built-in method: None :return: """ - url = "{}/compare/commits".format( - self._url_repo(project_key, repository_slug) - ) + url = "{}/compare/commits".format(self._url_repo(project_key, repository_slug)) params = {} if ref_from: params["from"] = ref_from @@ -2469,23 +2113,13 @@ def get_changelog( params["limit"] = limit return self._get_paged(url, params=params) - def _url_code_insights_annotations( - self, project_key, repository_slug, commit_id, report_key - ): + def _url_code_insights_annotations(self, project_key, repository_slug, commit_id, report_key): return "{}/reports/{}/annotations".format( - self._url_commit( - project_key, - repository_slug, - commit_id, - api_root="rest/insights", - api_version="1.0", - ), + self._url_commit(project_key, repository_slug, commit_id, api_root="rest/insights", api_version="1.0",), report_key, ) - def add_code_insights_annotations_to_report( - self, project_key, repository_slug, commit_id, report_key, annotations - ): + def add_code_insights_annotations_to_report(self, project_key, repository_slug, commit_id, report_key, annotations): """ Adds annotations to an existing insight report. For further information visit: @@ -2496,29 +2130,17 @@ def add_code_insights_annotations_to_report( :report_key: str :annotations: list """ - url = self._url_code_insights_annotations( - project_key, repository_slug, commit_id, report_key - ) + url = self._url_code_insights_annotations(project_key, repository_slug, commit_id, report_key) data = {"annotations": annotations} return self.post(url, data=data) - def _url_code_insights_report( - self, project_key, repository_slug, commit_id, report_key - ): + def _url_code_insights_report(self, project_key, repository_slug, commit_id, report_key): return "{}/reports/{}".format( - self._url_commit( - project_key, - repository_slug, - commit_id, - api_root="rest/insights", - api_version="1.0", - ), + self._url_commit(project_key, repository_slug, commit_id, api_root="rest/insights", api_version="1.0",), report_key, ) - def get_code_insights_report( - self, project_key, repository_slug, commit_id, report_key - ): + def get_code_insights_report(self, project_key, repository_slug, commit_id, report_key): """ Retrieve the specified code-insights report. :projectKey: str @@ -2526,14 +2148,10 @@ def get_code_insights_report( :commitId: str :report_key: str """ - url = self._url_code_insights_report( - project_key, repository_slug, commit_id, report_key - ) + url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) return self.get(url) - def delete_code_insights_report( - self, project_key, repository_slug, commit_id, report_key - ): + def delete_code_insights_report(self, project_key, repository_slug, commit_id, report_key): """ Delete a report for the given commit. Also deletes any annotations associated with this report. :projectKey: str @@ -2541,19 +2159,11 @@ def delete_code_insights_report( :commitId: str :report_key: str """ - url = self._url_code_insights_report( - project_key, repository_slug, commit_id, report_key - ) + url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) return self.delete(url) def create_code_insights_report( - self, - project_key, - repository_slug, - commit_id, - report_key, - report_title, - **report_params, + self, project_key, repository_slug, commit_id, report_key, report_title, **report_params, ): """ Create a new insight report, or replace the existing one @@ -2569,21 +2179,13 @@ def create_code_insights_report( :report_title: str :report_params: """ - url = self._url_code_insights_report( - project_key, repository_slug, commit_id, report_key - ) + url = self._url_code_insights_report(project_key, repository_slug, commit_id, report_key) data = {"title": report_title} data.update(report_params) return self.put(url, data=data) def get_file_list( - self, - project_key, - repository_slug, - sub_folder=None, - query=None, - start=0, - limit=None, + self, project_key, repository_slug, sub_folder=None, query=None, start=0, limit=None, ): """ Retrieve a page of files from particular directory of a repository. @@ -2610,9 +2212,7 @@ def get_file_list( params["limit"] = limit return self._get_paged(url, params=params) - def get_content_of_file( - self, project_key, repository_slug, filename, at=None, markup=None - ): + def get_content_of_file(self, project_key, repository_slug, filename, at=None, markup=None): """ Retrieve the raw content for a file path at a specified revision. The authenticated user must have REPO_READ permission for the specified repository to call this resource. @@ -2624,47 +2224,25 @@ def get_content_of_file( otherwise, if not specified, or any value other than "true" the content is streamed without markup. :return: """ - url = "{}/raw/{}".format( - self._url_repo(project_key, repository_slug), filename - ) + url = "{}/raw/{}".format(self._url_repo(project_key, repository_slug), filename) params = {} if at is not None: params["at"] = at if markup is not None: params["markup"] = markup headers = self.form_token_headers - return self.get( - url, params=params, not_json_response=True, headers=headers - ) + return self.get(url, params=params, not_json_response=True, headers=headers) - def _url_branches_permissions( - self, project_key, permission_id=None, repository_slug=None - ): + def _url_branches_permissions(self, project_key, permission_id=None, repository_slug=None): if repository_slug is None: - base = self._url_project( - project_key, - api_root="rest/branch-permissions", - api_version="2.0", - ) + base = self._url_project(project_key, api_root="rest/branch-permissions", api_version="2.0",) else: - base = self._url_repo( - project_key, - repository_slug, - api_root="rest/branch-permissions", - api_version="2.0", - ) + base = self._url_repo(project_key, repository_slug, api_root="rest/branch-permissions", api_version="2.0",) - return "{}/restrictions/{}".format( - base, "" if permission_id is None else str(permission_id) - ) + return "{}/restrictions/{}".format(base, "" if permission_id is None else str(permission_id)) def get_branches_permissions( - self, - project_key, - permission_id, - repository_slug=None, - start=0, - limit=25, + self, project_key, permission_id, repository_slug=None, start=0, limit=25, ): """ Get branches permissions from a given repo @@ -2675,9 +2253,7 @@ def get_branches_permissions( :param limit: :return: """ - url = self._url_branches_permissions( - project_key, permission_id, repository_slug - ) + url = self._url_branches_permissions(project_key, permission_id, repository_slug) params = {} if limit: params["limit"] = limit @@ -2718,9 +2294,7 @@ def set_branches_permissions( :param limit: :return: """ - url = self._url_branches_permissions( - project_key=project_key, repository_slug=repository_slug - ) + url = self._url_branches_permissions(project_key=project_key, repository_slug=repository_slug) if except_users is None: except_users = [] if except_groups is None: @@ -2737,10 +2311,7 @@ def set_branches_permissions( "matcher": { "id": matcher_value, "displayId": matcher_value, - "type": { - "id": matcher_type.upper(), - "name": matcher_type.capitalize(), - }, + "type": {"id": matcher_type.upper(), "name": matcher_type.capitalize(),}, "active": True, }, "users": except_users, @@ -2750,9 +2321,7 @@ def set_branches_permissions( params = {"start": start, "limit": limit} return self.post(url, data=restriction, params=params, headers=headers) - def delete_branch_permission( - self, project_key, permission_id, repository_slug=None - ): + def delete_branch_permission(self, project_key, permission_id, repository_slug=None): """ Deletes a restriction as specified by a restriction id. The authenticated user must have REPO_ADMIN permission or higher to call this resource. @@ -2762,14 +2331,10 @@ def delete_branch_permission( :param permission_id: :return: """ - url = self._url_branches_permissions( - project_key, permission_id, repository_slug - ) + url = self._url_branches_permissions(project_key, permission_id, repository_slug) return self.delete(url) - def get_branch_permission( - self, project_key, permission_id, repository_slug=None - ): + def get_branch_permission(self, project_key, permission_id, repository_slug=None): """ Returns a restriction as specified by a restriction id. The authenticated user must have REPO_ADMIN permission or higher to call this resource. @@ -2779,14 +2344,10 @@ def get_branch_permission( :param permission_id: :return: """ - url = self._url_branches_permissions( - project_key, permission_id, repository_slug - ) + url = self._url_branches_permissions(project_key, permission_id, repository_slug) return self._get_paged(url) - def all_branches_permissions( - self, project_key, permission_id, repository_slug=None - ): + def all_branches_permissions(self, project_key, permission_id, repository_slug=None): """ Get branches permissions from a given repo :param project_key: @@ -2794,19 +2355,12 @@ def all_branches_permissions( :param repository_slug: :return: """ - url = self._url_branches_permissions( - project_key, permission_id, repository_slug - ) + url = self._url_branches_permissions(project_key, permission_id, repository_slug) return self._get_paged(url) def _url_branching_model(self, project_key, repository_slug): return "{}/branchmodel/configuration".format( - self._url_repo( - project_key, - repository_slug, - api_root="rest/branch-utils", - api_version="1.0", - ) + self._url_repo(project_key, repository_slug, api_root="rest/branch-utils", api_version="1.0",) ) def get_branching_model(self, project_key, repository_slug): @@ -2840,35 +2394,13 @@ def enable_branching_model(self, project_key, repository_slug): default_model_data = { "development": {"refId": None, "useDefault": True}, "types": [ - { - "displayName": "Bugfix", - "enabled": True, - "id": "BUGFIX", - "prefix": "bugfix/", - }, - { - "displayName": "Feature", - "enabled": True, - "id": "FEATURE", - "prefix": "feature/", - }, - { - "displayName": "Hotfix", - "enabled": True, - "id": "HOTFIX", - "prefix": "hotfix/", - }, - { - "displayName": "Release", - "enabled": True, - "id": "RELEASE", - "prefix": "release/", - }, + {"displayName": "Bugfix", "enabled": True, "id": "BUGFIX", "prefix": "bugfix/",}, + {"displayName": "Feature", "enabled": True, "id": "FEATURE", "prefix": "feature/",}, + {"displayName": "Hotfix", "enabled": True, "id": "HOTFIX", "prefix": "hotfix/",}, + {"displayName": "Release", "enabled": True, "id": "RELEASE", "prefix": "release/",}, ], } - return self.set_branching_model( - project_key, repository_slug, default_model_data - ) + return self.set_branching_model(project_key, repository_slug, default_model_data) def disable_branching_model(self, project_key, repository_slug): """ @@ -2877,18 +2409,12 @@ def disable_branching_model(self, project_key, repository_slug): :param repository_slug: :return: """ - return self.delete( - self._url_branching_model(project_key, repository_slug) - ) + return self.delete(self._url_branching_model(project_key, repository_slug)) def _url_file(self, project_key, repository_slug, filename): - return "{}/browse/{}".format( - self._url_repo(project_key, repository_slug), filename - ) + return "{}/browse/{}".format(self._url_repo(project_key, repository_slug), filename) - def upload_file( - self, project_key, repository_slug, content, message, branch, filename - ): + def upload_file(self, project_key, repository_slug, content, message, branch, filename): """ Upload new file for given branch. :param project_key: @@ -2904,14 +2430,7 @@ def upload_file( return self.put(url, files=data) def update_file( - self, - project_key, - repository_slug, - content, - message, - branch, - filename, - source_commit_id, + self, project_key, repository_slug, content, message, branch, filename, source_commit_id, ): """ Update existing file for given branch. @@ -2940,14 +2459,7 @@ def search_code(self, team, search_query, page=1, limit=10): :search_query: str """ url = self.resource_url("teams/{team}/search/code".format(team=team)) - return self.get( - url, - params={ - "search_query": search_query, - "page": page, - "pagelen": limit, - }, - ) + return self.get(url, params={"search_query": search_query, "page": page, "pagelen": limit,},) def get_lfs_repo_status(self, project_key, repo): url = "rest/git-lfs/admin/projects/{projectKey}/repos/{repositorySlug}/enabled".format( @@ -2966,12 +2478,7 @@ def set_lfs_repo_status(self, project_key, repo, enable=True): def _url_repo_conditions(self, project_key, repo_key): return "{}/conditions".format( - self._url_repo( - project_key, - repo_key, - api_root="rest/default-reviewers", - api_version="1.0", - ) + self._url_repo(project_key, repo_key, api_root="rest/default-reviewers", api_version="1.0",) ) def get_repo_conditions(self, project_key, repo_key): @@ -3028,12 +2535,7 @@ def get_repo_repo_conditions(self, project_key, repo_key): def _url_repo_condition(self, project_key, repo_key, id_condition=None): return "{}/condition/{}".format( - self._url_repo( - project_key, - repo_key, - api_root="rest/default-reviewers", - api_version="1.0", - ), + self._url_repo(project_key, repo_key, api_root="rest/default-reviewers", api_version="1.0",), "" if id_condition is None else str(id_condition), ) @@ -3072,9 +2574,7 @@ def create_repo_condition(self, project_key, repo_key, condition): url = self._url_repo_condition(project_key, repo_key) return self.post(url, data=condition) or {} - def update_repo_condition( - self, project_key, repo_key, condition, id_condition - ): + def update_repo_condition(self, project_key, repo_key, condition, id_condition): """ Request type: PUT Update a specific condition for this repository slug inside project. @@ -3153,15 +2653,12 @@ def download_repo_archive( if prefix is not None: params["prefix"] = prefix headers = {"Accept": "*/*"} - response = self.get( - url, params=params, headers=headers, advanced_mode=True - ) + response = self.get(url, params=params, headers=headers, advanced_mode=True) for chunk in response.iter_content(chunk_size=chunk_size): dest_fd.write(chunk) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_repositories(self, workspace, role=None, query=None, sort=None): """ @@ -3181,12 +2678,9 @@ def get_repositories(self, workspace, role=None, query=None, sort=None): ] @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipelines( - self, workspace, repository_slug, number=10, sort_by="-created_on" - ): + def get_pipelines(self, workspace, repository_slug, number=10, sort_by="-created_on"): """ Get information about latest pipelines runs. @@ -3211,16 +2705,10 @@ def get_pipelines( return values @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def trigger_pipeline( - self, - workspace, - repository_slug, - branch="master", - revision=None, - name=None, + self, workspace, repository_slug, branch="master", revision=None, name=None, ): """ Trigger a new pipeline. The following options are possible (1 and 2 @@ -3240,8 +2728,7 @@ def trigger_pipeline( ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline(self, workspace, repository_slug, uuid): """ @@ -3259,8 +2746,7 @@ def get_pipeline(self, workspace, repository_slug, uuid): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def stop_pipeline(self, workspace, repository_slug, uuid): """ @@ -3280,8 +2766,7 @@ def stop_pipeline(self, workspace, repository_slug, uuid): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline_steps(self, workspace, repository_slug, uuid): """ @@ -3303,12 +2788,9 @@ def get_pipeline_steps(self, workspace, repository_slug, uuid): return values @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipeline_step( - self, workspace, repository_slug, pipeline_uuid, step_uuid - ): + def get_pipeline_step(self, workspace, repository_slug, pipeline_uuid, step_uuid): """ Get information about a step of a pipeline, specified by respective UUIDs. :param workspace: @@ -3326,12 +2808,9 @@ def get_pipeline_step( ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_pipeline_step_log( - self, workspace, repository_slug, pipeline_uuid, step_uuid - ): + def get_pipeline_step_log(self, workspace, repository_slug, pipeline_uuid, step_uuid): """ Get log of a step of a pipeline, specified by respective UUIDs. :param workspace: @@ -3350,17 +2829,10 @@ def get_pipeline_step_log( ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def create_issue( - self, - workspace, - repository_slug, - title, - description="", - kind="bug", - priority="major", + self, workspace, repository_slug, title, description="", kind="bug", priority="major", ): """ Create a new issue in the issue tracker of the given repository. @@ -3375,18 +2847,12 @@ def create_issue( Cloud(self.url, **self._new_session_args) .workspaces.get(workspace) .repositories.get(repository_slug) - .issues.create( - title=title, - description=description, - kind=kind, - priority=priority, - ) + .issues.create(title=title, description=description, kind=kind, priority=priority,) .data ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_issues(self, workspace, repository_slug, sort_by=None, query=None): """ @@ -3413,8 +2879,7 @@ def get_issues(self, workspace, repository_slug, sort_by=None, query=None): return values @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_issue(self, workspace, repository_slug, id): """ @@ -3429,8 +2894,7 @@ def get_issue(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def update_issue(self, workspace, repository_slug, id, **fields): """ @@ -3447,8 +2911,7 @@ def update_issue(self, workspace, repository_slug, id, **fields): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_issue(self, workspace, repository_slug, id): """ @@ -3463,8 +2926,7 @@ def delete_issue(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def add_branch_restriction( self, @@ -3516,12 +2978,9 @@ def add_branch_restriction( ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def get_branch_restrictions( - self, workspace, repository_slug, kind=None, pattern=None, number=10 - ): + def get_branch_restrictions(self, workspace, repository_slug, kind=None, pattern=None, number=10): """ Get all branch permissions. """ @@ -3539,12 +2998,9 @@ def get_branch_restrictions( return values @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) - def update_branch_restriction( - self, workspace, repository_slug, id, **fields - ): + def update_branch_restriction(self, workspace, repository_slug, id, **fields): """ Update an existing branch restriction identified by ``id``. Consult the official API documentation for valid fields. @@ -3559,8 +3015,7 @@ def update_branch_restriction( ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_branch_restriction(self, workspace, repository_slug, id): """ @@ -3575,8 +3030,7 @@ def delete_branch_restriction(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def add_default_reviewer(self, workspace, repository_slug, user): """ @@ -3596,8 +3050,7 @@ def add_default_reviewer(self, workspace, repository_slug, user): ) @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_default_reviewers(self, workspace, repository_slug, number=10): """ @@ -3617,8 +3070,7 @@ def get_default_reviewers(self, workspace, repository_slug, number=10): return values @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def is_default_reviewer(self, workspace, repository_slug, user): """ @@ -3641,8 +3093,7 @@ def is_default_reviewer(self, workspace, repository_slug, user): return True @deprecated( - version="2.0.2", - reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_default_reviewer(self, workspace, repository_slug, user): """ diff --git a/atlassian/bitbucket/base.py b/atlassian/bitbucket/base.py index 479bb645e..ae5053e13 100644 --- a/atlassian/bitbucket/base.py +++ b/atlassian/bitbucket/base.py @@ -31,25 +31,15 @@ def __init__(self, url, *args, **kwargs): url = self.get_link("self") if isinstance(url, list): # Server has a list of links url = url[0] - self.timeformat_lambda = kwargs.pop( - "timeformat_lambda", lambda x: self._default_timeformat_lambda(x) - ) + self.timeformat_lambda = kwargs.pop("timeformat_lambda", lambda x: self._default_timeformat_lambda(x)) self._check_timeformat_lambda() super(BitbucketBase, self).__init__(url, *args, **kwargs) def __str__(self): - return PrettyPrinter(indent=4).pformat( - self.__data if self.__data else self - ) + return PrettyPrinter(indent=4).pformat(self.__data if self.__data else self) def _get_paged( - self, - url, - params=None, - data=None, - flags=None, - trailing=None, - absolute=False, + self, url, params=None, data=None, flags=None, trailing=None, absolute=False, ): """ Used to get the paged data @@ -68,14 +58,7 @@ def _get_paged( params = {} while True: - response = self.get( - url, - trailing=trailing, - params=params, - data=data, - flags=flags, - absolute=absolute, - ) + response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute,) if "values" not in response: return @@ -116,14 +99,11 @@ def _check_timeformat_lambda(self): """ LAMBDA = lambda: 0 # noqa: E731 if self.timeformat_lambda is None or ( - isinstance(self.timeformat_lambda, type(LAMBDA)) - and self.timeformat_lambda.__name__ == LAMBDA.__name__ + isinstance(self.timeformat_lambda, type(LAMBDA)) and self.timeformat_lambda.__name__ == LAMBDA.__name__ ): return True else: - ValueError( - "Expected [None] or [lambda function] for argument [timeformat_func]" - ) + ValueError("Expected [None] or [lambda function] for argument [timeformat_func]") def _sub_url(self, url): """ diff --git a/atlassian/bitbucket/cloud/__init__.py b/atlassian/bitbucket/cloud/__init__.py index ca2f80652..3b156a58f 100644 --- a/atlassian/bitbucket/cloud/__init__.py +++ b/atlassian/bitbucket/cloud/__init__.py @@ -12,12 +12,8 @@ def __init__(self, url="https://api.bitbucket.org/", *args, **kwargs): kwargs["api_version"] = "2.0" url = url.strip("/") + "/{}".format(kwargs["api_version"]) super(Cloud, self).__init__(url, *args, **kwargs) - self.__workspaces = Workspaces( - "{}/workspaces".format(self.url), **self._new_session_args - ) - self.__repositories = Repositories( - "{}/repositories".format(self.url), **self._new_session_args - ) + self.__workspaces = Workspaces("{}/workspaces".format(self.url), **self._new_session_args) + self.__repositories = Repositories("{}/repositories".format(self.url), **self._new_session_args) @property def workspaces(self): diff --git a/atlassian/bitbucket/cloud/base.py b/atlassian/bitbucket/cloud/base.py index ec6bcd78d..d8fdde3ab 100644 --- a/atlassian/bitbucket/cloud/base.py +++ b/atlassian/bitbucket/cloud/base.py @@ -21,14 +21,8 @@ def __init__(self, url, *args, **kwargs): """ expected_type = kwargs.pop("expected_type", None) super(BitbucketCloudBase, self).__init__(url, *args, **kwargs) - if expected_type is not None and not expected_type == self.get_data( - "type" - ): - raise ValueError( - "Expected type of data is [{}], got [{}].".format( - expected_type, self.get_data("type") - ) - ) + if expected_type is not None and not expected_type == self.get_data("type"): + raise ValueError("Expected type of data is [{}], got [{}].".format(expected_type, self.get_data("type"))) def get_link(self, link): """ @@ -44,14 +38,7 @@ def get_link(self, link): return links[link]["href"] def _get_paged( - self, - url, - params=None, - data=None, - flags=None, - trailing=None, - absolute=False, - paging_workaround=False, + self, url, params=None, data=None, flags=None, trailing=None, absolute=False, paging_workaround=False, ): """ Used to get the paged data @@ -75,12 +62,7 @@ def _get_paged( while True: response = super(BitbucketCloudBase, self).get( - url, - trailing=trailing, - params=params, - data=data, - flags=flags, - absolute=absolute, + url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute, ) if len(response.get("values", [])) == 0: return diff --git a/atlassian/bitbucket/cloud/common/builds.py b/atlassian/bitbucket/cloud/common/builds.py index cc7d0e4ad..dfd03efdb 100644 --- a/atlassian/bitbucket/cloud/common/builds.py +++ b/atlassian/bitbucket/cloud/common/builds.py @@ -8,9 +8,7 @@ class Build(BitbucketCloudBase): STATE_SUCCESSFUL = "SUCCESSFUL" def __init__(self, data, *args, **kwargs): - super(Build, self).__init__( - None, None, *args, data=data, expected_type="build", **kwargs - ) + super(Build, self).__init__(None, None, *args, data=data, expected_type="build", **kwargs) @property def key(self): diff --git a/atlassian/bitbucket/cloud/common/comments.py b/atlassian/bitbucket/cloud/common/comments.py index e8a705f25..a51a5e4e0 100644 --- a/atlassian/bitbucket/cloud/common/comments.py +++ b/atlassian/bitbucket/cloud/common/comments.py @@ -5,12 +5,7 @@ class Comment(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): super(Comment, self).__init__( - None, - None, - *args, - data=data, - expected_type="pullrequest_comment", - **kwargs, + None, None, *args, data=data, expected_type="pullrequest_comment", **kwargs, ) @property diff --git a/atlassian/bitbucket/cloud/common/users.py b/atlassian/bitbucket/cloud/common/users.py index 071819c07..51484bc1c 100644 --- a/atlassian/bitbucket/cloud/common/users.py +++ b/atlassian/bitbucket/cloud/common/users.py @@ -3,9 +3,7 @@ class User(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(User, self).__init__( - url, *args, data=data, expected_type="user", **kwargs - ) + super(User, self).__init__(url, *args, data=data, expected_type="user", **kwargs) @property def display_name(self): @@ -39,9 +37,7 @@ class Participant(BitbucketCloudBase): CHANGES_REQUESTED = "changes_requested" def __init__(self, data, *args, **kwargs): - super(Participant, self).__init__( - None, None, *args, data=data, expected_type="participant", **kwargs - ) + super(Participant, self).__init__(None, None, *args, data=data, expected_type="participant", **kwargs) @property def user(self): diff --git a/atlassian/bitbucket/cloud/repositories/__init__.py b/atlassian/bitbucket/cloud/repositories/__init__.py index 1edf953ee..c789784fb 100644 --- a/atlassian/bitbucket/cloud/repositories/__init__.py +++ b/atlassian/bitbucket/cloud/repositories/__init__.py @@ -79,9 +79,7 @@ def get(self, workspace, repo_slug): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/#api-repositories-workspace-repo-slug-get """ - return self._get_object( - super(Repositories, self).get("{}/{}".format(workspace, repo_slug)) - ) + return self._get_object(super(Repositories, self).get("{}/{}".format(workspace, repo_slug))) class WorkspaceRepositories(RepositoriesBase): @@ -97,9 +95,7 @@ class WorkspaceRepositories(RepositoriesBase): def __init__(self, url, *args, **kwargs): super(WorkspaceRepositories, self).__init__(url, *args, **kwargs) - def create( - self, repo_slug, project_key=None, is_private=None, fork_policy=None - ): + def create(self, repo_slug, project_key=None, is_private=None, fork_policy=None): """ Creates a new repository with the given repo_slug. @@ -123,9 +119,7 @@ def create( data["is_private"] = is_private if fork_policy is not None: if fork_policy not in self.FORK_POLICIES: - raise ValueError( - "fork_policy must be one of {}".format(self.FORK_POLICIES) - ) + raise ValueError("fork_policy must be one of {}".format(self.FORK_POLICIES)) data["fork_policy"] = fork_policy return self._get_object(self.post(repo_slug, data=data)) @@ -171,19 +165,13 @@ def get(self, repository, by="slug"): https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D#get """ if by == "slug": - return self._get_object( - super(WorkspaceRepositories, self).get(repository) - ) + return self._get_object(super(WorkspaceRepositories, self).get(repository)) elif by == "name": for r in self.each(): if r.name == repository: return r else: - ValueError( - "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( - by - ) - ) + ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -247,16 +235,10 @@ def get(self, repository, by="slug"): https://developer.atlassian.com/bitbucket/api/2/reference/resource/workspaces/%7Bworkspace%7D/projects/%7Bproject_key%7D#get """ if by not in ("slug", "name"): - ValueError( - "Unknown value '{}' for argument [by], expected 'slug' or 'name'".format( - by - ) - ) + ValueError("Unknown value '{}' for argument [by], expected 'slug' or 'name'".format(by)) for r in self.each(): - if ((by == "slug") and (r.slug == repository)) or ( - (by == "name") and (r.name == repository) - ): + if ((by == "slug") and (r.slug == repository)) or ((by == "name") and (r.name == repository)): return r raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -264,35 +246,21 @@ def get(self, repository, by="slug"): class Repository(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Repository, self).__init__( - None, *args, data=data, expected_type="repository", **kwargs - ) + super(Repository, self).__init__(None, *args, data=data, expected_type="repository", **kwargs) self.__branch_restrictions = BranchRestrictions( "{}/branch-restrictions".format(self.url), **self._new_session_args ) - self.__branches = Branches( - "{}/refs/branches".format(self.url), **self._new_session_args - ) + self.__branches = Branches("{}/refs/branches".format(self.url), **self._new_session_args) self.__commits = Commits( "{}/commits".format(self.url), data={"links": {"commit": {"href": "{}/commit".format(self.url)}}}, **self._new_session_args, ) - self.__default_reviewers = DefaultReviewers( - "{}/default-reviewers".format(self.url), **self._new_session_args - ) - self.__issues = Issues( - "{}/issues".format(self.url), **self._new_session_args - ) - self.__pipelines = Pipelines( - "{}/pipelines".format(self.url), **self._new_session_args - ) - self.__pullrequests = PullRequests( - "{}/pullrequests".format(self.url), **self._new_session_args - ) - self.__tags = Tags( - "{}/refs/tags".format(self.url), **self._new_session_args - ) + self.__default_reviewers = DefaultReviewers("{}/default-reviewers".format(self.url), **self._new_session_args) + self.__issues = Issues("{}/issues".format(self.url), **self._new_session_args) + self.__pipelines = Pipelines("{}/pipelines".format(self.url), **self._new_session_args) + self.__pullrequests = PullRequests("{}/pullrequests".format(self.url), **self._new_session_args) + self.__tags = Tags("{}/refs/tags".format(self.url), **self._new_session_args) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py index ba617e2d3..5ed5711f7 100644 --- a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py +++ b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py @@ -11,14 +11,7 @@ def __get_object(self, data): return BranchRestriction(data, **self._new_session_args) def create( - self, - kind, - branch_match_kind="glob", - branch_pattern="*", - branch_type=None, - users=None, - groups=None, - value=None, + self, kind, branch_match_kind="glob", branch_pattern="*", branch_type=None, users=None, groups=None, value=None, ): """ Add a new branch restriction. @@ -110,9 +103,7 @@ def get(self, id): class BranchRestriction(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(BranchRestriction, self).__init__( - None, *args, data=data, expected_type="branchrestriction", **kwargs - ) + super(BranchRestriction, self).__init__(None, *args, data=data, expected_type="branchrestriction", **kwargs) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/commits.py b/atlassian/bitbucket/cloud/repositories/commits.py index 7bb0aa2e2..8ed4f49d7 100644 --- a/atlassian/bitbucket/cloud/repositories/commits.py +++ b/atlassian/bitbucket/cloud/repositories/commits.py @@ -48,10 +48,7 @@ def get(self, commit_hash): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get """ return self.__get_object( - super(Commits, self).get( - self.url_joiner(self.get_link("commit"), commit_hash), - absolute=True, - ) + super(Commits, self).get(self.url_joiner(self.get_link("commit"), commit_hash), absolute=True,) ) @@ -63,9 +60,7 @@ class Commit(BitbucketCloudBase): """ def __init__(self, data, *args, **kwargs): - super(Commit, self).__init__( - None, *args, data=data, expected_type="commit", **kwargs - ) + super(Commit, self).__init__(None, *args, data=data, expected_type="commit", **kwargs) @property def hash(self): @@ -112,12 +107,7 @@ def builds(self): yield Build(build, **self._new_session_args) def add_build( - self, - key, - url=None, - description=None, - refname=None, - state=Build.STATE_INPROGRESS, + self, key, url=None, description=None, refname=None, state=Build.STATE_INPROGRESS, ): """ Add new build status to commit. @@ -140,10 +130,7 @@ def get_build(self, key): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-get """ - return Build( - super(Commit, self).get(self.url_joiner("statuses/build", key)), - **self._new_session_args, - ) + return Build(super(Commit, self).get(self.url_joiner("statuses/build", key)), **self._new_session_args,) def comments(self): """ diff --git a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py index 19036136b..77401ce15 100644 --- a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py +++ b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py @@ -11,11 +11,7 @@ def __init__(self, url, *args, **kwargs): super(DefaultReviewers, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return DefaultReviewer( - self.url_joiner(self.url, data["uuid"]), - data, - **self._new_session_args, - ) + return DefaultReviewer(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args,) def add(self, user): """ @@ -69,9 +65,7 @@ def get(self, user): """ default_reviewer = None try: - default_reviewer = self.__get_object( - super(DefaultReviewers, self).get(user) - ) + default_reviewer = self.__get_object(super(DefaultReviewers, self).get(user)) except HTTPError as e: # A 404 indicates that the specified user is not a default reviewer. if not e.response.status_code == 404: diff --git a/atlassian/bitbucket/cloud/repositories/diffstat.py b/atlassian/bitbucket/cloud/repositories/diffstat.py index bb5a5c55c..9e73ec775 100644 --- a/atlassian/bitbucket/cloud/repositories/diffstat.py +++ b/atlassian/bitbucket/cloud/repositories/diffstat.py @@ -22,9 +22,7 @@ class DiffStat(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(DiffStat, self).__init__( - None, None, *args, data=data, expected_type="diffstat", **kwargs - ) + super(DiffStat, self).__init__(None, None, *args, data=data, expected_type="diffstat", **kwargs) @property def lines_removed(self): @@ -77,9 +75,7 @@ def __init__(self, data, *args, **kwargs): "links": {}, "type": "commit_file", } - super(CommitFile, self).__init__( - None, None, *args, data=data, expected_type="commit_file", **kwargs - ) + super(CommitFile, self).__init__(None, None, *args, data=data, expected_type="commit_file", **kwargs) @property def path(self): diff --git a/atlassian/bitbucket/cloud/repositories/issues.py b/atlassian/bitbucket/cloud/repositories/issues.py index ea3aea0c6..33629ee69 100644 --- a/atlassian/bitbucket/cloud/repositories/issues.py +++ b/atlassian/bitbucket/cloud/repositories/issues.py @@ -69,9 +69,7 @@ def get(self, id): class Issue(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Issue, self).__init__( - None, *args, data=data, expected_type="issue", **kwargs - ) + super(Issue, self).__init__(None, *args, data=data, expected_type="issue", **kwargs) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/cloud/repositories/pipelines.py b/atlassian/bitbucket/cloud/repositories/pipelines.py index 2ceb98976..dc64515cd 100644 --- a/atlassian/bitbucket/cloud/repositories/pipelines.py +++ b/atlassian/bitbucket/cloud/repositories/pipelines.py @@ -11,15 +11,9 @@ def __init__(self, url, *args, **kwargs): super(Pipelines, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return Pipeline( - self.url_joiner(self.url, data["uuid"]), - data, - **self._new_session_args, - ) + return Pipeline(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args,) - def trigger( - self, branch="master", commit=None, pattern=None, variables=None - ): + def trigger(self, branch="master", commit=None, pattern=None, variables=None): """ Trigger a new pipeline. The following options are possible (1 and 2 trigger the pipeline that the branch is associated with in the Pipelines @@ -42,11 +36,7 @@ def trigger( API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pipelines/#post """ data = { - "target": { - "ref_type": "branch", - "type": "pipeline_ref_target", - "ref_name": branch, - }, + "target": {"ref_type": "branch", "type": "pipeline_ref_target", "ref_name": branch,}, } if commit is not None: data["target"]["commit"] = { @@ -81,9 +71,7 @@ def each(self, q=None, sort=None): params["sort"] = sort if q is not None: params["q"] = q - for pipeline in self._get_paged( - None, trailing=True, paging_workaround=True, params=params, - ): + for pipeline in self._get_paged(None, trailing=True, paging_workaround=True, params=params,): yield self.__get_object(pipeline) return @@ -103,16 +91,10 @@ def get(self, uuid): class Pipeline(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(Pipeline, self).__init__( - url, *args, data=data, expected_type="pipeline", **kwargs - ) + super(Pipeline, self).__init__(url, *args, data=data, expected_type="pipeline", **kwargs) def __get_object(self, data): - return Step( - "{}/steps/{}".format(self.url, data["uuid"]), - data, - **self._new_session_args, - ) + return Step("{}/steps/{}".format(self.url, data["uuid"]), data, **self._new_session_args,) @property def uuid(self): @@ -145,9 +127,7 @@ def pullrequest(self): target = self.get_data("target") if target["type"] == "pipeline_pullrequest_target": return PullRequest( - target["pullrequest"]["links"]["self"]["href"], - target["pullrequest"], - **self._new_session_args, + target["pullrequest"]["links"]["self"]["href"], target["pullrequest"], **self._new_session_args, ) else: return None @@ -186,9 +166,7 @@ def step(self, uuid): class Step(BitbucketCloudBase): def __init__(self, url, data, *args, **kwargs): - super(Step, self).__init__( - url, *args, data=data, expected_type="pipeline_step", **kwargs - ) + super(Step, self).__init__(url, *args, data=data, expected_type="pipeline_step", **kwargs) @property def uuid(self): @@ -243,9 +221,7 @@ def log(self, start=None, end=None): API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pipelines/%7Bpipeline_uuid%7D/steps/%7Bstep_uuid%7D/log#get """ headers = {"Accept": "application/octet-stream"} - if ((start is not None) and (end is None)) or ( - (start is None) and (end is not None) - ): + if ((start is not None) and (end is None)) or ((start is None) and (end is not None)): raise ValueError("For a range [start] and [end] are needed.") if start is not None: start = int(start) @@ -253,9 +229,7 @@ def log(self, start=None, end=None): if (start >= 0) and (start < end): headers["Range"] = "bytes={}-{}".format(start, end) else: - raise ValueError( - "Value of [start] must be o or greater and [end] must be greater than [start]." - ) + raise ValueError("Value of [start] must be o or greater and [end] must be greater than [start].") response = None try: diff --git a/atlassian/bitbucket/cloud/repositories/pullRequests.py b/atlassian/bitbucket/cloud/repositories/pullRequests.py index dadf0bfb5..0a4d6898a 100644 --- a/atlassian/bitbucket/cloud/repositories/pullRequests.py +++ b/atlassian/bitbucket/cloud/repositories/pullRequests.py @@ -19,13 +19,7 @@ def __get_object(self, data): return PullRequest(data, **self._new_session_args) def create( - self, - title, - source_branch, - destination_branch=None, - description=None, - close_source_branch=None, - reviewers=None, + self, title, source_branch, destination_branch=None, description=None, close_source_branch=None, reviewers=None, ): """ Creates a new pull requests for a given source branch @@ -75,9 +69,7 @@ def each(self, q=None, sort=None): if q is not None: params["q"] = q for pr in self._get_paged(None, trailing=True, params=params): - yield self.__get_object( - super(PullRequests, self).get(pr.get("id")) - ) + yield self.__get_object(super(PullRequests, self).get(pr.get("id"))) return @@ -115,9 +107,7 @@ class PullRequest(BitbucketCloudBase): STATE_SUPERSEDED = "SUPERSEDED" def __init__(self, data, *args, **kwargs): - super(PullRequest, self).__init__( - None, *args, data=data, expected_type="pullrequest", **kwargs - ) + super(PullRequest, self).__init__(None, *args, data=data, expected_type="pullrequest", **kwargs) def _check_if_open(self): if not self.is_open: @@ -247,9 +237,7 @@ def patch(self, encoding="utf-8"): API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pullrequests/%7Bpull_request_id%7D/patch """ - return str( - self.get("patch", not_json_response=True), encoding=encoding - ) + return str(self.get("patch", not_json_response=True), encoding=encoding) def statuses(self): """ @@ -386,17 +374,11 @@ def merge(self, merge_strategy=None, close_source_branch=None): """ self._check_if_open() - if ( - merge_strategy is not None - and merge_strategy not in self.MERGE_STRATEGIES - ): - raise ValueError( - "merge_strategy must be {}".format(self.MERGE_STRATEGIES) - ) + if merge_strategy is not None and merge_strategy not in self.MERGE_STRATEGIES: + raise ValueError("merge_strategy must be {}".format(self.MERGE_STRATEGIES)) data = { - "close_source_branch": close_source_branch - or self.close_source_branch, + "close_source_branch": close_source_branch or self.close_source_branch, "merge_strategy": merge_strategy, } @@ -443,9 +425,7 @@ def creator(self): @property def resolved_by(self): """User object with user information of the task resolver""" - return User( - None, self.get_data("resolved_by"), **self._new_session_args - ) + return User(None, self.get_data("resolved_by"), **self._new_session_args) def update(self, raw_message): """ diff --git a/atlassian/bitbucket/cloud/repositories/refs.py b/atlassian/bitbucket/cloud/repositories/refs.py index 84ef1e4dd..806fb5d24 100644 --- a/atlassian/bitbucket/cloud/repositories/refs.py +++ b/atlassian/bitbucket/cloud/repositories/refs.py @@ -110,9 +110,7 @@ class Branch(Ref): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(Branch, self).__init__( - None, *args, data=data, expected_type="branch", **kwargs - ) + super(Branch, self).__init__(None, *args, data=data, expected_type="branch", **kwargs) @property def author(self): @@ -129,9 +127,7 @@ class Tag(Ref): def __init__(self, data, *args, **kwargs): """See BitbucketCloudBase.""" - super(Tag, self).__init__( - None, *args, data=data, expected_type="tag", **kwargs - ) + super(Tag, self).__init__(None, *args, data=data, expected_type="tag", **kwargs) @property def author(self): diff --git a/atlassian/bitbucket/cloud/workspaces/__init__.py b/atlassian/bitbucket/cloud/workspaces/__init__.py index 1ce597e27..ff95f0b1e 100644 --- a/atlassian/bitbucket/cloud/workspaces/__init__.py +++ b/atlassian/bitbucket/cloud/workspaces/__init__.py @@ -83,15 +83,9 @@ def exists(self, workspace): class Workspace(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Workspace, self).__init__( - None, *args, data=data, expected_type="workspace", **kwargs - ) - self.__projects = Projects( - self.get_link("projects"), **self._new_session_args - ) - self.__repositories = WorkspaceRepositories( - self.get_link("repositories"), **self._new_session_args - ) + super(Workspace, self).__init__(None, *args, data=data, expected_type="workspace", **kwargs) + self.__projects = Projects(self.get_link("projects"), **self._new_session_args) + self.__repositories = WorkspaceRepositories(self.get_link("repositories"), **self._new_session_args) @property def name(self): diff --git a/atlassian/bitbucket/cloud/workspaces/projects.py b/atlassian/bitbucket/cloud/workspaces/projects.py index dc091061e..daa821beb 100644 --- a/atlassian/bitbucket/cloud/workspaces/projects.py +++ b/atlassian/bitbucket/cloud/workspaces/projects.py @@ -92,11 +92,7 @@ def get(self, project, by="key"): if p.name == project: return p else: - ValueError( - "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( - by - ) - ) + ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) raise Exception("Unknown project {} '{}'".format(by, project)) @@ -126,19 +122,13 @@ def exists(self, project, by="key"): class Project(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): - super(Project, self).__init__( - None, *args, data=data, expected_type="project", **kwargs - ) + super(Project, self).__init__(None, *args, data=data, expected_type="project", **kwargs) try: url = self.get_link("repositories") except KeyError: workspace = self.get_data("workspace") - url = '{}/?q=project.key="{}"'.format( - workspace["links"]["self"], workspace["slug"] - ) - self.__repositories = ProjectRepositories( - url, **self._new_session_args - ) + url = '{}/?q=project.key="{}"'.format(workspace["links"]["self"], workspace["slug"]) + self.__repositories = ProjectRepositories(url, **self._new_session_args) def update(self, **kwargs): """ diff --git a/atlassian/bitbucket/server/__init__.py b/atlassian/bitbucket/server/__init__.py index 548a687b1..aa5199d56 100644 --- a/atlassian/bitbucket/server/__init__.py +++ b/atlassian/bitbucket/server/__init__.py @@ -15,19 +15,11 @@ def __init__(self, url, *args, **kwargs): kwargs["cloud"] = False kwargs["api_root"] = "rest/api" kwargs["api_version"] = "1.0" - url = url.strip("/") + "/{}/{}".format( - kwargs["api_root"], kwargs["api_version"] - ) + url = url.strip("/") + "/{}/{}".format(kwargs["api_root"], kwargs["api_version"]) super(Server, self).__init__(url, *args, **kwargs) - self.__projects = Projects( - self._sub_url("projects"), **self._new_session_args - ) - self.__groups = Groups( - self._sub_url("admin/permissions/groups"), **self._new_session_args - ) - self.__users = Users( - self._sub_url("admin/permissions/users"), **self._new_session_args - ) + self.__projects = Projects(self._sub_url("projects"), **self._new_session_args) + self.__groups = Groups(self._sub_url("admin/permissions/groups"), **self._new_session_args) + self.__users = Users(self._sub_url("admin/permissions/users"), **self._new_session_args) @property def groups(self): diff --git a/atlassian/bitbucket/server/base.py b/atlassian/bitbucket/server/base.py index 7d23b5f28..565a60924 100644 --- a/atlassian/bitbucket/server/base.py +++ b/atlassian/bitbucket/server/base.py @@ -18,13 +18,7 @@ def get_link(self, link): return [x["href"] for x in links[link]] def _get_paged( - self, - url, - params=None, - data=None, - flags=None, - trailing=False, - absolute=False, + self, url, params=None, data=None, flags=None, trailing=False, absolute=False, ): """ Used to get the paged data @@ -43,12 +37,7 @@ def _get_paged( while True: response = super(BitbucketServerBase, self).get( - url, - trailing=trailing, - params=params, - data=data, - flags=flags, - absolute=absolute, + url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute, ) if "values" not in response: return diff --git a/atlassian/bitbucket/server/common/permissions.py b/atlassian/bitbucket/server/common/permissions.py index 459176366..e9d3a89d2 100644 --- a/atlassian/bitbucket/server/common/permissions.py +++ b/atlassian/bitbucket/server/common/permissions.py @@ -131,19 +131,13 @@ def delete(self): :return: The response on success """ if self.url is None: - raise NotImplementedError( - "Delete not implemented for this object type." - ) - return super(BitbucketServerBase, self).delete( - None, params={"name": self.name} - ) + raise NotImplementedError("Delete not implemented for this object type.") + return super(BitbucketServerBase, self).delete(None, params={"name": self.name}) @property def permission(self): if self.url is None: - raise NotImplementedError( - "Pemission not implemented for this object type." - ) + raise NotImplementedError("Pemission not implemented for this object type.") return self.get_data("permission") @property @@ -164,11 +158,7 @@ def is_read(self): @property def can_write(self): """True if group/user can write""" - return ( - True - if self.permission in (Permissions.ADMIN, Permissions.WRITE) - else False - ) + return True if self.permission in (Permissions.ADMIN, Permissions.WRITE) else False class Group(PermissionBase): diff --git a/atlassian/bitbucket/server/globalPermissions.py b/atlassian/bitbucket/server/globalPermissions.py index 0f36a1bd5..2db8a47d1 100644 --- a/atlassian/bitbucket/server/globalPermissions.py +++ b/atlassian/bitbucket/server/globalPermissions.py @@ -123,26 +123,16 @@ class PermissionBase(BitbucketServerBase): @property def permission(self): if self.url is None: - raise NotImplementedError( - "Permission not implemented for this object type." - ) + raise NotImplementedError("Permission not implemented for this object type.") return self.get_data("permission") @property def is_licensed_user(self): - return ( - True - if self.permission == GlobalPermissions.LICENSED_USER - else False - ) + return True if self.permission == GlobalPermissions.LICENSED_USER else False @property def is_project_create(self): - return ( - True - if self.permission == GlobalPermissions.PROJECT_CREATE - else False - ) + return True if self.permission == GlobalPermissions.PROJECT_CREATE else False @property def is_admin(self): @@ -150,9 +140,7 @@ def is_admin(self): @property def is_sys_admin(self): - return ( - True if self.permission == GlobalPermissions.SYS_ADMIN else False - ) + return True if self.permission == GlobalPermissions.SYS_ADMIN else False def delete(self): """ @@ -161,12 +149,8 @@ def delete(self): :return: The response on success """ if self.url is None: - raise NotImplementedError( - "Delete not implemented for this object type." - ) - return super(PermissionBase, self).delete( - None, params={"name": self.name} - ) + raise NotImplementedError("Delete not implemented for this object type.") + return super(PermissionBase, self).delete(None, params={"name": self.name}) class Group(PermissionBase): diff --git a/atlassian/bitbucket/server/projects/__init__.py b/atlassian/bitbucket/server/projects/__init__.py index c41b2cf47..de9c51b61 100644 --- a/atlassian/bitbucket/server/projects/__init__.py +++ b/atlassian/bitbucket/server/projects/__init__.py @@ -81,11 +81,7 @@ def get(self, project, by="key"): if p.name == project: return p else: - ValueError( - "Unknown value '{}' for argument [by], expected 'key' or 'name'".format( - by - ) - ) + ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by)) raise Exception("Unknown project {} '{}'".format(by, project)) @@ -114,19 +110,9 @@ def exists(self, project, by="key"): class Project(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Project, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups( - self._sub_url("permissions/groups"), - "PROJECT", - **self._new_session_args, - ) - self.__users = Users( - self._sub_url("permissions/users"), - "PROJECT", - **self._new_session_args, - ) - self.__repos = Repositories( - self._sub_url("repos"), **self._new_session_args - ) + self.__groups = Groups(self._sub_url("permissions/groups"), "PROJECT", **self._new_session_args,) + self.__users = Users(self._sub_url("permissions/users"), "PROJECT", **self._new_session_args,) + self.__repos = Repositories(self._sub_url("repos"), **self._new_session_args) def delete(self): """ diff --git a/atlassian/bitbucket/server/projects/repos/__init__.py b/atlassian/bitbucket/server/projects/repos/__init__.py index d17ca0772..a590c25dc 100644 --- a/atlassian/bitbucket/server/projects/repos/__init__.py +++ b/atlassian/bitbucket/server/projects/repos/__init__.py @@ -52,11 +52,7 @@ def get(self, repository, by="slug"): if r.name == repository: return r else: - ValueError( - "Unknown value '{}' for argument [by], expected 'slug' or 'name'".format( - by - ) - ) + ValueError("Unknown value '{}' for argument [by], expected 'slug' or 'name'".format(by)) raise Exception("Unknown repository {} '{}'".format(by, repository)) @@ -85,16 +81,8 @@ def exists(self, repository, by="slug"): class Repository(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Repository, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups( - self._sub_url("permissions/groups"), - "REPO", - **self._new_session_args, - ) - self.__users = Users( - self._sub_url("permissions/users"), - "REPO", - **self._new_session_args, - ) + self.__groups = Groups(self._sub_url("permissions/groups"), "REPO", **self._new_session_args,) + self.__users = Users(self._sub_url("permissions/users"), "REPO", **self._new_session_args,) def __get_object(self, data): return Repository(data, **self._new_session_args) @@ -289,14 +277,7 @@ def users(self): return self.__users def download_archive( - self, - dest_fd, - at=None, - filename=None, - format=None, - path=None, - prefix=None, - chunk_size=128, + self, dest_fd, at=None, filename=None, format=None, path=None, prefix=None, chunk_size=128, ): """ Downloads a repository archive. @@ -326,8 +307,6 @@ def download_archive( if prefix is not None: params["prefix"] = prefix headers = {"Accept": "*/*"} - response = self.get( - "archive", params=params, headers=headers, advanced_mode=True - ) + response = self.get("archive", params=params, headers=headers, advanced_mode=True) for chunk in response.iter_content(chunk_size=chunk_size): dest_fd.write(chunk) diff --git a/atlassian/confluence.py b/atlassian/confluence.py index 5c4b603e3..af6d31341 100644 --- a/atlassian/confluence.py +++ b/atlassian/confluence.py @@ -32,9 +32,7 @@ class Confluence(AtlassianRestAPI): } def __init__(self, url, *args, **kwargs): - if ("atlassian.net" in url or "jira.com" in url) and ( - "/wiki" not in url - ): + if ("atlassian.net" in url or "jira.com" in url) and ("/wiki" not in url): url = AtlassianRestAPI.url_joiner(url, "/wiki") if "cloud" not in kwargs: kwargs["cloud"] = True @@ -49,22 +47,12 @@ def _create_body(body, representation): "storage", "wiki", ]: - raise ValueError( - "Wrong value for representation, it should be either wiki or storage" - ) + raise ValueError("Wrong value for representation, it should be either wiki or storage") - return { - representation: {"value": body, "representation": representation} - } + return {representation: {"value": body, "representation": representation}} def _get_paged( - self, - url, - params=None, - data=None, - flags=None, - trailing=None, - absolute=False, + self, url, params=None, data=None, flags=None, trailing=None, absolute=False, ): """ Used to get the paged data @@ -83,14 +71,7 @@ def _get_paged( params = {} while True: - response = self.get( - url, - trailing=trailing, - params=params, - data=data, - flags=flags, - absolute=absolute, - ) + response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute,) if "results" not in response: return @@ -131,8 +112,7 @@ def page_exists(self, space, title): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -142,9 +122,7 @@ def page_exists(self, space, title): else: return False - def get_page_child_by_type( - self, page_id, type="page", start=None, limit=None, expand=None - ): + def get_page_child_by_type(self, page_id, type="page", start=None, limit=None, expand=None): """ Provide content by type (page, blog, comment) :param page_id: A string containing the id of the type content container. @@ -162,9 +140,7 @@ def get_page_child_by_type( if expand is not None: params["expand"] = expand - url = "rest/api/content/{page_id}/child/{type}".format( - page_id=page_id, type=type - ) + url = "rest/api/content/{page_id}/child/{type}".format(page_id=page_id, type=type) log.info(url) try: @@ -186,9 +162,7 @@ def get_page_child_by_type( raise - def get_child_title_list( - self, page_id, type="page", start=None, limit=None - ): + def get_child_title_list(self, page_id, type="page", start=None, limit=None): """ Find a list of Child title :param page_id: A string containing the id of the type content container. @@ -239,12 +213,9 @@ def get_parent_content_id(self, page_id): """ parent_content_id = None try: - parent_content_id = ( - self.get_page_by_id(page_id=page_id, expand="ancestors").get( - "ancestors" - ) - or {} - )[-1].get("id") or None + parent_content_id = (self.get_page_by_id(page_id=page_id, expand="ancestors").get("ancestors") or {})[ + -1 + ].get("id") or None except Exception as e: log.error(e) return parent_content_id @@ -257,12 +228,9 @@ def get_parent_content_title(self, page_id): """ parent_content_title = None try: - parent_content_title = ( - self.get_page_by_id(page_id=page_id, expand="ancestors").get( - "ancestors" - ) - or {} - )[-1].get("title") or None + parent_content_title = (self.get_page_by_id(page_id=page_id, expand="ancestors").get("ancestors") or {})[ + -1 + ].get("title") or None except Exception as e: log.error(e) return parent_content_title @@ -273,14 +241,9 @@ def get_page_space(self, page_id): :param page_id: content ID :return: """ - return ( - (self.get_page_by_id(page_id, expand="space") or {}).get("space") - or {} - ).get("key") or None + return ((self.get_page_by_id(page_id, expand="space") or {}).get("space") or {}).get("key") or None - def get_pages_by_title( - self, space, title, start=0, limit=200, expand=None - ): + def get_pages_by_title(self, space, title, start=0, limit=200, expand=None): """ Provide pages by title search :param space: Space key @@ -328,19 +291,14 @@ def get_page_by_title(self, space, title, start=0, limit=1, expand=None): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise try: return response.get("results")[0] except (IndexError, TypeError) as e: - log.error( - "Can't find '{title}' page on the {url}!".format( - title=title, url=self.url - ) - ) + log.error("Can't find '{title}' page on the {url}!".format(title=title, url=self.url)) log.debug(e) return None @@ -420,14 +378,7 @@ def get_page_labels(self, page_id, prefix=None, start=None, limit=None): return response def get_page_comments( - self, - content_id, - expand=None, - parent_version=None, - start=0, - limit=25, - location=None, - depth=None, + self, content_id, expand=None, parent_version=None, start=0, limit=25, location=None, depth=None, ): """ @@ -473,17 +424,14 @@ def get_draft_page_by_id(self, page_id, status="draft"): :param status: :return: """ - url = "rest/api/content/{page_id}?status={status}".format( - page_id=page_id, status=status - ) + url = "rest/api/content/{page_id}?status={status}".format(page_id=page_id, status=status) try: response = self.get(url) except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -502,9 +450,7 @@ def get_all_pages_by_label(self, label, start=0, limit=50): url = "rest/api/content/search" params = {} if label: - params["cql"] = 'type={type} AND label="{label}"'.format( - type="page", label=label - ) + params["cql"] = 'type={type} AND label="{label}"'.format(type="page", label=label) if start: params["start"] = start if limit: @@ -521,13 +467,7 @@ def get_all_pages_by_label(self, label, start=0, limit=50): return response.get("results") def get_all_pages_from_space( - self, - space, - start=0, - limit=50, - status=None, - expand=None, - content_type="page", + self, space, start=0, limit=50, status=None, expand=None, content_type="page", ): """ Get all pages from space @@ -565,17 +505,14 @@ def get_all_pages_from_space( except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise return response.get("results") - def get_all_pages_from_space_trash( - self, space, start=0, limit=500, status="trashed", content_type="page" - ): + def get_all_pages_from_space_trash(self, space, start=0, limit=500, status="trashed", content_type="page"): """ Get list of pages from trash :param space: @@ -586,13 +523,9 @@ def get_all_pages_from_space_trash( :param content_type: the content type to return. Default value: page. Valid values: page, blogpost. :return: """ - return self.get_all_pages_from_space( - space, start, limit, status, content_type=content_type - ) + return self.get_all_pages_from_space(space, start, limit, status, content_type=content_type) - def get_all_draft_pages_from_space( - self, space, start=0, limit=500, status="draft" - ): + def get_all_draft_pages_from_space(self, space, start=0, limit=500, status="draft"): """ Get list of draft pages from space Use case is cleanup old drafts from Confluence @@ -605,9 +538,7 @@ def get_all_draft_pages_from_space( """ return self.get_all_pages_from_space(space, start, limit, status) - def get_all_draft_pages_from_space_through_cql( - self, space, start=0, limit=500, status="draft" - ): + def get_all_draft_pages_from_space_through_cql(self, space, start=0, limit=500, status="draft"): """ Search list of draft pages by space key Use case is cleanup old drafts from Confluence @@ -618,9 +549,7 @@ def get_all_draft_pages_from_space_through_cql( fixed system limits. Default: 500 :return: """ - url = "rest/api/content?cql=space=spaceKey={space} and status={status}".format( - space=space, status=status - ) + url = "rest/api/content?cql=space=spaceKey={space} and status={status}".format(space=space, status=status) params = {} if limit: params["limit"] = limit @@ -632,17 +561,14 @@ def get_all_draft_pages_from_space_through_cql( except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise return response.get("results") - @deprecated( - version="2.4.2", reason="Use get_all_restrictions_for_content()" - ) + @deprecated(version="2.4.2", reason="Use get_all_restrictions_for_content()") def get_all_restictions_for_content(self, content_id): """Let's use the get_all_restrictions_for_content()""" log.warning("Please, be informed that is deprecated as typo naming") @@ -691,8 +617,7 @@ def remove_content(self, content_id): ) if e.response.status_code == 409: raise ApiConflictError( - "There is a stale data object conflict when trying to delete a draft", - reason=e, + "There is a stale data object conflict when trying to delete a draft", reason=e, ) raise @@ -728,8 +653,7 @@ def remove_page(self, page_id, status=None, recursive=False): ) if e.response.status_code == 409: raise ApiConflictError( - "There is a stale data object conflict when trying to delete a draft", - reason=e, + "There is a stale data object conflict when trying to delete a draft", reason=e, ) raise @@ -737,15 +661,7 @@ def remove_page(self, page_id, status=None, recursive=False): return response def create_page( - self, - space, - title, - body, - parent_id=None, - type="page", - representation="storage", - editor=None, - full_width=False, + self, space, title, body, parent_id=None, type="page", representation="storage", editor=None, full_width=False, ): """ Create page from scratch @@ -759,11 +675,7 @@ def create_page( :param full_width: DEFAULT: False :return: """ - log.info( - 'Creating {type} "{space}" -> "{title}"'.format( - space=space, title=title, type=type - ) - ) + log.info('Creating {type} "{space}" -> "{title}"'.format(space=space, title=title, type=type)) url = "rest/api/content/" data = { "type": type, @@ -777,19 +689,14 @@ def create_page( if editor is not None and editor in ["v1", "v2"]: data["metadata"]["properties"]["editor"] = {"value": editor} if full_width is True: - data["metadata"]["properties"]["content-appearance-draft"] = { - "value": "full-width" - } - data["metadata"]["properties"]["content-appearance-published"] = { - "value": "full-width" - } + data["metadata"]["properties"]["content-appearance-draft"] = {"value": "full-width"} + data["metadata"]["properties"]["content-appearance-published"] = {"value": "full-width"} try: response = self.post(url, data=data) except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -797,12 +704,7 @@ def create_page( return response def move_page( - self, - space_key, - page_id, - target_id=None, - target_title=None, - position="append", + self, space_key, page_id, target_id=None, target_title=None, position="append", ): """ Move page method @@ -824,14 +726,7 @@ def move_page( return self.post(url, params=params, headers=self.no_check_headers) def create_or_update_template( - self, - name, - body, - template_type="page", - template_id=None, - description=None, - labels=None, - space=None, + self, name, body, template_type="page", template_id=None, description=None, labels=None, space=None, ): """ Creates a new or updates an existing content template. @@ -889,9 +784,7 @@ def get_template_by_id(self, template_id): Get user template by id. Experimental API Use case is get template body and create page from that """ - url = "rest/experimental/template/{template_id}".format( - template_id=template_id - ) + url = "rest/experimental/template/{template_id}".format(template_id=template_id) try: response = self.get(url) @@ -934,9 +827,7 @@ def get_content_template(self, template_id): return response @deprecated(version="3.7.0", reason="Use get_blueprint_templates()") - def get_all_blueprints_from_space( - self, space, start=0, limit=None, expand=None - ): + def get_all_blueprints_from_space(self, space, start=0, limit=None, expand=None): """ Get all users blue prints from space. Experimental API :param space: Space Key @@ -961,17 +852,14 @@ def get_all_blueprints_from_space( except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise return response.get("results") or [] - def get_blueprint_templates( - self, space=None, start=0, limit=None, expand=None - ): + def get_blueprint_templates(self, space=None, start=0, limit=None, expand=None): """ Gets all templates provided by blueprints. @@ -999,8 +887,7 @@ def get_blueprint_templates( except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -1008,9 +895,7 @@ def get_blueprint_templates( return response.get("results") or [] @deprecated(version="3.7.0", reason="Use get_content_templates()") - def get_all_templates_from_space( - self, space, start=0, limit=None, expand=None - ): + def get_all_templates_from_space(self, space, start=0, limit=None, expand=None): """ Get all users templates from space. Experimental API ref: https://docs.atlassian.com/atlassian-confluence/1000.73.0/com/atlassian/confluence/plugins/restapi\ @@ -1037,16 +922,13 @@ def get_all_templates_from_space( except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise return response.get("results") or [] - def get_content_templates( - self, space=None, start=0, limit=None, expand=None - ): + def get_content_templates(self, space=None, start=0, limit=None, expand=None): """ Get all content templates. Use this method to retrieve all global content templates or all content templates in a space. @@ -1074,8 +956,7 @@ def get_content_templates( except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -1100,12 +981,7 @@ def remove_template(self, template_id): return self.delete("rest/api/template/{}".format(template_id)) def get_all_spaces( - self, - start=0, - limit=500, - expand=None, - space_type=None, - space_status=None, + self, start=0, limit=500, expand=None, space_type=None, space_status=None, ): """ Get all spaces with provided limit @@ -1147,8 +1023,7 @@ def add_comment(self, page_id, text): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -1156,14 +1031,7 @@ def add_comment(self, page_id, text): return response def attach_content( - self, - content, - name, - content_type="application/binary", - page_id=None, - title=None, - space=None, - comment=None, + self, content, name, content_type="application/binary", page_id=None, title=None, space=None, comment=None, ): """ Attach (upload) a file to a page, if it exists it will update the @@ -1183,18 +1051,10 @@ def attach_content( :param comment: A comment describing this upload/file :type comment: ``str`` """ - page_id = ( - self.get_page_id(space=space, title=title) - if page_id is None - else page_id - ) + page_id = self.get_page_id(space=space, title=title) if page_id is None else page_id type = "attachment" if page_id is not None: - comment = ( - comment - if comment - else "Uploaded {filename}.".format(filename=name) - ) + comment = comment if comment else "Uploaded {filename}.".format(filename=name) data = { "type": type, "fileName": name, @@ -1206,22 +1066,15 @@ def attach_content( "X-Atlassian-Token": "no-check", "Accept": "application/json", } - path = "rest/api/content/{page_id}/child/attachment".format( - page_id=page_id - ) + path = "rest/api/content/{page_id}/child/attachment".format(page_id=page_id) # Check if there is already a file with the same name - attachments = self.get( - path=path, headers=headers, params={"filename": name} - ) + attachments = self.get(path=path, headers=headers, params={"filename": name}) if attachments.get("size"): path = path + "/" + attachments["results"][0]["id"] + "/data" try: response = self.post( - path=path, - data=data, - headers=headers, - files={"file": (name, content, content_type)}, + path=path, data=data, headers=headers, files={"file": (name, content, content_type)}, ) except HTTPError as e: if e.response.status_code == 403: @@ -1248,14 +1101,7 @@ def attach_content( return None def attach_file( - self, - filename, - name=None, - content_type=None, - page_id=None, - title=None, - space=None, - comment=None, + self, filename, name=None, content_type=None, page_id=None, title=None, space=None, comment=None, ): """ Attach (upload) a file to a page, if it exists it will update the @@ -1281,20 +1127,12 @@ def attach_file( name = os.path.basename(filename) if content_type is None: extension = os.path.splitext(filename)[-1] - content_type = self.content_types.get( - extension, "application/binary" - ) + content_type = self.content_types.get(extension, "application/binary") with open(filename, "rb") as infile: content = infile.read() return self.attach_content( - content, - name, - content_type, - page_id=page_id, - title=title, - space=space, - comment=comment, + content, name, content_type, page_id=page_id, title=title, space=space, comment=comment, ) def delete_attachment(self, page_id, filename, version=None): @@ -1308,11 +1146,7 @@ def delete_attachment(self, page_id, filename, version=None): params = {"pageId": page_id, "fileName": filename} if version: params["version"] = version - return self.post( - "json/removeattachment.action", - params=params, - headers=self.form_token_headers, - ) + return self.post("json/removeattachment.action", params=params, headers=self.form_token_headers,) def delete_attachment_by_id(self, attachment_id, version): """ @@ -1322,14 +1156,10 @@ def delete_attachment_by_id(self, attachment_id, version): :return: """ return self.delete( - "rest/experimental/content/{id}/version/{versionId}".format( - id=attachment_id, versionId=version - ) + "rest/experimental/content/{id}/version/{versionId}".format(id=attachment_id, versionId=version) ) - def remove_page_attachment_keep_version( - self, page_id, filename, keep_last_versions - ): + def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versions): """ Keep last versions :param filename: @@ -1337,31 +1167,22 @@ def remove_page_attachment_keep_version( :param keep_last_versions: :return: """ - attachment = self.get_attachments_from_content( - page_id=page_id, expand="version", filename=filename - ).get("results")[0] + attachment = self.get_attachments_from_content(page_id=page_id, expand="version", filename=filename).get( + "results" + )[0] attachment_versions = self.get_attachment_history(attachment.get("id")) while len(attachment_versions) > keep_last_versions: - remove_version_attachment_number = attachment_versions[ - keep_last_versions - ].get("number") + remove_version_attachment_number = attachment_versions[keep_last_versions].get("number") self.delete_attachment_by_id( - attachment_id=attachment.get("id"), - version=remove_version_attachment_number, + attachment_id=attachment.get("id"), version=remove_version_attachment_number, ) log.info( "Removed oldest version for {}, now versions equal more than {}".format( attachment.get("title"), len(attachment_versions) ) ) - attachment_versions = self.get_attachment_history( - attachment.get("id") - ) - log.info( - "Kept versions {} for {}".format( - keep_last_versions, attachment.get("title") - ) - ) + attachment_versions = self.get_attachment_history(attachment.get("id")) + log.info("Kept versions {} for {}".format(keep_last_versions, attachment.get("title"))) def get_attachment_history(self, attachment_id, limit=200, start=0): """ @@ -1377,13 +1198,7 @@ def get_attachment_history(self, attachment_id, limit=200, start=0): # @todo prepare more attachments info def get_attachments_from_content( - self, - page_id, - start=0, - limit=50, - expand=None, - filename=None, - media_type=None, + self, page_id, start=0, limit=50, expand=None, filename=None, media_type=None, ): """ Get attachments for page @@ -1463,9 +1278,7 @@ def remove_page_label(self, page_id, label): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The user has view permission, " - "but no edit permission to the content", - reason=e, + "The user has view permission, " "but no edit permission to the content", reason=e, ) if e.response.status_code == 404: # Raise ApiError as the documented reason is ambiguous @@ -1499,18 +1312,14 @@ def history(self, page_id): def get_content_history(self, content_id): return self.history(content_id) - def get_content_history_by_version_number( - self, content_id, version_number - ): + def get_content_history_by_version_number(self, content_id, version_number): """ Get content history by version number :param content_id: :param version_number: :return: """ - url = "rest/api/content/{id}/version/{versionNumber}".format( - id=content_id, versionNumber=version_number - ) + url = "rest/api/content/{id}/version/{versionNumber}".format(id=content_id, versionNumber=version_number) return self.get(url) def remove_content_history(self, page_id, version_number): @@ -1520,9 +1329,7 @@ def remove_content_history(self, page_id, version_number): :param version_number: version number :return: """ - url = "rest/api/content/{id}/version/{versionNumber}".format( - id=page_id, versionNumber=version_number - ) + url = "rest/api/content/{id}/version/{versionNumber}".format(id=page_id, versionNumber=version_number) self.delete(url) def remove_page_history(self, page_id, version_number): @@ -1541,9 +1348,7 @@ def remove_content_history_in_cloud(self, page_id, version_id): :param version_id: :return: """ - url = "rest/api/content/{id}/version/{versionId}".format( - id=page_id, versionId=version_id - ) + url = "rest/api/content/{id}/version/{versionId}".format(id=page_id, versionId=version_id) self.delete(url) def remove_page_history_keep_version(self, page_id, keep_last_versions): @@ -1559,16 +1364,8 @@ def remove_page_history_keep_version(self, page_id, keep_last_versions): self.remove_page_history(page_id=page_id, version_number=1) page = self.get_page_by_id(page_id=page_id, expand="version") page_number = page.get("version").get("number") - log.info( - "Removed oldest version for {}, now it's {}".format( - page.get("title"), page_number - ) - ) - log.info( - "Kept versions {} for {}".format( - keep_last_versions, page.get("title") - ) - ) + log.info("Removed oldest version for {}, now it's {}".format(page.get("title"), page_number)) + log.info("Kept versions {} for {}".format(keep_last_versions, page.get("title"))) def has_unknown_attachment_error(self, page_id): """ @@ -1576,19 +1373,13 @@ def has_unknown_attachment_error(self, page_id): :param page_id: :return: """ - unknown_attachment_identifier = ( - "plugins/servlet/confluence/placeholder/unknown-attachment" - ) + unknown_attachment_identifier = "plugins/servlet/confluence/placeholder/unknown-attachment" result = self.get_page_by_id(page_id, expand="body.view") if len(result) == 0: return "" - body = ((result.get("body") or {}).get("view") or {}).get( - "value" - ) or {} + body = ((result.get("body") or {}).get("view") or {}).get("value") or {} if unknown_attachment_identifier in body: - return result.get("_links").get("base") + result.get("_links").get( - "tinyui" - ) + return result.get("_links").get("base") + result.get("_links").get("tinyui") return "" def is_page_content_is_already_updated(self, page_id, body, title=None): @@ -1603,60 +1394,36 @@ def is_page_content_is_already_updated(self, page_id, body, title=None): if title: current_title = confluence_content.get("title", None) if title != current_title: - log.info( - "Title of {page_id} is different".format(page_id=page_id) - ) + log.info("Title of {page_id} is different".format(page_id=page_id)) return False if self.advanced_mode: confluence_content = ( - ( - self.get_page_by_id(page_id, expand="body.storage").json() - or {} - ).get("body") - or {} + (self.get_page_by_id(page_id, expand="body.storage").json() or {}).get("body") or {} ).get("storage") or {} else: - confluence_content = ( - ( - self.get_page_by_id(page_id, expand="body.storage") or {} - ).get("body") - or {} - ).get("storage") or {} + confluence_content = ((self.get_page_by_id(page_id, expand="body.storage") or {}).get("body") or {}).get( + "storage" + ) or {} confluence_body_content = confluence_content.get("value") if confluence_body_content: # @todo move into utils - confluence_body_content = utils.symbol_normalizer( - confluence_body_content - ) + confluence_body_content = utils.symbol_normalizer(confluence_body_content) - log.debug( - 'Old Content: """{body}"""'.format(body=confluence_body_content) - ) + log.debug('Old Content: """{body}"""'.format(body=confluence_body_content)) log.debug('New Content: """{body}"""'.format(body=body)) if confluence_body_content.strip() == body.strip(): - log.info( - "Content of {page_id} is exactly the same".format( - page_id=page_id - ) - ) + log.info("Content of {page_id} is exactly the same".format(page_id=page_id)) return True else: log.info("Content of {page_id} differs".format(page_id=page_id)) return False def update_existing_page( - self, - page_id, - title, - body, - type="page", - representation="storage", - minor_edit=False, - version_comment=None, + self, page_id, title, body, type="page", representation="storage", minor_edit=False, version_comment=None, ): """Duplicate update_page. Left for the people who used it before. Use update_page instead""" return self.update_page( @@ -1700,30 +1467,18 @@ def update_page( """ # update current page params = {"status": "current"} - log.info( - 'Updating {type} "{title}" with {parent_id}'.format( - title=title, type=type, parent_id=parent_id - ) - ) + log.info('Updating {type} "{title}" with {parent_id}'.format(title=title, type=type, parent_id=parent_id)) - if ( - not always_update - and body is not None - and self.is_page_content_is_already_updated(page_id, body, title) - ): + if not always_update and body is not None and self.is_page_content_is_already_updated(page_id, body, title): return self.get_page_by_id(page_id) try: if self.advanced_mode: - version = ( - self.history(page_id).json()["lastUpdated"]["number"] + 1 - ) + version = self.history(page_id).json()["lastUpdated"]["number"] + 1 else: version = self.history(page_id)["lastUpdated"]["number"] + 1 except (IndexError, TypeError) as e: - log.error( - "Can't find '{title}' {type}!".format(title=title, type=type) - ) + log.error("Can't find '{title}' {type}!".format(title=title, type=type)) log.debug(e) return None @@ -1742,18 +1497,10 @@ def update_page( data["version"]["message"] = version_comment if full_width is True: - data["metadata"]["properties"]["content-appearance-draft"] = { - "value": "full-width" - } - data["metadata"]["properties"]["content-appearance-published"] = { - "value": "full-width" - } + data["metadata"]["properties"]["content-appearance-draft"] = {"value": "full-width"} + data["metadata"]["properties"]["content-appearance-published"] = {"value": "full-width"} try: - response = self.put( - "rest/api/content/{0}".format(page_id), - data=data, - params=params, - ) + response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params,) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1763,9 +1510,7 @@ def update_page( reason=e, ) if e.response.status_code == 404: - raise ApiNotFoundError( - "Can not find draft with current content", reason=e - ) + raise ApiNotFoundError("Can not find draft with current content", reason=e) raise @@ -1800,28 +1545,15 @@ def _insert_to_existing_page( # update current page params = {"status": "current"} - if self.is_page_content_is_already_updated( - page_id, insert_body, title - ): + if self.is_page_content_is_already_updated(page_id, insert_body, title): return self.get_page_by_id(page_id) else: version = self.history(page_id)["lastUpdated"]["number"] + 1 previous_body = ( - ( - self.get_page_by_id(page_id, expand="body.storage").get( - "body" - ) - or {} - ) - .get("storage") - .get("value") + (self.get_page_by_id(page_id, expand="body.storage").get("body") or {}).get("storage").get("value") ) previous_body = previous_body.replace("ó", "ó") - body = ( - insert_body + previous_body - if top_of_page - else previous_body + insert_body - ) + body = insert_body + previous_body if top_of_page else previous_body + insert_body data = { "id": page_id, "type": type, @@ -1836,11 +1568,7 @@ def _insert_to_existing_page( data["version"]["message"] = version_comment try: - response = self.put( - "rest/api/content/{0}".format(page_id), - data=data, - params=params, - ) + response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params,) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1850,23 +1578,14 @@ def _insert_to_existing_page( reason=e, ) if e.response.status_code == 404: - raise ApiNotFoundError( - "Can not find draft with current content", reason=e - ) + raise ApiNotFoundError("Can not find draft with current content", reason=e) raise return response def append_page( - self, - page_id, - title, - append_body, - parent_id=None, - type="page", - representation="storage", - minor_edit=False, + self, page_id, title, append_body, parent_id=None, type="page", representation="storage", minor_edit=False, ): """ Append body to page if already exist @@ -1894,14 +1613,7 @@ def append_page( ) def prepend_page( - self, - page_id, - title, - prepend_body, - parent_id=None, - type="page", - representation="storage", - minor_edit=False, + self, page_id, title, prepend_body, parent_id=None, type="page", representation="storage", minor_edit=False, ): """ Append body to page if already exist @@ -1955,11 +1667,7 @@ def update_or_create( if self.page_exists(space, title): page_id = self.get_page_id(space, title) - parent_id = ( - parent_id - if parent_id is not None - else self.get_parent_content_id(page_id) - ) + parent_id = parent_id if parent_id is not None else self.get_parent_content_id(page_id) result = self.update_page( parent_id=parent_id, page_id=page_id, @@ -1983,8 +1691,7 @@ def update_or_create( log.info( "You may access your page at: {host}{url}".format( - host=self.url, - url=((result or {}).get("_links") or {}).get("tinyui"), + host=self.url, url=((result or {}).get("_links") or {}).get("tinyui"), ) ) return result @@ -2029,9 +1736,7 @@ def set_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " - "edit the content with the given id", - reason=e, + "The user does not have permission to " "edit the content with the given id", reason=e, ) if e.response.status_code == 413: raise ApiValueError("The value is too long", reason=e) @@ -2049,9 +1754,7 @@ def update_page_property(self, page_id, data): :data: property data in json format :return: """ - url = "rest/api/content/{page_id}/property/{key}".format( - page_id=page_id, key=data.get("key") - ) + url = "rest/api/content/{page_id}/property/{key}".format(page_id=page_id, key=data.get("key")) try: response = self.put(path=url, data=data) except HTTPError as e: @@ -2064,9 +1767,7 @@ def update_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " - "edit the content with the given id", - reason=e, + "The user does not have permission to " "edit the content with the given id", reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( @@ -2076,8 +1777,7 @@ def update_page_property(self, page_id, data): ) if e.response.status_code == 409: raise ApiConflictError( - "The given version is does not match the expected " - "target version of the updated property", + "The given version is does not match the expected " "target version of the updated property", reason=e, ) if e.response.status_code == 413: @@ -2117,9 +1817,7 @@ def get_page_property(self, page_id, page_property_key): :param page_property_key: key of property :return: """ - url = "rest/api/content/{page_id}/property/{key}".format( - page_id=page_id, key=str(page_property_key) - ) + url = "rest/api/content/{page_id}/property/{key}".format(page_id=page_id, key=str(page_property_key)) try: response = self.get(path=url) except HTTPError as e: @@ -2165,17 +1863,14 @@ def get_page_ancestors(self, page_id): :param page_id: content_id format :return: get properties """ - url = "rest/api/content/{page_id}?expand=ancestors".format( - page_id=page_id - ) + url = "rest/api/content/{page_id}?expand=ancestors".format(page_id=page_id) try: response = self.get(path=url) except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", - reason=e, + "The calling user does not have permission to view the content", reason=e, ) raise @@ -2185,9 +1880,7 @@ def get_page_ancestors(self, page_id): def clean_all_caches(self): """Clean all caches from cache management""" headers = self.form_token_headers - return self.delete( - "rest/cacheManagement/1.0/cacheEntries", headers=headers - ) + return self.delete("rest/cacheManagement/1.0/cacheEntries", headers=headers) def clean_package_cache(self, cache_name="com.gliffy.cache.gon"): """Clean caches from cache management @@ -2197,9 +1890,7 @@ def clean_package_cache(self, cache_name="com.gliffy.cache.gon"): """ headers = self.form_token_headers data = {"cacheName": cache_name} - return self.delete( - "rest/cacheManagement/1.0/cacheEntries", data=data, headers=headers - ) + return self.delete("rest/cacheManagement/1.0/cacheEntries", data=data, headers=headers) def get_all_groups(self, start=0, limit=1000): """ @@ -2209,26 +1900,21 @@ def get_all_groups(self, start=0, limit=1000): fixed system limits. Default: 1000 :return: """ - url = "rest/api/group?limit={limit}&start={start}".format( - limit=limit, start=start - ) + url = "rest/api/group?limit={limit}&start={start}".format(limit=limit, start=start) try: response = self.get(url) except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view groups", - reason=e, + "The calling user does not have permission to view groups", reason=e, ) raise return response.get("results") - def get_group_members( - self, group_name="confluence-users", start=0, limit=1000, expand=None - ): + def get_group_members(self, group_name="confluence-users", start=0, limit=1000, expand=None): """ Get a paginated collection of users in the given group :param group_name @@ -2247,8 +1933,7 @@ def get_group_members( except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", - reason=e, + "The calling user does not have permission to view users", reason=e, ) raise @@ -2267,28 +1952,17 @@ def get_all_members(self, group_name="confluence-users", expand=None): step = 0 members = [] while flag: - values = self.get_group_members( - group_name=group_name, - start=len(members), - limit=limit, - expand=expand, - ) + values = self.get_group_members(group_name=group_name, start=len(members), limit=limit, expand=expand,) step += 1 if len(values) == 0: flag = False else: members.extend(values) if not members: - print( - "Did not get members from {} group, please check permissions or connectivity".format( - group_name - ) - ) + print("Did not get members from {} group, please check permissions or connectivity".format(group_name)) return members - def get_space( - self, space_key, expand="description.plain,homepage", params=None - ): + def get_space(self, space_key, expand="description.plain,homepage", params=None): """ Get information about a space through space key :param space_key: The unique space key name @@ -2314,13 +1988,7 @@ def get_space( return response def get_space_content( - self, - space_key, - depth="all", - start=0, - limit=500, - content_type=None, - expand="body.storage", + self, space_key, depth="all", start=0, limit=500, content_type=None, expand="body.storage", ): """ Get space content. @@ -2339,9 +2007,7 @@ def get_space_content( """ content_type = "{}".format("/" + content_type if content_type else "") - url = "rest/api/space/{space_key}/content{content_type}".format( - space_key=space_key, content_type=content_type - ) + url = "rest/api/space/{space_key}/content{content_type}".format(space_key=space_key, content_type=content_type) params = { "depth": depth, "start": start, @@ -2442,13 +2108,11 @@ def get_user_details_by_username(self, username, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", - reason=e, + "The calling user does not have permission to view users", reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given username or userkey does not exist", - reason=e, + "The user with the given username or userkey does not exist", reason=e, ) raise @@ -2473,8 +2137,7 @@ def get_user_details_by_accountid(self, accountid, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", - reason=e, + "The calling user does not have permission to view users", reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( @@ -2503,13 +2166,11 @@ def get_user_details_by_userkey(self, userkey, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", - reason=e, + "The calling user does not have permission to view users", reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given username or userkey does not exist", - reason=e, + "The user with the given username or userkey does not exist", reason=e, ) raise @@ -2517,13 +2178,7 @@ def get_user_details_by_userkey(self, userkey, expand=None): return response def cql( - self, - cql, - start=0, - limit=None, - expand=None, - include_archived_spaces=None, - excerpt=None, + self, cql, start=0, limit=None, expand=None, include_archived_spaces=None, excerpt=None, ): """ Get results from cql search result with all related fields @@ -2571,9 +2226,7 @@ def get_page_as_pdf(self, page_id): :return: PDF File """ headers = self.form_token_headers - url = "spaces/flyingpdf/pdfpageexport.action?pageId={pageId}".format( - pageId=page_id - ) + url = "spaces/flyingpdf/pdfpageexport.action?pageId={pageId}".format(pageId=page_id) if self.api_version == "cloud": url = self.get_pdf_download_url_for_confluence_cloud(url) @@ -2607,9 +2260,7 @@ def get_descendant_page_id(self, space, parent_id, title): """ page_id = "" - url = 'rest/api/content/search?cql=parent={}%20AND%20space="{}"'.format( - parent_id, space - ) + url = 'rest/api/content/search?cql=parent={}%20AND%20space="{}"'.format(parent_id, space) try: response = self.get(url, {}) @@ -2685,8 +2336,7 @@ def anonymous(self): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to use Confluence", - reason=e, + "The calling user does not have permission to use Confluence", reason=e, ) raise @@ -2714,9 +2364,7 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format( - plugin_key=plugin_key - ) + url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -2727,10 +2375,7 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, + method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -2746,9 +2391,7 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request( - method="GET", path=url, headers=self.safe_mode_headers - ) + return self.request(method="GET", path=url, headers=self.safe_mode_headers) def update_plugin_license(self, plugin_key, raw_license): """ @@ -2795,15 +2438,12 @@ def check_long_task_result(self, task_id, expand=None): params = {"expand": expand} try: - response = self.get( - "rest/api/longtask/{}".format(task_id), params=params - ) + response = self.get("rest/api/longtask/{}".format(task_id), params=params) except HTTPError as e: if e.response.status_code == 404: # Raise ApiError as the documented reason is ambiguous raise ApiError( - "There is no task with the given key, " - "or the calling user does not have permission to view it", + "There is no task with the given key, " "or the calling user does not have permission to view it", reason=e, ) @@ -2827,25 +2467,15 @@ def get_pdf_download_url_for_confluence_cloud(self, url): headers = self.form_token_headers log.info("Initiate PDF export from Confluence Cloud") response = self.get(url, headers=headers, not_json_response=True) - response_string = response.decode( - encoding="utf-8", errors="strict" - ) - task_id = response_string.split('name="ajs-taskId" content="')[ - 1 - ].split('">')[0] + response_string = response.decode(encoding="utf-8", errors="strict") + task_id = response_string.split('name="ajs-taskId" content="')[1].split('">')[0] poll_url = "runningtaskxml.action?taskId={0}".format(task_id) while long_running_task: - long_running_task_response = self.get( - poll_url, headers=headers, not_json_response=True - ) + long_running_task_response = self.get(poll_url, headers=headers, not_json_response=True) long_running_task_response_parts = long_running_task_response.decode( encoding="utf-8", errors="strict" - ).split( - "\n" - ) - percentage_complete = long_running_task_response_parts[ - 6 - ].strip() + ).split("\n") + percentage_complete = long_running_task_response_parts[6].strip() is_successful = long_running_task_response_parts[7].strip() is_complete = long_running_task_response_parts[8].strip() log.info("Sleep for 5s.") @@ -2857,9 +2487,7 @@ def get_pdf_download_url_for_confluence_cloud(self, url): log.info("Downloading content...") log.debug("Extract taskId and download PDF.") current_status = long_running_task_response_parts[3] - download_url = current_status.split( - "href="/wiki/" - )[1].split(""")[0] + download_url = current_status.split("href="/wiki/")[1].split(""")[0] long_running_task = False elif is_successful == "false": log.error("PDF conversion not successful.") @@ -2873,12 +2501,7 @@ def get_pdf_download_url_for_confluence_cloud(self, url): return download_url def audit( - self, - start_date=None, - end_date=None, - start=None, - limit=None, - search_string=None, + self, start_date=None, end_date=None, start=None, limit=None, search_string=None, ): """ Fetch a paginated list of AuditRecord instances dating back to a certain time @@ -2909,9 +2532,7 @@ def audit( ############################################################################################## """ - def team_calendars_get_sub_calendars( - self, include=None, viewing_space_key=None, calendar_context=None - ): + def team_calendars_get_sub_calendars(self, include=None, viewing_space_key=None, calendar_context=None): """ Get subscribed calendars :param include: @@ -2930,17 +2551,13 @@ def team_calendars_get_sub_calendars( return self.get(url, params=params) def team_calendars_get_sub_calendars_watching_status(self, include=None): - url = ( - "rest/calendar-services/1.0/calendar/subcalendars/watching/status" - ) + url = "rest/calendar-services/1.0/calendar/subcalendars/watching/status" params = {} if include: params["include"] = include return self.get(url, params=params) - def team_calendar_events( - self, sub_calendar_id, start, end, user_time_zone_id=None - ): + def team_calendar_events(self, sub_calendar_id, start, end, user_time_zone_id=None): """ Get calendar event status :param sub_calendar_id: @@ -3015,12 +2632,7 @@ def add_user_to_group(self, username, group_name): return self.post(url, params=params, data=data) def add_space_permissions( - self, - space_key, - subject_type, - subject_id, - operation_key, - operation_target, + self, space_key, subject_type, subject_id, operation_key, operation_target, ): """ Add permissions to a space @@ -3080,9 +2692,7 @@ def set_inline_tasks_checkbox(self, page_id, task_id, status): status is CHECKED or UNCHECKED :return: """ - url = "rest/inlinetasks/1/task/{page_id}/{task_id}/".format( - page_id=page_id, task_id=task_id - ) + url = "rest/inlinetasks/1/task/{page_id}/{task_id}/".format(page_id=page_id, task_id=task_id) data = {"status": status, "trigger": "VIEW_PAGE"} return self.post(url, json=data) diff --git a/atlassian/crowd.py b/atlassian/crowd.py index 33ae1d5cd..d04fc2a4c 100644 --- a/atlassian/crowd.py +++ b/atlassian/crowd.py @@ -12,24 +12,13 @@ class Crowd(AtlassianRestAPI): not user credentials, in order to access Crowd APIs""" def __init__( - self, - url, - username, - password, - timeout=60, - api_root="rest", - api_version="latest", + self, url, username, password, timeout=60, api_root="rest", api_version="latest", ): - super(Crowd, self).__init__( - url, username, password, timeout, api_root, api_version - ) + super(Crowd, self).__init__(url, username, password, timeout, api_root, api_version) def _crowd_api_url(self, api, resource): return "/{api_root}/{api}/{version}/{resource}".format( - api_root=self.api_root, - api=api, - version=self.api_version, - resource=resource, + api_root=self.api_root, api=api, version=self.api_version, resource=resource, ) def _user_change_status(self, username, active): @@ -54,17 +43,11 @@ def _user_change_status(self, username, active): params = {"username": username} - return self.put( - self._crowd_api_url("usermanagement", "user"), - params=params, - data=user_object, - ) + return self.put(self._crowd_api_url("usermanagement", "user"), params=params, data=user_object,) def user(self, username): params = {"username": username} - return self.get( - self._crowd_api_url("usermanagement", "user"), params=params - ) + return self.get(self._crowd_api_url("usermanagement", "user"), params=params) def user_activate(self, username): """ @@ -74,14 +57,7 @@ def user_activate(self, username): return self._user_change_status(username, True) def user_create( - self, - username, - active, - first_name, - last_name, - display_name, - email, - password, + self, username, active, first_name, last_name, display_name, email, password, ): """ Create new user method @@ -106,9 +82,7 @@ def user_create( "email": email, } - return self.post( - self._crowd_api_url("usermanagement", "user"), data=user_object - ) + return self.post(self._crowd_api_url("usermanagement", "user"), data=user_object) def user_deactivate(self, username): """ @@ -128,9 +102,7 @@ def user_delete(self, username): params = {"username": username} - return self.delete( - self._crowd_api_url("usermanagement", "user"), params=params - ) + return self.delete(self._crowd_api_url("usermanagement", "user"), params=params) def group_add_user(self, username, groupname): """ @@ -142,11 +114,7 @@ def group_add_user(self, username, groupname): params = {"username": username} - return self.post( - self._crowd_api_url("usermanagement", "user/group/direct"), - params=params, - json=data, - ) + return self.post(self._crowd_api_url("usermanagement", "user/group/direct"), params=params, json=data,) def group_nested_members(self, group): params = {"groupname": group} @@ -186,9 +154,7 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format( - plugin_key=plugin_key - ) + url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -199,10 +165,7 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, + method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -218,9 +181,7 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request( - method="GET", path=url, headers=self.safe_mode_headers - ) + return self.request(method="GET", path=url, headers=self.safe_mode_headers) def update_plugin_license(self, plugin_key, raw_license): """ diff --git a/atlassian/insight.py b/atlassian/insight.py index 521be2d28..94e424026 100644 --- a/atlassian/insight.py +++ b/atlassian/insight.py @@ -37,9 +37,7 @@ def __cloud_init(self, *args, **kwargs): del kwargs["cloud"] temp = Insight(*args, **kwargs) # retrieve cloud workspace id and generate the api_root - kwargs["api_root"] = "/jsm/insight/workspace/{}/v1/".format( - temp.__get_workspace_id() - ) + kwargs["api_root"] = "/jsm/insight/workspace/{}/v1/".format(temp.__get_workspace_id()) # insight cloud uses the atlassian base url, not custom instnace urls kwargs["url"] = "https://api.atlassian.com" # set cloud back to true and return @@ -49,10 +47,9 @@ def __cloud_init(self, *args, **kwargs): return args, kwargs def __get_workspace_id(self): - return self.get( - "rest/servicedeskapi/insight/workspace", - headers=self.default_headers, - )["values"][0]["workspaceId"] + return self.get("rest/servicedeskapi/insight/workspace", headers=self.default_headers,)["values"][0][ + "workspaceId" + ] # Attachments def get_attachments_of_objects(self, object_id): @@ -87,10 +84,7 @@ def get_attachments_of_objects(self, object_id): """ if self.cloud: raise NotImplementedError - url = self.url_joiner( - self.api_root, - "attachments/object/{objectId}".format(objectId=object_id), - ) + url = self.url_joiner(self.api_root, "attachments/object/{objectId}".format(objectId=object_id),) return self.get(url) def upload_attachment_to_object(self, object_id, filename): @@ -102,9 +96,7 @@ def upload_attachment_to_object(self, object_id, filename): if self.cloud: raise NotImplementedError log.warning("Adding attachment...") - url = "rest/insight/1.0/attachments/object/{objectId}".format( - objectId=object_id - ) + url = "rest/insight/1.0/attachments/object/{objectId}".format(objectId=object_id) with open(filename, "rb") as attachment: files = {"file": attachment} return self.post(url, headers=self.no_check_headers, files=files) @@ -117,9 +109,7 @@ def delete_attachment(self, attachment_id): if self.cloud: raise NotImplementedError log.warning("Adding attachment...") - url = "rest/insight/1.0/attachments/{attachmentId}".format( - attachmentId=attachment_id - ) + url = "rest/insight/1.0/attachments/{attachmentId}".format(attachmentId=attachment_id) return self.delete(url) # Comments @@ -171,9 +161,7 @@ def get_comment_of_object(self, object_id): """ if self.cloud: raise NotImplementedError - url = "rest/insight/1.0/comment/object/{objectId}".format( - objectId=object_id - ) + url = "rest/insight/1.0/comment/object/{objectId}".format(objectId=object_id) return self.get(url) # Icon @@ -212,10 +200,7 @@ def start_import_configuration(self, import_id): :param import_id: :return: """ - url = self.url_joiner( - self.api_root, - "import/start/{import_id}".format(import_id=import_id), - ) + url = self.url_joiner(self.api_root, "import/start/{import_id}".format(import_id=import_id),) return self.post(url) # Index @@ -296,18 +281,11 @@ def get_object(self, object_id): :param object_id: :return: """ - url = self.url_joiner( - self.api_root, "object/{id}".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) return self.get(url) def update_object( - self, - object_id, - object_type_id, - attributes, - has_avatar=False, - avatar_uuid="", + self, object_id, object_type_id, attributes, has_avatar=False, avatar_uuid="", ): """ Update an existing object in Insight @@ -325,9 +303,7 @@ def update_object( "avatarUUID": avatar_uuid, "hasAvatar": has_avatar, } - url = self.url_joiner( - self.api_root, "object/{id}".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) return self.put(url, data=body) def delete_object(self, object_id): @@ -337,9 +313,7 @@ def delete_object(self, object_id): :param object_id: :return: """ - url = self.url_joiner( - self.api_root, "object/{id}".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}".format(id=object_id)) return self.delete(url) def get_object_attributes(self, object_id): @@ -349,9 +323,7 @@ def get_object_attributes(self, object_id): :param object_id: :return: """ - url = self.url_joiner( - self.api_root, "object/{id}/attributes".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}/attributes".format(id=object_id)) return self.get(url) def get_object_history(self, object_id, asc=False, abbreviate=True): @@ -364,9 +336,7 @@ def get_object_history(self, object_id, asc=False, abbreviate=True): :return: """ params = {"asc": asc, "abbreviate": abbreviate} - url = self.url_joiner( - self.api_root, "object/{id}/history".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}/history".format(id=object_id)) return self.get(url, params=params) @deprecated(version="3.29.0", reason="Use get_object_reference_info()") @@ -382,14 +352,10 @@ def get_object_reference_info(self, object_id): :param object_id: :return: """ - url = self.url_joiner( - self.api_root, "object/{id}/referenceinfo".format(id=object_id) - ) + url = self.url_joiner(self.api_root, "object/{id}/referenceinfo".format(id=object_id)) return self.get(url) - def create_object( - self, object_type_id, attributes, has_avatar=False, avatar_uuid="" - ): + def create_object(self, object_type_id, attributes, has_avatar=False, avatar_uuid=""): """ Create a new object in Insight @@ -465,10 +431,7 @@ def get_object_connected_tickets(self, object_id): :param object_id: :return: """ - url = self.url_joiner( - self.api_root, - "objectconnectedtickets/{id}/tickets".format(id=object_id), - ) + url = self.url_joiner(self.api_root, "objectconnectedtickets/{id}/tickets".format(id=object_id),) return self.get(url) # Object schema @@ -510,9 +473,7 @@ def get_object_schema(self, schema_id): Find a schema by id :param schema_id: """ - url = self.url_joiner( - self.api_root, "objectschema/{id}".format(id=schema_id) - ) + url = self.url_joiner(self.api_root, "objectschema/{id}".format(id=schema_id)) return self.get(url) def update_object_schema(self, schema_id): @@ -567,13 +528,7 @@ def get_object_type_attributes( kwargs = locals().items() params = dict() - params.update( - { - k: v - for k, v in kwargs - if v is not None and k not in ["self", "type_id"] - } - ) + params.update({k: v for k, v in kwargs if v is not None and k not in ["self", "type_id"]}) return self.get( "{0}objecttype/{1}/attributes".format(self.api_root, type_id), diff --git a/atlassian/jira.py b/atlassian/jira.py index e50eeddde..8102fb164 100644 --- a/atlassian/jira.py +++ b/atlassian/jira.py @@ -24,12 +24,7 @@ def __init__(self, url, *args, **kwargs): super(Jira, self).__init__(url, *args, **kwargs) def get_permissions( - self, - permissions, - project_id=None, - project_key=None, - issue_id=None, - issue_key=None, + self, permissions, project_id=None, project_key=None, issue_id=None, issue_key=None, ): """ Returns a list of permissions indicating which permissions the user has. Details of the user's permissions can @@ -121,9 +116,7 @@ def set_property(self, property_id, value): :return: """ base_url = self.resource_url("application-properties") - url = "{base_url}/{property_id}".format( - base_url=base_url, property_id=property_id - ) + url = "{base_url}/{property_id}".format(base_url=base_url, property_id=property_id) data = {"id": property_id, "value": value} return self.put(url, data=data) @@ -157,9 +150,7 @@ def get_application_role(self, role_key): :return: """ base_url = self.resource_url("applicationrole") - url = "{base_url}/{role_key}".format( - base_url=base_url, role_key=role_key - ) + url = "{base_url}/{role_key}".format(base_url=base_url, role_key=role_key) return self.get(url) or {} """ @@ -174,9 +165,7 @@ def get_attachment(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}".format( - base_url=base_url, attachment_id=attachment_id - ) + url = "{base_url}/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) return self.get(url) def get_attachment_content(self, attachment_id): @@ -186,9 +175,7 @@ def get_attachment_content(self, attachment_id): :return: json """ base_url = self.resource_url("attachment") - url = "{base_url}/content/{attachment_id}".format( - base_url=base_url, attachment_id=attachment_id - ) + url = "{base_url}/content/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) return self.get(url) def remove_attachment(self, attachment_id): @@ -198,9 +185,7 @@ def remove_attachment(self, attachment_id): :return: if success, return None """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}".format( - base_url=base_url, attachment_id=attachment_id - ) + url = "{base_url}/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id) return self.delete(url) def get_attachment_meta(self): @@ -219,9 +204,7 @@ def get_attachment_expand_human(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}/expand/human".format( - base_url=base_url, attachment_id=attachment_id - ) + url = "{base_url}/{attachment_id}/expand/human".format(base_url=base_url, attachment_id=attachment_id) return self.get(url) def get_attachment_expand_raw(self, attachment_id): @@ -231,9 +214,7 @@ def get_attachment_expand_raw(self, attachment_id): :return: """ base_url = self.resource_url("attachment") - url = "{base_url}/{attachment_id}/expand/raw".format( - base_url=base_url, attachment_id=attachment_id - ) + url = "{base_url}/{attachment_id}/expand/raw".format(base_url=base_url, attachment_id=attachment_id) return self.get(url) """ @@ -242,12 +223,7 @@ def get_attachment_expand_raw(self, attachment_id): """ def get_audit_records( - self, - offset=None, - limit=None, - filter=None, - from_date=None, - to_date=None, + self, offset=None, limit=None, filter=None, from_date=None, to_date=None, ): """ Returns auditing records filtered using provided parameters @@ -300,9 +276,7 @@ def get_all_system_avatars(self, avatar_type="user"): A map is returned to be consistent with the shape of the project/KEY/avatars REST end point. """ base_url = self.resource_url("avatar") - url = "{base_url}/{type}/system".format( - base_url=base_url, type=avatar_type - ) + url = "{base_url}/{type}/system".format(base_url=base_url, type=avatar_type) return self.get(url) """ @@ -331,9 +305,7 @@ def set_node_to_offline(self, node_id): :return: """ base_url = self.resource_url("cluster/node") - url = "{base_url}/{node_id}/offline".format( - base_url=base_url, node_id=node_id - ) + url = "{base_url}/{node_id}/offline".format(base_url=base_url, node_id=node_id) return self.put(url) def get_cluster_alive_nodes(self): @@ -373,9 +345,7 @@ def check_support_zip_status(self, cluster_task_id): :param cluster_task_id: str :return: """ - url = "/rest/troubleshooting/latest/support-zip/status/cluster/{}".format( - cluster_task_id - ) + url = "/rest/troubleshooting/latest/support-zip/status/cluster/{}".format(cluster_task_id) return self.get(url) def download_support_zip(self, file_name): @@ -384,9 +354,7 @@ def download_support_zip(self, file_name): :param file_name: str :return: bytes of zip file """ - url = "/rest/troubleshooting/latest/support-zip/download/{}".format( - file_name - ) + url = "/rest/troubleshooting/latest/support-zip/download/{}".format(file_name) return self.get(url, advanced_mode=True).content """ @@ -407,9 +375,7 @@ def issue_get_comments(self, issue_id): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id}/comment".format( - base_url=base_url, issue_id=issue_id - ) + url = "{base_url}/{issue_id}/comment".format(base_url=base_url, issue_id=issue_id) return self.get(url) def issues_get_comments_by_id(self, *args): @@ -420,9 +386,7 @@ def issues_get_comments_by_id(self, *args): :return: """ if not all([isinstance(i, int) for i in args]): - raise TypeError( - "Arguments to `issues_get_comments_by_id` must be int" - ) + raise TypeError("Arguments to `issues_get_comments_by_id` must be int") data = {"ids": list(args)} base_url = self.resource_url("comment") url = "{base_url}/list".format(base_url=base_url) @@ -454,9 +418,7 @@ def get_comment_properties_keys(self, comment_id): :return: """ base_url = self.resource_url("comment") - url = "{base_url}/{commentId}/properties".format( - base_url=base_url, commentId=comment_id - ) + url = "{base_url}/{commentId}/properties".format(base_url=base_url, commentId=comment_id) return self.get(url) def get_comment_property(self, comment_id, property_key): @@ -507,11 +469,7 @@ def delete_comment_property(self, comment_id, property_key): def component(self, component_id): base_url = self.resource_url("component") - return self.get( - "{base_url}/{component_id}".format( - base_url=base_url, component_id=component_id - ) - ) + return self.get("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id)) def get_component_related_issues(self, component_id): """ @@ -520,41 +478,24 @@ def get_component_related_issues(self, component_id): :return: """ base_url = self.resource_url("component") - url = "{base_url}/{component_id}/relatedIssueCounts".format( - base_url=base_url, component_id=component_id - ) + url = "{base_url}/{component_id}/relatedIssueCounts".format(base_url=base_url, component_id=component_id) return self.get(url) def create_component(self, component): - log.warning( - 'Creating component "{name}"'.format(name=component["name"]) - ) + log.warning('Creating component "{name}"'.format(name=component["name"])) base_url = self.resource_url("component") url = "{base_url}/".format(base_url=base_url) return self.post(url, data=component) def delete_component(self, component_id): - log.warning( - 'Deleting component "{component_id}"'.format( - component_id=component_id - ) - ) + log.warning('Deleting component "{component_id}"'.format(component_id=component_id)) base_url = self.resource_url("component") - return self.delete( - "{base_url}/{component_id}".format( - base_url=base_url, component_id=component_id - ) - ) + return self.delete("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id)) def update_component_lead(self, component_id, lead): data = {"id": component_id, "leadUserName": lead} base_url = self.resource_url("component") - return self.put( - "{base_url}/{component_id}".format( - base_url=base_url, component_id=component_id - ), - data=data, - ) + return self.put("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id), data=data,) """ Configurations of Jira @@ -613,9 +554,7 @@ def get_all_fields(self): url = self.resource_url("field") return self.get(url) - def create_custom_field( - self, name, type, search_key=None, description=None - ): + def create_custom_field(self, name, type, search_key=None, description=None): """ Creates a custom field with the given name and type :param name: str @@ -682,9 +621,7 @@ def create_filter(self, name, jql, description=None, favourite=False): url = self.resource_url("filter") return self.post(url, data=data) - def edit_filter( - self, filter_id, name, jql=None, description=None, favourite=None - ): + def edit_filter(self, filter_id, name, jql=None, description=None, favourite=None): """ Updates an existing filter. :param filter_id: Filter Id @@ -748,9 +685,7 @@ def get_filter_share_permissions(self, filter_id): :return: Returns current share permissions of filter """ base_url = self.resource_url("filter") - url = "{base_url}/{id}/permission".format( - base_url=base_url, id=filter_id - ) + url = "{base_url}/{id}/permission".format(base_url=base_url, id=filter_id) return self.get(url) def add_filter_share_permission( @@ -777,9 +712,7 @@ def add_filter_share_permission( :return: Returns updated share permissions """ base_url = self.resource_url("filter") - url = "{base_url}/{id}/permission".format( - base_url=base_url, id=filter_id - ) + url = "{base_url}/{id}/permission".format(base_url=base_url, id=filter_id) data = {"type": type} if project_id: data["projectId"] = project_id @@ -871,9 +804,7 @@ def remove_group(self, name, swap_group=None): return self.delete(url, params=params) - def get_all_users_from_group( - self, group, include_inactive_users=False, start=0, limit=50 - ): + def get_all_users_from_group(self, group, include_inactive_users=False, start=0, limit=50): """ Just wrapping method user group members :param group: @@ -892,9 +823,7 @@ def get_all_users_from_group( params["maxResults"] = limit return self.get(url, params=params) - def add_user_to_group( - self, username=None, group_name=None, account_id=None - ): + def add_user_to_group(self, username=None, group_name=None, account_id=None): """ Add given user to a group @@ -917,9 +846,7 @@ def add_user_to_group( data = {"name": username} return self.post(url, params=params, data=data) - def remove_user_from_group( - self, username=None, group_name=None, account_id=None - ): + def remove_user_from_group(self, username=None, group_name=None, account_id=None): """ Remove given user from a group @@ -979,20 +906,14 @@ def get_users_with_browse_permission_to_a_project( def issue(self, key, fields="*all", expand=None): base_url = self.resource_url("issue") - url = "{base_url}/{key}?fields={fields}".format( - base_url=base_url, key=key, fields=fields - ) + url = "{base_url}/{key}?fields={fields}".format(base_url=base_url, key=key, fields=fields) params = {} if expand: params["expand"] = expand return self.get(url, params=params) def get_issue( - self, - issue_id_or_key, - fields=None, - properties=None, - update_history=True, + self, issue_id_or_key, fields=None, properties=None, update_history=True, ): """ Returns a full representation of the issue for the given issue key @@ -1005,9 +926,7 @@ def get_issue( :return: issue """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format( - base_url=base_url, issue_id_or_key=issue_id_or_key - ) + url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) params = {} if fields is not None: @@ -1035,12 +954,8 @@ def epic_issues(self, epic, fields="*all", expand=None): :returns: Issues within the epic :rtype: list """ - base_url = self.resource_url( - "epic", api_root="rest/agile", api_version="1.0" - ) - url = "{base_url}/{key}/issue?fields={fields}".format( - base_url=base_url, key=epic, fields=fields - ) + base_url = self.resource_url("epic", api_root="rest/agile", api_version="1.0") + url = "{base_url}/{key}/issue?fields={fields}".format(base_url=base_url, key=epic, fields=fields) params = {} if expand: params["expand"] = expand @@ -1084,21 +999,15 @@ def issue_createmeta(self, project, expand="projects.issuetypes.fields"): params = {} if expand: params["expand"] = expand - url = self.resource_url( - "issue/createmeta?projectKeys={}".format(project) - ) + url = self.resource_url("issue/createmeta?projectKeys={}".format(project)) return self.get(url, params=params) def issue_createmeta_issuetypes(self, project): - url = self.resource_url( - "issue/createmeta/{}/issuetypes".format(project) - ) + url = self.resource_url("issue/createmeta/{}/issuetypes".format(project)) return self.get(url) def issue_createmeta_fieldtypes(self, project, issue_type_id): - url = self.resource_url( - "issue/createmeta/{}/issuetypes/{}".format(project, issue_type_id) - ) + url = self.resource_url("issue/createmeta/{}/issuetypes/{}".format(project, issue_type_id)) return self.get(url) def issue_editmeta(self, key): @@ -1113,9 +1022,7 @@ def get_issue_changelog(self, issue_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?expand=changelog".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}?expand=changelog".format(base_url=base_url, issue_key=issue_key) return (self.get(url) or {}).get("changelog") def issue_add_json_worklog(self, key, worklog): @@ -1150,9 +1057,7 @@ def issue_get_worklog(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/worklog".format( - base_url=base_url, issueIdOrKey=issue_id_or_key - ) + url = "{base_url}/{issueIdOrKey}/worklog".format(base_url=base_url, issueIdOrKey=issue_id_or_key) return self.get(url) @@ -1163,9 +1068,7 @@ def issue_archive(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/archive".format( - base_url=base_url, issueIdOrKey=issue_id_or_key - ) + url = "{base_url}/{issueIdOrKey}/archive".format(base_url=base_url, issueIdOrKey=issue_id_or_key) return self.put(url) def issue_restore(self, issue_id_or_key): @@ -1175,18 +1078,12 @@ def issue_restore(self, issue_id_or_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/restore".format( - base_url=base_url, issueIdOrKey=issue_id_or_key - ) + url = "{base_url}/{issueIdOrKey}/restore".format(base_url=base_url, issueIdOrKey=issue_id_or_key) return self.put(url) def issue_field_value(self, key, field): base_url = self.resource_url("issue") - issue = self.get( - "{base_url}/{key}?fields={field}".format( - base_url=base_url, key=key, field=field - ) - ) + issue = self.get("{base_url}/{key}?fields={field}".format(base_url=base_url, key=key, field=field)) return issue["fields"][field] def issue_fields(self, key): @@ -1196,10 +1093,7 @@ def issue_fields(self, key): def update_issue_field(self, key, fields="*all"): base_url = self.resource_url("issue") - return self.put( - "{base_url}/{key}".format(base_url=base_url, key=key), - data={"fields": fields}, - ) + return self.put("{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields},) def bulk_update_issue_field(self, key_list, fields="*all"): """ @@ -1211,8 +1105,7 @@ def bulk_update_issue_field(self, key_list, fields="*all"): try: for key in key_list: self.put( - "{base_url}/{key}".format(base_url=base_url, key=key), - data={"fields": fields}, + "{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields}, ) except Exception as e: log.error(e) @@ -1226,9 +1119,7 @@ def get_issue_labels(self, issue_key): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=labels".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}?fields=labels".format(base_url=base_url, issue_key=issue_key) if self.advanced_mode: return self.get(url) return (self.get(url) or {}).get("fields").get("labels") @@ -1241,9 +1132,7 @@ def add_attachment(self, issue_key, filename): """ log.warning("Adding attachment...") base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/attachments".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}/attachments".format(base_url=base_url, issue_key=issue_key) with open(filename, "rb") as attachment: files = {"file": attachment} return self.post(url, headers=self.no_check_headers, files=files) @@ -1254,11 +1143,7 @@ def issue_exists(self, issue_key): try: resp = self.issue(issue_key, fields="*none") if resp.status_code == 404: - log.info( - 'Issue "{issue_key}" does not exists'.format( - issue_key=issue_key - ) - ) + log.info('Issue "{issue_key}" does not exists'.format(issue_key=issue_key)) return False resp.raise_for_status() log.info('Issue "{issue_key}" exists'.format(issue_key=issue_key)) @@ -1269,15 +1154,9 @@ def issue_exists(self, issue_key): def issue_deleted(self, issue_key): exists = self.issue_exists(issue_key) if exists: - log.info( - 'Issue "{issue_key}" is not deleted'.format( - issue_key=issue_key - ) - ) + log.info('Issue "{issue_key}" is not deleted'.format(issue_key=issue_key)) else: - log.info( - 'Issue "{issue_key}" is deleted'.format(issue_key=issue_key) - ) + log.info('Issue "{issue_key}" is deleted'.format(issue_key=issue_key)) return not exists def delete_issue(self, issue_id_or_key, delete_subtasks=True): @@ -1290,9 +1169,7 @@ def delete_issue(self, issue_id_or_key, delete_subtasks=True): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format( - base_url=base_url, issue_id_or_key=issue_id_or_key - ) + url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) params = {} if delete_subtasks is True: @@ -1306,15 +1183,9 @@ def delete_issue(self, issue_id_or_key, delete_subtasks=True): # @todo merge with edit_issue method def issue_update(self, issue_key, fields): - log.warning( - 'Updating issue "{issue_key}" with "{fields}"'.format( - issue_key=issue_key, fields=fields - ) - ) + log.warning('Updating issue "{issue_key}" with "{fields}"'.format(issue_key=issue_key, fields=fields)) base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}".format(base_url=base_url, issue_key=issue_key) return self.put(url, data={"fields": fields}) def edit_issue(self, issue_id_or_key, fields, notify_users=True): @@ -1329,9 +1200,7 @@ def edit_issue(self, issue_id_or_key, fields, notify_users=True): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_id_or_key}".format( - base_url=base_url, issue_id_or_key=issue_id_or_key - ) + url = "{base_url}/{issue_id_or_key}".format(base_url=base_url, issue_id_or_key=issue_id_or_key) params = {} data = {"update": fields} @@ -1348,19 +1217,10 @@ def issue_add_watcher(self, issue_key, user): :param user: :return: """ - log.warning( - 'Adding user {user} to "{issue_key}" watchers'.format( - issue_key=issue_key, user=user - ) - ) + log.warning('Adding user {user} to "{issue_key}" watchers'.format(issue_key=issue_key, user=user)) data = user base_url = self.resource_url("issue") - return self.post( - "{base_url}/{issue_key}/watchers".format( - base_url=base_url, issue_key=issue_key - ), - data=data, - ) + return self.post("{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), data=data,) def issue_delete_watcher(self, issue_key, user): """ @@ -1369,18 +1229,11 @@ def issue_delete_watcher(self, issue_key, user): :param user: :return: """ - log.warning( - 'Deleting user {user} from "{issue_key}" watchers'.format( - issue_key=issue_key, user=user - ) - ) + log.warning('Deleting user {user} from "{issue_key}" watchers'.format(issue_key=issue_key, user=user)) params = {"username": user} base_url = self.resource_url("issue") return self.delete( - "{base_url}/{issue_key}/watchers".format( - base_url=base_url, issue_key=issue_key - ), - params=params, + "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), params=params, ) def issue_get_watchers(self, issue_key): @@ -1390,11 +1243,7 @@ def issue_get_watchers(self, issue_key): :return: List of watchers for issue """ base_url = self.resource_url("issue") - return self.get( - "{base_url}/{issue_key}/watchers".format( - base_url=base_url, issue_key=issue_key - ) - ) + return self.get("{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key)) def assign_issue(self, issue, account_id=None): """Assign an issue to a user. None will set it to unassigned. -1 will set it to Automatic. @@ -1406,9 +1255,7 @@ def assign_issue(self, issue, account_id=None): :rtype: bool """ base_url = self.resource_url("issue") - url = "{base_url}/{issue}/assignee".format( - base_url=base_url, issue=issue - ) + url = "{base_url}/{issue}/assignee".format(base_url=base_url, issue=issue) if self.cloud: data = {"accountId": account_id} else: @@ -1467,9 +1314,7 @@ def create_issues(self, list_of_issues_data): # @todo refactor and merge with create_issue method def issue_create(self, fields): - log.warning( - 'Creating issue "{summary}"'.format(summary=fields["summary"]) - ) + log.warning('Creating issue "{summary}"'.format(summary=fields["summary"])) url = self.resource_url("issue") return self.post(url, data={"fields": fields}) @@ -1477,25 +1322,15 @@ def issue_create_or_update(self, fields): issue_key = fields.get("issuekey", None) if not issue_key or not self.issue_exists(issue_key): - log.info( - "IssueKey is not provided or does not exists in destination. Will attempt to create an issue" - ) + log.info("IssueKey is not provided or does not exists in destination. Will attempt to create an issue") fields.pop("issuekey", None) return self.issue_create(fields) if self.issue_deleted(issue_key): - log.warning( - 'Issue "{issue_key}" deleted, skipping'.format( - issue_key=issue_key - ) - ) + log.warning('Issue "{issue_key}" deleted, skipping'.format(issue_key=issue_key)) return None - log.info( - 'Issue "{issue_key}" exists, will update'.format( - issue_key=issue_key - ) - ) + log.info('Issue "{issue_key}" exists, will update'.format(issue_key=issue_key)) fields.pop("issuekey", None) return self.issue_update(issue_key, fields) @@ -1508,17 +1343,13 @@ def issue_add_comment(self, issue_key, comment, visibility=None): :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issueIdOrKey}/comment".format( - base_url=base_url, issueIdOrKey=issue_key - ) + url = "{base_url}/{issueIdOrKey}/comment".format(base_url=base_url, issueIdOrKey=issue_key) data = {"body": comment} if visibility: data["visibility"] = visibility return self.post(url, data=data) - def issue_edit_comment( - self, issue_key, comment_id, comment, visibility=None - ): + def issue_edit_comment(self, issue_key, comment_id, comment, visibility=None): """ Updates an existing comment :param issue_key: str @@ -1536,17 +1367,13 @@ def issue_edit_comment( data["visibility"] = visibility return self.put(url, data=data) - def get_issue_remotelinks( - self, issue_key, global_id=None, internal_id=None - ): + def get_issue_remotelinks(self, issue_key, global_id=None, internal_id=None): """ Compatibility naming method with get_issue_remote_links() """ return self.get_issue_remote_links(issue_key, global_id, internal_id) - def get_issue_remote_links( - self, issue_key, global_id=None, internal_id=None - ): + def get_issue_remote_links(self, issue_key, global_id=None, internal_id=None): """ Finding all Remote Links on an issue, also with filtering by Global ID and internal ID :param issue_key: @@ -1555,9 +1382,7 @@ def get_issue_remote_links( :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/remotelink".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}/remotelink".format(base_url=base_url, issue_key=issue_key) params = {} if global_id: params["globalId"] = global_id @@ -1566,14 +1391,7 @@ def get_issue_remote_links( return self.get(url, params=params) def create_or_update_issue_remote_links( - self, - issue_key, - link_url, - title, - global_id=None, - relationship=None, - icon_url=None, - icon_title=None, + self, issue_key, link_url, title, global_id=None, relationship=None, icon_url=None, icon_title=None, ): """ Add Remote Link to Issue, update url if global_id is passed @@ -1586,9 +1404,7 @@ def create_or_update_issue_remote_links( :param icon_title: str, OPTIONAL: Text for the tooltip of the main icon describing the type of the object in the remote system """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/remotelink".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}/remotelink".format(base_url=base_url, issue_key=issue_key) data = {"object": {"url": link_url, "title": title}} if global_id: data["globalId"] = global_id @@ -1610,9 +1426,7 @@ def get_issue_remote_link_by_id(self, issue_key, link_id): ) return self.get(url) - def update_issue_remote_link_by_id( - self, issue_key, link_id, url, title, global_id=None, relationship=None - ): + def update_issue_remote_link_by_id(self, issue_key, link_id, url, title, global_id=None, relationship=None): """ Update existing Remote Link on Issue :param issue_key: str @@ -1649,33 +1463,19 @@ def delete_issue_remote_link_by_id(self, issue_key, link_id): def get_issue_transitions(self, issue_key): if self.advanced_mode: return [ - { - "name": transition["name"], - "id": int(transition["id"]), - "to": transition["to"]["name"], - } - for transition in ( - self.get_issue_transitions_full(issue_key).json() or {} - ).get("transitions") + {"name": transition["name"], "id": int(transition["id"]), "to": transition["to"]["name"],} + for transition in (self.get_issue_transitions_full(issue_key).json() or {}).get("transitions") ] else: return [ - { - "name": transition["name"], - "id": int(transition["id"]), - "to": transition["to"]["name"], - } - for transition in ( - self.get_issue_transitions_full(issue_key) or {} - ).get("transitions") + {"name": transition["name"], "id": int(transition["id"]), "to": transition["to"]["name"],} + for transition in (self.get_issue_transitions_full(issue_key) or {}).get("transitions") ] def issue_transition(self, issue_key, status): return self.set_issue_status(issue_key, status) - def set_issue_status( - self, issue_key, status_name, fields=None, update=None - ): + def set_issue_status(self, issue_key, status_name, fields=None, update=None): """ Setting status by status_name. fields defaults to None for transitions without mandatory fields. If there are mandatory fields for the transition, these can be set using a dict in 'fields'. @@ -1690,12 +1490,8 @@ def set_issue_status( :param update: dict, optional """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format( - base_url=base_url, issue_key=issue_key - ) - transition_id = self.get_transition_id_to_status_name( - issue_key, status_name - ) + url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) + transition_id = self.get_transition_id_to_status_name(issue_key, status_name) data = {"transition": {"id": transition_id}} if fields is not None: data["fields"] = fields @@ -1710,30 +1506,20 @@ def set_issue_status_by_transition_id(self, issue_key, transition_id): :param transition_id: int """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) return self.post(url, data={"transition": {"id": transition_id}}) def get_issue_status(self, issue_key): base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=status".format( - base_url=base_url, issue_key=issue_key - ) - return ( - ((self.get(url) or {}).get("fields") or {}).get("status") or {} - ).get("name") or {} + url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key) + return (((self.get(url) or {}).get("fields") or {}).get("status") or {}).get("name") or {} def get_issue_status_id(self, issue_key): base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}?fields=status".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key) return (self.get(url) or {}).get("fields").get("status").get("id") - def get_issue_transitions_full( - self, issue_key, transition_id=None, expand=None - ): + def get_issue_transitions_full(self, issue_key, transition_id=None, expand=None): """ Get a list of the transitions possible for this issue by the current user, along with fields that are required and their types. @@ -1746,9 +1532,7 @@ def get_issue_transitions_full( :return: """ base_url = self.resource_url("issue") - url = "{base_url}/{issue_key}/transitions".format( - base_url=base_url, issue_key=issue_key - ) + url = "{base_url}/{issue_key}/transitions".format(base_url=base_url, issue_key=issue_key) params = {} if transition_id: params["transitionId"] = transition_id @@ -1814,9 +1598,7 @@ def user(self, username=None, key=None, account_id=None, expand=None): elif not major_parameter_enabled and not username and key: params = {"key": key} elif not major_parameter_enabled and username and key: - return ( - "You cannot specify both the username and the key parameters" - ) + return "You cannot specify both the username and the key parameters" elif not account_id and not key and not username: return "You must specify at least one parameter: username or key or account_id" if expand: @@ -1859,9 +1641,7 @@ def user_update(self, username, data): :return: """ base_url = self.resource_url("user") - url = "{base_url}?username={username}".format( - base_url=base_url, username=username - ) + url = "{base_url}?username={username}".format(base_url=base_url, username=username) return self.put(url, data=data) def user_update_username(self, old_username, new_username): @@ -1884,9 +1664,7 @@ def user_update_email(self, username, email): data = {"name": username, "emailAddress": email} return self.user_update(username, data=data) - def user_create( - self, username, email, display_name, password=None, notification=None - ): + def user_create(self, username, email, display_name, password=None, notification=None): """ Create a user in Jira :param username: @@ -1924,13 +1702,9 @@ def user_properties(self, username=None, account_id=None): base_url = self.resource_url("user/properties") url = "" if username or not self.cloud: - url = "{base_url}?accountId={username}".format( - base_url=base_url, username=username - ) + url = "{base_url}?accountId={username}".format(base_url=base_url, username=username) elif account_id or self.cloud: - url = "{base_url}?accountId={account_id}".format( - base_url=base_url, account_id=account_id - ) + url = "{base_url}?accountId={account_id}".format(base_url=base_url, account_id=account_id) return self.get(url) def user_property(self, username=None, account_id=None, key_property=None): @@ -1948,18 +1722,11 @@ def user_property(self, username=None, account_id=None, key_property=None): params = {"accountId": account_id} base_url = self.resource_url("user/properties") return self.get( - "{base_url}/{key_property}".format( - base_url=base_url, key_property=key_property - ), - params=params, + "{base_url}/{key_property}".format(base_url=base_url, key_property=key_property), params=params, ) def user_set_property( - self, - username=None, - account_id=None, - key_property=None, - value_property=None, + self, username=None, account_id=None, key_property=None, value_property=None, ): """ Set property for user @@ -1977,16 +1744,12 @@ def user_set_property( ) elif account_id or self.cloud: url = "{base_url}/{key_property}?accountId={account_id}".format( - base_url=base_url, - key_property=key_property, - account_id=account_id, + base_url=base_url, key_property=key_property, account_id=account_id, ) return self.put(url, data=value_property) - def user_delete_property( - self, username=None, account_id=None, key_property=None - ): + def user_delete_property(self, username=None, account_id=None, key_property=None): """ Delete property for user :param username: @@ -1995,9 +1758,7 @@ def user_delete_property( :return: """ base_url = self.resource_url("user/properties") - url = "{base_url}/{key_property}".format( - base_url=base_url, key_property=key_property - ) + url = "{base_url}/{key_property}".format(base_url=base_url, key_property=key_property) params = {} if username or not self.cloud: params = {"username": username} @@ -2005,9 +1766,7 @@ def user_delete_property( params = {"accountId": account_id} return self.delete(url, params=params) - def user_update_or_create_property_through_rest_point( - self, username, key, value - ): + def user_update_or_create_property_through_rest_point(self, username, key, value): """ ATTENTION! This method used after configuration of rest endpoint on Jira side @@ -2035,10 +1794,7 @@ def user_disable(self, username): return self.user_deactivate(username) def user_disable_throw_rest_endpoint( - self, - username, - url="rest/scriptrunner/latest/custom/disableUser", - param="userName", + self, username, url="rest/scriptrunner/latest/custom/disableUser", param="userName", ): """The disable method throw own rest endpoint""" url = "{}?{}={}".format(url, param, username) @@ -2051,15 +1807,11 @@ def user_get_websudo(self): "webSudoPassword": self.password, "webSudoIsPost": "false", } - answer = self.get( - "secure/admin/WebSudoAuthenticate.jspa", self.form_token_headers - ) + answer = self.get("secure/admin/WebSudoAuthenticate.jspa", self.form_token_headers) atl_token = None if answer: atl_token = ( - answer.split( - ' {} {}".format( - method, path, response.status_code, response.reason - ) - ) + log.debug("HTTP: {} {} -> {} {}".format(method, path, response.status_code, response.reason)) log.debug("HTTP: Response text -> {}".format(response.text)) if self.advanced_mode or advanced_mode: return response @@ -405,14 +379,7 @@ def put( return self._response_handler(response) def delete( - self, - path, - data=None, - headers=None, - params=None, - trailing=None, - absolute=False, - advanced_mode=False, + self, path, data=None, headers=None, params=None, trailing=None, absolute=False, advanced_mode=False, ): """ Deletes resources at given paths. @@ -429,13 +396,7 @@ def delete( If advanced_mode is set - returns raw response. """ response = self.request( - "DELETE", - path=path, - data=data, - headers=headers, - params=params, - trailing=trailing, - absolute=absolute, + "DELETE", path=path, data=data, headers=headers, params=params, trailing=trailing, absolute=absolute, ) if self.advanced_mode or advanced_mode: return response @@ -456,11 +417,7 @@ def raise_for_status(self, response): error_msg = "\n".join([k + ": " + v for k, v in j.items()]) else: error_msg = "\n".join( - j.get("errorMessages", list()) - + [ - k + ": " + v - for k, v in j.get("errors", dict()).items() - ] + j.get("errorMessages", list()) + [k + ": " + v for k, v in j.get("errors", dict()).items()] ) except Exception as e: log.error(e) diff --git a/atlassian/service_desk.py b/atlassian/service_desk.py index cf517a348..6ddf2d67d 100644 --- a/atlassian/service_desk.py +++ b/atlassian/service_desk.py @@ -15,9 +15,7 @@ class ServiceDesk(AtlassianRestAPI): def get_info(self): """Get info about Service Desk app""" - return self.get( - "rest/servicedeskapi/info", headers=self.experimental_headers - ) + return self.get("rest/servicedeskapi/info", headers=self.experimental_headers) def get_service_desks(self): """ @@ -26,10 +24,7 @@ def get_service_desks(self): :return: Service Desks """ - service_desks_list = self.get( - "rest/servicedeskapi/servicedesk", - headers=self.experimental_headers, - ) + service_desks_list = self.get("rest/servicedeskapi/servicedesk", headers=self.experimental_headers,) if self.advanced_mode: return service_desks_list else: @@ -44,8 +39,7 @@ def get_service_desk_by_id(self, service_desk_id): """ return self.get( - "rest/servicedeskapi/servicedesk/{}".format(service_desk_id), - headers=self.experimental_headers, + "rest/servicedeskapi/servicedesk/{}".format(service_desk_id), headers=self.experimental_headers, ) # Customers actions @@ -60,11 +54,7 @@ def create_customer(self, full_name, email): log.warning("Creating customer...") data = {"fullName": full_name, "email": email} - return self.post( - "rest/servicedeskapi/customer", - headers=self.experimental_headers, - data=data, - ) + return self.post("rest/servicedeskapi/customer", headers=self.experimental_headers, data=data,) def get_customer_request(self, issue_id_or_key): """ @@ -74,27 +64,17 @@ def get_customer_request(self, issue_id_or_key): :return: Customer request """ - return self.get( - "rest/servicedeskapi/request/{}".format(issue_id_or_key), - headers=self.experimental_headers, - ) + return self.get("rest/servicedeskapi/request/{}".format(issue_id_or_key), headers=self.experimental_headers,) def get_my_customer_requests(self): """Returning requests where you are the assignee""" - response = self.get( - "rest/servicedeskapi/request", headers=self.experimental_headers - ) + response = self.get("rest/servicedeskapi/request", headers=self.experimental_headers) if self.advanced_mode: return response return (response or {}).get("values") def create_customer_request( - self, - service_desk_id, - request_type_id, - values_dict, - raise_on_behalf_of=None, - request_participants=None, + self, service_desk_id, request_type_id, values_dict, raise_on_behalf_of=None, request_participants=None, ): """ Creating customer request @@ -136,8 +116,7 @@ def get_customer_request_status(self, issue_id_or_key): :return: Status name """ request = self.get( - "rest/servicedeskapi/request/{}/status".format(issue_id_or_key), - headers=self.experimental_headers, + "rest/servicedeskapi/request/{}/status".format(issue_id_or_key), headers=self.experimental_headers, ) if self.advanced_mode: return request @@ -153,9 +132,7 @@ def get_customer_transitions(self, issue_id_or_key): :param issue_id_or_key: str :return: """ - url = "rest/servicedeskapi/request/{}/transition".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/transition".format(issue_id_or_key) return self.get(url, headers=self.experimental_headers) @@ -168,10 +145,7 @@ def get_request_types(self, service_desk_id): """ return self.get( - "rest/servicedeskapi/servicedesk/{}/requesttype".format( - service_desk_id - ), - headers=self.experimental_headers, + "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id), headers=self.experimental_headers, ) # Participants actions @@ -184,18 +158,14 @@ def get_request_participants(self, issue_id_or_key, start=0, limit=50): :param limit: OPTIONAL: int :return: Request participants """ - url = "rest/servicedeskapi/request/{}/participant".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) params = {} if start is not None: params["start"] = int(start) if limit is not None: params["limit"] = int(limit) - response = self.get( - url, params=params, headers=self.experimental_headers - ) + response = self.get(url, params=params, headers=self.experimental_headers) if self.advanced_mode: return response return (response or {}).get("values") @@ -209,9 +179,7 @@ def add_request_participants(self, issue_id_or_key, users_list): :param users_list: list :return: """ - url = "rest/servicedeskapi/request/{}/participant".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) data = {"usernames": users_list} return self.post(url, data=data, headers=self.experimental_headers) @@ -225,9 +193,7 @@ def remove_request_participants(self, issue_id_or_key, users_list): :param users_list: list :return: """ - url = "rest/servicedeskapi/request/{}/participant".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key) data = {"usernames": users_list} return self.delete(url, data=data, headers=self.experimental_headers) @@ -245,9 +211,7 @@ def perform_transition(self, issue_id_or_key, transition_id, comment=None): """ log.warning("Performing transition...") data = {"id": transition_id, "additionalComment": {"body": comment}} - url = "rest/servicedeskapi/request/{}/transition".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/transition".format(issue_id_or_key) return self.post(url, headers=self.experimental_headers, data=data) @@ -265,13 +229,9 @@ def create_request_comment(self, issue_id_or_key, body, public=True): data = {"body": body, "public": public} url = "rest/servicedeskapi/request/{}/comment".format(issue_id_or_key) - return self.post( - path=url, data=data, headers=self.experimental_headers - ) + return self.post(path=url, data=data, headers=self.experimental_headers) - def get_request_comments( - self, issue_id_or_key, start=0, limit=50, public=True, internal=True - ): + def get_request_comments(self, issue_id_or_key, start=0, limit=50, public=True, internal=True): """ Get all comments in issue @@ -293,9 +253,7 @@ def get_request_comments( if internal is not None: params["internal"] = bool(internal) - response = self.get( - url, params=params, headers=self.experimental_headers - ) + response = self.get(url, params=params, headers=self.experimental_headers) if self.advanced_mode: return response return (response or {}).get("values") @@ -315,9 +273,7 @@ def get_request_comment_by_id(self, issue_id_or_key, comment_id): """ return self.get( - "rest/servicedeskapi/request/{}/comment/{}".format( - issue_id_or_key, comment_id - ), + "rest/servicedeskapi/request/{}/comment/{}".format(issue_id_or_key, comment_id), headers=self.experimental_headers, ) @@ -335,9 +291,7 @@ def get_organisations(self, service_desk_id=None, start=0, limit=50): :return: """ url_without_sd_id = "rest/servicedeskapi/organization" - url_with_sd_id = "rest/servicedeskapi/servicedesk/{}/organization".format( - service_desk_id - ) + url_with_sd_id = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) params = {} if start is not None: params["start"] = int(start) @@ -345,14 +299,8 @@ def get_organisations(self, service_desk_id=None, start=0, limit=50): params["limit"] = int(limit) if service_desk_id is None: - return self.get( - url_without_sd_id, - headers=self.experimental_headers, - params=params, - ) - return self.get( - url_with_sd_id, headers=self.experimental_headers, params=params - ) + return self.get(url_without_sd_id, headers=self.experimental_headers, params=params,) + return self.get(url_with_sd_id, headers=self.experimental_headers, params=params) def get_organization(self, organization_id): """ @@ -374,9 +322,7 @@ def get_users_in_organization(self, organization_id, start=0, limit=50): :param limit: OPTIONAL: int :return: Users list in organization """ - url = "rest/servicedeskapi/organization/{}/user".format( - organization_id - ) + url = "rest/servicedeskapi/organization/{}/user".format(organization_id) params = {} if start is not None: params["start"] = int(start) @@ -408,9 +354,7 @@ def add_organization(self, service_desk_id, organization_id): :return: """ log.warning("Adding organization...") - url = "rest/servicedeskapi/servicedesk/{}/organization".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) data = {"organizationId": organization_id} return self.post(url, headers=self.experimental_headers, data=data) @@ -424,9 +368,7 @@ def remove_organization(self, service_desk_id, organization_id): :return: """ log.warning("Removing organization...") - url = "rest/servicedeskapi/servicedesk/{}/organization".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id) data = {"organizationId": organization_id} return self.delete(url, headers=self.experimental_headers, data=data) @@ -443,9 +385,7 @@ def delete_organization(self, organization_id): return self.delete(url, headers=self.experimental_headers) - def add_users_to_organization( - self, organization_id, users_list=[], account_list=[] - ): + def add_users_to_organization(self, organization_id, users_list=[], account_list=[]): """ Adds users to an organization users_list is a list of strings @@ -457,16 +397,12 @@ def add_users_to_organization( :return: """ log.warning("Adding users...") - url = "rest/servicedeskapi/organization/{}/user".format( - organization_id - ) + url = "rest/servicedeskapi/organization/{}/user".format(organization_id) data = {"usernames": users_list, "accountIds": account_list} return self.post(url, headers=self.experimental_headers, data=data) - def remove_users_from_organization( - self, organization_id, users_list=[], account_list=[] - ): + def remove_users_from_organization(self, organization_id, users_list=[], account_list=[]): """ Removes users from an organization users_list is a list of strings @@ -478,21 +414,14 @@ def remove_users_from_organization( :return: """ log.warning("Removing users...") - url = "rest/servicedeskapi/organization/{}/user".format( - organization_id - ) + url = "rest/servicedeskapi/organization/{}/user".format(organization_id) data = {"usernames": users_list, "accountIds": account_list} return self.delete(url, headers=self.experimental_headers, data=data) # Attachments actions def create_attachments( - self, - service_desk_id, - issue_id_or_key, - filenames, - public=True, - comment=None, + self, service_desk_id, issue_id_or_key, filenames, public=True, comment=None, ): """ Add attachment as a comment. @@ -514,23 +443,14 @@ def create_attachments( filenames = [filenames] for filename in filenames: - temp_attachment_id = self.attach_temporary_file( - service_desk_id, filename - ) + temp_attachment_id = self.attach_temporary_file(service_desk_id, filename) temp_attachment_ids.append(temp_attachment_id) # Add attachments - return self.add_attachments( - issue_id_or_key, temp_attachment_ids, public, comment - ) + return self.add_attachments(issue_id_or_key, temp_attachment_ids, public, comment) def create_attachment( - self, - service_desk_id, - issue_id_or_key, - filename, - public=True, - comment=None, + self, service_desk_id, issue_id_or_key, filename, public=True, comment=None, ): """ Add attachment as a comment. @@ -547,13 +467,7 @@ def create_attachment( :return: Request info """ log.info("Creating attachment...") - return self.create_attachments( - service_desk_id, - issue_id_or_key, - filename, - public=public, - comment=comment, - ) + return self.create_attachments(service_desk_id, issue_id_or_key, filename, public=public, comment=comment,) def attach_temporary_file(self, service_desk_id, filename): """ @@ -562,9 +476,7 @@ def attach_temporary_file(self, service_desk_id, filename): :param filename: str :return: Temporary Attachment ID """ - url = "rest/servicedeskapi/servicedesk/{}/attachTemporaryFile".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/attachTemporaryFile".format(service_desk_id) # no application/json content type and an additional X-Atlassian-Token header # https://docs.atlassian.com/jira-servicedesk/REST/4.14.1/#servicedeskapi/servicedesk/{serviceDeskId}/attachTemporaryFile-attachTemporaryFile @@ -574,11 +486,7 @@ def attach_temporary_file(self, service_desk_id, filename): with open(filename, "rb") as file: result = ( - self.post( - path=url, - headers=experimental_headers, - files={"file": file}, - ) + self.post(path=url, headers=experimental_headers, files={"file": file},) .json() .get("temporaryAttachments") ) @@ -586,9 +494,7 @@ def attach_temporary_file(self, service_desk_id, filename): return temp_attachment_id - def add_attachments( - self, issue_id_or_key, temp_attachment_ids, public=True, comment=None - ): + def add_attachments(self, issue_id_or_key, temp_attachment_ids, public=True, comment=None): """ Adds temporary attachment to customer request using attach_temporary_file function :param issue_id_or_key: str @@ -602,15 +508,11 @@ def add_attachments( "public": public, "additionalComment": {"body": comment}, } - url = "rest/servicedeskapi/request/{}/attachment".format( - issue_id_or_key - ) + url = "rest/servicedeskapi/request/{}/attachment".format(issue_id_or_key) return self.post(url, headers=self.experimental_headers, data=data) - def add_attachment( - self, issue_id_or_key, temp_attachment_id, public=True, comment=None - ): + def add_attachment(self, issue_id_or_key, temp_attachment_id, public=True, comment=None): """ Adds temporary attachment to customer request using attach_temporary_file function :param issue_id_or_key: str @@ -620,12 +522,7 @@ def add_attachment( :return: """ log.info("Adding attachment") - return self.add_attachments( - issue_id_or_key, - [temp_attachment_id], - public=public, - comment=comment, - ) + return self.add_attachments(issue_id_or_key, [temp_attachment_id], public=public, comment=comment,) # SLA actions def get_sla(self, issue_id_or_key, start=0, limit=50): @@ -646,9 +543,7 @@ def get_sla(self, issue_id_or_key, start=0, limit=50): if limit is not None: params["limit"] = int(limit) - response = self.get( - url, params=params, headers=self.experimental_headers - ) + response = self.get(url, params=params, headers=self.experimental_headers) if self.advanced_mode: return response return (response or {}).get("values") @@ -662,9 +557,7 @@ def get_sla_by_id(self, issue_id_or_key, sla_id): :param sla_id: str :return: SLA information """ - url = "rest/servicedeskapi/request/{0}/sla/{1}".format( - issue_id_or_key, sla_id - ) + url = "rest/servicedeskapi/request/{0}/sla/{1}".format(issue_id_or_key, sla_id) return self.get(url, headers=self.experimental_headers) @@ -686,9 +579,7 @@ def get_approvals(self, issue_id_or_key, start=0, limit=50): if limit is not None: params["limit"] = int(limit) - response = self.get( - url, headers=self.experimental_headers, params=params - ) + response = self.get(url, headers=self.experimental_headers, params=params) if self.advanced_mode: return response return (response or {}).get("values") @@ -701,9 +592,7 @@ def get_approval_by_id(self, issue_id_or_key, approval_id): :param approval_id: str :return: """ - url = "rest/servicedeskapi/request/{0}/approval/{1}".format( - issue_id_or_key, approval_id - ) + url = "rest/servicedeskapi/request/{0}/approval/{1}".format(issue_id_or_key, approval_id) return self.get(url, headers=self.experimental_headers) @@ -716,9 +605,7 @@ def answer_approval(self, issue_id_or_key, approval_id, decision): :param decision: str :return: """ - url = "rest/servicedeskapi/request/{0}/approval/{1}".format( - issue_id_or_key, approval_id - ) + url = "rest/servicedeskapi/request/{0}/approval/{1}".format(issue_id_or_key, approval_id) data = {"decision": decision} return self.post(url, headers=self.experimental_headers, data=data) @@ -749,9 +636,7 @@ def get_customers(self, service_desk_id, query=None, start=0, limit=50): :param service_desk_id: str :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) params = {} if start is not None: params["start"] = int(start) @@ -762,9 +647,7 @@ def get_customers(self, service_desk_id, query=None, start=0, limit=50): return self.get(url, headers=self.experimental_headers, params=params) - def add_customers( - self, service_desk_id, list_of_usernames=[], list_of_accountids=[] - ): + def add_customers(self, service_desk_id, list_of_usernames=[], list_of_accountids=[]): """ Adds one or more existing customers to the given service desk. If you need to create a customer, see Create customer method. @@ -777,9 +660,7 @@ def add_customers( :param list_of_accountids: list :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) data = { "usernames": list_of_usernames, "accountIds": list_of_accountids, @@ -788,9 +669,7 @@ def add_customers( log.info("Adding customers...") return self.post(url, headers=self.experimental_headers, data=data) - def remove_customers( - self, service_desk_id, list_of_usernames=[], list_of_accountids=[] - ): + def remove_customers(self, service_desk_id, list_of_usernames=[], list_of_accountids=[]): """ Removes one or more customers from a service desk. The service desk must have closed access. If any of the passed customers are @@ -802,9 +681,7 @@ def remove_customers( :param list_of_accountids: list :return: the customers added to the service desk """ - url = "rest/servicedeskapi/servicedesk/{}/customer".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/customer".format(service_desk_id) data = { "usernames": list_of_usernames, "accountIds": list_of_accountids, @@ -813,9 +690,7 @@ def remove_customers( log.info("Removing customers...") return self.delete(url, headers=self.experimental_headers, data=data) - def get_queues( - self, service_desk_id, include_count=False, start=0, limit=50 - ): + def get_queues(self, service_desk_id, include_count=False, start=0, limit=50): """ Returns a page of queues defined inside a service desk, for a given service desk ID. The returned queues will include issue counts for each queue (issueCount field) @@ -829,9 +704,7 @@ def get_queues( :param limit: int :return: a page of queues """ - url = "rest/servicedeskapi/servicedesk/{}/queue".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/queue".format(service_desk_id) params = {} if include_count is not None: @@ -843,9 +716,7 @@ def get_queues( return self.get(url, headers=self.experimental_headers, params=params) - def get_issues_in_queue( - self, service_desk_id, queue_id, start=0, limit=50 - ): + def get_issues_in_queue(self, service_desk_id, queue_id, start=0, limit=50): """ Returns a page of issues inside a queue for a given queue ID. Only fields that the queue is configured to show are returned. @@ -861,9 +732,7 @@ def get_issues_in_queue( :param limit: int :return: a page of issues """ - url = "rest/servicedeskapi/servicedesk/{0}/queue/{1}/issue".format( - service_desk_id, queue_id - ) + url = "rest/servicedeskapi/servicedesk/{0}/queue/{1}/issue".format(service_desk_id, queue_id) params = {} if start is not None: @@ -894,9 +763,7 @@ def get_plugin_license_info(self, plugin_key): Provide plugin license info :return a json specific License query """ - url = "rest/plugins/1.0/{plugin_key}-key/license".format( - plugin_key=plugin_key - ) + url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key) return self.get(url, headers=self.no_check_headers, trailing=True) def upload_plugin(self, plugin_path): @@ -907,10 +774,7 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", - path="rest/plugins/1.0/", - headers=self.no_check_headers, - trailing=True, + method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -926,9 +790,7 @@ def delete_plugin(self, plugin_key): def check_plugin_manager_status(self): url = "rest/plugins/latest/safe-mode" - return self.request( - method="GET", path=url, headers=self.safe_mode_headers - ) + return self.request(method="GET", path=url, headers=self.safe_mode_headers) def update_plugin_license(self, plugin_key, raw_license): """ @@ -946,12 +808,7 @@ def update_plugin_license(self, plugin_key, raw_license): return self.put(url, data=data, headers=app_headers) def create_request_type( - self, - service_desk_id, - request_type_id, - request_name, - request_description, - request_help_text, + self, service_desk_id, request_type_id, request_name, request_description, request_help_text, ): """ Creating a request type @@ -969,7 +826,5 @@ def create_request_type( "helpText": request_help_text, } - url = "rest/servicedeskapi/servicedesk/{}/requesttype".format( - service_desk_id - ) + url = "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id) return self.post(url, headers=self.experimental_headers, data=data) diff --git a/atlassian/utils.py b/atlassian/utils.py index 5513a8966..d812f67a2 100644 --- a/atlassian/utils.py +++ b/atlassian/utils.py @@ -27,9 +27,7 @@ def html_email(email, title=None): if not title: title = email - return '{title}'.format( - email=email, title=title - ) + return '{title}'.format(email=email, title=title) def html_list(data): diff --git a/atlassian/xray.py b/atlassian/xray.py index 2f0d5bde3..9280fbb7c 100755 --- a/atlassian/xray.py +++ b/atlassian/xray.py @@ -45,9 +45,7 @@ def get_test_runs_with_environment(self, test_key, test_environments): :param test_environments: Test execution environments separated by ','. :return: Returns the exported test runs. """ - env = "?testEnvironments={0}".format( - ",".join([re.escape(env) for env in test_environments]) - ) + env = "?testEnvironments={0}".format(",".join([re.escape(env) for env in test_environments])) url = "rest/raven/1.0/api/test/{0}/testruns{1}".format(test_key, env) return self.get(url) @@ -103,9 +101,7 @@ def get_test_step(self, test_key, test_step_id): :param test_step_id: ID of the test step. :return: Return the test step with the given id. """ - url = "rest/raven/1.0/api/test/{0}/step/{1}".format( - test_key, test_step_id - ) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) return self.get(url) def get_test_steps(self, test_key): @@ -153,9 +149,7 @@ def update_test_step(self, test_key, test_step_id, step, data, result): "result": result, "attachments": {"add": [], "remove": []}, } - url = "rest/raven/1.0/api/test/{0}/step/{1}".format( - test_key, test_step_id - ) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) return self.post(url, update) def delete_test_step(self, test_key, test_step_id): @@ -165,9 +159,7 @@ def delete_test_step(self, test_key, test_step_id): :param test_step_id: ID of the test step. :return: """ - url = "rest/raven/1.0/api/test/{0}/step/{1}".format( - test_key, test_step_id - ) + url = "rest/raven/1.0/api/test/{0}/step/{1}".format(test_key, test_step_id) return self.delete(url) # Pre-Conditions API @@ -177,9 +169,7 @@ def get_tests_with_precondition(self, precondition_key): :param precondition_key: Precondition key (eg. 'TEST-001'). :return: Return a list of the test associated with the pre-condition. """ - url = "rest/raven/1.0/api/precondition/{0}/test".format( - precondition_key - ) + url = "rest/raven/1.0/api/precondition/{0}/test".format(precondition_key) return self.get(url) def update_precondition(self, precondition_key, add=None, remove=None): @@ -195,9 +185,7 @@ def update_precondition(self, precondition_key, add=None, remove=None): if add is None: add = [] update = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/precondition/{0}/test".format( - precondition_key - ) + url = "rest/raven/1.0/api/precondition/{0}/test".format(precondition_key) return self.post(url, update) def delete_test_from_precondition(self, precondition_key, test_key): @@ -207,9 +195,7 @@ def delete_test_from_precondition(self, precondition_key, test_key): :param test_key: Test Key which should no longer be associate with the pre-condition (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/precondition/{0}/test/{1}".format( - precondition_key, test_key - ) + url = "rest/raven/1.0/api/precondition/{0}/test/{1}".format(precondition_key, test_key) return self.delete(url) # Test Set API @@ -254,9 +240,7 @@ def delete_test_from_test_set(self, test_set_key, test_key): :param test_key: Test Key which should no longer be associate with the test set (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testset/{0}/test/{1}".format( - test_set_key, test_key - ) + url = "rest/raven/1.0/api/testset/{0}/test/{1}".format(test_set_key, test_key) return self.delete(url) # Test Plans API @@ -301,9 +285,7 @@ def delete_test_from_test_plan(self, test_plan_key, test_key): :param test_key: Test Key which should no longer be associate with the test plan (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testplan/{0}/test/{1}".format( - test_plan_key, test_key - ) + url = "rest/raven/1.0/api/testplan/{0}/test/{1}".format(test_plan_key, test_key) return self.delete(url) def get_test_executions_with_test_plan(self, test_plan_key): @@ -312,14 +294,10 @@ def get_test_executions_with_test_plan(self, test_plan_key): :param test_plan_key: Test plan key (eg. 'PLAN-001'). :return: Return a list of the test executions associated with the test plan. """ - url = "rest/raven/1.0/api/testplan/{0}/testexecution".format( - test_plan_key - ) + url = "rest/raven/1.0/api/testplan/{0}/testexecution".format(test_plan_key) return self.get(url) - def update_test_plan_test_executions( - self, test_plan_key, add=None, remove=None - ): + def update_test_plan_test_executions(self, test_plan_key, add=None, remove=None): """ Associate test executions with the given test plan. :param test_plan_key: Test plan key (eg. 'PLAN-001'). @@ -332,29 +310,21 @@ def update_test_plan_test_executions( if remove is None: remove = [] update = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/testplan/{0}/testexecution".format( - test_plan_key - ) + url = "rest/raven/1.0/api/testplan/{0}/testexecution".format(test_plan_key) return self.post(url, update) - def delete_test_execution_from_test_plan( - self, test_plan_key, test_exec_key - ): + def delete_test_execution_from_test_plan(self, test_plan_key, test_exec_key): """ Remove association of the specified tests execution from the given test plan. :param test_plan_key: Test plan key (eg. 'PLAN-001'). :param test_exec_key: Test execution Key which should no longer be associate with the test plan (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testplan/{0}/testexecution/{1}".format( - test_plan_key, test_exec_key - ) + url = "rest/raven/1.0/api/testplan/{0}/testexecution/{1}".format(test_plan_key, test_exec_key) return self.delete(url) # Test Executions API - def get_tests_with_test_execution( - self, test_exec_key, detailed=False, limit=None, page=None - ): + def get_tests_with_test_execution(self, test_exec_key, detailed=False, limit=None, page=None): """ Retrieve the tests associated with the given test execution. :param test_exec_key: Test execution key (eg. 'EXEC-001'). @@ -399,9 +369,7 @@ def delete_test_from_test_execution(self, test_exec_key, test_key): :param test_key: Test Key which should no longer be associate with the test execution (eg. 'TEST-100') :return: """ - url = "rest/raven/1.0/api/testexec/{0}/test/{1}".format( - test_exec_key, test_key - ) + url = "rest/raven/1.0/api/testexec/{0}/test/{1}".format(test_exec_key, test_key) return self.delete(url) # Test Runs API @@ -514,9 +482,7 @@ def get_test_repo_folders(self, project_key): :param project_key: Project key (eg. 'FOO'). :return: Returns the list of test repository folders. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders".format( - project_key - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders".format(project_key) return self.get(url) def get_test_repo_folder(self, project_key, folder_id): @@ -526,14 +492,10 @@ def get_test_repo_folder(self, project_key, folder_id): :param folder_id: Internal folder Id. :return: Returns the test repository folder. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( - project_key, folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) return self.get(url) - def create_test_repo_folder( - self, project_key, folder_name, parent_folder_id=-1 - ): + def create_test_repo_folder(self, project_key, folder_name, parent_folder_id=-1): """ Create test repository folder for a project. :param project_key: Project key (eg. 'FOO'). @@ -542,14 +504,10 @@ def create_test_repo_folder( :return: Returns the created test repository folder. """ data = {"name": folder_name} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( - project_key, parent_folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, parent_folder_id) return self.post(url, data=data) - def update_test_repo_folder( - self, project_key, folder_id, folder_name, rank=1 - ): + def update_test_repo_folder(self, project_key, folder_id, folder_name, rank=1): """ Update test repository folder for a project. :param project_key: Project key (eg. 'FOO'). @@ -559,9 +517,7 @@ def update_test_repo_folder( :return: Returns the updated test repository folder. """ data = {"name": folder_name, "rank": rank} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( - project_key, folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) return self.put(url, data=data) def delete_test_repo_folder(self, project_key, folder_id): @@ -571,14 +527,10 @@ def delete_test_repo_folder(self, project_key, folder_id): :param folder_id: Internal folder Id. :return: Returns the delete results. """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format( - project_key, folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}".format(project_key, folder_id) return self.delete(url) - def get_test_repo_folder_tests( - self, project_key, folder_id, all_descendants=False, page=1, limit=50 - ): + def get_test_repo_folder_tests(self, project_key, folder_id, all_descendants=False, page=1, limit=50): """ Retrieve tests of a test repository folder. :param project_key: Project key (eg. 'FOO'). @@ -589,9 +541,7 @@ def get_test_repo_folder_tests( :return: Returns list of the Tests contained in a given folder of the test repository. Note: param "page" and "limit" must coexist, otherwise rest api will raise 400 """ - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format( - project_key, folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format(project_key, folder_id) params = {} if all_descendants: @@ -603,9 +553,7 @@ def get_test_repo_folder_tests( return self.get(url, params=params) - def update_test_repo_folder_tests( - self, project_key, folder_id, add=None, remove=None - ): + def update_test_repo_folder_tests(self, project_key, folder_id, add=None, remove=None): """ Update tests of a test repository folder. :param project_key: Project key (eg. 'FOO'). @@ -619,7 +567,5 @@ def update_test_repo_folder_tests( if remove is None: remove = [] data = {"add": add, "remove": remove} - url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format( - project_key, folder_id - ) + url = "rest/raven/1.0/api/testrepository/{0}/folders/{1}/tests".format(project_key, folder_id) return self.put(url, data=data) diff --git a/tox.ini b/tox.ini index f11bf45cc..dbaf15fe5 100644 --- a/tox.ini +++ b/tox.ini @@ -36,7 +36,7 @@ commands = pylint {[base]linting_targets} [testenv:black] basepython = python3 skip_install = true -deps = black==22.3.0 +deps = black commands = black --check --diff {[base]linting_targets} [testenv:mypy] From 33a227038531329cef9e88ff4207a3c0ae60d429 Mon Sep 17 00:00:00 2001 From: Gonchik Tsymzhitov Date: Sat, 3 Dec 2022 23:19:55 +0200 Subject: [PATCH 4/4] Adjust for only python3 support --- atlassian/bamboo.py | 95 +++- atlassian/bitbucket/__init__.py | 433 ++++++++++++++---- atlassian/bitbucket/base.py | 19 +- atlassian/bitbucket/cloud/base.py | 16 +- atlassian/bitbucket/cloud/common/comments.py | 7 +- .../cloud/repositories/branchRestrictions.py | 9 +- .../bitbucket/cloud/repositories/commits.py | 23 +- .../cloud/repositories/defaultReviewers.py | 6 +- .../bitbucket/cloud/repositories/pipelines.py | 29 +- .../cloud/repositories/pullRequests.py | 26 +- .../bitbucket/cloud/repositories/refs.py | 4 +- atlassian/bitbucket/server/base.py | 15 +- .../bitbucket/server/projects/__init__.py | 12 +- .../server/projects/repos/__init__.py | 21 +- atlassian/confluence.py | 277 ++++++++--- atlassian/crowd.py | 39 +- atlassian/insight.py | 28 +- atlassian/jira.py | 178 +++++-- atlassian/rest_client.py | 22 +- atlassian/service_desk.py | 85 +++- tox.ini | 4 +- 21 files changed, 1112 insertions(+), 236 deletions(-) diff --git a/atlassian/bamboo.py b/atlassian/bamboo.py index 2f8902b3b..0748d9437 100755 --- a/atlassian/bamboo.py +++ b/atlassian/bamboo.py @@ -62,7 +62,15 @@ def _get_generator( yield response def base_list_call( - self, resource, expand, favourite, clover_enabled, max_results, label=None, start_index=0, **kwargs, + self, + resource, + expand, + favourite, + clover_enabled, + max_results, + label=None, + start_index=0, + **kwargs, ): flags = [] params = {"max-results": max_results} @@ -90,7 +98,11 @@ def base_list_call( """ Projects & Plans """ def projects( - self, expand=None, favourite=False, clover_enabled=False, max_results=25, + self, + expand=None, + favourite=False, + clover_enabled=False, + max_results=25, ): return self.base_list_call( "project", @@ -134,7 +146,12 @@ def project_plans(self, project_key, start_index=0, max_results=25): ) def plans( - self, expand=None, favourite=False, clover_enabled=False, start_index=0, max_results=25, + self, + expand=None, + favourite=False, + clover_enabled=False, + start_index=0, + max_results=25, ): return self.base_list_call( "plan", @@ -184,7 +201,7 @@ def search_plans(self, search_term, fuzzy=True, start_index=0, max_results=25): resource = "rest/api/latest/search/plans" return self.get( resource, - params={"fuzzy": fuzzy, "searchTerm": search_term, "max-results": max_results, "start-index": start_index,}, + params={"fuzzy": fuzzy, "searchTerm": search_term, "max-results": max_results, "start-index": start_index}, ) def delete_plan(self, plan_key): @@ -232,12 +249,23 @@ def search_branches(self, plan_key, include_default_branch=True, max_results=25, params["start-index"] += results["max-result"] def plan_branches( - self, plan_key, expand=None, favourite=False, clover_enabled=False, max_results=25, + self, + plan_key, + expand=None, + favourite=False, + clover_enabled=False, + max_results=25, ): """api/1.0/plan/{projectKey}-{buildKey}/branch""" resource = "plan/{}/branch".format(plan_key) return self.base_list_call( - resource, expand, favourite, clover_enabled, max_results, elements_key="branches", element_key="branch", + resource, + expand, + favourite, + clover_enabled, + max_results, + elements_key="branches", + element_key="branch", ) def get_branch_info(self, plan_key, branch_name): @@ -251,7 +279,12 @@ def get_branch_info(self, plan_key, branch_name): return self.get(self.resource_url(resource)) def create_branch( - self, plan_key, branch_name, vcs_branch=None, enabled=False, cleanup_enabled=False, + self, + plan_key, + branch_name, + vcs_branch=None, + enabled=False, + cleanup_enabled=False, ): """ Method for creating branch for a specified plan. @@ -284,7 +317,12 @@ def get_vcs_branches(self, plan_key, max_results=25): """ resource = "plan/{plan_key}/vcsBranches".format(plan_key=plan_key) return self.base_list_call( - resource, start_index=0, max_results=max_results, clover_enabled=None, expand=None, favourite=None, + resource, + start_index=0, + max_results=max_results, + clover_enabled=None, + expand=None, + favourite=None, ) """ Build results """ @@ -460,7 +498,12 @@ def plan_results( ) def build_result( - self, build_key, expand=None, include_all_states=False, start=0, max_results=25, + self, + build_key, + expand=None, + include_all_states=False, + start=0, + max_results=25, ): """ Returns details of a specific build result @@ -524,7 +567,12 @@ def delete_build_result(self, build_key): return self.post(custom_resource, params=params, headers=self.form_token_headers) def execute_build( - self, plan_key, stage=None, execute_all_stages=True, custom_revision=None, **bamboo_variables, + self, + plan_key, + stage=None, + execute_all_stages=True, + custom_revision=None, + **bamboo_variables, ): """ Fire build execution for specified plan. @@ -562,7 +610,12 @@ def stop_build(self, plan_key): """ Comments & Labels """ def comments( - self, project_key, plan_key, build_number, start_index=0, max_results=25, + self, + project_key, + plan_key, + build_number, + start_index=0, + max_results=25, ): resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number) params = {"start-index": start_index, "max-results": max_results} @@ -577,7 +630,12 @@ def create_comment(self, project_key, plan_key, build_number, comment, author=No return self.post(self.resource_url(resource), data=comment_data) def labels( - self, project_key, plan_key, build_number, start_index=0, max_results=25, + self, + project_key, + plan_key, + build_number, + start_index=0, + max_results=25, ): resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number) params = {"start-index": start_index, "max-results": max_results} @@ -1002,7 +1060,8 @@ def agent_capabilities(self, agent_id, include_shared=True): :return: agents """ return self.get( - self.resource_url("agent/{}/capability".format(agent_id)), params={"includeShared": include_shared}, + self.resource_url("agent/{}/capability".format(agent_id)), + params={"includeShared": include_shared}, ) def activity(self): @@ -1020,7 +1079,10 @@ def get_custom_expiry(self, limit=25): def reports(self, max_results=25): params = {"max-results": max_results} return self._get_generator( - self.resource_url("chart/reports"), elements_key="reports", element_key="report", params=params, + self.resource_url("chart/reports"), + elements_key="reports", + element_key="report", + params=params, ) def chart( @@ -1170,7 +1232,10 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) diff --git a/atlassian/bitbucket/__init__.py b/atlassian/bitbucket/__init__.py index 4b4c26834..e537c3239 100644 --- a/atlassian/bitbucket/__init__.py +++ b/atlassian/bitbucket/__init__.py @@ -201,7 +201,10 @@ def get_associated_build_statuses(self, commit): :commit: str- commit id :return: """ - url = self.resource_url("commits/{commitId}".format(commitId=commit), api_root="rest/build-status",) + url = self.resource_url( + "commits/{commitId}".format(commitId=commit), + api_root="rest/build-status", + ) return self.get(url) def _url_announcement_banner(self): @@ -245,7 +248,10 @@ def upload_plugin(self, plugin_path): :return: """ upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={}".format(upm_token) files = {"plugin": open(plugin_path, "rb")} @@ -604,7 +610,11 @@ def disable_project_repo_hook_settings(self, project_key, hook_key): def _url_project_conditions(self, project_key): return "{}/conditions".format( - self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0",) + self._url_project( + project_key, + api_root="rest/default-reviewers", + api_version="1.0", + ) ) def get_project_conditions(self, project_key): @@ -621,7 +631,11 @@ def get_project_conditions(self, project_key): def _url_project_condition(self, project_key, id_condition=None): url = "{}/condition".format( - self._url_project(project_key, api_root="rest/default-reviewers", api_version="1.0",) + self._url_project( + project_key, + api_root="rest/default-reviewers", + api_version="1.0", + ) ) if id_condition is not None: url += "/{}".format(id_condition) @@ -788,7 +802,12 @@ def reindex_repo(self, project_key, repository_slug): :return: """ url = "{urlRepo}/sync".format( - urlRepo=self._url_repo(project_key, repository_slug, api_root="rest/indexing", api_version="1.0",) + urlRepo=self._url_repo( + project_key, + repository_slug, + api_root="rest/indexing", + api_version="1.0", + ) ) return self.post(url) @@ -870,7 +889,11 @@ def fork_repository(self, project_key, repository_slug, new_repository_slug): return self.post(url, data=body) def fork_repository_new_project( - self, project_key, repository_slug, new_project_key, new_repository_slug, + self, + project_key, + repository_slug, + new_project_key, + new_repository_slug, ): """ Forks a repository to a separate project. @@ -1235,7 +1258,13 @@ def _url_repo_tags(self, project_key, repository_slug, api_root=None): return "{}/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root)) def get_tags( - self, project_key, repository_slug, filter="", limit=1000, order_by=None, start=0, + self, + project_key, + repository_slug, + filter="", + limit=1000, + order_by=None, + start=0, ): """ Retrieve the tags matching the supplied filterText param. @@ -1278,7 +1307,12 @@ def get_project_tags(self, project_key, repository_slug, tag_name=None): return self._get_paged(url) def set_tag( - self, project_key, repository_slug, tag_name, commit_revision, description=None, + self, + project_key, + repository_slug, + tag_name, + commit_revision, + description=None, ): """ Creates a tag using the information provided in the {@link RestCreateTagRequest request} @@ -1309,14 +1343,22 @@ def delete_tag(self, project_key, repository_slug, tag_name): :param tag_name: :return: """ - url = "{}/{}".format(self._url_repo_tags(project_key, repository_slug, api_root="rest/git"), tag_name,) + url = "{}/{}".format( + self._url_repo_tags(project_key, repository_slug, api_root="rest/git"), + tag_name, + ) return self.delete(url) def _url_repo_hook_settings(self, project_key, repository_slug): return "{}/settings/hooks".format(self._url_repo(project_key, repository_slug)) def all_repo_hook_settings( - self, project_key, repository_slug, start=0, limit=None, filter_type=None, + self, + project_key, + repository_slug, + start=0, + limit=None, + filter_type=None, ): """ Get all repository hooks for a given repo @@ -1347,7 +1389,10 @@ def get_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) + url = "{}/{}".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.get(url) def enable_repo_hook_settings(self, project_key, repository_slug, hook_key): @@ -1358,7 +1403,10 @@ def enable_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) + url = "{}/{}/enabled".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.put(url) def disable_repo_hook_settings(self, project_key, repository_slug, hook_key): @@ -1369,14 +1417,21 @@ def disable_repo_hook_settings(self, project_key, repository_slug, hook_key): :param hook_key: The repository hook key :return: """ - url = "{}/{}/enabled".format(self._url_repo_hook_settings(project_key, repository_slug), hook_key,) + url = "{}/{}/enabled".format( + self._url_repo_hook_settings(project_key, repository_slug), + hook_key, + ) return self.delete(url) def _url_webhooks(self, project_key, repository_slug): return "{}/webhooks".format(self._url_repo(project_key, repository_slug)) def get_webhooks( - self, project_key, repository_slug, event=None, statistics=False, + self, + project_key, + repository_slug, + event=None, + statistics=False, ): """ Get webhooks @@ -1395,7 +1450,14 @@ def get_webhooks( return self._get_paged(url, params=params) def create_webhook( - self, project_key, repository_slug, name, events, webhook_url, active, secret=None, + self, + project_key, + repository_slug, + name, + events, + webhook_url, + active, + secret=None, ): """Creates a webhook using the information provided in the request. @@ -1491,7 +1553,14 @@ def _url_pull_requests(self, project_key, repository_slug): return "{}/pull-requests".format(self._url_repo(project_key, repository_slug)) def get_pull_requests( - self, project_key, repository_slug, state="OPEN", order="newest", limit=100, start=0, at=None, + self, + project_key, + repository_slug, + state="OPEN", + order="newest", + limit=100, + start=0, + at=None, ): """ Get pull requests @@ -1552,11 +1621,19 @@ def open_pull_request( "description": description, "fromRef": { "id": source_branch, - "repository": {"slug": source_repo, "name": source_repo, "project": {"key": source_project},}, + "repository": { + "slug": source_repo, + "name": source_repo, + "project": {"key": source_project}, + }, }, "toRef": { "id": destination_branch, - "repository": {"slug": dest_repo, "name": dest_repo, "project": {"key": dest_project},}, + "repository": { + "slug": dest_repo, + "name": dest_repo, + "project": {"key": dest_project}, + }, }, "reviewers": [], } @@ -1585,7 +1662,10 @@ def create_pull_request(self, project_key, repository_slug, data): return self.post(url, data=data) def _url_pull_request(self, project_key, repository_slug, pull_request_id): - return "{}/{}".format(self._url_pull_requests(project_key, repository_slug), pull_request_id,) + return "{}/{}".format( + self._url_pull_requests(project_key, repository_slug), + pull_request_id, + ) def get_pull_request(self, project_key, repository_slug, pull_request_id): """ @@ -1608,7 +1688,11 @@ def get_pullrequest(self, *args, **kwargs): return self.get_pull_request(*args, **kwargs) def delete_pull_request( - self, project_key, repository_slug, pull_request_id, pull_request_version, + self, + project_key, + repository_slug, + pull_request_id, + pull_request_version, ): """ Delete a pull request. @@ -1624,7 +1708,12 @@ def delete_pull_request( return self.delete(url, data=data) def get_pull_requests_activities( - self, project_key, repository_slug, pull_request_id, start=0, limit=None, + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, ): """ Get pull requests activities @@ -1644,7 +1733,12 @@ def get_pull_requests_activities( return self._get_paged(url, params) def get_pull_requests_changes( - self, project_key, repository_slug, pull_request_id, start=0, limit=None, + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, ): """ Get pull requests changes @@ -1664,7 +1758,12 @@ def get_pull_requests_changes( return self._get_paged(url, params) def get_pull_requests_commits( - self, project_key, repository_slug, pull_request_id, start=0, limit=None, + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, ): """ Get pull requests commits @@ -1686,10 +1785,18 @@ def get_pull_requests_commits( return self._get_paged(url, params) def _url_pull_request_participants(self, project_key, repository_slug, pull_request_id): - return "{}/{}/participants".format(self._url_pull_requests(project_key, repository_slug), pull_request_id,) + return "{}/{}/participants".format( + self._url_pull_requests(project_key, repository_slug), + pull_request_id, + ) def get_pull_requests_participants( - self, project_key, repository_slug, pull_request_id, start=0, limit=None, + self, + project_key, + repository_slug, + pull_request_id, + start=0, + limit=None, ): """ Get all participants of a pull request @@ -1721,7 +1828,8 @@ def change_reviewed_status(self, project_key, repository_slug, pull_request_id, :return: """ url = "{}/{}".format( - self._url_pull_request_participants(project_key, repository_slug, pull_request_id), user_slug, + self._url_pull_request_participants(project_key, repository_slug, pull_request_id), + user_slug, ) approved = True if status == "APPROVED" else False data = { @@ -1736,7 +1844,12 @@ def _url_pull_request_comments(self, project_key, repository_slug, pull_request_ return url def add_pull_request_comment( - self, project_key, repository_slug, pull_request_id, text, parent_id=None, + self, + project_key, + repository_slug, + pull_request_id, + text, + parent_id=None, ): """ Add comment into pull request @@ -1756,7 +1869,8 @@ def add_pull_request_comment( def _url_pull_request_comment(self, project_key, repository_slug, pull_request_id, comment_id): url = "{}/{}".format( - self._url_pull_request_comments(project_key, repository_slug, pull_request_id), comment_id, + self._url_pull_request_comments(project_key, repository_slug, pull_request_id), + comment_id, ) return url @@ -1775,7 +1889,13 @@ def get_pull_request_comment(self, project_key, repository_slug, pull_request_id return self.get(url) def update_pull_request_comment( - self, project_key, repository_slug, pull_request_id, comment_id, comment, comment_version, + self, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment, + comment_version, ): """ Update the text of a comment. @@ -1791,17 +1911,31 @@ def update_pull_request_comment( @deprecated(version="2.4.2", reason="Use delete_pull_request_comment()") def delete_pull_reques_comment( - self, project_key, repository_slug, pull_request_id, comment_id, comment_version, + self, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, ): """ Deprecated name since 2.4.2. Let's use the get_pull_request() """ return self.delete_pull_request_comment( - project_key, repository_slug, pull_request_id, comment_id, comment_version, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, ) def delete_pull_request_comment( - self, project_key, repository_slug, pull_request_id, comment_id, comment_version, + self, + project_key, + repository_slug, + pull_request_id, + comment_id, + comment_version, ): """ Delete a comment. @@ -1999,7 +2133,12 @@ def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest) def _url_commits(self, project_key, repository_slug, api_root=None, api_version=None): return "{}/commits".format( - self._url_repo(project_key, repository_slug, api_root=api_root, api_version=api_version,) + self._url_repo( + project_key, + repository_slug, + api_root=api_root, + api_version=api_version, + ) ) def get_commits( @@ -2053,10 +2192,21 @@ def get_commits( return self._get_paged(url, params=params) def _url_commit( - self, project_key, repository_slug, commit_id, api_root=None, api_version=None, + self, + project_key, + repository_slug, + commit_id, + api_root=None, + api_version=None, ): return "{}/{}".format( - self._url_commits(project_key, repository_slug, api_root=api_root, api_version=api_version,), commit_id, + self._url_commits( + project_key, + repository_slug, + api_root=api_root, + api_version=api_version, + ), + commit_id, ) def get_commit_info(self, project_key, repository_slug, commit, path=None): @@ -2088,7 +2238,13 @@ def get_pull_requests_contain_commit(self, project_key, repository_slug, commit) return (self.get(url) or {}).get("values") def get_changelog( - self, project_key, repository_slug, ref_from, ref_to, start=0, limit=None, + self, + project_key, + repository_slug, + ref_from, + ref_to, + start=0, + limit=None, ): """ Get change log between 2 refs @@ -2115,7 +2271,13 @@ def get_changelog( def _url_code_insights_annotations(self, project_key, repository_slug, commit_id, report_key): return "{}/reports/{}/annotations".format( - self._url_commit(project_key, repository_slug, commit_id, api_root="rest/insights", api_version="1.0",), + self._url_commit( + project_key, + repository_slug, + commit_id, + api_root="rest/insights", + api_version="1.0", + ), report_key, ) @@ -2136,7 +2298,13 @@ def add_code_insights_annotations_to_report(self, project_key, repository_slug, def _url_code_insights_report(self, project_key, repository_slug, commit_id, report_key): return "{}/reports/{}".format( - self._url_commit(project_key, repository_slug, commit_id, api_root="rest/insights", api_version="1.0",), + self._url_commit( + project_key, + repository_slug, + commit_id, + api_root="rest/insights", + api_version="1.0", + ), report_key, ) @@ -2163,7 +2331,13 @@ def delete_code_insights_report(self, project_key, repository_slug, commit_id, r return self.delete(url) def create_code_insights_report( - self, project_key, repository_slug, commit_id, report_key, report_title, **report_params, + self, + project_key, + repository_slug, + commit_id, + report_key, + report_title, + **report_params, ): """ Create a new insight report, or replace the existing one @@ -2185,7 +2359,13 @@ def create_code_insights_report( return self.put(url, data=data) def get_file_list( - self, project_key, repository_slug, sub_folder=None, query=None, start=0, limit=None, + self, + project_key, + repository_slug, + sub_folder=None, + query=None, + start=0, + limit=None, ): """ Retrieve a page of files from particular directory of a repository. @@ -2235,14 +2415,28 @@ def get_content_of_file(self, project_key, repository_slug, filename, at=None, m def _url_branches_permissions(self, project_key, permission_id=None, repository_slug=None): if repository_slug is None: - base = self._url_project(project_key, api_root="rest/branch-permissions", api_version="2.0",) + base = self._url_project( + project_key, + api_root="rest/branch-permissions", + api_version="2.0", + ) else: - base = self._url_repo(project_key, repository_slug, api_root="rest/branch-permissions", api_version="2.0",) + base = self._url_repo( + project_key, + repository_slug, + api_root="rest/branch-permissions", + api_version="2.0", + ) return "{}/restrictions/{}".format(base, "" if permission_id is None else str(permission_id)) def get_branches_permissions( - self, project_key, permission_id, repository_slug=None, start=0, limit=25, + self, + project_key, + permission_id, + repository_slug=None, + start=0, + limit=25, ): """ Get branches permissions from a given repo @@ -2311,7 +2505,10 @@ def set_branches_permissions( "matcher": { "id": matcher_value, "displayId": matcher_value, - "type": {"id": matcher_type.upper(), "name": matcher_type.capitalize(),}, + "type": { + "id": matcher_type.upper(), + "name": matcher_type.capitalize(), + }, "active": True, }, "users": except_users, @@ -2360,7 +2557,12 @@ def all_branches_permissions(self, project_key, permission_id, repository_slug=N def _url_branching_model(self, project_key, repository_slug): return "{}/branchmodel/configuration".format( - self._url_repo(project_key, repository_slug, api_root="rest/branch-utils", api_version="1.0",) + self._url_repo( + project_key, + repository_slug, + api_root="rest/branch-utils", + api_version="1.0", + ) ) def get_branching_model(self, project_key, repository_slug): @@ -2394,10 +2596,30 @@ def enable_branching_model(self, project_key, repository_slug): default_model_data = { "development": {"refId": None, "useDefault": True}, "types": [ - {"displayName": "Bugfix", "enabled": True, "id": "BUGFIX", "prefix": "bugfix/",}, - {"displayName": "Feature", "enabled": True, "id": "FEATURE", "prefix": "feature/",}, - {"displayName": "Hotfix", "enabled": True, "id": "HOTFIX", "prefix": "hotfix/",}, - {"displayName": "Release", "enabled": True, "id": "RELEASE", "prefix": "release/",}, + { + "displayName": "Bugfix", + "enabled": True, + "id": "BUGFIX", + "prefix": "bugfix/", + }, + { + "displayName": "Feature", + "enabled": True, + "id": "FEATURE", + "prefix": "feature/", + }, + { + "displayName": "Hotfix", + "enabled": True, + "id": "HOTFIX", + "prefix": "hotfix/", + }, + { + "displayName": "Release", + "enabled": True, + "id": "RELEASE", + "prefix": "release/", + }, ], } return self.set_branching_model(project_key, repository_slug, default_model_data) @@ -2430,7 +2652,14 @@ def upload_file(self, project_key, repository_slug, content, message, branch, fi return self.put(url, files=data) def update_file( - self, project_key, repository_slug, content, message, branch, filename, source_commit_id, + self, + project_key, + repository_slug, + content, + message, + branch, + filename, + source_commit_id, ): """ Update existing file for given branch. @@ -2459,7 +2688,10 @@ def search_code(self, team, search_query, page=1, limit=10): :search_query: str """ url = self.resource_url("teams/{team}/search/code".format(team=team)) - return self.get(url, params={"search_query": search_query, "page": page, "pagelen": limit,},) + return self.get( + url, + params={"search_query": search_query, "page": page, "pagelen": limit}, + ) def get_lfs_repo_status(self, project_key, repo): url = "rest/git-lfs/admin/projects/{projectKey}/repos/{repositorySlug}/enabled".format( @@ -2478,7 +2710,12 @@ def set_lfs_repo_status(self, project_key, repo, enable=True): def _url_repo_conditions(self, project_key, repo_key): return "{}/conditions".format( - self._url_repo(project_key, repo_key, api_root="rest/default-reviewers", api_version="1.0",) + self._url_repo( + project_key, + repo_key, + api_root="rest/default-reviewers", + api_version="1.0", + ) ) def get_repo_conditions(self, project_key, repo_key): @@ -2535,7 +2772,12 @@ def get_repo_repo_conditions(self, project_key, repo_key): def _url_repo_condition(self, project_key, repo_key, id_condition=None): return "{}/condition/{}".format( - self._url_repo(project_key, repo_key, api_root="rest/default-reviewers", api_version="1.0",), + self._url_repo( + project_key, + repo_key, + api_root="rest/default-reviewers", + api_version="1.0", + ), "" if id_condition is None else str(id_condition), ) @@ -2658,7 +2900,8 @@ def download_repo_archive( dest_fd.write(chunk) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_repositories(self, workspace, role=None, query=None, sort=None): """ @@ -2678,7 +2921,8 @@ def get_repositories(self, workspace, role=None, query=None, sort=None): ] @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipelines(self, workspace, repository_slug, number=10, sort_by="-created_on"): """ @@ -2705,10 +2949,16 @@ def get_pipelines(self, workspace, repository_slug, number=10, sort_by="-created return values @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def trigger_pipeline( - self, workspace, repository_slug, branch="master", revision=None, name=None, + self, + workspace, + repository_slug, + branch="master", + revision=None, + name=None, ): """ Trigger a new pipeline. The following options are possible (1 and 2 @@ -2728,7 +2978,8 @@ def trigger_pipeline( ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline(self, workspace, repository_slug, uuid): """ @@ -2746,7 +2997,8 @@ def get_pipeline(self, workspace, repository_slug, uuid): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def stop_pipeline(self, workspace, repository_slug, uuid): """ @@ -2766,7 +3018,8 @@ def stop_pipeline(self, workspace, repository_slug, uuid): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline_steps(self, workspace, repository_slug, uuid): """ @@ -2788,7 +3041,8 @@ def get_pipeline_steps(self, workspace, repository_slug, uuid): return values @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline_step(self, workspace, repository_slug, pipeline_uuid, step_uuid): """ @@ -2808,7 +3062,8 @@ def get_pipeline_step(self, workspace, repository_slug, pipeline_uuid, step_uuid ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_pipeline_step_log(self, workspace, repository_slug, pipeline_uuid, step_uuid): """ @@ -2829,10 +3084,17 @@ def get_pipeline_step_log(self, workspace, repository_slug, pipeline_uuid, step_ ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def create_issue( - self, workspace, repository_slug, title, description="", kind="bug", priority="major", + self, + workspace, + repository_slug, + title, + description="", + kind="bug", + priority="major", ): """ Create a new issue in the issue tracker of the given repository. @@ -2847,12 +3109,18 @@ def create_issue( Cloud(self.url, **self._new_session_args) .workspaces.get(workspace) .repositories.get(repository_slug) - .issues.create(title=title, description=description, kind=kind, priority=priority,) + .issues.create( + title=title, + description=description, + kind=kind, + priority=priority, + ) .data ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_issues(self, workspace, repository_slug, sort_by=None, query=None): """ @@ -2879,7 +3147,8 @@ def get_issues(self, workspace, repository_slug, sort_by=None, query=None): return values @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_issue(self, workspace, repository_slug, id): """ @@ -2894,7 +3163,8 @@ def get_issue(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def update_issue(self, workspace, repository_slug, id, **fields): """ @@ -2911,7 +3181,8 @@ def update_issue(self, workspace, repository_slug, id, **fields): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_issue(self, workspace, repository_slug, id): """ @@ -2926,7 +3197,8 @@ def delete_issue(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def add_branch_restriction( self, @@ -2978,7 +3250,8 @@ def add_branch_restriction( ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_branch_restrictions(self, workspace, repository_slug, kind=None, pattern=None, number=10): """ @@ -2998,7 +3271,8 @@ def get_branch_restrictions(self, workspace, repository_slug, kind=None, pattern return values @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def update_branch_restriction(self, workspace, repository_slug, id, **fields): """ @@ -3015,7 +3289,8 @@ def update_branch_restriction(self, workspace, repository_slug, id, **fields): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_branch_restriction(self, workspace, repository_slug, id): """ @@ -3030,7 +3305,8 @@ def delete_branch_restriction(self, workspace, repository_slug, id): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def add_default_reviewer(self, workspace, repository_slug, user): """ @@ -3050,7 +3326,8 @@ def add_default_reviewer(self, workspace, repository_slug, user): ) @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def get_default_reviewers(self, workspace, repository_slug, number=10): """ @@ -3070,7 +3347,8 @@ def get_default_reviewers(self, workspace, repository_slug, number=10): return values @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def is_default_reviewer(self, workspace, repository_slug, user): """ @@ -3093,7 +3371,8 @@ def is_default_reviewer(self, workspace, repository_slug, user): return True @deprecated( - version="2.0.2", reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", + version="2.0.2", + reason="Use atlassian.bitbucket.cloud instead of atlassian.bitbucket", ) def delete_default_reviewer(self, workspace, repository_slug, user): """ diff --git a/atlassian/bitbucket/base.py b/atlassian/bitbucket/base.py index ae5053e13..6e920b952 100644 --- a/atlassian/bitbucket/base.py +++ b/atlassian/bitbucket/base.py @@ -39,7 +39,13 @@ def __str__(self): return PrettyPrinter(indent=4).pformat(self.__data if self.__data else self) def _get_paged( - self, url, params=None, data=None, flags=None, trailing=None, absolute=False, + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, ): """ Used to get the paged data @@ -58,7 +64,14 @@ def _get_paged( params = {} while True: - response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute,) + response = self.get( + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, + ) if "values" not in response: return @@ -95,7 +108,7 @@ def _default_timeformat_lambda(timestamp): def _check_timeformat_lambda(self): """ - Check the lambda for for the time format. Raise an exception if the the value is wrong + Check the lambda for the time format. Raise an exception if the value is wrong """ LAMBDA = lambda: 0 # noqa: E731 if self.timeformat_lambda is None or ( diff --git a/atlassian/bitbucket/cloud/base.py b/atlassian/bitbucket/cloud/base.py index d8fdde3ab..1b80a7545 100644 --- a/atlassian/bitbucket/cloud/base.py +++ b/atlassian/bitbucket/cloud/base.py @@ -38,7 +38,14 @@ def get_link(self, link): return links[link]["href"] def _get_paged( - self, url, params=None, data=None, flags=None, trailing=None, absolute=False, paging_workaround=False, + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, + paging_workaround=False, ): """ Used to get the paged data @@ -62,7 +69,12 @@ def _get_paged( while True: response = super(BitbucketCloudBase, self).get( - url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute, + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, ) if len(response.get("values", [])) == 0: return diff --git a/atlassian/bitbucket/cloud/common/comments.py b/atlassian/bitbucket/cloud/common/comments.py index a51a5e4e0..e8a705f25 100644 --- a/atlassian/bitbucket/cloud/common/comments.py +++ b/atlassian/bitbucket/cloud/common/comments.py @@ -5,7 +5,12 @@ class Comment(BitbucketCloudBase): def __init__(self, data, *args, **kwargs): super(Comment, self).__init__( - None, None, *args, data=data, expected_type="pullrequest_comment", **kwargs, + None, + None, + *args, + data=data, + expected_type="pullrequest_comment", + **kwargs, ) @property diff --git a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py index 5ed5711f7..64cf72bbd 100644 --- a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py +++ b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py @@ -11,7 +11,14 @@ def __get_object(self, data): return BranchRestriction(data, **self._new_session_args) def create( - self, kind, branch_match_kind="glob", branch_pattern="*", branch_type=None, users=None, groups=None, value=None, + self, + kind, + branch_match_kind="glob", + branch_pattern="*", + branch_type=None, + users=None, + groups=None, + value=None, ): """ Add a new branch restriction. diff --git a/atlassian/bitbucket/cloud/repositories/commits.py b/atlassian/bitbucket/cloud/repositories/commits.py index 8ed4f49d7..51a7f992c 100644 --- a/atlassian/bitbucket/cloud/repositories/commits.py +++ b/atlassian/bitbucket/cloud/repositories/commits.py @@ -48,7 +48,10 @@ def get(self, commit_hash): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get """ return self.__get_object( - super(Commits, self).get(self.url_joiner(self.get_link("commit"), commit_hash), absolute=True,) + super(Commits, self).get( + self.url_joiner(self.get_link("commit"), commit_hash), + absolute=True, + ) ) @@ -107,7 +110,12 @@ def builds(self): yield Build(build, **self._new_session_args) def add_build( - self, key, url=None, description=None, refname=None, state=Build.STATE_INPROGRESS, + self, + key, + url=None, + description=None, + refname=None, + state=Build.STATE_INPROGRESS, ): """ Add new build status to commit. @@ -130,7 +138,10 @@ def get_build(self, key): API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-get """ - return Build(super(Commit, self).get(self.url_joiner("statuses/build", key)), **self._new_session_args,) + return Build( + super(Commit, self).get(self.url_joiner("statuses/build", key)), + **self._new_session_args, + ) def comments(self): """ @@ -150,7 +161,11 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message,}} + data = { + "content": { + "raw": raw_message, + } + } return self.post("comments", data) diff --git a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py index 77401ce15..09ba81580 100644 --- a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py +++ b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py @@ -11,7 +11,11 @@ def __init__(self, url, *args, **kwargs): super(DefaultReviewers, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return DefaultReviewer(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args,) + return DefaultReviewer( + self.url_joiner(self.url, data["uuid"]), + data, + **self._new_session_args, + ) def add(self, user): """ diff --git a/atlassian/bitbucket/cloud/repositories/pipelines.py b/atlassian/bitbucket/cloud/repositories/pipelines.py index dc64515cd..7f8144ec9 100644 --- a/atlassian/bitbucket/cloud/repositories/pipelines.py +++ b/atlassian/bitbucket/cloud/repositories/pipelines.py @@ -11,7 +11,11 @@ def __init__(self, url, *args, **kwargs): super(Pipelines, self).__init__(url, *args, **kwargs) def __get_object(self, data): - return Pipeline(self.url_joiner(self.url, data["uuid"]), data, **self._new_session_args,) + return Pipeline( + self.url_joiner(self.url, data["uuid"]), + data, + **self._new_session_args, + ) def trigger(self, branch="master", commit=None, pattern=None, variables=None): """ @@ -36,7 +40,11 @@ def trigger(self, branch="master", commit=None, pattern=None, variables=None): API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pipelines/#post """ data = { - "target": {"ref_type": "branch", "type": "pipeline_ref_target", "ref_name": branch,}, + "target": { + "ref_type": "branch", + "type": "pipeline_ref_target", + "ref_name": branch, + }, } if commit is not None: data["target"]["commit"] = { @@ -71,7 +79,12 @@ def each(self, q=None, sort=None): params["sort"] = sort if q is not None: params["q"] = q - for pipeline in self._get_paged(None, trailing=True, paging_workaround=True, params=params,): + for pipeline in self._get_paged( + None, + trailing=True, + paging_workaround=True, + params=params, + ): yield self.__get_object(pipeline) return @@ -94,7 +107,11 @@ def __init__(self, url, data, *args, **kwargs): super(Pipeline, self).__init__(url, *args, data=data, expected_type="pipeline", **kwargs) def __get_object(self, data): - return Step("{}/steps/{}".format(self.url, data["uuid"]), data, **self._new_session_args,) + return Step( + "{}/steps/{}".format(self.url, data["uuid"]), + data, + **self._new_session_args, + ) @property def uuid(self): @@ -127,7 +144,9 @@ def pullrequest(self): target = self.get_data("target") if target["type"] == "pipeline_pullrequest_target": return PullRequest( - target["pullrequest"]["links"]["self"]["href"], target["pullrequest"], **self._new_session_args, + target["pullrequest"]["links"]["self"]["href"], + target["pullrequest"], + **self._new_session_args, ) else: return None diff --git a/atlassian/bitbucket/cloud/repositories/pullRequests.py b/atlassian/bitbucket/cloud/repositories/pullRequests.py index 0a4d6898a..44d38f631 100644 --- a/atlassian/bitbucket/cloud/repositories/pullRequests.py +++ b/atlassian/bitbucket/cloud/repositories/pullRequests.py @@ -19,7 +19,13 @@ def __get_object(self, data): return PullRequest(data, **self._new_session_args) def create( - self, title, source_branch, destination_branch=None, description=None, close_source_branch=None, reviewers=None, + self, + title, + source_branch, + destination_branch=None, + description=None, + close_source_branch=None, + reviewers=None, ): """ Creates a new pull requests for a given source branch @@ -287,7 +293,11 @@ def comment(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message,}} + data = { + "content": { + "raw": raw_message, + } + } return self.post("comments", data) @@ -311,7 +321,11 @@ def add_task(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message,}} + data = { + "content": { + "raw": raw_message, + } + } return Task(self.post("tasks", data), **self._new_session_args) @@ -436,7 +450,11 @@ def update(self, raw_message): if not raw_message: raise ValueError("No message set") - data = {"content": {"raw": raw_message,}} + data = { + "content": { + "raw": raw_message, + } + } return self._update_data(self.put(None, data=data)) def delete(self): diff --git a/atlassian/bitbucket/cloud/repositories/refs.py b/atlassian/bitbucket/cloud/repositories/refs.py index 806fb5d24..0af321801 100644 --- a/atlassian/bitbucket/cloud/repositories/refs.py +++ b/atlassian/bitbucket/cloud/repositories/refs.py @@ -16,7 +16,9 @@ def __init__(self, url, *args, **kwargs): super(Refs, self).__init__(url, *args, **kwargs) def create( - self, name, commit, + self, + name, + commit, ): """ Creates a ref with the given target commit diff --git a/atlassian/bitbucket/server/base.py b/atlassian/bitbucket/server/base.py index 565a60924..7d23b5f28 100644 --- a/atlassian/bitbucket/server/base.py +++ b/atlassian/bitbucket/server/base.py @@ -18,7 +18,13 @@ def get_link(self, link): return [x["href"] for x in links[link]] def _get_paged( - self, url, params=None, data=None, flags=None, trailing=False, absolute=False, + self, + url, + params=None, + data=None, + flags=None, + trailing=False, + absolute=False, ): """ Used to get the paged data @@ -37,7 +43,12 @@ def _get_paged( while True: response = super(BitbucketServerBase, self).get( - url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute, + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, ) if "values" not in response: return diff --git a/atlassian/bitbucket/server/projects/__init__.py b/atlassian/bitbucket/server/projects/__init__.py index de9c51b61..0526ad2e3 100644 --- a/atlassian/bitbucket/server/projects/__init__.py +++ b/atlassian/bitbucket/server/projects/__init__.py @@ -110,8 +110,16 @@ def exists(self, project, by="key"): class Project(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Project, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups(self._sub_url("permissions/groups"), "PROJECT", **self._new_session_args,) - self.__users = Users(self._sub_url("permissions/users"), "PROJECT", **self._new_session_args,) + self.__groups = Groups( + self._sub_url("permissions/groups"), + "PROJECT", + **self._new_session_args, + ) + self.__users = Users( + self._sub_url("permissions/users"), + "PROJECT", + **self._new_session_args, + ) self.__repos = Repositories(self._sub_url("repos"), **self._new_session_args) def delete(self): diff --git a/atlassian/bitbucket/server/projects/repos/__init__.py b/atlassian/bitbucket/server/projects/repos/__init__.py index a590c25dc..c042d80bf 100644 --- a/atlassian/bitbucket/server/projects/repos/__init__.py +++ b/atlassian/bitbucket/server/projects/repos/__init__.py @@ -81,8 +81,16 @@ def exists(self, repository, by="slug"): class Repository(BitbucketServerBase): def __init__(self, data, *args, **kwargs): super(Repository, self).__init__(None, *args, data=data, **kwargs) - self.__groups = Groups(self._sub_url("permissions/groups"), "REPO", **self._new_session_args,) - self.__users = Users(self._sub_url("permissions/users"), "REPO", **self._new_session_args,) + self.__groups = Groups( + self._sub_url("permissions/groups"), + "REPO", + **self._new_session_args, + ) + self.__users = Users( + self._sub_url("permissions/users"), + "REPO", + **self._new_session_args, + ) def __get_object(self, data): return Repository(data, **self._new_session_args) @@ -277,7 +285,14 @@ def users(self): return self.__users def download_archive( - self, dest_fd, at=None, filename=None, format=None, path=None, prefix=None, chunk_size=128, + self, + dest_fd, + at=None, + filename=None, + format=None, + path=None, + prefix=None, + chunk_size=128, ): """ Downloads a repository archive. diff --git a/atlassian/confluence.py b/atlassian/confluence.py index af6d31341..b6da40a2b 100644 --- a/atlassian/confluence.py +++ b/atlassian/confluence.py @@ -52,7 +52,13 @@ def _create_body(body, representation): return {representation: {"value": body, "representation": representation}} def _get_paged( - self, url, params=None, data=None, flags=None, trailing=None, absolute=False, + self, + url, + params=None, + data=None, + flags=None, + trailing=None, + absolute=False, ): """ Used to get the paged data @@ -71,7 +77,14 @@ def _get_paged( params = {} while True: - response = self.get(url, trailing=trailing, params=params, data=data, flags=flags, absolute=absolute,) + response = self.get( + url, + trailing=trailing, + params=params, + data=data, + flags=flags, + absolute=absolute, + ) if "results" not in response: return @@ -112,7 +125,8 @@ def page_exists(self, space, title): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -291,7 +305,8 @@ def get_page_by_title(self, space, title, start=0, limit=1, expand=None): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -378,7 +393,14 @@ def get_page_labels(self, page_id, prefix=None, start=None, limit=None): return response def get_page_comments( - self, content_id, expand=None, parent_version=None, start=0, limit=25, location=None, depth=None, + self, + content_id, + expand=None, + parent_version=None, + start=0, + limit=25, + location=None, + depth=None, ): """ @@ -431,7 +453,8 @@ def get_draft_page_by_id(self, page_id, status="draft"): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -467,7 +490,13 @@ def get_all_pages_by_label(self, label, start=0, limit=50): return response.get("results") def get_all_pages_from_space( - self, space, start=0, limit=50, status=None, expand=None, content_type="page", + self, + space, + start=0, + limit=50, + status=None, + expand=None, + content_type="page", ): """ Get all pages from space @@ -505,7 +534,8 @@ def get_all_pages_from_space( except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -561,7 +591,8 @@ def get_all_draft_pages_from_space_through_cql(self, space, start=0, limit=500, except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -617,7 +648,8 @@ def remove_content(self, content_id): ) if e.response.status_code == 409: raise ApiConflictError( - "There is a stale data object conflict when trying to delete a draft", reason=e, + "There is a stale data object conflict when trying to delete a draft", + reason=e, ) raise @@ -653,7 +685,8 @@ def remove_page(self, page_id, status=None, recursive=False): ) if e.response.status_code == 409: raise ApiConflictError( - "There is a stale data object conflict when trying to delete a draft", reason=e, + "There is a stale data object conflict when trying to delete a draft", + reason=e, ) raise @@ -661,7 +694,15 @@ def remove_page(self, page_id, status=None, recursive=False): return response def create_page( - self, space, title, body, parent_id=None, type="page", representation="storage", editor=None, full_width=False, + self, + space, + title, + body, + parent_id=None, + type="page", + representation="storage", + editor=None, + full_width=False, ): """ Create page from scratch @@ -696,7 +737,8 @@ def create_page( except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -704,7 +746,12 @@ def create_page( return response def move_page( - self, space_key, page_id, target_id=None, target_title=None, position="append", + self, + space_key, + page_id, + target_id=None, + target_title=None, + position="append", ): """ Move page method @@ -726,7 +773,14 @@ def move_page( return self.post(url, params=params, headers=self.no_check_headers) def create_or_update_template( - self, name, body, template_type="page", template_id=None, description=None, labels=None, space=None, + self, + name, + body, + template_type="page", + template_id=None, + description=None, + labels=None, + space=None, ): """ Creates a new or updates an existing content template. @@ -852,7 +906,8 @@ def get_all_blueprints_from_space(self, space, start=0, limit=None, expand=None) except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -887,7 +942,8 @@ def get_blueprint_templates(self, space=None, start=0, limit=None, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -922,7 +978,8 @@ def get_all_templates_from_space(self, space, start=0, limit=None, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -956,7 +1013,8 @@ def get_content_templates(self, space=None, start=0, limit=None, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -981,7 +1039,12 @@ def remove_template(self, template_id): return self.delete("rest/api/template/{}".format(template_id)) def get_all_spaces( - self, start=0, limit=500, expand=None, space_type=None, space_status=None, + self, + start=0, + limit=500, + expand=None, + space_type=None, + space_status=None, ): """ Get all spaces with provided limit @@ -1023,7 +1086,8 @@ def add_comment(self, page_id, text): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -1031,7 +1095,14 @@ def add_comment(self, page_id, text): return response def attach_content( - self, content, name, content_type="application/binary", page_id=None, title=None, space=None, comment=None, + self, + content, + name, + content_type="application/binary", + page_id=None, + title=None, + space=None, + comment=None, ): """ Attach (upload) a file to a page, if it exists it will update the @@ -1074,7 +1145,10 @@ def attach_content( try: response = self.post( - path=path, data=data, headers=headers, files={"file": (name, content, content_type)}, + path=path, + data=data, + headers=headers, + files={"file": (name, content, content_type)}, ) except HTTPError as e: if e.response.status_code == 403: @@ -1101,7 +1175,14 @@ def attach_content( return None def attach_file( - self, filename, name=None, content_type=None, page_id=None, title=None, space=None, comment=None, + self, + filename, + name=None, + content_type=None, + page_id=None, + title=None, + space=None, + comment=None, ): """ Attach (upload) a file to a page, if it exists it will update the @@ -1132,7 +1213,13 @@ def attach_file( with open(filename, "rb") as infile: content = infile.read() return self.attach_content( - content, name, content_type, page_id=page_id, title=title, space=space, comment=comment, + content, + name, + content_type, + page_id=page_id, + title=title, + space=space, + comment=comment, ) def delete_attachment(self, page_id, filename, version=None): @@ -1146,7 +1233,11 @@ def delete_attachment(self, page_id, filename, version=None): params = {"pageId": page_id, "fileName": filename} if version: params["version"] = version - return self.post("json/removeattachment.action", params=params, headers=self.form_token_headers,) + return self.post( + "json/removeattachment.action", + params=params, + headers=self.form_token_headers, + ) def delete_attachment_by_id(self, attachment_id, version): """ @@ -1174,7 +1265,8 @@ def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versi while len(attachment_versions) > keep_last_versions: remove_version_attachment_number = attachment_versions[keep_last_versions].get("number") self.delete_attachment_by_id( - attachment_id=attachment.get("id"), version=remove_version_attachment_number, + attachment_id=attachment.get("id"), + version=remove_version_attachment_number, ) log.info( "Removed oldest version for {}, now versions equal more than {}".format( @@ -1198,7 +1290,13 @@ def get_attachment_history(self, attachment_id, limit=200, start=0): # @todo prepare more attachments info def get_attachments_from_content( - self, page_id, start=0, limit=50, expand=None, filename=None, media_type=None, + self, + page_id, + start=0, + limit=50, + expand=None, + filename=None, + media_type=None, ): """ Get attachments for page @@ -1278,7 +1376,8 @@ def remove_page_label(self, page_id, label): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The user has view permission, " "but no edit permission to the content", reason=e, + "The user has view permission, " "but no edit permission to the content", + reason=e, ) if e.response.status_code == 404: # Raise ApiError as the documented reason is ambiguous @@ -1423,7 +1522,14 @@ def is_page_content_is_already_updated(self, page_id, body, title=None): return False def update_existing_page( - self, page_id, title, body, type="page", representation="storage", minor_edit=False, version_comment=None, + self, + page_id, + title, + body, + type="page", + representation="storage", + minor_edit=False, + version_comment=None, ): """Duplicate update_page. Left for the people who used it before. Use update_page instead""" return self.update_page( @@ -1500,7 +1606,11 @@ def update_page( data["metadata"]["properties"]["content-appearance-draft"] = {"value": "full-width"} data["metadata"]["properties"]["content-appearance-published"] = {"value": "full-width"} try: - response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params,) + response = self.put( + "rest/api/content/{0}".format(page_id), + data=data, + params=params, + ) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1568,7 +1678,11 @@ def _insert_to_existing_page( data["version"]["message"] = version_comment try: - response = self.put("rest/api/content/{0}".format(page_id), data=data, params=params,) + response = self.put( + "rest/api/content/{0}".format(page_id), + data=data, + params=params, + ) except HTTPError as e: if e.response.status_code == 400: raise ApiValueError( @@ -1585,7 +1699,14 @@ def _insert_to_existing_page( return response def append_page( - self, page_id, title, append_body, parent_id=None, type="page", representation="storage", minor_edit=False, + self, + page_id, + title, + append_body, + parent_id=None, + type="page", + representation="storage", + minor_edit=False, ): """ Append body to page if already exist @@ -1613,7 +1734,14 @@ def append_page( ) def prepend_page( - self, page_id, title, prepend_body, parent_id=None, type="page", representation="storage", minor_edit=False, + self, + page_id, + title, + prepend_body, + parent_id=None, + type="page", + representation="storage", + minor_edit=False, ): """ Append body to page if already exist @@ -1691,7 +1819,8 @@ def update_or_create( log.info( "You may access your page at: {host}{url}".format( - host=self.url, url=((result or {}).get("_links") or {}).get("tinyui"), + host=self.url, + url=((result or {}).get("_links") or {}).get("tinyui"), ) ) return result @@ -1736,7 +1865,8 @@ def set_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " "edit the content with the given id", reason=e, + "The user does not have permission to " "edit the content with the given id", + reason=e, ) if e.response.status_code == 413: raise ApiValueError("The value is too long", reason=e) @@ -1767,7 +1897,8 @@ def update_page_property(self, page_id, data): ) if e.response.status_code == 403: raise ApiPermissionError( - "The user does not have permission to " "edit the content with the given id", reason=e, + "The user does not have permission to " "edit the content with the given id", + reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( @@ -1870,7 +2001,8 @@ def get_page_ancestors(self, page_id): except HTTPError as e: if e.response.status_code == 404: raise ApiPermissionError( - "The calling user does not have permission to view the content", reason=e, + "The calling user does not have permission to view the content", + reason=e, ) raise @@ -1907,7 +2039,8 @@ def get_all_groups(self, start=0, limit=1000): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view groups", reason=e, + "The calling user does not have permission to view groups", + reason=e, ) raise @@ -1933,7 +2066,8 @@ def get_group_members(self, group_name="confluence-users", start=0, limit=1000, except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", reason=e, + "The calling user does not have permission to view users", + reason=e, ) raise @@ -1952,7 +2086,12 @@ def get_all_members(self, group_name="confluence-users", expand=None): step = 0 members = [] while flag: - values = self.get_group_members(group_name=group_name, start=len(members), limit=limit, expand=expand,) + values = self.get_group_members( + group_name=group_name, + start=len(members), + limit=limit, + expand=expand, + ) step += 1 if len(values) == 0: flag = False @@ -1988,7 +2127,13 @@ def get_space(self, space_key, expand="description.plain,homepage", params=None) return response def get_space_content( - self, space_key, depth="all", start=0, limit=500, content_type=None, expand="body.storage", + self, + space_key, + depth="all", + start=0, + limit=500, + content_type=None, + expand="body.storage", ): """ Get space content. @@ -2108,11 +2253,13 @@ def get_user_details_by_username(self, username, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", reason=e, + "The calling user does not have permission to view users", + reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given username or userkey does not exist", reason=e, + "The user with the given username or userkey does not exist", + reason=e, ) raise @@ -2137,11 +2284,13 @@ def get_user_details_by_accountid(self, accountid, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", reason=e, + "The calling user does not have permission to view users", + reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given account does not exist", reason=e, + "The user with the given account does not exist", + reason=e, ) raise @@ -2166,11 +2315,13 @@ def get_user_details_by_userkey(self, userkey, expand=None): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to view users", reason=e, + "The calling user does not have permission to view users", + reason=e, ) if e.response.status_code == 404: raise ApiNotFoundError( - "The user with the given username or userkey does not exist", reason=e, + "The user with the given username or userkey does not exist", + reason=e, ) raise @@ -2178,7 +2329,13 @@ def get_user_details_by_userkey(self, userkey, expand=None): return response def cql( - self, cql, start=0, limit=None, expand=None, include_archived_spaces=None, excerpt=None, + self, + cql, + start=0, + limit=None, + expand=None, + include_archived_spaces=None, + excerpt=None, ): """ Get results from cql search result with all related fields @@ -2336,7 +2493,8 @@ def anonymous(self): except HTTPError as e: if e.response.status_code == 403: raise ApiPermissionError( - "The calling user does not have permission to use Confluence", reason=e, + "The calling user does not have permission to use Confluence", + reason=e, ) raise @@ -2375,7 +2533,10 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -2501,7 +2662,12 @@ def get_pdf_download_url_for_confluence_cloud(self, url): return download_url def audit( - self, start_date=None, end_date=None, start=None, limit=None, search_string=None, + self, + start_date=None, + end_date=None, + start=None, + limit=None, + search_string=None, ): """ Fetch a paginated list of AuditRecord instances dating back to a certain time @@ -2632,7 +2798,12 @@ def add_user_to_group(self, username, group_name): return self.post(url, params=params, data=data) def add_space_permissions( - self, space_key, subject_type, subject_id, operation_key, operation_target, + self, + space_key, + subject_type, + subject_id, + operation_key, + operation_target, ): """ Add permissions to a space diff --git a/atlassian/crowd.py b/atlassian/crowd.py index d04fc2a4c..7b3d3510f 100644 --- a/atlassian/crowd.py +++ b/atlassian/crowd.py @@ -12,13 +12,22 @@ class Crowd(AtlassianRestAPI): not user credentials, in order to access Crowd APIs""" def __init__( - self, url, username, password, timeout=60, api_root="rest", api_version="latest", + self, + url, + username, + password, + timeout=60, + api_root="rest", + api_version="latest", ): super(Crowd, self).__init__(url, username, password, timeout, api_root, api_version) def _crowd_api_url(self, api, resource): return "/{api_root}/{api}/{version}/{resource}".format( - api_root=self.api_root, api=api, version=self.api_version, resource=resource, + api_root=self.api_root, + api=api, + version=self.api_version, + resource=resource, ) def _user_change_status(self, username, active): @@ -43,7 +52,11 @@ def _user_change_status(self, username, active): params = {"username": username} - return self.put(self._crowd_api_url("usermanagement", "user"), params=params, data=user_object,) + return self.put( + self._crowd_api_url("usermanagement", "user"), + params=params, + data=user_object, + ) def user(self, username): params = {"username": username} @@ -57,7 +70,14 @@ def user_activate(self, username): return self._user_change_status(username, True) def user_create( - self, username, active, first_name, last_name, display_name, email, password, + self, + username, + active, + first_name, + last_name, + display_name, + email, + password, ): """ Create new user method @@ -114,7 +134,11 @@ def group_add_user(self, username, groupname): params = {"username": username} - return self.post(self._crowd_api_url("usermanagement", "user/group/direct"), params=params, json=data,) + return self.post( + self._crowd_api_url("usermanagement", "user/group/direct"), + params=params, + json=data, + ) def group_nested_members(self, group): params = {"groupname": group} @@ -165,7 +189,10 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) diff --git a/atlassian/insight.py b/atlassian/insight.py index 94e424026..2bc795682 100644 --- a/atlassian/insight.py +++ b/atlassian/insight.py @@ -47,9 +47,9 @@ def __cloud_init(self, *args, **kwargs): return args, kwargs def __get_workspace_id(self): - return self.get("rest/servicedeskapi/insight/workspace", headers=self.default_headers,)["values"][0][ - "workspaceId" - ] + return self.get("rest/servicedeskapi/insight/workspace", headers=self.default_headers,)["values"][ + 0 + ]["workspaceId"] # Attachments def get_attachments_of_objects(self, object_id): @@ -84,7 +84,10 @@ def get_attachments_of_objects(self, object_id): """ if self.cloud: raise NotImplementedError - url = self.url_joiner(self.api_root, "attachments/object/{objectId}".format(objectId=object_id),) + url = self.url_joiner( + self.api_root, + "attachments/object/{objectId}".format(objectId=object_id), + ) return self.get(url) def upload_attachment_to_object(self, object_id, filename): @@ -200,7 +203,10 @@ def start_import_configuration(self, import_id): :param import_id: :return: """ - url = self.url_joiner(self.api_root, "import/start/{import_id}".format(import_id=import_id),) + url = self.url_joiner( + self.api_root, + "import/start/{import_id}".format(import_id=import_id), + ) return self.post(url) # Index @@ -285,7 +291,12 @@ def get_object(self, object_id): return self.get(url) def update_object( - self, object_id, object_type_id, attributes, has_avatar=False, avatar_uuid="", + self, + object_id, + object_type_id, + attributes, + has_avatar=False, + avatar_uuid="", ): """ Update an existing object in Insight @@ -431,7 +442,10 @@ def get_object_connected_tickets(self, object_id): :param object_id: :return: """ - url = self.url_joiner(self.api_root, "objectconnectedtickets/{id}/tickets".format(id=object_id),) + url = self.url_joiner( + self.api_root, + "objectconnectedtickets/{id}/tickets".format(id=object_id), + ) return self.get(url) # Object schema diff --git a/atlassian/jira.py b/atlassian/jira.py index 8102fb164..9b2df74e9 100644 --- a/atlassian/jira.py +++ b/atlassian/jira.py @@ -24,7 +24,12 @@ def __init__(self, url, *args, **kwargs): super(Jira, self).__init__(url, *args, **kwargs) def get_permissions( - self, permissions, project_id=None, project_key=None, issue_id=None, issue_key=None, + self, + permissions, + project_id=None, + project_key=None, + issue_id=None, + issue_key=None, ): """ Returns a list of permissions indicating which permissions the user has. Details of the user's permissions can @@ -223,7 +228,12 @@ def get_attachment_expand_raw(self, attachment_id): """ def get_audit_records( - self, offset=None, limit=None, filter=None, from_date=None, to_date=None, + self, + offset=None, + limit=None, + filter=None, + from_date=None, + to_date=None, ): """ Returns auditing records filtered using provided parameters @@ -495,7 +505,10 @@ def delete_component(self, component_id): def update_component_lead(self, component_id, lead): data = {"id": component_id, "leadUserName": lead} base_url = self.resource_url("component") - return self.put("{base_url}/{component_id}".format(base_url=base_url, component_id=component_id), data=data,) + return self.put( + "{base_url}/{component_id}".format(base_url=base_url, component_id=component_id), + data=data, + ) """ Configurations of Jira @@ -913,7 +926,11 @@ def issue(self, key, fields="*all", expand=None): return self.get(url, params=params) def get_issue( - self, issue_id_or_key, fields=None, properties=None, update_history=True, + self, + issue_id_or_key, + fields=None, + properties=None, + update_history=True, ): """ Returns a full representation of the issue for the given issue key @@ -1093,7 +1110,10 @@ def issue_fields(self, key): def update_issue_field(self, key, fields="*all"): base_url = self.resource_url("issue") - return self.put("{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields},) + return self.put( + "{base_url}/{key}".format(base_url=base_url, key=key), + data={"fields": fields}, + ) def bulk_update_issue_field(self, key_list, fields="*all"): """ @@ -1105,7 +1125,8 @@ def bulk_update_issue_field(self, key_list, fields="*all"): try: for key in key_list: self.put( - "{base_url}/{key}".format(base_url=base_url, key=key), data={"fields": fields}, + "{base_url}/{key}".format(base_url=base_url, key=key), + data={"fields": fields}, ) except Exception as e: log.error(e) @@ -1220,7 +1241,10 @@ def issue_add_watcher(self, issue_key, user): log.warning('Adding user {user} to "{issue_key}" watchers'.format(issue_key=issue_key, user=user)) data = user base_url = self.resource_url("issue") - return self.post("{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), data=data,) + return self.post( + "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), + data=data, + ) def issue_delete_watcher(self, issue_key, user): """ @@ -1233,7 +1257,8 @@ def issue_delete_watcher(self, issue_key, user): params = {"username": user} base_url = self.resource_url("issue") return self.delete( - "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), params=params, + "{base_url}/{issue_key}/watchers".format(base_url=base_url, issue_key=issue_key), + params=params, ) def issue_get_watchers(self, issue_key): @@ -1391,7 +1416,14 @@ def get_issue_remote_links(self, issue_key, global_id=None, internal_id=None): return self.get(url, params=params) def create_or_update_issue_remote_links( - self, issue_key, link_url, title, global_id=None, relationship=None, icon_url=None, icon_title=None, + self, + issue_key, + link_url, + title, + global_id=None, + relationship=None, + icon_url=None, + icon_title=None, ): """ Add Remote Link to Issue, update url if global_id is passed @@ -1463,12 +1495,20 @@ def delete_issue_remote_link_by_id(self, issue_key, link_id): def get_issue_transitions(self, issue_key): if self.advanced_mode: return [ - {"name": transition["name"], "id": int(transition["id"]), "to": transition["to"]["name"],} + { + "name": transition["name"], + "id": int(transition["id"]), + "to": transition["to"]["name"], + } for transition in (self.get_issue_transitions_full(issue_key).json() or {}).get("transitions") ] else: return [ - {"name": transition["name"], "id": int(transition["id"]), "to": transition["to"]["name"],} + { + "name": transition["name"], + "id": int(transition["id"]), + "to": transition["to"]["name"], + } for transition in (self.get_issue_transitions_full(issue_key) or {}).get("transitions") ] @@ -1722,11 +1762,16 @@ def user_property(self, username=None, account_id=None, key_property=None): params = {"accountId": account_id} base_url = self.resource_url("user/properties") return self.get( - "{base_url}/{key_property}".format(base_url=base_url, key_property=key_property), params=params, + "{base_url}/{key_property}".format(base_url=base_url, key_property=key_property), + params=params, ) def user_set_property( - self, username=None, account_id=None, key_property=None, value_property=None, + self, + username=None, + account_id=None, + key_property=None, + value_property=None, ): """ Set property for user @@ -1744,7 +1789,9 @@ def user_set_property( ) elif account_id or self.cloud: url = "{base_url}/{key_property}?accountId={account_id}".format( - base_url=base_url, key_property=key_property, account_id=account_id, + base_url=base_url, + key_property=key_property, + account_id=account_id, ) return self.put(url, data=value_property) @@ -1794,7 +1841,10 @@ def user_disable(self, username): return self.user_deactivate(username) def user_disable_throw_rest_endpoint( - self, username, url="rest/scriptrunner/latest/custom/disableUser", param="userName", + self, + username, + url="rest/scriptrunner/latest/custom/disableUser", + param="userName", ): """The disable method throw own rest endpoint""" url = "{}?{}={}".format(url, param, username) @@ -1982,7 +2032,10 @@ def create_project_from_shared_template(self, project_id, key, name, lead): """ json = {"key": key, "name": name, "lead": lead} - return self.post("rest/project-templates/1.0/createshared/{}".format(project_id), json=json,) + return self.post( + "rest/project-templates/1.0/createshared/{}".format(project_id), + json=json, + ) def delete_project(self, key): """ @@ -2037,7 +2090,14 @@ def get_project_versions(self, key, expand=None): return self.get(url, params=params) def get_project_versions_paginated( - self, key, start=None, limit=None, order_by=None, expand=None, query=None, status=None, + self, + key, + start=None, + limit=None, + order_by=None, + expand=None, + query=None, + status=None, ): """ Returns all versions for the specified project. Results are paginated. @@ -2075,7 +2135,12 @@ def get_project_versions_paginated( return self.get(url, params=params) def add_version( - self, project_key, project_id, version, is_archived=False, is_released=False, + self, + project_key, + project_id, + version, + is_archived=False, + is_released=False, ): """ Add missing version to project @@ -2494,7 +2559,10 @@ def get_all_assignable_users_for_project(self, project_key, start=0, limit=50): """ base_url = self.resource_url("user/assignable/search") url = "{base_url}?project={project_key}&startAt={start}&maxResults={limit}".format( - base_url=base_url, project_key=project_key, start=start, limit=limit, + base_url=base_url, + project_key=project_key, + start=start, + limit=limit, ) return self.get(url) @@ -2798,7 +2866,13 @@ def add_field(self, field_id, screen_id, tab_id): """ def jql( - self, jql, fields="*all", start=0, limit=None, expand=None, validate_query=None, + self, + jql, + fields="*all", + start=0, + limit=None, + expand=None, + validate_query=None, ): """ Get issues from jql search result with all related fields @@ -2830,7 +2904,13 @@ def jql( return self.get(url, params=params) def jql_get_list_of_tickets( - self, jql, fields="*all", start=0, limit=None, expand=None, validate_query=None, + self, + jql, + fields="*all", + start=0, + limit=None, + expand=None, + validate_query=None, ): """ Get issues from jql search result with all related fields @@ -2901,7 +2981,12 @@ def csv(self, jql, limit=1000, all_fields=True, start=None, delimiter=None): else: url = "sr/jira.issueviews:searchrequest-csv-current-fields/temp/SearchRequest.csv" # fmt: on - return self.get(url, params=params, not_json_response=True, headers={"Accept": "application/csv"},) + return self.get( + url, + params=params, + not_json_response=True, + headers={"Accept": "application/csv"}, + ) def excel(self, jql, limit=1000, all_fields=True, start=None): """ @@ -2925,7 +3010,12 @@ def excel(self, jql, limit=1000, all_fields=True, start=None): else: url = "sr/jira.issueviews:searchrequest-excel-current-fields/temp/SearchRequest.xls" # fmt: on - return self.get(url, params=params, not_json_response=True, headers={"Accept": "application/vnd.ms-excel"},) + return self.get( + url, + params=params, + not_json_response=True, + headers={"Accept": "application/vnd.ms-excel"}, + ) def export_html(self, jql, limit=None, all_fields=True, start=None): """ @@ -2949,7 +3039,12 @@ def export_html(self, jql, limit=None, all_fields=True, start=None): else: url = "sr/jira.issueviews:searchrequest-html-current-fields/temp/SearchRequest.html" # fmt: on - return self.get(url, params=params, not_json_response=True, headers={"Accept": "application/xhtml+xml"},) + return self.get( + url, + params=params, + not_json_response=True, + headers={"Accept": "application/xhtml+xml"}, + ) def get_all_priorities(self): """ @@ -3048,7 +3143,10 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -3196,7 +3294,8 @@ def get_project_issue_security_scheme(self, project_id_or_key, only_levels=False raise ApiPermissionError("User doesn't have administrative permissions", reason=e) elif e.response.status_code == 404: raise ApiNotFoundError( - "Returned if the project does not exist, or is not visible to the calling user", reason=e, + "Returned if the project does not exist, or is not visible to the calling user", + reason=e, ) raise if only_levels is True and response: @@ -3381,7 +3480,11 @@ def create_issuetype_scheme(self, name, description, default_issue_type_id, issu """ def reindex( - self, comments=True, change_history=True, worklogs=True, indexing_type="BACKGROUND_PREFERRED", + self, + comments=True, + change_history=True, + worklogs=True, + indexing_type="BACKGROUND_PREFERRED", ): """ Reindex the Jira instance @@ -3762,7 +3865,13 @@ def tempo_timesheets_get_team_utilization(self, team_id, date_from, date_to=None return self.get(url, params=params) def tempo_timesheets_get_worklogs( - self, date_from=None, date_to=None, username=None, project_key=None, account_key=None, team_id=None, + self, + date_from=None, + date_to=None, + username=None, + project_key=None, + account_key=None, + team_id=None, ): """ @@ -4019,7 +4128,12 @@ def add_issues_to_backlog(self, issues): return self.post(url, data=data) def get_all_agile_boards( - self, board_name=None, project_key=None, board_type=None, start=0, limit=50, + self, + board_name=None, + project_key=None, + board_type=None, + start=0, + limit=50, ): """ Returns all boards. This only includes boards that the user has permission to view. @@ -4317,7 +4431,11 @@ def update_rank(self, issues_to_rank, rank_before, customfield_number): """ return self.put( "rest/agile/1.0/issue/rank", - data={"issues": issues_to_rank, "rankBeforeIssue": rank_before, "rankCustomFieldId": customfield_number,}, + data={ + "issues": issues_to_rank, + "rankBeforeIssue": rank_before, + "rankCustomFieldId": customfield_number, + }, ) def dvcs_get_linked_repos(self): diff --git a/atlassian/rest_client.py b/atlassian/rest_client.py index f2ef89683..e593c397d 100644 --- a/atlassian/rest_client.py +++ b/atlassian/rest_client.py @@ -230,7 +230,10 @@ def request( data = None if not data else dumps(data) json_dump = None if not json else dumps(json) self.log_curl_debug( - method=method, url=url, headers=headers, data=data if data else json_dump, + method=method, + url=url, + headers=headers, + data=data if data else json_dump, ) headers = headers or self.default_headers response = self._session.request( @@ -379,7 +382,14 @@ def put( return self._response_handler(response) def delete( - self, path, data=None, headers=None, params=None, trailing=None, absolute=False, advanced_mode=False, + self, + path, + data=None, + headers=None, + params=None, + trailing=None, + absolute=False, + advanced_mode=False, ): """ Deletes resources at given paths. @@ -396,7 +406,13 @@ def delete( If advanced_mode is set - returns raw response. """ response = self.request( - "DELETE", path=path, data=data, headers=headers, params=params, trailing=trailing, absolute=absolute, + "DELETE", + path=path, + data=data, + headers=headers, + params=params, + trailing=trailing, + absolute=absolute, ) if self.advanced_mode or advanced_mode: return response diff --git a/atlassian/service_desk.py b/atlassian/service_desk.py index 6ddf2d67d..928ea157f 100644 --- a/atlassian/service_desk.py +++ b/atlassian/service_desk.py @@ -24,7 +24,10 @@ def get_service_desks(self): :return: Service Desks """ - service_desks_list = self.get("rest/servicedeskapi/servicedesk", headers=self.experimental_headers,) + service_desks_list = self.get( + "rest/servicedeskapi/servicedesk", + headers=self.experimental_headers, + ) if self.advanced_mode: return service_desks_list else: @@ -39,7 +42,8 @@ def get_service_desk_by_id(self, service_desk_id): """ return self.get( - "rest/servicedeskapi/servicedesk/{}".format(service_desk_id), headers=self.experimental_headers, + "rest/servicedeskapi/servicedesk/{}".format(service_desk_id), + headers=self.experimental_headers, ) # Customers actions @@ -54,7 +58,11 @@ def create_customer(self, full_name, email): log.warning("Creating customer...") data = {"fullName": full_name, "email": email} - return self.post("rest/servicedeskapi/customer", headers=self.experimental_headers, data=data,) + return self.post( + "rest/servicedeskapi/customer", + headers=self.experimental_headers, + data=data, + ) def get_customer_request(self, issue_id_or_key): """ @@ -64,7 +72,10 @@ def get_customer_request(self, issue_id_or_key): :return: Customer request """ - return self.get("rest/servicedeskapi/request/{}".format(issue_id_or_key), headers=self.experimental_headers,) + return self.get( + "rest/servicedeskapi/request/{}".format(issue_id_or_key), + headers=self.experimental_headers, + ) def get_my_customer_requests(self): """Returning requests where you are the assignee""" @@ -74,7 +85,12 @@ def get_my_customer_requests(self): return (response or {}).get("values") def create_customer_request( - self, service_desk_id, request_type_id, values_dict, raise_on_behalf_of=None, request_participants=None, + self, + service_desk_id, + request_type_id, + values_dict, + raise_on_behalf_of=None, + request_participants=None, ): """ Creating customer request @@ -116,7 +132,8 @@ def get_customer_request_status(self, issue_id_or_key): :return: Status name """ request = self.get( - "rest/servicedeskapi/request/{}/status".format(issue_id_or_key), headers=self.experimental_headers, + "rest/servicedeskapi/request/{}/status".format(issue_id_or_key), + headers=self.experimental_headers, ) if self.advanced_mode: return request @@ -145,7 +162,8 @@ def get_request_types(self, service_desk_id): """ return self.get( - "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id), headers=self.experimental_headers, + "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id), + headers=self.experimental_headers, ) # Participants actions @@ -299,7 +317,11 @@ def get_organisations(self, service_desk_id=None, start=0, limit=50): params["limit"] = int(limit) if service_desk_id is None: - return self.get(url_without_sd_id, headers=self.experimental_headers, params=params,) + return self.get( + url_without_sd_id, + headers=self.experimental_headers, + params=params, + ) return self.get(url_with_sd_id, headers=self.experimental_headers, params=params) def get_organization(self, organization_id): @@ -421,7 +443,12 @@ def remove_users_from_organization(self, organization_id, users_list=[], account # Attachments actions def create_attachments( - self, service_desk_id, issue_id_or_key, filenames, public=True, comment=None, + self, + service_desk_id, + issue_id_or_key, + filenames, + public=True, + comment=None, ): """ Add attachment as a comment. @@ -450,7 +477,12 @@ def create_attachments( return self.add_attachments(issue_id_or_key, temp_attachment_ids, public, comment) def create_attachment( - self, service_desk_id, issue_id_or_key, filename, public=True, comment=None, + self, + service_desk_id, + issue_id_or_key, + filename, + public=True, + comment=None, ): """ Add attachment as a comment. @@ -467,7 +499,13 @@ def create_attachment( :return: Request info """ log.info("Creating attachment...") - return self.create_attachments(service_desk_id, issue_id_or_key, filename, public=public, comment=comment,) + return self.create_attachments( + service_desk_id, + issue_id_or_key, + filename, + public=public, + comment=comment, + ) def attach_temporary_file(self, service_desk_id, filename): """ @@ -486,7 +524,11 @@ def attach_temporary_file(self, service_desk_id, filename): with open(filename, "rb") as file: result = ( - self.post(path=url, headers=experimental_headers, files={"file": file},) + self.post( + path=url, + headers=experimental_headers, + files={"file": file}, + ) .json() .get("temporaryAttachments") ) @@ -522,7 +564,12 @@ def add_attachment(self, issue_id_or_key, temp_attachment_id, public=True, comme :return: """ log.info("Adding attachment") - return self.add_attachments(issue_id_or_key, [temp_attachment_id], public=public, comment=comment,) + return self.add_attachments( + issue_id_or_key, + [temp_attachment_id], + public=public, + comment=comment, + ) # SLA actions def get_sla(self, issue_id_or_key, start=0, limit=50): @@ -774,7 +821,10 @@ def upload_plugin(self, plugin_path): """ files = {"plugin": open(plugin_path, "rb")} upm_token = self.request( - method="GET", path="rest/plugins/1.0/", headers=self.no_check_headers, trailing=True, + method="GET", + path="rest/plugins/1.0/", + headers=self.no_check_headers, + trailing=True, ).headers["upm-token"] url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token) return self.post(url, files=files, headers=self.no_check_headers) @@ -808,7 +858,12 @@ def update_plugin_license(self, plugin_key, raw_license): return self.put(url, data=data, headers=app_headers) def create_request_type( - self, service_desk_id, request_type_id, request_name, request_description, request_help_text, + self, + service_desk_id, + request_type_id, + request_name, + request_description, + request_help_text, ): """ Creating a request type diff --git a/tox.ini b/tox.ini index dbaf15fe5..0a5da397f 100644 --- a/tox.ini +++ b/tox.ini @@ -20,6 +20,7 @@ parallel_show_output = true [testenv:flake8] basepython = python3 +exclude = __pycache__ skip_install = true deps = importlib-metadata<=4.13.0 @@ -35,9 +36,10 @@ commands = pylint {[base]linting_targets} [testenv:black] basepython = python3 +target-version = ["py37"] skip_install = true deps = black -commands = black --check --diff {[base]linting_targets} +commands = black --check --diff {[base]linting_targets} --exclude __pycache__ [testenv:mypy] basepython = python3