Skip to content

Commit

Permalink
Add templates for flake8, coveragerc, noxfile, and black. (#6642)
Browse files Browse the repository at this point in the history
  • Loading branch information
crwilcox authored Nov 28, 2018
1 parent f843e4b commit a174346
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 96 deletions.
10 changes: 6 additions & 4 deletions packages/google-cloud-monitoring/.coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@
branch = True

[report]
omit =
*/gapic/*
*/proto/*
fail_under = 100
show_missing = True

exclude_lines =
# Re-enable the standard pragma
pragma: NO COVER
# Ignore debug-only repr
def __repr__
# Ignore abstract methods
raise NotImplementedError
omit =
*/gapic/*.py
*/proto/*.py
*/google-cloud-python/core/*.py
*/site-packages/*.py
1 change: 1 addition & 0 deletions packages/google-cloud-monitoring/.flake8
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[flake8]
ignore = E203, E266, E501, W503
exclude =
# Exclude generated code.
**/proto/**
Expand Down
148 changes: 87 additions & 61 deletions packages/google-cloud-monitoring/noxfile.py
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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")
73 changes: 42 additions & 31 deletions packages/google-cloud-monitoring/synth.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,53 +23,57 @@
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>")

# GAPIC-Generator is mangling some docstrings
# 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
Expand All @@ -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)

0 comments on commit a174346

Please sign in to comment.