edify 0.2.2__tar.gz → 0.3.0__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 (94) hide show
  1. {edify-0.2.2 → edify-0.3.0}/.bumpversion.cfg +1 -1
  2. {edify-0.2.2 → edify-0.3.0}/.github/workflows/github-actions.yml +75 -48
  3. {edify-0.2.2 → edify-0.3.0}/.pre-commit-config.yaml +8 -8
  4. {edify-0.2.2 → edify-0.3.0}/.readthedocs.yml +4 -1
  5. edify-0.3.0/AUTHORS.rst +6 -0
  6. edify-0.3.0/CHANGELOG.rst +85 -0
  7. {edify-0.2.2 → edify-0.3.0}/MANIFEST.in +0 -1
  8. {edify-0.2.2 → edify-0.3.0}/PKG-INFO +60 -7
  9. {edify-0.2.2 → edify-0.3.0}/README.rst +3 -3
  10. edify-0.3.0/ci/requirements.txt +5 -0
  11. {edify-0.2.2 → edify-0.3.0}/docs/conf.py +11 -4
  12. {edify-0.2.2 → edify-0.3.0}/docs/requirements.txt +1 -1
  13. {edify-0.2.2 → edify-0.3.0}/pyproject.toml +2 -2
  14. {edify-0.2.2 → edify-0.3.0}/setup.cfg +2 -2
  15. {edify-0.2.2 → edify-0.3.0}/setup.py +5 -3
  16. {edify-0.2.2 → edify-0.3.0}/src/edify/__init__.py +1 -1
  17. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/helpers/core.py +3 -3
  18. {edify-0.2.2 → edify-0.3.0}/src/edify.egg-info/PKG-INFO +60 -7
  19. {edify-0.2.2 → edify-0.3.0}/src/edify.egg-info/SOURCES.txt +0 -4
  20. edify-0.3.0/tests.local.sh +26 -0
  21. {edify-0.2.2 → edify-0.3.0}/tox.ini +7 -14
  22. edify-0.2.2/.cookiecutterrc +0 -74
  23. edify-0.2.2/AUTHORS.rst +0 -5
  24. edify-0.2.2/CHANGELOG.rst +0 -44
  25. edify-0.2.2/ci/bootstrap.py +0 -93
  26. edify-0.2.2/ci/requirements.txt +0 -5
  27. edify-0.2.2/ci/templates/.appveyor.yml +0 -46
  28. edify-0.2.2/ci/templates/.github/workflows/github-actions.yml +0 -65
  29. edify-0.2.2/tests.local.sh +0 -40
  30. {edify-0.2.2 → edify-0.3.0}/.coveragerc +0 -0
  31. {edify-0.2.2 → edify-0.3.0}/.editorconfig +0 -0
  32. {edify-0.2.2 → edify-0.3.0}/CONTRIBUTING.rst +0 -0
  33. {edify-0.2.2 → edify-0.3.0}/LICENSE +0 -0
  34. {edify-0.2.2 → edify-0.3.0}/docs/authors.rst +0 -0
  35. {edify-0.2.2 → edify-0.3.0}/docs/built-in/index.rst +0 -0
  36. {edify-0.2.2 → edify-0.3.0}/docs/changelog.rst +0 -0
  37. {edify-0.2.2 → edify-0.3.0}/docs/contributing.rst +0 -0
  38. {edify-0.2.2 → edify-0.3.0}/docs/index.rst +0 -0
  39. {edify-0.2.2 → edify-0.3.0}/docs/readme.rst +0 -0
  40. {edify-0.2.2 → edify-0.3.0}/docs/regex-builder/builder/index.rst +0 -0
  41. {edify-0.2.2 → edify-0.3.0}/docs/regex-builder/flags/index.rst +0 -0
  42. {edify-0.2.2 → edify-0.3.0}/docs/regex-builder/index.rst +0 -0
  43. {edify-0.2.2 → edify-0.3.0}/docs/spelling_wordlist.txt +0 -0
  44. {edify-0.2.2 → edify-0.3.0}/images/cover.png +0 -0
  45. {edify-0.2.2 → edify-0.3.0}/images/logo_1500px.png +0 -0
  46. {edify-0.2.2 → edify-0.3.0}/images/logo_500px.png +0 -0
  47. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_1500px.png +0 -0
  48. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_500px.png +0 -0
  49. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_black_1500px.png +0 -0
  50. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_black_500px.png +0 -0
  51. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_t_1500px.png +0 -0
  52. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_t_500px.png +0 -0
  53. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_t_black_1500px.png +0 -0
  54. {edify-0.2.2 → edify-0.3.0}/images/logo_no_text_t_black_500px.png +0 -0
  55. {edify-0.2.2 → edify-0.3.0}/images/logo_t_1500px.png +0 -0
  56. {edify-0.2.2 → edify-0.3.0}/images/logo_t_500px.png +0 -0
  57. {edify-0.2.2 → edify-0.3.0}/images/logo_t_black_1500px.png +0 -0
  58. {edify-0.2.2 → edify-0.3.0}/images/logo_t_black_500px.png +0 -0
  59. {edify-0.2.2 → edify-0.3.0}/images/logo_wob_1500px.png +0 -0
  60. {edify-0.2.2 → edify-0.3.0}/images/logo_wob_500px.png +0 -0
  61. {edify-0.2.2 → edify-0.3.0}/pytest.ini +0 -0
  62. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/builder.py +0 -0
  63. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/errors.py +0 -0
  64. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/helpers/quantifiers.py +0 -0
  65. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/helpers/regex_vars.py +0 -0
  66. {edify-0.2.2 → edify-0.3.0}/src/edify/builder/helpers/t.py +0 -0
  67. {edify-0.2.2 → edify-0.3.0}/src/edify/library/__init__.py +0 -0
  68. {edify-0.2.2 → edify-0.3.0}/src/edify/library/date.py +0 -0
  69. {edify-0.2.2 → edify-0.3.0}/src/edify/library/guid.py +0 -0
  70. {edify-0.2.2 → edify-0.3.0}/src/edify/library/ip.py +0 -0
  71. {edify-0.2.2 → edify-0.3.0}/src/edify/library/mac.py +0 -0
  72. {edify-0.2.2 → edify-0.3.0}/src/edify/library/mail.py +0 -0
  73. {edify-0.2.2 → edify-0.3.0}/src/edify/library/password.py +0 -0
  74. {edify-0.2.2 → edify-0.3.0}/src/edify/library/phone.py +0 -0
  75. {edify-0.2.2 → edify-0.3.0}/src/edify/library/ssn.py +0 -0
  76. {edify-0.2.2 → edify-0.3.0}/src/edify/library/support/zip.py +0 -0
  77. {edify-0.2.2 → edify-0.3.0}/src/edify/library/url.py +0 -0
  78. {edify-0.2.2 → edify-0.3.0}/src/edify/library/uuid.py +0 -0
  79. {edify-0.2.2 → edify-0.3.0}/src/edify/library/zip.py +0 -0
  80. {edify-0.2.2 → edify-0.3.0}/src/edify.egg-info/dependency_links.txt +0 -0
  81. {edify-0.2.2 → edify-0.3.0}/src/edify.egg-info/not-zip-safe +0 -0
  82. {edify-0.2.2 → edify-0.3.0}/src/edify.egg-info/top_level.txt +0 -0
  83. {edify-0.2.2 → edify-0.3.0}/tests/ssn_test.py +0 -0
  84. {edify-0.2.2 → edify-0.3.0}/tests/test_builder.py +0 -0
  85. {edify-0.2.2 → edify-0.3.0}/tests/test_date.py +0 -0
  86. {edify-0.2.2 → edify-0.3.0}/tests/test_email.py +0 -0
  87. {edify-0.2.2 → edify-0.3.0}/tests/test_guid.py +0 -0
  88. {edify-0.2.2 → edify-0.3.0}/tests/test_ip.py +0 -0
  89. {edify-0.2.2 → edify-0.3.0}/tests/test_mac.py +0 -0
  90. {edify-0.2.2 → edify-0.3.0}/tests/test_password.py +0 -0
  91. {edify-0.2.2 → edify-0.3.0}/tests/test_phone.py +0 -0
  92. {edify-0.2.2 → edify-0.3.0}/tests/test_url.py +0 -0
  93. {edify-0.2.2 → edify-0.3.0}/tests/test_uuid.py +0 -0
  94. {edify-0.2.2 → edify-0.3.0}/tests/test_zip.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 0.2.2
