envoy.code.check 0.6.0__tar.gz → 0.6.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/PKG-INFO +8 -15
  2. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/changelog.py +73 -2
  3. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/interface.py +18 -0
  4. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/PKG-INFO +8 -15
  5. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/requires.txt +6 -13
  6. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/setup.py +8 -15
  7. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/MANIFEST.in +0 -0
  8. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/backend_shim.py +0 -0
  9. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/__init__.py +0 -0
  10. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/__init__.py +0 -0
  11. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/base.py +0 -0
  12. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/checker.py +0 -0
  13. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/extensions.py +0 -0
  14. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/flake8.py +0 -0
  15. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/glint.py +0 -0
  16. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/gofmt.py +0 -0
  17. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/rst.py +0 -0
  18. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/runtime_guards.py +0 -0
  19. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/shellcheck.py +0 -0
  20. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/yamllint.py +0 -0
  21. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/abstract/yapf.py +0 -0
  22. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/checker.py +0 -0
  23. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/cmd.py +0 -0
  24. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/exceptions.py +0 -0
  25. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/py.typed +0 -0
  26. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy/code/check/typing.py +0 -0
  27. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/SOURCES.txt +0 -0
  28. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/dependency_links.txt +0 -0
  29. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/entry_points.txt +0 -0
  30. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/namespace_packages.txt +0 -0
  31. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/envoy.code.check.egg-info/top_level.txt +0 -0
  32. {envoy_code_check-0.6.0 → envoy_code_check-0.6.2}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: envoy.code.check
3
- Version: 0.6.0
4
- Summary: Code checker used in Envoy proxy's CI
3
+ Version: 0.6.2
4
+ Summary: Code checker used in Envoy proxy CI
5
5
  Home-page: https://github.com/envoyproxy/toolshed/tree/main/py/envoy.code.check
6
6
  Author: Ryan Northey
7
7
  Author-email: ryan@synca.io
@@ -21,35 +21,28 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
21
21
  Classifier: Topic :: Software Development
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.12
24
- Requires-Dist: abstracts==0.2.0
25
24
  Requires-Dist: abstracts>=0.2.0
26
- Requires-Dist: aio-core==0.11.0
27
- Requires-Dist: aio-run-checker==0.6.0
28
- Requires-Dist: aio.core>=0.11.0
29
- Requires-Dist: aio.run.checker>=0.6.0
30
- Requires-Dist: envoy-base-utils==0.6.0
31
- Requires-Dist: envoy.base.utils>=0.6.0
32
- Requires-Dist: flake8==7.3.0
25
+ Requires-Dist: aio.core>=0.11.1
26
+ Requires-Dist: aio.run.checker>=0.6.1
27
+ Requires-Dist: envoy.base.utils==0.6.4-dev
28
+ Requires-Dist: envoy.base.utils>=0.6.3
33
29
  Requires-Dist: flake8>=6.1.0
34
- Requires-Dist: packaging==26.2
35
30
  Requires-Dist: packaging>=23.0
36
31
  Requires-Dist: pep8-naming>=0.13.3
37
32
  Requires-Dist: types-pyyaml==6.0.12.20260508
38
- Requires-Dist: yamllint==1.38.0
39
33
  Requires-Dist: yamllint>=1.32.0
40
- Requires-Dist: yapf==0.43.0
41
34
  Requires-Dist: yapf>=0.40.2
42
35
  Provides-Extra: test
43
36
  Requires-Dist: pytest>=7.4.0; extra == "test"
44
37
  Requires-Dist: pytest-asyncio>=0.23.3; extra == "test"
45
- Requires-Dist: pytest-coverage; extra == "test"
38
+ Requires-Dist: pytest-cov; extra == "test"
46
39
  Requires-Dist: pytest-iters>=0.1.0; extra == "test"
47
40
  Requires-Dist: pytest-patches>=0.1.0; extra == "test"
48
41
  Provides-Extra: lint
49
42
  Requires-Dist: flake8>=6.1.0; extra == "lint"
50
43
  Provides-Extra: types
51
44
  Requires-Dist: mypy>=1.6.0; extra == "types"
52
- Requires-Dist: mypy-abstracts>=0.1.0; extra == "types"
45
+ Requires-Dist: mypy-abstracts>=0.1.1; extra == "types"
53
46
  Provides-Extra: publish
