Merge ~cjwatson/lazr.restful:fix-more-flake8 into lazr.restful:main
- Git
- lp:~cjwatson/lazr.restful
- fix-more-flake8
- Merge into main
Proposed by
Colin Watson
Status: | Merged |
---|---|
Merged at revision: | 23ec6265b2c4965c47d7ebc1f02be989ee5e3ed7 |
Proposed branch: | ~cjwatson/lazr.restful:fix-more-flake8 |
Merge into: | lazr.restful:main |
Diff against target: |
322 lines (+64/-49) 5 files modified
src/lazr/restful/metazcml.py (+8/-2) src/lazr/restful/tales.py (+0/-8) src/lazr/restful/tests/test_error.py (+23/-5) src/lazr/restful/tests/test_webservice.py (+16/-28) tox.ini (+17/-6) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ioana Lasc (community) | Approve | ||
Review via email: mp+412229@code.launchpad.net |
Commit message
Fix several more problems noticed by flake8
Description of the change
To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/src/lazr/restful/metazcml.py b/src/lazr/restful/metazcml.py | |||
2 | index 4e7ec93..1fe9422 100644 | |||
3 | --- a/src/lazr/restful/metazcml.py | |||
4 | +++ b/src/lazr/restful/metazcml.py | |||
5 | @@ -263,9 +263,15 @@ def find_exported_interfaces(module): | |||
6 | 263 | """ | 263 | """ |
7 | 264 | try: | 264 | try: |
8 | 265 | module_all = set(module.__all__) | 265 | module_all = set(module.__all__) |
10 | 266 | is_exported_name = lambda name: name in module_all | 266 | |
11 | 267 | def is_exported_name(name): | ||
12 | 268 | return name in module_all | ||
13 | 269 | |||
14 | 267 | except AttributeError: | 270 | except AttributeError: |
16 | 268 | is_exported_name = lambda name: not name.startswith("_") | 271 | |
17 | 272 | def is_exported_name(name): | ||
18 | 273 | return not name.startswith("_") | ||
19 | 274 | |||
20 | 269 | return ( | 275 | return ( |
21 | 270 | interface | 276 | interface |
22 | 271 | for name, interface in inspect.getmembers( | 277 | for name, interface in inspect.getmembers( |
23 | diff --git a/src/lazr/restful/tales.py b/src/lazr/restful/tales.py | |||
24 | index 24d7e45..2968667 100644 | |||
25 | --- a/src/lazr/restful/tales.py | |||
26 | +++ b/src/lazr/restful/tales.py | |||
27 | @@ -378,14 +378,6 @@ class WadlEntryResourceAPI(WadlResourceAPI): | |||
28 | 378 | def type_link(self): | 378 | def type_link(self): |
29 | 379 | return self.resource.type_url | 379 | return self.resource.type_url |
30 | 380 | 380 | ||
31 | 381 | @property | ||
32 | 382 | def fields_with_values(self): | ||
33 | 383 | """Return all of this entry's Field objects.""" | ||
34 | 384 | fields = [] | ||
35 | 385 | for name, field in getFieldsInOrder(self.schema): | ||
36 | 386 | fields.append({"field": field, "value": "foo"}) | ||
37 | 387 | return fields | ||
38 | 388 | |||
39 | 389 | 381 | ||
40 | 390 | class WadlCollectionResourceAPI(WadlResourceAPI): | 382 | class WadlCollectionResourceAPI(WadlResourceAPI): |
41 | 391 | "Namespace for WADL functions that operate on collection resources." | 383 | "Namespace for WADL functions that operate on collection resources." |
42 | diff --git a/src/lazr/restful/tests/test_error.py b/src/lazr/restful/tests/test_error.py | |||
43 | index b667dbc..d407ccb 100644 | |||
44 | --- a/src/lazr/restful/tests/test_error.py | |||
45 | +++ b/src/lazr/restful/tests/test_error.py | |||
46 | @@ -17,9 +17,13 @@ from zope.component import getGlobalSiteManager | |||
47 | 17 | from zope.interface import Interface | 17 | from zope.interface import Interface |
48 | 18 | 18 | ||
49 | 19 | from lazr.restful.declarations import error_status | 19 | from lazr.restful.declarations import error_status |
51 | 20 | from lazr.restful._resource import ReadWriteResource, UnknownEntryAdapter | 20 | from lazr.restful._resource import ( |
52 | 21 | EntryAdapterUtility, | ||
53 | 22 | ReadWriteResource, | ||
54 | 23 | UnknownEntryAdapter, | ||
55 | 24 | ) | ||
56 | 21 | from lazr.restful.error import expose | 25 | from lazr.restful.error import expose |
58 | 22 | from lazr.restful.interfaces import IWebServiceLayer | 26 | from lazr.restful.interfaces import IWebServiceLayer, IWebServiceVersion |
59 | 23 | from lazr.restful.testing.webservice import FakeRequest | 27 | from lazr.restful.testing.webservice import FakeRequest |
60 | 24 | 28 | ||
61 | 25 | 29 | ||
62 | @@ -187,21 +191,35 @@ class ErrorsTestCase(unittest.TestCase): | |||
63 | 187 | def test_missing_adapter(self): | 191 | def test_missing_adapter(self): |
64 | 188 | # If there is no multi-adapter from the entry interface (IMyEntry) and | 192 | # If there is no multi-adapter from the entry interface (IMyEntry) and |
65 | 189 | # a request to IEntry an exception is raised. | 193 | # a request to IEntry an exception is raised. |
66 | 194 | class IWebServiceTestRequestBeta(IWebServiceVersion): | ||
67 | 195 | pass | ||
68 | 196 | |||
69 | 190 | class IMyEntry(Interface): | 197 | class IMyEntry(Interface): |
70 | 191 | pass | 198 | pass |
71 | 192 | 199 | ||
72 | 200 | sm = getGlobalSiteManager() | ||
73 | 201 | sm.registerUtility( | ||
74 | 202 | IWebServiceTestRequestBeta, IWebServiceVersion, name="beta" | ||
75 | 203 | ) | ||
76 | 204 | self.addCleanup( | ||
77 | 205 | sm.unregisterUtility, | ||
78 | 206 | IWebServiceTestRequestBeta, | ||
79 | 207 | IWebServiceVersion, | ||
80 | 208 | name="beta", | ||
81 | 209 | ) | ||
82 | 210 | beta_request = FakeRequest(version="beta") | ||
83 | 193 | # Since the test wants to inspect the exception message (below) we're | 211 | # Since the test wants to inspect the exception message (below) we're |
84 | 194 | # not using self.assertRaises). | 212 | # not using self.assertRaises). |
85 | 195 | try: | 213 | try: |
87 | 196 | EntryAdapterUtility.forSchemaInterface(IMyEntry, self.beta_request) | 214 | EntryAdapterUtility.forSchemaInterface(IMyEntry, beta_request) |
88 | 197 | except Exception as e: | 215 | except Exception as e: |
89 | 198 | self.assertTrue(isinstance(e, Exception)) | 216 | self.assertTrue(isinstance(e, Exception)) |
90 | 199 | 217 | ||
91 | 200 | # The exception's message explains what went wrong. | 218 | # The exception's message explains what went wrong. |
94 | 201 | self.assertTrue( | 219 | self.assertEqual( |
93 | 202 | str(e), | ||
95 | 203 | "No IEntry adapter found for IMyEntry " | 220 | "No IEntry adapter found for IMyEntry " |
96 | 204 | "(web service version: beta).", | 221 | "(web service version: beta).", |
97 | 222 | str(e), | ||
98 | 205 | ) | 223 | ) |
99 | 206 | else: | 224 | else: |
100 | 207 | self.fail( | 225 | self.fail( |
101 | diff --git a/src/lazr/restful/tests/test_webservice.py b/src/lazr/restful/tests/test_webservice.py | |||
102 | index 399866a..4864150 100644 | |||
103 | --- a/src/lazr/restful/tests/test_webservice.py | |||
104 | +++ b/src/lazr/restful/tests/test_webservice.py | |||
105 | @@ -179,15 +179,11 @@ class EntryTestCase(WebServiceTestCase): | |||
106 | 179 | return request.publication.application.toWADL() | 179 | return request.publication.application.toWADL() |
107 | 180 | 180 | ||
108 | 181 | @contextmanager | 181 | @contextmanager |
112 | 182 | def entry_resource( | 182 | def entry_resource(self, entry_implementation, *implementation_args): |
110 | 183 | self, entry_interface, entry_implementation, *implementation_args | ||
111 | 184 | ): | ||
113 | 185 | """Create a request to an entry resource, and yield the resource.""" | 183 | """Create a request to an entry resource, and yield the resource.""" |
114 | 186 | entry_class = get_resource_factory(entry_interface, IEntry) | ||
115 | 187 | data_object = entry_implementation(*implementation_args) | 184 | data_object = entry_implementation(*implementation_args) |
116 | 188 | 185 | ||
117 | 189 | with self.request() as request: | 186 | with self.request() as request: |
118 | 190 | entry = entry_class(data_object, request) | ||
119 | 191 | resource = EntryResource(data_object, request) | 187 | resource = EntryResource(data_object, request) |
120 | 192 | yield resource | 188 | yield resource |
121 | 193 | 189 | ||
122 | @@ -305,7 +301,7 @@ class TestEntryWebLink(EntryTestCase): | |||
123 | 305 | 301 | ||
124 | 306 | # Now a representation of IHasOneField includes a | 302 | # Now a representation of IHasOneField includes a |
125 | 307 | # 'web_link'. | 303 | # 'web_link'. |
127 | 308 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 304 | with self.entry_resource(HasOneField, "") as resource: |
128 | 309 | representation = resource.toDataForJSON() | 305 | representation = resource.toDataForJSON() |
129 | 310 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) | 306 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) |
130 | 311 | self.assertEqual( | 307 | self.assertEqual( |
131 | @@ -340,7 +336,7 @@ class TestEntryWebLink(EntryTestCase): | |||
132 | 340 | # entry representations. | 336 | # entry representations. |
133 | 341 | self._register_url_adapter(IHasOneField) | 337 | self._register_url_adapter(IHasOneField) |
134 | 342 | 338 | ||
136 | 343 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 339 | with self.entry_resource(HasOneField, "") as resource: |
137 | 344 | representation = resource.toDataForJSON() | 340 | representation = resource.toDataForJSON() |
138 | 345 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) | 341 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) |
139 | 346 | self.assertFalse("web_link" in representation) | 342 | self.assertFalse("web_link" in representation) |
140 | @@ -376,9 +372,7 @@ class TestSuppressWebLink(EntryTestCase): | |||
141 | 376 | def test_entry_omits_web_link_when_suppressed(self): | 372 | def test_entry_omits_web_link_when_suppressed(self): |
142 | 377 | self._register_website_url_space(IHasNoWebLink) | 373 | self._register_website_url_space(IHasNoWebLink) |
143 | 378 | 374 | ||
147 | 379 | with self.entry_resource(IHasNoWebLink, HasNoWebLink, "") as ( | 375 | with self.entry_resource(HasNoWebLink, "") as resource: |
145 | 380 | resource | ||
146 | 381 | ): | ||
148 | 382 | representation = resource.toDataForJSON() | 376 | representation = resource.toDataForJSON() |
149 | 383 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) | 377 | self.assertEqual(representation["self_link"], StubAbsoluteURL.URL) |
150 | 384 | self.assertFalse("web_link" in representation) | 378 | self.assertFalse("web_link" in representation) |
151 | @@ -442,7 +436,7 @@ class TestEntryWrite(EntryTestCase): | |||
152 | 442 | def test_applyChanges_rejects_nonexistent_web_link(self): | 436 | def test_applyChanges_rejects_nonexistent_web_link(self): |
153 | 443 | # If web_link is not published, applyChanges rejects a request | 437 | # If web_link is not published, applyChanges rejects a request |
154 | 444 | # that references it. | 438 | # that references it. |
156 | 445 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 439 | with self.entry_resource(HasOneField, "") as resource: |
157 | 446 | errors = resource.applyChanges({"web_link": u"some_value"}) | 440 | errors = resource.applyChanges({"web_link": u"some_value"}) |
158 | 447 | self.assertEqual( | 441 | self.assertEqual( |
159 | 448 | errors, | 442 | errors, |
160 | @@ -453,7 +447,7 @@ class TestEntryWrite(EntryTestCase): | |||
161 | 453 | """applyChanges rejects an attempt to change web_link .""" | 447 | """applyChanges rejects an attempt to change web_link .""" |
162 | 454 | self._register_website_url_space(IHasOneField) | 448 | self._register_website_url_space(IHasOneField) |
163 | 455 | 449 | ||
165 | 456 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 450 | with self.entry_resource(HasOneField, "") as resource: |
166 | 457 | errors = resource.applyChanges({"web_link": u"some_value"}) | 451 | errors = resource.applyChanges({"web_link": u"some_value"}) |
167 | 458 | self.assertEqual( | 452 | self.assertEqual( |
168 | 459 | errors, "web_link: You tried to modify a read-only attribute." | 453 | errors, "web_link: You tried to modify a read-only attribute." |
169 | @@ -464,7 +458,7 @@ class TestEntryWrite(EntryTestCase): | |||
170 | 464 | # value isn't actually being changed. | 458 | # value isn't actually being changed. |
171 | 465 | self._register_website_url_space(IHasOneField) | 459 | self._register_website_url_space(IHasOneField) |
172 | 466 | 460 | ||
174 | 467 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 461 | with self.entry_resource(HasOneField, "") as resource: |
175 | 468 | existing_web_link = resource.toDataForJSON()["web_link"] | 462 | existing_web_link = resource.toDataForJSON()["web_link"] |
176 | 469 | representation = simplejson.loads( | 463 | representation = simplejson.loads( |
177 | 470 | resource.applyChanges({"web_link": existing_web_link}) | 464 | resource.applyChanges({"web_link": existing_web_link}) |
178 | @@ -476,7 +470,7 @@ class TestEntryWrite(EntryTestCase): | |||
179 | 476 | # representation of the (unchanged) resource. | 470 | # representation of the (unchanged) resource. |
180 | 477 | self._register_website_url_space(IHasOneField) | 471 | self._register_website_url_space(IHasOneField) |
181 | 478 | 472 | ||
183 | 479 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 473 | with self.entry_resource(HasOneField, "") as resource: |
184 | 480 | existing_representation = resource.toDataForJSON() | 474 | existing_representation = resource.toDataForJSON() |
185 | 481 | representation = simplejson.loads(resource.applyChanges({})) | 475 | representation = simplejson.loads(resource.applyChanges({})) |
186 | 482 | self.assertEqual(representation, existing_representation) | 476 | self.assertEqual(representation, existing_representation) |
187 | @@ -489,7 +483,6 @@ class TestEntryWrite(EntryTestCase): | |||
188 | 489 | self._register_website_url_space(IHasFieldExportedAsDifferentName) | 483 | self._register_website_url_space(IHasFieldExportedAsDifferentName) |
189 | 490 | 484 | ||
190 | 491 | with self.entry_resource( | 485 | with self.entry_resource( |
191 | 492 | IHasFieldExportedAsDifferentName, | ||
192 | 493 | HasFieldExportedAsDifferentName, | 486 | HasFieldExportedAsDifferentName, |
193 | 494 | u"initial value", | 487 | u"initial value", |
194 | 495 | ) as resource: | 488 | ) as resource: |
195 | @@ -521,9 +514,7 @@ class TestEntryWriteForRestrictedField(EntryTestCase): | |||
196 | 521 | expose the right interface, it will raise an exception. | 514 | expose the right interface, it will raise an exception. |
197 | 522 | """ | 515 | """ |
198 | 523 | self._register_url_adapter(IHasRestrictedField) | 516 | self._register_url_adapter(IHasRestrictedField) |
202 | 524 | with self.entry_resource( | 517 | with self.entry_resource(HasRestrictedField, "") as resource: |
200 | 525 | IHasRestrictedField, HasRestrictedField, "" | ||
201 | 526 | ) as resource: | ||
203 | 527 | entry = resource.entry | 518 | entry = resource.entry |
204 | 528 | entry.schema["a_field"].restrict_to_interface = IHasRestrictedField | 519 | entry.schema["a_field"].restrict_to_interface = IHasRestrictedField |
205 | 529 | self.assertEqual(entry.a_field, "") | 520 | self.assertEqual(entry.a_field, "") |
206 | @@ -558,7 +549,7 @@ class HTMLRepresentationTest(EntryTestCase): | |||
207 | 558 | 549 | ||
208 | 559 | def test_entry_html_representation_is_utf8(self): | 550 | def test_entry_html_representation_is_utf8(self): |
209 | 560 | with self.entry_resource( | 551 | with self.entry_resource( |
211 | 561 | IHasOneField, HasOneField, self.unicode_message | 552 | HasOneField, self.unicode_message |
212 | 562 | ) as resource: | 553 | ) as resource: |
213 | 563 | html = resource.do_GET() | 554 | html = resource.do_GET() |
214 | 564 | self.assertTrue(self.utf8_message in html) | 555 | self.assertTrue(self.utf8_message in html) |
215 | @@ -592,7 +583,6 @@ class JSONPlusHTMLRepresentationTest(EntryTestCase): | |||
216 | 592 | def resource(self, value_1="value 1", value_2="value 2"): | 583 | def resource(self, value_1="value 1", value_2="value 2"): |
217 | 593 | """Simplify the entry_resource call.""" | 584 | """Simplify the entry_resource call.""" |
218 | 594 | with self.entry_resource( | 585 | with self.entry_resource( |
219 | 595 | IHasTwoFields, | ||
220 | 596 | HasTwoFields, | 586 | HasTwoFields, |
221 | 597 | six.text_type(value_1), | 587 | six.text_type(value_1), |
222 | 598 | six.text_type(value_2), | 588 | six.text_type(value_2), |
223 | @@ -721,9 +711,7 @@ class UnicodeErrorTestCase(EntryTestCase): | |||
224 | 721 | self._register_url_adapter(ICanBeSetToUnicodeValue) | 711 | self._register_url_adapter(ICanBeSetToUnicodeValue) |
225 | 722 | 712 | ||
226 | 723 | def test_unicode_error(self): | 713 | def test_unicode_error(self): |
230 | 724 | with self.entry_resource( | 714 | with self.entry_resource(CanBeSetToUnicodeValue, "") as resource: |
228 | 725 | ICanBeSetToUnicodeValue, CanBeSetToUnicodeValue, "" | ||
229 | 726 | ) as resource: | ||
231 | 727 | 715 | ||
232 | 728 | # This will raise an exception, which will cause the request | 716 | # This will raise an exception, which will cause the request |
233 | 729 | # to fail with a 400 error code. | 717 | # to fail with a 400 error code. |
234 | @@ -1135,7 +1123,7 @@ class NotificationsProviderTest(EntryTestCase): | |||
235 | 1135 | @contextmanager | 1123 | @contextmanager |
236 | 1136 | def resource(self): | 1124 | def resource(self): |
237 | 1137 | """Simplify the entry_resource call.""" | 1125 | """Simplify the entry_resource call.""" |
239 | 1138 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 1126 | with self.entry_resource(HasOneField, "") as resource: |
240 | 1139 | yield resource | 1127 | yield resource |
241 | 1140 | 1128 | ||
242 | 1141 | def test_response_notifications(self): | 1129 | def test_response_notifications(self): |
243 | @@ -1165,7 +1153,7 @@ class EventTestCase(EntryTestCase): | |||
244 | 1165 | def test_event_fired_when_changeset_is_not_empty(self): | 1153 | def test_event_fired_when_changeset_is_not_empty(self): |
245 | 1166 | # Passing in a non-empty changeset spawns an | 1154 | # Passing in a non-empty changeset spawns an |
246 | 1167 | # IObjectModifiedEvent. | 1155 | # IObjectModifiedEvent. |
248 | 1168 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 1156 | with self.entry_resource(HasOneField, "") as resource: |
249 | 1169 | resource.applyChanges({"a_field": u"Some value"}) | 1157 | resource.applyChanges({"a_field": u"Some value"}) |
250 | 1170 | events = eventtesting.getEvents() | 1158 | events = eventtesting.getEvents() |
251 | 1171 | self.assertEqual(len(events), 1) | 1159 | self.assertEqual(len(events), 1) |
252 | @@ -1176,7 +1164,7 @@ class EventTestCase(EntryTestCase): | |||
253 | 1176 | def test_event_not_fired_when_changeset_is_empty(self): | 1164 | def test_event_not_fired_when_changeset_is_empty(self): |
254 | 1177 | # Passing in an empty changeset does not spawn an | 1165 | # Passing in an empty changeset does not spawn an |
255 | 1178 | # IObjectModifiedEvent. | 1166 | # IObjectModifiedEvent. |
257 | 1179 | with self.entry_resource(IHasOneField, HasOneField, "") as resource: | 1167 | with self.entry_resource(HasOneField, "") as resource: |
258 | 1180 | resource.applyChanges({}) | 1168 | resource.applyChanges({}) |
259 | 1181 | self.assertEqual(len(eventtesting.getEvents()), 0) | 1169 | self.assertEqual(len(eventtesting.getEvents()), 0) |
260 | 1182 | 1170 | ||
261 | @@ -1193,7 +1181,7 @@ class MalformedRequest(EntryTestCase): | |||
262 | 1193 | 1181 | ||
263 | 1194 | def test_multiple_named_operations_generate_error_on_GET(self): | 1182 | def test_multiple_named_operations_generate_error_on_GET(self): |
264 | 1195 | with self.entry_resource( | 1183 | with self.entry_resource( |
266 | 1196 | IHasOneField, HasOneField, self.unicode_message | 1184 | HasOneField, self.unicode_message |
267 | 1197 | ) as resource: | 1185 | ) as resource: |
268 | 1198 | resource.request.form["ws.op"] = ["foo", "bar"] | 1186 | resource.request.form["ws.op"] = ["foo", "bar"] |
269 | 1199 | result = resource.do_GET() | 1187 | result = resource.do_GET() |
270 | @@ -1202,7 +1190,7 @@ class MalformedRequest(EntryTestCase): | |||
271 | 1202 | 1190 | ||
272 | 1203 | def test_multiple_named_operations_generate_error_on_POST(self): | 1191 | def test_multiple_named_operations_generate_error_on_POST(self): |
273 | 1204 | with self.entry_resource( | 1192 | with self.entry_resource( |
275 | 1205 | IHasOneField, HasOneField, self.unicode_message | 1193 | HasOneField, self.unicode_message |
276 | 1206 | ) as resource: | 1194 | ) as resource: |
277 | 1207 | resource.request.form["ws.op"] = ["foo", "bar"] | 1195 | resource.request.form["ws.op"] = ["foo", "bar"] |
278 | 1208 | result = resource.do_POST() | 1196 | result = resource.do_POST() |
279 | diff --git a/tox.ini b/tox.ini | |||
280 | index 8ea8d6d..4030fe5 100644 | |||
281 | --- a/tox.ini | |||
282 | +++ b/tox.ini | |||
283 | @@ -1,6 +1,14 @@ | |||
284 | 1 | [tox] | 1 | [tox] |
285 | 2 | envlist = | 2 | envlist = |
287 | 3 | py27,py35,py36,py37,py38,py39,py310,docs | 3 | lint |
288 | 4 | py27 | ||
289 | 5 | py35 | ||
290 | 6 | py36 | ||
291 | 7 | py37 | ||
292 | 8 | py38 | ||
293 | 9 | py39 | ||
294 | 10 | py310 | ||
295 | 11 | docs | ||
296 | 4 | 12 | ||
297 | 5 | [testenv] | 13 | [testenv] |
298 | 6 | deps = | 14 | deps = |
299 | @@ -9,6 +17,14 @@ deps = | |||
300 | 9 | commands = | 17 | commands = |
301 | 10 | zope-testrunner --test-path src --tests-pattern ^tests {posargs} | 18 | zope-testrunner --test-path src --tests-pattern ^tests {posargs} |
302 | 11 | 19 | ||
303 | 20 | [testenv:lint] | ||
304 | 21 | basepython = python3.8 | ||
305 | 22 | deps = | ||
306 | 23 | pre-commit | ||
307 | 24 | skip_install = true | ||
308 | 25 | commands = | ||
309 | 26 | pre-commit run -a | ||
310 | 27 | |||
311 | 12 | [testenv:docs] | 28 | [testenv:docs] |
312 | 13 | basepython = python3 | 29 | basepython = python3 |
313 | 14 | deps = | 30 | deps = |
314 | @@ -23,8 +39,3 @@ ignore = | |||
315 | 23 | # W503 and W504 are mutually exclusive | 39 | # W503 and W504 are mutually exclusive |
316 | 24 | W503 | 40 | W503 |
317 | 25 | W504 | 41 | W504 |
318 | 26 | # todo | ||
319 | 27 | E731 | ||
320 | 28 | F821 | ||
321 | 29 | F841 | ||
322 | 30 | W605 |