2
+ current_version = 0.3.0
3
3
  commit = True
4
4
  tag = True
5
5
 
@@ -19,24 +19,6 @@ jobs:
19
19
  toxpython: 'python3.9'
20
20
  tox_env: 'docs'
21
21
  os: 'ubuntu-latest'
22
- - name: 'py37 (ubuntu)'
23
- python: '3.7'
24
- toxpython: 'python3.7'
25
- python_arch: 'x64'
26
- tox_env: 'py37'
27
- os: 'ubuntu-latest'
28
- - name: 'py37 (windows)'
29
- python: '3.7'
30
- toxpython: 'python3.7'
31
- python_arch: 'x64'
32
- tox_env: 'py37'
33
- os: 'windows-latest'
34
- - name: 'py37 (macos)'
35
- python: '3.7'
36
- toxpython: 'python3.7'
37
- python_arch: 'x64'
38
- tox_env: 'py37'
39
- os: 'macos-latest'
40
22
  - name: 'py38 (ubuntu)'
41
23
  python: '3.8'
42
24
  toxpython: 'python3.8'
@@ -52,7 +34,6 @@ jobs:
52
34
  - name: 'py38 (macos)'
53
35
  python: '3.8'
54
36
  toxpython: 'python3.8'
55
- python_arch: 'x64'
56
37
  tox_env: 'py38'
