From c336696540bd7d0355d4d2b620cb9093a1f5b1d1 Mon Sep 17 00:00:00 2001 From: Christopher Wilcox Date: Wed, 28 Nov 2018 13:55:23 -0800 Subject: [PATCH] Add templates for flake8, coveragerc, noxfile, and black. (#6642) --- .../google-cloud-securitycenter/.coveragerc | 11 +- packages/google-cloud-securitycenter/.flake8 | 2 +- .../google-cloud-securitycenter/noxfile.py | 141 ++++++++++++------ packages/google-cloud-securitycenter/synth.py | 23 +-- 4 files changed, 116 insertions(+), 61 deletions(-) diff --git a/packages/google-cloud-securitycenter/.coveragerc b/packages/google-cloud-securitycenter/.coveragerc index e98815844673..51fec440cebf 100644 --- a/packages/google-cloud-securitycenter/.coveragerc +++ b/packages/google-cloud-securitycenter/.coveragerc @@ -1,8 +1,5 @@ [run] branch = True -omit = - */gapic/* - */proto/* [report] fail_under = 100 @@ -12,6 +9,10 @@ exclude_lines = pragma: NO COVER # Ignore debug-only repr def __repr__ + # Ignore abstract methods + raise NotImplementedError omit = - */gapic/* - */proto/* + */gapic/*.py + */proto/*.py + */google-cloud-python/core/*.py + */site-packages/*.py \ No newline at end of file diff --git a/packages/google-cloud-securitycenter/.flake8 b/packages/google-cloud-securitycenter/.flake8 index 3c9e3266d0a1..61766fa84d02 100644 --- a/packages/google-cloud-securitycenter/.flake8 +++ b/packages/google-cloud-securitycenter/.flake8 @@ -1,9 +1,9 @@ [flake8] +ignore = E203, E266, E501, W503 exclude = # Exclude generated code. **/proto/** **/gapic/** - **/types.py *_pb2.py # Standard linting exemptions. diff --git a/packages/google-cloud-securitycenter/noxfile.py b/packages/google-cloud-securitycenter/noxfile.py index 1c3ab2c57a38..a9efc0e344ce 100644 --- a/packages/google-cloud-securitycenter/noxfile.py +++ b/packages/google-cloud-securitycenter/noxfile.py @@ -1,10 +1,12 @@ -# Copyright 2017, Google LLC All rights reserved. +# -*- 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, @@ -18,72 +20,121 @@ import nox -LOCAL_DEPS = ( - os.path.join('..', 'api_core'), - os.path.join('..', 'core'), -) - +LOCAL_DEPS = (os.path.join("..", "api_core"), os.path.join("..", "core")) -def default(session): - """Run the unit test suite. +@nox.session(python="3.7") +def blacken(session): + """Run black. - 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. + Format code to uniform standard. """ - session.install('mock', 'pytest', 'pytest-cov', *LOCAL_DEPS) - session.install('-e', '.') - + session.install("black") session.run( - 'py.test', - '--quiet', - '--cov=google.cloud.securitycenter_v1beta1', - '--cov-append', - '--cov-config=.coveragerc', - '--cov-report=', - '--cov-fail-under=89', # TODO: Coverage should be raised to 97% - os.path.join('tests', 'unit'), - *session.posargs + "black", + "google", + "tests", + "docs", + "--exclude", + ".*/proto/.*|.*/gapic/.*|.*/.*_pb2.py", ) -@nox.session(python=['2.7', '3.5', '3.6', '3.7']) -def unit(session): - """Run the unit test suite.""" - - default(session) - - -@nox.session(python='3.6') +@nox.session(python="3.7") 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') + 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.6') +@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') + 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") + for local_dep in LOCAL_DEPS: + session.install("-e", local_dep) + session.install("-e", ".") + + # Run py.test against the unit tests. + session.run( + "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"]) +def unit(session): + """Run the unit test suite.""" + default(session) -@nox.session(python='3.6') +@nox.session(python=["2.7", "3.7"]) +def system(session): + """Run the system test suite.""" + 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") + + # Install all test dependencies, then install this package into the + # virtualenv's dist-packages. + session.install("mock", "pytest") + for local_dep in LOCAL_DEPS: + session.install("-e", local_dep) + session.install("-e", "../test_utils/") + session.install("-e", ".") + + # Run py.test against the system 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.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.chdir(os.path.dirname(__file__)) - 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=100") + session.run("coverage", "erase") diff --git a/packages/google-cloud-securitycenter/synth.py b/packages/google-cloud-securitycenter/synth.py index eb22160999d0..e8929f3f37fe 100644 --- a/packages/google-cloud-securitycenter/synth.py +++ b/packages/google-cloud-securitycenter/synth.py @@ -17,21 +17,24 @@ from synthtool import gcp gapic = gcp.GAPICGenerator() +common = gcp.CommonTemplates() -library = gapic.py_library( - 'securitycenter', - 'v1beta1') +# ---------------------------------------------------------------------------- +# Generate securitycenter GAPIC layer +# ---------------------------------------------------------------------------- +library = gapic.py_library("securitycenter", "v1beta1") s.move( library, - excludes=[ - 'setup.py', 'nox.py', 'README.rst', 'docs/index.rst', 'docs/conf.py' - ] + excludes=["setup.py", "nox.py", "README.rst", "docs/index.rst", "docs/conf.py"], ) # Add encoding header to protoc-generated files. # See: https://github.com/googleapis/gapic-generator/issues/2097 -s.replace( - '**/proto/*_pb2.py', - r"(^.*$\n)*", - r"# -*- coding: utf-8 -*-\n\g<0>") +s.replace("**/proto/*_pb2.py", r"(^.*$\n)*", r"# -*- coding: utf-8 -*-\n\g<0>") + +# ---------------------------------------------------------------------------- +# Add templated files +# ---------------------------------------------------------------------------- +templated_files = common.py_library(unit_cov_level=97, cov_level=100) +s.move(templated_files)