54
47
  Requires-Dist: wheel>=0.41.0; extra == "publish"
55
48
  Dynamic: author
@@ -1,5 +1,6 @@
1
1
 
2
2
  import itertools
3
+ import pathlib
3
4
  from datetime import datetime
4
5
  from functools import cached_property
5
6
  from collections.abc import Iterator
@@ -11,6 +12,10 @@ import abstracts
11
12
  from aio.core.functional import async_property
12
13
 
13
14
  from envoy.base import utils
15
+ from envoy.base.utils.abstract.project.changelog import (
16
+ CHANGELOG_ENTRY_GLOB,
17
+ ENTRY_SEPARATOR,
18
+ )
14
19
  from envoy.code.check import abstract, interface
15
20
 
16
21
 
@@ -95,6 +100,50 @@ class AChangelogChangesChecker(metaclass=abstracts.Abstraction):
95
100
  f"{version}/changes: Invalid `changes` section "
96
101
  "(this is no longer used)")
97
102
 
103
+ def check_entry_filename(
104
+ self,
105
+ path: pathlib.Path) -> str | None:
106
+ section = path.parent.name
107
+ if section not in self.sections:
108
+ return (
109
+ f"{path}: Invalid section `{section}`. "
110
+ f"Valid sections: {sorted(self.sections)}")
111
+ if path.suffix != ".rst":
112
+ return (
113
+ f"{path}: Invalid file extension `{path.suffix}` "
114
+ "(expected `.rst`)")
115
+ if path.stem.count(ENTRY_SEPARATOR) != 1:
116
+ return (
117
+ f"{path}: Filename stem must contain exactly one "
118
+ f"`{ENTRY_SEPARATOR}` separator "
119
+ f"(expected `<area>{ENTRY_SEPARATOR}<slug>`)")
120
+ area, slug = path.stem.split(ENTRY_SEPARATOR, 1)
121
+ if not area:
122
+ return f"{path}: Area part of filename is empty"
123
+ if not slug:
124
+ return f"{path}: Slug part of filename is empty"
125
+ return None
126
+
127
+ def check_entry_content(
128
+ self,
129
+ path: pathlib.Path) -> str | None:
130
+ content = path.read_text()
131
+ if not content.strip():
132
+ return (
133
+ f"{path}: Entry file is empty or contains only whitespace")
134
+ return None
135
+
136
+ def check_entry_files(
137
+ self,
138
+ paths: list[pathlib.Path]) -> tuple[str, ...]:
139
+ errors = []
140
+ for path in paths:
141
+ if err := self.check_entry_filename(path):
142
+ errors.append(err)
143
+ if err := self.check_entry_content(path):
144
+ errors.append(err)
145
+ return tuple(errors)
146
+
98
147
 
99
148
  @abstracts.implementer(interface.IChangelogStatus)
100
149
  class AChangelogStatus(metaclass=abstracts.Abstraction):
@@ -136,15 +185,26 @@ class AChangelogStatus(metaclass=abstracts.Abstraction):
136
185
  and self.project.changelogs.changelog_path(
137
186
  self.version).exists())
138
187
 
188
+ @property
189
+ def entry_dir(self) -> pathlib.Path | None:
190
+ if not self.is_current:
191
+ return None
192
+ return (
193
+ self.project.changelogs
194
+ .changelog_path(self.version)
195
+ .with_suffix(""))
196
+
139
197
  @async_property(cache=True)
140
198
  async def errors(self) -> tuple[str, ...]:
199
+ entry_errors = await self.check_entry_files()
141
200
  try:
142
201
  return (
143
202
  *self.check_version(),
144
203
  *await self.check_date(),
145
- *await self.check_sections())
204
+ *await self.check_sections(),
205
+ *entry_errors)
146
206
  except utils.exceptions.ChangelogParseError as e:
147
- return (f"{self.version}: {e}", )
207
+ return (*entry_errors, f"{self.version}: {e}")
148
208
 
149
209
  @async_property
150
210
  async def invalid_date(self) -> str | None:
@@ -215,6 +275,17 @@ class AChangelogStatus(metaclass=abstracts.Abstraction):
215
275
  self.version,
216
276
  await self.sections)
217
277
 