57
38
  os: 'macos-latest'
58
39
  - name: 'py39 (ubuntu)'
@@ -70,7 +51,6 @@ jobs:
70
51
  - name: 'py39 (macos)'
71
52
  python: '3.9'
72
53
  toxpython: 'python3.9'
73
- python_arch: 'x64'
74
54
  tox_env: 'py39'
75
55
  os: 'macos-latest'
76
56
  - name: 'py310 (ubuntu)'
@@ -88,7 +68,6 @@ jobs:
88
68
  - name: 'py310 (macos)'
89
69
  python: '3.10'
90
70
  toxpython: 'python3.10'
91
- python_arch: 'x64'
92
71
  tox_env: 'py310'
93
72
  os: 'macos-latest'
94
73
  - name: 'py311 (ubuntu)'
@@ -106,50 +85,98 @@ jobs:
106
85
  - name: 'py311 (macos)'
107
86
  python: '3.11'
108
87
  toxpython: 'python3.11'
109
- python_arch: 'x64'
110
88
  tox_env: 'py311'
111
89
  os: 'macos-latest'
112
- - name: 'pypy37 (ubuntu)'
113
- python: 'pypy-3.7'
114
- toxpython: 'pypy3.7'
90
+ - name: 'pypy310 (ubuntu)'
91
+ python: 'pypy-3.10'
92
+ toxpython: 'pypy3.10'
115
93
  python_arch: 'x64'
116
- tox_env: 'pypy37'
94
+ tox_env: 'pypy310'
117
95
  os: 'ubuntu-latest'
118
- - name: 'pypy37 (windows)'
119
- python: 'pypy-3.7'
120
- toxpython: 'pypy3.7'
96
+ - name: 'pypy310 (windows)'
97
+ python: 'pypy-3.10'
98
+ toxpython: 'pypy3.10'
121
99
  python_arch: 'x64'
122
- tox_env: 'pypy37'
100
+ tox_env: 'pypy310'
123
101
  os: 'windows-latest'
124
- - name: 'pypy37 (macos)'
125
- python: 'pypy-3.7'
126
- toxpython: 'pypy3.7'
102
+ - name: 'pypy310 (macos)'
103
+ python: 'pypy-3.10'
104
+ toxpython: 'pypy3.10'
105
+ tox_env: 'pypy310'
106
+ os: 'macos-latest'
107
+ - name: 'pypy311 (ubuntu)'
108
+ python: 'pypy-3.11'
109
+ toxpython: 'pypy3.11'
127
110
  python_arch: 'x64'
128
- tox_env: 'pypy37'
111
+ tox_env: 'pypy311'
112
+ os: 'ubuntu-latest'
113
+ - name: 'pypy311 (windows)'
114
+ python: 'pypy-3.11'
115
+ toxpython: 'pypy3.11'
116
+ python_arch: 'x64'
117
+ tox_env: 'pypy311'
118
+ os: 'windows-latest'
119
+ - name: 'pypy311 (macos)'
120
+ python: 'pypy-3.11'
121
+ toxpython: 'pypy3.11'
122
+ tox_env: 'pypy311'
129
123
  os: 'macos-latest'
130
- - name: 'pypy38 (ubuntu)'
131
- python: 'pypy-3.8'
132
- toxpython: 'pypy3.8'
124
+ - name: 'py312 (ubuntu)'
125
+ python: '3.12'
126
+ toxpython: 'python3.12'
133
127
  python_arch: 'x64'
134
- tox_env: 'pypy38'
128
+ tox_env: 'py312'
135
129
  os: 'ubuntu-latest'
136
- - name: 'pypy38 (windows)'
137
- python: 'pypy-3.8'
138
- toxpython: 'pypy3.8'
130
+ - name: 'py312 (windows)'
131
+ python: '3.12'
132
+ toxpython: 'python3.12'
139
133
  python_arch: 'x64'
