Skip to content

Commit

Permalink
[Cosmos] Add option for disabling auto id generation in create_item (#…
Browse files Browse the repository at this point in the history
…15715)

* Add option for disabling auto id generation in create_item

* Adds ID generation to kwargs, removes bad test

* Default disableAutoID gen to true, add back test

* use correct kwarg

* Fix test typos

* Change flag to enable instead of disable

* Adds test for item create with no ID

* disable header flag

* Fixes auto ID generation in create_item

* Remove print and unnecessary passthrough_args
  • Loading branch information
zfoster authored Jan 15, 2021
1 parent f7e0d77 commit 72afdd0
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1072,20 +1072,21 @@ def CreateItem(self, database_or_container_link, document, options=None, **kwarg
# not each time the function is called (like it is in say, Ruby). This means
# that if you use a mutable default argument and mutate it, you will and have
# mutated that object for all future calls to the function as well. So, using
# a non-mutable deafult in this case(None) and assigning an empty dict(mutable)
# a non-mutable default in this case(None) and assigning an empty dict(mutable)
# inside the method For more details on this gotcha, please refer
# http://docs.python-guide.org/en/latest/writing/gotchas/
if options is None:
options = {}

# We check the link to be document collection link since it can be database
# link in case of client side partitioning
if base.IsItemContainerLink(database_or_container_link):
options = self._AddPartitionKey(database_or_container_link, document, options)

collection_id, document, path = self._GetContainerIdWithPathForItem(
database_or_container_link, document, options
)

if base.IsItemContainerLink(database_or_container_link):
options = self._AddPartitionKey(database_or_container_link, document, options)

return self.Create(document, path, "docs", collection_id, None, options, **kwargs)

def UpsertItem(self, database_or_container_link, document, options=None, **kwargs):
Expand Down
3 changes: 2 additions & 1 deletion sdk/cosmos/azure-cosmos/azure/cosmos/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,7 @@ def create_item(
:param pre_trigger_include: trigger id to be used as pre operation trigger.
:param post_trigger_include: trigger id to be used as post operation trigger.
:param indexing_directive: Indicate whether the document should be omitted from indexing.
:keyword bool enable_automatic_id_generation: Enable automatic id generation if no id present.
:keyword str session_token: Token for use with Session consistency.
:keyword dict[str,str] initial_headers: Initial headers to be sent as part of the request.
:keyword str etag: An ETag value, or the wildcard character (*). Used to check if the resource
Expand All @@ -498,7 +499,7 @@ def create_item(
request_options = build_options(kwargs)
response_hook = kwargs.pop('response_hook', None)

request_options["disableAutomaticIdGeneration"] = True
request_options["disableAutomaticIdGeneration"] = not kwargs.pop('enable_automatic_id_generation', False)
if populate_query_metrics:
request_options["populateQueryMetrics"] = populate_query_metrics
if pre_trigger_include is not None:
Expand Down
11 changes: 10 additions & 1 deletion sdk/cosmos/azure-cosmos/test/test_crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,15 @@ def test_document_crud(self):
# create a document
before_create_documents_count = len(documents)

# create a document with auto ID generation
document_definition = {'name': 'sample document',
'spam': 'eggs',
'key': 'value'}

created_document = created_collection.create_item(body=document_definition, enable_automatic_id_generation=True)
self.assertEqual(created_document.get('name'),
document_definition['name'])

document_definition = {'name': 'sample document',
'spam': 'eggs',
'key': 'value',
Expand All @@ -790,7 +799,7 @@ def test_document_crud(self):
documents = list(created_collection.read_all_items())
self.assertEqual(
len(documents),
before_create_documents_count + 1,
before_create_documents_count + 2,
'create should increase the number of documents')
# query documents
documents = list(created_collection.query_items(
Expand Down
10 changes: 5 additions & 5 deletions sdk/cosmos/azure-cosmos/test/test_ttl.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ def test_document_ttl_with_positive_defaultTtl(self):

time.sleep(5)

# the created document should NOT be gone as it's ttl value is set to -1(never expire) which overrides the collections's defaultTtl value
# the created document should NOT be gone as its ttl value is set to -1(never expire) which overrides the collection's defaultTtl value
read_document = created_collection.read_item(item=document_definition['id'], partition_key=document_definition['id'])
self.assertEqual(created_document['id'], read_document['id'])

Expand All @@ -166,7 +166,7 @@ def test_document_ttl_with_positive_defaultTtl(self):

time.sleep(4)

# the created document should be gone now as it's ttl value is set to 2 which overrides the collections's defaultTtl value(5)
# the created document should be gone now as its ttl value is set to 2 which overrides the collection's defaultTtl value(5)
self.__AssertHTTPFailureWithStatus(
StatusCodes.NOT_FOUND,
created_collection.read_item,
Expand All @@ -180,7 +180,7 @@ def test_document_ttl_with_positive_defaultTtl(self):

time.sleep(6)

# the created document should NOT be gone as it's ttl value is set to 8 which overrides the collections's defaultTtl value(5)
# the created document should NOT be gone as its ttl value is set to 8 which overrides the collection's defaultTtl value(5)
read_document = created_collection.read_item(item=created_document['id'], partition_key=created_document['id'])
self.assertEqual(created_document['id'], read_document['id'])

Expand Down Expand Up @@ -221,7 +221,7 @@ def test_document_ttl_with_negative_one_defaultTtl(self):

time.sleep(4)

# the created document should be gone now as it's ttl value is set to 2 which overrides the collections's defaultTtl value(-1)
# the created document should be gone now as it's ttl value is set to 2 which overrides the collection's defaultTtl value(-1)
self.__AssertHTTPFailureWithStatus(
StatusCodes.NOT_FOUND,
created_collection.read_item,
Expand Down Expand Up @@ -294,7 +294,7 @@ def test_document_ttl_misc(self):

time.sleep(7)

# Upserted document still exists after 10 secs from document creation time(with collection's defaultTtl set to 8) since it's ttl was reset after 3 secs by upserting it
# Upserted document still exists after 10 secs from document creation time(with collection's defaultTtl set to 8) since its ttl was reset after 3 secs by upserting it
read_document = created_collection.read_item(item=upserted_docment['id'], partition_key=upserted_docment['id'])
self.assertEqual(upserted_docment['id'], read_document['id'])

Expand Down

0 comments on commit 72afdd0

Please sign in to comment.