Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 07f3ad9

Browse files
authored
Merge pull request #322 from cloudant/127-change-posix-path-to-str-join
Use `'/'.join()` to concatenate URL parts
2 parents d007eb8 + ce75c57 commit 07f3ad9

File tree

12 files changed

+58
-86
lines changed

12 files changed

+58
-86
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
Unreleased
22
==========
3+
- [IMPROVED] Updated ``posixpath.join`` references to use ``'/'.join`` when concatenating URL parts.
34

45
2.6.0 (2017-08-10)
56
==================

src/cloudant/client.py

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
"""
1919
import base64
2020
import json
21-
import posixpath
2221

2322
from ._2to3 import bytes_, unicode_
2423
from .database import CloudantDatabase, CouchDatabase
@@ -138,7 +137,7 @@ def session(self):
138137
"""
139138
if self.admin_party:
140139
return None
141-
sess_url = posixpath.join(self.server_url, '_session')
140+
sess_url = '/'.join((self.server_url, '_session'))
142141
resp = self.r_session.get(sess_url)
143142
resp.raise_for_status()
144143
sess_data = resp.json()
@@ -164,7 +163,7 @@ def session_login(self, user, passwd):
164163
"""
165164
if self.admin_party:
166165
return
167-
sess_url = posixpath.join(self.server_url, '_session')
166+
sess_url = '/'.join((self.server_url, '_session'))
168167
resp = self.r_session.post(
169168
sess_url,
170169
data={
@@ -182,7 +181,7 @@ def session_logout(self):
182181
"""
183182
if self.admin_party:
184183
return
185-
sess_url = posixpath.join(self.server_url, '_session')
184+
sess_url = '/'.join((self.server_url, '_session'))
186185
resp = self.r_session.delete(sess_url)
187186
resp.raise_for_status()
188187

@@ -207,7 +206,7 @@ def all_dbs(self):
207206
208207
:returns: List of database names for the client
209208
"""
210-
url = posixpath.join(self.server_url, '_all_dbs')
209+
url = '/'.join((self.server_url, '_all_dbs'))
211210
resp = self.r_session.get(url)
212211
resp.raise_for_status()
213212
return resp.json()
@@ -560,9 +559,7 @@ def _usage_endpoint(self, endpoint, year=None, month=None):
560559
try:
561560
if int(year) > 0 and int(month) in range(1, 13):
562561
resp = self.r_session.get(
563-
posixpath.join(
564-
endpoint, str(int(year)), str(int(month)))
565-
)
562+
'/'.join((endpoint, str(int(year)), str(int(month)))))
566563
else:
567564
err = True
568565
except (ValueError, TypeError):
@@ -587,7 +584,7 @@ def bill(self, year=None, month=None):
587584
588585
:returns: Billing data in JSON format
589586
"""
590-
endpoint = posixpath.join(self.server_url, '_api', 'v2', 'bill')
587+
endpoint = '/'.join((self.server_url, '_api', 'v2', 'bill'))
591588
return self._usage_endpoint(endpoint, year, month)
592589

593590
def volume_usage(self, year=None, month=None):
@@ -604,9 +601,8 @@ def volume_usage(self, year=None, month=None):
604601
605602
:returns: Volume usage data in JSON format
606603
"""
607-
endpoint = posixpath.join(
608-
self.server_url, '_api', 'v2', 'usage', 'data_volume'
609-
)
604+
endpoint = '/'.join((
605+
self.server_url, '_api', 'v2', 'usage', 'data_volume'))
610606
return self._usage_endpoint(endpoint, year, month)
611607

612608
def requests_usage(self, year=None, month=None):
@@ -623,9 +619,8 @@ def requests_usage(self, year=None, month=None):
623619
624620
:returns: Requests usage data in JSON format
625621
"""
626-
endpoint = posixpath.join(
627-
self.server_url, '_api', 'v2', 'usage', 'requests'
628-
)
622+
endpoint = '/'.join((
623+
self.server_url, '_api', 'v2', 'usage', 'requests'))
629624
return self._usage_endpoint(endpoint, year, month)
630625

