From f7c59559b078af751047761ea19a52a28f7c9611 Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Fri, 21 Mar 2025 21:31:55 +0200
Subject: [PATCH 1/6] python2 removal
---
.github/workflows/test.yml | 2 +-
.readthedocs.yml | 2 +-
Makefile | 2 +-
pyproject.toml | 2 +-
setup.py | 6 ------
tox.ini | 4 ++--
6 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 61b03a571..691f9db79 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -18,7 +18,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- python-version: [ '3.6', '3.7', '3.8', '3.9', '3.11', '3.12', '3.13' ]
+ python-version: [ '3.9', '3.11', '3.12', '3.13' ]
steps:
- uses: actions/checkout@v4
diff --git a/.readthedocs.yml b/.readthedocs.yml
index c29c150f8..9c598f712 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -8,7 +8,7 @@ version: 2
build:
os: ubuntu-lts-latest
tools:
- python: "3.8"
+ python: "3.9"
# Build documentation in the docs/ directory with Sphinx
sphinx:
diff --git a/Makefile b/Makefile
index 28650320e..c2d0b79a5 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
# Run `make` or `make help` to see a list of tasks.
# Based on GCOVR project (https://github.com/gcovr/gcovr).
-PYTHON_VERSION ?= 3.7
+PYTHON_VERSION ?= 3.9
ATLASSIAN_SDK ?= atlassian-sdk
QA_CONTAINER ?= atlassian-python-api-qa-$(PYTHON_VERSION)
diff --git a/pyproject.toml b/pyproject.toml
index 26ed17880..6115de9e0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,7 +5,7 @@
# https://github.com/carlosperate/awesome-pyproject
[tool.black]
-target-version = ['py36', 'py37', 'py38', 'py39']
+target-version = ['py39', 'py310', 'py311']
line-length = 120
include = '(atlassian|examples|tests)\/.*(\.py|GET|POST)'
diff --git a/setup.py b/setup.py
index df7515a42..667181ae5 100644
--- a/setup.py
+++ b/setup.py
@@ -46,12 +46,6 @@
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
diff --git a/tox.ini b/tox.ini
index 6235a639c..ee2f310c0 100644
--- a/tox.ini
+++ b/tox.ini
@@ -35,14 +35,14 @@ commands = pylint {[base]linting_targets}
[testenv:black]
basepython = python3
-target-version = ["py27", "py37"]
+target-version = [ "py39" ]
skip_install = true
deps = black
commands = black --check --diff {[base]linting_targets} --exclude __pycache__
[testenv:black_fmt]
basepython = python3
-target-version = ["py37"]
+target-version = ["py39"]
skip_install = true
deps = black
commands = black {[base]linting_targets} --exclude __pycache__
From cc7c5cb16f0561b40912287774256b3b14b7a31a Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Sat, 22 Mar 2025 00:14:37 +0200
Subject: [PATCH 2/6] f-stringify
---
atlassian/VERSION | 2 +-
atlassian/bamboo.py | 143 +++++-----
atlassian/bitbucket/__init__.py | 183 ++++++-------
atlassian/bitbucket/cloud/__init__.py | 6 +-
atlassian/bitbucket/cloud/base.py | 4 +-
atlassian/bitbucket/cloud/common/builds.py | 3 +-
.../bitbucket/cloud/repositories/__init__.py | 42 +--
.../cloud/repositories/branchRestrictions.py | 12 +-
.../bitbucket/cloud/repositories/commits.py | 33 ++-
.../cloud/repositories/defaultReviewers.py | 12 +-
.../repositories/deploymentEnvironments.py | 17 +-
.../bitbucket/cloud/repositories/hooks.py | 2 +-
.../bitbucket/cloud/repositories/pipelines.py | 6 +-
.../cloud/repositories/pullRequests.py | 2 +-
.../bitbucket/cloud/workspaces/members.py | 6 +-
.../bitbucket/cloud/workspaces/permissions.py | 5 +-
.../bitbucket/cloud/workspaces/projects.py | 8 +-
atlassian/bitbucket/server/__init__.py | 2 +-
.../bitbucket/server/common/permissions.py | 4 +-
.../bitbucket/server/globalPermissions.py | 2 +-
.../bitbucket/server/projects/__init__.py | 6 +-
.../server/projects/repos/__init__.py | 10 +-
atlassian/cloud_admin.py | 2 +-
atlassian/confluence.py | 168 ++++++------
atlassian/crowd.py | 23 +-
atlassian/insight.py | 42 +--
atlassian/jira.py | 253 ++++++++----------
atlassian/marketplace.py | 4 +-
atlassian/portfolio.py | 24 +-
atlassian/rest_client.py | 10 +-
atlassian/service_desk.py | 83 +++---
atlassian/statuspage.py | 192 ++++++-------
atlassian/utils.py | 12 +-
atlassian/xray.py | 94 +++----
examples/bamboo/bamboo_add_plan_branch.py | 2 +-
examples/bamboo/bamboo_first_steps.py | 4 +-
examples/bamboo/bamboo_label_based_cleaner.py | 16 +-
.../bamboo_remove_old_failed_results.py | 8 +-
...boo_remove_unknown_status_build_results.py | 8 +-
.../bitbucket_clean_jira_branches.py | 12 +-
examples/bitbucket/bitbucket_cloud_oo.py | 26 +-
.../bitbucket_download_repo_archive.py | 1 +
.../bitbucket_manage_pull_request.py | 16 +-
examples/bitbucket/bitbucket_project.py | 2 +-
...bitbucket_pullrequest_get_changed_files.py | 2 +-
...nfluence_check_unknown_attachment_error.py | 4 +-
examples/confluence/confluence_copy_labels.py | 2 +-
...nfluence_download_attachments_from_page.py | 3 +-
.../confluence_draft_page_cleaner.py | 8 +-
.../confluence_get_tables_from_page.py | 11 +-
.../confluence/confluence_nested_error.py | 2 +-
.../confluence/confluence_page_properties.py | 8 +-
.../confluence_page_versions_cleaner.py | 12 +-
.../confluence/confluence_trash_cleaner.py | 14 +-
.../jira_add_components_to_all_projects.py | 6 +-
...ean_inactive_or_removed_from_jira_users.py | 4 +-
...convert_group_members_into_user_in_role.py | 4 +-
.../jira/jira_copy_components_from_A_to_B.py | 2 +-
examples/jira/jira_dc_create_support_zips.py | 4 +-
.../jira_download_attachments.from_issue.py | 4 +-
examples/jira/jira_download_attachments.py | 2 +-
examples/jira/jira_find_screen_similarity.py | 8 +-
.../jira/jira_get_issue_status_changelog.py | 14 +-
.../jira/jira_get_issue_tree_recursive.py | 16 +-
examples/jira/jira_index_fixer.py | 6 +-
examples/jira/jira_issue_type_counter.py | 4 +-
examples/jira/jira_issue_update_epic_link.py | 2 +-
.../jira/jira_jql_fetcher_as_weekly_report.py | 4 +-
.../jira_notification_schemes_duplicates.py | 2 +-
examples/jira/jira_project_leaders.py | 4 +-
.../jira_project_security_level_checker.py | 2 +-
examples/jira/jira_review_groups.py | 2 +-
examples/jira/jira_scrap_regex_from_issue.py | 3 +-
examples/jira/jira_tempo_account_customers.py | 4 +-
tests/mockup.py | 4 +-
tests/test_bitbucket_server_oo.py | 2 +-
76 files changed, 827 insertions(+), 854 deletions(-)
diff --git a/atlassian/VERSION b/atlassian/VERSION
index 74ba951d0..0c89fc927 100644
--- a/atlassian/VERSION
+++ b/atlassian/VERSION
@@ -1 +1 @@
-3.41.21
+4.0.0
\ No newline at end of file
diff --git a/atlassian/bamboo.py b/atlassian/bamboo.py
index 08f897bcf..88e2e7535 100755
--- a/atlassian/bamboo.py
+++ b/atlassian/bamboo.py
@@ -46,7 +46,7 @@ def _get_generator(
response.raise_for_status()
response = response.json()
except HTTPError as e:
- logging.error("Broken response: {}".format(e))
+ logging.error(f"Broken response: {e}")
yield e
try:
results = response[elements_key]
@@ -58,7 +58,7 @@ def _get_generator(
size += 1
yield r
except TypeError:
- logging.error("Broken response: {}".format(response))
+ logging.error(f"Broken response: {response}")
yield response
def base_list_call(
@@ -131,7 +131,7 @@ def project(self, project_key, expand=None, favourite=False, clover_enabled=Fals
:param clover_enabled:
:return:
"""
- resource = "project/{}".format(project_key)
+ resource = f"project/{project_key}"
return self.base_list_call(
resource=resource,
expand=expand,
@@ -145,12 +145,12 @@ def get_project(self, project_key):
"""Method used to retrieve information for project specified as project key.
Possible expand parameters: plans, list of plans for project. plans.plan, list of plans with plan details
(only plans visible - READ permission for user)"""
- resource = "project/{}?showEmpty".format(project_key)
+ resource = f"project/{project_key}?showEmpty"
return self.get(self.resource_url(resource))
def delete_project(self, project_key):
"""Marks project for deletion. Project will be deleted by a batch job."""
- resource = "project/{}".format(project_key)
+ resource = f"project/{project_key}"
return self.delete(self.resource_url(resource))
def project_plans(self, project_key, start_index=0, max_results=25):
@@ -162,7 +162,7 @@ def project_plans(self, project_key, start_index=0, max_results=25):
:param max_results:
:return: Generator with plans
"""
- resource = "project/{}".format(project_key)
+ resource = f"project/{project_key}"
return self.base_list_call(
resource,
expand="plans",
@@ -210,7 +210,7 @@ def plan_directory_info(self, plan_key):
:param plan_key:
:return:
"""
- resource = "planDirectoryInfo/{}".format(plan_key)
+ resource = f"planDirectoryInfo/{plan_key}"
return self.get(self.resource_url(resource))
def get_plan(self, plan_key, expand=None):
@@ -223,7 +223,7 @@ def get_plan(self, plan_key, expand=None):
params = {}
if expand:
params["expand"] = expand
- resource = "rest/api/latest/plan/{}".format(plan_key)
+ resource = f"rest/api/latest/plan/{plan_key}"
return self.get(resource, params=params)
def search_plans(self, search_term, fuzzy=True, start_index=0, max_results=25):
@@ -248,7 +248,7 @@ def delete_plan(self, plan_key):
:param plan_key:
:return:
"""
- resource = "rest/api/latest/plan/{}".format(plan_key)
+ resource = f"rest/api/latest/plan/{plan_key}"
return self.delete(resource)
def disable_plan(self, plan_key):
@@ -257,7 +257,7 @@ def disable_plan(self, plan_key):
:param plan_key: str TST-BLD
:return: DELETE request
"""
- resource = "plan/{plan_key}/enable".format(plan_key=plan_key)
+ resource = f"plan/{plan_key}/enable"
return self.delete(self.resource_url(resource))
def enable_plan(self, plan_key):
@@ -266,7 +266,7 @@ def enable_plan(self, plan_key):
:param plan_key: str TST-BLD
:return: POST request
"""
- resource = "plan/{plan_key}/enable".format(plan_key=plan_key)
+ resource = f"plan/{plan_key}/enable"
return self.post(self.resource_url(resource))
""" Branches """
@@ -312,7 +312,7 @@ def plan_branches(
:param max_results:
:return:
"""
- resource = "plan/{}/branch".format(plan_key)
+ resource = f"plan/{plan_key}/branch"
return self.base_list_call(
resource,
expand,
@@ -330,7 +330,7 @@ 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 = f"plan/{plan_key}/branch/{branch_name}"
return self.get(self.resource_url(resource))
def create_branch(
@@ -353,7 +353,7 @@ def create_branch(
:param cleanup_enabled: bool - enable/disable automatic cleanup of branch
:return: PUT request
"""
- resource = "plan/{plan_key}/branch/{branch_name}".format(plan_key=plan_key, branch_name=branch_name)
+ resource = f"plan/{plan_key}/branch/{branch_name}"
params = {}
if vcs_branch:
params = dict(
@@ -370,7 +370,7 @@ def get_vcs_branches(self, plan_key, max_results=25):
:param max_results
:return:
"""
- resource = "plan/{plan_key}/vcsBranches".format(plan_key=plan_key)
+ resource = f"plan/{plan_key}/vcsBranches"
return self.base_list_call(
resource,
start_index=0,
@@ -415,11 +415,11 @@ 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 += f"/{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)
+ resource += f"/{project_key}-{plan_key}/{build_number}"
elif project_key and plan_key:
- resource += "/{}-{}".format(project_key, plan_key)
+ resource += f"/{project_key}-{plan_key}"
elif project_key:
resource += "/" + project_key
@@ -573,7 +573,7 @@ def build_result(
"""
try:
int(build_key.split("-")[-1])
- resource = "result/{}".format(build_key)
+ resource = f"result/{build_key}"
return self.base_list_call(
resource,
expand,
@@ -584,7 +584,7 @@ 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(f'The key "{build_key}" does not correspond to a build result')
def build_latest_result(self, plan_key, expand=None, include_all_states=False):
"""
@@ -596,7 +596,7 @@ def build_latest_result(self, plan_key, expand=None, include_all_states=False):
:param include_all_states:
"""
try:
- resource = "result/{}/latest.json".format(plan_key)
+ resource = f"result/{plan_key}/latest.json"
return self.base_list_call(
resource,
expand,
@@ -607,7 +607,7 @@ 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(f'The key "{plan_key}" does not correspond to the latest build result')
def delete_build_result(self, build_key):
"""
@@ -616,7 +616,7 @@ def delete_build_result(self, build_key):
"""
custom_resource = "/build/admin/deletePlanResults.action"
build_key = build_key.split("-")
- plan_key = "{}-{}".format(build_key[0], build_key[1])
+ plan_key = f"{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)
@@ -639,7 +639,7 @@ def execute_build(
:param bamboo_variables: dict {variable=value}
:return: POST request
"""
- resource = "queue/{plan_key}".format(plan_key=plan_key)
+ resource = f"queue/{plan_key}"
params = {}
if stage:
execute_all_stages = False
@@ -648,8 +648,8 @@ def execute_build(
params["customRevision"] = custom_revision
params["executeAllStages"] = "true" if execute_all_stages else "false"
if bamboo_variables:
- for key, value in bamboo_variables.items():
- params["bamboo.variable.{}".format(key)] = value
+ for key, value in list(bamboo_variables.items()):
+ params[f"bamboo.variable.{key}"] = value
return self.post(self.resource_url(resource), params=params)
@@ -659,7 +659,7 @@ def stop_build(self, plan_key):
:param plan_key: str TST-BLD
:return: GET request
"""
- resource = "/build/admin/stopPlan.action?planKey={}".format(plan_key)
+ resource = f"/build/admin/stopPlan.action?planKey={plan_key}"
return self.post(path=resource, headers=self.no_check_headers)
""" Comments & Labels """
@@ -681,7 +681,7 @@ def comments(
:param max_results:
:return:
"""
- resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number)
+ resource = f"result/{project_key}-{plan_key}-{build_number}/comment"
params = {"start-index": start_index, "max-results": max_results}
return self.get(self.resource_url(resource), params=params)
@@ -694,7 +694,7 @@ def create_comment(self, project_key, plan_key, build_number, comment):
:param comment:
:return:
"""
- resource = "result/{}-{}-{}/comment".format(project_key, plan_key, build_number)
+ resource = f"result/{project_key}-{plan_key}-{build_number}/comment"
comment_data = {
"content": comment,
}
@@ -717,7 +717,7 @@ def labels(
:param max_results:
:return:
"""
- resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number)
+ resource = f"result/{project_key}-{plan_key}-{build_number}/label"
params = {"start-index": start_index, "max-results": max_results}
return self.get(self.resource_url(resource), params=params)
@@ -730,7 +730,7 @@ def create_label(self, project_key, plan_key, build_number, label):
:param label:
:return:
"""
- resource = "result/{}-{}-{}/label".format(project_key, plan_key, build_number)
+ resource = f"result/{project_key}-{plan_key}-{build_number}/label"
return self.post(self.resource_url(resource), data={"name": label})
def delete_label(self, project_key, plan_key, build_number, label):
@@ -742,9 +742,10 @@ def delete_label(self, project_key, plan_key, build_number, label):
:param label:
:return:
"""
- resource = "result/{}-{}-{}/label/{}".format(project_key, plan_key, build_number, label)
+ resource = f"result/{project_key}-{plan_key}-{build_number}/label/{label}"
return self.delete(self.resource_url(resource))
+ @property
def get_projects(self):
"""Method used to list all projects defined in Bamboo.
Projects without any plan are not listed."""
@@ -752,7 +753,7 @@ def get_projects(self):
max_results = 25
while True:
- resource = "project?start-index={}&max-result={}".format(start_idx, max_results)
+ resource = f"project?start-index={start_idx}&max-result={max_results}"
r = self.get(self.resource_url(resource))
@@ -784,7 +785,7 @@ def deployment_project(self, project_id):
:param project_id:
:return:
"""
- resource = "deploy/project/{}".format(project_id)
+ resource = f"deploy/project/{project_id}"
return self.get(self.resource_url(resource))
def delete_deployment_project(self, project_id):
@@ -793,7 +794,7 @@ def delete_deployment_project(self, project_id):
:param project_id:
:return:
"""
- resource = "deploy/project/{}".format(project_id)
+ resource = f"deploy/project/{project_id}"
return self.delete(self.resource_url(resource))
def deployment_environment_results(self, env_id, expand=None, max_results=25):
@@ -804,7 +805,7 @@ def deployment_environment_results(self, env_id, expand=None, max_results=25):
:param max_results:
:return:
"""
- resource = "deploy/environment/{environmentId}/results".format(environmentId=env_id)
+ resource = f"deploy/environment/{env_id}/results"
params = {"max-result": max_results, "start-index": 0}
size = 1
if expand:
@@ -821,7 +822,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 = f"deploy/dashboard/{project_id}" if project_id else "deploy/dashboard"
return self.get(self.resource_url(resource))
def get_deployment_projects_for_plan(self, plan_key):
@@ -889,7 +890,7 @@ def delete_group(self, group_name):
:param group_name:
:return:
"""
- url = "rest/api/latest/admin/groups/{}".format(group_name)
+ url = f"rest/api/latest/admin/groups/{group_name}"
return self.delete(url)
def add_users_into_group(self, group_name, users):
@@ -901,7 +902,7 @@ def add_users_into_group(self, group_name, users):
:param users: list
:return:
"""
- url = "rest/api/latest/admin/groups/{}/add-users".format(group_name)
+ url = f"rest/api/latest/admin/groups/{group_name}/add-users"
return self.post(url, data=users)
def remove_users_from_group(self, group_name, users):
@@ -913,7 +914,7 @@ def remove_users_from_group(self, group_name, users):
:param users: list
:return:
"""
- url = "rest/api/latest/admin/groups/{}/remove-users".format(group_name)
+ url = f"rest/api/latest/admin/groups/{group_name}/remove-users"
return self.delete(url, data=users)
def get_users_from_group(self, group_name, filter_users=None, start=0, limit=25):
@@ -929,7 +930,7 @@ def get_users_from_group(self, group_name, filter_users=None, start=0, limit=25)
params = {"limit": limit, "start": start}
if filter_users:
params = {"filter": filter_users}
- url = "rest/api/latest/admin/groups/{}/more-members".format(group_name)
+ url = f"rest/api/latest/admin/groups/{group_name}/more-members"
return self.get(url, params=params)
def get_users_not_in_group(self, group_name, filter_users="", start=0, limit=25):
@@ -946,7 +947,7 @@ 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 = f"rest/api/latest/admin/groups/{group_name}/more-non-members"
return self.get(url, params=params)
def get_deployment_users(self, deployment_id, filter_name=None, start=0, limit=25):
@@ -963,7 +964,7 @@ def get_deployment_users(self, deployment_id, filter_name=None, start=0, limit=2
params = {"limit": limit, "start": start}
if filter_name:
params = {"name": filter_name}
- resource = "permissions/deployment/{}/users".format(deployment_id)
+ resource = f"permissions/deployment/{deployment_id}/users"
return self.get(self.resource_url(resource), params=params)
def revoke_user_from_deployment(self, deployment_id, user, permissions=["READ", "WRITE", "BUILD"]):
@@ -974,7 +975,7 @@ def revoke_user_from_deployment(self, deployment_id, user, permissions=["READ",
:param permissions:
:return:
"""
- resource = "permissions/deployment/{}/users/{}".format(deployment_id, user)
+ resource = f"permissions/deployment/{deployment_id}/users/{user}"
return self.delete(self.resource_url(resource), data=permissions)
def grant_user_to_deployment(self, deployment_id, user, permissions):
@@ -985,7 +986,7 @@ def grant_user_to_deployment(self, deployment_id, user, permissions):
:param permissions:
:return:
"""
- resource = "permissions/deployment/{}/users/{}".format(deployment_id, user)
+ resource = f"permissions/deployment/{deployment_id}/users/{user}"
return self.put(self.resource_url(resource), data=permissions)
def get_deployment_groups(self, deployment_id, filter_name=None, start=0, limit=25):
@@ -1002,7 +1003,7 @@ def get_deployment_groups(self, deployment_id, filter_name=None, start=0, limit=
params = {"limit": limit, "start": start}
if filter_name:
params = {"name": filter_name}
- resource = "permissions/deployment/{}/groups".format(deployment_id)
+ resource = f"permissions/deployment/{deployment_id}/groups"
return self.get(self.resource_url(resource), params=params)
def revoke_group_from_deployment(self, deployment_id, group, permissions=["READ", "WRITE", "BUILD"]):
@@ -1013,7 +1014,7 @@ def revoke_group_from_deployment(self, deployment_id, group, permissions=["READ"
:param permissions:
:return:
"""
- resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group)
+ resource = f"permissions/deployment/{deployment_id}/groups/{group}"
return self.delete(self.resource_url(resource), data=permissions)
def grant_group_to_deployment(self, deployment_id, group, permissions):
@@ -1024,7 +1025,7 @@ def grant_group_to_deployment(self, deployment_id, group, permissions):
:param permissions:
:return:
"""
- resource = "permissions/deployment/{}/groups/{}".format(deployment_id, group)
+ resource = f"permissions/deployment/{deployment_id}/groups/{group}"
return self.put(self.resource_url(resource), data=permissions)
def get_environment_users(self, environment_id, filter_name=None, start=0, limit=25):
@@ -1041,7 +1042,7 @@ def get_environment_users(self, environment_id, filter_name=None, start=0, limit
params = {"limit": limit, "start": start}
if filter_name:
params = {"name": filter_name}
- resource = "permissions/environment/{}/users".format(environment_id)
+ resource = f"permissions/environment/{environment_id}/users"
return self.get(self.resource_url(resource), params=params)
def revoke_user_from_environment(self, environment_id, user, permissions=["READ", "WRITE", "BUILD"]):
@@ -1052,7 +1053,7 @@ def revoke_user_from_environment(self, environment_id, user, permissions=["READ"
:param permissions:
:return:
"""
- resource = "permissions/environment/{}/users/{}".format(environment_id, user)
+ resource = f"permissions/environment/{environment_id}/users/{user}"
return self.delete(self.resource_url(resource), data=permissions)
def grant_user_to_environment(self, environment_id, user, permissions):
@@ -1063,7 +1064,7 @@ def grant_user_to_environment(self, environment_id, user, permissions):
:param permissions:
:return:
"""
- resource = "permissions/environment/{}/users/{}".format(environment_id, user)
+ resource = f"permissions/environment/{environment_id}/users/{user}"
return self.put(self.resource_url(resource), data=permissions)
def get_environment_groups(self, environment_id, filter_name=None, start=0, limit=25):
@@ -1080,7 +1081,7 @@ def get_environment_groups(self, environment_id, filter_name=None, start=0, limi
params = {"limit": limit, "start": start}
if filter_name:
params = {"name": filter_name}
- resource = "permissions/environment/{}/groups".format(environment_id)
+ resource = f"permissions/environment/{environment_id}/groups"
return self.get(self.resource_url(resource), params=params)
def revoke_group_from_environment(self, environment_id, group, permissions=["READ", "WRITE", "BUILD"]):
@@ -1091,7 +1092,7 @@ def revoke_group_from_environment(self, environment_id, group, permissions=["REA
:param permissions:
:return:
"""
- resource = "permissions/environment/{}/groups/{}".format(environment_id, group)
+ resource = f"permissions/environment/{environment_id}/groups/{group}"
return self.delete(self.resource_url(resource), data=permissions)
def grant_group_to_environment(self, environment_id, group, permissions):
@@ -1102,7 +1103,7 @@ def grant_group_to_environment(self, environment_id, group, permissions):
:param permissions:
:return:
"""
- resource = "permissions/environment/{}/groups/{}".format(environment_id, group)
+ resource = f"permissions/environment/{environment_id}/groups/{group}"
return self.put(self.resource_url(resource), data=permissions)
"""Other actions"""
@@ -1143,7 +1144,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(f"agent/{agent_id}/status"))
return response["online"]
def agent_enable(self, agent_id):
@@ -1153,7 +1154,7 @@ def agent_enable(self, agent_id):
:param agent_id: Bamboo agent ID (integer number)
:return: None
"""
- self.put(self.resource_url("agent/{}/enable".format(agent_id)))
+ self.put(self.resource_url(f"agent/{agent_id}/enable"))
def agent_disable(self, agent_id):
"""
@@ -1162,7 +1163,7 @@ def agent_disable(self, agent_id):
:param agent_id: Bamboo agent ID (integer number)
:return: None
"""
- self.put(self.resource_url("agent/{}/disable".format(agent_id)))
+ self.put(self.resource_url(f"agent/{agent_id}/disable"))
def agent_remote(self, online=False):
"""
@@ -1184,7 +1185,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(f"agent/{agent_id}"), params=params)
def agent_capabilities(self, agent_id, include_shared=True):
"""
@@ -1195,7 +1196,7 @@ def agent_capabilities(self, agent_id, include_shared=True):
:return: agents
"""
return self.get(
- self.resource_url("agent/{}/capability".format(agent_id)),
+ self.resource_url(f"agent/{agent_id}/capability"),
params={"includeShared": include_shared},
)
@@ -1208,7 +1209,7 @@ def get_custom_expiry(self, limit=25):
If global expiry is not enabled it returns empty response.
:param limit:
"""
- url = "rest/api/latest/admin/expiry/custom/plan?limit={}".format(limit)
+ url = f"rest/api/latest/admin/expiry/custom/plan?limit={limit}"
return self.get(url)
def reports(self, max_results=25):
@@ -1300,7 +1301,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 = f"/elasticInstances/instance/{instance_id}/logs"
return self.get(self.resource_url(resource))
def get_elastic_configurations(self):
@@ -1327,7 +1328,7 @@ def get_elastic_configuration(self, configuration_id):
:return:
"""
- resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id)
+ resource = f"elasticConfiguration/{configuration_id}"
return self.get(self.resource_url(resource))
def update_elastic_configuration(self, configuration_id, data):
@@ -1338,7 +1339,7 @@ def update_elastic_configuration(self, configuration_id, data):
:return:
"""
- resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id)
+ resource = f"elasticConfiguration/{configuration_id}"
return self.put(self.resource_url(resource), data=data)
def delete_elastic_configuration(self, configuration_id):
@@ -1348,7 +1349,7 @@ def delete_elastic_configuration(self, configuration_id):
:return:
"""
- resource = "elasticConfiguration/{configuration_id}".format(configuration_id=configuration_id)
+ resource = f"elasticConfiguration/{configuration_id}"
return self.delete(self.resource_url(resource))
def get_elastic_bamboo(self):
@@ -1380,7 +1381,7 @@ def get_plugin_info(self, plugin_key):
Provide plugin info
:return a json of installed plugins
"""
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.get(url, headers=self.no_check_headers, trailing=True)
def get_plugin_license_info(self, plugin_key):
@@ -1388,7 +1389,7 @@ def get_plugin_license_info(self, plugin_key):
Provide plugin license information
:return a json specific License query
"""
- url = "rest/plugins/1.0/{plugin_key}-key/license".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key/license"
return self.get(url, headers=self.no_check_headers, trailing=True)
def upload_plugin(self, plugin_path):
@@ -1404,7 +1405,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
return self.post(url, files=files, headers=self.no_check_headers)
def disable_plugin(self, plugin_key):
@@ -1417,7 +1418,7 @@ def disable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "disabled"}
return self.put(url, data=data, headers=app_headers)
@@ -1431,7 +1432,7 @@ def enable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "enabled"}
return self.put(url, data=data, headers=app_headers)
@@ -1441,7 +1442,7 @@ def delete_plugin(self, plugin_key):
:param plugin_key:
:return:
"""
- url = "rest/plugins/1.0/{}-key".format(plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.delete(url)
def check_plugin_manager_status(self):
@@ -1463,6 +1464,6 @@ def update_plugin_license(self, plugin_key, raw_license):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key)
+ url = f"/plugins/1.0/{plugin_key}/license"
data = {"rawLicense": raw_license}
return self.put(url, data=data, headers=app_headers)
diff --git a/atlassian/bitbucket/__init__.py b/atlassian/bitbucket/__init__.py
index b9f4aa291..13b2abdc8 100644
--- a/atlassian/bitbucket/__init__.py
+++ b/atlassian/bitbucket/__init__.py
@@ -79,7 +79,7 @@ def group_members(self, group, start=0, limit=None):
:return: A list of group members
"""
- url = "{}/groups/more-members".format(self._url_admin())
+ url = f"{self._url_admin()}/groups/more-members"
params = {}
if start:
params["start"] = start
@@ -150,7 +150,7 @@ def get_users_info(self, user_filter=None, start=0, limit=25):
:param start:
:return:
"""
- url = "{}/users".format(self._url_admin(api_version="1.0"))
+ url = f"{self._url_admin(api_version='1.0')}/users"
params = {}
if limit:
params["limit"] = limit
@@ -160,6 +160,7 @@ def get_users_info(self, user_filter=None, start=0, limit=25):
params["filter"] = user_filter
return self._get_paged(url, params=params)
+ @property
def get_current_license(self):
"""
Retrieves details about the current license, as well as the current status of the system with
@@ -170,11 +171,11 @@ def get_current_license(self):
are not permitted to access license details.
:return:
"""
- url = "{}/license".format(self._url_admin())
+ url = f"{self._url_admin()}/license"
return self.get(url)
def _url_mail_server(self):
- return "{}/mail-server".format(self._url_admin())
+ return f"{self._url_admin()}/mail-server"
def get_mail_configuration(self):
"""
@@ -186,7 +187,7 @@ def get_mail_configuration(self):
return self.get(url)
def _url_mail_server_sender_address(self):
- return "{}/sender-address".format(self._url_mail_server())
+ return f"{self._url_mail_server()}/sender-address"
def get_mail_sender_address(self):
"""
@@ -233,13 +234,13 @@ def get_associated_build_statuses(self, commit):
:return:
"""
url = self.resource_url(
- "commits/{commitId}".format(commitId=commit),
+ f"commits/{commit}",
api_root="rest/build-status",
)
return self.get(url)
def _url_announcement_banner(self):
- return "{}/banner".format(self._url_admin())
+ return f"{self._url_admin()}/banner"
def get_announcement_banner(self):
"""
@@ -284,7 +285,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={}".format(upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
files = {"plugin": open(plugin_path, "rb")}
return self.post(url, files=files, headers=self.no_check_headers)
@@ -296,9 +297,9 @@ def get_categories(self, project_key, repository_slug=None):
:return: If 'repository_slug', returns the list with categories of the repository,
otherwise, returns the list with the categories of the project 'project_key'
"""
- url = "project/{}".format(project_key)
+ url = f"project/{project_key}"
if repository_slug:
- url = "{}/repository/{}".format(url, repository_slug)
+ url = f"{url}/repository/{repository_slug}"
url = self.resource_url(url, api_root="rest/categories", api_version="latest")
data = self.get(url)
return data.get("result").get("categories")
@@ -342,7 +343,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 f"{self._url_projects(api_root, api_version)}/{project_key}"
def project(self, key):
"""
@@ -378,7 +379,7 @@ def update_project(self, key, **params):
return self.put(url, data=params)
def _url_project_avatar(self, project_key):
- return "{}/avatar.png".format(self._url_project(project_key))
+ return f"{self._url_project(project_key)}/avatar.png"
def project_summary(self, key):
"""
@@ -433,7 +434,7 @@ def project_keys(self, key, start=0, limit=None, filter_str=None):
:param filter_str: OPTIONAL: users filter string
:return: The list of SSH access keys
"""
- url = "{}/ssh".format(self._url_project(key, api_root="rest/keys"))
+ url = f"{self._url_project(key, api_root='rest/keys')}/ssh"
params = {}
if start:
params["start"] = start
@@ -444,7 +445,7 @@ def project_keys(self, key, start=0, limit=None, filter_str=None):
return self._get_paged(url, params=params)
def _url_project_users(self, project_key):
- return "{}/permissions/users".format(self._url_project(project_key))
+ return f"{self._url_project(project_key)}/permissions/users"
def project_users(self, key, start=0, limit=None, filter_str=None):
"""
@@ -506,7 +507,7 @@ def project_remove_user_permissions(self, project_key, username):
return self.delete(url, params=params)
def _url_project_groups(self, project_key):
- return "{}/permissions/groups".format(self._url_project(project_key))
+ return f"{self._url_project(project_key)}/permissions/groups"
def project_groups(self, key, start=0, limit=None, filter_str=None):
"""
@@ -562,7 +563,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 = f"{self._url_project(project_key)}/permissions/{permission}/all"
return self.get(url)
def project_grant_default_permissions(self, project_key, permission):
@@ -572,7 +573,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 = f"{self._url_project(project_key)}/permissions/{permission}/all"
return self.post(url, params={"allow": True})
def project_remove_default_permissions(self, project_key, permission):
@@ -582,11 +583,11 @@ 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 = f"{self._url_project(project_key)}/permissions/{permission}/all"
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))
+ return f"{self._url_project(project_key)}/settings/hooks"
def all_project_repo_hook_settings(self, project_key, start=0, limit=None, filter_type=None):
"""
@@ -616,7 +617,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 = f"{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):
@@ -626,7 +627,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 = f"{self._url_project_repo_hook_settings(project_key)}/{hook_key}/enabled"
return self.put(url)
def disable_project_repo_hook_settings(self, project_key, hook_key):
@@ -636,7 +637,7 @@ 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 = f"{self._url_project_repo_hook_settings(project_key)}/{hook_key}/enabled"
return self.delete(url)
def _url_project_conditions(self, project_key):
@@ -669,7 +670,7 @@ def _url_project_condition(self, project_key, id_condition=None):
)
)
if id_condition is not None:
- url += "/{}".format(id_condition)
+ url += f"/{id_condition}"
return url
def get_project_condition(self, project_key, id_condition):
@@ -741,7 +742,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 f"{self._url_project(project_key, api_root='rest/audit')}/events"
def get_project_audit_log(self, project_key, start=0, limit=None):
"""
@@ -760,7 +761,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 f"{self._url_project(project_key, api_root, api_version)}/repos"
def repo_list(self, project_key, start=0, limit=25):
"""
@@ -823,7 +824,7 @@ 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 f"{self._url_repos(project_key, api_root, api_version)}/{repo}"
def reindex_repo(self, project_key, repository_slug):
"""
@@ -852,7 +853,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 = f"{self._url_repo(project_key, repository_slug, api_root='rest/jira-dev')}/reindex"
return self.post(url)
def get_repo(self, project_key, repository_slug):
@@ -951,7 +952,7 @@ 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 = f"{self._url_repo(project_key, repo_key, api_root='rest/keys')}/ssh"
params = {}
if start:
params["start"] = start
@@ -962,7 +963,7 @@ def repo_keys(self, project_key, repo_key, start=0, limit=None, filter_str=None)
return self._get_paged(url, params=params)
def _url_repo_users(self, project_key, repo):
- return "{}/permissions/users".format(self._url_repo(project_key, repo))
+ return f"{self._url_repo(project_key, repo)}/permissions/users"
def repo_users(self, project_key, repo_key, start=0, limit=None, filter_str=None):
"""
@@ -1014,7 +1015,7 @@ 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 f"{self._url_repo(project_key, repo)}/permissions/groups"
def repo_groups(self, project_key, repo_key, start=0, limit=None, filter_str=None):
"""
@@ -1123,7 +1124,7 @@ def _url_repo_labels(self, project_key, repository_slug):
if self.cloud:
raise Exception("Not supported in Bitbucket Cloud")
- return "{}/labels".format(self._url_repo(project_key, repository_slug))
+ return f"{self._url_repo(project_key, repository_slug)}/labels"
def get_repo_labels(self, project_key, repository_slug):
"""
@@ -1153,7 +1154,7 @@ 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 f"{self._url_repo(project_key, repository_slug, api_root='rest/audit')}/events"
def get_repo_audit_log(self, project_key, repository_slug, start=0, limit=None):
"""
@@ -1173,7 +1174,7 @@ 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 f"{self._url_repo(project_key, repository_slug, api_root=api_root)}/branches"
def get_branches(
self,
@@ -1219,7 +1220,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 f"{self._url_repo_branches(project_key, repository_slug)}/default"
def get_default_branch(self, project_key, repository_slug):
"""
@@ -1287,9 +1288,9 @@ 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 f"{self._url_repo(project_key, repository_slug, api_root=api_root)}/refs/tags"
else:
- return "{}/tags".format(self._url_repo(project_key, repository_slug, api_root=api_root))
+ return f"{self._url_repo(project_key, repository_slug, api_root=api_root)}/tags"
def get_tags(
self,
@@ -1336,7 +1337,7 @@ def get_project_tags(self, project_key, repository_slug, tag_name=None):
"""
url = self._url_repo_tags(project_key, repository_slug)
if tag_name is not None:
- return self.get("{}/{}".format(url, tag_name))
+ return self.get(f"{url}/{tag_name}")
return self._get_paged(url)
@@ -1377,14 +1378,11 @@ 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 = f"{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 f"{self._url_repo(project_key, repository_slug)}/settings/hooks"
def all_repo_hook_settings(
self,
@@ -1423,10 +1421,7 @@ 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 = f"{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):
@@ -1437,10 +1432,7 @@ 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 = f"{self._url_repo_hook_settings(project_key, repository_slug)}/{hook_key}/enabled"
return self.put(url)
def disable_repo_hook_settings(self, project_key, repository_slug, hook_key):
@@ -1451,14 +1443,11 @@ 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 = f"{self._url_repo_hook_settings(project_key, repository_slug)}/{hook_key}/enabled"
return self.delete(url)
def _url_webhooks(self, project_key, repository_slug):
- return "{}/webhooks".format(self._url_repo(project_key, repository_slug))
+ return f"{self._url_repo(project_key, repository_slug)}/webhooks"
def get_webhooks(
self,
@@ -1518,7 +1507,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 f"{self._url_webhooks(project_key, repository_slug)}/{webhook_id}"
def get_webhook(self, project_key, repository_slug, webhook_id):
"""
@@ -1557,7 +1546,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 f"{self._url_repo(project_key, repository_slug)}/settings/pull-requests"
def get_pull_request_settings(self, project_key, repository_slug):
"""
@@ -1582,9 +1571,9 @@ 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(f"repositories/{project_key}/{repository_slug}/pullrequests")
else:
- return "{}/pull-requests".format(self._url_repo(project_key, repository_slug))
+ return f"{self._url_repo(project_key, repository_slug)}/pull-requests"
def get_pull_requests(
self,
@@ -1736,10 +1725,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 f"{self._url_pull_requests(project_key, repository_slug)}/{pull_request_id}"
def get_pull_request(self, project_key, repository_slug, pull_request_id):
"""
@@ -1813,9 +1799,9 @@ def get_pull_requests_activities(
:return:
"""
if self.cloud:
- url = "{}/activity".format(self._url_pull_request(project_key, repository_slug, pull_request_id))
+ url = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/activity"
else:
- url = "{}/activities".format(self._url_pull_request(project_key, repository_slug, pull_request_id))
+ url = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/activities"
params = {}
if start:
params["start"] = start
@@ -1840,7 +1826,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 = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/changes"
params = {}
if start:
params["start"] = start
@@ -1867,7 +1853,7 @@ def get_pull_requests_commits(
:limit
:return:
"""
- url = "{}/commits".format(self._url_pull_request(project_key, repository_slug, pull_request_id))
+ url = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/commits"
params = {}
if start:
params["start"] = start
@@ -1876,10 +1862,7 @@ 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 f"{self._url_pull_requests(project_key, repository_slug)}/{pull_request_id}/participants"
def get_pull_requests_participants(
self,
@@ -1998,10 +1981,7 @@ def change_reviewed_status(self, project_key, repository_slug, pull_request_id,
:param user_slug:
:return:
"""
- url = "{}/{}".format(
- self._url_pull_request_participants(project_key, repository_slug, pull_request_id),
- user_slug,
- )
+ url = f"{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},
@@ -2011,7 +1991,7 @@ def change_reviewed_status(self, project_key, repository_slug, pull_request_id,
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))
+ url = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/comments"
return url
def add_pull_request_comment(
@@ -2039,10 +2019,7 @@ def add_pull_request_comment(
return self.post(url, data=body)
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,
- )
+ url = f"{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):
@@ -2121,7 +2098,7 @@ def delete_pull_request_comment(
return self.delete(url, params=data)
def _url_pull_request_blocker_comments(self, project_key, repository_slug, pull_request_id) -> str:
- url = "{}/blocker-comments".format(self._url_pull_request(project_key, repository_slug, pull_request_id))
+ url = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/blocker-comments"
return url
def add_pull_request_blocker_comment(
@@ -2163,7 +2140,7 @@ 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 = f"{self._url_pull_request(project_key, repository_slug, pr_id)}/decline"
params = {}
if not self.cloud:
params["version"] = pr_version
@@ -2179,7 +2156,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 = f"{self._url_pull_request(project_key, repository_slug, pull_request_id)}/tasks"
return self.get(url)
def _url_tasks(self):
@@ -2199,7 +2176,7 @@ def add_task(self, anchor, text):
return self.post(url, data=data)
def _url_task(self, task_id):
- return "{}/{}".format(self._url_tasks(), task_id)
+ return f"{self._url_tasks()}/{task_id}"
def get_task(self, task_id):
"""
@@ -2249,7 +2226,7 @@ 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 = f"{self._url_pull_request(project_key, repository_slug, pr_id)}/merge"
return self.get(url)
def merge_pull_request(
@@ -2276,7 +2253,7 @@ def merge_pull_request(
:param merge_strategy: "squash"
:return:
"""
- url = "{}/merge".format(self._url_pull_request(project_key, repository_slug, pr_id))
+ url = f"{self._url_pull_request(project_key, repository_slug, pr_id)}/merge"
params = {}
data = {
"type": "pullrequest",
@@ -2300,7 +2277,7 @@ 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 = f"{self._url_pull_request(project_key, repository_slug, pr_id)}/reopen"
params = {"version": pr_version}
return self.post(url, params=params)
@@ -2308,7 +2285,7 @@ def _url_inbox_pull_requests(self):
return "inbox/pull-requests"
def check_inbox_pull_requests_count(self):
- url = "{}/count".format(self._url_inbox_pull_requests())
+ url = f"{self._url_inbox_pull_requests()}/count"
return self.get(url)
def check_inbox_pull_requests(self, start=0, limit=None, role=None):
@@ -2328,7 +2305,7 @@ def check_inbox_pull_requests(self, start=0, limit=None, role=None):
return self._get_paged(url, params=params)
def _url_repo_compare(self, project_key, repository_slug):
- url = "{}/compare".format(self._url_repo(project_key, repository_slug))
+ url = f"{self._url_repo(project_key, repository_slug)}/compare"
return url
def get_diff(self, project_key, repository_slug, path, hash_oldest, hash_newest):
@@ -2343,7 +2320,7 @@ 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 = f"{self._url_repo_compare(project_key, repository_slug)}/diff/{path}"
params = {}
if hash_oldest:
params["from"] = hash_oldest
@@ -2492,7 +2469,7 @@ def get_commit_info(self, project_key, repository_slug, commit, path=None):
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))
+ return f"{self._url_commit(project_key, repository_slug, commit_id)}/pull-requests"
def get_pull_requests_contain_commit(self, project_key, repository_slug, commit):
url = self._url_commit_pull_requests(project_key, repository_slug, commit)
@@ -2518,7 +2495,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 = f"{self._url_repo(project_key, repository_slug)}/compare/commits"
params = {}
if ref_from:
params["from"] = ref_from
@@ -2641,9 +2618,9 @@ def get_file_list(
:param limit: OPTIONAL
:return:
"""
- url = "{}/files".format(self._url_repo(project_key, repository_slug))
+ url = f"{self._url_repo(project_key, repository_slug)}/files"
if sub_folder:
- url = "{}/{}".format(url, sub_folder.lstrip("/"))
+ url = f"{url}/{sub_folder.lstrip('/')}"
params = {}
if query:
params["at"] = query
@@ -2665,7 +2642,7 @@ 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 = f"{self._url_repo(project_key, repository_slug)}/raw/{filename}"
params = {}
if at is not None:
params["at"] = at
@@ -2689,7 +2666,7 @@ 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 f"{base}/restrictions/{'' if permission_id is None else str(permission_id)}"
def get_branches_permissions(
self,
@@ -2895,7 +2872,7 @@ def disable_branching_model(self, 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 f"{self._url_repo(project_key, repository_slug)}/browse/{filename}"
def upload_file(self, project_key, repository_slug, content, message, branch, filename):
"""
@@ -2948,22 +2925,18 @@ def search_code(self, team, search_query, page=1, limit=10):
:team: str
:search_query: str
"""
- url = self.resource_url("teams/{team}/search/code".format(team=team))
+ url = self.resource_url(f"teams/{team}/search/code")
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(
- projectKey=project_key, repositorySlug=repo
- )
+ url = f"rest/git-lfs/admin/projects/{project_key}/repos/{repo}/enabled"
return self.get(url)
def set_lfs_repo_status(self, project_key, repo, enable=True):
- url = "rest/git-lfs/admin/projects/{projectKey}/repos/{repositorySlug}/enabled".format(
- projectKey=project_key, repositorySlug=repo
- )
+ url = f"rest/git-lfs/admin/projects/{project_key}/repos/{repo}/enabled"
if enable:
return self.put(url)
else:
@@ -3143,7 +3116,7 @@ def download_repo_archive(
if the supplied prefix does not end with a trailing /, one will be added automatically
:param chunk_size: int: Optional, download chunk size. Defeault is 128
"""
- url = "{}/archive".format(self._url_repo(project_key, repository_slug))
+ url = f"{self._url_repo(project_key, repository_slug)}/archive"
params = {}
if at is not None:
params["at"] = at
diff --git a/atlassian/bitbucket/cloud/__init__.py b/atlassian/bitbucket/cloud/__init__.py
index 3b156a58f..c74d4de5d 100644
--- a/atlassian/bitbucket/cloud/__init__.py
+++ b/atlassian/bitbucket/cloud/__init__.py
@@ -10,10 +10,10 @@ def __init__(self, url="https://api.bitbucket.org/", *args, **kwargs):
kwargs["cloud"] = True
kwargs["api_root"] = None
kwargs["api_version"] = "2.0"
- url = url.strip("/") + "/{}".format(kwargs["api_version"])
+ url = url.strip("/") + f"/{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(f"{self.url}/workspaces", **self._new_session_args)
+ self.__repositories = Repositories(f"{self.url}/repositories", **self._new_session_args)
@property
def workspaces(self):
diff --git a/atlassian/bitbucket/cloud/base.py b/atlassian/bitbucket/cloud/base.py
index 9751765a4..7741cfcc5 100644
--- a/atlassian/bitbucket/cloud/base.py
+++ b/atlassian/bitbucket/cloud/base.py
@@ -22,7 +22,7 @@ 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")))
+ raise ValueError(f"Expected type of data is [{expected_type}], got [{self.get_data('type')}].")
def get_link(self, link):
"""
@@ -115,7 +115,7 @@ def raise_for_status(self, response):
if e.get("detail"):
# It uses interpolation instead of concatenation because of
# https://github.com/atlassian-api/atlassian-python-api/issues/1481
- error_msg = "{}\n{}".format(error_msg, str(e["detail"]))
+ error_msg = f"{error_msg}\n{str(e['detail'])}"
except Exception as e:
log.error(e)
response.raise_for_status()
diff --git a/atlassian/bitbucket/cloud/common/builds.py b/atlassian/bitbucket/cloud/common/builds.py
index cbffd598e..6345a429d 100644
--- a/atlassian/bitbucket/cloud/common/builds.py
+++ b/atlassian/bitbucket/cloud/common/builds.py
@@ -80,6 +80,7 @@ def refname(self):
def update(self, **kwargs):
"""Update build status.
- See https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-put
+ See
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-put
"""
return self._update_data(self.put(None, data=kwargs))
diff --git a/atlassian/bitbucket/cloud/repositories/__init__.py b/atlassian/bitbucket/cloud/repositories/__init__.py
index 67bff1167..3e4a0b401 100644
--- a/atlassian/bitbucket/cloud/repositories/__init__.py
+++ b/atlassian/bitbucket/cloud/repositories/__init__.py
@@ -87,7 +87,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(f"{workspace}/{repo_slug}"))
class WorkspaceRepositories(RepositoriesBase):
@@ -127,7 +127,7 @@ 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(f"fork_policy must be one of {self.FORK_POLICIES}")
data["fork_policy"] = fork_policy
return self._get_object(self.post(repo_slug, data=data))
@@ -179,9 +179,9 @@ def get(self, repository, by="slug"):
if r.name == repository:
return r
else:
- ValueError("Unknown value '{}' for argument [by], expected 'key' or 'name'".format(by))
+ ValueError(f"Unknown value '{by}' for argument [by], expected 'key' or 'name'")
- raise Exception("Unknown repository {} '{}'".format(by, repository))
+ raise Exception(f"Unknown repository {by} '{repository}'")
def exists(self, repository, by="slug"):
"""
@@ -203,7 +203,7 @@ def exists(self, repository, by="slug"):
if e.response.status_code in (401, 404):
pass
except Exception as e:
- if not str(e) == "Unknown project {} '{}'".format(by, repository):
+ if not str(e) == f"Unknown project {by} '{repository}'":
raise e
return exists
@@ -243,46 +243,46 @@ 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(f"Unknown value '{by}' for argument [by], expected 'slug' or 'name'")
for r in self.each():
if ((by == "slug") and (r.slug == repository)) or ((by == "name") and (r.name == repository)):
return r
- raise Exception("Unknown repository {} '{}'".format(by, repository))
+ raise Exception(f"Unknown repository {by} '{repository}'")
class Repository(BitbucketCloudBase):
def __init__(self, data, *args, **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
+ f"{self.url}/branch-restrictions", **self._new_session_args
)
- self.__branches = Branches("{}/refs/branches".format(self.url), **self._new_session_args)
+ self.__branches = Branches(f"{self.url}/refs/branches", **self._new_session_args)
self.__commits = Commits(
- "{}/commits".format(self.url),
- data={"links": {"commit": {"href": "{}/commit".format(self.url)}}},
+ f"{self.url}/commits",
+ data={"links": {"commit": {"href": f"{self.url}/commit"}}},
**self._new_session_args
) # fmt: skip
self.__hooks = Hooks(
- "{}/hooks".format(self.url),
- data={"links": {"hooks": {"href": "{}/hooks".format(self.url)}}},
+ f"{self.url}/hooks",
+ data={"links": {"hooks": {"href": f"{self.url}/hooks"}}},
**self._new_session_args
) # fmt: skip
- self.__default_reviewers = DefaultReviewers("{}/default-reviewers".format(self.url), **self._new_session_args)
+ self.__default_reviewers = DefaultReviewers(f"{self.url}/default-reviewers", **self._new_session_args)
self.__deployment_environments = DeploymentEnvironments(
- "{}/environments".format(self.url), **self._new_session_args
+ f"{self.url}/environments", **self._new_session_args
)
self.__group_permissions = GroupPermissions(
- "{}/permissions-config/groups".format(self.url), **self._new_session_args
+ f"{self.url}/permissions-config/groups", **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.__issues = Issues(f"{self.url}/issues", **self._new_session_args)
+ self.__pipelines = Pipelines(f"{self.url}/pipelines", **self._new_session_args)
+ self.__pullrequests = PullRequests(f"{self.url}/pullrequests", **self._new_session_args)
self.__repository_variables = RepositoryVariables(
- "{}/pipelines_config/variables".format(self.url), **self._new_session_args
+ f"{self.url}/pipelines_config/variables", **self._new_session_args
)
- self.__tags = Tags("{}/refs/tags".format(self.url), **self._new_session_args)
+ self.__tags = Tags(f"{self.url}/refs/tags", **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..5308b070d 100644
--- a/atlassian/bitbucket/cloud/repositories/branchRestrictions.py
+++ b/atlassian/bitbucket/cloud/repositories/branchRestrictions.py
@@ -41,7 +41,8 @@ def create(
:return: The created BranchRestriction object
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions#post
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions#post
"""
if branch_match_kind == "branching_model":
branch_pattern = ""
@@ -103,7 +104,8 @@ def get(self, id):
:return: The requested BranchRestriction objects
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#get
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#get
"""
return self.__get_object(super(BranchRestrictions, self).get(id))
@@ -120,7 +122,8 @@ def update(self, **kwargs):
:return: The updated branch restriction
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#put
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#put
"""
return self._update_data(self.put(None, data=kwargs))
@@ -130,7 +133,8 @@ def delete(self):
:return: The response on success
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#delete
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#delete
"""
return super(BranchRestriction, self).delete(None)
diff --git a/atlassian/bitbucket/cloud/repositories/commits.py b/atlassian/bitbucket/cloud/repositories/commits.py
index 0710f5057..6807a0f55 100644
--- a/atlassian/bitbucket/cloud/repositories/commits.py
+++ b/atlassian/bitbucket/cloud/repositories/commits.py
@@ -27,7 +27,8 @@ def each(self, top=None, q=None, sort=None):
:return: A generator for the Commit objects
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commits-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commits-get
"""
params = {}
if sort is not None:
@@ -48,7 +49,8 @@ def get(self, commit_hash):
:return: The requested Commit object
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get
+ 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(
@@ -62,7 +64,8 @@ class Commit(BitbucketCloudBase):
"""
Bitbucket Cloud commit endpoint.
- See https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get
+ See
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-get
"""
def __init__(self, data, *args, **kwargs):
@@ -96,7 +99,8 @@ def parents(self):
def statuses(self):
"""
Return generator object of the status's endpoint.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-get
"""
return self._get_paged("statuses")
@@ -122,7 +126,8 @@ def add_build(
"""
Add new build status to commit.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-post
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-post
"""
data = {
"key": key,
@@ -138,7 +143,8 @@ def get_build(self, key):
"""
Return a specific build for the commit.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commit-statuses/#api-repositories-workspace-repo-slug-commit-commit-statuses-build-key-get
+ 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)),
@@ -148,7 +154,8 @@ def get_build(self, key):
def comments(self):
"""
Return generator object endpoint of the comment.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-comments-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-comments-get
"""
for comment in self._get_paged("comments"):
yield Comment(comment, **self._new_session_args)
@@ -157,7 +164,8 @@ def comment(self, raw_message):
"""
Add a comment to the pull request in raw format.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-comments-post
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-comments-post
"""
if not raw_message:
raise ValueError("No message set")
@@ -174,7 +182,8 @@ def approve(self):
"""
Approve a commit.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-approve-post
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-approve-post
"""
data = {"approved": True}
return self.post("approve", data)
@@ -183,7 +192,8 @@ def unapprove(self):
"""
Unapprove a commit.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-approve-delete
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commit-commit-approve-delete
"""
return super(BitbucketCloudBase, self).delete("approve")
@@ -195,7 +205,8 @@ def get_pull_requests(self, start=0, pagelen=0):
installation automatically occurs when 'Go to pull request' is clicked
from the web interface for a commit's details.
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pullrequests/#api-repositories-workspace-repo-slug-commit-commit-pullrequests-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pullrequests/#api-repositories-workspace-repo-slug-commit-commit-pullrequests-get
:param start: int, OPTIONAL: The starting page of pull requests to retrieve. Defaults to 0.
:param pagelen: int, OPTIONAL: The number of pull requests to retrieve per page. Defaults to 0.
diff --git a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py
index fef722861..ad345fbd6 100644
--- a/atlassian/bitbucket/cloud/repositories/defaultReviewers.py
+++ b/atlassian/bitbucket/cloud/repositories/defaultReviewers.py
@@ -27,7 +27,8 @@ def add(self, user):
:return: The added DefaultReviewer object
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#put
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#put
"""
# the mention_id parameter is undocumented but if missed, leads to 400 statuses
return self.__get_object(self.put(user, data={"mention_id": user}))
@@ -45,7 +46,8 @@ def each(self, q=None, sort=None):
:return: A generator for the DefaultReviewer objects
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers#get
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers#get
"""
params = {}
if sort is not None:
@@ -65,7 +67,8 @@ def get(self, user):
:return: The requested DefaultReviewer object, None if not a default reviewer
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#get
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#get
"""
default_reviewer = None
try:
@@ -89,6 +92,7 @@ def delete(self):
:return: The response on success
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#delete
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/default-reviewers/%7Btarget_username%7D#delete
"""
return super(DefaultReviewer, self).delete(None)
diff --git a/atlassian/bitbucket/cloud/repositories/deploymentEnvironments.py b/atlassian/bitbucket/cloud/repositories/deploymentEnvironments.py
index 9c251b787..e3756a9cf 100644
--- a/atlassian/bitbucket/cloud/repositories/deploymentEnvironments.py
+++ b/atlassian/bitbucket/cloud/repositories/deploymentEnvironments.py
@@ -22,7 +22,8 @@ def each(self):
:return: A list of the DeploymentEnvironment objects
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/environments/#get
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/environments/#get
"""
# workaround for this issue
@@ -44,7 +45,8 @@ def get(self, uuid):
:return: The requested DeploymentEnvironment objects
- API docs: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/environments/%7Benvironment_uuid%7D#get
+ API docs:
+ https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/environments/%7Benvironment_uuid%7D#get
"""
return self.__get_object(super(DeploymentEnvironments, self).get(uuid))
@@ -56,7 +58,7 @@ def __init__(self, url, data, *args, **kwargs):
)
deployment_environment_url = self.get_deployment_environment_variable_url(self.url)
self.__deployment_environment_variables = DeploymentEnvironmentVariables(
- "{}/variables".format(deployment_environment_url), **self._new_session_args
+ f"{deployment_environment_url}/variables", **self._new_session_args
)
@property
@@ -127,7 +129,7 @@ def deployment_environment_variables(self):
def get_deployment_environment_variable_url(self, url):
parsed_url = urlsplit(url)
path = parsed_url.path.split("/environments/")
- new_path = "{}/deployments_config/environments/{}".format(path[0], path[1])
+ new_path = f"{path[0]}/deployments_config/environments/{path[1]}"
list_parsed_url = list(parsed_url[:])
list_parsed_url[2] = new_path
return urlunsplit(tuple(list_parsed_url))
@@ -154,7 +156,8 @@ def create(self, key, value, secured):
:return: The created DeploymentEnvironment object
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-deployments-config-environments-environment-uuid-variables-post
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-deployments-config-environments-environment-uuid-variables-post
"""
data = {"key": key, "value": value, "secured": secured}
return self.__get_object(self.post(None, data=data))
@@ -218,7 +221,7 @@ def update(self, **kwargs):
API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-deployments-config-environments-environment-uuid-variables-variable-uuid-put
"""
- return self._update_data(self.put("/{}".format(self.uuid), data=kwargs))
+ return self._update_data(self.put(f"/{self.uuid}", data=kwargs))
def delete(self):
"""
@@ -226,7 +229,7 @@ def delete(self):
:return: The response on success
API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-deployments-config-environments-environment-uuid-variables-variable-uuid-delete
"""
- return super(DeploymentEnvironmentVariable, self).delete("/{}".format(self.uuid))
+ return super(DeploymentEnvironmentVariable, self).delete(f"/{self.uuid}")
@property
def uuid(self):
diff --git a/atlassian/bitbucket/cloud/repositories/hooks.py b/atlassian/bitbucket/cloud/repositories/hooks.py
index 3901cd39d..8e2dcf60c 100644
--- a/atlassian/bitbucket/cloud/repositories/hooks.py
+++ b/atlassian/bitbucket/cloud/repositories/hooks.py
@@ -105,7 +105,7 @@ def update(self, **kwargs):
"active": self.active(),
}
- for key in payload.keys() and kwargs.keys():
+ for key in list(payload.keys()) and list(kwargs.keys()):
payload[key] = kwargs[key]
return self._update_data(self.put(None, data=payload))
diff --git a/atlassian/bitbucket/cloud/repositories/pipelines.py b/atlassian/bitbucket/cloud/repositories/pipelines.py
index 0c9a562c6..01b096fa4 100644
--- a/atlassian/bitbucket/cloud/repositories/pipelines.py
+++ b/atlassian/bitbucket/cloud/repositories/pipelines.py
@@ -108,7 +108,7 @@ def __init__(self, url, data, *args, **kwargs):
def __get_object(self, data):
return Step(
- "{}/steps/{}".format(self.url, data["uuid"]),
+ f"{self.url}/steps/{data['uuid']}",
data,
**self._new_session_args
) # fmt: skip
@@ -180,7 +180,7 @@ def step(self, uuid):
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#get
"""
- return self.__get_object(self.get("steps/{}".format(uuid)))
+ return self.__get_object(self.get(f"steps/{uuid}"))
class Step(BitbucketCloudBase):
@@ -246,7 +246,7 @@ def log(self, start=None, end=None):
start = int(start)
end = int(end)
if (start >= 0) and (start < end):
- headers["Range"] = "bytes={}-{}".format(start, end)
+ headers["Range"] = f"bytes={start}-{end}"
else:
raise ValueError("Value of [start] must be o or greater and [end] must be greater than [start].")
diff --git a/atlassian/bitbucket/cloud/repositories/pullRequests.py b/atlassian/bitbucket/cloud/repositories/pullRequests.py
index 08298199a..a002219ce 100644
--- a/atlassian/bitbucket/cloud/repositories/pullRequests.py
+++ b/atlassian/bitbucket/cloud/repositories/pullRequests.py
@@ -406,7 +406,7 @@ 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))
+ raise ValueError(f"merge_strategy must be {self.MERGE_STRATEGIES}")
data = {
"close_source_branch": close_source_branch or self.close_source_branch,
diff --git a/atlassian/bitbucket/cloud/workspaces/members.py b/atlassian/bitbucket/cloud/workspaces/members.py
index c770eb47c..2fa45ceb0 100644
--- a/atlassian/bitbucket/cloud/workspaces/members.py
+++ b/atlassian/bitbucket/cloud/workspaces/members.py
@@ -16,7 +16,8 @@ def each(self):
:return: A generator for the member objects
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-members-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-members-get
"""
for member in self._get_paged(None):
yield self.__get_object(member)
@@ -31,7 +32,8 @@ def get(self, member):
:return: The requested Member object
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-members-member-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-members-member-get
"""
return self.__get_object(super(WorkspaceMembers, self).get(member))
diff --git a/atlassian/bitbucket/cloud/workspaces/permissions.py b/atlassian/bitbucket/cloud/workspaces/permissions.py
index a771788c5..3d1c4ff58 100644
--- a/atlassian/bitbucket/cloud/workspaces/permissions.py
+++ b/atlassian/bitbucket/cloud/workspaces/permissions.py
@@ -28,7 +28,8 @@ def each(self, q=None, sort=None, pagelen=10):
:param pagelen: page length
:return: A generator for the Workspace Permission objects
- API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-permissions-get
+ API docs:
+ https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-permissions-get
"""
params = {}
if sort is not None:
@@ -48,7 +49,7 @@ def each(self, q=None, sort=None, pagelen=10):
def repositories(self, repo_slug="", pagelen=10):
for permissions in self._get_paged(
- "repositories/{}".format(repo_slug), trailing=True, params={"pagelen": pagelen}
+ f"repositories/{repo_slug}", trailing=True, params={"pagelen": pagelen}
):
yield self.__get_object_repository_permission(permissions)
diff --git a/atlassian/bitbucket/cloud/workspaces/projects.py b/atlassian/bitbucket/cloud/workspaces/projects.py
index daa821beb..730f79ec2 100644
--- a/atlassian/bitbucket/cloud/workspaces/projects.py
+++ b/atlassian/bitbucket/cloud/workspaces/projects.py
@@ -92,9 +92,9 @@ 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(f"Unknown value '{by}' for argument [by], expected 'key' or 'name'")
- raise Exception("Unknown project {} '{}'".format(by, project))
+ raise Exception(f"Unknown project {by} '{project}'")
def exists(self, project, by="key"):
"""
@@ -115,7 +115,7 @@ def exists(self, project, by="key"):
if e.response.status_code in (401, 404):
pass
except Exception as e:
- if not str(e) == "Unknown project {} '{}'".format(by, project):
+ if not str(e) == f"Unknown project {by} '{project}'":
raise e
return exists
@@ -127,7 +127,7 @@ def __init__(self, data, *args, **kwargs):
url = self.get_link("repositories")
except KeyError:
workspace = self.get_data("workspace")
- url = '{}/?q=project.key="{}"'.format(workspace["links"]["self"], workspace["slug"])
+ url = f'{workspace["links"]["self"]}/?q=project.key="{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..0df3cc7fd 100644
--- a/atlassian/bitbucket/server/__init__.py
+++ b/atlassian/bitbucket/server/__init__.py
@@ -15,7 +15,7 @@ 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("/") + f"/{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)
diff --git a/atlassian/bitbucket/server/common/permissions.py b/atlassian/bitbucket/server/common/permissions.py
index 74331b992..506e7e420 100644
--- a/atlassian/bitbucket/server/common/permissions.py
+++ b/atlassian/bitbucket/server/common/permissions.py
@@ -14,7 +14,7 @@ def __init__(self, url, permission_prefix, *args, **kwargs):
def __permission(self, permission):
"""Internal function to get the permission for the put request."""
- return "{}_{}".format(self.__permission_prefix, permission)
+ return f"{self.__permission_prefix}_{permission}"
def admin(self, name):
"""
@@ -104,7 +104,7 @@ def get(self, name):
if entry.name == name:
return entry
- raise Exception("Unknown group/user '{}'".format(name))
+ raise Exception(f"Unknown group/user '{name}'")
class Groups(Permissions):
diff --git a/atlassian/bitbucket/server/globalPermissions.py b/atlassian/bitbucket/server/globalPermissions.py
index 1d5a35589..609e030ec 100644
--- a/atlassian/bitbucket/server/globalPermissions.py
+++ b/atlassian/bitbucket/server/globalPermissions.py
@@ -100,7 +100,7 @@ def get(self, name):
if entry.name == name:
return entry
- raise Exception("Unknown group/user '{}'".format(name))
+ raise Exception(f"Unknown group/user '{name}'")
class Groups(GlobalPermissions):
diff --git a/atlassian/bitbucket/server/projects/__init__.py b/atlassian/bitbucket/server/projects/__init__.py
index 1e3d64f09..4a45db69b 100644
--- a/atlassian/bitbucket/server/projects/__init__.py
+++ b/atlassian/bitbucket/server/projects/__init__.py
@@ -81,9 +81,9 @@ 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(f"Unknown value '{by}' for argument [by], expected 'key' or 'name'")
- raise Exception("Unknown project {} '{}'".format(by, project))
+ raise Exception(f"Unknown project {by} '{project}'")
def exists(self, project, by="key"):
"""
@@ -102,7 +102,7 @@ def exists(self, project, by="key"):
if e.response.status_code in (401, 404):
pass
except Exception as e:
- if not str(e) == "Unknown project {} '{}'".format(by, project):
+ if not str(e) == f"Unknown project {by} '{project}'":
raise e
return exists
diff --git a/atlassian/bitbucket/server/projects/repos/__init__.py b/atlassian/bitbucket/server/projects/repos/__init__.py
index af06ff7e7..067429147 100644
--- a/atlassian/bitbucket/server/projects/repos/__init__.py
+++ b/atlassian/bitbucket/server/projects/repos/__init__.py
@@ -48,13 +48,13 @@ def get(self, repository, by="slug"):
return self.__get_object(super(Repositories, self).get(repository))
elif by == "name":
for r in self.each():
- print(r.name)
+ print((r.name))
if r.name == repository:
return r
else:
- ValueError("Unknown value '{}' for argument [by], expected 'slug' or 'name'".format(by))
+ ValueError(f"Unknown value '{by}' for argument [by], expected 'slug' or 'name'")
- raise Exception("Unknown repository {} '{}'".format(by, repository))
+ raise Exception(f"Unknown repository {by} '{repository}'")
def exists(self, repository, by="slug"):
"""
@@ -73,7 +73,7 @@ def exists(self, repository, by="slug"):
if e.response.status_code in (401, 404):
pass
except Exception as e:
- if not str(e) == "Unknown project {} '{}'".format(by, repository):
+ if not str(e) == f"Unknown project {by} '{repository}'":
raise e
return exists
@@ -244,7 +244,7 @@ def default_branch(self, branch):
API docs: https://docs.atlassian.com/bitbucket-server/rest/7.8.0/bitbucket-rest.html#idp186
"""
- self.put("default-branch", data={"id": "refs/heads/{}".format(branch)})
+ self.put("default-branch", data={"id": f"refs/heads/{branch}"})
def forks(self):
"""
diff --git a/atlassian/cloud_admin.py b/atlassian/cloud_admin.py
index b772bc1a7..3fb0abfc1 100644
--- a/atlassian/cloud_admin.py
+++ b/atlassian/cloud_admin.py
@@ -28,5 +28,5 @@ def __init__(self, admin_api_key, *args, **kwargs):
super(CloudAdminUsers, self).__init__(ADMIN_URL, *args, **kwargs)
def get_profile(self, account_id):
- url = self.resource_url("{}/manage/profile".format(account_id))
+ url = self.resource_url(f"{account_id}/manage/profile")
return self.get(url)
diff --git a/atlassian/confluence.py b/atlassian/confluence.py
index 6a3cb06db..d882cf3a7 100644
--- a/atlassian/confluence.py
+++ b/atlassian/confluence.py
@@ -162,7 +162,7 @@ def share_with_others(self, page_id, group, message):
}
r = self.post(url, json=params, headers={"contentType": "application/json; charset=utf-8"}, advanced_mode=True)
if r.status_code != 200:
- raise Exception("failed sharing content {code}: {reason}".format(code=r.status_code, reason=r.text))
+ raise Exception(f"failed sharing content {r.status_code}: {r.text}")
def get_page_child_by_type(self, page_id, type="page", start=None, limit=None, expand=None):
"""
@@ -182,7 +182,7 @@ 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 = f"rest/api/content/{page_id}/child/{type}"
log.info(url)
try:
@@ -369,7 +369,7 @@ def get_page_by_id(self, page_id, expand=None, status=None, version=None):
params["status"] = status
if version:
params["version"] = version
- url = "rest/api/content/{page_id}".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}"
try:
response = self.get(url, params=params)
@@ -465,7 +465,7 @@ def get_page_labels(self, page_id, prefix=None, start=None, limit=None):
:return: The JSON data returned from the content/{id}/label endpoint, or the results of the
callback. Will raise requests.HTTPError on bad input, potentially.
"""
- url = "rest/api/content/{id}/label".format(id=page_id)
+ url = f"rest/api/content/{page_id}/label"
params = {}
if prefix:
params["prefix"] = prefix
@@ -519,7 +519,7 @@ def get_page_comments(
params["location"] = location
if depth:
params["depth"] = depth
- url = "rest/api/content/{id}/child/comment".format(id=content_id)
+ url = f"rest/api/content/{content_id}/child/comment"
try:
response = self.get(url, params=params)
@@ -564,7 +564,7 @@ def get_all_pages_by_label(self, label, start=0, limit=50, expand=None):
url = "rest/api/content/search"
params = {}
if label:
- params["cql"] = 'type={type} AND label="{label}"'.format(type="page", label=label)
+ params["cql"] = f'type={"page"} AND label="{label}"'
if start:
params["start"] = start
if limit:
@@ -701,7 +701,7 @@ 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 = f"rest/api/content?cql=space=spaceKey={space} and status={status}"
params = {}
if limit:
params["limit"] = limit
@@ -799,7 +799,7 @@ def get_all_restrictions_for_content(self, content_id):
:param content_id:
:return: Return the raw json response
"""
- url = "rest/api/content/{}/restriction/byOperation".format(content_id)
+ url = f"rest/api/content/{content_id}/restriction/byOperation"
return self.get(url)
def remove_page_from_trash(self, page_id):
@@ -825,7 +825,7 @@ def remove_content(self, content_id):
:return:
"""
try:
- response = self.delete("rest/api/content/{}".format(content_id))
+ response = self.delete(f"rest/api/content/{content_id}")
except HTTPError as e:
if e.response.status_code == 404:
# Raise ApiError as the documented reason is ambiguous
@@ -852,7 +852,7 @@ def remove_page(self, page_id, status=None, recursive=False):
:param recursive: OPTIONAL: if True - will recursively delete all children pages too
:return:
"""
- url = "rest/api/content/{page_id}".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}"
if recursive:
children_pages = self.get_page_child_by_type(page_id)
for children_page in children_pages:
@@ -1033,7 +1033,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 = f"rest/experimental/template/{template_id}"
try:
response = self.get(url)
@@ -1058,7 +1058,7 @@ def get_content_template(self, template_id):
:param str template_id: The ID of the content template to be returned
:return:
"""
- url = "rest/api/template/{template_id}".format(template_id=template_id)
+ url = f"rest/api/template/{template_id}"
try:
response = self.get(url)
@@ -1231,7 +1231,7 @@ def remove_template(self, template_id):
:param str template_id: The ID of the template to be deleted.
:return:
"""
- return self.delete("rest/api/template/{}".format(template_id))
+ return self.delete(f"rest/api/template/{template_id}")
def get_all_spaces(
self,
@@ -1321,7 +1321,7 @@ def attach_content(
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 f"Uploaded {name}."
data = {
"type": type,
"fileName": name,
@@ -1333,7 +1333,7 @@ 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 = f"rest/api/content/{page_id}/child/attachment"
# Check if there is already a file with the same name
attachments = self.get(path=path, headers=headers, params={"filename": name})
if attachments.get("size"):
@@ -1457,7 +1457,7 @@ def download_attachments_from_page(self, page_id, path=None, start=0, limit=50,
# Fetch specific file by filename
attachments = self.get_attachments_from_content(page_id=page_id, filename=filename)["results"]
if not attachments:
- return "No attachment with filename '{0}' found on the page.".format(filename)
+ return f"No attachment with filename '{filename}' found on the page."
else:
# Fetch all attachments with pagination
attachments = self.get_attachments_from_content(page_id=page_id, start=start, limit=limit)["results"]
@@ -1488,17 +1488,17 @@ def download_attachments_from_page(self, page_id, path=None, start=0, limit=50,
else:
return {"attachments_downloaded": len(attachments), "path": path}
except NotADirectoryError:
- raise FileNotFoundError("The directory '{path}' does not exist.".format(path=path))
+ raise FileNotFoundError(f"The directory '{path}' does not exist.")
except PermissionError:
- raise PermissionError("Permission denied when trying to save files to '{path}'.".format(path=path))
+ raise PermissionError(f"Permission denied when trying to save files to '{path}'.")
except requests.HTTPError as http_err:
raise requests.HTTPError(
- "HTTP error occurred while downloading attachments: {http_err}".format(http_err=http_err),
+ f"HTTP error occurred while downloading attachments: {http_err}",
response=http_err.response,
request=http_err.request,
)
except Exception as err:
- raise Exception("An unexpected error occurred: {error}".format(error=err))
+ raise Exception(f"An unexpected error occurred: {err}")
def delete_attachment(self, page_id, filename, version=None):
"""
@@ -1525,9 +1525,9 @@ def delete_attachment_by_id(self, attachment_id, version):
:return:
"""
if self.cloud:
- url = "rest/api/content/{id}/version/{versionId}".format(id=attachment_id, versionId=version)
+ url = f"rest/api/content/{attachment_id}/version/{version}"
else:
- url = "rest/experimental/content/{id}/version/{versionId}".format(id=attachment_id, versionId=version)
+ url = f"rest/experimental/content/{attachment_id}/version/{version}"
return self.delete(url)
def remove_page_attachment_keep_version(self, page_id, filename, keep_last_versions):
@@ -1566,9 +1566,9 @@ def get_attachment_history(self, attachment_id, limit=200, start=0):
"""
params = {"limit": limit, "start": start}
if self.cloud:
- url = "rest/api/content/{id}/version".format(id=attachment_id)
+ url = f"rest/api/content/{attachment_id}/version"
else:
- url = "rest/experimental/content/{id}/version".format(id=attachment_id)
+ url = f"rest/experimental/content/{attachment_id}/version"
return (self.get(url, params=params) or {}).get("results")
# @todo prepare more attachments info
@@ -1602,7 +1602,7 @@ def get_attachments_from_content(
params["filename"] = filename
if media_type:
params["mediaType"] = media_type
- url = "rest/api/content/{id}/child/attachment".format(id=page_id)
+ url = f"rest/api/content/{page_id}/child/attachment"
try:
response = self.get(url, params=params)
@@ -1626,7 +1626,7 @@ def set_page_label(self, page_id, label):
:param label: label to add
:return:
"""
- url = "rest/api/content/{page_id}/label".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}/label"
data = {"prefix": "global", "name": label}
try:
@@ -1651,7 +1651,7 @@ def remove_page_label(self, page_id, label):
:param label: label name
:return:
"""
- url = "rest/api/content/{page_id}/label".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}/label"
params = {"id": page_id, "name": label}
try:
@@ -1675,7 +1675,7 @@ def remove_page_label(self, page_id, label):
return response
def history(self, page_id):
- url = "rest/api/content/{0}/history".format(page_id)
+ url = f"rest/api/content/{page_id}/history"
try:
response = self.get(url)
except HTTPError as e:
@@ -1702,11 +1702,9 @@ def get_content_history_by_version_number(self, content_id, version_number):
:return:
"""
if self.cloud:
- url = "rest/api/content/{id}/version/{versionNumber}".format(id=content_id, versionNumber=version_number)
+ url = f"rest/api/content/{content_id}/version/{version_number}"
else:
- url = "rest/experimental/content/{id}/version/{versionNumber}".format(
- id=content_id, versionNumber=version_number
- )
+ url = f"rest/experimental/content/{content_id}/version/{version_number}"
return self.get(url)
def remove_content_history(self, page_id, version_number):
@@ -1717,11 +1715,9 @@ def remove_content_history(self, page_id, version_number):
:return:
"""
if self.cloud:
- url = "rest/api/content/{id}/version/{versionNumber}".format(id=page_id, versionNumber=version_number)
+ url = f"rest/api/content/{page_id}/version/{version_number}"
else:
- url = "rest/experimental/content/{id}/version/{versionNumber}".format(
- id=page_id, versionNumber=version_number
- )
+ url = f"rest/experimental/content/{page_id}/version/{version_number}"
self.delete(url)
def remove_page_history(self, page_id, version_number):
@@ -1740,7 +1736,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 = f"rest/api/content/{page_id}/version/{version_id}"
self.delete(url)
def remove_page_history_keep_version(self, page_id, keep_last_versions):
@@ -1905,7 +1901,7 @@ def update_page(
data["metadata"]["properties"]["content-appearance-published"] = {"value": "fixed-width"}
try:
response = self.put(
- "rest/api/content/{0}".format(page_id),
+ f"rest/api/content/{page_id}",
data=data,
params=params,
)
@@ -1977,7 +1973,7 @@ def _insert_to_existing_page(
try:
response = self.put(
- "rest/api/content/{0}".format(page_id),
+ f"rest/api/content/{page_id}",
data=data,
params=params,
)
@@ -2147,7 +2143,7 @@ def set_page_property(self, page_id, data):
:param data: data should be as json data
:return:
"""
- url = "rest/api/content/{page_id}/property".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}/property"
json_data = data
try:
@@ -2181,7 +2177,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 = f"rest/api/content/{page_id}/property/{data.get('key')}"
try:
response = self.put(path=url, data=data)
except HTTPError as e:
@@ -2220,9 +2216,7 @@ def delete_page_property(self, page_id, page_property):
:param page_property: key of property
:return:
"""
- url = "rest/api/content/{page_id}/property/{page_property}".format(
- page_id=page_id, page_property=str(page_property)
- )
+ url = f"rest/api/content/{page_id}/property/{str(page_property)}"
try:
response = self.delete(path=url)
except HTTPError as e:
@@ -2245,7 +2239,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 = f"rest/api/content/{page_id}/property/{str(page_property_key)}"
try:
response = self.get(path=url)
except HTTPError as e:
@@ -2268,7 +2262,7 @@ def get_page_properties(self, page_id):
:param page_id: content_id format
:return: get properties
"""
- url = "rest/api/content/{page_id}/property".format(page_id=page_id)
+ url = f"rest/api/content/{page_id}/property"
try:
response = self.get(path=url)
@@ -2291,7 +2285,7 @@ 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 = f"rest/api/content/{page_id}?expand=ancestors"
try:
response = self.get(path=url)
@@ -2329,7 +2323,7 @@ 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 = f"rest/api/group?limit={limit}&start={start}"
try:
response = self.get(url)
@@ -2364,7 +2358,7 @@ def remove_group(self, name):
:return:
"""
log.info("Removing group: %s during Confluence remove_group method execution", name)
- url = "rest/api/admin/group/{groupName}".format(groupName=name)
+ url = f"rest/api/admin/group/{name}"
try:
response = self.delete(url)
@@ -2390,9 +2384,7 @@ def get_group_members(self, group_name="confluence-users", start=0, limit=1000,
:param expand: OPTIONAL: A comma separated list of properties to expand on the content. status
:return:
"""
- url = "rest/api/group/{group_name}/member?limit={limit}&start={start}&expand={expand}".format(
- group_name=group_name, limit=limit, start=start, expand=expand
- )
+ url = f"rest/api/group/{group_name}/member?limit={limit}&start={start}&expand={expand}"
try:
response = self.get(url)
@@ -2431,7 +2423,7 @@ def get_all_members(self, group_name="confluence-users", expand=None):
else:
members.extend(values)
if not members:
- print("Did not get members from {} group, please check permissions or connectivity".format(group_name))
+ print((f"Did not get members from {group_name} group, please check permissions or connectivity"))
return members
def get_space(self, space_key, expand="description.plain,homepage", params=None):
@@ -2442,7 +2434,7 @@ def get_space(self, space_key, expand="description.plain,homepage", params=None)
:param params: OPTIONAL: dictionary of additional URL parameters
:return: Returns the space along with its ID
"""
- url = "rest/api/space/{space_key}".format(space_key=space_key)
+ url = f"rest/api/space/{space_key}"
params = params or {}
if expand:
params["expand"] = expand
@@ -2484,8 +2476,8 @@ def get_space_content(
:return: Returns the space along with its ID
"""
- 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)
+ content_type = f"{'/' + content_type if content_type else ''}"
+ url = f"rest/api/space/{space_key}/content{content_type}"
params = {
"depth": depth,
"start": start,
@@ -2530,7 +2522,7 @@ def delete_space(self, space_key):
:param space_key:
:return:
"""
- url = "rest/api/space/{}".format(space_key)
+ url = f"rest/api/space/{space_key}"
try:
response = self.delete(url)
@@ -2548,7 +2540,7 @@ def delete_space(self, space_key):
return response
def get_space_property(self, space_key, expand=None):
- url = "rest/api/space/{space}/property".format(space=space_key)
+ url = f"rest/api/space/{space_key}/property"
params = {}
if expand:
params["expand"] = expand
@@ -2716,7 +2708,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 = f"spaces/flyingpdf/pdfpageexport.action?pageId={page_id}"
if self.api_version == "cloud":
url = self.get_pdf_download_url_for_confluence_cloud(url)
if not url:
@@ -2733,7 +2725,7 @@ def get_page_as_word(self, page_id):
:return: Word File
"""
headers = self.form_token_headers
- url = "exportword?pageId={pageId}".format(pageId=page_id)
+ url = f"exportword?pageId={page_id}"
return self.get(url, headers=headers, not_json_response=True)
def get_space_export(self, space_key: str, export_type: str) -> str:
@@ -2770,19 +2762,13 @@ def get_atl_request(url: str):
+ space_key
)
if export_type == "csv":
- form_data = {
- "atl_token": get_atl_request(
- "spaces/exportspacecsv.action?key={space_key}".format(space_key=space_key)
- ),
- "exportType": "TYPE_CSV",
- "contentOption": "all",
- "includeComments": "true",
- "confirm": "Export",
- }
+ form_data = dict(atl_token=get_atl_request(
+ f"spaces/exportspacecsv.action?key={space_key}"
+ ), exportType="TYPE_CSV", contentOption="all", includeComments="true", confirm="Export")
elif export_type == "html":
form_data = {
"atl_token": get_atl_request(
- "spaces/exportspacehtml.action?key={space_key}".format(space_key=space_key)
+ f"spaces/exportspacehtml.action?key={space_key}"
),
"exportType": "TYPE_HTML",
"contentOption": "visibleOnly",
@@ -2792,7 +2778,7 @@ def get_atl_request(url: str):
elif export_type == "xml":
form_data = {
"atl_token": get_atl_request(
- "spaces/exportspacexml.action?key={space_key}".format(space_key=space_key)
+ f"spaces/exportspacexml.action?key={space_key}"
),
"exportType": "TYPE_XML",
"contentOption": "all",
@@ -2806,7 +2792,7 @@ def get_atl_request(url: str):
else:
raise ValueError("Invalid export_type parameter value. Valid values are: 'html/csv/xml/pdf'")
url = self.url_joiner(
- url=self.url, path="spaces/doexportspace.action?key={space_key}".format(space_key=space_key)
+ url=self.url, path=f"spaces/doexportspace.action?key={space_key}"
)
# Sending a POST request that triggers the space export.
@@ -2861,7 +2847,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 = f'rest/api/content/search?cql=parent={parent_id}%20AND%20space="{space}"'
try:
response = self.get(url, {})
@@ -2958,7 +2944,7 @@ def get_plugin_info(self, plugin_key):
Provide plugin info
:return a json of installed plugins
"""
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.get(url, headers=self.no_check_headers, trailing=True)
def get_plugin_license_info(self, plugin_key):
@@ -2966,7 +2952,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 = f"rest/plugins/1.0/{plugin_key}-key/license"
return self.get(url, headers=self.no_check_headers, trailing=True)
def upload_plugin(self, plugin_path):
@@ -2982,7 +2968,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
return self.post(url, files=files, headers=self.no_check_headers)
def disable_plugin(self, plugin_key):
@@ -2995,7 +2981,7 @@ def disable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "disabled"}
return self.put(url, data=data, headers=app_headers)
@@ -3009,7 +2995,7 @@ def enable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "enabled"}
return self.put(url, data=data, headers=app_headers)
@@ -3019,7 +3005,7 @@ def delete_plugin(self, plugin_key):
:param plugin_key:
:return:
"""
- url = "rest/plugins/1.0/{}-key".format(plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.delete(url)
def check_plugin_manager_status(self):
@@ -3037,7 +3023,7 @@ def update_plugin_license(self, plugin_key, raw_license):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key)
+ url = f"/plugins/1.0/{plugin_key}/license"
data = {"rawLicense": raw_license}
return self.put(url, data=data, headers=app_headers)
@@ -3071,7 +3057,7 @@ 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(f"rest/api/longtask/{task_id}", params=params)
except HTTPError as e:
if e.response.status_code == 404:
# Raise ApiError as the documented reason is ambiguous
@@ -3102,7 +3088,7 @@ def get_pdf_download_url_for_confluence_cloud(self, url):
response = self.get(url, headers=headers, not_json_response=True)
response_string = response.decode(encoding="utf-8", errors="ignore")
task_id = response_string.split('name="ajs-taskId" content="')[1].split('">')[0]
- poll_url = "/services/api/v1/task/{0}/progress".format(task_id)
+ poll_url = f"/services/api/v1/task/{task_id}/progress"
while running_task:
log.info("Check if export task has completed.")
progress_response = self.get(poll_url)
@@ -3113,14 +3099,12 @@ def get_pdf_download_url_for_confluence_cloud(self, url):
return None
elif percentage_complete == 100:
running_task = False
- log.info("Task completed - {task_state}".format(task_state=task_state))
+ log.info(f"Task completed - {task_state}")
log.debug("Extract task results to download PDF.")
task_result_url = progress_response.get("result")
else:
log.info(
- "{percentage_complete}% - {task_state}".format(
- percentage_complete=percentage_complete, task_state=task_state
- )
+ f"{percentage_complete}% - {task_state}"
)
time.sleep(3)
log.debug("Task successfully done, querying the task result for the download url")
@@ -3263,7 +3247,7 @@ def get_mobile_parameters(self, username):
:param username:
:return:
"""
- url = "rest/mobile/1.0/profile/{username}".format(username=username)
+ url = f"rest/mobile/1.0/profile/{username}"
return self.get(url)
def avatar_upload_for_user(self, user_key, data):
@@ -3273,7 +3257,7 @@ def avatar_upload_for_user(self, user_key, data):
:param data: json like {"avatarDataURI":"image in base64"}
:return:
"""
- url = "rest/user-profile/1.0/{}/avatar/upload".format(user_key)
+ url = f"rest/user-profile/1.0/{user_key}/avatar/upload"
return self.post(url, data=data)
def avatar_set_default_for_user(self, user_key):
@@ -3281,7 +3265,7 @@ def avatar_set_default_for_user(self, user_key):
:param user_key:
:return:
"""
- url = "rest/user-profile/1.0/{}/avatar/default".format(user_key)
+ url = f"rest/user-profile/1.0/{user_key}/avatar/default"
return self.get(url)
def add_user(self, email, fullname, username, password):
@@ -3351,7 +3335,7 @@ def add_space_permissions(
:param operation_target: str - target of operation to add permissions for
:return: Current permissions of space
"""
- url = "rest/api/space/{}/permission".format(space_key)
+ url = f"rest/api/space/{space_key}/permission"
data = {
"subject": {"type": subject_type, "identifier": subject_id},
"operation": {"key": operation_key, "target": operation_target},
@@ -3417,7 +3401,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 = f"rest/inlinetasks/1/task/{page_id}/{task_id}/"
data = {"status": status, "trigger": "VIEW_PAGE"}
return self.post(url, json=data)
@@ -3546,7 +3530,7 @@ def synchrony_remove_draft(self, page_id):
"""
if self.cloud:
return ApiNotAcceptable
- url = "rest/synchrony/1.0/content/{pageId}/changes/unpublished".format(pageId=page_id)
+ url = f"rest/synchrony/1.0/content/{page_id}/changes/unpublished"
return self.delete(url)
def get_license_details(self):
diff --git a/atlassian/crowd.py b/atlassian/crowd.py
index 933a483ae..5fc2af008 100644
--- a/atlassian/crowd.py
+++ b/atlassian/crowd.py
@@ -26,12 +26,7 @@ def __init__(
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,
- )
+ return f"/{self.api_root}/{api}/{self.api_version}/{resource}"
def _user_change_status(self, username, active):
"""
@@ -139,7 +134,7 @@ def user_groups(self, username, kind="direct"):
:param kind: str - group type
:return: The specify user's group info
"""
- path = self._crowd_api_url("usermanagement", "user/group/{kind}".format(kind=kind))
+ path = self._crowd_api_url("usermanagement", f"user/group/{kind}")
response = self.get(path, params={"username": username})
return search("groups[*].name", response)
@@ -151,7 +146,7 @@ def group_members(self, group, kind="direct", max_results=99999):
:param max_results: int - maximum number of results
:return: The specify group's direct members info
"""
- path = self._crowd_api_url("usermanagement", "group/user/{kind}".format(kind=kind))
+ path = self._crowd_api_url("usermanagement", f"group/user/{kind}")
params = {"groupname": group, "max-results": max_results}
response = self.get(path, params=params)
return search("users[*].name", response)
@@ -164,7 +159,7 @@ def is_user_in_group(self, username, group, kind="direct"):
:param kind: str - group type
:return: bool - Return `True` or `False`
"""
- path = self._crowd_api_url("usermanagement", "group/user/{kind}".format(kind=kind))
+ path = self._crowd_api_url("usermanagement", f"group/user/{kind}")
params = {"username": username, "groupname": group}
response = self.get(path, params=params, advanced_mode=True)
return response.status_code == 200
@@ -211,7 +206,7 @@ def get_plugin_info(self, plugin_key):
Provide plugin info
:return a json of installed plugins
"""
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.get(url, headers=self.no_check_headers, trailing=True)
def get_plugin_license_info(self, plugin_key):
@@ -219,7 +214,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 = f"rest/plugins/1.0/{plugin_key}-key/license"
return self.get(url, headers=self.no_check_headers, trailing=True)
def upload_plugin(self, plugin_path):
@@ -235,7 +230,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
return self.post(url, files=files, headers=self.no_check_headers)
def delete_plugin(self, plugin_key):
@@ -244,7 +239,7 @@ def delete_plugin(self, plugin_key):
:param plugin_key:
:return:
"""
- url = "rest/plugins/1.0/{}-key".format(plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.delete(url)
def check_plugin_manager_status(self):
@@ -262,7 +257,7 @@ def update_plugin_license(self, plugin_key, raw_license):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key)
+ url = f"/plugins/1.0/{plugin_key}/license"
data = {"rawLicense": raw_license}
return self.put(url, data=data, headers=app_headers)
diff --git a/atlassian/insight.py b/atlassian/insight.py
index fc9dc4668..3cef8af79 100644
--- a/atlassian/insight.py
+++ b/atlassian/insight.py
@@ -37,7 +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"] = f"/jsm/insight/workspace/{temp.__get_workspace_id()}/v1/"
# insight cloud uses the atlassian base url, not custom instnace urls
kwargs["url"] = "https://api.atlassian.com"
# set cloud back to true and return
@@ -106,7 +106,7 @@ def get_attachments_of_objects(self, object_id):
raise NotImplementedError
url = self.url_joiner(
self.api_root,
- "attachments/object/{objectId}".format(objectId=object_id),
+ f"attachments/object/{object_id}",
)
return self.get(url)
@@ -119,7 +119,7 @@ def upload_attachment_to_object(self, object_id, filename):
if self.cloud:
raise NotImplementedError
log.info("Adding attachment...")
- url = "rest/insight/1.0/attachments/object/{objectId}".format(objectId=object_id)
+ url = f"rest/insight/1.0/attachments/object/{object_id}"
with open(filename, "rb") as attachment:
files = {"file": attachment}
return self.post(url, headers=self.no_check_headers, files=files)
@@ -132,7 +132,7 @@ def delete_attachment(self, attachment_id):
if self.cloud:
raise NotImplementedError
log.info("Deleting attachment...")
- url = "rest/insight/1.0/attachments/{attachmentId}".format(attachmentId=attachment_id)
+ url = f"rest/insight/1.0/attachments/{attachment_id}"
return self.delete(url)
# Comments
@@ -184,7 +184,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 = f"rest/insight/1.0/comment/object/{object_id}"
return self.get(url)
# Icon
@@ -202,7 +202,7 @@ def get_icon_by_id(self, icon_id):
"url48": "http://jira/rest/insight/1.0/icon/1/icon.png?size=48"
}
"""
- url = self.url_joiner(self.api_root, "icon/{id}".format(id=icon_id))
+ url = self.url_joiner(self.api_root, f"icon/{icon_id}")
return self.get(url)
def get_all_global_icons(self):
@@ -225,7 +225,7 @@ def start_import_configuration(self, import_id):
"""
url = self.url_joiner(
self.api_root,
- "import/start/{import_id}".format(import_id=import_id),
+ f"import/start/{import_id}",
)
return self.post(url)
@@ -307,7 +307,7 @@ 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, f"object/{object_id}")
return self.get(url)
def update_object(
@@ -334,7 +334,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, f"object/{object_id}")
return self.put(url, data=body)
def delete_object(self, object_id):
@@ -344,7 +344,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, f"object/{object_id}")
return self.delete(url)
def get_object_attributes(self, object_id):
@@ -354,7 +354,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, f"object/{object_id}/attributes")
return self.get(url)
def get_object_history(self, object_id, asc=False, abbreviate=True):
@@ -367,7 +367,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, f"object/{object_id}/history")
return self.get(url, params=params)
@deprecated(version="3.29.0", reason="Use get_object_reference_info()")
@@ -382,7 +382,7 @@ 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, f"object/{object_id}/referenceinfo")
return self.get(url)
def create_object(self, object_type_id, attributes, has_avatar=False, avatar_uuid=""):
@@ -463,7 +463,7 @@ def get_object_connected_tickets(self, object_id):
"""
url = self.url_joiner(
self.api_root,
- "objectconnectedtickets/{id}/tickets".format(id=object_id),
+ f"objectconnectedtickets/{object_id}/tickets",
)
return self.get(url)
@@ -506,7 +506,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, f"objectschema/{schema_id}")
return self.get(url)
def update_object_schema(self, schema_id):
@@ -538,11 +538,11 @@ def get_object_schema_object_types_flat(self, schema_id, query=None, exclude=Non
exclude (str, optional): Exclude objects with this name, defaults to None (Use API default)
includeObjectCounts (bool, optional): Populate objectCount attribute for each object type, defaults to None (Use API default)
"""
- kwargs = locals().items()
+ kwargs = list(locals().items())
params = dict()
params.update({k: v for k, v in kwargs if v is not None and k not in ["self", "schema_id"]})
return self.get(
- "{0}/objectschema/{1}/objecttypes/flat".format(self.api_root, schema_id),
+ f"{self.api_root}/objectschema/{schema_id}/objecttypes/flat",
params=params,
)
@@ -571,12 +571,12 @@ def get_object_type_attributes(
order_by_required (bool, optional): Order by required fields, defaults to None (Use API default)
"""
- kwargs = locals().items()
+ kwargs = list(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"]})
return self.get(
- "{0}/objecttype/{1}/attributes".format(self.api_root, type_id),
+ f"{self.api_root}/objecttype/{type_id}/attributes",
headers=self.experimental_headers,
params=params,
)
@@ -617,7 +617,7 @@ def get_progress_of_import(self, import_id):
"""
if self.cloud:
raise NotImplementedError
- url = self.url_joiner(self.api_root, "progress/category/imports/{id}".format(id=import_id))
+ url = self.url_joiner(self.api_root, f"progress/category/imports/{import_id}")
return self.get(url)
# Insight Config API
@@ -654,7 +654,7 @@ def update_issue_insight_field(self, key, field_id, insight_keys, add=False):
}
}
data = {"fields": {field_id: [{"key": i} for i in insight_keys]}}
- return self.put("{base_url}/{key}".format(base_url=base_url, key=key), data=data)
+ return self.put(f"{base_url}/{key}", data=data)
def check_duplicate_attribute_values(self):
"""
diff --git a/atlassian/jira.py b/atlassian/jira.py
index d49846139..079b19511 100644
--- a/atlassian/jira.py
+++ b/atlassian/jira.py
@@ -178,7 +178,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 = f"{base_url}/{property_id}"
data = {"id": property_id, "value": value}
return self.put(url, data=data)
@@ -212,7 +212,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 = f"{base_url}/{role_key}"
return self.get(url) or {}
"""
@@ -239,7 +239,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 = f"{base_url}/{attachment_id}"
return self.get(url)
def download_issue_attachments(self, issue, path=None):
@@ -265,13 +265,14 @@ def download_attachments_from_issue(self, issue, path=None, cloud=True):
path = os.getcwd()
issue_id = self.issue(issue, fields="id")["id"]
if cloud:
- url = self.url + "/secure/issueAttachments/{}.zip".format(issue_id)
+ url = self.url + f"/secure/issueAttachments/{issue_id}.zip"
else:
- url = self.url + "/secure/attachmentzip/{}.zip".format(issue_id)
+ url = self.url + f"/secure/attachmentzip/{issue_id}.zip"
response = self._session.get(url)
- attachment_name = "{}_attachments.zip".format(issue_id)
+ attachment_name = f"{issue_id}_attachments.zip"
file_path = os.path.join(path, attachment_name)
- # if Jira issue doesn't have any attachments _session.get request response will return 22 bytes of PKzip format
+ # if Jira issue doesn't have any attachments _session.get
+ # request response will return 22 bytes of PKzip format
file_size = sum(len(chunk) for chunk in response.iter_content(8196))
if file_size == 22:
return "No attachments found on the Jira issue"
@@ -297,7 +298,7 @@ def get_attachment_content(self, attachment_id):
:return: content as bytes
"""
base_url = self.resource_url("attachment")
- url = "{base_url}/content/{attachment_id}".format(base_url=base_url, attachment_id=attachment_id)
+ url = f"{base_url}/content/{attachment_id}"
return self.get(url, not_json_response=True)
def remove_attachment(self, attachment_id):
@@ -307,7 +308,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 = f"{base_url}/{attachment_id}"
return self.delete(url)
def get_attachment_meta(self):
@@ -326,7 +327,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 = f"{base_url}/{attachment_id}/expand/human"
return self.get(url)
def get_attachment_expand_raw(self, attachment_id):
@@ -336,7 +337,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 = f"{base_url}/{attachment_id}/expand/raw"
return self.get(url)
"""
@@ -403,7 +404,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 = f"{base_url}/{avatar_type}/system"
return self.get(url)
"""
@@ -422,7 +423,7 @@ def delete_cluster_node(self, node_id):
:return:
"""
base_url = self.resource_url("cluster/node")
- url = "{base_url}/{node_id}".format(base_url=base_url, node_id=node_id)
+ url = f"{base_url}/{node_id}"
return self.delete(url)
def set_node_to_offline(self, node_id):
@@ -432,7 +433,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 = f"{base_url}/{node_id}/offline"
return self.put(url)
def get_cluster_alive_nodes(self):
@@ -448,7 +449,7 @@ def request_current_index_from_node(self, node_id):
:return:
"""
base_url = self.resource_url("cluster/index-snapshot")
- url = "{base_url}/{node_id}".format(base_url=base_url, node_id=node_id)
+ url = f"{base_url}/{node_id}"
return self.put(url)
"""
@@ -472,7 +473,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 = f"/rest/troubleshooting/latest/support-zip/status/cluster/{cluster_task_id}"
return self.get(url)
def download_support_zip(self, file_name):
@@ -481,7 +482,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 = f"/rest/troubleshooting/latest/support-zip/download/{file_name}"
return self.get(url, advanced_mode=True).content
"""
@@ -502,7 +503,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 = f"{base_url}/{issue_id}/comment"
return self.get(url)
def issues_get_comments_by_id(self, *args):
@@ -516,7 +517,7 @@ def issues_get_comments_by_id(self, *args):
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)
+ url = f"{base_url}/list"
return self.post(url, data=data)
def issue_get_comment(self, issue_id, comment_id):
@@ -528,9 +529,7 @@ def issue_get_comment(self, issue_id, comment_id):
:return:
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_id}/comment/{comment_id}".format(
- base_url=base_url, issue_id=issue_id, comment_id=comment_id
- )
+ url = f"{base_url}/{issue_id}/comment/{comment_id}"
return self.get(url)
"""
@@ -545,7 +544,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 = f"{base_url}/{comment_id}/properties"
return self.get(url)
def get_comment_property(self, comment_id, property_key):
@@ -556,9 +555,7 @@ def get_comment_property(self, comment_id, property_key):
:return:
"""
base_url = self.resource_url("comment")
- url = "{base_url}/{commentId}/properties/{propertyKey}".format(
- base_url=base_url, commentId=comment_id, propertyKey=property_key
- )
+ url = f"{base_url}/{comment_id}/properties/{property_key}"
return self.get(url)
def set_comment_property(self, comment_id, property_key, value_property):
@@ -570,9 +567,7 @@ def set_comment_property(self, comment_id, property_key, value_property):
:return:
"""
base_url = self.resource_url("comment")
- url = "{base_url}/{commentId}/properties/{propertyKey}".format(
- base_url=base_url, commentId=comment_id, propertyKey=property_key
- )
+ url = f"{base_url}/{comment_id}/properties/{property_key}"
data = {"value": value_property}
return self.put(url, data=data)
@@ -584,9 +579,7 @@ def delete_comment_property(self, comment_id, property_key):
:return:
"""
base_url = self.resource_url("comment")
- url = "{base_url}/{commentId}/properties/{propertyKey}".format(
- base_url=base_url, commentId=comment_id, propertyKey=property_key
- )
+ url = f"{base_url}/{comment_id}/properties/{property_key}"
return self.delete(url)
"""
@@ -596,7 +589,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(f"{base_url}/{component_id}")
def get_component_related_issues(self, component_id):
"""
@@ -605,30 +598,30 @@ 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 = f"{base_url}/{component_id}/relatedIssueCounts"
return self.get(url)
def create_component(self, component):
log.info('Creating component "%s"', component["name"])
base_url = self.resource_url("component")
- url = "{base_url}/".format(base_url=base_url)
+ url = f"{base_url}/"
return self.post(url, data=component)
def update_component(self, component, component_id):
base_url = self.resource_url("component")
- url = "{base_url}/{component_id}".format(base_url=base_url, component_id=component_id)
+ url = f"{base_url}/{component_id}"
return self.put(url, data=component)
def delete_component(self, component_id):
log.info('Deleting component "%s"', 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(f"{base_url}/{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),
+ f"{base_url}/{component_id}",
data=data,
)
@@ -660,7 +653,7 @@ def get_custom_field_option(self, option_id):
:return:
"""
base_url = self.resource_url("customFieldOption")
- url = "{base_url}/{id}".format(base_url=base_url, id=option_id)
+ url = f"{base_url}/{option_id}"
return self.get(url)
def get_custom_fields(self, search=None, start=1, limit=50):
@@ -719,7 +712,7 @@ def get_custom_field_option_context(self, field_id, context_id):
Reference: https://developer.atlassian.com/cloud/jira/platform/rest/v2/api-group-issue-custom-field-options/#api-rest-api-2-field-fieldid-context-contextid-option-get
"""
url = self.resource_url(
- "field/{field_id}/context/{context_id}/option".format(field_id=field_id, context_id=context_id),
+ f"field/{field_id}/context/{context_id}/option",
api_version=2,
)
return self.get(url)
@@ -740,7 +733,7 @@ def add_custom_field_option(self, field_id, context_id, options):
data["options"].append({"disabled": "false", "value": i})
url = self.resource_url(
- "field/{field_id}/context/{context_id}/option".format(field_id=field_id, context_id=context_id),
+ f"field/{field_id}/context/{context_id}/option",
api_version=2,
)
return self.post(url, data=data)
@@ -782,7 +775,7 @@ def get_dashboard(self, dashboard_id):
:param dashboard_id: Dashboard ID Int
:return:
"""
- url = self.resource_url("dashboard/{dashboard_id}".format(dashboard_id=dashboard_id))
+ url = self.resource_url(f"dashboard/{dashboard_id}")
return self.get(url)
"""
@@ -824,7 +817,7 @@ def edit_filter(self, filter_id, name, jql=None, description=None, favourite=Non
if favourite:
data["favourite"] = favourite
base_url = self.resource_url("filter")
- url = "{base_url}/{id}".format(base_url=base_url, id=filter_id)
+ url = f"{base_url}/{filter_id}"
return self.put(url, data=data)
def get_filter(self, filter_id):
@@ -834,7 +827,7 @@ def get_filter(self, filter_id):
:return:
"""
base_url = self.resource_url("filter")
- url = "{base_url}/{id}".format(base_url=base_url, id=filter_id)
+ url = f"{base_url}/{filter_id}"
return self.get(url)
def update_filter(self, filter_id, jql, **kwargs):
@@ -846,11 +839,11 @@ def update_filter(self, filter_id, jql, **kwargs):
"""
allowed_fields = ("name", "description", "favourite")
data = {"jql": jql}
- for k, v in kwargs.items():
+ for k, v in list(kwargs.items()):
if k in allowed_fields:
data.update({k: v})
base_url = self.resource_url("filter")
- url = "{base_url}/{id}".format(base_url=base_url, id=filter_id)
+ url = f"{base_url}/{filter_id}"
return self.put(url, data=data)
def delete_filter(self, filter_id):
@@ -860,7 +853,7 @@ def delete_filter(self, filter_id):
:return:
"""
base_url = self.resource_url("filter")
- url = "{base_url}/{id}".format(base_url=base_url, id=filter_id)
+ url = f"{base_url}/{filter_id}"
return self.delete(url)
def get_filter_share_permissions(self, filter_id):
@@ -870,7 +863,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 = f"{base_url}/{filter_id}/permission"
return self.get(url)
def add_filter_share_permission(
@@ -897,7 +890,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 = f"{base_url}/{filter_id}/permission"
data = {"type": type}
if project_id:
data["projectId"] = project_id
@@ -921,9 +914,7 @@ def delete_filter_share_permission(self, filter_id, permission_id):
:return:
"""
base_url = self.resource_url("filter")
- url = "{base_url}/{id}/permission/{permission_id}".format(
- base_url=base_url, id=filter_id, permission_id=permission_id
- )
+ url = f"{base_url}/{filter_id}/permission/{permission_id}"
return self.delete(url)
"""
@@ -1090,7 +1081,7 @@ 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 = f"{base_url}/{key}?fields={fields}"
params = {}
if expand:
params["expand"] = expand
@@ -1109,7 +1100,7 @@ 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 = f"{base_url}/{issue_id_or_key}"
params = {}
if fields is not None:
@@ -1136,7 +1127,7 @@ def epic_issues(self, epic, fields="*all", expand=None):
: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)
+ url = f"{base_url}/{epic}/issue?fields={fields}"
params = {}
if expand:
params["expand"] = expand
@@ -1154,9 +1145,9 @@ def bulk_issue(self, issue_list, fields="*all"):
for key in issue_list:
if re.match(jira_issue_regex, key):
matched_issue_keys.append(key)
- jql = "key in ({})".format(", ".join(set(matched_issue_keys)))
+ jql = f"key in ({', '.join(set(matched_issue_keys))})"
query_result = self.jql(jql, fields=fields)
- if "errorMessages" in query_result.keys():
+ if "errorMessages" in list(query_result.keys()):
for message in query_result["errorMessages"]:
for key in issue_list:
if key in message:
@@ -1180,7 +1171,7 @@ 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(f"issue/createmeta?projectKeys={project}")
return self.get(url, params=params)
def issue_createmeta_issuetypes(self, project, start=None, limit=None):
@@ -1193,7 +1184,7 @@ def issue_createmeta_issuetypes(self, project, start=None, limit=None):
:param limit: default: 50
:return:
"""
- url = self.resource_url("issue/createmeta/{}/issuetypes".format(project))
+ url = self.resource_url(f"issue/createmeta/{project}/issuetypes")
params = {}
if start:
params["startAt"] = start
@@ -1213,7 +1204,7 @@ def issue_createmeta_fieldtypes(self, project, issue_type_id, start=None, limit=
:param limit: default: 50
:return:
"""
- url = self.resource_url("issue/createmeta/{}/issuetypes/{}".format(project, issue_type_id))
+ url = self.resource_url(f"issue/createmeta/{project}/issuetypes/{issue_type_id}")
params = {}
if start:
params["startAt"] = start
@@ -1223,7 +1214,7 @@ def issue_createmeta_fieldtypes(self, project, issue_type_id, start=None, limit=
def issue_editmeta(self, key):
base_url = self.resource_url("issue")
- url = "{}/{}/editmeta".format(base_url, key)
+ url = f"{base_url}/{key}/editmeta"
return self.get(url)
def get_issue_changelog(self, issue_key, start=None, limit=None):
@@ -1242,10 +1233,10 @@ def get_issue_changelog(self, issue_key, start=None, limit=None):
params["maxResults"] = limit
if self.cloud:
- url = "{base_url}/{issue_key}/changelog".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}/changelog"
return self.get(url, params=params)
else:
- url = "{base_url}/{issue_key}?expand=changelog".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}?expand=changelog"
return self._get_response_content(url, fields=[("changelog", params)])
def issue_add_json_worklog(self, key, worklog):
@@ -1256,7 +1247,7 @@ def issue_add_json_worklog(self, key, worklog):
:return:
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{key}/worklog".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}/worklog"
return self.post(url, data=worklog)
def issue_worklog(self, key, started, time_sec, comment=None):
@@ -1280,7 +1271,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 = f"{base_url}/{issue_id_or_key}/worklog"
return self.get(url)
@@ -1296,7 +1287,7 @@ def issue_archive(self, issue_id_or_key, notify_users=None):
if notify_users is not None:
params["notifyUsers"] = notify_users
base_url = self.resource_url("issue")
- url = "{base_url}/{issueIdOrKey}/archive".format(base_url=base_url, issueIdOrKey=issue_id_or_key)
+ url = f"{base_url}/{issue_id_or_key}/archive"
return self.put(url, params=params)
def issue_restore(self, issue_id_or_key):
@@ -1306,17 +1297,17 @@ 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 = f"{base_url}/{issue_id_or_key}/restore"
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(f"{base_url}/{key}?fields={field}")
return issue["fields"][field]
def issue_fields(self, key):
base_url = self.resource_url("issue")
- issue = self.get("{base_url}/{key}".format(base_url=base_url, key=key))
+ issue = self.get(f"{base_url}/{key}")
return issue["fields"]
def update_issue_field(self, key, fields="*all", notify_users=True):
@@ -1332,7 +1323,7 @@ def update_issue_field(self, key, fields="*all", notify_users=True):
base_url = self.resource_url("issue")
params = {"notifyUsers": "true" if notify_users else "false"}
return self.put(
- "{base_url}/{key}".format(base_url=base_url, key=key),
+ f"{base_url}/{key}",
data={"fields": fields},
params=params,
)
@@ -1347,7 +1338,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),
+ f"{base_url}/{key}",
data={"fields": fields},
)
except Exception as e:
@@ -1374,10 +1365,10 @@ def issue_field_value_append(self, issue_id_or_key, field, value, notify_users=T
else:
new_value = [value]
- fields = {"{}".format(field): new_value}
+ fields = {f"{field}": new_value}
return self.put(
- "{base_url}/{key}".format(base_url=base_url, key=issue_id_or_key),
+ f"{base_url}/{issue_id_or_key}",
data={"fields": fields},
params=params,
)
@@ -1389,7 +1380,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 = f"{base_url}/{issue_key}?fields=labels"
if self.advanced_mode:
return self.get(url)
return self._get_response_content(url, fields=[("fields",), ("labels",)])
@@ -1400,7 +1391,7 @@ def update_issue(self, issue_key, update):
:param update: the update to make
:return: True if successful, False if not
"""
- endpoint = "/rest/api/2/issue/{issue_key}".format(issue_key=issue_key)
+ endpoint = f"/rest/api/2/issue/{issue_key}"
return self.put(endpoint, data=update)
def label_issue(self, issue_key, labels):
@@ -1438,7 +1429,7 @@ def add_attachment_object(self, issue_key, attachment):
"""
log.info("Adding attachment: %s", attachment)
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/attachments".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}/attachments"
if attachment:
files = {"file": attachment}
else:
@@ -1478,7 +1469,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 = f"{base_url}/{issue_id_or_key}"
params = {}
if delete_subtasks is True:
@@ -1494,7 +1485,7 @@ def delete_issue(self, issue_id_or_key, delete_subtasks=True):
def issue_update(self, issue_key, fields):
log.info('Updating issue "%s" with "%s"', issue_key, fields)
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}"
return self.put(url, data={"fields": fields})
def edit_issue(self, issue_id_or_key, fields, notify_users=True):
@@ -1509,7 +1500,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 = f"{base_url}/{issue_id_or_key}"
params = {}
data = {"update": fields}
@@ -1530,7 +1521,7 @@ def issue_add_watcher(self, issue_key, 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),
+ f"{base_url}/{issue_key}/watchers",
data=data,
)
@@ -1545,7 +1536,7 @@ 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),
+ f"{base_url}/{issue_key}/watchers",
params=params,
)
@@ -1556,7 +1547,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(f"{base_url}/{issue_key}/watchers")
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.
@@ -1568,7 +1559,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 = f"{base_url}/{issue}/assignee"
if self.cloud:
data = {"accountId": account_id}
else:
@@ -1656,7 +1647,7 @@ 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 = f"{base_url}/{issue_key}/comment"
data = {"body": comment}
if visibility:
data["visibility"] = visibility
@@ -1673,9 +1664,7 @@ def issue_edit_comment(self, issue_key, comment_id, comment, visibility=None, no
:return:
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/comment/{comment_id}".format(
- base_url=base_url, issue_key=issue_key, comment_id=comment_id
- )
+ url = f"{base_url}/{issue_key}/comment/{comment_id}"
data = {"body": comment}
if visibility:
data["visibility"] = visibility
@@ -1736,7 +1725,7 @@ 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 = f"{base_url}/{issue_key}/remotelink"
params = {}
if global_id:
params["globalId"] = global_id
@@ -1767,7 +1756,7 @@ def get_issue_tree_recursive(self, issue_key, tree=None, depth=None):
if issue_link.get("inwardIssue") is not None:
parent_issue_key = issue["key"]
if not [
- x for x in tree if issue_link["inwardIssue"]["key"] in x.keys()
+ x for x in tree if issue_link["inwardIssue"]["key"] in list(x.keys())
]: # condition to avoid infinite recursion
tree.append({parent_issue_key: issue_link["inwardIssue"]["key"]})
self.get_issue_tree_recursive(
@@ -1776,7 +1765,7 @@ def get_issue_tree_recursive(self, issue_key, tree=None, depth=None):
for subtask in subtasks:
if subtask.get("key") is not None:
parent_issue_key = issue["key"]
- if not [x for x in tree if subtask["key"] in x.keys()]:
+ if not [x for x in tree if subtask["key"] in list(x.keys())]:
tree.append({parent_issue_key: subtask["key"]})
self.get_issue_tree_recursive(subtask["key"], tree, depth + 1)
return tree
@@ -1806,7 +1795,7 @@ def create_or_update_issue_remote_links(
:param application: dict, OPTIONAL: Application description
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/remotelink".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}/remotelink"
data = {"object": {"url": link_url, "title": title, "status": {"resolved": status_resolved}}}
if global_id:
data["globalId"] = global_id
@@ -1825,9 +1814,7 @@ def create_or_update_issue_remote_links(
def get_issue_remote_link_by_id(self, issue_key, link_id):
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/remotelink/{link_id}".format(
- base_url=base_url, issue_key=issue_key, link_id=link_id
- )
+ url = f"{base_url}/{issue_key}/remotelink/{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):
@@ -1847,9 +1834,7 @@ def update_issue_remote_link_by_id(self, issue_key, link_id, url, title, global_
if relationship:
data["relationship"] = relationship
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/remotelink/{link_id}".format(
- base_url=base_url, issue_key=issue_key, link_id=link_id
- )
+ url = f"{base_url}/{issue_key}/remotelink/{link_id}"
return self.put(url, data=data)
def delete_issue_remote_link_by_id(self, issue_key, link_id):
@@ -1859,9 +1844,7 @@ def delete_issue_remote_link_by_id(self, issue_key, link_id):
:param link_id: str
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/remotelink/{link_id}".format(
- base_url=base_url, issue_key=issue_key, link_id=link_id
- )
+ url = f"{base_url}/{issue_key}/remotelink/{link_id}"
return self.delete(url)
def get_issue_transitions(self, issue_key):
@@ -1902,7 +1885,7 @@ 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)
+ url = f"{base_url}/{issue_key}/transitions"
transition_id = self.get_transition_id_to_status_name(issue_key, status_name)
data = {"transition": {"id": transition_id}}
if fields is not None:
@@ -1932,18 +1915,18 @@ 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 = f"{base_url}/{issue_key}/transitions"
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)
+ url = f"{base_url}/{issue_key}?fields=status"
fields = [("fields",), ("status",), ("name",)]
return self._get_response_content(url, fields=fields) 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 = f"{base_url}/{issue_key}?fields=status"
fields = [("fields",), ("status",), ("id",)]
return self._get_response_content(url, fields=fields)
@@ -1960,7 +1943,7 @@ 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 = f"{base_url}/{issue_key}/transitions"
params = {}
if transition_id:
params["transitionId"] = transition_id
@@ -1976,28 +1959,22 @@ def get_issue_property_keys(self, issue_key):
:return:
"""
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/properties".format(base_url=base_url, issue_key=issue_key)
+ url = f"{base_url}/{issue_key}/properties"
return self.get(url)
def set_issue_property(self, issue_key, property_key, data):
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/properties/{propertyKey}".format(
- base_url=base_url, issue_key=issue_key, propertyKey=property_key
- )
+ url = f"{base_url}/{issue_key}/properties/{property_key}"
return self.put(url, data=data)
def get_issue_property(self, issue_key, property_key):
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/properties/{propertyKey}".format(
- base_url=base_url, issue_key=issue_key, propertyKey=property_key
- )
+ url = f"{base_url}/{issue_key}/properties/{property_key}"
return self.get(url)
def delete_issue_property(self, issue_key, property_key):
base_url = self.resource_url("issue")
- url = "{base_url}/{issue_key}/properties/{propertyKey}".format(
- base_url=base_url, issue_key=issue_key, propertyKey=property_key
- )
+ url = f"{base_url}/{issue_key}/properties/{property_key}"
return self.delete(url)
def get_updated_worklogs(self, since, expand=None):
@@ -2121,7 +2098,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 = f"{base_url}?username={username}"
return self.put(url, data=data)
def user_update_username(self, old_username, new_username):
@@ -2182,9 +2159,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 = f"{base_url}?accountId={username}"
elif account_id or self.cloud:
- url = "{base_url}?accountId={account_id}".format(base_url=base_url, account_id=account_id)
+ url = f"{base_url}?accountId={account_id}"
return self.get(url)
def user_property(self, username=None, account_id=None, key_property=None):
@@ -2202,7 +2179,7 @@ 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),
+ f"{base_url}/{key_property}",
params=params,
)
@@ -2224,15 +2201,9 @@ def user_set_property(
base_url = self.resource_url("user/properties")
url = ""
if username or not self.cloud:
- url = "{base_url}/{key_property}?username={username}".format(
- base_url=base_url, key_property=key_property, username=username
- )
+ url = f"{base_url}/{key_property}?username={username}"
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,
- )
+ url = f"{base_url}/{key_property}?accountId={account_id}"
return self.put(url, data=value_property)
@@ -2245,7 +2216,7 @@ 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 = f"{base_url}/{key_property}"
params = {}
if username or not self.cloud:
params = {"username": username}
@@ -2287,7 +2258,7 @@ def user_disable_throw_rest_endpoint(
param="userName",
):
"""The disable method throw own rest endpoint"""
- url = "{}?{}={}".format(url, param, username)
+ url = f"{url}?{param}={username}"
return self.get(path=url)
def user_get_websudo(self):
@@ -2501,7 +2472,7 @@ 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),
+ f"rest/project-templates/1.0/createshared/{project_id}",
json=json,
)
@@ -2512,7 +2483,7 @@ def delete_project(self, key):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{key}".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}"
return self.delete(url)
def archive_project(self, key):
@@ -2521,7 +2492,7 @@ def archive_project(self, key):
:param key:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{key}/archive".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}/archive"
return self.put(url)
def project(self, key, expand=None):
@@ -2535,7 +2506,7 @@ def project(self, key, expand=None):
if expand:
params["expand"] = expand
base_url = self.resource_url("project")
- url = "{base_url}/{key}".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}"
return self.get(url, params=params)
def get_project(self, key, expand=None):
@@ -2555,7 +2526,7 @@ def get_project_components(self, key):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{key}/components".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}/components"
return self.get(url)
def get_project_versions(self, key, expand=None):
@@ -2569,7 +2540,7 @@ def get_project_versions(self, key, expand=None):
if expand is not None:
params["expand"] = expand
base_url = self.resource_url("project")
- url = "{base_url}/{key}/versions".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}/versions"
return self.get(url, params=params)
def get_project_versions_paginated(
@@ -2614,7 +2585,7 @@ def get_project_versions_paginated(
if status in ["released", "unreleased", "archived"]:
params["status"] = status
base_url = self.resource_url("project")
- url = "{base_url}/{key}/version".format(base_url=base_url, key=key)
+ url = f"{base_url}/{key}/version"
return self.get(url, params=params)
def get_version(self, version):
@@ -2623,7 +2594,7 @@ def get_version(self, version):
:param version: The id of the version to return
"""
base_url = self.resource_url("version")
- url = "{base_url}/{version}".format(base_url=base_url, version=version)
+ url = f"{base_url}/{version}"
return self.get(url)
def add_version(
@@ -2667,7 +2638,7 @@ def delete_version(self, version, moved_fixed=None, move_affected=None):
"moveFixIssuesTo": moved_fixed,
"moveAffectedIssuesTo": move_affected,
}
- return self.delete("rest/api/2/version/{}".format(version), data=payload)
+ return self.delete(f"rest/api/2/version/{version}", data=payload)
def update_version(
self,
@@ -2698,7 +2669,7 @@ def update_version(
"releaseDate": release_date,
}
base_url = self.resource_url("version")
- url = "{base_url}/{version}".format(base_url=base_url, version=version)
+ url = f"{base_url}/{version}"
return self.put(url, data=payload)
def move_version(self, version, after=None, position=None):
@@ -2709,7 +2680,7 @@ def move_version(self, version, after=None, position=None):
:param position: A position to move the version to
"""
base_url = self.resource_url("version")
- url = "{base_url}/{version}/move".format(base_url=base_url, version=version)
+ url = f"{base_url}/{version}/move"
if after is None and position is None:
raise ValueError("Must provide one of `after` or `position`")
if after:
@@ -2719,7 +2690,7 @@ def move_version(self, version, after=None, position=None):
position = position.lower().capitalize()
if position not in ["Earlier", "Later", "First", "Last"]:
raise ValueError(
- "position must be one of Earlier, Later, First, or Last. Got {pos}".format(pos=position)
+ f"position must be one of Earlier, Later, First, or Last. Got {position}"
)
return self.post(url, data={"position": position})
diff --git a/atlassian/marketplace.py b/atlassian/marketplace.py
index a5e2d4796..dfa776b85 100644
--- a/atlassian/marketplace.py
+++ b/atlassian/marketplace.py
@@ -65,7 +65,7 @@ def get_app_versions(self, add_on_key, application=None):
params = {}
if application:
params["application"] = application
- url = "rest/2/addons/{addonKey}/versions".format(addonKey=add_on_key)
+ url = f"rest/2/addons/{add_on_key}/versions"
return self.get(url, params=params)
def get_app_reviews(self, add_on_key, sort=None):
@@ -77,7 +77,7 @@ def get_app_reviews(self, add_on_key, sort=None):
Valid values: helpful, recent
:return:
"""
- url = "rest/2/addons/{addonKey}/reviews".format(addonKey=add_on_key)
+ url = f"rest/2/addons/{add_on_key}/reviews"
params = {}
if sort:
params["sort"] = sort
diff --git a/atlassian/portfolio.py b/atlassian/portfolio.py
index 27614e8f1..c12f1f129 100644
--- a/atlassian/portfolio.py
+++ b/atlassian/portfolio.py
@@ -25,15 +25,15 @@ def get_epic(self, epic):
}
def get_plan(self):
- url = "rest/roadmap/1.0/plans/{0}.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}.json"
return self.get(url)
def get_stages(self):
- url = "rest/roadmap/1.0/plans/{0}/stages.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/stages.json"
return self.get(url)
def get_teams(self):
- url = "rest/roadmap/1.0/plans/{0}/teams.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/teams.json"
return self.get(url)
def get_team_name(self, team_id):
@@ -41,38 +41,38 @@ def get_team_name(self, team_id):
return [team["title"] for team in all_teams if team["id"] == str(team_id)][0]
def get_config(self):
- url = "rest/roadmap/1.0/plans/{0}/config.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/config.json"
return self.get(url)
def get_persons(self):
- url = "rest/roadmap/1.0/plans/{0}/persons.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/persons.json"
return self.get(url)
def get_streams(self):
- url = "rest/roadmap/1.0/plans/{0}/streams.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/streams.json"
return self.get(url)
def get_releases(self):
return self.get_streams()
def get_themes(self):
- url = "rest/roadmap/1.0/plans/{0}/themes.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/themes.json"
return self.get(url)
def get_state(self):
- url = "rest/roadmap/1.0/scheduling/{0}/state.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/scheduling/{self.plan_id}/state.json"
return self.get(url)
def get_filter(self, limit=500):
- url = "rest/roadmap/1.0/plans/{0}/workitems/filter.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/{self.plan_id}/workitems/filter.json"
return self.post(url, data={"limit": limit})
def get_filters(self, query_string):
- url = "rest/roadmap/1.0/system/filters.json?queryString={0}".format(query_string)
+ url = f"rest/roadmap/1.0/system/filters.json?queryString={query_string}"
return self.get(url)
def get_dependencies(self, workitem_id, plan_version):
- url = "rest/roadmap/1.0/workitems/{0}/dependencies.json?planVersion={1}".format(workitem_id, plan_version)
+ url = f"rest/roadmap/1.0/workitems/{workitem_id}/dependencies.json?planVersion={plan_version}"
return self.get(url)
def get_stage_name(self, stage_id):
@@ -83,7 +83,7 @@ def get_estimates_dict(self, estimates):
return {self.get_stage_name(stage["targetId"]): stage["value"] for stage in estimates["stages"]}
def import_workitem(self, data):
- url = "rest/roadmap/1.0/plans/bulk/{0}/workitems.json".format(self.plan_id)
+ url = f"rest/roadmap/1.0/plans/bulk/{self.plan_id}/workitems.json"
return self.post(url, data=data)
def get_jql_issues(
diff --git a/atlassian/rest_client.py b/atlassian/rest_client.py
index 98f39716c..6086d757d 100644
--- a/atlassian/rest_client.py
+++ b/atlassian/rest_client.py
@@ -187,7 +187,7 @@ def _create_basic_session(self, username, password):
self._session.auth = (username, password)
def _create_token_session(self, token):
- self._update_header("Authorization", "Bearer {token}".format(token=token.strip()))
+ self._update_header("Authorization", f"Bearer {token.strip()}")
def _create_kerberos_session(self, _):
from requests_kerberos import OPTIONAL, HTTPKerberosAuth
@@ -303,8 +303,8 @@ def log_curl_debug(self, method, url, data=None, headers=None, level=logging.DEB
headers = headers or self.default_headers
message = "curl --silent -X {method} -H {headers} {data} '{url}'".format(
method=method,
- headers=" -H ".join(["'{0}: {1}'".format(key, value) for key, value in headers.items()]),
- data="" if not data else "--data '{0}'".format(dumps(data)),
+ headers=" -H ".join([f"'{key}: {value}'" for key, value in list(headers.items())]),
+ data="" if not data else f"--data '{dumps(data)}'",
url=url,
)
log.log(level=level, msg=message)
@@ -658,12 +658,12 @@ def raise_for_status(self, response):
try:
j = response.json()
if self.url == "https://api.atlassian.com":
- error_msg = "\n".join(["{}: {}".format(k, v) for k, v in j.items()])
+ error_msg = "\n".join([f"{k}: {v}" for k, v in list(j.items())])
else:
error_msg_list = j.get("errorMessages", list())
errors = j.get("errors", dict())
if isinstance(errors, dict) and "message" not in errors:
- error_msg_list.extend(errors.values())
+ error_msg_list.extend(list(errors.values()))
elif isinstance(errors, dict) and "message" in errors:
error_msg_list.append(errors.get("message", ""))
elif isinstance(errors, list):
diff --git a/atlassian/service_desk.py b/atlassian/service_desk.py
index fe040bf25..b17795f70 100644
--- a/atlassian/service_desk.py
+++ b/atlassian/service_desk.py
@@ -44,7 +44,7 @@ def get_service_desk_by_id(self, service_desk_id):
"""
return self.get(
- "rest/servicedeskapi/servicedesk/{}".format(service_desk_id),
+ f"rest/servicedeskapi/servicedesk/{service_desk_id}",
headers=self.experimental_headers,
)
@@ -74,7 +74,7 @@ def get_customer_request(self, issue_id_or_key):
"""
return self.get(
- "rest/servicedeskapi/request/{}".format(issue_id_or_key),
+ f"rest/servicedeskapi/request/{issue_id_or_key}",
headers=self.experimental_headers,
)
@@ -133,7 +133,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),
+ f"rest/servicedeskapi/request/{issue_id_or_key}/status",
headers=self.experimental_headers,
)
if self.advanced_mode:
@@ -150,7 +150,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 = f"rest/servicedeskapi/request/{issue_id_or_key}/transition"
return self.get(url, headers=self.experimental_headers)
@@ -163,7 +163,7 @@ def get_request_types(self, service_desk_id):
"""
return self.get(
- "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id),
+ f"rest/servicedeskapi/servicedesk/{service_desk_id}/requesttype",
headers=self.experimental_headers,
)
@@ -177,7 +177,7 @@ 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 = f"rest/servicedeskapi/request/{issue_id_or_key}/participant"
params = {}
if start is not None:
params["start"] = int(start)
@@ -199,7 +199,7 @@ def add_request_participants(self, issue_id_or_key, users_list=None, account_lis
:param account_list: list
:return:
"""
- url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/participant"
data = {}
if users_list is not None:
data["usernames"] = users_list
@@ -218,7 +218,7 @@ def remove_request_participants(self, issue_id_or_key, users_list=None, account_
:param account_list: list
:return:
"""
- url = "rest/servicedeskapi/request/{}/participant".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/participant"
data = {}
if users_list is not None:
data["usernames"] = users_list
@@ -240,7 +240,7 @@ def perform_transition(self, issue_id_or_key, transition_id, comment=None):
"""
log.info("Performing transition for issue: " + issue_id_or_key)
data = {"id": transition_id, "additionalComment": {"body": comment}}
- url = "rest/servicedeskapi/request/{}/transition".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/transition"
return self.post(url, headers=self.experimental_headers, data=data)
@@ -256,7 +256,7 @@ def create_request_comment(self, issue_id_or_key, body, public=True):
"""
log.info("Creating comment...")
data = {"body": body, "public": public}
- url = "rest/servicedeskapi/request/{}/comment".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/comment"
return self.post(path=url, data=data, headers=self.experimental_headers)
@@ -271,7 +271,7 @@ def get_request_comments(self, issue_id_or_key, start=0, limit=50, public=True,
:param internal: OPTIONAL: bool
:return: Issue comments
"""
- url = "rest/servicedeskapi/request/{}/comment".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/comment"
params = {}
if start is not None:
params["start"] = int(start)
@@ -287,11 +287,6 @@ def get_request_comments(self, issue_id_or_key, start=0, limit=50, public=True,
return response
return (response or {}).get("values")
- # return self.get(
- # "rest/servicedeskapi/request/{}/comment".format(issue_id_or_key),
- # headers=self.experimental_headers,
- # )
-
def get_request_comment_by_id(self, issue_id_or_key, comment_id):
"""
Get single comment by ID
@@ -302,7 +297,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),
+ f"rest/servicedeskapi/request/{issue_id_or_key}/comment/{comment_id}",
headers=self.experimental_headers,
)
@@ -320,7 +315,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 = f"rest/servicedeskapi/servicedesk/{service_desk_id}/organization"
params = {}
if start is not None:
params["start"] = int(start)
@@ -345,7 +340,7 @@ def get_organization(self, organization_id):
:param organization_id: str
:return: Organization
"""
- url = "rest/servicedeskapi/organization/{}".format(organization_id)
+ url = f"rest/servicedeskapi/organization/{organization_id}"
return self.get(url, headers=self.experimental_headers)
@@ -358,7 +353,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 = f"rest/servicedeskapi/organization/{organization_id}/user"
params = {}
if start is not None:
params["start"] = int(start)
@@ -390,7 +385,7 @@ def add_organization(self, service_desk_id, organization_id):
:return:
"""
log.info("Adding organization...")
- url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id)
+ url = f"rest/servicedeskapi/servicedesk/{service_desk_id}/organization"
data = {"organizationId": organization_id}
return self.post(url, headers=self.experimental_headers, data=data)
@@ -404,7 +399,7 @@ def remove_organization(self, service_desk_id, organization_id):
:return:
"""
log.info("Removing organization...")
- url = "rest/servicedeskapi/servicedesk/{}/organization".format(service_desk_id)
+ url = f"rest/servicedeskapi/servicedesk/{service_desk_id}/organization"
data = {"organizationId": organization_id}
return self.delete(url, headers=self.experimental_headers, data=data)
@@ -417,7 +412,7 @@ def delete_organization(self, organization_id):
:return:
"""
log.info("Deleting organization: %s ", organization_id)
- url = "rest/servicedeskapi/organization/{}".format(organization_id)
+ url = f"rest/servicedeskapi/organization/{organization_id}"
return self.delete(url, headers=self.experimental_headers)
@@ -433,7 +428,7 @@ def add_users_to_organization(self, organization_id, users_list=[], account_list
:return:
"""
log.info("Adding users: %s ", str(users_list))
- url = "rest/servicedeskapi/organization/{}/user".format(organization_id)
+ url = f"rest/servicedeskapi/organization/{organization_id}/user"
data = {"usernames": users_list, "accountIds": account_list}
return self.post(url, headers=self.experimental_headers, data=data)
@@ -450,7 +445,7 @@ def remove_users_from_organization(self, organization_id, users_list=[], account
:return:
"""
log.info("Removing users: %s", str(users_list))
- url = "rest/servicedeskapi/organization/{}/user".format(organization_id)
+ url = f"rest/servicedeskapi/organization/{organization_id}/user"
data = {"usernames": users_list, "accountIds": account_list}
return self.delete(url, headers=self.experimental_headers, data=data)
@@ -528,7 +523,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 = f"rest/servicedeskapi/servicedesk/{service_desk_id}/attachTemporaryFile"
# 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
@@ -568,7 +563,7 @@ 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 = f"rest/servicedeskapi/request/{issue_id_or_key}/attachment"
return self.post(url, headers=self.experimental_headers, data=data)
@@ -601,7 +596,7 @@ def get_sla(self, issue_id_or_key, start=0, limit=50):
:param limit: OPTIONAL: int
:return: SLA information
"""
- url = "rest/servicedeskapi/request/{}/sla".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/sla"
params = {}
if start is not None:
params["start"] = int(start)
@@ -622,7 +617,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 = f"rest/servicedeskapi/request/{issue_id_or_key}/sla/{sla_id}"
return self.get(url, headers=self.experimental_headers)
@@ -649,7 +644,7 @@ def get_approvals(self, issue_id_or_key, start=0, limit=50):
:param limit: OPTIONAL: int
:return:
"""
- url = "rest/servicedeskapi/request/{}/approval".format(issue_id_or_key)
+ url = f"rest/servicedeskapi/request/{issue_id_or_key}/approval"
params = {}
if start is not None:
params["start"] = int(start)
@@ -669,7 +664,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 = f"rest/servicedeskapi/request/{issue_id_or_key}/approval/{approval_id}"
return self.get(url, headers=self.experimental_headers)
@@ -682,7 +677,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 = f"rest/servicedeskapi/request/{issue_id_or_key}/approval/{approval_id}"
data = {"decision": decision}
return self.post(url, headers=self.experimental_headers, data=data)
@@ -694,7 +689,7 @@ def get_queue_settings(self, project_key):
:param project_key: str
:return:
"""
- url = "rest/servicedeskapi/queues/{}".format(project_key)
+ url = f"rest/servicedeskapi/queues/{project_key}"
return self.get(url, headers=self.experimental_headers)
@@ -713,7 +708,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 = f"rest/servicedeskapi/servicedesk/{service_desk_id}/customer"
params = {}
if start is not None:
params["start"] = int(start)
@@ -737,7 +732,7 @@ 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)
+ url = f"rest/servicedeskapi/servicedesk/{service_desk_id}/customer"
data = {
"usernames": list_of_usernames,
"accountIds": list_of_accountids,
@@ -758,7 +753,7 @@ 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)
+ url = f"rest/servicedeskapi/servicedesk/{service_desk_id}/customer"
data = {
"usernames": list_of_usernames,
"accountIds": list_of_accountids,
@@ -781,7 +776,7 @@ 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 = f"rest/servicedeskapi/servicedesk/{service_desk_id}/queue"
params = {}
if include_count is not None:
@@ -809,7 +804,7 @@ 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 = f"rest/servicedeskapi/servicedesk/{service_desk_id}/queue/{queue_id}/issue"
params = {}
if start is not None:
@@ -832,7 +827,7 @@ def get_plugin_info(self, plugin_key):
Provide plugin info
:return a json of installed plugins
"""
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.get(url, headers=self.no_check_headers, trailing=True)
def get_plugin_license_info(self, plugin_key):
@@ -840,7 +835,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 = f"rest/plugins/1.0/{plugin_key}-key/license"
return self.get(url, headers=self.no_check_headers, trailing=True)
def upload_plugin(self, plugin_path):
@@ -856,7 +851,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
return self.post(url, files=files, headers=self.no_check_headers)
def delete_plugin(self, plugin_key):
@@ -865,7 +860,7 @@ def delete_plugin(self, plugin_key):
:param plugin_key:
:return:
"""
- url = "rest/plugins/1.0/{}-key".format(plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.delete(url)
def check_plugin_manager_status(self):
@@ -883,7 +878,7 @@ def update_plugin_license(self, plugin_key, raw_license):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key)
+ url = f"/plugins/1.0/{plugin_key}/license"
data = {"rawLicense": raw_license}
return self.put(url, data=data, headers=app_headers)
@@ -911,7 +906,7 @@ def create_request_type(
"helpText": request_help_text,
}
- url = "rest/servicedeskapi/servicedesk/{}/requesttype".format(service_desk_id)
+ url = f"rest/servicedeskapi/servicedesk/{service_desk_id}/requesttype"
return self.post(url, headers=self.experimental_headers, data=data)
def raise_for_status(self, response):
diff --git a/atlassian/statuspage.py b/atlassian/statuspage.py
index 113f41d9a..4bc047322 100644
--- a/atlassian/statuspage.py
+++ b/atlassian/statuspage.py
@@ -154,7 +154,7 @@ def get_page(self, page_id):
-------
any
"""
- url = "v1/pages/{}".format(page_id)
+ url = f"v1/pages/{page_id}"
return self.get(url)
def page_update(self, page_id, page):
@@ -186,7 +186,7 @@ def page_update(self, page_id, page):
-------
any
"""
- url = "v1/pages/{}".format(page_id)
+ url = f"v1/pages/{page_id}"
return self.patch(url, data={"page": page})
def organization_get_users(self, organization_id, page=1, per_page=100):
@@ -214,7 +214,7 @@ def organization_get_users(self, organization_id, page=1, per_page=100):
-------
any
"""
- url = "v1/organizations/{}/users".format(organization_id)
+ url = f"v1/organizations/{organization_id}/users"
return self.get(url, params={"page": page, "per_page": per_page})
def organization_get_user_permissions(self, organization_id, user_id):
@@ -241,7 +241,7 @@ def organization_get_user_permissions(self, organization_id, user_id):
-------
any
"""
- url = "v1/organizations/{}/permissions/{}".format(organization_id, user_id)
+ url = f"v1/organizations/{organization_id}/permissions/{user_id}"
return self.get(url)
def organization_set_user_permissions(self, organization_id, user_id, pages):
@@ -287,7 +287,7 @@ def organization_set_user_permissions(self, organization_id, user_id, pages):
-------
any
"""
- url = "v1/organizations/{}/permissions/{}".format(organization_id, user_id)
+ url = f"v1/organizations/{organization_id}/permissions/{user_id}"
return self.patch(url, data={"pages": pages})
def page_get_embed_config_settings(self, page_id):
@@ -312,7 +312,7 @@ def page_get_embed_config_settings(self, page_id):
-------
any
"""
- url = "v1/pages/{}/status_embed_config".format(page_id)
+ url = f"v1/pages/{page_id}/status_embed_config"
return self.get(url)
def page_update_embed_config_settings(self, page_id, status_embed_config):
@@ -352,7 +352,7 @@ def page_update_embed_config_settings(self, page_id, status_embed_config):
-------
any
"""
- url = "v1/pages/{}/status_embed_config".format(page_id)
+ url = f"v1/pages/{page_id}/status_embed_config"
return self.patch(url, status_embed_config)
def page_access_users_list(self, page_id, email, page=1, per_page=100):
@@ -383,7 +383,7 @@ def page_access_users_list(self, page_id, email, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/page_access_users".format(page_id)
+ url = f"v1/pages/{page_id}/page_access_users"
return self.get(url, params={"email": email, "page": page, "per_page": per_page})
def page_get_access_user(self, page_id, page_access_user_id):
@@ -410,7 +410,7 @@ def page_get_access_user(self, page_id, page_access_user_id):
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}"
return self.get(url)
def page_set_access_user(self, page_id, page_access_user_id, external_login, email, page_access_group_ids):
@@ -447,7 +447,7 @@ def page_set_access_user(self, page_id, page_access_user_id, external_login, ema
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}"
return self.patch(
url, data={"external_login": external_login, "email": email, "page_access_group_ids": page_access_group_ids}
)
@@ -477,7 +477,7 @@ def page_delete_access_user(self, page_id, page_access_user_id):
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}"
return self.delete(url)
def page_get_components_access_user(self, page_id, page_access_user_id, page=1, per_page=100):
@@ -509,7 +509,7 @@ def page_get_components_access_user(self, page_id, page_access_user_id, page=1,
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/components".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/components"
return self.get(url, params={"page": page, "per_page": per_page})
def page_add_components_access_user(self, page_id, page_access_user_id, component_ids):
@@ -539,7 +539,7 @@ def page_add_components_access_user(self, page_id, page_access_user_id, componen
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/components".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/components"
return self.patch(url, data={"component_ids": component_ids})
def page_replace_components_access_user(self, page_id, page_access_user_id, component_ids):
@@ -569,7 +569,7 @@ def page_replace_components_access_user(self, page_id, page_access_user_id, comp
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/components".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/components"
return self.post(url, data={"component_ids": component_ids})
def page_delete_components_access_user(self, page_id, page_access_user_id, component_ids):
@@ -599,7 +599,7 @@ def page_delete_components_access_user(self, page_id, page_access_user_id, compo
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/components".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/components"
return self.delete(url, data={"component_ids": component_ids})
def page_delete_component_access_user(self, page_id, page_access_user_id, component_id):
@@ -629,7 +629,7 @@ def page_delete_component_access_user(self, page_id, page_access_user_id, compon
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/components/{}".format(page_id, page_access_user_id, component_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/components/{component_id}"
return self.delete(url)
def page_get_metrics_access_user(self, page_id, page_access_user_id):
@@ -657,7 +657,7 @@ def page_get_metrics_access_user(self, page_id, page_access_user_id):
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/metrics".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/metrics"
return self.get(url)
def page_add_metrics_access_user(self, page_id, page_access_user_id, metric_ids):
@@ -687,7 +687,7 @@ def page_add_metrics_access_user(self, page_id, page_access_user_id, metric_ids)
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/metrics".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/metrics"
return self.patch(url, data={"metric_ids": metric_ids})
def page_replace_metrics_access_user(self, page_id, page_access_user_id, metric_ids):
@@ -717,7 +717,7 @@ def page_replace_metrics_access_user(self, page_id, page_access_user_id, metric_
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/metrics".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/metrics"
return self.post(url, data={"metric_ids": metric_ids})
def page_delete_metrics_access_user(self, page_id, page_access_user_id, metric_ids):
@@ -747,7 +747,7 @@ def page_delete_metrics_access_user(self, page_id, page_access_user_id, metric_i
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/metrics".format(page_id, page_access_user_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/metrics"
return self.delete(url, data={"metric_ids": metric_ids})
def page_delete_metric_access_user(self, page_id, page_access_user_id, metric_id):
@@ -777,7 +777,7 @@ def page_delete_metric_access_user(self, page_id, page_access_user_id, metric_id
-------
any
"""
- url = "v1/pages/{}/page_access_users/{}/metrics/{}".format(page_id, page_access_user_id, metric_id)
+ url = f"v1/pages/{page_id}/page_access_users/{page_access_user_id}/metrics/{metric_id}"
return self.delete(url)
def page_get_access_groups(self, page_id, page=1, per_page=100):
@@ -806,7 +806,7 @@ def page_get_access_groups(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/page_access_groups".format(page_id)
+ url = f"v1/pages/{page_id}/page_access_groups"
return self.get(url, params={"page": page, "per_page": per_page})
def page_get_access_group(self, page_id, page_access_group_id):
@@ -833,7 +833,7 @@ def page_get_access_group(self, page_id, page_access_group_id):
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}"
return self.get(url)
def page_create_access_group(
@@ -867,7 +867,7 @@ def page_create_access_group(
-------
any
"""
- url = "v1/pages/{}/page_access_groups".format(page_id)
+ url = f"v1/pages/{page_id}/page_access_groups"
return self.post(
url,
data={
@@ -914,7 +914,7 @@ def page_replace_access_group(
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}"
return self.patch(
url,
data={
@@ -953,7 +953,7 @@ def page_delete_access_group(self, page_id, page_access_group_id):
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}"
return self.delete(url)
def page_add_components_to_access_group(self, page_id, page_access_group_id, component_ids):
@@ -982,7 +982,7 @@ def page_add_components_to_access_group(self, page_id, page_access_group_id, com
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}/components".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}/components"
return self.patch(url, data={"component_ids": component_ids})
def page_replace_components_for_access_page(self, page_id, page_access_group_id, component_ids):
@@ -1012,7 +1012,7 @@ def page_replace_components_for_access_page(self, page_id, page_access_group_id,
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}/components".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}/components"
return self.post(url, data={"component_ids": component_ids})
def page_delete_components_for_access_page(self, page_id, page_access_group_id, component_ids):
@@ -1042,7 +1042,7 @@ def page_delete_components_for_access_page(self, page_id, page_access_group_id,
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}/components".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}/components"
return self.delete(url, data={"component_ids": component_ids})
def page_delete_component_for_access_page(self, page_id, page_access_group_id, component_id):
@@ -1072,7 +1072,7 @@ def page_delete_component_for_access_page(self, page_id, page_access_group_id, c
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}/components/{}".format(page_id, page_access_group_id, component_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}/components/{component_id}"
return self.delete(url)
def page_get_components_for_access_group(self, page_id, page_access_group_id, page=1, per_page=100):
@@ -1104,7 +1104,7 @@ def page_get_components_for_access_group(self, page_id, page_access_group_id, pa
-------
any
"""
- url = "v1/pages/{}/page_access_groups/{}/components".format(page_id, page_access_group_id)
+ url = f"v1/pages/{page_id}/page_access_groups/{page_access_group_id}/components"
return self.get(url, params={"page": page, "per_page": per_page})
def page_get_subscriber(self, page_id, subscriber_id):
@@ -1131,7 +1131,7 @@ def page_get_subscriber(self, page_id, subscriber_id):
-------
any
"""
- url = "v1/pages/{}/subscribers/{}".format(page_id, subscriber_id)
+ url = f"v1/pages/{page_id}/subscribers/{subscriber_id}"
return self.get(url)
def page_get_subscribers(self, page_id, search_by=None, sort_direction="asc", page=1, per_page=100):
@@ -1179,7 +1179,7 @@ def page_get_subscribers(self, page_id, search_by=None, sort_direction="asc", pa
-------
any
"""
- url = "v1/pages/{}/subscribers".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers"
params = {}
@@ -1228,7 +1228,7 @@ def page_update_subscriber(self, page_id, subscriber_id, component_ids):
-------
any
"""
- url = "v1/pages/{}/subscribers/{}".format(page_id, subscriber_id)
+ url = f"v1/pages/{page_id}/subscribers/{subscriber_id}"
return self.patch(url, data={"component_ids": component_ids})
def page_unsubscribe_subscriber(self, page_id, subscriber_id, skip_unsubscription_notifications=False):
@@ -1257,7 +1257,7 @@ def page_unsubscribe_subscriber(self, page_id, subscriber_id, skip_unsubscriptio
-------
any
"""
- url = "v1/pages/{}/subscribers/{}".format(page_id, subscriber_id)
+ url = f"v1/pages/{page_id}/subscribers/{subscriber_id}"
return self.delete(url, params={"skip_unsubscription_notifications": skip_unsubscription_notifications})
def page_resend_confirmation_subscribers(self, page_id, subscriber_id):
@@ -1285,7 +1285,7 @@ def page_resend_confirmation_subscribers(self, page_id, subscriber_id):
-------
any
"""
- url = "v1/pages/{}/subscribers/{}/resend_confirmation".format(page_id, subscriber_id)
+ url = f"v1/pages/{page_id}/subscribers/{subscriber_id}/resend_confirmation"
return self.post(url)
def page_create_subscriber(self, page_id, subscriber):
@@ -1313,7 +1313,7 @@ def page_create_subscriber(self, page_id, subscriber):
-------
any
"""
- url = "v1/pages/{}/subscribers".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers"
return self.post(url, data={"subscriber": subscriber})
def page_get_list_unsubscribed(self, page_id, page=1, per_page=100):
@@ -1342,7 +1342,7 @@ def page_get_list_unsubscribed(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/unsubscribed".format(page_id)
+ url = f"v1/pages/{page_id}/unsubscribed"
return self.get(url, params={"page": page, "per_page": per_page})
def page_count_subscribers_by_type(self, page_id, subscriber_type, subscriber_state):
@@ -1372,7 +1372,7 @@ def page_count_subscribers_by_type(self, page_id, subscriber_type, subscriber_st
-------
any
"""
- url = "v1/pages/{}/subscribers/count".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers/count"
return self.get(url, params={"type": subscriber_type, "state": subscriber_state})
def page_get_histogram_of_subscribers_with_state(self, page_id):
@@ -1397,7 +1397,7 @@ def page_get_histogram_of_subscribers_with_state(self, page_id):
-------
any
"""
- url = "v1/pages/{}/subscribers/histogram".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers/histogram"
return self.get(url)
def page_reactivate_subscribers(self, page_id, subscriber_ids, subscriber_type):
@@ -1426,7 +1426,7 @@ def page_reactivate_subscribers(self, page_id, subscriber_ids, subscriber_type):
-------
any
"""
- url = "v1/pages/{}/subscribers/reactivate".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers/reactivate"
return self.post(url, data={"subscribers": subscriber_ids, "type": subscriber_type})
def page_unsubscribe_subscribers(
@@ -1460,7 +1460,7 @@ def page_unsubscribe_subscribers(
-------
any
"""
- url = "v1/pages/{}/subscribers/unsubscribe".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers/unsubscribe"
return self.post(
url,
data={
@@ -1496,7 +1496,7 @@ def page_resend_confirmations_to_subscribers(self, page_id, subscriber_ids):
-------
any
"""
- url = "v1/pages/{}/subscribers/resend_confirmation".format(page_id)
+ url = f"v1/pages/{page_id}/subscribers/resend_confirmation"
return self.post(url, data={"subscribers": subscriber_ids})
def page_create_template(self, page_id, template):
@@ -1524,7 +1524,7 @@ def page_create_template(self, page_id, template):
-------
any
"""
- url = "v1/pages/{}/incident_templates".format(page_id)
+ url = f"v1/pages/{page_id}/incident_templates"
return self.post(url, data={"template": template})
def page_get_templates(self, page_id, page=1, per_page=100):
@@ -1556,7 +1556,7 @@ def page_get_templates(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incident_templates".format(page_id)
+ url = f"v1/pages/{page_id}/incident_templates"
return self.get(url, params={"page": page, "per_page": per_page})
def page_create_incident(self, page_id, incident):
@@ -1583,7 +1583,7 @@ def page_create_incident(self, page_id, incident):
-------
any
"""
- url = "v1/pages/{}/incidents".format(page_id)
+ url = f"v1/pages/{page_id}/incidents"
return self.post(url, data={"incident": incident})
def page_list_incidents(self, page_id, q, page=1, per_page=100):
@@ -1618,7 +1618,7 @@ def page_list_incidents(self, page_id, q, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incidents".format(page_id)
+ url = f"v1/pages/{page_id}/incidents"
return self.get(url, params={"q": q, "page": page, "per_page": per_page})
def page_list_active_maintenances(self, page_id, page=1, per_page=100):
@@ -1650,7 +1650,7 @@ def page_list_active_maintenances(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incidents/active_maintenance".format(page_id)
+ url = f"v1/pages/{page_id}/incidents/active_maintenance"
return self.get(url, params={"page": page, "per_page": per_page})
def page_list_upcoming_incidents(self, page_id, page=1, per_page=100):
@@ -1682,7 +1682,7 @@ def page_list_upcoming_incidents(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incidents/upcoming".format(page_id)
+ url = f"v1/pages/{page_id}/incidents/upcoming"
return self.get(url, params={"page": page, "per_page": per_page})
def page_list_scheduled_incidents(self, page_id, page=1, per_page=100):
@@ -1714,7 +1714,7 @@ def page_list_scheduled_incidents(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incidents/scheduled".format(page_id)
+ url = f"v1/pages/{page_id}/incidents/scheduled"
return self.get(url, params={"page": page, "per_page": per_page})
def page_list_unresolved_incidents(self, page_id, page=1, per_page=100):
@@ -1746,7 +1746,7 @@ def page_list_unresolved_incidents(self, page_id, page=1, per_page=100):
-------
any
"""
- url = "v1/pages/{}/incidents/unresolved".format(page_id)
+ url = f"v1/pages/{page_id}/incidents/unresolved"
return self.get(url, params={"page": page, "per_page": per_page})
def page_delete_incident(self, page_id, incident_id):
@@ -1769,7 +1769,7 @@ def page_delete_incident(self, page_id, incident_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}"
return self.delete(url)
def page_update_incident(self, page_id, incident_id, incident):
@@ -1798,7 +1798,7 @@ def page_update_incident(self, page_id, incident_id, incident):
-------
any
"""
- url = "v1/pages/{}/incidents/{}".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}"
return self.patch(url, data={"incident": incident})
def page_get_incident(self, page_id, incident_id):
@@ -1825,7 +1825,7 @@ def page_get_incident(self, page_id, incident_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}"
return self.get(url)
def page_update_incident_updates(self, page_id, incident_id, incident_update_id, incident_update):
@@ -1857,7 +1857,7 @@ def page_update_incident_updates(self, page_id, incident_id, incident_update_id,
-------
any
"""
- url = "v1/pages/{}/incidents/{}/incidents_update/{}".format(page_id, incident_id, incident_update_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/incidents_update/{incident_update_id}"
return self.patch(url, data={"incident_update": incident_update})
def page_create_incident_subscriber(self, page_id, incident_id, subscriber):
@@ -1886,7 +1886,7 @@ def page_create_incident_subscriber(self, page_id, incident_id, subscriber):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/subscribers".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/subscribers"
return self.post(url, data={"subscriber": subscriber})
def page_list_incident_subscribers(self, page_id, incident_id, page=1, per_page=100):
@@ -1917,7 +1917,7 @@ def page_list_incident_subscribers(self, page_id, incident_id, page=1, per_page=
-------
any
"""
- url = "v1/pages/{}/incidents/{}/subscribers".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/subscribers"
return self.get(url, params={"page": page, "per_page": per_page})
def page_unsubscribe_incident_subscriber(self, page_id, incident_id, subscriber_id):
@@ -1942,7 +1942,7 @@ def page_unsubscribe_incident_subscriber(self, page_id, incident_id, subscriber_
-------
any
"""
- url = "v1/pages/{}/incidents/{}/subscribers/{}".format(page_id, incident_id, subscriber_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id}"
return self.delete(url)
def page_get_incident_subscriber(self, page_id, incident_id, subscriber_id):
@@ -1972,7 +1972,7 @@ def page_get_incident_subscriber(self, page_id, incident_id, subscriber_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/subscribers/{}".format(page_id, incident_id, subscriber_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id}"
return self.get(url)
def page_resend_confirmation_incident_subscriber(self, page_id, incident_id, subscriber_id):
@@ -2001,7 +2001,7 @@ def page_resend_confirmation_incident_subscriber(self, page_id, incident_id, sub
-------
any
"""
- url = "v1/pages/{}/incidents/{}/subscribers/{}/resend_confirmation".format(page_id, incident_id, subscriber_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id}/resend_confirmation"
return self.post(url)
def page_get_postmortem(self, page_id, incident_id):
@@ -2028,7 +2028,7 @@ def page_get_postmortem(self, page_id, incident_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/postmortem".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/postmortem"
return self.get(url)
def page_create_postmortem(self, page_id, incident_id, postmortem):
@@ -2057,7 +2057,7 @@ def page_create_postmortem(self, page_id, incident_id, postmortem):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/postmortem".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/postmortem"
return self.post(url, data={"postmortem": {"body_draft": postmortem}})
def page_delete_postmortem(self, page_id, incident_id):
@@ -2084,7 +2084,7 @@ def page_delete_postmortem(self, page_id, incident_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/postmortem".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/postmortem"
return self.delete(url)
def page_publish_postmortem(self, page_id, incident_id, postmortem):
@@ -2115,7 +2115,7 @@ def page_publish_postmortem(self, page_id, incident_id, postmortem):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/postmortem/publish".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/postmortem/publish"
return self.post(url, data={"postmortem": postmortem})
def page_revert_postmortem(self, page_id, incident_id):
@@ -2143,7 +2143,7 @@ def page_revert_postmortem(self, page_id, incident_id):
-------
any
"""
- url = "v1/pages/{}/incidents/{}/postmortem/revert".format(page_id, incident_id)
+ url = f"v1/pages/{page_id}/incidents/{incident_id}/postmortem/revert"
return self.post(url)
def page_create_component(self, page_id, component):
@@ -2172,7 +2172,7 @@ def page_create_component(self, page_id, component):
-------
any
"""
- url = "v1/pages/{}/components".format(page_id)
+ url = f"v1/pages/{page_id}/components"
return self.post(url, data={"component": component})
def page_get_components(self, page_id, per_page=100, page=1):
@@ -2201,7 +2201,7 @@ def page_get_components(self, page_id, per_page=100, page=1):
-------
any
"""
- url = "v1/pages/{}/components".format(page_id)
+ url = f"v1/pages/{page_id}/components"
return self.get(url, params={"per_page": per_page, "page": page})
def page_update_component(self, page_id, component_id, component):
@@ -2236,7 +2236,7 @@ def page_update_component(self, page_id, component_id, component):
-------
any
"""
- url = "v1/pages/{}/components/{}".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}"
return self.patch(url, data={"component": component})
def page_delete_component(self, page_id, component_id):
@@ -2263,7 +2263,7 @@ def page_delete_component(self, page_id, component_id):
-------
any
"""
- url = "v1/pages/{}/components/{}".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}"
return self.delete(url)
def page_get_component(self, page_id, component_id):
@@ -2290,7 +2290,7 @@ def page_get_component(self, page_id, component_id):
-------
any
"""
- url = "v1/pages/{}/components/{}".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}"
return self.get(url)
def page_get_uptime_component(self, page_id, component_id, start=None, end=None):
@@ -2330,7 +2330,7 @@ def page_get_uptime_component(self, page_id, component_id, start=None, end=None)
-------
any
"""
- url = "v1/pages/{}/components/{}/uptime".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}/uptime"
params = {}
if start is not None:
@@ -2365,7 +2365,7 @@ def page_remove_access_users_from_component(self, page_id, component_id):
-------
any
"""
- url = "v1/pages/{}/components/{}/page_access_users".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}/page_access_users"
return self.delete(url)
def page_add_access_users_to_component(self, page_id, component_id, page_access_user_ids):
@@ -2395,7 +2395,7 @@ def page_add_access_users_to_component(self, page_id, component_id, page_access_
-------
any
"""
- url = "v1/pages/{}/components/{}/page_access_users".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}/page_access_users"
return self.post(url, data={"page_access_user_ids": page_access_user_ids})
def page_remove_access_users_from_group(self, page_id, component_id):
@@ -2423,7 +2423,7 @@ def page_remove_access_users_from_group(self, page_id, component_id):
-------
any
"""
- url = "v1/pages/{}/components/{}/page_access_groups".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}/page_access_groups"
return self.delete(url)
def page_add_access_users_to_group(self, page_id, component_id, page_access_group_ids):
@@ -2453,7 +2453,7 @@ def page_add_access_users_to_group(self, page_id, component_id, page_access_grou
-------
any
"""
- url = "v1/pages/{}/components/{}/page_access_groups".format(page_id, component_id)
+ url = f"v1/pages/{page_id}/components/{component_id}/page_access_groups"
return self.post(url, data={"page_access_group_ids": page_access_group_ids})
def page_create_component_group(self, page_id, description, components_group):
@@ -2483,7 +2483,7 @@ def page_create_component_group(self, page_id, description, components_group):
-------
any
"""
- url = "v1/pages/{}/component_groups".format(page_id)
+ url = f"v1/pages/{page_id}/component_groups"
return self.post(url, data={"description": description, "components_group": components_group})
def page_get_list_of_component_groups(self, page_id, per_page=100, page=1):
@@ -2512,7 +2512,7 @@ def page_get_list_of_component_groups(self, page_id, per_page=100, page=1):
-------
any
"""
- url = "v1/pages/{}/component_groups".format(page_id)
+ url = f"v1/pages/{page_id}/component_groups"
return self.get(url, params={"per_page": per_page, "page": page})
def page_update_component_group(self, page_id, component_group_id, description, component_group):
@@ -2544,7 +2544,7 @@ def page_update_component_group(self, page_id, component_group_id, description,
-------
any
"""
- url = "v1/pages/{}/component_groups/{}".format(page_id, component_group_id)
+ url = f"v1/pages/{page_id}/component_groups/{component_group_id}"
return self.patch(url, data={"description": description, "component_group": component_group})
def page_delete_component_group(self, page_id, component_group_id):
@@ -2571,7 +2571,7 @@ def page_delete_component_group(self, page_id, component_group_id):
-------
any
"""
- url = "v1/pages/{}/component_groups/{}".format(page_id, component_group_id)
+ url = f"v1/pages/{page_id}/component_groups/{component_group_id}"
return self.delete(url)
def page_get_component_group(self, page_id, component_group_id):
@@ -2598,7 +2598,7 @@ def page_get_component_group(self, page_id, component_group_id):
-------
any
"""
- url = "v1/pages/{}/component_groups/{}".format(page_id, component_group_id)
+ url = f"v1/pages/{page_id}/component_groups/{component_group_id}"
return self.get(url)
def page_get_uptime_for_component_group(self, page_id, component_group_id, start=None, end=None):
@@ -2639,7 +2639,7 @@ def page_get_uptime_for_component_group(self, page_id, component_group_id, start
-------
any
"""
- url = "v1/pages/{}/component_groups/{}/uptime".format(page_id, component_group_id)
+ url = f"v1/pages/{page_id}/component_groups/{component_group_id}/uptime"
params = {}
if start is not None:
@@ -2675,7 +2675,7 @@ def page_add_data_points_to_metric(self, page_id, data):
-------
any
"""
- url = "v1/pages/{}/metrics/data".format(page_id)
+ url = f"v1/pages/{page_id}/metrics/data"
return self.post(url, data={"data": data})
def page_get_list_of_metrics(self, page_id, per_page=100, page=1):
@@ -2704,7 +2704,7 @@ def page_get_list_of_metrics(self, page_id, per_page=100, page=1):
-------
any
"""
- url = "v1/pages/{}/metrics".format(page_id)
+ url = f"v1/pages/{page_id}/metrics"
return self.get(url, params={"per_page": per_page, "page": page})
def page_update_metric(self, page_id, metric_id, metric):
@@ -2737,7 +2737,7 @@ def page_update_metric(self, page_id, metric_id, metric):
-------
any
"""
- url = "v1/pages/{}/metrics/{}".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}"
return self.patch(url, data={"metric": metric})
def page_update_metric_data(self, page_id, metric_id, metric):
@@ -2770,7 +2770,7 @@ def page_update_metric_data(self, page_id, metric_id, metric):
-------
any
"""
- url = "v1/pages/{}/metrics/{}".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}"
return self.patch(url, data={"metric": metric})
def page_delete_metric(self, page_id, metric_id):
@@ -2797,7 +2797,7 @@ def page_delete_metric(self, page_id, metric_id):
-------
any
"""
- url = "v1/pages/{}/metrics/{}".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}"
return self.delete(url)
def page_get_metric(self, page_id, metric_id):
@@ -2824,7 +2824,7 @@ def page_get_metric(self, page_id, metric_id):
-------
any
"""
- url = "v1/pages/{}/metrics/{}".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}"
return self.get(url)
def page_reset_data_for_metric(self, page_id, metric_id):
@@ -2851,7 +2851,7 @@ def page_reset_data_for_metric(self, page_id, metric_id):
-------
any
"""
- url = "v1/pages/{}/metrics/{}/data".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}/data"
return self.delete(url)
def page_add_data_to_metric(self, page_id, metric_id, data):
@@ -2882,7 +2882,7 @@ def page_add_data_to_metric(self, page_id, metric_id, data):
-------
any
"""
- url = "v1/pages/{}/metrics/{}/data".format(page_id, metric_id)
+ url = f"v1/pages/{page_id}/metrics/{metric_id}/data"
return self.post(url, data={"data": data})
def page_list_metric_for_metric_provider(self, page_id, metric_provider_id, per_page=100, page=1):
@@ -2914,7 +2914,7 @@ def page_list_metric_for_metric_provider(self, page_id, metric_provider_id, per_
-------
any
"""
- url = "v1/pages/{}/metrics_providers/{}/metrics".format(page_id, metric_provider_id)
+ url = f"v1/pages/{page_id}/metrics_providers/{metric_provider_id}/metrics"
return self.get(url, params={"per_page": per_page, "page": page})
def page_create_metric_for_metric_provider(self, page_id, metric_provider_id, metric):
@@ -2970,7 +2970,7 @@ def page_create_metric_for_metric_provider(self, page_id, metric_provider_id, me
-------
any
"""
- url = "v1/pages/{}/metrics_providers/{}/metrics".format(page_id, metric_provider_id)
+ url = f"v1/pages/{page_id}/metrics_providers/{metric_provider_id}/metrics"
return self.post(url, data={"metric": metric})
def page_list_metric_providers(self, page_id):
@@ -2994,7 +2994,7 @@ def page_list_metric_providers(self, page_id):
-------
any
"""
- url = "v1/pages/{}/metrics_providers".format(page_id)
+ url = f"v1/pages/{page_id}/metrics_providers"
return self.get(url)
def page_create_metric_provider(self, page_id, metric_provider):
@@ -3041,7 +3041,7 @@ def page_create_metric_provider(self, page_id, metric_provider):
-------
any
"""
- url = "v1/pages/{}/metrics_providers".format(page_id)
+ url = f"v1/pages/{page_id}/metrics_providers"
return self.post(url, data={"metric_provider": metric_provider})
def page_get_metric_provider(self, page_id, metric_provider_id):
@@ -3068,7 +3068,7 @@ def page_get_metric_provider(self, page_id, metric_provider_id):
-------
any
"""
- url = "v1/pages/{}/metrics_providers/{}".format(page_id, metric_provider_id)
+ url = f"v1/pages/{page_id}/metrics_providers/{metric_provider_id}"
return self.get(url)
def page_update_metric_provider(self, page_id, metric_provider_id, metric_provider):
@@ -3106,7 +3106,7 @@ def page_update_metric_provider(self, page_id, metric_provider_id, metric_provid
-------
any
"""
- url = "v1/pages/{}/metrics_providers/{}".format(page_id, metric_provider_id)
+ url = f"v1/pages/{page_id}/metrics_providers/{metric_provider_id}"
return self.patch(url, data={"metric_provider": metric_provider})
def page_delete_metric_provider(self, page_id, metric_provider_id):
@@ -3129,5 +3129,5 @@ def page_delete_metric_provider(self, page_id, metric_provider_id):
-------
any
"""
- url = "v1/pages/{}/metrics_providers/{}".format(page_id, metric_provider_id)
+ url = f"v1/pages/{page_id}/metrics_providers/{metric_provider_id}"
return self.delete(url)
diff --git a/atlassian/utils.py b/atlassian/utils.py
index 9860983f6..24a479993 100644
--- a/atlassian/utils.py
+++ b/atlassian/utils.py
@@ -27,7 +27,7 @@ def html_email(email, title=None):
if not title:
title = email
- return '{title}'.format(email=email, title=title)
+ return f'{title}'
def html_list(data):
@@ -49,7 +49,7 @@ def html_list(data):
if is_email(item):
item = html_email(item, item)
- html += "{}".format(item)
+ html += f"{item}"
return html + ""
@@ -63,7 +63,7 @@ def html_table_header_row(data):
html = "\n\t"
for th in data:
title = th.replace("_", " ").title()
- html += "{} | ".format(title)
+ html += f"{title} | "
return html + "
"
@@ -89,7 +89,7 @@ def html_row_with_ordered_headers(data, col_headers, row_header=None):
"""
html = "\n\t"
if row_header:
- html += "{} | ".format(row_header.replace("_", " ").title())
+ html += f"{row_header.replace('_', ' ').title()} | "
for header in col_headers:
element = data[header]
if isinstance(element, list):
@@ -97,7 +97,7 @@ def html_row_with_ordered_headers(data, col_headers, row_header=None):
if is_email(element):
element = html_email(element)
- html += "{} | ".format(element)
+ html += f"{element} | "
return html + "
"
@@ -198,7 +198,7 @@ def html_table_from_nested_dict(data, ordering):
header_row.extend(ordering)
html += html_table_header_row(header_row)
- for row_header, row in data.items():
+ for row_header, row in list(data.items()):
html += html_row_with_ordered_headers(row, ordering, row_header)
return html + "\n"
diff --git a/atlassian/xray.py b/atlassian/xray.py
index 04a96a185..338732446 100644
--- a/atlassian/xray.py
+++ b/atlassian/xray.py
@@ -33,7 +33,7 @@ def raise_for_status(self, response):
else:
raise HTTPError(error_msg, response=response)
- def resource_url(self, resource, api_root=None, api_version=None):
+ def resource_url(self, resource: object, api_root: object = None, api_version: object = None) -> object:
"""
Overloading the method from AtlassianRestAPI to be compatible with the "middle man" version used by Xray.
"""
@@ -50,7 +50,7 @@ def get_tests(self, test_keys):
:param test_keys: list of tests (eg. `['TEST-001', 'TEST-002']`) to retrieve.
:return: Returns the retrieved tests.
"""
- url = self.resource_url("test?keys={0}".format(";".join(test_keys)))
+ url = self.resource_url(f"test?keys={';'.join(test_keys)}")
return self.get(url)
def get_test_statuses(self):
@@ -67,7 +67,7 @@ def get_test_runs(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Returns the exported test runs.
"""
- url = self.resource_url("test/{0}/testruns".format(test_key))
+ url = self.resource_url(f"test/{test_key}/testruns")
return self.get(url)
def get_test_runs_in_context(
@@ -131,8 +131,8 @@ 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]))
- url = self.resource_url("test/{0}/testruns{1}".format(test_key, env))
+ env = f"?testEnvironments={','.join([re.escape(env) for env in test_environments])}"
+ url = self.resource_url(f"test/{test_key}/testruns{env}")
return self.get(url)
def get_test_preconditions(self, test_key):
@@ -141,7 +141,7 @@ def get_test_preconditions(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Returns the test pre-conditions of a given test.
"""
- url = self.resource_url("test/{0}/preconditions".format(test_key))
+ url = self.resource_url(f"test/{test_key}/preconditions")
return self.get(url)
def get_test_sets(self, test_key):
@@ -150,7 +150,7 @@ def get_test_sets(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Returns the exported test sets.
"""
- url = self.resource_url("test/{0}/testsets".format(test_key))
+ url = self.resource_url(f"test/{test_key}/testsets")
return self.get(url)
def get_test_executions(self, test_key):
@@ -159,7 +159,7 @@ def get_test_executions(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Returns the exported test executions.
"""
- url = self.resource_url("test/{0}/testexecutions".format(test_key))
+ url = self.resource_url(f"test/{test_key}/testexecutions")
return self.get(url)
def get_test_plans(self, test_key):
@@ -168,7 +168,7 @@ def get_test_plans(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Returns the exported test plans.
"""
- url = self.resource_url("test/{0}/testplans".format(test_key))
+ url = self.resource_url(f"test/{test_key}/testplans")
return self.get(url)
# Test Steps API
@@ -187,7 +187,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 = self.resource_url("test/{0}/step/{1}".format(test_key, test_step_id))
+ url = self.resource_url(f"test/{test_key}/step/{test_step_id}")
return self.get(url)
def get_test_steps(self, test_key):
@@ -196,7 +196,7 @@ def get_test_steps(self, test_key):
:param test_key: Test key (eg. 'TEST-001').
:return: Return the test steps of a given test.
"""
- url = self.resource_url("test/{0}/step".format(test_key))
+ url = self.resource_url(f"test/{test_key}/step")
return self.get(url)
def create_test_step(self, test_key, step, data, result):
@@ -210,7 +210,7 @@ def create_test_step(self, test_key, step, data, result):
:return:
"""
create = {"step": step, "data": data, "result": result, "attachments": []}
- url = self.resource_url("test/{0}/step".format(test_key))
+ url = self.resource_url(f"test/{test_key}/step")
return self.put(url, create)
def update_test_step(self, test_key, test_step_id, step, data, result):
@@ -230,7 +230,7 @@ def update_test_step(self, test_key, test_step_id, step, data, result):
"result": result,
"attachments": {"add": [], "remove": []},
}
- url = self.resource_url("test/{0}/step/{1}".format(test_key, test_step_id))
+ url = self.resource_url(f"test/{test_key}/step/{test_step_id}")
return self.post(url, update)
def delete_test_step(self, test_key, test_step_id):
@@ -240,7 +240,7 @@ def delete_test_step(self, test_key, test_step_id):
:param test_step_id: ID of the test step.
:return:
"""
- url = self.resource_url("test/{0}/step/{1}".format(test_key, test_step_id))
+ url = self.resource_url(f"test/{test_key}/step/{test_step_id}")
return self.delete(url)
# Pre-Conditions API
@@ -250,7 +250,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 = self.resource_url("precondition/{0}/test".format(precondition_key))
+ url = self.resource_url(f"precondition/{precondition_key}/test")
return self.get(url)
def update_precondition(self, precondition_key, add=None, remove=None):
@@ -266,7 +266,7 @@ def update_precondition(self, precondition_key, add=None, remove=None):
if add is None:
add = []
update = {"add": add, "remove": remove}
- url = self.resource_url("precondition/{0}/test".format(precondition_key))
+ url = self.resource_url(f"precondition/{precondition_key}/test")
return self.post(url, update)
def delete_test_from_precondition(self, precondition_key, test_key):
@@ -276,7 +276,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 = self.resource_url("precondition/{0}/test/{1}".format(precondition_key, test_key))
+ url = self.resource_url(f"precondition/{precondition_key}/test/{test_key}")
return self.delete(url)
# Test Set API
@@ -288,7 +288,7 @@ def get_tests_with_test_set(self, test_set_key, limit=None, page=None):
:param page: OPTIONAL: Number of the page to be returned.
:return: Return a list of the test associated with the test set.
"""
- url = self.resource_url("testset/{0}/test".format(test_set_key))
+ url = self.resource_url(f"testset/{test_set_key}/test")
params = {}
if limit:
@@ -311,7 +311,7 @@ def update_test_set(self, test_set_key, add=None, remove=None):
if remove is None:
remove = []
update = {"add": add, "remove": remove}
- url = self.resource_url("testset/{0}/test".format(test_set_key))
+ url = self.resource_url(f"testset/{test_set_key}/test")
return self.post(url, update)
def delete_test_from_test_set(self, test_set_key, test_key):
@@ -321,7 +321,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 = self.resource_url("testset/{0}/test/{1}".format(test_set_key, test_key))
+ url = self.resource_url(f"testset/{test_set_key}/test/{test_key}")
return self.delete(url)
# Test Plans API
@@ -333,7 +333,7 @@ def get_tests_with_test_plan(self, test_plan_key, limit=None, page=None):
:param page: OPTIONAL: Number of the page to be returned.
:return: Return a list of the test associated with the test plan.
"""
- url = self.resource_url("testplan/{0}/test".format(test_plan_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/test")
params = {}
if limit:
@@ -356,7 +356,7 @@ def update_test_plan(self, test_plan_key, add=None, remove=None):
if remove is None:
remove = []
update = {"add": add, "remove": remove}
- url = self.resource_url("testplan/{0}/test".format(test_plan_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/test")
return self.post(url, update)
def delete_test_from_test_plan(self, test_plan_key, test_key):
@@ -366,7 +366,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 = self.resource_url("testplan/{0}/test/{1}".format(test_plan_key, test_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/test/{test_key}")
return self.delete(url)
def get_test_executions_with_test_plan(self, test_plan_key):
@@ -375,7 +375,7 @@ 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 = self.resource_url("testplan/{0}/testexecution".format(test_plan_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/testexecution")
return self.get(url)
def update_test_plan_test_executions(self, test_plan_key, add=None, remove=None):
@@ -391,7 +391,7 @@ 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 = self.resource_url("testplan/{0}/testexecution".format(test_plan_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/testexecution")
return self.post(url, update)
def delete_test_execution_from_test_plan(self, test_plan_key, test_exec_key):
@@ -401,7 +401,7 @@ def delete_test_execution_from_test_plan(self, test_plan_key, test_exec_key):
:param test_exec_key: Test execution Key which should no longer be associate with the test plan (eg. 'TEST-100')
:return:
"""
- url = self.resource_url("testplan/{0}/testexecution/{1}".format(test_plan_key, test_exec_key))
+ url = self.resource_url(f"testplan/{test_plan_key}/testexecution/{test_exec_key}")
return self.delete(url)
# Test Executions API
@@ -414,7 +414,7 @@ def get_tests_with_test_execution(self, test_exec_key, detailed=False, limit=Non
:param page: OPTIONAL: Number of the page to be returned.
:return: Return a list of the test associated with the test execution.
"""
- url = self.resource_url("testexec/{0}/test".format(test_exec_key))
+ url = self.resource_url(f"testexec/{test_exec_key}/test")
params = {}
if detailed:
@@ -440,7 +440,7 @@ def update_test_execution(self, test_exec_key, add=None, remove=None):
if remove is None:
remove = []
update = {"add": add, "remove": remove}
- url = self.resource_url("testexec/{0}/test".format(test_exec_key))
+ url = self.resource_url(f"testexec/{test_exec_key}/test")
return self.post(url, update)
def delete_test_from_test_execution(self, test_exec_key, test_key):
@@ -450,7 +450,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 = self.resource_url("testexec/{0}/test/{1}".format(test_exec_key, test_key))
+ url = self.resource_url(f"testexec/{test_exec_key}/test/{test_key}")
return self.delete(url)
# Test Runs API
@@ -460,7 +460,7 @@ def get_test_run(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns detailed information about the test run.
"""
- url = self.resource_url("testrun/{0}".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}")
return self.get(url)
def get_test_run_assignee(self, test_run_id):
@@ -469,7 +469,7 @@ def get_test_run_assignee(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns the assignee for the given test run
"""
- url = self.resource_url("testrun/{0}/assignee".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}/assignee")
return self.get(url)
def update_test_run_assignee(self, test_run_id, assignee):
@@ -480,7 +480,7 @@ def update_test_run_assignee(self, test_run_id, assignee):
:return:
"""
update = {"assignee": assignee}
- url = self.resource_url("testrun/{0}".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}")
return self.put(url, update)
def get_test_run_iteration(self, test_run_id, iteration_id):
@@ -490,7 +490,7 @@ def get_test_run_iteration(self, test_run_id, iteration_id):
:param iteration_id: ID of the iteration.
:return: Returns the specified iteration for the given test run.
"""
- url = self.resource_url("testrun/{0}/iteration/{1}".format(test_run_id, iteration_id))
+ url = self.resource_url(f"testrun/{test_run_id}/iteration/{iteration_id}")
return self.get(url)
def get_test_run_status(self, test_run_id):
@@ -499,7 +499,7 @@ def get_test_run_status(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns the status for the given test run
"""
- url = self.resource_url("testrun/{0}/status".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}/status")
return self.get(url)
def update_test_run_status(self, test_run_id, status):
@@ -510,7 +510,7 @@ def update_test_run_status(self, test_run_id, status):
:return:
"""
update = {"status": status}
- url = self.resource_url("testrun/{0}".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}")
return self.put(url, update)
def get_test_run_defects(self, test_run_id):
@@ -519,7 +519,7 @@ def get_test_run_defects(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns a list of defects for the given test run
"""
- url = self.resource_url("testrun/{0}/defect".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}/defect")
return self.get(url)
def update_test_run_defects(self, test_run_id, add=None, remove=None):
@@ -535,7 +535,7 @@ def update_test_run_defects(self, test_run_id, add=None, remove=None):
if remove is None:
remove = []
update = {"defects": {"add": add, "remove": remove}}
- url = self.resource_url("testrun/{0}".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}")
return self.put(url, update)
def get_test_run_comment(self, test_run_id):
@@ -544,7 +544,7 @@ def get_test_run_comment(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns the comment for the given test run
"""
- url = self.resource_url("testrun/{0}/comment".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}/comment")
return self.get(url)
def update_test_run_comment(self, test_run_id, comment):
@@ -555,7 +555,7 @@ def update_test_run_comment(self, test_run_id, comment):
:return:
"""
update = {"comment": comment}
- url = self.resource_url("testrun/{0}".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}")
return self.put(url, update)
def get_test_run_steps(self, test_run_id):
@@ -564,7 +564,7 @@ def get_test_run_steps(self, test_run_id):
:param test_run_id: ID of the test run (e.g. 100).
:return: Returns the steps for the given test run
"""
- url = self.resource_url("testrun/{0}/step".format(test_run_id))
+ url = self.resource_url(f"testrun/{test_run_id}/step")
return self.get(url)
def get_test_repo_folders(self, project_key):
@@ -573,7 +573,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 = self.resource_url("testrepository/{0}/folders".format(project_key))
+ url = self.resource_url(f"testrepository/{project_key}/folders")
return self.get(url)
def get_test_repo_folder(self, project_key, folder_id):
@@ -583,7 +583,7 @@ def get_test_repo_folder(self, project_key, folder_id):
:param folder_id: Internal folder ID.
:return: Returns the test repository folder.
"""
- url = self.resource_url("testrepository/{0}/folders/{1}".format(project_key, folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{folder_id}")
return self.get(url)
def create_test_repo_folder(self, project_key, folder_name, parent_folder_id=-1):
@@ -595,7 +595,7 @@ 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 = self.resource_url("testrepository/{0}/folders/{1}".format(project_key, parent_folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{parent_folder_id}")
return self.post(url, data=data)
def update_test_repo_folder(self, project_key, folder_id, folder_name, rank=1):
@@ -608,7 +608,7 @@ 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 = self.resource_url("testrepository/{0}/folders/{1}".format(project_key, folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{folder_id}")
return self.put(url, data=data)
def delete_test_repo_folder(self, project_key, folder_id):
@@ -618,7 +618,7 @@ def delete_test_repo_folder(self, project_key, folder_id):
:param folder_id: Internal folder Id.
:return: Returns the delete results.
"""
- url = self.resource_url("testrepository/{0}/folders/{1}".format(project_key, folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{folder_id}")
return self.delete(url)
def get_test_repo_folder_tests(self, project_key, folder_id, all_descendants=False, page=1, limit=50):
@@ -632,7 +632,7 @@ 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 = self.resource_url("testrepository/{0}/folders/{1}/tests".format(project_key, folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{folder_id}/tests")
params = {}
if all_descendants:
@@ -658,5 +658,5 @@ 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 = self.resource_url("testrepository/{0}/folders/{1}/tests".format(project_key, folder_id))
+ url = self.resource_url(f"testrepository/{project_key}/folders/{folder_id}/tests")
return self.put(url, data=data)
diff --git a/examples/bamboo/bamboo_add_plan_branch.py b/examples/bamboo/bamboo_add_plan_branch.py
index e6d1d16a5..c1f282bd7 100644
--- a/examples/bamboo/bamboo_add_plan_branch.py
+++ b/examples/bamboo/bamboo_add_plan_branch.py
@@ -21,7 +21,7 @@ def main():
args = parser.parse_args()
branch = create_plan_branch(plan=args.plan, vcs_branch=args.vcs_branch)
- print(branch.get("key") or branch)
+ print((branch.get("key") or branch))
if __name__ == "__main__":
diff --git a/examples/bamboo/bamboo_first_steps.py b/examples/bamboo/bamboo_first_steps.py
index 798f4091f..63d6337b2 100644
--- a/examples/bamboo/bamboo_first_steps.py
+++ b/examples/bamboo/bamboo_first_steps.py
@@ -31,6 +31,6 @@
# Methods in singular (project, plan, result...) return a single dictionary
-print(bamboo.project("FOO"))
+print((bamboo.project("FOO")))
-print(bamboo.build_result("FOO-BAR-1"))
+print((bamboo.build_result("FOO-BAR-1")))
diff --git a/examples/bamboo/bamboo_label_based_cleaner.py b/examples/bamboo/bamboo_label_based_cleaner.py
index 4d3ea25b8..44419fad7 100644
--- a/examples/bamboo/bamboo_label_based_cleaner.py
+++ b/examples/bamboo/bamboo_label_based_cleaner.py
@@ -31,30 +31,30 @@ def get_plans_from_project(project_key):
if __name__ == "__main__":
bamboo = Bamboo(url=BAMBOO_URL, username=BAMBOO_LOGIN, password=BAMBOO_PASSWORD, timeout=180)
projects = get_all_projects()
- print("Start analyzing the {} projects".format(len(projects)))
+ print(("Start analyzing the {} projects".format(len(projects))))
for project in projects:
- print("Inspecting {} project".format(project))
+ print(("Inspecting {} project".format(project)))
plans = get_plans_from_project(project)
- print("Start analyzing the {} plans".format(len(plans)))
+ print(("Start analyzing the {} plans".format(len(plans))))
for plan in plans:
- print("Inspecting {} plan".format(plan))
+ print(("Inspecting {} plan".format(plan)))
build_results = [
x for x in bamboo.results(plan_key=plan, label=LABEL, max_results=100, include_all_states=True)
]
for build in build_results:
build_key = build.get("buildResultKey") or None
- print("Inspecting {} build".format(build_key))
+ print(("Inspecting {} build".format(build_key)))
build_value = bamboo.build_result(build_key)
build_complete_time = build_value.get("buildCompletedTime") or None
if not build_complete_time:
continue
datetimeObj = datetime.strptime(build_complete_time.split("+")[0] + "000", "%Y-%m-%dT%H:%M:%S.%f")
if datetime.now() > datetimeObj + timedelta(days=OLDER_DAYS):
- print(
+ print((
"Build is old {} as build complete date {}".format(
build_key, build_complete_time.strftime("%Y-%m-%d")
)
- )
+ ))
if not DRY_RUN:
- print("Removing {} build".format(build_key))
+ print(("Removing {} build".format(build_key)))
bamboo.delete_build_result(build_key)
diff --git a/examples/bamboo/bamboo_remove_old_failed_results.py b/examples/bamboo/bamboo_remove_old_failed_results.py
index 3f7688c7f..d35deee8b 100644
--- a/examples/bamboo/bamboo_remove_old_failed_results.py
+++ b/examples/bamboo/bamboo_remove_old_failed_results.py
@@ -43,20 +43,20 @@ def remove_build_result(build_key, status):
datetime_obj = datetime.strptime(build_complete_time.split("+")[0] + "000", "%Y-%m-%dT%H:%M:%S.%f")
if datetime.now() > datetime_obj + timedelta(days=OLDER_DAYS):
if build_value.get("buildState") == status:
- print("Removing build result - {}".format(build_key))
+ print(("Removing build result - {}".format(build_key)))
if not DRY_RUN:
bamboo.delete_build_result(build_key=build_key)
def project_review(plans):
for plan in plans:
- print("Inspecting {} plan".format(plan))
+ print(("Inspecting {} plan".format(plan)))
branches = get_branches_from_plan(plan)
for branch in branches:
build_results = get_results_from_branch(branch)
for build in build_results:
build_key = build.get("buildResultKey") or None
- print("Inspecting build - {}".format(build_key))
+ print(("Inspecting build - {}".format(build_key)))
if build_key:
for status in STATUS_CLEANED_RESULTS:
remove_build_result(build_key=build_key, status=status)
@@ -68,7 +68,7 @@ def project_review(plans):
for project in projects:
if project in EXCLUDED_PROJECTS:
continue
- print("Inspecting project - {}".format(project))
+ print(("Inspecting project - {}".format(project)))
results = []
all_plans_of_project = get_plans_from_project(project)
project_review(plans=all_plans_of_project)
diff --git a/examples/bamboo/bamboo_remove_unknown_status_build_results.py b/examples/bamboo/bamboo_remove_unknown_status_build_results.py
index 2d99bdb34..d0d7210f1 100755
--- a/examples/bamboo/bamboo_remove_unknown_status_build_results.py
+++ b/examples/bamboo/bamboo_remove_unknown_status_build_results.py
@@ -35,20 +35,20 @@ def get_results_from_branch(plan_key):
def remove_build_result(build_key, status):
result = bamboo.build_result(build_key=build_key)
if result.get("buildState") == status:
- print("Removing build result - {}".format(build_key))
+ print(("Removing build result - {}".format(build_key)))
if REMOVE:
bamboo.delete_build_result(build_key=build_key)
def project_review(plans):
for plan in plans:
- print("Inspecting {} plan".format(plan))
+ print(("Inspecting {} plan".format(plan)))
branches = get_branches_from_plan(plan)
for branch in branches:
build_results = get_results_from_branch(branch)
for build in build_results:
build_key = build.get("buildResultKey") or None
- print("Inspecting build - {}".format(build_key))
+ print(("Inspecting build - {}".format(build_key)))
if build_key:
for status in STATUS_CLEANED_RESULTS:
remove_build_result(build_key=build_key, status=status)
@@ -60,7 +60,7 @@ def project_review(plans):
for project in projects:
if project in EXCLUDED_PROJECTS:
continue
- print("Inspecting project - {}".format(project))
+ print(("Inspecting project - {}".format(project)))
results = []
all_plans_of_project = get_plans_from_project(project)
project_review(plans=all_plans_of_project)
diff --git a/examples/bitbucket/bitbucket_clean_jira_branches.py b/examples/bitbucket/bitbucket_clean_jira_branches.py
index a91f93ee3..7eb83954f 100644
--- a/examples/bitbucket/bitbucket_clean_jira_branches.py
+++ b/examples/bitbucket/bitbucket_clean_jira_branches.py
@@ -35,32 +35,32 @@ def is_can_removed_branch(branch_candidate):
branch_id_name = branch_candidate.get("id")
# Just exclude exist mainstream branches
if any(x in branch_id_name for x in EXCLUDE_REPO_RULES):
- print(branch.get("displayId") + " in exclusion list")
+ print((branch.get("displayId") + " in exclusion list"))
return False
# skip default branch maybe DevOps made configs in ui
if branch_candidate.get("isDefault"):
- print(branch.get("displayId") + " is default")
+ print((branch.get("displayId") + " is default"))
return False
pull_request_info = (branch_candidate.get("metadata") or {}).get(out_going_pull_request) or {}
if pull_request_info.get("pullRequest") is not None or (pull_request_info.get("open") or 0) > 0:
- print(branch.get("displayId") + " has open PR")
+ print((branch.get("displayId") + " has open PR"))
return False
# skip branches without pull request info
if pull_request_info is None or len(pull_request_info) == 0:
- print(branch.get("displayId") + " without pull request info")
+ print((branch.get("displayId") + " without pull request info"))
# return False
author_time_stamp = branch_candidate.get("metadata").get(commit_info_key).get("authorTimestamp")
# check latest commit info
if time_now - author_time_stamp < delta_for_time_ms:
- print(branch.get("displayId") + " is too early to remove")
+ print((branch.get("displayId") + " is too early to remove"))
return False
# check issues statuses
issues_in_metadata = branch_candidate.get("metadata").get(branch_related_issues)
for issue in issues_in_metadata:
if jira.get_issue_status(issue.get("key")) not in ACCEPTED_ISSUE_STATUSES:
- print(branch.get("displayId") + " related issue has not Resolution ")
+ print((branch.get("displayId") + " related issue has not Resolution "))
return False
# so branch can be removed
return True
diff --git a/examples/bitbucket/bitbucket_cloud_oo.py b/examples/bitbucket/bitbucket_cloud_oo.py
index cefa9471c..d1cacab85 100644
--- a/examples/bitbucket/bitbucket_cloud_oo.py
+++ b/examples/bitbucket/bitbucket_cloud_oo.py
@@ -8,9 +8,9 @@
index = 0
for w in cloud.workspaces.each():
- print("Workspace name " + w.name)
+ print(("Workspace name " + w.name))
p = next(w.projects.each())
- print(" First project name " + p.name)
+ print((" First project name " + p.name))
index += 1
if index == 5:
print(" ...")
@@ -19,29 +19,29 @@
print()
w = cloud.workspaces.get(w.slug)
p = w.projects.get(p.key)
-print("Project key " + p.key)
+print(("Project key " + p.key))
for r in p.repositories.each():
- print(" Repository name " + r.name)
+ print((" Repository name " + r.name))
for i in r.issues.each():
- print(" Issue uuid " + str(i.id))
- print(" Title: " + i.title)
+ print((" Issue uuid " + str(i.id)))
+ print((" Title: " + i.title))
index = 0
for pl in r.pipelines.each(sort="-created_on"):
index += 1
if index == 5:
print(" ...")
break
- print(" Pipeline uuid " + pl.uuid)
+ print((" Pipeline uuid " + pl.uuid))
for s in pl.steps():
- print(" Step uuid " + s.uuid)
+ print((" Step uuid " + s.uuid))
size, log = s.log(start=0, end=20)
if size is None:
print(" No log")
else:
- print(" Size of log: " + size)
- print(indent(log.decode("utf-8"), " "))
+ print((" Size of log: " + size))
+ print((indent(log.decode("utf-8"), " ")))
for dr in r.default_reviewers.each():
- print(" Default reviewer " + dr.nickname)
+ print((" Default reviewer " + dr.nickname))
for br in r.branch_restrictions.each():
- print(" Branch restriction ID " + str(br.id))
- print(" Kind " + br.kind)
+ print((" Branch restriction ID " + str(br.id)))
+ print((" Kind " + br.kind))
diff --git a/examples/bitbucket/bitbucket_download_repo_archive.py b/examples/bitbucket/bitbucket_download_repo_archive.py
index e514cc1ae..0b03afe8c 100644
--- a/examples/bitbucket/bitbucket_download_repo_archive.py
+++ b/examples/bitbucket/bitbucket_download_repo_archive.py
@@ -7,6 +7,7 @@
bitbucket.download_repo_archive(
project_key="DEMO",
repository_slug="example-repository",
+ dest_fd="file_name",
at="master",
format="tar.gz",
)
diff --git a/examples/bitbucket/bitbucket_manage_pull_request.py b/examples/bitbucket/bitbucket_manage_pull_request.py
index 280f92823..7dbd8e378 100644
--- a/examples/bitbucket/bitbucket_manage_pull_request.py
+++ b/examples/bitbucket/bitbucket_manage_pull_request.py
@@ -6,21 +6,21 @@
pr = bitbucket.get_pullrequest("project_name", "repository_name", pr_id)
ver = pr.json().get("version")
-print("PR version: {}".format(ver))
+print(("PR version: {}".format(ver)))
response = bitbucket.decline_pull_request("project_name", "repository_name", pr_id, ver)
-print("Declined: {}".format(response))
+print(("Declined: {}".format(response)))
ver = response.json().get("version")
-print("PR version: {}".format(ver))
+print(("PR version: {}".format(ver)))
response = bitbucket.reopen_pull_request("project_name", "repository_name", pr_id, ver)
-print("Reopen: {}".format(response))
+print(("Reopen: {}".format(response)))
ver = response.json().get("version")
-print("PR version: {}".format(ver))
+print(("PR version: {}".format(ver)))
response = bitbucket.is_pull_request_can_be_merged("project_name", "repository_name", pr_id)
-print("Reopen: {}".format(response))
-print("PR version: {}".format(ver))
+print(("Reopen: {}".format(response)))
+print(("PR version: {}".format(ver)))
response = bitbucket.merge_pull_request("project_name", "repository_name", pr_id, ver)
-print("Merged: {}".format(response))
+print(("Merged: {}".format(response)))
diff --git a/examples/bitbucket/bitbucket_project.py b/examples/bitbucket/bitbucket_project.py
index 0043ad80d..796846ef4 100644
--- a/examples/bitbucket/bitbucket_project.py
+++ b/examples/bitbucket/bitbucket_project.py
@@ -15,4 +15,4 @@ def html(project):
bitbucket = Bitbucket(url="http://localhost:7990", username="admin", password="admin")
data = bitbucket.project("DEMO")
-print(html(data))
+print((html(data)))
diff --git a/examples/bitbucket/bitbucket_pullrequest_get_changed_files.py b/examples/bitbucket/bitbucket_pullrequest_get_changed_files.py
index 96535c977..d6a0d26cf 100644
--- a/examples/bitbucket/bitbucket_pullrequest_get_changed_files.py
+++ b/examples/bitbucket/bitbucket_pullrequest_get_changed_files.py
@@ -12,4 +12,4 @@
diff = bitbucket.get_pull_requests_changes(proj, repo, pr_id).json()
for item in diff.get("values", []):
- print(item.get("path", {}).get("toString"))
+ print((item.get("path", {}).get("toString")))
diff --git a/examples/confluence/confluence_check_unknown_attachment_error.py b/examples/confluence/confluence_check_unknown_attachment_error.py
index fb8866d76..1e8d341a4 100644
--- a/examples/confluence/confluence_check_unknown_attachment_error.py
+++ b/examples/confluence/confluence_check_unknown_attachment_error.py
@@ -33,7 +33,7 @@ def check_unknown_attachment_in_space(space_key):
:return:
"""
page_ids = get_all_pages_ids(space_key)
- print("Start review pages {} in {}".format(len(page_ids), space_key))
+ print(("Start review pages {} in {}".format(len(page_ids), space_key)))
for page_id in page_ids:
link = confluence.has_unknown_attachment_error(page_id)
if len(link) > 0:
@@ -43,5 +43,5 @@ def check_unknown_attachment_in_space(space_key):
if __name__ == "__main__":
space_list = confluence.get_all_spaces()
for space in space_list:
- print("Start review {} space".format(space["key"]))
+ print(("Start review {} space".format(space["key"])))
check_unknown_attachment_in_space(space["key"])
diff --git a/examples/confluence/confluence_copy_labels.py b/examples/confluence/confluence_copy_labels.py
index f2891e104..2daa4d087 100644
--- a/examples/confluence/confluence_copy_labels.py
+++ b/examples/confluence/confluence_copy_labels.py
@@ -40,7 +40,7 @@ def sync_labels_pages(pages, destination_space):
label_name = label.get("name")
if not DRY_RUN:
confluence.set_page_label(destination_page_id, label_name)
- print(label_name + " copied to " + page_title)
+ print((label_name + " copied to " + page_title))
return
diff --git a/examples/confluence/confluence_download_attachments_from_page.py b/examples/confluence/confluence_download_attachments_from_page.py
index 903eeb367..73a87d61a 100644
--- a/examples/confluence/confluence_download_attachments_from_page.py
+++ b/examples/confluence/confluence_download_attachments_from_page.py
@@ -18,4 +18,5 @@
page = 393464 # make sure the page id exists and has attachments
confluence.download_attachments_from_page(page)
-# Directory 'attachment_tests' should include saved attachment. If directory deosn't exist or if there is permission issue function should raise an error.
+# Directory 'attachment_tests' should include saved attachment.
+# If directory doesn't exist or if there is permission issue function should raise an error.
diff --git a/examples/confluence/confluence_draft_page_cleaner.py b/examples/confluence/confluence_draft_page_cleaner.py
index c2580d3c9..be6f6ebc6 100644
--- a/examples/confluence/confluence_draft_page_cleaner.py
+++ b/examples/confluence/confluence_draft_page_cleaner.py
@@ -24,9 +24,9 @@ def clean_draft_pages_from_space(space_key, count, date_now):
last_date = datetime.datetime.strptime(last_date_string.replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S")
if (date_now - last_date) > datetime.timedelta(days=DRAFT_DAYS):
count += 1
- print("Removing page with page id: " + page_id)
+ print(("Removing page with page id: " + page_id))
confluence.remove_page_as_draft(page_id=page_id)
- print("Removed page with date " + last_date_string)
+ print(("Removed page with date " + last_date_string))
return count
@@ -46,11 +46,11 @@ def clean_all_draft_pages_from_all_spaces(days=30):
if space_lists and len(space_lists) != 0:
i += 1
for space_list in space_lists:
- print("Start review the space {}".format(space_list["key"]))
+ print(("Start review the space {}".format(space_list["key"])))
count = clean_draft_pages_from_space(space_key=space_list["key"], count=count, date_now=date_now)
else:
flag = False
- print("Script has removed {count} draft pages older than {days} days".format(count=count, days=days))
+ print(("Script has removed {count} draft pages older than {days} days".format(count=count, days=days)))
if __name__ == "__main__":
diff --git a/examples/confluence/confluence_get_tables_from_page.py b/examples/confluence/confluence_get_tables_from_page.py
index d09464487..fa02f3b81 100644
--- a/examples/confluence/confluence_get_tables_from_page.py
+++ b/examples/confluence/confluence_get_tables_from_page.py
@@ -13,5 +13,12 @@
result = confluence.get_tables_from_page(page_id)
print(result)
# Let's say page has two table, each one has 3 columns and 2 rows'
-# Method should return following output: {"page_id": 393464, "number_of_tables_in_page": 2, "tables_content": [[["header1", "header2", "header3"], ["h1r1", "h2r1", "h3r1"], ["h1r2", "h2r2", "h3r2"]], [["table2 header1", "table2 header2", "table2 header3"], ["h1r1", "h2r1", "h3r1"], ["h1r2", "h2r2", "h3r2"]]]}
-# tables_content is a list of lists of lists. Each nested list represents a table. Each nested list inside a table represents a row.
+# Method should return following output:
+# {"page_id": 393464,
+# "number_of_tables_in_page": 2,
+# "tables_content": [
+# [["header1", "header2", "header3"], ["h1r1", "h2r1", "h3r1"], ["h1r2", "h2r2", "h3r2"]],
+# [["table2 header1", "table2 header2", "table2 header3"], ["h1r1", "h2r1", "h3r1"], ["h1r2", "h2r2", "h3r2"]]
+# ]}
+# tables_content is a list of lists.
+# Each nested list represents a table. Each nested list inside a table represents a row.
diff --git a/examples/confluence/confluence_nested_error.py b/examples/confluence/confluence_nested_error.py
index 373bda7db..4d4031a6e 100644
--- a/examples/confluence/confluence_nested_error.py
+++ b/examples/confluence/confluence_nested_error.py
@@ -11,6 +11,6 @@
)
result = confluence.get_user_details_by_username(username="gonchik.tsymzhitov", expand="status")
except ApiError as e:
- print("FAILURE: {}, caused by {}".format(e, e.reason if e.reason is not None else "unknown reason"))
+ print(("FAILURE: {}, caused by {}".format(e, e.reason if e.reason is not None else "unknown reason")))
else:
print(result)
diff --git a/examples/confluence/confluence_page_properties.py b/examples/confluence/confluence_page_properties.py
index d835ffe12..6f6fed51d 100644
--- a/examples/confluence/confluence_page_properties.py
+++ b/examples/confluence/confluence_page_properties.py
@@ -8,11 +8,11 @@
# Set page property
data = {"key": "newprp", "value": {"anything": "goes"}}
print("SET")
-print(confluence.set_page_property(242793586, data))
+print((confluence.set_page_property(242793586, data)))
# # Get page property
print("GET")
-print(confluence.get_page_property(242793586, "newprp"))
+print((confluence.get_page_property(242793586, "newprp")))
# Update page property
data = {
@@ -21,8 +21,8 @@
"version": {"number": 2, "minorEdit": False, "hidden": False},
}
print("UPDATE")
-print(confluence.update_page_property(242793586, data))
+print((confluence.update_page_property(242793586, data)))
# Delete page property
print("DELETE")
-print(confluence.delete_page_property(242793586, "newprp"))
+print((confluence.delete_page_property(242793586, "newprp")))
diff --git a/examples/confluence/confluence_page_versions_cleaner.py b/examples/confluence/confluence_page_versions_cleaner.py
index a61880850..f6090bba5 100644
--- a/examples/confluence/confluence_page_versions_cleaner.py
+++ b/examples/confluence/confluence_page_versions_cleaner.py
@@ -13,12 +13,12 @@ def page_version_remover(content_id, remained_page_numbers):
return
latest_version_count = int(response.get("lastUpdated").get("number"))
if len(response) > 0 and latest_version_count > remained_page_numbers:
- print(
+ print((
"Number of {} latest version {}".format(
confluence.url_joiner(confluence.url, "/pages/viewpage.action?pageId=" + content_id),
latest_version_count,
)
- )
+ ))
for version_page_counter in range(1, (latest_version_count - remained_page_numbers + 1), 1):
confluence.remove_content_history(content_id, 1)
else:
@@ -43,9 +43,9 @@ def get_all_page_ids_from_space(space):
print("Did not find any pages, please, check permissions")
else:
for value in values:
- print("Retrieve page with title: " + value["title"])
+ print(("Retrieve page with title: " + value["title"]))
content_ids.append((value["id"]))
- print("Found in space {} pages {}".format(space, len(content_ids)))
+ print(("Found in space {} pages {}".format(space, len(content_ids))))
return content_ids
@@ -59,7 +59,7 @@ def get_all_spaces():
if space_lists and len(space_lists) != 0:
i += 1
for space_list in space_lists:
- print("Start review the space with key = " + space_list["key"])
+ print(("Start review the space with key = " + space_list["key"]))
space_key_list.append(space_list["key"])
else:
flag = False
@@ -82,7 +82,7 @@ def reduce_page_numbers(page_id, remained_page_history_count):
space_keys = get_all_spaces()
counter = 0
for space_key in space_keys:
- print("Starting review space with key {}".format(space_key))
+ print(("Starting review space with key {}".format(space_key)))
page_ids = get_all_page_ids_from_space(space_key)
for page_id in page_ids:
reduce_page_numbers(page_id=page_id, remained_page_history_count=REMAINED_PAGE_HISTORY_COUNT)
diff --git a/examples/confluence/confluence_trash_cleaner.py b/examples/confluence/confluence_trash_cleaner.py
index 559d7aef6..6a403e3b4 100644
--- a/examples/confluence/confluence_trash_cleaner.py
+++ b/examples/confluence/confluence_trash_cleaner.py
@@ -18,11 +18,11 @@ def clean_pages_from_space(space_key, limit=500):
values = confluence.get_all_pages_from_space_trash(space=space_key, start=0, limit=limit, content_type="page")
if not values or len(values) == 0:
flag = False
- print("For space {} trash is empty".format(space_key))
+ print(("For space {} trash is empty".format(space_key)))
else:
- print("Found in space {} pages as trashed {}".format(space_key, len(values)))
+ print(("Found in space {} pages as trashed {}".format(space_key, len(values))))
for value in values:
- print("Removing page with title: " + value["title"])
+ print(("Removing page with title: " + value["title"]))
confluence.remove_page_from_trash(value["id"])
@@ -39,13 +39,13 @@ def clean_blog_posts_from_space(space_key, limit=500):
space=space_key, start=0, limit=limit, content_type="blogpost"
)
if values and len(values) > 0:
- print("Found in space {} pages as trashed {}".format(space_key, len(values)))
+ print(("Found in space {} pages as trashed {}".format(space_key, len(values))))
for value in values:
- print("Removing page with title: " + value["title"])
+ print(("Removing page with title: " + value["title"]))
confluence.remove_page_from_trash(value["id"])
else:
flag = False
- print("For space {} trash is empty".format(space_key))
+ print(("For space {} trash is empty".format(space_key)))
def clean_all_trash_pages_from_all_spaces():
@@ -61,7 +61,7 @@ def clean_all_trash_pages_from_all_spaces():
if space_lists and len(space_lists) != 0:
i += 1
for space_list in space_lists["results"]:
- print("Start review the space with key = " + space_list["key"])
+ print(("Start review the space with key = " + space_list["key"]))
clean_pages_from_space(space_key=space_list["key"])
clean_blog_posts_from_space(space_key=space_list["key"])
else:
diff --git a/examples/jira/jira_add_components_to_all_projects.py b/examples/jira/jira_add_components_to_all_projects.py
index 9ec143e3b..a956e5ba0 100644
--- a/examples/jira/jira_add_components_to_all_projects.py
+++ b/examples/jira/jira_add_components_to_all_projects.py
@@ -11,10 +11,10 @@
for i in jira.get_all_projects(included_archived=None):
if i["key"] in project_to_skip:
- print("Skipping project {} ".format(i["key"]))
+ print(("Skipping project {} ".format(i["key"])))
else:
for j in components:
- print("Creating in project {} ".format(i["key"]))
+ print(("Creating in project {} ".format(i["key"])))
comp = {"project": i["key"], "name": j}
jira.create_component(comp)
- print("{} - component created ".format(comp.get("name")))
+ print(("{} - component created ".format(comp.get("name"))))
diff --git a/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py b/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
index 5e90b6026..f3aedbe6b 100644
--- a/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
+++ b/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
@@ -19,7 +19,7 @@
for project in projects:
project_key = project.get("key")
- print("Start review project {}".format(project_key))
+ print(("Start review project {}".format(project_key)))
for role_id in role_ids:
actors = jira.get_project_actors_for_role_project(project_key, role_id)
for actor in actors:
@@ -29,5 +29,5 @@
continue
answer = jira.user(username)
if answer.get("errorMessages") or (not answer.get("active")):
- print("Removing from project permissions {}".format(username))
+ print(("Removing from project permissions {}".format(username)))
jira.delete_project_actors(project_key, role_id=role_id, actor=username, actor_type="user")
diff --git a/examples/jira/jira_convert_group_members_into_user_in_role.py b/examples/jira/jira_convert_group_members_into_user_in_role.py
index 130a1af65..3eba58893 100644
--- a/examples/jira/jira_convert_group_members_into_user_in_role.py
+++ b/examples/jira/jira_convert_group_members_into_user_in_role.py
@@ -13,7 +13,7 @@ def convert_group_into_users_in_role(project_key, role_id, group_name):
users = jira.get_all_users_from_group(group=group_name, limit=1000).get("values")
for user in users:
jira.add_user_into_project_role(project_key=project_key, role_id=role_id, user_name=user.get("name"))
- print("{} added into role_id {} in {}".format(user.get("name"), role_id, project_key))
+ print(("{} added into role_id {} in {}".format(user.get("name"), role_id, project_key)))
group_name_to_find = "old-developers"
@@ -27,5 +27,5 @@ def convert_group_into_users_in_role(project_key, role_id, group_name):
for member in members_of_role:
if member.get("type") == "atlassian-group-role-actor":
if member.get("name") == group_name_to_find:
- print("{} has {}".format(project.get("key"), role.get("name")))
+ print(("{} has {}".format(project.get("key"), role.get("name"))))
convert_group_into_users_in_role(project.get("key"), role.get("id"), group_name_to_find)
diff --git a/examples/jira/jira_copy_components_from_A_to_B.py b/examples/jira/jira_copy_components_from_A_to_B.py
index e035959ee..1fbfaf9e0 100644
--- a/examples/jira/jira_copy_components_from_A_to_B.py
+++ b/examples/jira/jira_copy_components_from_A_to_B.py
@@ -18,4 +18,4 @@
"assigneeType": component.get("assigneeType"),
}
jira.create_component(data)
- print("{} - component created ".format(component.get("name")))
+ print(("{} - component created ".format(component.get("name"))))
diff --git a/examples/jira/jira_dc_create_support_zips.py b/examples/jira/jira_dc_create_support_zips.py
index 4abea9b26..9692e968a 100644
--- a/examples/jira/jira_dc_create_support_zips.py
+++ b/examples/jira/jira_dc_create_support_zips.py
@@ -12,14 +12,14 @@
while True:
for task in jira.check_support_zip_status(zips_creation_task_id)["tasks"]:
if task["status"] == "IN_PROGRESS":
- print("file {} {}".format(task["fileName"], task["progressMessage"]))
+ print(("file {} {}".format(task["fileName"], task["progressMessage"])))
if task["fileName"] not in in_progress_zips:
in_progress_zips.append(task["fileName"])
else:
support_zip = jira.download_support_zip(task["fileName"])
with open(task["fileName"], "wb") as fp:
fp.write(support_zip)
- print("{} written.".format(task["fileName"]))
+ print(("{} written.".format(task["fileName"])))
if task["fileName"] in in_progress_zips:
in_progress_zips.remove(task["fileName"])
diff --git a/examples/jira/jira_download_attachments.from_issue.py b/examples/jira/jira_download_attachments.from_issue.py
index 6dc6f6cdf..9394c1e59 100644
--- a/examples/jira/jira_download_attachments.from_issue.py
+++ b/examples/jira/jira_download_attachments.from_issue.py
@@ -2,8 +2,8 @@
jira_cloud = Jira(url="", username="username", password="password")
jira_dc = Jira(url="url", token=">")
-path = "/Users/>/PycharmProjects/api_python_atlassian_features/api_python_atlassian_features/atlassian-python-api/attachments"
+path = "/Users/>/PycharmProjects/atlassian-python-api/attachments"
# JIRA DC using custom directory path
jira_dc.download_attachments_from_issue("TEST-1", path=path, cloud=False)
-# Jira cloud. Attachemtns will be saved to same director where script is being executed.
+# Jira cloud. Attachments will be saved to same director where script is being executed.
jira_cloud.get_attachments_ids_from_page("SC-1", cloud=True)
diff --git a/examples/jira/jira_download_attachments.py b/examples/jira/jira_download_attachments.py
index 1a0c10698..66d8339e3 100644
--- a/examples/jira/jira_download_attachments.py
+++ b/examples/jira/jira_download_attachments.py
@@ -33,5 +33,5 @@
if response.status_code != 200:
continue
with open(dest_folder + "/" + filename, "wb") as f:
- print("Saving for {key} the file {filename}".format(key=key, filename=filename))
+ print(("Saving for {key} the file {filename}".format(key=key, filename=filename)))
f.write(response.content)
diff --git a/examples/jira/jira_find_screen_similarity.py b/examples/jira/jira_find_screen_similarity.py
index 6ab4a4012..0d3cce724 100644
--- a/examples/jira/jira_find_screen_similarity.py
+++ b/examples/jira/jira_find_screen_similarity.py
@@ -41,7 +41,7 @@ def extract_count(json):
}
)
count_fields_per_screen.append(number_fields)
- print("Number of available screen fields {} for screen with name {}".format(number_fields, screen.get("name")))
+ print(("Number of available screen fields {} for screen with name {}".format(number_fields, screen.get("name"))))
screens.sort(key=extract_count, reverse=True)
flipped_fields = {}
@@ -49,10 +49,10 @@ def extract_count(json):
print("The same screen of fields based on the count")
for x in screens:
if count_fields_per_screen.count(x["available_fields_count"]) > 1:
- print("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"]))
+ print(("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"])))
-print("=" * 12)
+print(("=" * 12))
print("The same field screens based on the hash")
for x in screens:
if hashes.count(x["available_fields_hash"]) > 1:
- print("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"]))
+ print(("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"])))
diff --git a/examples/jira/jira_get_issue_status_changelog.py b/examples/jira/jira_get_issue_status_changelog.py
index 94fcff55d..46212e494 100644
--- a/examples/jira/jira_get_issue_status_changelog.py
+++ b/examples/jira/jira_get_issue_status_changelog.py
@@ -6,4 +6,16 @@
# example use
jira_cloud.get_issue_status_changelog("TEST-1")
# example output:
-# [{'from': 'Closed', 'to': 'In Progress', 'date': '2024-03-17T17:22:29.524-0500'}, {'from': 'In Progress', 'to': 'Closed', 'date': '2024-03-17T14:33:07.317-0500'}, {'from': 'In Progress', 'to': 'In Progress', 'date': '2024-03-16T09:25:52.033-0500'}, {'from': 'To Do', 'to': 'In Progress', 'date': '2024-03-14T19:25:02.511-0500'}]
+# [
+# {'from': 'Closed',
+# 'to': 'In Progress',
+# 'date': '2024-03-17T17:22:29.524-0500'},
+# {'from': 'In Progress',
+# 'to': 'Closed',
+# 'date': '2024-03-17T14:33:07.317-0500'},
+# {'from': 'In Progress',
+# 'to': 'In Progress',
+# 'date': '2024-03-16T09:25:52.033-0500'},
+# {'from': 'To Do',
+# 'to': 'In Progress',
+# 'date': '2024-03-14T19:25:02.511-0500'}]
diff --git a/examples/jira/jira_get_issue_tree_recursive.py b/examples/jira/jira_get_issue_tree_recursive.py
index b8a971afa..07e001a55 100644
--- a/examples/jira/jira_get_issue_tree_recursive.py
+++ b/examples/jira/jira_get_issue_tree_recursive.py
@@ -30,22 +30,28 @@
# print(output) will return:
-# [{'INTEGRTEST-2': 'TEST-1'}, {'INTEGRTEST-2': 'INTEGRTEST-3'}, {'INTEGRTEST-2': 'INTEGRTEST-4'}, {'INTEGRTEST-4': 'INTEGRTEST-6'}]
+# [
+# {'INTEGRTEST-2': 'TEST-1'},
+# {'INTEGRTEST-2': 'INTEGRTEST-3'},
+# {'INTEGRTEST-2': 'INTEGRTEST-4'},
+# {'INTEGRTEST-4': 'INTEGRTEST-6'}
+# ]
# now we can use this output to create a graph representation of the tree:
def print_tree(node, dict_list, level=0):
- children = [value for dict_item in dict_list for key, value in dict_item.items() if key == node]
- print(" " * level + node)
+ children = [value for dict_item in dict_list for key, value in list(dict_item.items()) if key == node]
+ print((" " * level + node))
for child in children:
print_tree(child, dict_list, level + 1)
-# or use this input to create a visualisation using networkx and matplotlib librarries or some js library like recharts or vis.js
+# or use this input to create a visualisation using networkx and matplotlib librarries or
+# some js library like recharts or vis.js
def make_graph(dict_list):
# Create a new directed graph
G = nx.DiGraph()
# Add an edge to the graph for each key-value pair in each dictionary
for d in dict_list:
- for key, value in d.items():
+ for key, value in list(d.items()):
G.add_edge(key, value)
# Generate a layout for the nodes
diff --git a/examples/jira/jira_index_fixer.py b/examples/jira/jira_index_fixer.py
index cdcf4a4e6..81fb4c7a1 100644
--- a/examples/jira/jira_index_fixer.py
+++ b/examples/jira/jira_index_fixer.py
@@ -17,15 +17,15 @@ def deindex_issue(self, issue_id):
s = IndexFixer(url=JIRA_NODE_URL, username=JIRA_LOGIN, password=JIRA_PASSWD)
response = s.index_checker()
-print("-" * 20)
+print(("-" * 20))
pprint(response)
-print("-" * 20)
+print(("-" * 20))
fixer = False
index_orphant_issues_count = response["indexOrphansCount"]
if index_orphant_issues_count > 0:
index_orphant_issues = response["indexOrphans"]
for ticket in index_orphant_issues:
ticket_id = ticket["issueId"]
- print("Orphan index for ticket id = {}".format(ticket_id))
+ print(("Orphan index for ticket id = {}".format(ticket_id)))
if fixer:
s.deindex_issue(ticket_id)
diff --git a/examples/jira/jira_issue_type_counter.py b/examples/jira/jira_issue_type_counter.py
index d6f0bee84..9ce0497a6 100644
--- a/examples/jira/jira_issue_type_counter.py
+++ b/examples/jira/jira_issue_type_counter.py
@@ -4,7 +4,7 @@
issue_types = jira.get_issue_types()
print("Enter projects category:")
-category = input()
+category = eval(input())
for i in issue_types:
issue_type = i["name"]
@@ -17,4 +17,4 @@
else:
percent_of_deprecated = 0
percentage = round(percent_of_deprecated, 1)
- print("{0}, {1}, {2}% of {3}".format(issue_type, number, percentage, category))
+ print(("{0}, {1}, {2}% of {3}".format(issue_type, number, percentage, category)))
diff --git a/examples/jira/jira_issue_update_epic_link.py b/examples/jira/jira_issue_update_epic_link.py
index f4169d2e9..619fa8e0b 100644
--- a/examples/jira/jira_issue_update_epic_link.py
+++ b/examples/jira/jira_issue_update_epic_link.py
@@ -12,7 +12,7 @@ def main():
target_epic_issue_key = "ARA-1314"
for issue_key in update_issues:
jira.update_issue_field(issue_key, fields={epic_link_custom_field_id: target_epic_issue_key})
- print("updated for {}".format(issue_key))
+ print(("updated for {}".format(issue_key)))
print("done")
diff --git a/examples/jira/jira_jql_fetcher_as_weekly_report.py b/examples/jira/jira_jql_fetcher_as_weekly_report.py
index bfdf430d8..8d00d2101 100644
--- a/examples/jira/jira_jql_fetcher_as_weekly_report.py
+++ b/examples/jira/jira_jql_fetcher_as_weekly_report.py
@@ -29,7 +29,7 @@ def __fetch_user_activity(self, user):
limit = 10
step = 0
jql = "((assignee was in ({})) OR assignee in ({})) AND updated > -{}d ".format(user, user, self.days)
- print("Start fetching info jql = {}".format(jql))
+ print(("Start fetching info jql = {}".format(jql)))
while flag:
try:
response = self.jira.jql(
@@ -89,7 +89,7 @@ def console_output(self, delimiter="|", console=True):
number = 1
data = []
for case in self.cases:
- print("Processing case #{}".format(number))
+ print(("Processing case #{}".format(number)))
output = [
case.get("actor"),
case.get("key"),
diff --git a/examples/jira/jira_notification_schemes_duplicates.py b/examples/jira/jira_notification_schemes_duplicates.py
index bee7c5f0d..08ab4d124 100644
--- a/examples/jira/jira_notification_schemes_duplicates.py
+++ b/examples/jira/jira_notification_schemes_duplicates.py
@@ -51,7 +51,7 @@ def review():
all_notification_schemes_dict[names[j]],
print_diffs=show_diffs,
):
- print("| same |", names[i], " | ", names[j], "|")
+ print(("| same |", names[i], " | ", names[j], "|"))
if __name__ == "__main__":
diff --git a/examples/jira/jira_project_leaders.py b/examples/jira/jira_project_leaders.py
index 16ac91970..3b46a69ee 100644
--- a/examples/jira/jira_project_leaders.py
+++ b/examples/jira/jira_project_leaders.py
@@ -24,10 +24,10 @@
print("|| Project Key || Project Name || Ask for Access ||")
for project in jira.project_leaders():
- print(
+ print((
"| {project_key} | {project_name} | {lead_email_link} |".format(
project_key=project["project_key"],
project_name=project["project_name"],
lead_email_link=MAILTO.format(lead_name=project["lead_name"], lead_email=project["lead_email"]),
)
- )
+ ))
diff --git a/examples/jira/jira_project_security_level_checker.py b/examples/jira/jira_project_security_level_checker.py
index 60d781099..d15093947 100644
--- a/examples/jira/jira_project_security_level_checker.py
+++ b/examples/jira/jira_project_security_level_checker.py
@@ -18,4 +18,4 @@
except Exception as e:
log.error(e)
value = "None"
- print(project_key + " has issue security scheme " + value)
+ print((project_key + " has issue security scheme " + value))
diff --git a/examples/jira/jira_review_groups.py b/examples/jira/jira_review_groups.py
index 75ddfaf65..2a65bc811 100644
--- a/examples/jira/jira_review_groups.py
+++ b/examples/jira/jira_review_groups.py
@@ -74,7 +74,7 @@ def exclude_inactive_users(groups):
"""
for group in groups:
for user in group["users"]:
- print("Trying to delete {} from group {}".format(user["name"], group["group_name"]))
+ print(("Trying to delete {} from group {}".format(user["name"], group["group_name"])))
jira.remove_user_from_group(user["name"], group["group_name"])
return True
diff --git a/examples/jira/jira_scrap_regex_from_issue.py b/examples/jira/jira_scrap_regex_from_issue.py
index ee7f278a1..612c9bbe7 100644
--- a/examples/jira/jira_scrap_regex_from_issue.py
+++ b/examples/jira/jira_scrap_regex_from_issue.py
@@ -2,7 +2,8 @@
# This feature can be useful if you need to scrap some data from issue description or comments.
jira = Jira(url="http://localhost:8080", username="admin", password="admin")
-regex = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\[?\.\]?){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" # regex for ipv4 address + ipv4 with [.] instead of dot
+regex = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\[?\.\]?){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
+# regex for ipv4 address + ipv4 with [.] instead of dot
issue = "TEST-1" # id of the jira issue
result = jira.scrap_regex_from_issue(issue, regex)
# scrap_regex_from_issue will return results of positive regexes matches from issue description and issue comments.
diff --git a/examples/jira/jira_tempo_account_customers.py b/examples/jira/jira_tempo_account_customers.py
index 8d4e0a13f..e0a71a277 100644
--- a/examples/jira/jira_tempo_account_customers.py
+++ b/examples/jira/jira_tempo_account_customers.py
@@ -4,7 +4,7 @@
jira = Jira(url="http://localhost:8080", username="admin", password="admin")
results = jira.tempo_account_get_customers()
-print("Count of Customers " + str(len(results)))
+print(("Count of Customers " + str(len(results))))
for result in results:
- print(result.get("key"), " ", result.get("name"))
+ print((result.get("key"), " ", result.get("name")))
diff --git a/tests/mockup.py b/tests/mockup.py
index 65d1a8b61..c417d466f 100644
--- a/tests/mockup.py
+++ b/tests/mockup.py
@@ -19,7 +19,7 @@ def request_mockup(*args, **kwargs):
url = kwargs["url"]
if not url.startswith(SERVER + "/"):
raise ValueError("URL [{}] does not start with [{}/].".format(url, SERVER))
- parts = url[len(SERVER) + 1 :].split("?")
+ parts = url[len(SERVER) + 1:].split("?")
url = parts[0]
response_key = parts[1] if len(parts) > 1 else None
if kwargs["data"] is not None:
@@ -48,7 +48,7 @@ def request_mockup(*args, **kwargs):
for elem in data["values"] if "values" in data else [data]:
cur_dict = elem if item is None else elem.get(item, {})
if "links" in cur_dict:
- for link in cur_dict["links"].values():
+ for link in list(cur_dict["links"].values()):
for ld in link if type(link) is list else [link]:
ld["href"] = "{}/{}".format(SERVER, ld["href"])
if "next" in data:
diff --git a/tests/test_bitbucket_server_oo.py b/tests/test_bitbucket_server_oo.py
index 3b1e1e735..a5bf3c19d 100644
--- a/tests/test_bitbucket_server_oo.py
+++ b/tests/test_bitbucket_server_oo.py
@@ -177,7 +177,7 @@ def test_repositories(self):
"My repo 3 description",
], "Each repo description"
- print(list(project.repos.each()))
+ print((list(project.repos.each())))
assert project.repos.exists("my-repo1-slug"), "Repo exists by slug"
From 730f79e24417b4f6468aeecf49becdc159e7b8b3 Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Sat, 22 Mar 2025 00:22:57 +0200
Subject: [PATCH 3/6] f-stringify part 2
---
examples/bamboo/bamboo_label_based_cleaner.py | 16 +++++++---------
.../bamboo/bamboo_remove_old_failed_results.py | 8 ++++----
...bamboo_remove_unknown_status_build_results.py | 8 ++++----
.../bamboo/bamboo_trigger_builds_console_app.py | 4 ++--
.../bitbucket/bitbucket_check_last_auth_users.py | 4 ++--
.../bitbucket/bitbucket_clean_jira_branches.py | 2 +-
.../bitbucket/bitbucket_manage_pull_request.py | 16 ++++++++--------
examples/bitbucket/bitbucket_oauth2.py | 2 +-
examples/bitbucket/stash_user_auth_report.py | 4 +---
.../confluence/confluence_attach_file_as_link.py | 8 +++-----
.../confluence_check_unknown_attachment_error.py | 4 ++--
.../confluence/confluence_draft_page_cleaner.py | 4 ++--
examples/confluence/confluence_nested_error.py | 2 +-
.../confluence_page_versions_cleaner.py | 9 +++------
examples/confluence/confluence_search_cql.py | 4 ++--
examples/confluence/confluence_trash_cleaner.py | 8 ++++----
.../jira/jira_add_components_to_all_projects.py | 6 +++---
17 files changed, 50 insertions(+), 59 deletions(-)
diff --git a/examples/bamboo/bamboo_label_based_cleaner.py b/examples/bamboo/bamboo_label_based_cleaner.py
index 44419fad7..a30f9607f 100644
--- a/examples/bamboo/bamboo_label_based_cleaner.py
+++ b/examples/bamboo/bamboo_label_based_cleaner.py
@@ -31,19 +31,19 @@ def get_plans_from_project(project_key):
if __name__ == "__main__":
bamboo = Bamboo(url=BAMBOO_URL, username=BAMBOO_LOGIN, password=BAMBOO_PASSWORD, timeout=180)
projects = get_all_projects()
- print(("Start analyzing the {} projects".format(len(projects))))
+ print((f"Start analyzing the {len(projects)} projects"))
for project in projects:
- print(("Inspecting {} project".format(project)))
+ print((f"Inspecting {project} project"))
plans = get_plans_from_project(project)
- print(("Start analyzing the {} plans".format(len(plans))))
+ print((f"Start analyzing the {len(plans)} plans"))
for plan in plans:
- print(("Inspecting {} plan".format(plan)))
+ print((f"Inspecting {plan} plan"))
build_results = [
x for x in bamboo.results(plan_key=plan, label=LABEL, max_results=100, include_all_states=True)
]
for build in build_results:
build_key = build.get("buildResultKey") or None
- print(("Inspecting {} build".format(build_key)))
+ print((f"Inspecting {build_key} build"))
build_value = bamboo.build_result(build_key)
build_complete_time = build_value.get("buildCompletedTime") or None
if not build_complete_time:
@@ -51,10 +51,8 @@ def get_plans_from_project(project_key):
datetimeObj = datetime.strptime(build_complete_time.split("+")[0] + "000", "%Y-%m-%dT%H:%M:%S.%f")
if datetime.now() > datetimeObj + timedelta(days=OLDER_DAYS):
print((
- "Build is old {} as build complete date {}".format(
- build_key, build_complete_time.strftime("%Y-%m-%d")
- )
+ f"Build is old {build_key} as build complete date {build_complete_time.strftime('%Y-%m-%d')}"
))
if not DRY_RUN:
- print(("Removing {} build".format(build_key)))
+ print((f"Removing {build_key} build"))
bamboo.delete_build_result(build_key)
diff --git a/examples/bamboo/bamboo_remove_old_failed_results.py b/examples/bamboo/bamboo_remove_old_failed_results.py
index d35deee8b..4ba378bf5 100644
--- a/examples/bamboo/bamboo_remove_old_failed_results.py
+++ b/examples/bamboo/bamboo_remove_old_failed_results.py
@@ -43,20 +43,20 @@ def remove_build_result(build_key, status):
datetime_obj = datetime.strptime(build_complete_time.split("+")[0] + "000", "%Y-%m-%dT%H:%M:%S.%f")
if datetime.now() > datetime_obj + timedelta(days=OLDER_DAYS):
if build_value.get("buildState") == status:
- print(("Removing build result - {}".format(build_key)))
+ print((f"Removing build result - {build_key}"))
if not DRY_RUN:
bamboo.delete_build_result(build_key=build_key)
def project_review(plans):
for plan in plans:
- print(("Inspecting {} plan".format(plan)))
+ print((f"Inspecting {plan} plan"))
branches = get_branches_from_plan(plan)
for branch in branches:
build_results = get_results_from_branch(branch)
for build in build_results:
build_key = build.get("buildResultKey") or None
- print(("Inspecting build - {}".format(build_key)))
+ print((f"Inspecting build - {build_key}"))
if build_key:
for status in STATUS_CLEANED_RESULTS:
remove_build_result(build_key=build_key, status=status)
@@ -68,7 +68,7 @@ def project_review(plans):
for project in projects:
if project in EXCLUDED_PROJECTS:
continue
- print(("Inspecting project - {}".format(project)))
+ print((f"Inspecting project - {project}"))
results = []
all_plans_of_project = get_plans_from_project(project)
project_review(plans=all_plans_of_project)
diff --git a/examples/bamboo/bamboo_remove_unknown_status_build_results.py b/examples/bamboo/bamboo_remove_unknown_status_build_results.py
index d0d7210f1..342f6823f 100755
--- a/examples/bamboo/bamboo_remove_unknown_status_build_results.py
+++ b/examples/bamboo/bamboo_remove_unknown_status_build_results.py
@@ -35,20 +35,20 @@ def get_results_from_branch(plan_key):
def remove_build_result(build_key, status):
result = bamboo.build_result(build_key=build_key)
if result.get("buildState") == status:
- print(("Removing build result - {}".format(build_key)))
+ print(f"Removing build result - {build_key}")
if REMOVE:
bamboo.delete_build_result(build_key=build_key)
def project_review(plans):
for plan in plans:
- print(("Inspecting {} plan".format(plan)))
+ print((f"Inspecting {plan} plan"))
branches = get_branches_from_plan(plan)
for branch in branches:
build_results = get_results_from_branch(branch)
for build in build_results:
build_key = build.get("buildResultKey") or None
- print(("Inspecting build - {}".format(build_key)))
+ print(f"Inspecting build - {build_key}")
if build_key:
for status in STATUS_CLEANED_RESULTS:
remove_build_result(build_key=build_key, status=status)
@@ -60,7 +60,7 @@ def project_review(plans):
for project in projects:
if project in EXCLUDED_PROJECTS:
continue
- print(("Inspecting project - {}".format(project)))
+ print(f"Inspecting project - {project}")
results = []
all_plans_of_project = get_plans_from_project(project)
project_review(plans=all_plans_of_project)
diff --git a/examples/bamboo/bamboo_trigger_builds_console_app.py b/examples/bamboo/bamboo_trigger_builds_console_app.py
index a86bd4cfa..baf3060f9 100644
--- a/examples/bamboo/bamboo_trigger_builds_console_app.py
+++ b/examples/bamboo/bamboo_trigger_builds_console_app.py
@@ -25,9 +25,9 @@ def execute_build(build_key, params):
params: dict
"""
started_build = bamboo.execute_build(build_key, **params)
- logging.info("Build execution status: {}".format(started_build.status_code))
+ logging.info(f"Build execution status: {started_build.status_code}")
if started_build.status_code == 200:
- logging.info("Build key: {}".format(started_build.json().get("buildResultKey")))
+ logging.info(f"Build key: {started_build.json().get('buildResultKey')}")
logging.info(started_build.json().get("link", {}).get("href"))
else:
logging.error("Execution failed!")
diff --git a/examples/bitbucket/bitbucket_check_last_auth_users.py b/examples/bitbucket/bitbucket_check_last_auth_users.py
index 343cf42f7..584b7492b 100644
--- a/examples/bitbucket/bitbucket_check_last_auth_users.py
+++ b/examples/bitbucket/bitbucket_check_last_auth_users.py
@@ -25,11 +25,11 @@ def report(all=False, non_auth=False, limit=20):
else:
full_date = None
if full_date:
- output = "{} ({}) authenticated on {}".format(user.get("displayName"), user.get("emailAddress"), full_date)
+ output = f"{user.get('displayName')} ({user.get('emailAddress')}) authenticated on {full_date}"
if all:
print(output)
else:
- output = "{} ({}) not authenticated yet".format(user.get("displayName"), user.get("emailAddress"))
+ output = f"{user.get('displayName')} ({user.get('emailAddress')}) not authenticated yet"
if non_auth or all:
print(output)
diff --git a/examples/bitbucket/bitbucket_clean_jira_branches.py b/examples/bitbucket/bitbucket_clean_jira_branches.py
index 7eb83954f..cb693a6f2 100644
--- a/examples/bitbucket/bitbucket_clean_jira_branches.py
+++ b/examples/bitbucket/bitbucket_clean_jira_branches.py
@@ -96,7 +96,7 @@ def is_can_removed_branch(branch_candidate):
name=display_id,
end_point=branch["latestCommit"],
)
- log.write("{},{},{}\n".format(display_id, last_date_commit, True))
+ log.write(f"{display_id},{last_date_commit},{True}\n")
step += 1
log.close()
print("Done")
diff --git a/examples/bitbucket/bitbucket_manage_pull_request.py b/examples/bitbucket/bitbucket_manage_pull_request.py
index 7dbd8e378..faee28cba 100644
--- a/examples/bitbucket/bitbucket_manage_pull_request.py
+++ b/examples/bitbucket/bitbucket_manage_pull_request.py
@@ -6,21 +6,21 @@
pr = bitbucket.get_pullrequest("project_name", "repository_name", pr_id)
ver = pr.json().get("version")
-print(("PR version: {}".format(ver)))
+print(f"PR version: {ver}")
response = bitbucket.decline_pull_request("project_name", "repository_name", pr_id, ver)
-print(("Declined: {}".format(response)))
+print(f"Declined: {response}")
ver = response.json().get("version")
-print(("PR version: {}".format(ver)))
+print(f"PR version: {ver}")
response = bitbucket.reopen_pull_request("project_name", "repository_name", pr_id, ver)
-print(("Reopen: {}".format(response)))
+print(f"Reopen: {response}")
ver = response.json().get("version")
-print(("PR version: {}".format(ver)))
+print(f"PR version: {ver}")
response = bitbucket.is_pull_request_can_be_merged("project_name", "repository_name", pr_id)
-print(("Reopen: {}".format(response)))
-print(("PR version: {}".format(ver)))
+print(f"Reopen: {response}")
+print(f"PR version: {ver}")
response = bitbucket.merge_pull_request("project_name", "repository_name", pr_id, ver)
-print(("Merged: {}".format(response)))
+print(f"Merged: {response}")
diff --git a/examples/bitbucket/bitbucket_oauth2.py b/examples/bitbucket/bitbucket_oauth2.py
index 13b045d32..72b52a9cc 100644
--- a/examples/bitbucket/bitbucket_oauth2.py
+++ b/examples/bitbucket/bitbucket_oauth2.py
@@ -43,7 +43,7 @@ def callback():
bitbucket = OAuth2Session(client_id, state=session["oauth_state"])
token = bitbucket.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url)
- return "Token: {}Workspaces: {}".format(token, ", ".join(get_workspaces(token)))
+ return f"Token: {token}Workspaces: {', '.join(get_workspaces(token))}"
# 4. Token used for Bitbucket Python API
diff --git a/examples/bitbucket/stash_user_auth_report.py b/examples/bitbucket/stash_user_auth_report.py
index 94de8a8ca..f27f7a74e 100644
--- a/examples/bitbucket/stash_user_auth_report.py
+++ b/examples/bitbucket/stash_user_auth_report.py
@@ -29,9 +29,7 @@ def report(limit=200, include_in_active=False):
else:
full_date = None
if include_in_active or user.get("active"):
- output = "|{}|{}|{}|{}|".format(
- user.get("active"), user.get("displayName"), user.get("emailAddress"), full_date
- )
+ output = f"|{user.get('active')}|{user.get('displayName')}|{user.get('emailAddress')}|{full_date}|"
print(output)
diff --git a/examples/confluence/confluence_attach_file_as_link.py b/examples/confluence/confluence_attach_file_as_link.py
index 3c102715c..b7c2d138a 100644
--- a/examples/confluence/confluence_attach_file_as_link.py
+++ b/examples/confluence/confluence_attach_file_as_link.py
@@ -18,12 +18,10 @@
confluence.attach_file(filename, page_id="123456789")
-link = """
+link = f"""
-
+
-
""".format(
- filename
-)
+
"""
confluence.append_page(123456789, "Page Title", link)
diff --git a/examples/confluence/confluence_check_unknown_attachment_error.py b/examples/confluence/confluence_check_unknown_attachment_error.py
index 1e8d341a4..75db02cfb 100644
--- a/examples/confluence/confluence_check_unknown_attachment_error.py
+++ b/examples/confluence/confluence_check_unknown_attachment_error.py
@@ -33,7 +33,7 @@ def check_unknown_attachment_in_space(space_key):
:return:
"""
page_ids = get_all_pages_ids(space_key)
- print(("Start review pages {} in {}".format(len(page_ids), space_key)))
+ print(f"Start review pages {len(page_ids)} in {space_key}")
for page_id in page_ids:
link = confluence.has_unknown_attachment_error(page_id)
if len(link) > 0:
@@ -43,5 +43,5 @@ def check_unknown_attachment_in_space(space_key):
if __name__ == "__main__":
space_list = confluence.get_all_spaces()
for space in space_list:
- print(("Start review {} space".format(space["key"])))
+ print(f"Start review {space['key']} space")
check_unknown_attachment_in_space(space["key"])
diff --git a/examples/confluence/confluence_draft_page_cleaner.py b/examples/confluence/confluence_draft_page_cleaner.py
index be6f6ebc6..70332e5e1 100644
--- a/examples/confluence/confluence_draft_page_cleaner.py
+++ b/examples/confluence/confluence_draft_page_cleaner.py
@@ -46,11 +46,11 @@ def clean_all_draft_pages_from_all_spaces(days=30):
if space_lists and len(space_lists) != 0:
i += 1
for space_list in space_lists:
- print(("Start review the space {}".format(space_list["key"])))
+ print(f"Start review the space {space_list['key']}")
count = clean_draft_pages_from_space(space_key=space_list["key"], count=count, date_now=date_now)
else:
flag = False
- print(("Script has removed {count} draft pages older than {days} days".format(count=count, days=days)))
+ print(f"Script has removed {count} draft pages older than {days} days")
if __name__ == "__main__":
diff --git a/examples/confluence/confluence_nested_error.py b/examples/confluence/confluence_nested_error.py
index 4d4031a6e..f8efa1138 100644
--- a/examples/confluence/confluence_nested_error.py
+++ b/examples/confluence/confluence_nested_error.py
@@ -11,6 +11,6 @@
)
result = confluence.get_user_details_by_username(username="gonchik.tsymzhitov", expand="status")
except ApiError as e:
- print(("FAILURE: {}, caused by {}".format(e, e.reason if e.reason is not None else "unknown reason")))
+ print(f"FAILURE: {e}, caused by {e.reason if e.reason is not None else 'unknown reason'}")
else:
print(result)
diff --git a/examples/confluence/confluence_page_versions_cleaner.py b/examples/confluence/confluence_page_versions_cleaner.py
index f6090bba5..1614046d7 100644
--- a/examples/confluence/confluence_page_versions_cleaner.py
+++ b/examples/confluence/confluence_page_versions_cleaner.py
@@ -14,10 +14,7 @@ def page_version_remover(content_id, remained_page_numbers):
latest_version_count = int(response.get("lastUpdated").get("number"))
if len(response) > 0 and latest_version_count > remained_page_numbers:
print((
- "Number of {} latest version {}".format(
- confluence.url_joiner(confluence.url, "/pages/viewpage.action?pageId=" + content_id),
- latest_version_count,
- )
+ f"Number of {confluence.url_joiner(confluence.url, '/pages/viewpage.action?pageId=' + content_id)} latest version {latest_version_count}"
))
for version_page_counter in range(1, (latest_version_count - remained_page_numbers + 1), 1):
confluence.remove_content_history(content_id, 1)
@@ -45,7 +42,7 @@ def get_all_page_ids_from_space(space):
for value in values:
print(("Retrieve page with title: " + value["title"]))
content_ids.append((value["id"]))
- print(("Found in space {} pages {}".format(space, len(content_ids))))
+ print(f"Found in space {space} pages {len(content_ids)}")
return content_ids
@@ -82,7 +79,7 @@ def reduce_page_numbers(page_id, remained_page_history_count):
space_keys = get_all_spaces()
counter = 0
for space_key in space_keys:
- print(("Starting review space with key {}".format(space_key)))
+ print(f"Starting review space with key {space_key}")
page_ids = get_all_page_ids_from_space(space_key)
for page_id in page_ids:
reduce_page_numbers(page_id=page_id, remained_page_history_count=REMAINED_PAGE_HISTORY_COUNT)
diff --git a/examples/confluence/confluence_search_cql.py b/examples/confluence/confluence_search_cql.py
index c9afaec8e..5f009e3ef 100644
--- a/examples/confluence/confluence_search_cql.py
+++ b/examples/confluence/confluence_search_cql.py
@@ -16,7 +16,7 @@ def search_word(word):
:param word:
:return: json answer
"""
- cql = "siteSearch ~ {} order by created".format(word)
+ cql = f"siteSearch ~ {word} order by created"
answers = confluence.cql(cql)
for answer in answers.get("results"):
print(answer)
@@ -29,7 +29,7 @@ def search_word_in_space(space, word):
:param word:
:return: json answer
"""
- cql = "space.key={} and (text ~ {})".format(space, word)
+ cql = f"space.key={space} and (text ~ {word})"
answers = confluence.cql(cql, expand="space,body.view")
for answer in answers.get("results"):
print(answer)
diff --git a/examples/confluence/confluence_trash_cleaner.py b/examples/confluence/confluence_trash_cleaner.py
index 6a403e3b4..c7bf593f0 100644
--- a/examples/confluence/confluence_trash_cleaner.py
+++ b/examples/confluence/confluence_trash_cleaner.py
@@ -18,9 +18,9 @@ def clean_pages_from_space(space_key, limit=500):
values = confluence.get_all_pages_from_space_trash(space=space_key, start=0, limit=limit, content_type="page")
if not values or len(values) == 0:
flag = False
- print(("For space {} trash is empty".format(space_key)))
+ print(f"For space {space_key} trash is empty")
else:
- print(("Found in space {} pages as trashed {}".format(space_key, len(values))))
+ print(f"Found in space {space_key} pages as trashed {len(values)}")
for value in values:
print(("Removing page with title: " + value["title"]))
confluence.remove_page_from_trash(value["id"])
@@ -39,13 +39,13 @@ def clean_blog_posts_from_space(space_key, limit=500):
space=space_key, start=0, limit=limit, content_type="blogpost"
)
if values and len(values) > 0:
- print(("Found in space {} pages as trashed {}".format(space_key, len(values))))
+ print(f"Found in space {space_key} pages as trashed {len(values)}")
for value in values:
print(("Removing page with title: " + value["title"]))
confluence.remove_page_from_trash(value["id"])
else:
flag = False
- print(("For space {} trash is empty".format(space_key)))
+ print(f"For space {space_key} trash is empty")
def clean_all_trash_pages_from_all_spaces():
diff --git a/examples/jira/jira_add_components_to_all_projects.py b/examples/jira/jira_add_components_to_all_projects.py
index a956e5ba0..5759ee274 100644
--- a/examples/jira/jira_add_components_to_all_projects.py
+++ b/examples/jira/jira_add_components_to_all_projects.py
@@ -11,10 +11,10 @@
for i in jira.get_all_projects(included_archived=None):
if i["key"] in project_to_skip:
- print(("Skipping project {} ".format(i["key"])))
+ print((f"Skipping project {i['key']} "))
else:
for j in components:
- print(("Creating in project {} ".format(i["key"])))
+ print((f"Creating in project {i['key']} "))
comp = {"project": i["key"], "name": j}
jira.create_component(comp)
- print(("{} - component created ".format(comp.get("name"))))
+ print((f"{comp.get('name')} - component created "))
From 95d2a08276cd25fc55fdb64935f36acf81c535fe Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Sat, 22 Mar 2025 00:25:11 +0200
Subject: [PATCH 4/6] f-stringify part 2
---
atlassian/jira.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/atlassian/jira.py b/atlassian/jira.py
index 079b19511..14841d18b 100644
--- a/atlassian/jira.py
+++ b/atlassian/jira.py
@@ -5016,9 +5016,7 @@ def set_agile_board_property(self, board_id, property_key):
:param property_key:
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/properties/{propertyKey}".format(
- boardId=board_id, propertyKey=property_key
- )
+ url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
return self.put(url)
def get_agile_board_property(self, board_id, property_key):
From d24d6086faf8d104a39bf4efa9d2fc1f3d30da24 Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Sat, 22 Mar 2025 15:08:20 +0200
Subject: [PATCH 5/6] black polish
---
.../bitbucket/cloud/repositories/__init__.py | 12 +++------
.../bitbucket/cloud/workspaces/permissions.py | 4 +--
atlassian/confluence.py | 26 ++++++++-----------
atlassian/jira.py | 4 +--
examples/bamboo/bamboo_label_based_cleaner.py | 6 ++---
.../confluence_page_versions_cleaner.py | 8 +++---
examples/jira/jira_project_leaders.py | 14 +++++-----
tests/mockup.py | 2 +-
8 files changed, 33 insertions(+), 43 deletions(-)
diff --git a/atlassian/bitbucket/cloud/repositories/__init__.py b/atlassian/bitbucket/cloud/repositories/__init__.py
index 3e4a0b401..d3063102e 100644
--- a/atlassian/bitbucket/cloud/repositories/__init__.py
+++ b/atlassian/bitbucket/cloud/repositories/__init__.py
@@ -255,9 +255,7 @@ 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)
- self.__branch_restrictions = BranchRestrictions(
- f"{self.url}/branch-restrictions", **self._new_session_args
- )
+ self.__branch_restrictions = BranchRestrictions(f"{self.url}/branch-restrictions", **self._new_session_args)
self.__branches = Branches(f"{self.url}/refs/branches", **self._new_session_args)
self.__commits = Commits(
f"{self.url}/commits",
@@ -270,12 +268,8 @@ def __init__(self, data, *args, **kwargs):
**self._new_session_args
) # fmt: skip
self.__default_reviewers = DefaultReviewers(f"{self.url}/default-reviewers", **self._new_session_args)
- self.__deployment_environments = DeploymentEnvironments(
- f"{self.url}/environments", **self._new_session_args
- )
- self.__group_permissions = GroupPermissions(
- f"{self.url}/permissions-config/groups", **self._new_session_args
- )
+ self.__deployment_environments = DeploymentEnvironments(f"{self.url}/environments", **self._new_session_args)
+ self.__group_permissions = GroupPermissions(f"{self.url}/permissions-config/groups", **self._new_session_args)
self.__issues = Issues(f"{self.url}/issues", **self._new_session_args)
self.__pipelines = Pipelines(f"{self.url}/pipelines", **self._new_session_args)
self.__pullrequests = PullRequests(f"{self.url}/pullrequests", **self._new_session_args)
diff --git a/atlassian/bitbucket/cloud/workspaces/permissions.py b/atlassian/bitbucket/cloud/workspaces/permissions.py
index 3d1c4ff58..82040d945 100644
--- a/atlassian/bitbucket/cloud/workspaces/permissions.py
+++ b/atlassian/bitbucket/cloud/workspaces/permissions.py
@@ -48,9 +48,7 @@ def each(self, q=None, sort=None, pagelen=10):
return
def repositories(self, repo_slug="", pagelen=10):
- for permissions in self._get_paged(
- f"repositories/{repo_slug}", trailing=True, params={"pagelen": pagelen}
- ):
+ for permissions in self._get_paged(f"repositories/{repo_slug}", trailing=True, params={"pagelen": pagelen}):
yield self.__get_object_repository_permission(permissions)
diff --git a/atlassian/confluence.py b/atlassian/confluence.py
index d882cf3a7..e7d04f4f9 100644
--- a/atlassian/confluence.py
+++ b/atlassian/confluence.py
@@ -2762,14 +2762,16 @@ def get_atl_request(url: str):
+ space_key
)
if export_type == "csv":
- form_data = dict(atl_token=get_atl_request(
- f"spaces/exportspacecsv.action?key={space_key}"
- ), exportType="TYPE_CSV", contentOption="all", includeComments="true", confirm="Export")
+ form_data = dict(
+ atl_token=get_atl_request(f"spaces/exportspacecsv.action?key={space_key}"),
+ exportType="TYPE_CSV",
+ contentOption="all",
+ includeComments="true",
+ confirm="Export",
+ )
elif export_type == "html":
form_data = {
- "atl_token": get_atl_request(
- f"spaces/exportspacehtml.action?key={space_key}"
- ),
+ "atl_token": get_atl_request(f"spaces/exportspacehtml.action?key={space_key}"),
"exportType": "TYPE_HTML",
"contentOption": "visibleOnly",
"includeComments": "true",
@@ -2777,9 +2779,7 @@ def get_atl_request(url: str):
}
elif export_type == "xml":
form_data = {
- "atl_token": get_atl_request(
- f"spaces/exportspacexml.action?key={space_key}"
- ),
+ "atl_token": get_atl_request(f"spaces/exportspacexml.action?key={space_key}"),
"exportType": "TYPE_XML",
"contentOption": "all",
"includeComments": "true",
@@ -2791,9 +2791,7 @@ def get_atl_request(url: str):
return self.get_pdf_download_url_for_confluence_cloud(url)
else:
raise ValueError("Invalid export_type parameter value. Valid values are: 'html/csv/xml/pdf'")
- url = self.url_joiner(
- url=self.url, path=f"spaces/doexportspace.action?key={space_key}"
- )
+ url = self.url_joiner(url=self.url, path=f"spaces/doexportspace.action?key={space_key}")
# Sending a POST request that triggers the space export.
response = self.session.post(url, headers=self.form_token_headers, data=form_data)
@@ -3103,9 +3101,7 @@ def get_pdf_download_url_for_confluence_cloud(self, url):
log.debug("Extract task results to download PDF.")
task_result_url = progress_response.get("result")
else:
- log.info(
- f"{percentage_complete}% - {task_state}"
- )
+ log.info(f"{percentage_complete}% - {task_state}")
time.sleep(3)
log.debug("Task successfully done, querying the task result for the download url")
# task result url starts with /wiki, remove it.
diff --git a/atlassian/jira.py b/atlassian/jira.py
index 14841d18b..ac46246f7 100644
--- a/atlassian/jira.py
+++ b/atlassian/jira.py
@@ -2689,9 +2689,7 @@ def move_version(self, version, after=None, position=None):
if position:
position = position.lower().capitalize()
if position not in ["Earlier", "Later", "First", "Last"]:
- raise ValueError(
- f"position must be one of Earlier, Later, First, or Last. Got {position}"
- )
+ raise ValueError(f"position must be one of Earlier, Later, First, or Last. Got {position}")
return self.post(url, data={"position": position})
def get_project_roles(self, project_key):
diff --git a/examples/bamboo/bamboo_label_based_cleaner.py b/examples/bamboo/bamboo_label_based_cleaner.py
index a30f9607f..05a7e15b7 100644
--- a/examples/bamboo/bamboo_label_based_cleaner.py
+++ b/examples/bamboo/bamboo_label_based_cleaner.py
@@ -50,9 +50,9 @@ def get_plans_from_project(project_key):
continue
datetimeObj = datetime.strptime(build_complete_time.split("+")[0] + "000", "%Y-%m-%dT%H:%M:%S.%f")
if datetime.now() > datetimeObj + timedelta(days=OLDER_DAYS):
- print((
- f"Build is old {build_key} as build complete date {build_complete_time.strftime('%Y-%m-%d')}"
- ))
+ print(
+ (f"Build is old {build_key} as build complete date {build_complete_time.strftime('%Y-%m-%d')}")
+ )
if not DRY_RUN:
print((f"Removing {build_key} build"))
bamboo.delete_build_result(build_key)
diff --git a/examples/confluence/confluence_page_versions_cleaner.py b/examples/confluence/confluence_page_versions_cleaner.py
index 1614046d7..d554ab8a6 100644
--- a/examples/confluence/confluence_page_versions_cleaner.py
+++ b/examples/confluence/confluence_page_versions_cleaner.py
@@ -13,9 +13,11 @@ def page_version_remover(content_id, remained_page_numbers):
return
latest_version_count = int(response.get("lastUpdated").get("number"))
if len(response) > 0 and latest_version_count > remained_page_numbers:
- print((
- f"Number of {confluence.url_joiner(confluence.url, '/pages/viewpage.action?pageId=' + content_id)} latest version {latest_version_count}"
- ))
+ print(
+ (
+ f"Number of {confluence.url_joiner(confluence.url, '/pages/viewpage.action?pageId=' + content_id)} latest version {latest_version_count}"
+ )
+ )
for version_page_counter in range(1, (latest_version_count - remained_page_numbers + 1), 1):
confluence.remove_content_history(content_id, 1)
else:
diff --git a/examples/jira/jira_project_leaders.py b/examples/jira/jira_project_leaders.py
index 3b46a69ee..b620f415f 100644
--- a/examples/jira/jira_project_leaders.py
+++ b/examples/jira/jira_project_leaders.py
@@ -24,10 +24,12 @@
print("|| Project Key || Project Name || Ask for Access ||")
for project in jira.project_leaders():
- print((
- "| {project_key} | {project_name} | {lead_email_link} |".format(
- project_key=project["project_key"],
- project_name=project["project_name"],
- lead_email_link=MAILTO.format(lead_name=project["lead_name"], lead_email=project["lead_email"]),
+ print(
+ (
+ "| {project_key} | {project_name} | {lead_email_link} |".format(
+ project_key=project["project_key"],
+ project_name=project["project_name"],
+ lead_email_link=MAILTO.format(lead_name=project["lead_name"], lead_email=project["lead_email"]),
+ )
)
- ))
+ )
diff --git a/tests/mockup.py b/tests/mockup.py
index c417d466f..f1d7f3ed3 100644
--- a/tests/mockup.py
+++ b/tests/mockup.py
@@ -19,7 +19,7 @@ def request_mockup(*args, **kwargs):
url = kwargs["url"]
if not url.startswith(SERVER + "/"):
raise ValueError("URL [{}] does not start with [{}/].".format(url, SERVER))
- parts = url[len(SERVER) + 1:].split("?")
+ parts = url[len(SERVER) + 1 :].split("?")
url = parts[0]
response_key = parts[1] if len(parts) > 1 else None
if kwargs["data"] is not None:
From 75506cc2e5be0d98fd637753707b6ed4e39e1aff Mon Sep 17 00:00:00 2001
From: Gonchik Tsymzhitov
Date: Mon, 24 Mar 2025 12:39:01 +0200
Subject: [PATCH 6/6] Adjust format into f-strings
---
atlassian/jira.py | 222 ++++++++----------
atlassian/xray.py | 2 +-
...ean_inactive_or_removed_from_jira_users.py | 4 +-
...convert_group_members_into_user_in_role.py | 4 +-
.../jira/jira_copy_components_from_A_to_B.py | 2 +-
examples/jira/jira_dc_create_support_zips.py | 4 +-
examples/jira/jira_download_attachments.py | 2 +-
examples/jira/jira_find_screen_similarity.py | 6 +-
examples/jira/jira_index_fixer.py | 2 +-
examples/jira/jira_issue_type_counter.py | 6 +-
examples/jira/jira_issue_update_epic_link.py | 2 +-
.../jira/jira_jql_fetcher_as_weekly_report.py | 14 +-
examples/jira/jira_oauth2.py | 6 +-
examples/jira/jira_project_leaders.py | 6 +-
examples/jira/jira_review_groups.py | 4 +-
tests/mockup.py | 10 +-
tests/test_bitbucket_cloud_oo.py | 6 +-
tests/test_bitbucket_server.py | 4 +-
tests/test_bitbucket_server_oo.py | 4 +-
tests/test_confluence_advanced_mode.py | 8 +-
tests/test_confluence_attach.py | 6 +-
tests/test_jira.py | 2 +-
tests/test_servicedesk.py | 4 +-
23 files changed, 138 insertions(+), 192 deletions(-)
diff --git a/atlassian/jira.py b/atlassian/jira.py
index ac46246f7..e32803140 100644
--- a/atlassian/jira.py
+++ b/atlassian/jira.py
@@ -2699,7 +2699,7 @@ def get_project_roles(self, project_key):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_key}/role".format(base_url=base_url, project_key=project_key)
+ url = f"{base_url}/{project_key}/role"
return self.get(url)
def get_project_actors_for_role_project(self, project_key, role_id):
@@ -2710,7 +2710,7 @@ def get_project_actors_for_role_project(self, project_key, role_id):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectIdOrKey}/role/{id}".format(base_url=base_url, projectIdOrKey=project_key, id=role_id)
+ url = f"{base_url}/{project_key}/role/{role_id}"
return self._get_response_content(url, fields=[("actors",)])
def delete_project_actors(self, project_key, role_id, actor, actor_type=None):
@@ -2725,9 +2725,7 @@ def delete_project_actors(self, project_key, role_id, actor, actor_type=None):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectIdOrKey}/role/{roleId}".format(
- base_url=base_url, projectIdOrKey=project_key, roleId=role_id
- )
+ url = f"{base_url}/{project_key}/role/{role_id}"
params = {}
if actor_type is not None and actor_type in ["group", "user"]:
params[actor_type] = actor
@@ -2753,9 +2751,7 @@ def add_project_actor_in_role(self, project_key, role_id, actor, actor_type):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectIdOrKey}/role/{roleId}".format(
- base_url=base_url, projectIdOrKey=project_key, roleId=role_id
- )
+ url = f"{base_url}/{project_key}/role/{role_id}"
data = {}
if actor_type in ["group", "atlassian-group-role-actor"]:
data["group"] = [actor]
@@ -2776,7 +2772,7 @@ def update_project(self, project_key, data, expand=None):
:param expand: the parameters to expand
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectIdOrKey}".format(base_url=base_url, projectIdOrKey=project_key)
+ url = f"{base_url}/{project_key}"
params = {}
if expand:
params["expand"] = expand
@@ -2808,9 +2804,7 @@ def get_notification_scheme_for_project(self, project_id_or_key):
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_id_or_key}/notificationscheme".format(
- base_url=base_url, project_id_or_key=project_id_or_key
- )
+ url = f"{base_url}/{project_id_or_key}/notificationscheme"
return self.get(url)
def assign_project_notification_scheme(self, project_key, new_notification_scheme=""):
@@ -2875,9 +2869,7 @@ def get_notification_scheme(self, notification_scheme_id, expand=None):
:return: full representation of the notification scheme for the given id
"""
base_url = self.resource_url("notificationscheme")
- url = "{base_url}/{notification_scheme_id}".format(
- base_url=base_url, notification_scheme_id=notification_scheme_id
- )
+ url = f"{base_url}/{notification_scheme_id}"
params = {}
if expand:
params["expand"] = expand
@@ -2891,9 +2883,7 @@ def get_project_notification_scheme(self, project_id_or_key):
:return: data of project notification scheme
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_id_or_key}/notificationscheme".format(
- base_url=base_url, project_id_or_key=project_id_or_key
- )
+ url = f"{base_url}/{project_id_or_key}/notificationscheme"
return self.get(url)
"""
@@ -2910,9 +2900,7 @@ def assign_project_permission_scheme(self, project_id_or_key, permission_scheme_
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_id_or_key}/permissionscheme".format(
- base_url=base_url, project_id_or_key=project_id_or_key
- )
+ url = f"{base_url}/{project_id_or_key}/permissionscheme"
data = {"id": permission_scheme_id}
return self.put(url, data=data)
@@ -2926,9 +2914,7 @@ def get_project_permission_scheme(self, project_id_or_key, expand=None):
:return: data of project permission scheme
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_id_or_key}/permissionscheme".format(
- base_url=base_url, project_id_or_key=project_id_or_key
- )
+ url = f"{base_url}/{project_id_or_key}/permissionscheme"
params = {}
if expand:
params["expand"] = expand
@@ -2996,21 +2982,21 @@ def project_leaders(self):
}
def get_project_issuekey_last(self, project):
- jql = 'project = "{project}" ORDER BY issuekey DESC'.format(project=project)
+ jql = f'project = "{project}" ORDER BY issuekey DESC'
response = self.jql(jql)
if self.advanced_mode:
return response
return (response.get("issues") or {"key": None})[0]["key"]
def get_project_issuekey_all(self, project, start=0, limit=None, expand=None):
- jql = 'project = "{project}" ORDER BY issuekey ASC'.format(project=project)
+ jql = f'project = "{project}" ORDER BY issuekey ASC'
response = self.jql(jql, start=start, limit=limit, expand=expand)
if self.advanced_mode:
return response
return [issue["key"] for issue in response["issues"]]
def get_project_issues_count(self, project):
- jql = 'project = "{project}" '.format(project=project)
+ jql = f'project = "{project}" '
response = self.jql(jql, fields="*none")
if self.advanced_mode:
return response
@@ -3025,7 +3011,7 @@ def get_all_project_issues(self, project, fields="*all", start=0, limit=None):
:param limit: OPTIONAL int: Total number of project issues to be returned
:return: List of Dictionary for the Issue(s) returned.
"""
- jql = 'project = "{project}" ORDER BY key'.format(project=project)
+ jql = f'project = "{project}" ORDER BY key'
response = self.jql(jql, fields=fields, start=start, limit=limit)
if self.advanced_mode:
return response
@@ -3041,12 +3027,7 @@ def get_all_assignable_users_for_project(self, project_key, start=0, limit=50):
:return:
"""
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,
- )
+ url = f"{base_url}?project={project_key}&startAt={start}&maxResults={limit}"
return self.get(url)
def get_assignable_users_for_issue(self, issue_key, username=None, start=0, limit=50):
@@ -3060,21 +3041,19 @@ def get_assignable_users_for_issue(self, issue_key, username=None, start=0, limi
:return:
"""
base_url = self.resource_url("user/assignable/search")
- url = "{base_url}?issueKey={issue_key}&startAt={start}&maxResults={limit}".format(
- base_url=base_url, issue_key=issue_key, start=start, limit=limit
- )
+ url = f"{base_url}?issueKey={issue_key}&startAt={start}&maxResults={limit}"
if username:
- url += "&username={username}".format(username=username)
+ url += f"&username={username}"
return self.get(url)
def get_status_id_from_name(self, status_name):
base_url = self.resource_url("status")
- url = "{base_url}/{name}".format(base_url=base_url, name=status_name)
+ url = f"{base_url}/{status_name}"
return int(self._get_response_content(url, fields=[("id",)]))
def get_status_for_project(self, project_key):
base_url = self.resource_url("project")
- url = "{base_url}/{name}/statuses".format(base_url=base_url, name=project_key)
+ url = f"{base_url}/{project_key}/statuses"
return self.get(url)
def get_all_time_tracking_providers(self):
@@ -3144,7 +3123,7 @@ def get_issue_link(self, link_id):
:return:
"""
base_url = self.resource_url("issueLink")
- url = "{base_url}/{link_id}".format(base_url=base_url, link_id=link_id)
+ url = f"{base_url}/{link_id}"
return self.get(url)
def remove_issue_link(self, link_id):
@@ -3156,7 +3135,7 @@ def remove_issue_link(self, link_id):
:return:
"""
base_url = self.resource_url("issueLink")
- url = "{base_url}/{link_id}".format(base_url=base_url, link_id=link_id)
+ url = f"{base_url}/{link_id}"
return self.delete(url)
"""
@@ -3209,13 +3188,13 @@ def create_issue_link_type(self, link_type_name, inward, outward):
def get_issue_link_type(self, issue_link_type_id):
"""Returns for a given issue link type id all information about this issue link type."""
base_url = self.resource_url("issueLinkType")
- url = "{base_url}/{issueLinkTypeId}".format(base_url=base_url, issueLinkTypeId=issue_link_type_id)
+ url = f"{base_url}/{issue_link_type_id}"
return self.get(url)
def delete_issue_link_type(self, issue_link_type_id):
"""Delete the specified issue link type."""
base_url = self.resource_url("issueLinkType")
- url = "{base_url}/{issueLinkTypeId}".format(base_url=base_url, issueLinkTypeId=issue_link_type_id)
+ url = f"{base_url}/{issue_link_type_id}"
return self.delete(url)
def update_issue_link_type(self, issue_link_type_id, data):
@@ -3230,7 +3209,7 @@ def update_issue_link_type(self, issue_link_type_id, data):
:return:
"""
base_url = self.resource_url("issueLinkType")
- url = "{base_url}/{issueLinkTypeId}".format(base_url=base_url, issueLinkTypeId=issue_link_type_id)
+ url = f"{base_url}/{issue_link_type_id}"
return self.put(url, data=data)
"""
@@ -3253,7 +3232,7 @@ def get_resolution_by_id(self, resolution_id):
:return:
"""
base_url = self.resource_url("resolution")
- url = "{base_url}/{resolution_id}".format(base_url=base_url, resolution_id=resolution_id)
+ url = f"{base_url}/{resolution_id}"
return self.get(url)
"""
@@ -3289,7 +3268,7 @@ def get_all_available_screen_fields(self, screen_id):
:return:
"""
base_url = self.resource_url("screens")
- url = "{base_url}/{screen_id}/availableFields".format(base_url=base_url, screen_id=screen_id)
+ url = f"{base_url}/{screen_id}/availableFields"
return self.get(url)
def get_screen_tabs(self, screen_id):
@@ -3299,7 +3278,7 @@ def get_screen_tabs(self, screen_id):
:return:
"""
base_url = self.resource_url("screens")
- url = "{base_url}/{screen_id}/tabs".format(base_url=base_url, screen_id=screen_id)
+ url = f"{base_url}/{screen_id}/tabs"
return self.get(url)
def get_screen_tab_fields(self, screen_id, tab_id):
@@ -3310,9 +3289,7 @@ def get_screen_tab_fields(self, screen_id, tab_id):
:return:
"""
base_url = self.resource_url("screens")
- url = "{base_url}/{screen_id}/tabs/{tab_id}/fields".format(
- base_url=base_url, screen_id=screen_id, tab_id=tab_id
- )
+ url = f"{base_url}/{screen_id}/tabs/{tab_id}/fields"
return self.get(url)
def get_all_screen_fields(self, screen_id):
@@ -3337,7 +3314,7 @@ def add_field(self, field_id, screen_id, tab_id):
:param screen_id: screen ID
:param tab_id: tab ID
"""
- url = "rest/api/2/screens/{screen_id}/tabs/{tab_id}/fields".format(screen_id=screen_id, tab_id=tab_id)
+ url = f"rest/api/2/screens/{screen_id}/tabs/{tab_id}/fields"
data = {"fieldId": field_id}
return self.post(url, data=data)
@@ -3542,7 +3519,7 @@ def get_priority_by_id(self, priority_id):
:return:
"""
base_url = self.resource_url("priority")
- url = "{base_url}/{priority_id}".format(base_url=base_url, priority_id=priority_id)
+ url = f"{base_url}/{priority_id}"
return self.get(url)
"""
@@ -3605,7 +3582,7 @@ def get_plugin_info(self, plugin_key):
Provide plugin info
:return a json of installed plugins
"""
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.get(url, headers=self.no_check_headers, trailing=True)
def get_plugin_license_info(self, plugin_key):
@@ -3613,7 +3590,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 = f"rest/plugins/1.0/{plugin_key}-key/license"
return self.get(url, headers=self.no_check_headers, trailing=True)
def upload_plugin(self, plugin_path):
@@ -3629,7 +3606,7 @@ def upload_plugin(self, plugin_path):
headers=self.no_check_headers,
trailing=True,
).headers["upm-token"]
- url = "rest/plugins/1.0/?token={upm_token}".format(upm_token=upm_token)
+ url = f"rest/plugins/1.0/?token={upm_token}"
return self.post(url, files=files, headers=self.no_check_headers)
def delete_plugin(self, plugin_key):
@@ -3638,7 +3615,7 @@ def delete_plugin(self, plugin_key):
:param plugin_key:
:return:
"""
- url = "rest/plugins/1.0/{}-key".format(plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
return self.delete(url)
def check_plugin_manager_status(self):
@@ -3656,7 +3633,7 @@ def update_plugin_license(self, plugin_key, raw_license):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key)
+ url = f"/plugins/1.0/{plugin_key}/license"
data = {"rawLicense": raw_license}
return self.put(url, data=data, headers=app_headers)
@@ -3670,7 +3647,7 @@ def disable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "disabled"}
return self.put(url, data=data, headers=app_headers)
@@ -3684,7 +3661,7 @@ def enable_plugin(self, plugin_key):
"X-Atlassian-Token": "nocheck",
"Content-Type": "application/vnd.atl.plugins+json",
}
- url = "rest/plugins/1.0/{plugin_key}-key".format(plugin_key=plugin_key)
+ url = f"rest/plugins/1.0/{plugin_key}-key"
data = {"status": "enabled"}
return self.put(url, data=data, headers=app_headers)
@@ -3716,7 +3693,7 @@ def get_permissionscheme(self, permission_id, expand=None):
:return:
"""
base_url = self.resource_url("permissionscheme")
- url = "{base_url}/{schemeID}".format(base_url=base_url, schemeID=permission_id)
+ url = f"{base_url}/{permission_id}"
params = {}
if expand:
params["expand"] = expand
@@ -3740,7 +3717,7 @@ def set_permissionscheme_grant(self, permission_id, new_permission):
:return:
"""
base_url = self.resource_url("permissionscheme")
- url = "{base_url}/{schemeID}/permission".format(base_url=base_url, schemeID=permission_id)
+ url = f"{base_url}/{permission_id}/permission"
return self.post(url, data=new_permission)
def update_permissionscheme(self, permission_id, name, description=None, permissions=None, scope=None, expand=None):
@@ -3775,7 +3752,7 @@ def update_permissionscheme(self, permission_id, name, description=None, permiss
:return:
"""
base_url = self.resource_url("permissionscheme")
- url = "{base_url}/{scheme_id}".format(base_url=base_url, scheme_id=permission_id)
+ url = f"{base_url}/{permission_id}"
data = {"name": name}
if description is not None:
data["description"] = description
@@ -3819,7 +3796,7 @@ def get_issue_security_scheme(self, scheme_id, only_levels=False):
:return: list
"""
base_url = self.resource_url("issuesecurityschemes")
- url = "{base_url}/{scheme_id}".format(base_url=base_url, scheme_id=scheme_id)
+ url = f"{base_url}/{scheme_id}"
if only_levels is True:
return self._get_response_content(url, fields=[("levels",)])
@@ -3838,9 +3815,7 @@ def get_project_issue_security_scheme(self, project_id_or_key, only_levels=False
:return: list
"""
base_url = self.resource_url("project")
- url = "{base_url}/{project_id_or_key}/issuesecuritylevelscheme".format(
- base_url=base_url, project_id_or_key=project_id_or_key
- )
+ url = f"{base_url}/{project_id_or_key}/issuesecuritylevelscheme"
try:
response = self.get(url)
except HTTPError as e:
@@ -3916,9 +3891,7 @@ def get_priority_scheme_of_project(self, project_key_or_id, expand=None):
if expand:
params["expand"] = expand
base_url = self.resource_url("project")
- url = "{base_url}/{project_key_or_id}/priorityscheme".format(
- base_url=base_url, project_key_or_id=project_key_or_id
- )
+ url = f"{base_url}/{project_key_or_id}/priorityscheme"
return self.get(url, params=params)
def assign_priority_scheme_for_project(self, project_key_or_id, priority_scheme_id):
@@ -3933,7 +3906,7 @@ def assign_priority_scheme_for_project(self, project_key_or_id, priority_scheme_
:return:
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectKeyOrId}/priorityscheme".format(base_url=base_url, projectKeyOrId=project_key_or_id)
+ url = f"{base_url}/{project_key_or_id}/priorityscheme"
data = {"id": priority_scheme_id}
return self.put(url, data=data)
@@ -3951,7 +3924,7 @@ def get_security_level_for_project(self, project_key_or_id):
:return: Returns a list of all security levels in a project for which the current user has access.
"""
base_url = self.resource_url("project")
- url = "{base_url}/{projectKeyOrId}/securitylevel".format(base_url=base_url, projectKeyOrId=project_key_or_id)
+ url = f"{base_url}/{project_key_or_id}/securitylevel"
return self.get(url)
"""
@@ -4008,7 +3981,7 @@ def add_issue_type_scheme(self, scheme_id, project_key):
:param project_key: The project key to associate with the given issue type scheme
:return:
"""
- url = "rest/api/2/issuetypescheme/{schemeId}/associations".format(schemeId=scheme_id)
+ url = f"rest/api/2/issuetypescheme/{scheme_id}/associations"
data = {"idsOrKeys": [project_key]}
return self.post(url, data=data)
@@ -4100,7 +4073,7 @@ def reindex_status(self):
def reindex_project(self, project_key):
return self.post(
"secure/admin/IndexProject.jspa",
- data="confirmed=true&key={}".format(project_key),
+ data=f"confirmed=true&key={project_key}",
headers=self.form_token_headers,
)
@@ -4154,7 +4127,7 @@ def tempo_account_get_accounts_by_jira_project(self, project_id):
:param project_id: str the project id.
:return:
"""
- url = "rest/tempo-accounts/1/account/project/{}".format(project_id)
+ url = f"rest/tempo-accounts/1/account/project/{project_id}"
return self.get(url)
def tempo_account_associate_with_jira_project(
@@ -4217,7 +4190,7 @@ def tempo_account_delete_account_by_id(self, account_id):
:param account_id: the id of the Account to be deleted.
:return:
"""
- url = "rest/tempo-accounts/1/account/{id}/".format(id=account_id)
+ url = f"rest/tempo-accounts/1/account/{account_id}/"
return self.delete(url)
def tempo_account_get_rate_table_by_account_id(self, account_id):
@@ -4236,7 +4209,7 @@ def tempo_account_get_all_account_by_customer_id(self, customer_id):
:param customer_id: the Customer id.
:return:
"""
- url = "rest/tempo-accounts/1/account/customer/{customerId}/".format(customerId=customer_id)
+ url = f"rest/tempo-accounts/1/account/customer/{customer_id}/"
return self.get(url)
def tempo_account_get_customers(self, query=None, count_accounts=None):
@@ -4288,7 +4261,7 @@ def tempo_account_get_customer_by_id(self, customer_id=1):
:param customer_id: id of Customer record
:return: Customer info
"""
- url = "rest/tempo-accounts/1/customer/{id}".format(id=customer_id)
+ url = f"rest/tempo-accounts/1/customer/{customer_id}"
return self.get(url)
def tempo_account_update_customer_by_id(self, customer_id=1, data=None):
@@ -4309,7 +4282,7 @@ def tempo_account_update_customer_by_id(self, customer_id=1, data=None):
name:string
key:string
id:number }"""
- url = "rest/tempo-accounts/1/customer/{id}".format(id=customer_id)
+ url = f"rest/tempo-accounts/1/customer/{customer_id}"
return self.put(url, data=data)
def tempo_account_delete_customer_by_id(self, customer_id=1):
@@ -4318,7 +4291,7 @@ def tempo_account_delete_customer_by_id(self, customer_id=1):
:param customer_id: id of Customer record
:return: Customer info
"""
- url = "rest/tempo-accounts/1/customer/{id}".format(id=customer_id)
+ url = f"rest/tempo-accounts/1/customer/{customer_id}"
return self.delete(url)
def tempo_account_export_accounts(self):
@@ -4343,7 +4316,7 @@ def tempo_holiday_get_scheme_info(self, scheme_id):
Provide a holiday scheme
:return:
"""
- url = "rest/tempo-core/2/holidayschemes/{}".format(scheme_id)
+ url = f"rest/tempo-core/2/holidayschemes/{scheme_id}"
return self.get(url)
def tempo_holiday_get_scheme_members(self, scheme_id):
@@ -4351,7 +4324,7 @@ def tempo_holiday_get_scheme_members(self, scheme_id):
Provide a holiday scheme members
:return:
"""
- url = "rest/tempo-core/2/holidayschemes/{}/members".format(scheme_id)
+ url = f"rest/tempo-core/2/holidayschemes/{scheme_id}/members"
return self.get(url)
def tempo_holiday_put_into_scheme_member(self, scheme_id, username):
@@ -4359,7 +4332,7 @@ def tempo_holiday_put_into_scheme_member(self, scheme_id, username):
Provide a holiday scheme
:return:
"""
- url = "rest/tempo-core/2/holidayschemes/{}/member/{}/".format(scheme_id, username)
+ url = f"rest/tempo-core/2/holidayschemes/{scheme_id}/member/{username}/"
data = {"id": scheme_id}
return self.put(url, data=data)
@@ -4369,10 +4342,7 @@ def tempo_holiday_scheme_set_default(self, scheme_id):
:param scheme_id:
:return:
"""
- # @deprecated available in private mode the 1 version
- # url = 'rest/tempo-core/1/holidayscheme/setDefault/{}'.format(scheme_id)
-
- url = "rest/tempo-core/2/holidayscheme/setDefault/{}".format(scheme_id)
+ url = f"rest/tempo-core/2/holidayscheme/setDefault/{scheme_id}"
data = {"id": scheme_id}
return self.post(url, data=data)
@@ -4382,7 +4352,7 @@ def tempo_workload_scheme_get_members(self, scheme_id):
:param scheme_id:
:return:
"""
- url = "rest/tempo-core/1/workloadscheme/users/{}".format(scheme_id)
+ url = f"rest/tempo-core/1/workloadscheme/users/{scheme_id}"
return self.get(url)
def tempo_workload_scheme_set_member(self, scheme_id, member):
@@ -4392,7 +4362,7 @@ def tempo_workload_scheme_set_member(self, scheme_id, member):
:param scheme_id:
:return:
"""
- url = "rest/tempo-core/1/workloadscheme/user/{}".format(member)
+ url = f"rest/tempo-core/1/workloadscheme/user/{member}"
data = {"id": scheme_id}
return self.put(url, data=data)
@@ -4413,7 +4383,7 @@ def tempo_timesheets_get_team_utilization(self, team_id, date_from, date_to=None
:param group_by:
:return:
"""
- url = "rest/tempo-timesheets/3/report/team/{}/utilization".format(team_id)
+ url = f"rest/tempo-timesheets/3/report/team/{team_id}/utilization"
params = {"dateFrom": date_from, "dateTo": date_to}
if group_by:
@@ -4497,7 +4467,7 @@ def tempo_timesheets_get_worklogs_by_issue(self, issue):
:param issue: Issue key or ID
:return:
"""
- url = "rest/tempo-timesheets/4/worklogs/jira/issue/{issue}".format(issue=issue)
+ url = f"rest/tempo-timesheets/4/worklogs/jira/issue/{issue}"
return self.get(url)
def tempo_timesheets_write_worklog(self, worker, started, time_spend_in_seconds, issue_id, comment=None):
@@ -4569,7 +4539,7 @@ def tempo_get_links_to_project(self, project_id):
:param project_id:
:return:
"""
- url = "rest/tempo-accounts/1/link/project/{}/".format(project_id)
+ url = f"rest/tempo-accounts/1/link/project/{project_id}/"
return self.get(url)
def tempo_get_default_link_to_project(self, project_id):
@@ -4578,7 +4548,7 @@ def tempo_get_default_link_to_project(self, project_id):
:param project_id:
:return:
"""
- url = "rest/tempo-accounts/1/link/project/{}/default/".format(project_id)
+ url = f"rest/tempo-accounts/1/link/project/{project_id}/default/"
return self.get(url)
def tempo_teams_get_all_teams(self, expand=None):
@@ -4614,7 +4584,7 @@ def tempo_teams_add_membership(self, team_id, member_id):
"availability": "100",
"role": {"id": 1},
}
- url = "rest/tempo-teams/2/team/{}/member/{}/membership".format(team_id, member_id)
+ url = f"rest/tempo-teams/2/team/{team_id}/member/{member_id}/membership"
return self.post(url, data=data)
def tempo_teams_add_member_raw(self, team_id, member_data):
@@ -4624,7 +4594,7 @@ def tempo_teams_add_member_raw(self, team_id, member_data):
:param member_data:
:return:
"""
- url = "rest/tempo-teams/2/team/{}/member/".format(team_id)
+ url = f"rest/tempo-teams/2/team/{team_id}/member/"
data = member_data
return self.post(url, data=data)
@@ -4634,7 +4604,7 @@ def tempo_teams_get_members(self, team_id):
:param team_id:
:return:
"""
- url = "rest/tempo-teams/2/team/{}/member/".format(team_id)
+ url = f"rest/tempo-teams/2/team/{team_id}/member/"
return self.get(url)
def tempo_teams_remove_member(self, team_id, member_id, membership_id):
@@ -4645,7 +4615,7 @@ def tempo_teams_remove_member(self, team_id, member_id, membership_id):
:param membership_id:
:return:
"""
- url = "rest/tempo-teams/2/team/{}/member/{}/membership/{}".format(team_id, member_id, membership_id)
+ url = f"rest/tempo-teams/2/team/{team_id}/member/{member_id}/membership/{membership_id}"
return self.delete(url)
def tempo_teams_update_member_information(self, team_id, member_id, membership_id, data):
@@ -4657,7 +4627,7 @@ def tempo_teams_update_member_information(self, team_id, member_id, membership_i
:param data:
:return:
"""
- url = "rest/tempo-teams/2/team/{}/member/{}/membership/{}".format(team_id, member_id, membership_id)
+ url = f"rest/tempo-teams/2/team/{team_id}/member/{member_id}/membership/{membership_id}"
return self.put(url, data=data)
def tempo_timesheets_get_period_configuration(self):
@@ -4667,7 +4637,7 @@ def tempo_timesheets_get_private_configuration(self):
return self.get("rest/tempo-timesheets/3/private/config")
def tempo_teams_get_memberships_for_member(self, username):
- return self.get("rest/tempo-teams/2/user/{}/memberships".format(username))
+ return self.get(f"rest/tempo-teams/2/user/{username}/memberships")
#######################################################################
# Agile (Formerly Greenhopper) REST API implements
@@ -4702,7 +4672,7 @@ def get_agile_board_by_filter_id(self, filter_id):
Gets an agile board by the filter id
:param filter_id: int, str
"""
- url = "rest/agile/1.0/board/filter/{filter_id}".format(filter_id=filter_id)
+ url = f"rest/agile/1.0/board/filter/{filter_id}"
return self.get(url)
# /rest/agile/1.0/board
@@ -4758,7 +4728,7 @@ def delete_agile_board(self, board_id):
:param board_id:
:return:
"""
- url = "rest/agile/1.0/board/{}".format(str(board_id))
+ url = f"rest/agile/1.0/board/{str(board_id)}"
return self.delete(url)
def get_agile_board(self, board_id):
@@ -4767,7 +4737,7 @@ def get_agile_board(self, board_id):
:param board_id:
:return:
"""
- url = "rest/agile/1.0/board/{}".format(str(board_id))
+ url = f"rest/agile/1.0/board/{str(board_id)}"
return self.get(url)
def get_issues_for_backlog(self, board_id):
@@ -4780,7 +4750,7 @@ def get_issues_for_backlog(self, board_id):
By default, the returned issues are ordered by rank.
:param board_id: int, str
"""
- url = "rest/agile/1.0/board/{board_id}/backlog".format(board_id=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/backlog"
return self.get(url)
def get_agile_board_configuration(self, board_id):
@@ -4807,7 +4777,7 @@ def get_agile_board_configuration(self, board_id):
:param board_id:
:return:
"""
- url = "rest/agile/1.0/board/{}/configuration".format(str(board_id))
+ url = f"rest/agile/1.0/board/{str(board_id)}/configuration"
return self.get(url)
def get_issues_for_board(self, board_id, jql, fields="*all", start=0, limit=None, expand=None):
@@ -4840,7 +4810,7 @@ def get_issues_for_board(self, board_id, jql, fields="*all", start=0, limit=None
if expand is not None:
params["expand"] = expand
- url = "rest/agile/1.0/board/{board_id}/issue".format(board_id=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/issue"
return self.get(url, params=params)
# /rest/agile/1.0/board/{boardId}/epic
@@ -4863,7 +4833,7 @@ def get_epics(
See the 'Pagination' section at the top of this page for more details.
:return:
"""
- url = "rest/agile/1.0/board/{board_id}/epic".format(board_id=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/epic"
params = {}
if done:
params["done"] = done
@@ -4901,7 +4871,7 @@ def get_issues_for_epic(
If you exceed this limit, your results will be truncated.
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/epic/{epicId}/issue".format(epicId=epic_id, boardId=board_id)
+ url = f"/rest/agile/1.0/board/{board_id}/epic/{epic_id}/issue"
params = {}
if jql:
params["jql"] = jql
@@ -4950,7 +4920,7 @@ def get_issues_without_epic(
If you exceed this limit, your results will be truncated.
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/epic/none/issue".format(boardId=board_id)
+ url = f"/rest/agile/1.0/board/{board_id}/epic/none/issue"
params = {}
if jql:
params["jql"] = jql
@@ -4986,7 +4956,7 @@ def get_all_projects_associated_with_board(self, board_id, start=0, limit=50):
See the 'Pagination' section at the top of this page for more details
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/project".format(boardId=board_id)
+ url = f"/rest/agile/1.0/board/{board_id}/project"
params = {}
if start:
params["startAt"] = start
@@ -5001,7 +4971,7 @@ def get_agile_board_properties(self, board_id):
The user who retrieves the property keys is required to have permissions to view the board.
:param board_id: int, str
"""
- url = "rest/agile/1.0/board/{boardId}/properties".format(boardId=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/properties"
return self.get(url)
def set_agile_board_property(self, board_id, property_key):
@@ -5025,9 +4995,7 @@ def get_agile_board_property(self, board_id, property_key):
:param property_key:
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/properties/{propertyKey}".format(
- boardId=board_id, propertyKey=property_key
- )
+ url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
return self.get(url)
def delete_agile_board_property(self, board_id, property_key):
@@ -5038,9 +5006,7 @@ def delete_agile_board_property(self, board_id, property_key):
:param property_key:
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/properties/{propertyKey}".format(
- boardId=board_id, propertyKey=property_key
- )
+ url = f"/rest/agile/1.0/board/{board_id}/properties/{property_key}"
return self.delete(url)
# /rest/agile/1.0/board/{boardId}/settings/refined-velocity
@@ -5050,7 +5016,7 @@ def get_agile_board_refined_velocity(self, board_id):
:param board_id:
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/settings/refined-velocity".format(boardId=board_id)
+ url = f"/rest/agile/1.0/board/{board_id}/settings/refined-velocity"
return self.get(url)
def set_agile_board_refined_velocity(self, board_id, data):
@@ -5060,7 +5026,7 @@ def set_agile_board_refined_velocity(self, board_id, data):
:param data:
:return:
"""
- url = "/rest/agile/1.0/board/{boardId}/settings/refined-velocity".format(boardId=board_id)
+ url = f"/rest/agile/1.0/board/{board_id}/settings/refined-velocity"
return self.put(url, data=data)
# /rest/agile/1.0/board/{boardId}/sprint
@@ -5088,7 +5054,7 @@ def get_all_sprints_from_board(self, board_id, state=None, start=0, limit=50):
params["maxResults"] = limit
if state:
params["state"] = state
- url = "rest/agile/1.0/board/{boardId}/sprint".format(boardId=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/sprint"
return self.get(url, params=params)
@deprecated(version="3.42.0", reason="Use get_all_sprints_from_board instead")
@@ -5129,7 +5095,7 @@ def get_all_issues_for_sprint_in_board(
'jira.search.views.default.max' in your JIRA instance.
If you exceed this limit, your results will be truncated.
"""
- url = "/rest/agile/1.0/board/{boardId}/sprint/{sprintId}/issue".format(boardId=board_id, sprintId=sprint_id)
+ url = f"/rest/agile/1.0/board/{board_id}/sprint/{sprint_id}/issue"
params = {}
if jql:
params["jql"] = jql
@@ -5172,7 +5138,7 @@ def get_all_versions_from_board(self, board_id, released="true", start=0, limit=
params["startAt"] = start
if limit:
params["maxResults"] = limit
- url = "rest/agile/1.0/board/{boardId}/version".format(boardId=board_id)
+ url = f"rest/agile/1.0/board/{board_id}/version"
return self.get(url, params=params)
def create_sprint(self, name, board_id, start_date=None, end_date=None, goal=None):
@@ -5216,7 +5182,7 @@ def add_issues_to_sprint(self, sprint_id, issues):
"""
if not isinstance(issues, list):
raise ValueError("`issues` param should be List of Issue Keys")
- url = "/rest/agile/1.0/sprint/{sprint_id}/issue".format(sprint_id=sprint_id)
+ url = f"/rest/agile/1.0/sprint/{sprint_id}/issue"
data = dict(issues=issues)
return self.post(url, data=data)
@@ -5228,7 +5194,7 @@ def get_sprint(self, sprint_id):
:param sprint_id:
:return:
"""
- url = "rest/agile/1.0/sprint/{sprintId}".format(sprintId=sprint_id)
+ url = f"rest/agile/1.0/sprint/{sprint_id}"
return self.get(url)
def rename_sprint(self, sprint_id, name, start_date, end_date):
@@ -5241,7 +5207,7 @@ def rename_sprint(self, sprint_id, name, start_date, end_date):
:return:
"""
return self.put(
- "rest/greenhopper/1.0/sprint/{0}".format(sprint_id),
+ f"rest/greenhopper/1.0/sprint/{sprint_id}",
data={"name": name, "startDate": start_date, "endDate": end_date},
)
@@ -5253,7 +5219,7 @@ def delete_sprint(self, sprint_id):
:param sprint_id:
:return:
"""
- return self.delete("rest/agile/1.0/sprint/{sprintId}".format(sprintId=sprint_id))
+ return self.delete(f"rest/agile/1.0/sprint/{sprint_id}")
def update_partially_sprint(self, sprint_id, data):
"""
@@ -5273,7 +5239,7 @@ def update_partially_sprint(self, sprint_id, data):
:param data: { "name": "new name"}
:return:
"""
- return self.post("rest/agile/1.0/sprint/{}".format(sprint_id), data=data)
+ return self.post(f"rest/agile/1.0/sprint/{sprint_id}", data=data)
def get_sprint_issues(self, sprint_id, start, limit):
"""
@@ -5297,7 +5263,7 @@ def get_sprint_issues(self, sprint_id, start, limit):
params["startAt"] = start
if limit:
params["maxResults"] = limit
- url = "rest/agile/1.0/sprint/{sprintId}/issue".format(sprintId=sprint_id)
+ url = f"rest/agile/1.0/sprint/{sprint_id}/issue"
return self.get(url, params=params)
def update_rank(self, issues_to_rank, rank_before, customfield_number):
@@ -5332,7 +5298,7 @@ def dvcs_update_linked_repo_with_remote(self, repository_id):
:param repository_id:
:return:
"""
- url = "rest/bitbucket/1.0/repositories/{}/sync".format(repository_id)
+ url = f"rest/bitbucket/1.0/repositories/{repository_id}/sync"
return self.post(url)
def flag_issue(self, issue_keys, flag=True):
diff --git a/atlassian/xray.py b/atlassian/xray.py
index 338732446..dbd733bdf 100644
--- a/atlassian/xray.py
+++ b/atlassian/xray.py
@@ -33,7 +33,7 @@ def raise_for_status(self, response):
else:
raise HTTPError(error_msg, response=response)
- def resource_url(self, resource: object, api_root: object = None, api_version: object = None) -> object:
+ def resource_url(self, resource, api_root=None, api_version=None):
"""
Overloading the method from AtlassianRestAPI to be compatible with the "middle man" version used by Xray.
"""
diff --git a/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py b/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
index f3aedbe6b..a4455f2ef 100644
--- a/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
+++ b/examples/jira/jira_clean_inactive_or_removed_from_jira_users.py
@@ -19,7 +19,7 @@
for project in projects:
project_key = project.get("key")
- print(("Start review project {}".format(project_key)))
+ print(f"Start review project {project_key}")
for role_id in role_ids:
actors = jira.get_project_actors_for_role_project(project_key, role_id)
for actor in actors:
@@ -29,5 +29,5 @@
continue
answer = jira.user(username)
if answer.get("errorMessages") or (not answer.get("active")):
- print(("Removing from project permissions {}".format(username)))
+ print(f"Removing from project permissions {username}")
jira.delete_project_actors(project_key, role_id=role_id, actor=username, actor_type="user")
diff --git a/examples/jira/jira_convert_group_members_into_user_in_role.py b/examples/jira/jira_convert_group_members_into_user_in_role.py
index 3eba58893..839e5de17 100644
--- a/examples/jira/jira_convert_group_members_into_user_in_role.py
+++ b/examples/jira/jira_convert_group_members_into_user_in_role.py
@@ -13,7 +13,7 @@ def convert_group_into_users_in_role(project_key, role_id, group_name):
users = jira.get_all_users_from_group(group=group_name, limit=1000).get("values")
for user in users:
jira.add_user_into_project_role(project_key=project_key, role_id=role_id, user_name=user.get("name"))
- print(("{} added into role_id {} in {}".format(user.get("name"), role_id, project_key)))
+ print(f"{user.get('name')} added into role_id {role_id} in {project_key}")
group_name_to_find = "old-developers"
@@ -27,5 +27,5 @@ def convert_group_into_users_in_role(project_key, role_id, group_name):
for member in members_of_role:
if member.get("type") == "atlassian-group-role-actor":
if member.get("name") == group_name_to_find:
- print(("{} has {}".format(project.get("key"), role.get("name"))))
+ print(f"{project.get('key')} has {role.get('name')}")
convert_group_into_users_in_role(project.get("key"), role.get("id"), group_name_to_find)
diff --git a/examples/jira/jira_copy_components_from_A_to_B.py b/examples/jira/jira_copy_components_from_A_to_B.py
index 1fbfaf9e0..4d23b23bf 100644
--- a/examples/jira/jira_copy_components_from_A_to_B.py
+++ b/examples/jira/jira_copy_components_from_A_to_B.py
@@ -18,4 +18,4 @@
"assigneeType": component.get("assigneeType"),
}
jira.create_component(data)
- print(("{} - component created ".format(component.get("name"))))
+ print(f"{component.get('name')} - component created ")
diff --git a/examples/jira/jira_dc_create_support_zips.py b/examples/jira/jira_dc_create_support_zips.py
index 9692e968a..b387468e1 100644
--- a/examples/jira/jira_dc_create_support_zips.py
+++ b/examples/jira/jira_dc_create_support_zips.py
@@ -12,14 +12,14 @@
while True:
for task in jira.check_support_zip_status(zips_creation_task_id)["tasks"]:
if task["status"] == "IN_PROGRESS":
- print(("file {} {}".format(task["fileName"], task["progressMessage"])))
+ print(f"file {task['fileName']} {task['progressMessage']}")
if task["fileName"] not in in_progress_zips:
in_progress_zips.append(task["fileName"])
else:
support_zip = jira.download_support_zip(task["fileName"])
with open(task["fileName"], "wb") as fp:
fp.write(support_zip)
- print(("{} written.".format(task["fileName"])))
+ print(f"{task['fileName']} written.")
if task["fileName"] in in_progress_zips:
in_progress_zips.remove(task["fileName"])
diff --git a/examples/jira/jira_download_attachments.py b/examples/jira/jira_download_attachments.py
index 66d8339e3..a8e8610a0 100644
--- a/examples/jira/jira_download_attachments.py
+++ b/examples/jira/jira_download_attachments.py
@@ -33,5 +33,5 @@
if response.status_code != 200:
continue
with open(dest_folder + "/" + filename, "wb") as f:
- print(("Saving for {key} the file {filename}".format(key=key, filename=filename)))
+ print(f"Saving for {key} the file {filename}")
f.write(response.content)
diff --git a/examples/jira/jira_find_screen_similarity.py b/examples/jira/jira_find_screen_similarity.py
index 0d3cce724..3a908e17a 100644
--- a/examples/jira/jira_find_screen_similarity.py
+++ b/examples/jira/jira_find_screen_similarity.py
@@ -41,7 +41,7 @@ def extract_count(json):
}
)
count_fields_per_screen.append(number_fields)
- print(("Number of available screen fields {} for screen with name {}".format(number_fields, screen.get("name"))))
+ print(f"Number of available screen fields {number_fields} for screen with name {screen.get('name')}")
screens.sort(key=extract_count, reverse=True)
flipped_fields = {}
@@ -49,10 +49,10 @@ def extract_count(json):
print("The same screen of fields based on the count")
for x in screens:
if count_fields_per_screen.count(x["available_fields_count"]) > 1:
- print(("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"])))
+ print(f"Please, check {jira.url}/secure/admin/ConfigureFieldScreen.jspa?id={x['screen_id']}")
print(("=" * 12))
print("The same field screens based on the hash")
for x in screens:
if hashes.count(x["available_fields_hash"]) > 1:
- print(("Please, check {}/secure/admin/ConfigureFieldScreen.jspa?id={}".format(jira.url, x["screen_id"])))
+ print(f"Please, check {jira.url}/secure/admin/ConfigureFieldScreen.jspa?id={x['screen_id']}")
diff --git a/examples/jira/jira_index_fixer.py b/examples/jira/jira_index_fixer.py
index 81fb4c7a1..e1880b605 100644
--- a/examples/jira/jira_index_fixer.py
+++ b/examples/jira/jira_index_fixer.py
@@ -26,6 +26,6 @@ def deindex_issue(self, issue_id):
index_orphant_issues = response["indexOrphans"]
for ticket in index_orphant_issues:
ticket_id = ticket["issueId"]
- print(("Orphan index for ticket id = {}".format(ticket_id)))
+ print(f"Orphan index for ticket id = {ticket_id}")
if fixer:
s.deindex_issue(ticket_id)
diff --git a/examples/jira/jira_issue_type_counter.py b/examples/jira/jira_issue_type_counter.py
index 9ce0497a6..7f0956282 100644
--- a/examples/jira/jira_issue_type_counter.py
+++ b/examples/jira/jira_issue_type_counter.py
@@ -8,13 +8,13 @@
for i in issue_types:
issue_type = i["name"]
- jql_all = 'issuetype = "{0}"'.format(issue_type)
+ jql_all = f'issuetype = "{issue_type}"'
number = jira.jql(jql_all)["total"]
- jql_of_category = 'issuetype = "{0}" AND category = {1}'.format(issue_type, category)
+ jql_of_category = f'issuetype = "{issue_type}" AND category = {category}'
number_of_deprecated = jira.jql(jql_of_category)["total"]
if number > 0:
percent_of_deprecated = number_of_deprecated / number * 100
else:
percent_of_deprecated = 0
percentage = round(percent_of_deprecated, 1)
- print(("{0}, {1}, {2}% of {3}".format(issue_type, number, percentage, category)))
+ print((f"{issue_type}, {number}, {percentage}% of {category}"))
diff --git a/examples/jira/jira_issue_update_epic_link.py b/examples/jira/jira_issue_update_epic_link.py
index 619fa8e0b..2ddf045fb 100644
--- a/examples/jira/jira_issue_update_epic_link.py
+++ b/examples/jira/jira_issue_update_epic_link.py
@@ -12,7 +12,7 @@ def main():
target_epic_issue_key = "ARA-1314"
for issue_key in update_issues:
jira.update_issue_field(issue_key, fields={epic_link_custom_field_id: target_epic_issue_key})
- print(("updated for {}".format(issue_key)))
+ print(f"updated for {issue_key}")
print("done")
diff --git a/examples/jira/jira_jql_fetcher_as_weekly_report.py b/examples/jira/jira_jql_fetcher_as_weekly_report.py
index 8d00d2101..4c400ce63 100644
--- a/examples/jira/jira_jql_fetcher_as_weekly_report.py
+++ b/examples/jira/jira_jql_fetcher_as_weekly_report.py
@@ -28,8 +28,8 @@ def __fetch_user_activity(self, user):
flag = True
limit = 10
step = 0
- jql = "((assignee was in ({})) OR assignee in ({})) AND updated > -{}d ".format(user, user, self.days)
- print(("Start fetching info jql = {}".format(jql)))
+ jql = f"((assignee was in ({user})) OR assignee in ({user})) AND updated > -{self.days}d "
+ print(f"Start fetching info jql = {jql}")
while flag:
try:
response = self.jira.jql(
@@ -66,13 +66,7 @@ def __get_changes_of_cases(self, histories):
] # person who did the change
changes = ["Listing all items that changed:"]
for item in history.get("items"):
- changes.append(
- "{} - {}- {}".format(
- item["field"],
- item["fromString"],
- item["toString"],
- )
- )
+ changes.append(f"{item['field']} - {item['fromString']}- {item['toString']}")
output.append("\t".join(changes))
return " - ".join(output)
@@ -89,7 +83,7 @@ def console_output(self, delimiter="|", console=True):
number = 1
data = []
for case in self.cases:
- print(("Processing case #{}".format(number)))
+ print(f"Processing case #{number}")
output = [
case.get("actor"),
case.get("key"),
diff --git a/examples/jira/jira_oauth2.py b/examples/jira/jira_oauth2.py
index 5c945b15b..abbbd9ca2 100644
--- a/examples/jira/jira_oauth2.py
+++ b/examples/jira/jira_oauth2.py
@@ -63,7 +63,7 @@ def login():
def callback():
jira_oauth = OAuth2Session(client_id, state=session["oauth_state"], redirect_uri=redirect_uri)
token_json = jira_oauth.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url)
- return "Token: {}Projects: {}".format(token_json, ", ".join(get_projects(token_json)))
+ return f"Token: {token_json}Projects: {', '.join(get_projects(token_json))}"
"""
@@ -78,7 +78,7 @@ def get_projects(token_json):
req = requests.get(
"https://api.atlassian.com/oauth/token/accessible-resources",
headers={
- "Authorization": "Bearer {}".format(token_json["access_token"]),
+ "Authorization": f"Bearer {token_json['access_token']}",
"Accept": "application/json",
},
)
@@ -93,5 +93,5 @@ def get_projects(token_json):
"token_type": "Bearer",
},
}
- jira = Jira(url="https://api.atlassian.com/ex/jira/{}".format(cloud_id), oauth2=oauth2_dict)
+ jira = Jira(url=f"https://api.atlassian.com/ex/jira/{cloud_id}", oauth2=oauth2_dict)
return [project["name"] for project in jira.projects()]
diff --git a/examples/jira/jira_project_leaders.py b/examples/jira/jira_project_leaders.py
index b620f415f..d01ee9d95 100644
--- a/examples/jira/jira_project_leaders.py
+++ b/examples/jira/jira_project_leaders.py
@@ -26,10 +26,6 @@
for project in jira.project_leaders():
print(
(
- "| {project_key} | {project_name} | {lead_email_link} |".format(
- project_key=project["project_key"],
- project_name=project["project_name"],
- lead_email_link=MAILTO.format(lead_name=project["lead_name"], lead_email=project["lead_email"]),
- )
+ f"| {project['project_key']} | {project['project_name']} | {MAILTO.format(lead_name=project['lead_name'], lead_email=project['lead_email'])} |"
)
)
diff --git a/examples/jira/jira_review_groups.py b/examples/jira/jira_review_groups.py
index 2a65bc811..7fa4d7a19 100644
--- a/examples/jira/jira_review_groups.py
+++ b/examples/jira/jira_review_groups.py
@@ -74,7 +74,7 @@ def exclude_inactive_users(groups):
"""
for group in groups:
for user in group["users"]:
- print(("Trying to delete {} from group {}".format(user["name"], group["group_name"])))
+ print(f"Trying to delete {user['name']} from group {group['group_name']}")
jira.remove_user_from_group(user["name"], group["group_name"])
return True
@@ -100,4 +100,4 @@ def find_group(groups, group_name):
if group["group_name"] == group_name:
return group
else:
- return "Group {} not in list".format(group_name)
+ return f"Group {group_name} not in list"
diff --git a/tests/mockup.py b/tests/mockup.py
index f1d7f3ed3..b6936ad52 100644
--- a/tests/mockup.py
+++ b/tests/mockup.py
@@ -18,7 +18,7 @@ def request_mockup(*args, **kwargs):
method = kwargs["method"]
url = kwargs["url"]
if not url.startswith(SERVER + "/"):
- raise ValueError("URL [{}] does not start with [{}/].".format(url, SERVER))
+ raise ValueError(f"URL [{url}] does not start with [{SERVER}/].")
parts = url[len(SERVER) + 1 :].split("?")
url = parts[0]
response_key = parts[1] if len(parts) > 1 else None
@@ -50,9 +50,9 @@ def request_mockup(*args, **kwargs):
if "links" in cur_dict:
for link in list(cur_dict["links"].values()):
for ld in link if type(link) is list else [link]:
- ld["href"] = "{}/{}".format(SERVER, ld["href"])
+ ld["href"] = f"{SERVER}/{ld['href']}"
if "next" in data:
- data["next"] = "{}/{}".format(SERVER, data["next"])
+ data["next"] = f"{SERVER}/{data['next']}"
response.encoding = "utf-8"
response._content = bytes(json.dumps(data), response.encoding)
@@ -63,12 +63,12 @@ def request_mockup(*args, **kwargs):
response.encoding = "utf-8"
response._content = b"{}"
response.status_code = 404 # Not found
- response.reason = "No stub defined [{}]".format(response_file)
+ response.reason = f"No stub defined [{response_file}]"
except KeyError:
response.encoding = "utf-8"
response._content = b"{}"
response.status_code = 404 # Not found
- response.reason = "No stub defined for key [{}] in [{}]".format(response_key, response_file)
+ response.reason = f"No stub defined for key [{response_key}] in [{response_file}]"
return response
diff --git a/tests/test_bitbucket_cloud_oo.py b/tests/test_bitbucket_cloud_oo.py
index 2def5998f..3c0d63ccc 100644
--- a/tests/test_bitbucket_cloud_oo.py
+++ b/tests/test_bitbucket_cloud_oo.py
@@ -13,10 +13,8 @@
try:
from .mockup import mockup_server
- BITBUCKET = Bitbucket(
- "{}/bitbucket/cloud".format(mockup_server()), username="username", password="password", cloud=True
- )
- CLOUD = Cloud("{}/bitbucket/cloud".format(mockup_server()), username="username", password="password")
+ BITBUCKET = Bitbucket(f"{mockup_server()}/bitbucket/cloud", username="username", password="password", cloud=True)
+ CLOUD = Cloud(f"{mockup_server()}/bitbucket/cloud", username="username", password="password")
except ImportError:
pass
diff --git a/tests/test_bitbucket_server.py b/tests/test_bitbucket_server.py
index c6846c346..a4942f91c 100644
--- a/tests/test_bitbucket_server.py
+++ b/tests/test_bitbucket_server.py
@@ -7,9 +7,7 @@
class TestWebhook(TestCase):
def setUp(self):
- self.bitbucket = Bitbucket(
- "{}/bitbucket/server".format(mockup_server()), username="username", password="password"
- )
+ self.bitbucket = Bitbucket(f"{mockup_server()}/bitbucket/server", username="username", password="password")
self.project_key = "PRJ"
self.repository_slug = "my-repo1-slug"
self.webhook_id = 3
diff --git a/tests/test_bitbucket_server_oo.py b/tests/test_bitbucket_server_oo.py
index a5bf3c19d..7f659311d 100644
--- a/tests/test_bitbucket_server_oo.py
+++ b/tests/test_bitbucket_server_oo.py
@@ -10,9 +10,7 @@
try:
from .mockup import mockup_server
- BITBUCKET = Server(
- "{}/bitbucket/server".format(mockup_server()), username="username", password="password", cloud=True
- )
+ BITBUCKET = Server(f"{mockup_server()}/bitbucket/server", username="username", password="password", cloud=True)
except ImportError:
pass
diff --git a/tests/test_confluence_advanced_mode.py b/tests/test_confluence_advanced_mode.py
index 9a07f85f8..13f9632e5 100644
--- a/tests/test_confluence_advanced_mode.py
+++ b/tests/test_confluence_advanced_mode.py
@@ -37,7 +37,7 @@ def setUpClass(cls):
password=credentials["password"],
)
except Exception as err:
- raise cls.failureException("[{0}]: {1}".format(cls.secret_file, err))
+ raise cls.failureException(f"[{cls.secret_file}]: {err}")
cls.space = "SAN"
cls.created_pages = set()
@@ -79,7 +79,7 @@ def test_confluence_advanced_mode_put(self):
"body": {"editor": {"value": "Updated page
", "representation": "editor"}},
}
- result = self.confluence.put(path="/rest/api/content/{0}".format(page_id), data=data, advanced_mode=True)
+ result = self.confluence.put(path=f"/rest/api/content/{page_id}", data=data, advanced_mode=True)
self.assertIsInstance(result, Response)
def test_confluence_advanced_mode_delete(self):
@@ -89,9 +89,7 @@ def test_confluence_advanced_mode_delete(self):
page_id = self.confluence.create_page(
space=self.space, title=page_title, body="h1. Test content\n", representation="wiki"
)["id"]
- response = self.confluence.delete(
- path="rest/api/content/{page_id}".format(page_id=page_id), params={}, advanced_mode=True
- )
+ response = self.confluence.delete(path=f"rest/api/content/{page_id}", params={}, advanced_mode=True)
self.assertIsInstance(response, Response)
def tearDown(self):
diff --git a/tests/test_confluence_attach.py b/tests/test_confluence_attach.py
index 82e5fda9e..3761ce2ce 100644
--- a/tests/test_confluence_attach.py
+++ b/tests/test_confluence_attach.py
@@ -30,7 +30,7 @@ def test_confluence_attach_file_1(self):
with open(self.secret_file) as json_file:
credentials = json.load(json_file)
except Exception as err:
- self.fail("[{0}]: {1}".format(self.secret_file, err))
+ self.fail(f"[{self.secret_file}]: {err}")
confluence = Confluence(
url=credentials["host"],
@@ -75,7 +75,7 @@ def test_confluence_attach_file_2(self):
with open(self.secret_file) as json_file:
credentials = json.load(json_file)
except Exception as err:
- self.fail("[{0}]: {1}".format(self.secret_file, err))
+ self.fail(f"[{self.secret_file}]: {err}")
confluence = Confluence(
url=credentials["host"],
@@ -136,7 +136,7 @@ def test_confluence_attach_content(self):
with open(self.secret_file) as json_file:
credentials = json.load(json_file)
except Exception as err:
- self.fail("[{0}]: {1}".format(self.secret_file, err))
+ self.fail(f"[{self.secret_file}]: {err}")
confluence = Confluence(
url=credentials["host"],
diff --git a/tests/test_jira.py b/tests/test_jira.py
index 04802e021..1edeb0de3 100644
--- a/tests/test_jira.py
+++ b/tests/test_jira.py
@@ -8,7 +8,7 @@
class TestJira(TestCase):
def setUp(self):
- self.jira = jira.Jira("{}/jira".format(mockup_server()), username="username", password="password", cloud=True)
+ self.jira = jira.Jira(f"{mockup_server()}/jira", username="username", password="password", cloud=True)
def test_get_issue(self):
"""Can retrieve an Issue by ID"""
diff --git a/tests/test_servicedesk.py b/tests/test_servicedesk.py
index edd63571c..ef9e38110 100644
--- a/tests/test_servicedesk.py
+++ b/tests/test_servicedesk.py
@@ -9,9 +9,7 @@
try:
from .mockup import mockup_server
- SERVICEDESK = ServiceDesk(
- "{}/servicedesk".format(mockup_server()), username="username", password="password", cloud=True
- )
+ SERVICEDESK = ServiceDesk(f"{mockup_server()}/servicedesk", username="username", password="password", cloud=True)
except ImportError:
pass