140
- tox_env: 'pypy38'
134
+ tox_env: 'py312'
141
135
  os: 'windows-latest'
142
- - name: 'pypy38 (macos)'
143
- python: 'pypy-3.8'
144
- toxpython: 'pypy3.8'
136
+ - name: 'py312 (macos)'
137
+ python: '3.12'
138
+ toxpython: 'python3.12'
139
+ tox_env: 'py312'
140
+ os: 'macos-latest'
141
+ - name: 'py313 (ubuntu)'
142
+ python: '3.13'
143
+ toxpython: 'python3.13'
145
144
  python_arch: 'x64'
146
- tox_env: 'pypy38'
145
+ tox_env: 'py313'
146
+ os: 'ubuntu-latest'
147
+ - name: 'py313 (windows)'
148
+ python: '3.13'
149
+ toxpython: 'python3.13'
150
+ python_arch: 'x64'
151
+ tox_env: 'py313'
152
+ os: 'windows-latest'
153
+ - name: 'py313 (macos)'
154
+ python: '3.13'
155
+ toxpython: 'python3.13'
156
+ tox_env: 'py313'
157
+ os: 'macos-latest'
158
+ - name: 'py314 (ubuntu)'
159
+ python: '3.14'
160
+ toxpython: 'python3.14'
161
+ python_arch: 'x64'
162
+ tox_env: 'py314'
163
+ os: 'ubuntu-latest'
164
+ - name: 'py314 (windows)'
165
+ python: '3.14'
166
+ toxpython: 'python3.14'
167
+ python_arch: 'x64'
168
+ tox_env: 'py314'
169
+ os: 'windows-latest'
170
+ - name: 'py314 (macos)'
171
+ python: '3.14'
172
+ toxpython: 'python3.14'
173
+ tox_env: 'py314'
147
174
  os: 'macos-latest'
148
175
  steps:
149
- - uses: actions/checkout@v3
176
+ - uses: actions/checkout@v5
150
177
  with:
151
178
  fetch-depth: 0
152
- - uses: actions/setup-python@v3
179
+ - uses: actions/setup-python@v5
153
180
  with:
154
181
  python-version: ${{ matrix.python }}
155
182
  architecture: ${{ matrix.python_arch }}
@@ -2,23 +2,23 @@
2
2
  # pre-commit install
3
3
  # To update the pre-commit hooks run:
4
4
  # pre-commit install-hooks
5
- exclude: '^(\.tox|ci/templates|\.bumpversion\.cfg)(/|$)'
5
+ exclude: '^(\.tox|\.bumpversion\.cfg)(/|$)'
6
6
  repos:
7
7
  - repo: https://github.com/pre-commit/pre-commit-hooks
8
- rev: main
8
+ rev: v6.0.0
9
9
  hooks:
10
10
  - id: trailing-whitespace
11
11
  - id: end-of-file-fixer
12
12
  - id: debug-statements
13
- - repo: https://github.com/timothycrosley/isort
14
- rev: main
13
+ - repo: https://github.com/PyCQA/isort
14
+ rev: 8.0.1
15
15
  hooks:
16
16
  - id: isort
17
- - repo: https://github.com/psf/black
18
- rev: main
17
+ - repo: https://github.com/psf/black-pre-commit-mirror
18
+ rev: 26.3.1
19
19
  hooks:
20
20
  - id: black
21
- - repo: https://gitlab.com/pycqa/flake8
22
- rev: master
21
+ - repo: https://github.com/PyCQA/flake8
22
+ rev: 7.3.0
23
23
  hooks:
24
24
  - id: flake8
@@ -1,8 +1,11 @@
1
1
  # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
2
2
  version: 2
3
+ build:
4
+ os: ubuntu-22.04
5
+ tools:
6
+ python: "3.14"
3
7
  sphinx:
4
8
  configuration: docs/conf.py
5
- formats: all
6
9
  python:
7
10
  install:
8
11
  - requirements: docs/requirements.txt