631626
def shared_databases(self):
@@ -635,9 +630,8 @@ def shared_databases(self):
635630
636631
:returns: List of database names
637632
"""
638-
endpoint = posixpath.join(
639-
self.server_url, '_api', 'v2', 'user', 'shared_databases'
640-
)
633+
endpoint = '/'.join((
634+
self.server_url, '_api', 'v2', 'user', 'shared_databases'))
641635
resp = self.r_session.get(endpoint)
642636
resp.raise_for_status()
643637
data = resp.json()
@@ -649,9 +643,7 @@ def generate_api_key(self):
649643
650644
:returns: API key/pass pair in JSON format
651645
"""
652-
endpoint = posixpath.join(
653-
self.server_url, '_api', 'v2', 'api_keys'
654-
)
646+
endpoint = '/'.join((self.server_url, '_api', 'v2', 'api_keys'))
655647
resp = self.r_session.post(endpoint)
656648
resp.raise_for_status()
657649
return resp.json()
@@ -662,9 +654,8 @@ def cors_configuration(self):
662654
663655
:returns: CORS data in JSON format
664656
"""
665-
endpoint = posixpath.join(
666-
self.server_url, '_api', 'v2', 'user', 'config', 'cors'
667-
)
657+
endpoint = '/'.join((
658+
self.server_url, '_api', 'v2', 'user', 'config', 'cors'))
668659
resp = self.r_session.get(endpoint)
669660
resp.raise_for_status()
670661

@@ -754,9 +745,8 @@ def _write_cors_configuration(self, config):
754745
755746
:returns: CORS configuration update status in JSON format
756747
"""
757-
endpoint = posixpath.join(
758-
self.server_url, '_api', 'v2', 'user', 'config', 'cors'
759-
)
748+
endpoint = '/'.join((
749+
self.server_url, '_api', 'v2', 'user', 'config', 'cors'))
760750
resp = self.r_session.put(
761751
endpoint,
762752
data=json.dumps(config, cls=self.encoder),

src/cloudant/database.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
"""
1818
import json
1919
import contextlib
20-
import posixpath
2120

2221
from requests.exceptions import HTTPError
2322

@@ -84,10 +83,8 @@ def database_url(self):
8483
8584
:returns: Database URL
8685
"""
87-
return posixpath.join(
88-
self._database_host,
89-
url_quote_plus(self.database_name)
90-
)
86+
return '/'.join((
87+
self._database_host, url_quote_plus(self.database_name)))
9188

9289
@property
9390
def creds(self):
@@ -189,7 +186,7 @@ def design_documents(self):
189186
190187
:returns: All design documents found in this database in JSON format
191188
"""
192-
url = posixpath.join(self.database_url, '_all_docs')
189+
url = '/'.join((self.database_url, '_all_docs'))
193190
query = "startkey=\"_design\"&endkey=\"_design0\"&include_docs=true"
194191
resp = self.r_session.get(url, params=query)
195192
resp.raise_for_status()
@@ -203,7 +200,7 @@ def list_design_documents(self):
203200
204201
:returns: List of names for all design documents in this database
205202
"""
206-
url = posixpath.join(self.database_url, '_all_docs')
203+
url = '/'.join((self.database_url, '_all_docs'))
207204
query = "startkey=\"_design\"&endkey=\"_design0\""
208205
resp = self.r_session.get(url, params=query)
209206
resp.raise_for_status()
@@ -675,7 +672,7 @@ def bulk_docs(self, docs):
675672
676673
:returns: Bulk document creation/update status in JSON format
677674
"""
678-
url = posixpath.join(self.database_url, '_bulk_docs')
675+
url = '/'.join((self.database_url, '_bulk_docs'))
679676
data = {'docs': docs}
680677
headers = {'Content-Type': 'application/json'}
681678
resp = self.r_session.post(
@@ -698,7 +695,7 @@ def missing_revisions(self, doc_id, *revisions):
698695
699696
:returns: List of missing document revision values
700697
"""
701-
url = posixpath.join(self.database_url, '_missing_revs')
698+
url = '/'.join((self.database_url, '_missing_revs'))
702699
data = {doc_id: list(revisions)}
703700

704701
resp = self.r_session.post(
@@ -727,7 +724,7 @@ def revisions_diff(self, doc_id, *revisions):
727724
728725
:returns: The revision differences in JSON format
729726
"""
730-
url = posixpath.join(self.database_url, '_revs_diff')
727+
url = '/'.join((self.database_url, '_revs_diff'))
731728
data = {doc_id: list(revisions)}
732729

733730
resp = self.r_session.post(
@@ -746,7 +743,7 @@ def get_revision_limit(self):
746743
747744
:returns: Revision limit value for the current remote database
748745
"""
749-
url = posixpath.join(self.database_url, '_revs_limit')
746+
url = '/'.join((self.database_url, '_revs_limit'))
750747
resp = self.r_session.get(url)
751748
resp.raise_for_status()
752749

@@ -767,7 +764,7 @@ def set_revision_limit(self, limit):
767764
768765
:returns: Revision limit set operation status in JSON format
769766
"""
770-
url = posixpath.join(self.database_url, '_revs_limit')
767+
url = '/'.join((self.database_url, '_revs_limit'))
771768

772769
resp = self.r_session.put(url, data=json.dumps(limit, cls=self.client.encoder))
773770
resp.raise_for_status()
@@ -781,7 +778,7 @@ def view_cleanup(self):
781778
782779
:returns: View cleanup status in JSON format
783780
"""
784-
url = posixpath.join(self.database_url, '_view_cleanup')
781+
url = '/'.join((self.database_url, '_view_cleanup'))
785782
resp = self.r_session.post(
786783
url,
787784
headers={'Content-Type': 'application/json'}
@@ -958,8 +955,8 @@ def security_url(self):
958955
959956
:returns: Security document URL
960957
"""
961-
parts = ['_api', 'v2', 'db', self.database_name, '_security']
962-
url = posixpath.join(self._database_host, *parts)
958+
url = '/'.join((self._database_host, '_api', 'v2', 'db',
959+
self.database_name, '_security'))
963960
return url
964961

965962
def share_database(self, username, roles=None):
@@ -1040,7 +1037,7 @@ def shards(self):
10401037
10411038
:returns: Shard information retrieval status in JSON format
10421039
"""
1043-
url = posixpath.join(self.database_url, '_shards')
1040+
url = '/'.join((self.database_url, '_shards'))
10441041
resp = self.r_session.get(url)
10451042
resp.raise_for_status()
10461043

@@ -1059,7 +1056,7 @@ def get_query_indexes(self, raw_result=False):
10591056
:returns: The query indexes in the database
10601057
"""
10611058

1062-
url = posixpath.join(self.database_url, '_index')
1059+
url = '/'.join((self.database_url, '_index'))
10631060
resp = self.r_session.get(url)
10641061
resp.raise_for_status()
10651062

src/cloudant/document.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
API module/class for interacting with a document in a database.
1717
"""
1818
import json
19-
import posixpath
2019
import requests
2120
from requests.exceptions import HTTPError
2221

@@ -87,19 +86,19 @@ def document_url(self):
8786

8887
# handle design document url
8988
if self._document_id.startswith('_design/'):
90-
return posixpath.join(
89+
return '/'.join((
9190
self._database_host,
9291
url_quote_plus(self._database_name),
9392
'_design',
9493
url_quote(self._document_id[8:], safe='')
95-
)
94+
))
9695

9796
# handle document url
98-
return posixpath.join(
97+
return '/'.join((
9998
self._database_host,
10099
url_quote_plus(self._database_name),
101100
url_quote(self._document_id, safe='')
102-
)
101+
))
103102

104103
def exists(self):
105104
"""
@@ -389,7 +388,7 @@ def get_attachment(
389388
"""
390389
# need latest rev
391390
self.fetch()
392-
attachment_url = posixpath.join(self.document_url, attachment)
391+
attachment_url = '/'.join((self.document_url, attachment))
393392
if headers is None:
394393
headers = {'If-Match': self['_rev']}
395394
else:
@@ -432,7 +431,7 @@ def delete_attachment(self, attachment, headers=None):
432431
"""
433432
# need latest rev
434433
self.fetch()
435-
attachment_url = posixpath.join(self.document_url, attachment)
434+
attachment_url = '/'.join((self.document_url, attachment))
436435
if headers is None:
437436
headers = {'If-Match': self['_rev']}
438437
else:
@@ -473,7 +472,7 @@ def put_attachment(self, attachment, content_type, data, headers=None):
473472
"""
474473
# need latest rev
475474
self.fetch()
476-
attachment_url = posixpath.join(self.document_url, attachment)
475+
attachment_url = '/'.join((self.document_url, attachment))
477476
if headers is None:
478477
headers = {
479478
'If-Match': self['_rev'],

src/cloudant/index.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
API module for managing/viewing query indexes.
1717
"""
1818

19-
import posixpath
2019
import json
2120

2221
from ._2to3 import STRTYPE, iteritems_
@@ -60,7 +59,7 @@ def index_url(self):
6059
6160
:returns: Index URL
6261
"""
63-
return posixpath.join(self._database.database_url, '_index')
62+
return '/'.join((self._database.database_url, '_index'))
6463

6564
@property
6665
def design_document_id(self):
@@ -166,7 +165,7 @@ def delete(self):
166165
ddoc_id = self._ddoc_id
167166
if ddoc_id.startswith('_design/'):
168167
ddoc_id = ddoc_id[8:]
169-
url = posixpath.join(self.index_url, ddoc_id, self._type, self._name)
168+
url = '/'.join((self.index_url, ddoc_id, self._type, self._name))
170169
resp = self._r_session.delete(url)
171170
resp.raise_for_status()
172171
return

src/cloudant/query.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
API module for composing and executing Cloudant queries.
1717
"""
1818

19-
import posixpath
2019
import json
2120
import contextlib
2221

@@ -105,7 +104,7 @@ def url(self):
105104
106105
:returns: Query URL
107106
"""
108-
return posixpath.join(self._database.database_url, '_find')
107+
return '/'.join((self._database.database_url, '_find'))
109108

110109
def __call__(self, **kwargs):
111110
"""

src/cloudant/view.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
API module for interacting with a view in a design document.
1717
"""
1818
import contextlib
19-
import posixpath
2019

2120
from ._2to3 import STRTYPE
2221
from ._common_util import codify, get_docs
@@ -168,11 +167,11 @@ def url(self):
168167
169168
:returns: View URL
170169
"""
171-
return posixpath.join(
170+
return '/'.join((
172171
self.design_doc.document_url,
173172
'_view',
174173
self.view_name
175-
)
174+
))
176175

177176
def __call__(self, **kwargs):
178177
"""

0 commit comments

Comments
 (0)