enum-properties 2.8.0__tar.gz → 2.8.1__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 (95) hide show
  1. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/workflows/lint.yml +11 -5
  2. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/workflows/release.yml +13 -13
  3. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/workflows/scorecard.yml +11 -6
  4. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/workflows/test.yml +29 -26
  5. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/workflows/zizmor.yml +8 -4
  6. enum_properties-2.8.1/.github/zizmor.yml +3 -0
  7. {enum_properties-2.8.0 → enum_properties-2.8.1}/.gitignore +2 -0
  8. {enum_properties-2.8.0 → enum_properties-2.8.1}/PKG-INFO +3 -2
  9. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/changelog.rst +5 -0
  10. {enum_properties-2.8.0 → enum_properties-2.8.1}/justfile +6 -1
  11. {enum_properties-2.8.0 → enum_properties-2.8.1}/pyproject.toml +2 -1
  12. {enum_properties-2.8.0 → enum_properties-2.8.1}/src/enum_properties/__init__.py +1 -1
  13. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_flags.py +90 -0
  14. {enum_properties-2.8.0 → enum_properties-2.8.1}/.codecov.yml +0 -0
  15. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/CODEOWNERS +0 -0
  16. {enum_properties-2.8.0 → enum_properties-2.8.1}/.github/dependabot.yml +0 -0
  17. {enum_properties-2.8.0 → enum_properties-2.8.1}/.pre-commit-config.yaml +0 -0
  18. {enum_properties-2.8.0 → enum_properties-2.8.1}/CODE_OF_CONDUCT.md +0 -0
  19. {enum_properties-2.8.0 → enum_properties-2.8.1}/CONTRIBUTING.md +0 -0
  20. {enum_properties-2.8.0 → enum_properties-2.8.1}/LICENSE +0 -0
  21. {enum_properties-2.8.0 → enum_properties-2.8.1}/README.md +0 -0
  22. {enum_properties-2.8.0 → enum_properties-2.8.1}/SECURITY.md +0 -0
  23. {enum_properties-2.8.0 → enum_properties-2.8.1}/conftest.py +0 -0
  24. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/.readthedocs.yaml +0 -0
  25. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/_static/style.css +0 -0
  26. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/conf.py +0 -0
  27. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/howto.rst +0 -0
  28. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/index.rst +0 -0
  29. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/reference.rst +0 -0
  30. {enum_properties-2.8.0 → enum_properties-2.8.1}/doc/source/tutorial.rst +0 -0
  31. {enum_properties-2.8.0 → enum_properties-2.8.1}/src/enum_properties/__init__.pyi +0 -0
  32. {enum_properties-2.8.0 → enum_properties-2.8.1}/src/enum_properties/py.typed +0 -0
  33. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/__init__.py +0 -0
  34. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test.py +0 -0
  35. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_aliases.py +0 -0
  36. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_future_annotations.py +0 -0
  37. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_interface_eq.py +0 -0
  38. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_nestedclass.py +0 -0
  39. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_none_coercion.py +0 -0
  40. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_perf.py +0 -0
  41. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_pickle.py +0 -0
  42. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_specialize.py +0 -0
  43. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_symmetric.py +0 -0
  44. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/annotations/test_type_hints.py +0 -0
  45. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/big_enum.py +0 -0
  46. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/big_enum_annotations.py +0 -0
  47. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/__init__.py +0 -0
  48. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/address.py +0 -0
  49. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/color_example.py +0 -0
  50. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/hash_equiv_def.py +0 -0
  51. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_add_props.py +0 -0
  52. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_dataclass.py +0 -0
  53. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_dataclass_integration.py +0 -0
  54. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_flag.py +0 -0
  55. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_flag_boundaries.py +0 -0
  56. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_flags_no_iterable.py +0 -0
  57. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_functional.py +0 -0
  58. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_hash_equiv.py +0 -0
  59. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_hash_equiv_def.py +0 -0
  60. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_legacy.py +0 -0
  61. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_members_and_aliases.py +0 -0
  62. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_metaclass.py +0 -0
  63. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_nested_classes.py +0 -0
  64. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_nested_classes_313.py +0 -0
  65. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_specialized.py +0 -0
  66. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_specialized_default.py +0 -0
  67. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_specialized_list.py +0 -0
  68. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_specialized_missing.py +0 -0
  69. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_symmetric_builtins.py +0 -0
  70. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_symmetric_decorator.py +0 -0
  71. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_symmetric_metaclass.py +0 -0
  72. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_symmetric_overload.py +0 -0
  73. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_symmetry.py +0 -0
  74. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/howto_verify_unique.py +0 -0
  75. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/mapbox.py +0 -0
  76. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/specialization_example.py +0 -0
  77. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/symmetric_example.py +0 -0
  78. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/examples/test_examples.py +0 -0
  79. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/__init__.py +0 -0
  80. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test.py +0 -0
  81. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_flags.py +0 -0
  82. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_interface_eq.py +0 -0
  83. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_multi_primitives.py +0 -0
  84. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_nestedclass.py +0 -0
  85. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_none_coercion.py +0 -0
  86. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_perf.py +0 -0
  87. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_pickle.py +0 -0
  88. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_specialize.py +0 -0
  89. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/legacy/test_type_hints.py +0 -0
  90. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/pickle_enums.py +0 -0
  91. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/pickle_enums_annotations.py +0 -0
  92. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/test_functional.py +0 -0
  93. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/type_hints/__init__.py +0 -0
  94. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/type_hints/pyright.json +0 -0
  95. {enum_properties-2.8.0 → enum_properties-2.8.1}/tests/type_hints/test.py +0 -0