@@ -0,0 +1,6 @@
1
+
2
+ Authors
3
+ =======
4
+
5
+ * Bobby - https://shi.foo
6
+ * natsuoto / 夏音 - https://github.com/natsuoto
@@ -0,0 +1,85 @@
1
+
2
+ Changelog
3
+ =========
4
+ 0.3.0 (2026-04-29)
5
+ ------------------
6
+
7
+ A maintenance release: Edify is dragged out of 2022 and back into modern shape. No new patterns or builder API. The minimum supported Python rises to 3.8.
8
+
9
+ Breaking
10
+ ~~~~~~~~
11
+
12
+ * Dropped support for Python 3.7. Edify now requires Python 3.8 or newer (:pr:`32`).
13
+
14
+ Added
15
+ ~~~~~
16
+
17
+ * Support for Python 3.12, 3.13, and 3.14, with the matrix and Read the Docs build configuration updated to match (:pr:`31`).
18
+
19
+ Tooling and CI
20
+ ~~~~~~~~~~~~~~
21
+
22
+ * Bumped GitHub Actions to current major versions: ``actions/checkout@v5``, ``actions/setup-python@v5``, ``github/codeql-action@v3``. All workflow jobs now run on the Node 20 runtime instead of the deprecated Node 16. ``pypa/gh-action-pypi-publish`` SHA refreshed to ``v1.14.0`` (:pr:`35`).
23
+ * PyPy CI matrix moved off the EOL ``pypy-3.8`` line to the maintained ``pypy-3.10`` and ``pypy-3.11`` (:pr:`37`).
24
+ * ``.pre-commit-config.yaml`` modernised: every hook pinned to an immutable tag instead of a floating branch ref, dead repo URLs corrected (``gitlab.com/pycqa/flake8`` → ``github.com/PyCQA/flake8``, ``timothycrosley/isort`` → ``PyCQA/isort``), and ``psf/black`` swapped for the upstream-recommended ``psf/black-pre-commit-mirror`` (:pr:`33`).
25
+
26
+ Dependencies
27
+ ~~~~~~~~~~~~
28
+
29
+ * Bumped minimum versions: ``setuptools >=75.0``, ``pip >=26.0.1``, ``virtualenv >=21.3.0``, ``six >=1.17.0``, ``sphinx >=7.4.7`` (:pr:`25`, :pr:`26`, :pr:`27`, :pr:`28`, :pr:`29`).
30
+
31
+ Repository infrastructure
32
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
33
+
34
+ * Added ``.github/CODEOWNERS`` and ``natsuoto`` to ``AUTHORS.rst`` for the new agent-driven contribution flow (:pr:`39`).
35
+ * Locked ``main``: 1 approving code-owner review required, 31 status-check contexts required (the full matrix), linear history enforced, no force pushes or deletions, applies to administrators.
36
+ * Repo-level ``allow_auto_merge`` enabled — PRs auto-merge once review and CI gates pass.
37
+
38
+ Housekeeping
39
+ ~~~~~~~~~~~~
40
+
41
+ * Dropped a dead ``py37``/``pypy37`` exclusion from the cookiecutter Jinja template and refreshed the docs copyright year (:pr:`43`).
42
+ * Updated author website URL in ``AUTHORS.rst`` and ``.cookiecutterrc`` (:pr:`41`).
43
+ * Removed all cookiecutter regeneration scaffolding — ``.cookiecutterrc``, ``ci/bootstrap.py``, and ``ci/templates/`` (containing dead AppVeyor config and a workflow template that lagged the live one) — along with the ``[testenv:bootstrap]`` env, related ``MANIFEST.in`` / ``setup.cfg`` / ``.pre-commit-config.yaml`` exclusions, and the dead Python 3.7 branch in ``tests.local.sh``. The local-test script's per-version ``if/elif`` chain is now a single programmatic ``tox -e py$VERSION`` lookup, which adapts automatically when Python versions are added or removed from the matrix (:pr:`47`).
44
+
45
+ 0.2.2 (2022-12-22)
46
+ ------------------
47
+ * Added Support for Python 3.11
48
+ * Added more RegexBuilder Examples
49
+ * Fixed Documentation Typos
50
+
51
+ 0.2.1 (2022-11-27)
52
+ ------------------
53
+
54
+ * This is a Quick Fix Release to fix the incomplete release of 0.2.0. The release was intended to drop support for 3.6, but the metadata was not updated to reflect this. This release fixes that. v0.2.0 remains available on PyPI, but is incompatible with Python 3.6. Using it with other versions of Python is not a problem. Other than the metadata, the two releases are identical.
55
+
56
+ 0.2.0 (2022-11-27)
57
+ ------------------
58
+ This is a minor release with a few new built-in validators along with some small changes and bug fixes.
59
+
60
+ Validators added:
61
+ ~~~~~~~~~~~~~~~~~
62
+ * URL Validator
63
+ * UUID Validator
64
+ * GUID Validator
65
+ * SSN Validator
66
+ * Mac Address (IEEE 802) Validator
67
+ * Zip Code Validator
68
+ * Password Validator
69
+
70
+ Documentation:
71
+ ~~~~~~~~~~~~~~
72
+
73
+ * Added documentation for new validators
74
+ * Add warning for trade-offs in email regex validation
75
+
76
+ Bug Fixes:
77
+ ~~~~~~~~~~
78
+
79
+ * Fixed Phone pattern failing for service numbers and 4 digit numbers (See `#16 <https://github.com/luciferreeves/edify/issues/16>`_ for more information)
80
+
81
+
82
+ 0.1.0 (2022-09-10)
83
+ ------------------
84
+
85
+ * First release on PyPI.
@@ -4,7 +4,6 @@ graft ci
4
4
  graft tests
