diff --git a/packages/google-cloud-monitoring/.coveragerc b/packages/google-cloud-monitoring/.coveragerc index f1315bbcbfad..51fec440cebf 100644 --- a/packages/google-cloud-monitoring/.coveragerc +++ b/packages/google-cloud-monitoring/.coveragerc @@ -2,11 +2,8 @@ branch = True [report] -omit = - */gapic/* - */proto/* +fail_under = 100 show_missing = True - exclude_lines = # Re-enable the standard pragma pragma: NO COVER @@ -14,3 +11,8 @@ exclude_lines = def __repr__ # Ignore abstract methods raise NotImplementedError +omit = + */gapic/*.py + */proto/*.py + */google-cloud-python/core/*.py + */site-packages/*.py \ No newline at end of file diff --git a/packages/google-cloud-monitoring/.flake8 b/packages/google-cloud-monitoring/.flake8 index 1f44a90f8195..61766fa84d02 100644 --- a/packages/google-cloud-monitoring/.flake8 +++ b/packages/google-cloud-monitoring/.flake8 @@ -1,4 +1,5 @@ [flake8] +ignore = E203, E266, E501, W503 exclude = # Exclude generated code. **/proto/** diff --git a/packages/google-cloud-monitoring/noxfile.py b/packages/google-cloud-monitoring/noxfile.py index 53ec4eff8f45..cf0be122e2cf 100644 --- a/packages/google-cloud-monitoring/noxfile.py +++ b/packages/google-cloud-monitoring/noxfile.py @@ -1,10 +1,12 @@ -# Copyright 2016 Google LLC +# -*- coding: utf-8 -*- +# +# Copyright 2018 Google LLC # # 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 +# https://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, @@ -13,102 +15,126 @@ # limitations under the License. from __future__ import absolute_import - import os import nox -LOCAL_DEPS = ( - os.path.join('..', 'api_core'), -) +LOCAL_DEPS = (os.path.join("..", "api_core"), os.path.join("..", "core")) +@nox.session(python="3.7") +def blacken(session): + """Run black. -def default(session): - """Default unit test session. + Format code to uniform standard. + """ + session.install("black") + session.run( + "black", + "google", + "tests", + "docs", + "--exclude", + ".*/proto/.*|.*/gapic/.*|.*/.*_pb2.py", + ) + + +@nox.session(python="3.7") +def lint(session): + """Run linters. - This is intended to be run **without** an interpreter set, so - that the current ``python`` (on the ``PATH``) or the version of - Python corresponding to the ``nox`` binary the ``PATH`` can - run the tests. + Returns a failure if the linters find linting errors or sufficiently + serious code quality issues. """ + session.install("flake8", "black", *LOCAL_DEPS) + session.run( + "black", + "--check", + "google", + "tests", + "docs", + "--exclude", + ".*/proto/.*|.*/gapic/.*|.*/.*_pb2.py", + ) + session.run("flake8", "google", "tests") + + +@nox.session(python="3.7") +def lint_setup_py(session): + """Verify that setup.py is valid (including RST check).""" + session.install("docutils", "pygments") + session.run("python", "setup.py", "check", "--restructuredtext", "--strict") + + +def default(session): # Install all test dependencies, then install this package in-place. - session.install('mock', 'pytest', 'pytest-cov') + session.install("mock", "pytest", "pytest-cov") for local_dep in LOCAL_DEPS: - session.install('-e', local_dep) - session.install('-e', '.[pandas]') + session.install("-e", local_dep) + session.install("-e", ".") # Run py.test against the unit tests. session.run( - 'py.test', - '--quiet', - '--cov=google.cloud.monitoring_v3._dataframe', - '--cov=tests.unit', - '--cov-append', - '--cov-config=.coveragerc', - '--cov-report=', - '--cov-fail-under=97', - 'tests/unit', - *session.posargs + "py.test", + "--quiet", + "--cov=google.cloud", + "--cov=tests.unit", + "--cov-append", + "--cov-config=.coveragerc", + "--cov-report=", + "--cov-fail-under=97", + os.path.join("tests", "unit"), + *session.posargs, ) -@nox.session(python=['2.7', '3.5', '3.6', '3.7']) +@nox.session(python=["2.7", "3.5", "3.6", "3.7"]) def unit(session): """Run the unit test suite.""" default(session) -@nox.session(python=['2.7', '3.7']) +@nox.session(python=["2.7", "3.7"]) def system(session): """Run the system test suite.""" - - # Sanity check: Only run system tests if the environment variable is set. - if not os.environ.get('GOOGLE_APPLICATION_CREDENTIALS', ''): - session.skip('Credentials must be set via environment variable.') + system_test_path = os.path.join("tests", "system.py") + system_test_folder_path = os.path.join("tests", "system") + # Sanity check: Only run tests if the environment variable is set. + if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS", ""): + session.skip("Credentials must be set via environment variable") + + system_test_exists = os.path.exists(system_test_path) + system_test_folder_exists = os.path.exists(system_test_folder_path) + # Sanity check: only run tests if found. + if not system_test_exists and not system_test_folder_exists: + session.skip("System tests were not found") # Use pre-release gRPC for system tests. - session.install('--pre', 'grpcio') + session.install("--pre", "grpcio") # Install all test dependencies, then install this package into the # virtualenv's dist-packages. - session.install('mock', 'pytest') + session.install("mock", "pytest") for local_dep in LOCAL_DEPS: - session.install('-e', local_dep) - session.install('-e', '../test_utils/') - session.install('-e', '.') + session.install("-e", local_dep) + session.install("-e", "../test_utils/") + session.install("-e", ".") # Run py.test against the system tests. - session.run('py.test', '--quiet', 'tests/system', *session.posargs) - - -@nox.session(python='3.6') -def lint(session): - """Run linters. - - Returns a failure if the linters find linting errors or sufficiently - serious code quality issues. - """ - session.install('flake8', *LOCAL_DEPS) - session.install('.') - session.run('flake8', 'google', 'tests') + if system_test_exists: + session.run("py.test", "--quiet", system_test_path, *session.posargs) + if system_test_folder_exists: + session.run("py.test", "--quiet", system_test_folder_path, *session.posargs) -@nox.session(python='3.6') -def lint_setup_py(session): - """Verify that setup.py is valid (including RST check).""" - session.install('docutils', 'Pygments') - session.run( - 'python', 'setup.py', 'check', '--restructuredtext', '--strict') - - -@nox.session(python='3.6') +@nox.session(python="3.7") def cover(session): """Run the final coverage report. This outputs the coverage report aggregating coverage from the unit test runs (not system test runs), and then erases coverage data. """ - session.install('coverage', 'pytest-cov') - session.run('coverage', 'report', '--show-missing', '--fail-under=100') - session.run('coverage', 'erase') + session.install("coverage", "pytest-cov") + session.run("coverage", "report", "--show-missing", "--fail-under=97") + + session.run("coverage", "erase") diff --git a/packages/google-cloud-monitoring/synth.py b/packages/google-cloud-monitoring/synth.py index fe47809a6ee5..0d32c2c577df 100644 --- a/packages/google-cloud-monitoring/synth.py +++ b/packages/google-cloud-monitoring/synth.py @@ -23,33 +23,34 @@ gapic = gcp.GAPICGenerator() common = gcp.CommonTemplates() +# ---------------------------------------------------------------------------- +# Generate monitoring GAPIC layer +# ---------------------------------------------------------------------------- v3_library = gapic.py_library( - 'monitoring', 'v3', - config_path='/google/monitoring/artman_monitoring.yaml', - artman_output_name='monitoring-v3') + "monitoring", + "v3", + config_path="/google/monitoring/artman_monitoring.yaml", + artman_output_name="monitoring-v3", +) # don't copy nox.py, setup.py, README.rst, docs/index.rst -excludes = [ - 'nox.py', - 'setup.py', - 'README.rst', - 'docs/index.rst', -] -s.copy(v3_library, excludes=excludes) +excludes = ["nox.py", "setup.py", "README.rst", "docs/index.rst"] +s.move(v3_library, excludes=excludes) # metadata in tests in none but should be empty list. # https://github.com/googleapis/gapic-generator/issues/2014 s.replace( "google/cloud/*/gapic/*_client.py", 'def .*\(([^\)]+)\n.*metadata=None\):\n\s+"""(.*\n)*?\s+"""\n', - '\g<0>' - ' if metadata is None:\n' - ' metadata = []\n' - ' metadata = list(metadata)\n') + "\g<0>" + " if metadata is None:\n" + " metadata = []\n" + " metadata = list(metadata)\n", +) # Issues exist where python files should defined the source encoding # https://github.com/googleapis/gapic-generator/issues/2097 -files = ['google/cloud/monitoring_v3/proto/common_pb2.py'] +files = ["google/cloud/monitoring_v3/proto/common_pb2.py"] for f in files: s.replace(f, r"(^.*$\n)*", r"# -*- coding: utf-8 -*-\n\g<0>") @@ -57,19 +58,22 @@ # Missing blank line after bulleted list s.replace( "google/cloud/monitoring_v3/gapic/alert_policy_service_client.py", - 'then a new `\[CONDITION_ID\]` is created.\n', - '\g<0>\n') + "then a new `\[CONDITION_ID\]` is created.\n", + "\g<0>\n", +) s.replace( "google/cloud/monitoring_v3/gapic/alert_policy_service_client.py", - ' ::\n\n', - '') + " ::\n\n", + "", +) s.replace( "google/cloud/monitoring_v3/proto/metric_service_pb2.py", - '^(\s+)have an ``id`` label: :: resource.type =\n.*', - '\g<1>have an ``id`` label::\n\n' - '\g<1> resource.type = starts_with("gce_") AND resource.label:id\n') + "^(\s+)have an ``id`` label: :: resource.type =\n.*", + "\g<1>have an ``id`` label::\n\n" + '\g<1> resource.type = starts_with("gce_") AND resource.label:id\n', +) # the metric service grpc transport channel shouldn't limit the size of # a grpc message at the default 4mb @@ -80,18 +84,25 @@ "\g<0>\g<1>options={\n" "\g<1> 'grpc.max_send_message_length': -1,\n" "\g<1> 'grpc.max_receive_message_length': -1,\n" - "\g<1>}.items(),\n") + "\g<1>}.items(),\n", +) # Deal with long lines due to long proto name s.replace( - ['google/cloud/monitoring_v3/__init__.py'], - 'from google.cloud.monitoring_v3.gapic import ' - 'notification_channel_service_client\n', - 'from google.cloud.monitoring_v3.gapic import (\n' - ' notification_channel_service_client as notification_client)\n', + ["google/cloud/monitoring_v3/__init__.py"], + "from google.cloud.monitoring_v3.gapic import " + "notification_channel_service_client\n", + "from google.cloud.monitoring_v3.gapic import (\n" + " notification_channel_service_client as notification_client)\n", ) s.replace( - ['google/cloud/monitoring_v3/__init__.py'], - 'notification_channel_service_client.NotificationChannelServiceClient', - 'notification_client.NotificationChannelServiceClient', + ["google/cloud/monitoring_v3/__init__.py"], + "notification_channel_service_client.NotificationChannelServiceClient", + "notification_client.NotificationChannelServiceClient", ) + +# ---------------------------------------------------------------------------- +# Add templated files +# ---------------------------------------------------------------------------- +templated_files = common.py_library(unit_cov_level=97, cov_level=97) +s.move(templated_files)