278
+ async def check_entry_files(self) -> tuple[str, ...]:
279
+ entry_dir = self.entry_dir
280
+ if entry_dir is None or not entry_dir.exists():
281
+ return ()
282
+ paths = sorted(entry_dir.glob(CHANGELOG_ENTRY_GLOB))
283
+ if not paths:
284
+ return ()
285
+ return await self.project.execute(
286
+ self.checker.check_entry_files,
287
+ paths)
288
+
218
289
  def check_version(self) -> tuple[str, ...]:
219
290
  errors = []
220
291
  if self.duplicate_current:
@@ -138,6 +138,24 @@ class IChangelogChangesChecker(metaclass=abstracts.Interface):
138
138
  tuple[str, ...]):
139
139
  raise NotImplementedError
140
140
 
141
+ @abstracts.interfacemethod
142
+ def check_entry_filename(
143
+ self,
144
+ path: pathlib.Path) -> str | None:
145
+ raise NotImplementedError
146
+
147
+ @abstracts.interfacemethod
148
+ def check_entry_content(
149
+ self,
150
+ path: pathlib.Path) -> str | None:
151
+ raise NotImplementedError
152
+
153
+ @abstracts.interfacemethod
154
+ def check_entry_files(
155
+ self,
156
+ paths: list[pathlib.Path]) -> tuple[str, ...]:
157
+ raise NotImplementedError
158
+
141
159
 
142
160
  class IChangelogStatus(metaclass=abstracts.Interface):
143
161
  pass
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: envoy.code.check
3
- Version: 0.6.0
4
- Summary: Code checker used in Envoy proxy's CI
3
+ Version: 0.6.2
4
+ Summary: Code checker used in Envoy proxy CI
5
5
  Home-page: https://github.com/envoyproxy/toolshed/tree/main/py/envoy.code.check
6
6
  Author: Ryan Northey
7
7
  Author-email: ryan@synca.io
@@ -21,35 +21,28 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
21
21
  Classifier: Topic :: Software Development
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.12
24
- Requires-Dist: abstracts==0.2.0
25
24
  Requires-Dist: abstracts>=0.2.0
26
- Requires-Dist: aio-core==0.11.0
27
- Requires-Dist: aio-run-checker==0.6.0
28
- Requires-Dist: aio.core>=0.11.0
29
- Requires-Dist: aio.run.checker>=0.6.0
30
- Requires-Dist: envoy-base-utils==0.6.0
31
- Requires-Dist: envoy.base.utils>=0.6.0
32
- Requires-Dist: flake8==7.3.0
25
+ Requires-Dist: aio.core>=0.11.1
26
+ Requires-Dist: aio.run.checker>=0.6.1
27
+ Requires-Dist: envoy.base.utils==0.6.4-dev
28
+ Requires-Dist: envoy.base.utils>=0.6.3
33
29
  Requires-Dist: flake8>=6.1.0
34
- Requires-Dist: packaging==26.2
35
30
  Requires-Dist: packaging>=23.0
36
31
  Requires-Dist: pep8-naming>=0.13.3
37
32
  Requires-Dist: types-pyyaml==6.0.12.20260508
38
- Requires-Dist: yamllint==1.38.0
39
33
  Requires-Dist: yamllint>=1.32.0
40
- Requires-Dist: yapf==0.43.0
41
34
  Requires-Dist: yapf>=0.40.2
42
35
  Provides-Extra: test
43
36
  Requires-Dist: pytest>=7.4.0; extra == "test"
44
37
  Requires-Dist: pytest-asyncio>=0.23.3; extra == "test"
45
- Requires-Dist: pytest-coverage; extra == "test"
38
+ Requires-Dist: pytest-cov; extra == "test"
46
39
  Requires-Dist: pytest-iters>=0.1.0; extra == "test"
47
40
  Requires-Dist: pytest-patches>=0.1.0; extra == "test"
48
41
  Provides-Extra: lint
49
42
  Requires-Dist: flake8>=6.1.0; extra == "lint"
50
43
  Provides-Extra: types
51
44
  Requires-Dist: mypy>=1.6.0; extra == "types"
52
- Requires-Dist: mypy-abstracts>=0.1.0; extra == "types"
45
+ Requires-Dist: mypy-abstracts>=0.1.1; extra == "types"
53
46
  Provides-Extra: publish