5
5
 
6
6
  include .bumpversion.cfg
7
- include .cookiecutterrc
8
7
  include .coveragerc
9
8
  include .editorconfig
10
9
  include .github/workflows/github-actions.yml
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: edify
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: Regular Expressions Made Simple
5
5
  Home-page: https://github.com/luciferreeves/edify
6
6
  Author: Bobby
@@ -18,17 +18,29 @@ Classifier: Operating System :: Microsoft :: Windows
18
18
  Classifier: Programming Language :: Python
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Programming Language :: Python :: 3.7
22
21
  Classifier: Programming Language :: Python :: 3.8
23
22
  Classifier: Programming Language :: Python :: 3.9
24
23
  Classifier: Programming Language :: Python :: 3.10
25
24
  Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Programming Language :: Python :: 3.14
26
28
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
29
  Classifier: Programming Language :: Python :: Implementation :: PyPy
28
30
  Classifier: Topic :: Utilities
29
- Requires-Python: >=3.7
31
+ Requires-Python: >=3.8
30
32
  License-File: LICENSE
31
33
  License-File: AUTHORS.rst
34
+ Dynamic: author
35
+ Dynamic: author-email
36
+ Dynamic: classifier
37
+ Dynamic: description
38
+ Dynamic: home-page
39
+ Dynamic: license
40
+ Dynamic: license-file
41
+ Dynamic: project-url
42
+ Dynamic: requires-python
43
+ Dynamic: summary
32
44
 
33
45
  ========
34
46
  Edify
@@ -68,9 +80,9 @@ Edify
68
80
  :alt: Supported implementations
69
81
  :target: https://pypi.org/project/edify
70
82
 
71
- .. image:: https://img.shields.io/github/commits-since/luciferreeves/edify/v0.2.2.svg
83
+ .. image:: https://img.shields.io/github/commits-since/luciferreeves/edify/v0.3.0.svg
72
84
  :alt: Commits since latest release
73
- :target: https://github.com/luciferreeves/edify/compare/v0.2.2...main
85
+ :target: https://github.com/luciferreeves/edify/compare/v0.3.0...main
74
86
 
75
87
 
76
88
 
@@ -85,7 +97,7 @@ It also allows you to verify a string quickly by providing commonly used regex p
85
97
  Quick Start
86
98
  =============
87
99
 
88
- To get started make sure you have python 3.7 or later installed and then, install Edify from ``pip``:
100
+ To get started make sure you have Python 3.8-3.14 installed and then, install Edify from ``pip``:
89
101
 
90
102
  .. code-block:: bash
91
103
 
@@ -303,6 +315,47 @@ Contributors
303
315
 
304
316
  Changelog
305
317
  =========
