Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs(samples): add samples for IN, NOT_IN, and != operators. #312

Merged
merged 19 commits into from Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions samples/requirements-test.txt
@@ -0,0 +1,4 @@
backoff==1.11.1; python_version < "3.7"
backoff==2.0.0; python_version >= "3.7"
pytest==7.0.1
flaky==3.7.0
1 change: 1 addition & 0 deletions samples/requirements.txt
@@ -0,0 +1 @@
google-cloud-datastore==2.4.0
98 changes: 98 additions & 0 deletions samples/snippets.py
@@ -0,0 +1,98 @@
# Copyright 2022 Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
from collections import defaultdict
import datetime
jlara310 marked this conversation as resolved.
Show resolved Hide resolved
from pprint import pprint

import google.cloud.exceptions
from google.cloud import datastore # noqa: I100
jlara310 marked this conversation as resolved.
Show resolved Hide resolved

def _preamble():
# [START datastore_size_coloration_query]
from google.cloud import datastore

# For help authenticating your client, visit
# https://cloud.google.com/docs/authentication/getting-started
client = datastore.Client()

# [END datastore_size_coloration_query]
assert client is not None

def in_query(client):
# [START datastore_in_query]
query = client.query(kind="Task")
query.add_filter("tag", "IN", ["learn", "study"])
# [END datastore_in_query]

return list(query.fetch())

def not_equals_query(client):
# [START datastore_not_equals_query]
query = client.query(kind="Task")
query.add_filter("category", "!=", "work")
# [END datastore_not_equals_query]

return list(query.fetch())

def not_equals_query(client):
jlara310 marked this conversation as resolved.
Show resolved Hide resolved
# [START datastore_not_in_query]
query = client.query(kind="Task")
query.add_filter("category", "NOT_IN", ["work", "chores", "school"])
# [END datastore_not_in_query]

return list(query.fetch())


def eq_query_sorted(client):
# [START datastore_eq_query_sorted]
query = client.query(kind="Task")
query.add_filter("tag", "=", "learn")
# Ordering on equality filters are ignored
query.order = ['tag']
# [END datastore_eq_query_sorted]

return list(query.fetch())

def in_query_sorted(client):
# [START datastore_in_query_sorted]
query = client.query(kind="Task")
query.add_filter("tag", "IN", ["learn", "study"])
# Ordering on equality filters are ignored
query.order = ['tag']
# [END datastore_in_query_sorted]

return list(query.fetch())

def main(project_id):
client = datastore.Client(project_id)

for name, function in globals().items():
if name in ("main", "_preamble", "defaultdict") or not callable(function):
continue

print(name)
pprint(function(client))
print("\n-----------------\n")


if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Demonstrates datastore API operations."
)
parser.add_argument("project_id", help="Your cloud project ID.")

args = parser.parse_args()

main(args.project_id)
78 changes: 78 additions & 0 deletions samples/snippets_test.py
@@ -0,0 +1,78 @@
# Copyright 2022 Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os

import backoff
from google.cloud import datastore
import pytest

import snippets

PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"]


class CleanupClient(datastore.Client):
def __init__(self, *args, **kwargs):
super(CleanupClient, self).__init__(*args, **kwargs)
self.entities_to_delete = []
self.keys_to_delete = []

def cleanup(self):
with self.batch():
self.delete_multi(
list(set([x.key for x in self.entities_to_delete if x]))
+ list(set(self.keys_to_delete))
)


@pytest.yield_fixture
jlara310 marked this conversation as resolved.
Show resolved Hide resolved
def client():
client = CleanupClient(PROJECT)
yield client
client.cleanup()


@pytest.mark.flaky
class TestDatastoreSnippets:
# These tests mostly just test the absence of exceptions.

@backoff.on_exception(backoff.expo, AssertionError, max_time=240)
def test_in_query(self, client):
tasks = snippets.in_query(client)
client.entities_to_delete.extend(tasks)
assert tasks
jlara310 marked this conversation as resolved.
Show resolved Hide resolved

@backoff.on_exception(backoff.expo, AssertionError, max_time=240)
def test_not_equals_query(self, client):
tasks = snippets.not_equals_query(client)
client.entities_to_delete.extend(tasks)
assert tasks
jlara310 marked this conversation as resolved.
Show resolved Hide resolved

@backoff.on_exception(backoff.expo, AssertionError, max_time=240)
def test_not_in_query(self, client):
tasks = snippets.not_in_query(client)
client.entities_to_delete.extend(tasks)
assert tasks
jlara310 marked this conversation as resolved.
Show resolved Hide resolved

@backoff.on_exception(backoff.expo, AssertionError, max_time=240)
def test_eq_query_sorted(self, client):
tasks = snippets.eq_query_sorted(client)
client.entities_to_delete.extend(tasks)
assert tasks
jlara310 marked this conversation as resolved.
Show resolved Hide resolved

@backoff.on_exception(backoff.expo, AssertionError, max_time=240)
def test_in_query_sorted(self, client):
tasks = snippets.in_query_sorted(client)
client.entities_to_delete.extend(tasks)
assert tasks
jlara310 marked this conversation as resolved.
Show resolved Hide resolved