14
14
15
15
from __future__ import print_function
16
16
17
- import fnmatch
18
17
import os
19
18
from pathlib import Path
20
- import tempfile
21
19
22
20
import nox
23
21
24
- # Get root of this repository. Assume we don't have directories nested deeper than 10 items.
25
- p = Path (os .getcwd ())
26
- for i in range (10 ):
27
- if p is None :
28
- raise Exception ("Unable to detect repository root." )
29
- if Path (p / ".git" ).exists ():
30
- REPO_ROOT = str (p )
31
- break
32
- p = p .parent
33
22
34
- #
35
- # Helpers and utility functions
36
- #
37
-
38
-
39
- def _list_files (folder , pattern ):
40
- """Lists all files below the given folder that match the pattern."""
41
- for root , folders , files in os .walk (folder ):
42
- for filename in files :
43
- if fnmatch .fnmatch (filename , pattern ):
44
- yield os .path .join (root , filename )
23
+ # DO NOT EDIT - automatically generated.
24
+ # All versions used to tested samples.
25
+ ALL_VERSIONS = ["2.7" , "3.6" , "3.7" , "3.8" ]
45
26
27
+ # Any default versions that should be ignored.
28
+ IGNORED_VERSIONS = ["2.7" ]
46
29
47
- def _collect_dirs (
48
- start_dir ,
49
- blacklist = set (["conftest.py" , "noxfile.py" , "lib" , "third_party" ]),
50
- suffix = "requirements.txt" ,
51
- recurse_further = False ,
52
- ):
53
- """Recursively collects a list of dirs that contain a file matching the
54
- given suffix.
30
+ TESTED_VERSIONS = sorted ([v for v in ALL_VERSIONS if v not in IGNORED_VERSIONS ])
55
31
56
- This works by listing the contents of directories and finding
57
- directories that have `"requirements.text` files.
58
- """
59
- # Collect all the directories that have tests in them.
60
- for parent , subdirs , files in os .walk (start_dir ):
61
- if "./." in parent :
62
- continue # Skip top-level dotfiles
63
- elif any (f for f in files if f .endswith (suffix ) and f not in blacklist ):
64
- # Don't recurse further for tests, since py.test will do that.
65
- if not recurse_further :
66
- del subdirs [:]
67
- # This dir has desired files in it. yield it.
68
- yield parent
69
- else :
70
- # Filter out dirs we don't want to recurse into
71
- subdirs [:] = [s for s in subdirs if s [0 ].isalpha () and s not in blacklist ]
32
+ #
33
+ # Style Checks
34
+ #
72
35
73
36
37
+ # Ignore I202 "Additional newline in a section of imports." to accommodate
38
+ # region tags in import blocks. Since we specify an explicit ignore, we also
39
+ # have to explicitly ignore the list of default ignores:
40
+ # `E121,E123,E126,E226,E24,E704,W503,W504` as shown by `flake8 --help`.
74
41
def _determine_local_import_names (start_dir ):
75
42
"""Determines all import names that should be considered "local".
76
43
@@ -87,75 +54,46 @@ def _determine_local_import_names(start_dir):
87
54
]
88
55
89
56
90
- #
91
- # App Engine specific helpers
92
- #
93
-
94
-
95
- _GAE_ROOT = os .environ .get ("GAE_ROOT" )
96
- if _GAE_ROOT is None :
97
- _GAE_ROOT = tempfile .mkdtemp ()
98
-
99
-
100
- def _setup_appengine_sdk (session ):
101
- """Installs the App Engine SDK, if needed."""
102
- session .env ["GAE_SDK_PATH" ] = os .path .join (_GAE_ROOT , "google_appengine" )
103
- session .run ("gcp-devrel-py-tools" , "download-appengine-sdk" , _GAE_ROOT )
104
-
105
-
106
- #
107
- # Test sessions
108
- #
109
-
110
-
111
- PYTEST_COMMON_ARGS = ["--junitxml=sponge_log.xml" ]
112
-
113
- # Ignore I202 "Additional newline in a section of imports." to accommodate
114
- # region tags in import blocks. Since we specify an explicit ignore, we also
115
- # have to explicitly ignore the list of default ignores:
116
- # `E121,E123,E126,E226,E24,E704,W503,W504` as shown by `flake8 --help`.
117
57
FLAKE8_COMMON_ARGS = [
118
58
"--show-source" ,
119
- "--builtin" ,
120
- "gettext" ,
121
- "--max-complexity" ,
122
- "20" ,
123
- "--import-order-style" ,
124
- "google" ,
125
- "--exclude" ,
126
- ".nox,.cache,env,lib,generated_pb2,*_pb2.py,*_pb2_grpc.py" ,
127
- "--ignore=E121,E123,E126,E203, E226,E24,E266,E501,E704,W503,W504,I100,I201,I202" ,
59
+ "--builtin='gettext'" ,
60
+ "--max-complexity=20" ,
61
+ "--import-order-style=google" ,
62
+ "--exclude='.nox,.cache,env,lib,generated_pb2,*_pb2.py,*_pb2_grpc.py'" ,
63
+ "--ignore=E121,E123,E126,E203,E226,E24,E266,E501,E704,W503,W504,I100,I201,I202" ,
128
64
"--max-line-length=88" ,
129
65
]
130
66
131
67
132
- # Collect sample directories.
133
- ALL_TESTED_SAMPLES = sorted (list (_collect_dirs ("." )))
68
+ @nox .session
69
+ def lint (session ):
70
+ session .install ("flake8" , "flake8-import-order" )
134
71
135
- GAE_STANDARD_SAMPLES = [
136
- sample
137
- for sample in ALL_TESTED_SAMPLES
138
- if str ( Path ( sample ). absolute (). relative_to ( REPO_ROOT )). startswith (
139
- "appengine/standard/"
140
- )
141
- ]
72
+ local_names = _determine_local_import_names ( "." )
73
+ args = FLAKE8_COMMON_ARGS + [
74
+ "--application-import-names" ,
75
+ "," . join ( local_names ),
76
+ "." ,
77
+ ]
78
+ session . run ( "flake8" , * args )
142
79
143
- PY2_ONLY_SAMPLES = GAE_STANDARD_SAMPLES
144
80
145
- NON_GAE_STANDARD_SAMPLES_PY3 = sorted (
146
- list ( set ( ALL_TESTED_SAMPLES ) - set ( GAE_STANDARD_SAMPLES ))
147
- )
81
+ #
82
+ # Sample Tests
83
+ #
148
84
149
85
150
- def _session_tests (session , sample , post_install = None ):
151
- """Runs py.test for a particular sample."""
152
- session .install ("-r" , REPO_ROOT + "/testing/requirements.txt" )
86
+ PYTEST_COMMON_ARGS = ["--junitxml=sponge_log.xml" ]
153
87
154
- session .chdir (sample )
155
88
89
+ def _session_tests (session , post_install = None ):
90
+ """Runs py.test for a particular project."""
156
91
if os .path .exists ("requirements.txt" ):
157
92
session .install ("-r" , "requirements.txt" )
158
93
94
+ if os .path .exists ("requirements-testing.txt" ):
95
+ session .install ("-r" , "requirements-testing.txt" )
96
+
159
97
if post_install :
160
98
post_install (session )
161
99
@@ -169,50 +107,46 @@ def _session_tests(session, sample, post_install=None):
169
107
)
170
108
171
109
172
- @nox .session (python = "2.7" )
173
- @nox .parametrize ("sample" , PY2_ONLY_SAMPLES )
174
- def gae (session , sample ):
175
- """Runs py.test for an App Engine standard sample."""
176
-
177
- # Create a lib directory if needed, otherwise the App Engine vendor library
178
- # will complain.
179
- if not os .path .isdir (os .path .join (sample , "lib" )):
180
- os .mkdir (os .path .join (sample , "lib" ))
110
+ @nox .session (python = ALL_VERSIONS )
111
+ def py (session ):
112
+ """Runs py.test for a sample using the specified version of Python."""
113
+ if session .python in TESTED_VERSIONS :
114
+ _session_tests (session )
115
+ else :
116
+ print ("SUCCESS: {} tests are disable for this sample." .format (session .python ))
181
117
182
- _session_tests (session , sample , _setup_appengine_sdk )
183
118
119
+ #
120
+ # Readmegen
121
+ #
184
122
185
- @nox .session (python = ["3.6" , "3.7" ])
186
- @nox .parametrize ("sample" , NON_GAE_STANDARD_SAMPLES_PY3 )
187
- def py3 (session , sample ):
188
- """Runs py.test for a sample using Python 3.x"""
189
- _session_tests (session , sample )
190
123
124
+ def _get_repo_root ():
125
+ """ Returns the root folder of the project. """
126
+ # Get root of this repository. Assume we don't have directories nested deeper than 10 items.
127
+ p = Path (os .getcwd ())
128
+ for i in range (10 ):
129
+ if p is None :
130
+ break
131
+ if Path (p / ".git" ).exists ():
132
+ return str (p )
133
+ p = p .parent
134
+ raise Exception ("Unable to detect repository root." )
191
135
192
- @nox .session (python = "3.6" )
193
- def lint (session ):
194
- session .install ("flake8" , "flake8-import-order" )
195
-
196
- local_names = _determine_local_import_names ("." )
197
- args = FLAKE8_COMMON_ARGS + [
198
- "--application-import-names" ,
199
- "," .join (local_names ),
200
- "." ,
201
- ]
202
- session .run ("flake8" , * args )
203
136
204
-
205
- SAMPLES_WITH_GENERATED_READMES = sorted (list (_collect_dirs ("." , suffix = ".rst.in" )))
137
+ GENERATED_READMES = sorted ([x for x in Path ("." ).rglob ("*.rst.in" )])
206
138
207
139
208
140
@nox .session
209
- @nox .parametrize ("sample " , SAMPLES_WITH_GENERATED_READMES )
210
- def readmegen (session , sample ):
141
+ @nox .parametrize ("path " , GENERATED_READMES )
142
+ def readmegen (session , path ):
211
143
"""(Re-)generates the readme for a sample."""
212
144
session .install ("jinja2" , "pyyaml" )
213
145
214
- if os .path .exists (os .path .join (sample , "requirements.txt" )):
215
- session .install ("-r" , os .path .join (sample , "requirements.txt" ))
146
+ if os .path .exists (os .path .join (path , "requirements.txt" )):
147
+ session .install ("-r" , os .path .join (path , "requirements.txt" ))
216
148
217
- in_file = os .path .join (sample , "README.rst.in" )
218
- session .run ("python" , REPO_ROOT + "/scripts/readme-gen/readme_gen.py" , in_file )
149
+ in_file = os .path .join (path , "README.rst.in" )
150
+ session .run (
151
+ "python" , _get_repo_root () + "/scripts/readme-gen/readme_gen.py" , in_file
152
+ )
0 commit comments