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

Commit 41fc62d

Browse files
authored
Merge pull request #292 from cloudant/291-doc-throw-on-exists
291 doc throw on exists
2 parents cb9ae6c + 2722aa6 commit 41fc62d

File tree

5 files changed

+31
-16
lines changed

5 files changed

+31
-16
lines changed

src/cloudant/_common_util.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,8 @@ def _py_to_couch_translate(key, val):
201201
return {key: val}
202202
elif val is None:
203203
return {key: None}
204-
else:
205-
arg_converter = TYPE_CONVERTERS.get(type(val))
206-
return {key: arg_converter(val)}
204+
arg_converter = TYPE_CONVERTERS.get(type(val))
205+
return {key: arg_converter(val)}
207206
except Exception as ex:
208207
raise CloudantArgumentError(136, key, ex)
209208

@@ -299,7 +298,7 @@ def __init__(self, username, password, server_url, **kwargs):
299298
self._server_url = server_url
300299
self._timeout = kwargs.get('timeout', None)
301300

302-
def request(self, method, url, **kwargs):
301+
def request(self, method, url, **kwargs): # pylint: disable=W0221
303302
"""
304303
Overrides ``requests.Session.request`` to perform a POST to the
305304
_session endpoint to renew Session cookie authentication settings and
@@ -338,7 +337,7 @@ def __init__(self, username, password, server_url, **kwargs):
338337
self._server_url = server_url
339338
self._timeout = kwargs.get('timeout', None)
340339

341-
def request(self, method, url, **kwargs):
340+
def request(self, method, url, **kwargs): # pylint: disable=W0221
342341
"""
343342
Overrides ``requests.Session.request`` to set the timeout.
344343
"""

src/cloudant/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,8 @@ def get(self, key, default=None, remote=False):
371371
if db.exists():
372372
super(CouchDB, self).__setitem__(key, db)
373373
return db
374-
else:
375-
return default
374+
375+
return default
376376

377377
def __setitem__(self, key, value, remote=False):
378378
"""

src/cloudant/database.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,15 @@ def create_document(self, data, throw_on_exists=False):
157157
doc = DesignDocument(self, docid)
158158
else:
159159
doc = Document(self, docid)
160-
if throw_on_exists and doc.exists():
161-
raise CloudantDatabaseException(409, docid)
162160
doc.update(data)
163-
doc.create()
161+
try:
162+
doc.create()
163+
except HTTPError as error:
164+
if error.response.status_code == 409:
165+
if throw_on_exists:
166+
raise CloudantDatabaseException(409, docid)
167+
else:
168+
raise
164169
super(CouchDatabase, self).__setitem__(doc['_id'], doc)
165170
return doc
166171

@@ -326,8 +331,8 @@ def get_view_result(self, ddoc_id, view_name, raw_result=False, **kwargs):
326331
return view(**kwargs)
327332
elif kwargs:
328333
return Result(view, **kwargs)
329-
else:
330-
return view.result
334+
335+
return view.result
331336

332337
def create(self, throw_on_exists=False):
333338
"""
@@ -1232,8 +1237,8 @@ def get_query_result(self, selector, fields=None, raw_result=False,
12321237
return query(**kwargs)
12331238
if kwargs:
12341239
return QueryResult(query, **kwargs)
1235-
else:
1236-
return query.result
1240+
1241+
return query.result
12371242

12381243
def get_search_result(self, ddoc_id, index_name, **query_params):
12391244
"""

src/cloudant/result.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def __getitem__(self, arg):
201201
data = None
202202
if isinstance(arg, int):
203203
data = self._handle_result_by_index(arg)
204-
elif isinstance(arg, STRTYPE) or isinstance(arg, list):
204+
elif isinstance(arg, (STRTYPE, list)):
205205
data = self._handle_result_by_key(arg)
206206
elif isinstance(arg, ResultByKey):
207207
data = self._handle_result_by_key(arg())
@@ -345,7 +345,7 @@ def __iter__(self):
345345
)
346346
result = self._parse_data(response)
347347
skip += int(self._page_size)
348-
if len(result) > 0:
348+
if result:
349349
for row in result:
350350
yield row
351351
del result

tests/unit/database_tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,17 @@ def test_create_document_with_id(self):
267267
'Document with id julia06 already exists.'
268268
)
269269

270+
def test_create_document_that_already_exists(self):
271+
"""
272+
Test creating a document that already exists
273+
"""
274+
data = {'_id': 'julia'}
275+
doc = self.db.create_document(data)
276+
self.assertEqual(self.db['julia'], doc)
277+
self.assertTrue(doc['_rev'].startswith('1-'))
278+
# attempt to recreate document
279+
self.db.create_document(data, throw_on_exists=False)
280+
270281
def test_create_document_without_id(self):
271282
"""
272283
Test creating a document without supplying a document id

0 commit comments

Comments
 (0)