diff --git a/.kokoro/docs/common.cfg b/.kokoro/docs/common.cfg index 1831bf9d2..08aac45ad 100644 --- a/.kokoro/docs/common.cfg +++ b/.kokoro/docs/common.cfg @@ -30,7 +30,7 @@ env_vars: { env_vars: { key: "V2_STAGING_BUCKET" - value: "docs-staging-v2-staging" + value: "docs-staging-v2" } # It will upload the docker image after successful builds. diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh index 6da844235..639efd458 100755 --- a/.kokoro/test-samples.sh +++ b/.kokoro/test-samples.sh @@ -28,6 +28,12 @@ if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"periodic"* ]]; then git checkout $LATEST_RELEASE fi +# Exit early if samples directory doesn't exist +if [ ! -d "./samples" ]; then + echo "No tests run. `./samples` not found" + exit 0 +fi + # Disable buffering, so that the logs stream through. export PYTHONUNBUFFERED=1 @@ -101,4 +107,4 @@ cd "$ROOT" # Workaround for Kokoro permissions issue: delete secrets rm testing/{test-env.sh,client-secrets.json,service-account.json} -exit "$RTN" \ No newline at end of file +exit "$RTN" diff --git a/CHANGELOG.md b/CHANGELOG.md index 94bdbdf53..f4d6a8815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-bigtable/#history +### [1.6.1](https://www.github.com/googleapis/python-bigtable/compare/v1.6.0...v1.6.1) (2020-12-01) + + +### Documentation + +* update intersphinx mappings ([#172](https://www.github.com/googleapis/python-bigtable/issues/172)) ([7b09368](https://www.github.com/googleapis/python-bigtable/commit/7b09368d5121782c7f271b3575c838e8a2284c05)) + ## [1.6.0](https://www.github.com/googleapis/python-bigtable/compare/v1.5.1...v1.6.0) (2020-11-16) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b3d1f6029..039f43681 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,44 +1,95 @@ -# Contributor Code of Conduct +# Code of Conduct -As contributors and maintainers of this project, -and in the interest of fostering an open and welcoming community, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. +## Our Pledge -We are committed to making participation in this project -a harassment-free experience for everyone, -regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, -such as physical or electronic -addresses, without explicit permission -* Other unethical or unprofessional conduct. +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct. -By adopting this Code of Conduct, -project maintainers commit themselves to fairly and consistently -applying these principles to every aspect of managing this project. -Project maintainers who do not follow or enforce the Code of Conduct -may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior -may be reported by opening an issue -or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, -available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, or to ban temporarily or permanently any +contributor for other behaviors that they deem inappropriate, threatening, +offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +This Code of Conduct also applies outside the project spaces when the Project +Steward has a reasonable belief that an individual's behavior may have a +negative impact on the project or its community. + +## Conflict Resolution + +We do not believe that all conflict is bad; healthy debate and disagreement +often yield positive results. However, it is never okay to be disrespectful or +to engage in behavior that violates the project’s code of conduct. + +If you see someone violating the code of conduct, you are encouraged to address +the behavior directly with those involved. Many issues can be resolved quickly +and easily, and this gives people more control over the outcome of their +dispute. If you are unable to resolve the matter for any reason, or if the +behavior is threatening or harassing, report it. We are dedicated to providing +an environment where participants feel welcome and safe. + + +Reports should be directed to *googleapis-stewards@google.com*, the +Project Steward(s) for *Google Cloud Client Libraries*. It is the Project Steward’s duty to +receive and address reported violations of the code of conduct. They will then +work with a committee consisting of representatives from the Open Source +Programs Office and the Google Open Source Strategy team. If for any reason you +are uncomfortable reaching out to the Project Steward, please email +opensource@google.com. + +We will investigate every complaint, but you may not receive a direct response. +We will use our discretion in determining when and how to follow up on reported +incidents, which may range from not taking action to permanent expulsion from +the project and project-sponsored spaces. We will notify the accused of the +report and provide them an opportunity to discuss it before any action is taken. +The identity of the reporter will be omitted from the details of the report +supplied to the accused. In potentially harmful situations, such as ongoing +harassment or threats to anyone's safety, we may take action without notice. + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index c0b3a25a4..ef2392b38 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -345,13 +345,14 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - "python": ("http://python.readthedocs.org/en/latest/", None), - "google-auth": ("https://google-auth.readthedocs.io/en/stable", None), + "python": ("https://python.readthedocs.org/en/latest/", None), + "google-auth": ("https://googleapis.dev/python/google-auth/latest/", None), "google.api_core": ( "https://googleapis.dev/python/google-api-core/latest/", None, ), - "grpc": ("https://grpc.io/grpc/python/", None), + "grpc": ("https://grpc.github.io/grpc/python/", None), + "proto-plus": ("https://proto-plus-python.readthedocs.io/en/latest/", None), } diff --git a/google/cloud/bigtable_admin_v2/gapic/bigtable_instance_admin_client.py b/google/cloud/bigtable_admin_v2/gapic/bigtable_instance_admin_client.py index 8b1795249..4e8a0d0ba 100644 --- a/google/cloud/bigtable_admin_v2/gapic/bigtable_instance_admin_client.py +++ b/google/cloud/bigtable_admin_v2/gapic/bigtable_instance_admin_client.py @@ -53,7 +53,7 @@ _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( "google-cloud-bigtable" ).version -except pkg_resources.DistributionNotFound: +except pkg_resources.DistributionNotFound: # pragma: NO COVER _GAPIC_LIBRARY_VERSION = None diff --git a/google/cloud/bigtable_admin_v2/gapic/bigtable_table_admin_client.py b/google/cloud/bigtable_admin_v2/gapic/bigtable_table_admin_client.py index 2f19a880a..d507a3c0b 100644 --- a/google/cloud/bigtable_admin_v2/gapic/bigtable_table_admin_client.py +++ b/google/cloud/bigtable_admin_v2/gapic/bigtable_table_admin_client.py @@ -54,13 +54,11 @@ from google.protobuf import field_mask_pb2 -import pkg_resources - try: _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( "google-cloud-bigtable" ).version -except pkg_resources.DistributionNotFound: +except pkg_resources.DistributionNotFound: # pragma: NO COVER _GAPIC_LIBRARY_VERSION = None diff --git a/google/cloud/bigtable_v2/gapic/bigtable_client.py b/google/cloud/bigtable_v2/gapic/bigtable_client.py index 43ff81029..a9ddfad8a 100644 --- a/google/cloud/bigtable_v2/gapic/bigtable_client.py +++ b/google/cloud/bigtable_v2/gapic/bigtable_client.py @@ -40,7 +40,7 @@ _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( "google-cloud-bigtable" ).version -except pkg_resources.DistributionNotFound: +except pkg_resources.DistributionNotFound: # pragma: NO COVER _GAPIC_LIBRARY_VERSION = None diff --git a/samples/beam/requirements.txt b/samples/beam/requirements.txt index 565c39c39..44c2eb0a1 100644 --- a/samples/beam/requirements.txt +++ b/samples/beam/requirements.txt @@ -1,3 +1,3 @@ apache-beam==2.25.0 -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 google-cloud-core==1.4.3 \ No newline at end of file diff --git a/samples/hello/requirements.txt b/samples/hello/requirements.txt index 3360cf133..526c84585 100644 --- a/samples/hello/requirements.txt +++ b/samples/hello/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 google-cloud-core==1.4.3 diff --git a/samples/instanceadmin/requirements.txt b/samples/instanceadmin/requirements.txt index 23b27ea70..d51198faa 100755 --- a/samples/instanceadmin/requirements.txt +++ b/samples/instanceadmin/requirements.txt @@ -1 +1 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 diff --git a/samples/metricscaler/metricscaler_test.py b/samples/metricscaler/metricscaler_test.py index 06e1e27ca..219ec535e 100644 --- a/samples/metricscaler/metricscaler_test.py +++ b/samples/metricscaler/metricscaler_test.py @@ -15,7 +15,6 @@ """Unit and system tests for metricscaler.py""" import os -import time import uuid from google.cloud import bigtable @@ -23,6 +22,7 @@ from mock import Mock, patch import pytest +from test_utils.retry import RetryInstanceState from metricscaler import get_cpu_load from metricscaler import get_storage_utilization @@ -109,32 +109,31 @@ def test_scale_bigtable(instance): instance.reload() cluster = instance.cluster(BIGTABLE_INSTANCE) - cluster.reload() + + _nonzero_node_count = RetryInstanceState( + instance_predicate=lambda c: c.serve_nodes > 0, + max_tries=10, + ) + _nonzero_node_count(cluster.reload)() + original_node_count = cluster.serve_nodes scale_bigtable(BIGTABLE_INSTANCE, BIGTABLE_INSTANCE, True) - for n in range(10): - time.sleep(10) - cluster.reload() - new_node_count = cluster.serve_nodes - try: - assert (new_node_count == (original_node_count + SIZE_CHANGE_STEP)) - except AssertionError: - if n == 9: - raise + expected_count = original_node_count + SIZE_CHANGE_STEP + _scaled_node_count = RetryInstanceState( + instance_predicate=lambda c: c.serve_nodes == expected_count, + max_tries=10, + ) + _scaled_node_count(cluster.reload)() scale_bigtable(BIGTABLE_INSTANCE, BIGTABLE_INSTANCE, False) - for n in range(10): - time.sleep(10) - cluster.reload() - final_node_count = cluster.serve_nodes - try: - assert final_node_count == original_node_count - except AssertionError: - if n == 9: - raise + _restored_node_count = RetryInstanceState( + instance_predicate=lambda c: c.serve_nodes == original_node_count, + max_tries=10, + ) + _restored_node_count(cluster.reload)() def test_handle_dev_instance(capsys, dev_instance): diff --git a/samples/metricscaler/requirements-test.txt b/samples/metricscaler/requirements-test.txt index 41c4d5110..470dbe7c1 100644 --- a/samples/metricscaler/requirements-test.txt +++ b/samples/metricscaler/requirements-test.txt @@ -1,2 +1,3 @@ pytest==5.3.2 mock==3.0.5 +google-cloud-testutils diff --git a/samples/metricscaler/requirements.txt b/samples/metricscaler/requirements.txt index aa1a6e220..a4dd52df1 100644 --- a/samples/metricscaler/requirements.txt +++ b/samples/metricscaler/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 google-cloud-monitoring==2.0.0 diff --git a/samples/quickstart/requirements.txt b/samples/quickstart/requirements.txt index 23b27ea70..d51198faa 100644 --- a/samples/quickstart/requirements.txt +++ b/samples/quickstart/requirements.txt @@ -1 +1 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 diff --git a/samples/snippets/filters/filters_test.py b/samples/snippets/filters/filters_test.py index f46541bff..36dc4a5b1 100644 --- a/samples/snippets/filters/filters_test.py +++ b/samples/snippets/filters/filters_test.py @@ -14,6 +14,7 @@ import datetime import os +import time import uuid from google.cloud import bigtable @@ -29,6 +30,8 @@ @pytest.fixture(scope="module", autouse=True) def table_id(): + from google.cloud.bigtable.row_set import RowSet + client = bigtable.Client(project=PROJECT, admin=True) instance = client.instance(BIGTABLE_INSTANCE) @@ -43,14 +46,16 @@ def table_id(): timestamp_minus_hr = datetime.datetime(2019, 5, 1) - datetime.timedelta( hours=1) - rows = [ - table.direct_row("phone#4c410523#20190501"), - table.direct_row("phone#4c410523#20190502"), - table.direct_row("phone#4c410523#20190505"), - table.direct_row("phone#5c10102#20190501"), - table.direct_row("phone#5c10102#20190502"), + row_keys = [ + "phone#4c410523#20190501", + "phone#4c410523#20190502", + "phone#4c410523#20190505", + "phone#5c10102#20190501", + "phone#5c10102#20190502", ] + rows = [table.direct_row(row_key) for row_key in row_keys] + rows[0].set_cell("stats_summary", "connected_cell", 1, timestamp) rows[0].set_cell("stats_summary", "connected_wifi", 1, timestamp) rows[0].set_cell("stats_summary", "os_build", "PQ2A.190405.003", timestamp) @@ -76,6 +81,18 @@ def table_id(): table.mutate_rows(rows) + # Ensure mutations have propagated. + row_set = RowSet() + + for row_key in row_keys: + row_set.add_row_key(row_key) + + fetched = list(table.read_rows(row_set=row_set)) + + while len(fetched) < len(rows): + time.sleep(5) + fetched = list(table.read_rows(row_set=row_set)) + yield table_id table.delete() diff --git a/samples/snippets/filters/requirements.txt b/samples/snippets/filters/requirements.txt index ac34bb1f7..862df6f5f 100755 --- a/samples/snippets/filters/requirements.txt +++ b/samples/snippets/filters/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 snapshottest==0.6.0 \ No newline at end of file diff --git a/samples/snippets/reads/requirements.txt b/samples/snippets/reads/requirements.txt index ac34bb1f7..862df6f5f 100755 --- a/samples/snippets/reads/requirements.txt +++ b/samples/snippets/reads/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 snapshottest==0.6.0 \ No newline at end of file diff --git a/samples/snippets/writes/requirements.txt b/samples/snippets/writes/requirements.txt index 168f72e91..734386965 100755 --- a/samples/snippets/writes/requirements.txt +++ b/samples/snippets/writes/requirements.txt @@ -1 +1 @@ -google-cloud-bigtable==1.5.1 \ No newline at end of file +google-cloud-bigtable==1.6.0 \ No newline at end of file diff --git a/samples/tableadmin/requirements.txt b/samples/tableadmin/requirements.txt index 23b27ea70..d51198faa 100755 --- a/samples/tableadmin/requirements.txt +++ b/samples/tableadmin/requirements.txt @@ -1 +1 @@ -google-cloud-bigtable==1.5.1 +google-cloud-bigtable==1.6.0 diff --git a/setup.py b/setup.py index 0c98fee99..48ef1c70d 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ name = 'google-cloud-bigtable' description = 'Google Cloud Bigtable API client library' -version = "1.6.0" +version = "1.6.1" # Should be one of: # 'Development Status :: 3 - Alpha' # 'Development Status :: 4 - Beta' diff --git a/synth.metadata b/synth.metadata index a87cbb407..1d3b579ad 100644 --- a/synth.metadata +++ b/synth.metadata @@ -4,7 +4,7 @@ "git": { "name": ".", "remote": "https://github.com/googleapis/python-bigtable.git", - "sha": "9a61c57a73d8b55d59799e2b78ced03b07660fb8" + "sha": "39d7c153ffab3f1bc86a6c1b6802d53254df9c52" } }, { @@ -19,14 +19,14 @@ "git": { "name": "synthtool", "remote": "https://github.com/googleapis/synthtool.git", - "sha": "9b0da5204ab90bcc36f8cd4e5689eff1a54cc3e4" + "sha": "a073c873f3928c561bdf87fdfbf1d081d1998984" } }, { "git": { "name": "synthtool", "remote": "https://github.com/googleapis/synthtool.git", - "sha": "9b0da5204ab90bcc36f8cd4e5689eff1a54cc3e4" + "sha": "a073c873f3928c561bdf87fdfbf1d081d1998984" } } ], diff --git a/synth.py b/synth.py index 21100c749..07c293339 100644 --- a/synth.py +++ b/synth.py @@ -45,7 +45,12 @@ s.move(library / "google/cloud/bigtable_admin_v2") s.move(library / "tests") -# Work around non-standard installations +# ---------------------------------------------------------------------------- +# Work around non-standard installations (missing setuptools). +# +# These replacements can be removed after migrating to the microgenerator, +# which will generate them directly. +# ---------------------------------------------------------------------------- admin_clients = [ "google/cloud/bigtable_admin_v2/gapic/bigtable_instance_admin_client.py", @@ -69,6 +74,23 @@ """ ) +s.replace( + "google/cloud/bigtable_v2/gapic/bigtable_client.py", + """\ +_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution\( + 'google-cloud-bigtable', +\).version +""", + """\ +try: + _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( + "google-cloud-bigtable" + ).version +except pkg_resources.DistributionNotFound: # pragma: NO COVER + _GAPIC_LIBRARY_VERSION = None +""" +) + # ---------------------------------------------------------------------------- # Add templated files # ----------------------------------------------------------------------------