54
47
  Requires-Dist: wheel>=0.41.0; extra == "publish"
55
48
  Dynamic: author
@@ -1,20 +1,13 @@
1
- abstracts==0.2.0
2
1
  abstracts>=0.2.0
3
- aio-core==0.11.0
4
- aio-run-checker==0.6.0
5
- aio.core>=0.11.0
6
- aio.run.checker>=0.6.0
7
- envoy-base-utils==0.6.0
8
- envoy.base.utils>=0.6.0
9
- flake8==7.3.0
2
+ aio.core>=0.11.1
3
+ aio.run.checker>=0.6.1
4
+ envoy.base.utils==0.6.4-dev
5
+ envoy.base.utils>=0.6.3
10
6
  flake8>=6.1.0
11
- packaging==26.2
12
7
  packaging>=23.0
13
8
  pep8-naming>=0.13.3
14
9
  types-pyyaml==6.0.12.20260508
15
- yamllint==1.38.0
16
10
  yamllint>=1.32.0
17
- yapf==0.43.0
18
11
  yapf>=0.40.2
19
12
 
20
13
  [lint]
@@ -26,10 +19,10 @@ wheel>=0.41.0
26
19
  [test]
27
20
  pytest>=7.4.0
28
21
  pytest-asyncio>=0.23.3
29
- pytest-coverage
22
+ pytest-cov
30
23
  pytest-iters>=0.1.0
31
24
  pytest-patches>=0.1.0
32
25
 
33
26
  [types]
34
27
  mypy>=1.6.0
35
- mypy-abstracts>=0.1.0
28
+ mypy-abstracts>=0.1.1
@@ -21,7 +21,7 @@ setup(**{
21
21
  'Topic :: Software Development',
22
22
  'Typing :: Typed',
23
23
  ],
24
- 'description': 'Code checker used in Envoy proxy\'s CI',
24
+ 'description': 'Code checker used in Envoy proxy CI',
25
25
  'entry_points': {
26
26
  'console_scripts': [
27
27
  'envoy.code.check=envoy.code.check:run',
@@ -31,7 +31,7 @@ setup(**{
31
31
  'test': [
32
32
  'pytest>=7.4.0',
33
33
  'pytest-asyncio>=0.23.3',
34
- 'pytest-coverage',
34
+ 'pytest-cov',
35
35
  'pytest-iters>=0.1.0',
36
36
  'pytest-patches>=0.1.0',
37
37
  ],
@@ -40,30 +40,23 @@ setup(**{
40
40
  ],
41
41
  'types': [
42
42
  'mypy>=1.6.0',
43
- 'mypy-abstracts>=0.1.0',
43
+ 'mypy-abstracts>=0.1.1',
44
44
  ],
45
45
  'publish': [
46
46
  'wheel>=0.41.0',
47
47
  ],
48
48
  },
49
49
  'install_requires': (
50
- 'abstracts==0.2.0',
51
50
  'abstracts>=0.2.0',
52
- 'aio-core==0.11.0',
53
- 'aio-run-checker==0.6.0',
54
- 'aio.core>=0.11.0',
55
- 'aio.run.checker>=0.6.0',
56
- 'envoy-base-utils==0.6.0',
57
- 'envoy.base.utils>=0.6.0',
58
- 'flake8==7.3.0',
51
+ 'aio.core>=0.11.1',
52
+ 'aio.run.checker>=0.6.1',
53
+ 'envoy.base.utils==0.6.4-dev',
54
+ 'envoy.base.utils>=0.6.3',
59
55
  'flake8>=6.1.0',
60
- 'packaging==26.2',
61
56
  'packaging>=23.0',
62
57
  'pep8-naming>=0.13.3',
63
58
  'types-pyyaml==6.0.12.20260508',
64
- 'yamllint==1.38.0',
65
59
  'yamllint>=1.32.0',
66
- 'yapf==0.43.0',
67
60
  'yapf>=0.40.2',
68
61
  ),
69
62
  'license': 'Apache Software License 2.0',
@@ -130,5 +123,5 @@ Links
130
123
  ),
131
124
  'python_requires': '>=3.12',
132
125
  'url': 'https://github.com/envoyproxy/toolshed/tree/main/py/envoy.code.check',
133
- 'version': '0.6.0',
126
+ 'version': '0.6.2',
134
127
  })