@@ -2,7 +2,11 @@ name: Lint
2
2
 
3
3
  permissions:
4
4
  contents: read
5
-
5
+
6
+ concurrency:
7
+ group: lint-${{ github.event.pull_request.number || github.ref }}
8
+ cancel-in-progress: true
9
+
6
10
  on:
7
11
  push:
8
12
  branches:
@@ -24,23 +28,25 @@ jobs:
24
28
  strategy:
25
29
  matrix:
26
30
  # run static analysis on bleeding and trailing edges
27
- python-version: [ '3.10', '3.14' ]
31
+ python-version: [ '3.10', '3.15' ]
28
32
  steps:
29
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
33
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
30
34
  with:
31
35
  persist-credentials: false
32
36
  - name: Set up Python ${{ matrix.python-version }}
33
37
  id: sp
34
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
38
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
35
39
  with:
36
40
  python-version: ${{ matrix.python-version }}
37
41
  allow-prereleases: true
38
42
  - name: Install uv
39
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
43
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
40
44
  with:
41
45
  enable-cache: true
42
46
  - name: Install Just
43
47
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
48
+ with:
49
+ just-version: 1.58.0
44
50
  - name: Install Dependencies
45
51
  env:
46
52
  PYTHON_PATH: ${{ steps.sp.outputs.python-path }}
@@ -1,7 +1,8 @@
1
1
 
2
2
  name: Publish Release
3
3
 
4
- permissions: read-all
4
+ permissions:
5
+ contents: read
5
6
 
6
7
  concurrency:
7
8
  # stop previous release runs if tag is recreated
@@ -18,41 +19,40 @@ jobs:
18
19
  lint:
19
20
  permissions:
20
21
  contents: read
21
- actions: write
22
- uses: ./.github/workflows/lint.yml
22
+ uses: $/.github/workflows/lint.yml
23
23
 
24
24
  test:
25
25
  permissions:
26
26
  contents: read
27
- actions: write
28
- id-token: write
29
- uses: ./.github/workflows/test.yml
27
+ id-token: write # to allow codecov oidc upload
28
+ uses: $/.github/workflows/test.yml
30
29
 
31
30
  build:
32
31
  name: Build Package
33
32
  runs-on: ubuntu-latest
34
33
  permissions:
35
34
  contents: read
36
- actions: write
37
35
  outputs:
38
36
  PACKAGE_NAME: ${{ steps.set-package.outputs.package_name }}
39
37
  RELEASE_VERSION: ${{ steps.set-package.outputs.release_version }}
40
38
  steps:
41
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
39
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
42
40
  with:
43
- persist-credentials: true
41
+ persist-credentials: false
44
42
  - name: Set up Python
45
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
43
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
46
44
  with:
47
45
  python-version: ">=3.11" # for tomlib
48
46
  - name: Install uv
49
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
47
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
50
48
  with:
51
49
  enable-cache: false
52
50
  restore-cache: false
53
51
  save-cache: false
54
52
  - name: Setup Just
55
53
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
54
+ with:
55
+ just-version: 1.58.0
56
56
  - name: Verify Tag
57
57
  run: |
58
58
  TAG_NAME=${GITHUB_REF#refs/tags/}
@@ -102,7 +102,7 @@ jobs:
102
102
  name: python-package-distributions
103
103
  path: dist/
104
104
  - name: Publish distribution 📦 to PyPI
105
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b
105
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33
106
106
 
107
107
  github-release:
108
108
  name: Publish GitHub Release
@@ -122,7 +122,7 @@ jobs:
122
122
  name: python-package-distributions
123
123
  path: dist/
124
124
  - name: Sign the dists with Sigstore
125
- uses: sigstore/gh-action-sigstore-python@5b79a39c381910c090341a2c9b0bf022c8b387e1
125
+ uses: sigstore/gh-action-sigstore-python@790bc6befb9d733738f18d8f895854b453640ec9
126
126
  with:
127
127
  inputs: >-
128
128
  ./dist/*.tar.gz
@@ -9,7 +9,12 @@ on:
9
9
  branches: [ main ]
10
10
  workflow_dispatch:
11
11
 
12
- permissions: read-all
12
+ concurrency:
13
+ group: scorecard-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ permissions:
17
+ contents: read
13
18
 
14
19
  jobs:
15
20
  analysis:
@@ -20,17 +25,17 @@ jobs:
20
25
  deployment: false # Prevents creating a GitHub deployment object
21
26
 
22
27
  permissions:
23
- security-events: write
24
- id-token: write
28
+ security-events: write # allow uploading code scanning results
29
+ id-token: write # to allow OIDC authentication for publishing results to OpenSSF REST API
25
30
 
26
31
  steps:
27
32
  - name: "Checkout code"
28
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
33
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
29
34
  with:
30
35
  persist-credentials: false
31
36
 
32
37
  - name: "Run analysis"
33
- uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a
38
+ uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc
34
39
  with:
35
40
  results_file: results.sarif
36
41
  results_format: sarif
@@ -61,6 +66,6 @@ jobs:
61
66
  # Upload the results to GitHub's code scanning dashboard (optional).
62
67
  # Commenting out will disable upload of results to your repo's Code Scanning dashboard
63
68
  - name: "Upload to code-scanning"
64
- uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e
69
+ uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938
65
70
  with:
66
71
  sarif_file: results.sarif
@@ -2,7 +2,11 @@ name: Test
2
2
 
3
3
  permissions:
4
4
  contents: read
5
-
5
+
6
+ concurrency:
7
+ group: test-${{ github.event.pull_request.number || github.ref }}
8
+ cancel-in-progress: true
9
+
6
10
  on:
7
11
  push:
8
12
  branches:
@@ -25,12 +29,9 @@ on:
25
29
  jobs:
26
30
  linux:
27
31
  runs-on: ubuntu-latest
28
- permissions:
29
- contents: read
30
- actions: write
31
32
  strategy:
32
33
  matrix:
33
- python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
34
+ python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
34
35
  env:
35
36
  COVERAGE_FILE: linux-py${{ matrix.python-version }}.coverage
36
37
 
@@ -39,19 +40,21 @@ jobs:
39
40
  if: ${{ github.event.inputs.clear_cache == 'true' }}
40
41
  run: sudo rm -rf /opt/hostedtoolcache
41
42
 
42
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
43
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
43
44
  with:
44
45
  persist-credentials: false
45
46
  - name: Set up Python ${{ matrix.python-version }}
46
47
  id: sp
47
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
48
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
48
49
  with:
49
50
  python-version: ${{ matrix.python-version }}
50
51
  allow-prereleases: true
51
52
  - name: Install Just
52
53
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
54
+ with:
55
+ just-version: 1.58.0
53
56
  - name: Install uv
54
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
57
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
55
58
  with:
56
59
  enable-cache: true
57
60
  - name: Install Emacs
@@ -80,12 +83,9 @@ jobs:
80
83
 
81
84
  macos:
82
85
  runs-on: macos-latest
83
- permissions:
84
- contents: read
85
- actions: write
86
86
  strategy:
87
87
  matrix:
88
- python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
88
+ python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
89
89
  env:
90
90
  COVERAGE_FILE: macos-py${{ matrix.python-version }}.coverage
91
91
 
@@ -94,19 +94,21 @@ jobs:
94
94
  if: ${{ github.event.inputs.clear_cache == 'true' }}
95
95
  run: sudo rm -rf /Users/runner/hostedtoolcache
96
96
 
97
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
97
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
98
98
  with:
99
99
  persist-credentials: false
100
100
  - name: Set up Python ${{ matrix.python-version }}
101
101
  id: sp
102
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
102
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
103
103
  with:
104
104
  python-version: ${{ matrix.python-version }}
105
105
  allow-prereleases: true
106
106
  - name: Install Just
107
107
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
108
+ with:
109
+ just-version: 1.58.0
108
110
  - name: Install uv
109
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
111
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
110
112
  with:
111
113
  enable-cache: true
112
114
  - name: install-emacs-macos
@@ -135,12 +137,9 @@ jobs:
135
137
 
136
138
  windows:
137
139
  runs-on: windows-latest
138
- permissions:
139
- contents: read
140
- actions: write
141
140
  strategy:
142
141
  matrix:
143
- python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
142
+ python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
144
143
  env:
145
144
  COVERAGE_FILE: windows-py${{ matrix.python-version }}.coverage
146
145
 
@@ -148,19 +147,21 @@ jobs:
148
147
  - name: Clear GitHub Actions cache
149
148
  if: ${{ github.event.inputs.clear_cache == 'true' }}
150
149
  run: Remove-Item -Recurse -Force C:\hostedtoolcache
151
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
150
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
152
151
  with:
153
152
  persist-credentials: false
154
153
  - name: Set up Python ${{ matrix.python-version }}
155
154
  id: sp
156
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
155
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
157
156
  with:
158
157
  python-version: ${{ matrix.python-version }}
159
158
  allow-prereleases: true
160
159
  - name: Install Just
161
160
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
161
+ with:
162
+ just-version: 1.58.0
162
163
  - name: Install uv
163
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
164
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
164
165
  with:
165
166
  enable-cache: true
166
167
  - name: install-vim-windows
@@ -191,23 +192,25 @@ jobs:
191
192
  runs-on: ubuntu-latest
192
193
  permissions:
193
194
  contents: read
194
- id-token: write
195
+ id-token: write # for oidc authentication to codecov
195
196
 
196
197
  steps:
197
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
198
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
198
199
  with:
199
200
  persist-credentials: false
200
- - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
201
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
201
202
  id: sp
202
203
  with:
203
204
  python-version: '3.14'
204
205
 
205
206
  - name: Install uv
206
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
207
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d
207
208
  with:
208
209
  enable-cache: true
209
210
  - name: Setup Just
210
211
  uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
212
+ with:
213
+ just-version: 1.58.0
211
214
  - name: Install Release Dependencies
212
215
  env:
213
216
  PYTHON_PATH: ${{ steps.sp.outputs.python-path }}
@@ -12,17 +12,21 @@ on:
12
12
  permissions:
13
13
  contents: read
14
14
 
15
+ concurrency:
16
+ group: zizmor-${{ github.event.pull_request.number || github.ref }}
17
+ cancel-in-progress: true
18
+
15
19
  jobs:
16
20
  zizmor-analysis:
17
21
  name: Run Zizmor
18
22
  runs-on: ubuntu-latest
19
23
  permissions:
20
24
  contents: read
21
- security-events: write
25
+ security-events: write # for post to GH security
22
26
 
23
27
  steps:
24
28
  - name: Checkout repository
25
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
29
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
26
30
  with:
27
31
  persist-credentials: false
28
32
 
@@ -38,7 +42,7 @@ jobs:
38
42
 
39
43
  - name: Run Zizmor analysis
40
44
  run: |
41
- zizmor --format sarif .github/workflows/ > results.sarif
45
+ zizmor --persona auditor --format sarif .github/workflows/ > results.sarif
42
46
 
43
47
  - name: Upload analysis results
44
48
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
@@ -48,7 +52,7 @@ jobs:
48
52
  retention-days: 7
49
53
 
50
54
  - name: Upload to code-scanning
51
- uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e
55
+ uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938
52
56
  with:
53
57
  sarif_file: results.sarif
54
58
 
@@ -0,0 +1,3 @@
1
+ rules:
2
+ anonymous-definition:
3
+ disable: true
@@ -135,3 +135,5 @@ dmypy.json
135
135
  .ruff_cache
136
136
  CLAUDE.md
137
137
  uv.lock
138
+
139
+ zizmor.sarif
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: enum-properties
3
- Version: 2.8.0
3
+ Version: 2.8.1
4
4
  Summary: Add properties and method specializations to Python enumeration values with a simple declarative syntax.
5
5
  Project-URL: Homepage, https://github.com/bckohan/enum-properties
6
6
  Project-URL: Documentation, https://enum-properties.readthedocs.io
@@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.11
24
24
  Classifier: Programming Language :: Python :: 3.12
25
25
  Classifier: Programming Language :: Python :: 3.13
26
26
  Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: 3.15
27
28
  Classifier: Topic :: Software Development :: Libraries
28
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
30
  Classifier: Typing :: Typed
@@ -2,6 +2,11 @@
2
2
  Change Log
3
3
  ==========
4
4
 
5
+ v2.8.1 (2026-09-02)
6
+ ===================
7
+
8
+ * Add missing Python 3.15 classifier.
9
+
5
10
  v2.8.0 (2026-08-03)
6
11
  ===================
7
12
 
@@ -181,11 +181,16 @@ lint: sort-imports
181
181
  # fix formatting, linting issues and import sorting
182
182
  fix: lint format
183
183
 
184
+ # run zizmor security analysis of CI
185
+ zizmor:
186
+ cargo install --locked zizmor
187
+ zizmor --persona auditor --format sarif .github/workflows/ > zizmor.sarif
188
+
184
189
  # run all static checks
185
190
  check: check-lint check-format check-types check-package check-docs check-readme
186
191
 
187
192
  # run all checks including documentation link checking (slow)
188
- check-all: check check-docs-links
193
+ check-all: check zizmor check-docs-links
189
194
 
190
195
  # run tests
191
196
  test *TESTS:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "enum-properties"
7
- version = "2.8.0"
7
+ version = "2.8.1"
8
8
  description = "Add properties and method specializations to Python enumeration values with a simple declarative syntax."
9
9
  requires-python = ">=3.10,<4.0"
10
10
  authors = [
@@ -30,6 +30,7 @@ classifiers = [
30
30
  "Programming Language :: Python :: 3.12",
31
31
  "Programming Language :: Python :: 3.13",
32
32
  "Programming Language :: Python :: 3.14",
33
+ "Programming Language :: Python :: 3.15",
33
34
  "Topic :: Software Development :: Libraries",
34
35
  "Topic :: Software Development :: Libraries :: Python Modules",
35
36
  "Typing :: Typed"
@@ -29,7 +29,7 @@ from collections.abc import Generator, Hashable, Iterable, Mapping
29
29
  from dataclasses import dataclass
30
30
  from functools import cached_property
31
31
 
32
- VERSION = (2, 8, 0)
32
+ VERSION = (2, 8, 1)
33
33
 
34
34
  __title__ = "Enum Properties"
35
35
  __version__ = ".".join(str(i) for i in VERSION)
@@ -405,6 +405,96 @@ class TestFlags(TestCase):
405
405
  def label(self):
406
406
  return "label"
407
407
 
408
+ if sys.version_info >= (3, 15): # pragma: no cover
409
+
410
+ def test_show_flag_values(self):
411
+ """
412
+ In 3.15, show_flag_values was added to enum.__all__ making it
413
+ public API.
414
+ """
415
+ import enum
416
+
417
+ self.assertIn("show_flag_values", enum.__all__)
418
+
419
+ class Perm(IntFlagProperties):
420
+ label: Annotated[str, Symmetric(case_fold=True)]
421
+
422
+ R = 1, "read"
423
+ W = 2, "write"
424
+ X = 4, "execute"
425
+ RWX = 7, "all"
426
+
427
+ self.assertEqual(enum.show_flag_values(Perm.R), [1])
428
+ self.assertEqual(enum.show_flag_values(Perm.R | Perm.X), [1, 4])
429
+ self.assertEqual(enum.show_flag_values(Perm.RWX), [1, 2, 4])
430
+ self.assertEqual(enum.show_flag_values(Perm("all")), [1, 2, 4])
431
+ self.assertEqual(enum.show_flag_values(Perm(0)), [])
432
+
433
+ class FPerm(FlagProperties):
434
+ label: Annotated[str, Symmetric(case_fold=True)]
435
+
436
+ R = auto(), "read"
437
+ W = auto(), "write"
438
+ X = auto(), "execute"
439
+
440
+ self.assertEqual(enum.show_flag_values(FPerm.W), [2])
441
+ self.assertEqual(enum.show_flag_values(FPerm(["read", "execute"])), [1, 4])
442
+
443
+ def test_enum_bin(self):
444
+ """
445
+ In 3.15, bin was added to enum.__all__ making it public API. It
446
+ renders twos-complement with an explicit leading sign bit.
447
+ """
448
+ import enum
449
+
450
+ self.assertIn("bin", enum.__all__)
451
+
452
+ self.assertEqual(enum.bin(10), "0b0 1010")
453
+ self.assertEqual(enum.bin(~10), "0b1 0101")
454
+
455
+ class Perm(IntFlagProperties):
456
+ label: Annotated[str, Symmetric(case_fold=True)]
457
+
458
+ R = 1, "read"
459
+ W = 2, "write"
460
+ X = 4, "execute"
461
+
462
+ self.assertEqual(enum.bin(Perm.R), "0b0 1")
463
+ self.assertEqual(enum.bin(Perm.W | Perm.X), "0b0 110")
464
+ self.assertEqual(enum.bin(Perm("read") | Perm("write")), "0b0 11")
465
+
466
+ def test_flag_negative_value_inversion(self):
467
+ """
468
+ In 3.15, negative flag values declared in the class body are
469
+ inverted against the mask of positive member bits, so members
470
+ can be declared with ~ and negative lookups resolve to their
471
+ positive complement.
472
+ """
473
+
474
+ class Perm(IntFlagProperties):
475
+ label: Annotated[str, Symmetric(case_fold=True)]
476
+
477
+ R = 1, "read"
478
+ W = 2, "write"
479
+ X = 4, "execute"
480
+ NOT_R = ~1, "not read"
481
+
482
+ # ~1 == -2 is masked against R|W|X to the positive composite W|X
483
+ self.assertEqual(Perm.NOT_R.value, 6)
484
+ self.assertEqual(Perm.NOT_R.label, "not read")
485
+ self.assertIs(~Perm.R, Perm.NOT_R)
486
+ self.assertEqual((~Perm.R).label, "not read")
487
+ self.assertIs(Perm.NOT_R, Perm.W | Perm.X)
488
+
489
+ # negative lookup values also resolve to the positive complement
490
+ self.assertIs(Perm(-2), Perm.NOT_R)
491
+ self.assertIs(Perm(~Perm.R.value), Perm.NOT_R)
492
+
493
+ # symmetric property lookup still works for ~-declared members
494
+ self.assertIs(Perm("not read"), Perm.NOT_R)
495
+ self.assertIs(Perm("NOT READ"), Perm.NOT_R)
496
+ self.assertIs(Perm(["write", "execute"]), Perm.NOT_R)
497
+
408
498
  if sys.version_info >= (3, 12): # pragma: no cover
409
499
 
410
500
  def test_enum_dataclass_support(self):
File without changes