318
+ 0.3.0 (2026-04-29)
319
+ ------------------
320
+
321
+ A maintenance release: Edify is dragged out of 2022 and back into modern shape. No new patterns or builder API. The minimum supported Python rises to 3.8.
322
+
323
+ Breaking
324
+ ~~~~~~~~
325
+
326
+ * Dropped support for Python 3.7. Edify now requires Python 3.8 or newer (``32``).
327
+
328
+ Added
329
+ ~~~~~
330
+
331
+ * Support for Python 3.12, 3.13, and 3.14, with the matrix and Read the Docs build configuration updated to match (``31``).
332
+
333
+ Tooling and CI
334
+ ~~~~~~~~~~~~~~
335
+
336
+ * Bumped GitHub Actions to current major versions: ``actions/checkout@v5``, ``actions/setup-python@v5``, ``github/codeql-action@v3``. All workflow jobs now run on the Node 20 runtime instead of the deprecated Node 16. ``pypa/gh-action-pypi-publish`` SHA refreshed to ``v1.14.0`` (``35``).
337
+ * PyPy CI matrix moved off the EOL ``pypy-3.8`` line to the maintained ``pypy-3.10`` and ``pypy-3.11`` (``37``).
338
+ * ``.pre-commit-config.yaml`` modernised: every hook pinned to an immutable tag instead of a floating branch ref, dead repo URLs corrected (``gitlab.com/pycqa/flake8`` → ``github.com/PyCQA/flake8``, ``timothycrosley/isort`` → ``PyCQA/isort``), and ``psf/black`` swapped for the upstream-recommended ``psf/black-pre-commit-mirror`` (``33``).
339
+
340
+ Dependencies
341
+ ~~~~~~~~~~~~
342
+
343
+ * Bumped minimum versions: ``setuptools >=75.0``, ``pip >=26.0.1``, ``virtualenv >=21.3.0``, ``six >=1.17.0``, ``sphinx >=7.4.7`` (``25``, ``26``, ``27``, ``28``, ``29``).
344
+
345
+ Repository infrastructure
346
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
347
+
348
+ * Added ``.github/CODEOWNERS`` and ``natsuoto`` to ``AUTHORS.rst`` for the new agent-driven contribution flow (``39``).
349
+ * Locked ``main``: 1 approving code-owner review required, 31 status-check contexts required (the full matrix), linear history enforced, no force pushes or deletions, applies to administrators.
350
+ * Repo-level ``allow_auto_merge`` enabled — PRs auto-merge once review and CI gates pass.
351
+
352
+ Housekeeping
353
+ ~~~~~~~~~~~~
354
+
355
+ * Dropped a dead ``py37``/``pypy37`` exclusion from the cookiecutter Jinja template and refreshed the docs copyright year (``43``).
356
+ * Updated author website URL in ``AUTHORS.rst`` and ``.cookiecutterrc`` (``41``).
357
+ * Removed all cookiecutter regeneration scaffolding — ``.cookiecutterrc``, ``ci/bootstrap.py``, and ``ci/templates/`` (containing dead AppVeyor config and a workflow template that lagged the live one) — along with the ``[testenv:bootstrap]`` env, related ``MANIFEST.in`` / ``setup.cfg`` / ``.pre-commit-config.yaml`` exclusions, and the dead Python 3.7 branch in ``tests.local.sh``. The local-test script's per-version ``if/elif`` chain is now a single programmatic ``tox -e py$VERSION`` lookup, which adapts automatically when Python versions are added or removed from the matrix (``47``).
358
+
306
359
  0.2.2 (2022-12-22)
307
360
  ------------------
308
361
  * Added Support for Python 3.11
@@ -36,9 +36,9 @@ Edify
36
36
  :alt: Supported implementations
37
37
  :target: https://pypi.org/project/edify
38
38
 
39
- .. image:: https://img.shields.io/github/commits-since/luciferreeves/edify/v0.2.2.svg
39
+ .. image:: https://img.shields.io/github/commits-since/luciferreeves/edify/v0.3.0.svg
40
40
  :alt: Commits since latest release
41
- :target: https://github.com/luciferreeves/edify/compare/v0.2.2...main
41
+ :target: https://github.com/luciferreeves/edify/compare/v0.3.0...main
42
42
 
43
43
 
44
44
 
@@ -53,7 +53,7 @@ It also allows you to verify a string quickly by providing commonly used regex p
53
53
  Quick Start
54
54
  =============
55
55
 
56
- To get started make sure you have python 3.7 or later installed and then, install Edify from ``pip``:
56
+ To get started make sure you have Python 3.8-3.14 installed and then, install Edify from ``pip``:
57
57
 
58
58
  .. code-block:: bash
59
59
 
