Skip to content

Commit f0a717c

Browse files
committed
Cloud specs reduce extra params #997
1 parent c4e1309 commit f0a717c

6 files changed

Lines changed: 55 additions & 8 deletions

File tree

‎README.rst‎

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,20 @@ not base64-encode them yourself.
121121
page = confluence_v2.get_page_by_id("123456789", body_format="storage")
122122
storage_xhtml = page["body"]["storage"]["value"]
123123
124+
# Alternative Confluence Cloud V2 page read. Use the site URL without a trailing /wiki;
125+
# the client adds the required API context.
126+
from atlassian import Confluence
127+
128+
confluence_v2 = Confluence(
129+
"https://your-domain.atlassian.net",
130+
username="you@example.com",
131+
password="cloud-api-token",
132+
api_version=2, # Specify API version 2
133+
cloud=True
134+
)
135+
page = confluence_v2.get_page_by_id("123456789", body_format="storage")
136+
storage_xhtml = page["body"]["storage"]["value"]
137+
124138
See the detailed `authentication documentation`_ for Cloud gateway/scoped-token
125139
notes and other authentication methods.
126140

@@ -169,15 +183,13 @@ The library now supports Confluence's v2 API for Cloud instances. The v2 API pro
169183

170184
.. code-block:: python
171185
172-
from atlassian import Confluence
186+
from atlassian import ConfluenceV2
173187
174-
# Initialize with v2 API
175-
confluence = Confluence(
176-
url='https://your-instance.atlassian.net/wiki',
188+
# ConfluenceV2 is an explicit Cloud V2 client; no cloud=True flag is needed.
189+
confluence = ConfluenceV2(
190+
url='https://your-instance.atlassian.net',
177191
username='your-email@example.com',
178192
password='your-api-token',
179-
api_version=2, # Specify API version 2
180-
cloud=True # v2 API is only available for cloud instances
181193
)
182194
183195
# Get pages from a space

‎atlassian/confluence/__init__.py‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"""
77

88
from urllib.parse import urlparse
9+
import warnings
910

1011
from ..confluence_base import ConfluenceBase
1112
from .cloud import Cloud as LegacyConfluenceCloud
@@ -31,6 +32,15 @@ def __new__(cls, url, *args, **kwargs):
3132
def __init__(self, url, *args, **kwargs):
3233
if type(self) is not Confluence:
3334
return
35+
if kwargs.get("api_version") == "cloud":
36+
warnings.warn(
37+
"api_version='cloud' is deprecated; use cloud=True, or "
38+
"ConfluenceV2 for the Cloud V2 API.",
39+
DeprecationWarning,
40+
stacklevel=2,
41+
)
42+
kwargs.pop("api_version")
43+
kwargs["cloud"] = True
3444
# Detect which implementation to use
3545
# Priority: explicit cloud= kwarg > URL-based heuristic
3646
is_cloud = kwargs.get("cloud")

‎atlassian/confluence/cloud/__init__.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import re
55
import time
6+
import warnings
67
from urllib.parse import quote
78
from .base import ConfluenceCloudBase
89
import requests
@@ -22,6 +23,14 @@ class Cloud(ConfluenceCloudBase):
2223
"""
2324

2425
def __init__(self, url="https://api.atlassian.com/", *args, **kwargs):
26+
if kwargs.get("api_version") == "cloud":
27+
warnings.warn(
28+
"api_version='cloud' is deprecated; ConfluenceCloud already "
29+
"selects Cloud endpoints.",
30+
DeprecationWarning,
31+
stacklevel=2,
32+
)
33+
kwargs.pop("api_version")
2534
# Set default values only if not provided
2635
if "cloud" not in kwargs:
2736
kwargs["cloud"] = True

‎docs/confluence.rst‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,8 @@ Page actions
341341
confluence.has_unknown_attachment_error(page_id)
342342
343343
# Export page as PDF
344-
# api_version needs to be set to 'cloud' when exporting from Confluence Cloud
345-
.
344+
# Use ConfluenceCloud (or Confluence(..., cloud=True)) for Cloud exports.
345+
# ``api_version='cloud'`` is deprecated; use ConfluenceV2 for Cloud V2 APIs.
346346
confluence.export_page(page_id)
347347
348348
# Server/Data Center only: legacy Word exporter. The returned bytes are a

‎tests/confluence/test_confluence_cloud.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ def test_init_custom_values(self):
3535
assert confluence.api_version == "1"
3636
assert confluence.api_root == "custom/api/root"
3737

38+
def test_legacy_cloud_api_version_is_normalized(self):
39+
with pytest.warns(DeprecationWarning):
40+
confluence = ConfluenceCloud(url="https://test.atlassian.net", api_version="cloud")
41+
42+
assert confluence.api_version == "2"
43+
3844
@patch.object(ConfluenceCloud, "_get_paged")
3945
def test_iter_cql_follows_all_result_pages(self, mock_get_paged, confluence_cloud):
4046
mock_get_paged.return_value = iter([{"id": "1"}, {"id": "2"}])

‎tests/confluence/test_confluence_routing.py‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
from unittest.mock import patch
55

6+
import pytest
7+
68
from atlassian.confluence import Confluence, ConfluenceCloud, ConfluenceServer
79
from atlassian.confluence.cloud.cloud import ConfluenceCloud as V2ConfluenceCloud
810

@@ -65,3 +67,11 @@ def test_explicit_cloud_false_overrides_url(self, mock_server, mock_cloud):
6567
Confluence("https://mysite.atlassian.net", cloud=False)
6668
mock_server.assert_called_once()
6769
mock_cloud.assert_not_called()
70+
71+
def test_legacy_cloud_api_version_is_normalized_to_cloud_flag(self):
72+
"""The historical api_version='cloud' spelling remains compatible."""
73+
with pytest.warns(DeprecationWarning):
74+
client = Confluence("https://confluence.example.test", api_version="cloud")
75+
76+
assert client._impl.cloud is True
77+
assert client._impl.api_version == "2"

0 commit comments

Comments
 (0)