@@ -0,0 +1,5 @@
1
+ virtualenv>=21.3.0
2
+ pip>=25.0
3
+ setuptools>=75.0
4
+ six>=1.17.0
5
+ tox
@@ -17,17 +17,24 @@ extensions = [
17
17
  source_suffix = '.rst'
18
18
  master_doc = 'index'
19
19
  project = 'Edify'
20
- year = '2022'
20
+ year = '2022-2026'
21
21
  author = 'Bobby'
22
22
  copyright = '{0}, {1}'.format(year, author)
23
- version = release = '0.2.2'
23
+ version = release = '0.3.0'
24
24
 
25
25
  pygments_style = 'trac'
26
26
  templates_path = ['.']
27
27
  extlinks = {
28
- 'issue': ('https://github.com/luciferreeves/edify/issues/%s', '#'),
29
- 'pr': ('https://github.com/luciferreeves/edify/pull/%s', 'PR #'),
28
+ 'issue': ('https://github.com/luciferreeves/edify/issues/%s', '#%s'),
29
+ 'pr': ('https://github.com/luciferreeves/edify/pull/%s', 'PR #%s'),
30
30
  }
31
+ # The "commits since latest release" shield in README.rst targets a
32
+ # `compare/vX.Y.Z...main` URL, which 404s during the window between
33
+ # bumping the version and tagging the release. Skip it in linkcheck
34
+ # rather than letting docs CI fail every time we bump.
35
+ linkcheck_ignore = [
36
+ r'https://github\.com/luciferreeves/edify/compare/v\d+\.\d+\.\d+\.\.\.main',
37
+ ]
31
38
  # on_rtd is whether we are on readthedocs.org
32
39
  on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
33
40
 
@@ -1,2 +1,2 @@
1
- sphinx>=1.3
1
+ sphinx>=7.4.7
2
2
  sphinx-rtd-theme
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
2
  requires = [
3
- "setuptools>=30.3.0",
3
+ "setuptools>=75.0",
4
4
  "wheel",
5
5
  ]
6
6
 
7
7
  [tool.black]
8
8
  line-length = 140
9
- target-version = ['py37']
9
+ target-version = ['py38']
10
10
  skip-string-normalization = true
@@ -1,6 +1,6 @@
1
1
  [flake8]
2
2
  max-line-length = 140
3
- exclude = .tox,.eggs,ci/templates,build,dist
3
+ exclude = .tox,.eggs,build,dist
4
4
 
5
5
  [tool:isort]
6
6
  force_single_line = True
@@ -8,7 +8,7 @@ line_length = 120
8
8
  known_first_party = edify
9
9
  default_section = THIRDPARTY
10
10
  forced_separate = test_edify
11
- skip = .tox,.eggs,ci/templates,build,dist
11
+ skip = .tox,.eggs,build,dist
12
12
 
13
13
  [egg_info]
14
14
  tag_build =
@@ -20,7 +20,7 @@ def read(*names, **kwargs):
20
20
 
21
21
  setup(
22
22
  name='edify',
23
- version='0.2.2',
23
+ version='0.3.0',
24
24
  license='Apache-2.0',
25
25
  description='Regular Expressions Made Simple',
26
26
  long_description='{}\n{}'.format(
@@ -46,11 +46,13 @@ setup(
46
46
  'Programming Language :: Python',
47
47
  'Programming Language :: Python :: 3',
48
48
  'Programming Language :: Python :: 3 :: Only',
49
- 'Programming Language :: Python :: 3.7',
50
49
  'Programming Language :: Python :: 3.8',
51
50
  'Programming Language :: Python :: 3.9',
52
51
  'Programming Language :: Python :: 3.10',
53
52
  'Programming Language :: Python :: 3.11',
53
+ 'Programming Language :: Python :: 3.12',
54
+ 'Programming Language :: Python :: 3.13',
55
+ 'Programming Language :: Python :: 3.14',
54
56
  'Programming Language :: Python :: Implementation :: CPython',
55
57
  'Programming Language :: Python :: Implementation :: PyPy',
56
58
  # uncomment if you test on these interpreters:
@@ -67,7 +69,7 @@ setup(
67
69
  keywords=[
68
70
  # eg: 'keyword1', 'keyword2', 'keyword3',
69
71
  ],
70
- python_requires='>=3.7',
72
+ python_requires='>=3.8',
71
73
  install_requires=[
72
74
  # eg: 'aspectlib==1.1.1', 'six>=1.7',
73
75
  ],
@@ -1,4 +1,4 @@
1
1
  # flake8: noqa
2
2
 
3
- __version__ = '0.2.2'
3
+ __version__ = '0.3.0'
4
4
  from .builder.builder import RegexBuilder
@@ -47,9 +47,9 @@ def apply_subexpression_defaults(expr):
47
47
  out['namespace'] = "" if 'namespace' not in out else out['namespace']
48
48
  out['ignore_flags'] = True if 'ignore_flags' not in out else out['ignore_flags']
49
49
  out['ignore_start_and_end'] = True if 'ignore_start_and_end' not in out else out['ignore_start_and_end']
50
- assertion(type(out['namespace']) == str, 'namespace must be a string')
51
- assertion(type(out['ignore_flags']) == bool, 'ignore_flags must be a boolean')
52
- assertion(type(out['ignore_start_and_end']) == bool, 'ignore_start_and_end must be a boolean')
50
+ assertion(isinstance(out['namespace'], str), 'namespace must be a string')
51
+ assertion(isinstance(out['ignore_flags'], bool), 'ignore_flags must be a boolean')
52
+ assertion(isinstance(out['ignore_start_and_end'], bool), 'ignore_start_and_end must be a boolean')
53
53
  return out
54
54
 
55
55