frigid 4.1__tar.gz → 4.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.
@@ -1,10 +1,15 @@
1
1
  .env
2
+ .claude
2
3
  .gemini
3
4
  .mcp.json
5
+ .opencode
4
6
  .*.swp
5
7
  AGENTS.md
6
8
  CLAUDE.md
7
9
  CONVENTIONS.md
8
10
  GEMINI.md
11
+ opencode.jsonc
9
12
  __pycache__/
10
13
  bugs/
14
+ build/
15
+ dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frigid
3
- Version: 4.1
3
+ Version: 4.2
4
4
  Summary: Immutable data structures.
5
5
  Project-URL: Homepage, https://github.com/emcd/python-frigid
6
6
  Project-URL: Documentation, https://emcd.github.io/python-frigid
@@ -106,6 +106,18 @@ Key Features ⭐
106
106
  Installation 📦
107
107
  ===============================================================================
108
108
 
109
+ Method: Install Python Package
110
+ -------------------------------------------------------------------------------
111
+
112
+ Install via `uv <https://github.com/astral-sh/uv/blob/main/README.md>`_ ``pip``
113
+ command:
114
+
115
+ ::
116
+
117
+ uv pip install frigid
118
+
119
+ Or, install via ``pip``:
120
+
109
121
  ::
110
122
 
111
123
  pip install frigid
@@ -204,7 +216,24 @@ Use Cases 🎯
204
216
  complete immutability guarantees.
205
217
 
206
218
 
207
- `More Flair <https://www.imdb.com/title/tt0151804/characters/nm0431918>`_
219
+ Contribution 🤝
220
+ ===============================================================================
221
+
222
+ Contribution to this project is welcome! However, it must follow the `code of
223
+ conduct
224
+ <https://emcd.github.io/python-project-common/stable/sphinx-html/common/conduct.html>`_
225
+ for the project.
226
+
227
+ Please file bug reports and feature requests in the `issue tracker
228
+ <https://github.com/emcd/python-frigid/issues>`_ or submit `pull
229
+ requests <https://github.com/emcd/python-frigid/pulls>`_ to
230
+ improve the source code or documentation.
231
+
232
+ For development guidance and standards, please see the `development guide
233
+ <https://emcd.github.io/python-frigid/stable/sphinx-html/contribution.html#development>`_.
234
+
235
+
236
+ Additional Indicia
208
237
  ===============================================================================
209
238
 
210
239
  .. image:: https://img.shields.io/github/last-commit/emcd/python-frigid
@@ -75,6 +75,18 @@ Key Features ⭐
75
75
  Installation 📦
76
76
  ===============================================================================
77
77
 
78
+ Method: Install Python Package
79
+ -------------------------------------------------------------------------------
80
+
81
+ Install via `uv <https://github.com/astral-sh/uv/blob/main/README.md>`_ ``pip``
82
+ command:
83
+
84
+ ::
85
+
86
+ uv pip install frigid
87
+
88
+ Or, install via ``pip``:
89
+
78
90
  ::
79
91
 
80
92
  pip install frigid
@@ -173,7 +185,24 @@ Use Cases 🎯
173
185
  complete immutability guarantees.
174
186
 
175
187
 
176
- `More Flair <https://www.imdb.com/title/tt0151804/characters/nm0431918>`_
188
+ Contribution 🤝
189
+ ===============================================================================
190
+
191
+ Contribution to this project is welcome! However, it must follow the `code of
192
+ conduct
193
+ <https://emcd.github.io/python-project-common/stable/sphinx-html/common/conduct.html>`_
194
+ for the project.
195
+
196
+ Please file bug reports and feature requests in the `issue tracker
197
+ <https://github.com/emcd/python-frigid/issues>`_ or submit `pull
198
+ requests <https://github.com/emcd/python-frigid/pulls>`_ to
199
+ improve the source code or documentation.
200
+
201
+ For development guidance and standards, please see the `development guide
202
+ <https://emcd.github.io/python-frigid/stable/sphinx-html/contribution.html#development>`_.
203
+
204
+
205
+ Additional Indicia
177
206
  ===============================================================================
178
207
 
179
208
  .. image:: https://img.shields.io/github/last-commit/emcd/python-frigid
@@ -61,7 +61,7 @@ gha-runners = [
61
61
  ]
62
62
  [tool.coverage.run]
63
63
  branch = true
64
- command_line = '-m pytest' # TODO? '--fail-under'
64
+ command_line = '-m pytest'
65
65
  data_file = '.auxiliary/caches/pytest/coverage.sqlite3'
66
66
  parallel = true
67
67
  source = [ 'sources' ]
@@ -99,6 +99,7 @@ dependencies = [
99
99
  'Jinja2',
100
100
  'coverage[toml]',
101
101
  'furo',
102
+ 'isort',
102
103
  'packaging',
103
104
  'pre-commit',
104
105
  'pyright',
@@ -108,6 +109,7 @@ dependencies = [
108
109
  'sphinx-copybutton',
109
110
  'sphinx-inline-tabs',
110
111
  'towncrier',
112
+ 'vulture',
111
113
  # --- BEGIN: Injected by Copier ---
112
114
  # --- END: Injected by Copier ---
113
115
  ]
@@ -121,15 +123,17 @@ PYTHONUNBUFFERED = 'TRUE' # TODO: Only for coverage/pytest.
121
123
  # --- END: Injected by Copier ---
122
124
  [tool.hatch.envs.develop.scripts]
123
125
  docsgen = [
124
- """sphinx-build -E -b linkcheck -d .auxiliary/caches/sphinx \
125
- documentation .auxiliary/artifacts/sphinx-linkcheck""",
126
- """sphinx-build -a -d .auxiliary/caches/sphinx \
127
- documentation .auxiliary/artifacts/sphinx-html""",
126
+ """sphinx-build -E -b linkcheck -d .auxiliary/caches/sphinx --quiet \
127
+ documentation .auxiliary/artifacts/sphinx-linkcheck""",
128
+ """sphinx-build -a -d .auxiliary/caches/sphinx --quiet \
129
+ documentation .auxiliary/artifacts/sphinx-html""",
128
130
  ]
129
131
  linters = [
130
132
  """ruff check --quiet sources documentation tests""",
131
133
  # --- BEGIN: Injected by Copier ---
132
134
  # --- END: Injected by Copier ---
135
+ """isort --check-only --diff sources tests""",
136
+ """vulture""",
133
137
  """pyright sources""",
134
138
  ]
135
139
  packagers = [
@@ -137,14 +141,19 @@ packagers = [
137
141
  # --- BEGIN: Injected by Copier ---
138
142
  # --- END: Injected by Copier ---
139
143
  ]
144
+ testers-documentation = [
145
+ """coverage run -m sphinx.cmd.build \
146
+ -E -b doctest -d .auxiliary/caches/sphinx --quiet \
147
+ documentation .auxiliary/artifacts/sphinx-doctest""",
148
+ ]
149
+ testers-serotine = [ """coverage run -m pytest -m slow""" ]
140
150
  testers-no-reports = [
141
- 'coverage erase',
142
151
  'coverage run',
143
- """coverage run -m sphinx.cmd.build \
144
- -E -b doctest -d .auxiliary/caches/sphinx \
145
- documentation .auxiliary/artifacts/sphinx-doctest""",
152
+ 'testers-documentation',
153
+ 'testers-serotine',
146
154
  ]
147
155
  testers = [
156
+ 'coverage erase',
148
157
  'testers-no-reports',
149
158
  'coverage combine',
150
159
  'coverage report --skip-covered',
@@ -171,6 +180,25 @@ python = [
171
180
  [tool.hatch.version]
172
181
  path = 'sources/frigid/__init__.py'
173
182
 
183
+ # https://pycqa.github.io/isort/docs/configuration/config_files.html
184
+ [tool.isort]
185
+ # profile = 'black'
186
+ src_paths = [ 'sources', 'tests' ]
187
+ case_sensitive = true
188
+ # ensure_newline_before_comments = true
189
+ # force_sort_within_sections = true
190
+ ignore_whitespace = true
191
+ include_trailing_comma = true
192
+ known_first_party = [ 'frigid' ]
193
+ lines_between_types = 1
194
+ line_length = 79
195
+ multi_line_output = 3
196
+ quiet = true
197
+ # skip_gitignore = true
198
+ skip_glob = [ '*/__/imports.py', '*/__init__.py' ]
199
+ split_on_trailing_comma = true
200
+ use_parentheses = true
201
+
174
202
  # https://mypy.readthedocs.io/en/stable/config_file.html
175
203
  [tool.mypy]
176
204
  # Note: Due to repeated painful experiences with Mypy, we use Pyright instead.
@@ -184,8 +212,8 @@ strict = false
184
212
 
185
213
  # https://microsoft.github.io/pyright/#/configuration
186
214
  [tool.pyright]
187
- ignore = [ 'documentation', 'tests' ] # Stronger hint for language server.
188
- include = [ 'sources' ]
215
+ ignore = [ '.auxiliary', 'documentation', 'tests' ] # Ignore diagnostics.
216
+ include = [ 'sources', 'tests' ] # Consider for operations.
189
217
  reportConstantRedefinition = true
190
218
  reportInvalidTypeVarUse = true
191
219
  reportMatchNotExhaustive = true
@@ -217,16 +245,19 @@ stubPath = 'sources/frigid/_typedecls'
217
245
  # Note: Cannot run doctests from Pytest, because Pytest tries to update '_'
218
246
  # attribute on protected modules. Instead, we use Sphinx to run doctests.
219
247
  minversion = '8.1'
220
- addopts = '--capture=no --exitfirst -rfE'
248
+ addopts = """--capture=no --exitfirst --quiet -rfE -m 'not slow'""" # TODO? '--fail-under'
221
249
  testpaths = [ 'tests' ]
222
250
  python_files = [ 'test_*.py' ]
223
251
  python_functions = [ 'test_[0-9][0-9][0-9]_*' ]
224
252
  cache_dir = '.auxiliary/caches/pytest'
225
- filterwarnings = [ 'ignore::DeprecationWarning' ]
253
+ markers = [
254
+ "slow: long-running tests",
255
+ ]
226
256
 
227
257
  [tool.ruff]
228
258
  #builtins = [ 'ic' ]
229
259
  cache-dir = '.auxiliary/caches/ruff'
260
+ extend-exclude = [ 'vulturefood.py' ]
230
261
  indent-width = 4
231
262
  line-length = 79
232
263
  [tool.ruff.lint]
@@ -316,3 +347,12 @@ showcontent = true
316
347
  directory = 'repair'
317
348
  name = 'Repairs'
318
349
  showcontent = true
350
+
351
+ [tool.vulture]
352
+ paths = [ '.auxiliary/configuration/vulturefood.py', 'sources' ]
353
+ min_confidence = 60
354
+ exclude = [
355
+ '*/imports.py',
356
+ ]
357
+ ignore_decorators = [ '@__.abc.abstractmethod', '@__.typx.overload' ]
358
+ ignore_names = [ 'main' ]
@@ -25,11 +25,3 @@ from .dictionaries import *
25
25
  from .doctab import *
26
26
  from .imports import *
27
27
  from .nomina import *
28
-
29
-
30
- dynadoc_introspection_limiter = (
31
- ccstd.dynadoc.produce_dynadoc_introspection_limiter(
32
- attributes_namer = calculate_attrname ) )
33
- dynadoc_introspection_control_on_class = (
34
- ccstd.dynadoc.produce_dynadoc_introspection_control(
35
- limiters = ( dynadoc_introspection_limiter, ) ) )
@@ -31,6 +31,7 @@ import inspect
31
31
  import sys
32
32
  import types
33
33
 
34
+ import classcore.exceptions as ccexc
34
35
  import classcore.standard as ccstd
35
36
  import classcore.utilities as ccutils
36
37
  import dynadoc as ddoc
@@ -23,7 +23,7 @@
23
23
  # ruff: noqa: F401
24
24
 
25
25
 
26
- from classcore.standard.nomina import (
26
+ from classcore.standard.nomina import ( # isort: skip
27
27
  AttributesNamer,
28
28
  BehaviorExclusionVerifiersOmni,
29
29
  DecorationPreparers as ClassDecorationPreparers,
@@ -40,7 +40,7 @@ from .sequences import *
40
40
 
41
41
 
42
42
  __version__: __.typx.Annotated[ str, __.ddoc.Visibilities.Reveal ]
43
- __version__ = '4.1'
43
+ __version__ = '4.2'
44
44
 
45
45
 
46
46
  finalize_module( __name__, dynadoc_table = __.fragments, recursive = True )
@@ -26,6 +26,12 @@
26
26
  from . import __
27
27
 
28
28
 
29
+ abc_class_mutables = (
30
+ '_abc_cache',
31
+ '_abc_negative_cache',
32
+ '_abc_negative_cache_version',
33
+ '_abc_registry',
34
+ )
29
35
  is_public_identifier = __.is_public_identifier
30
36
  mutables_default = ( )
31
37
  visibles_default = ( is_public_identifier, )
@@ -44,9 +50,7 @@ def _provide_error_class( name: str ) -> type[ Exception ]:
44
50
 
45
51
  _dataclass_core = __.dcls.dataclass( kw_only = True, slots = True )
46
52
  _dynadoc_configuration = (
47
- __.ccstd.dynadoc.produce_dynadoc_configuration(
48
- introspection = __.dynadoc_introspection_control_on_class,
49
- table = __.fragments ) )
53
+ __.ccstd.dynadoc.produce_dynadoc_configuration( table = __.fragments ) )
50
54
  _class_factory = __.funct.partial(
51
55
  __.ccstd.class_factory,
52
56
  attributes_namer = __.calculate_attrname,
@@ -232,7 +236,11 @@ class DataclassObjectMutable( metaclass = DataclassMutable ):
232
236
  'class instance conceal' )
233
237
 
234
238
 
235
- class Protocol( __.typx.Protocol, metaclass = ProtocolClass ):
239
+ class Protocol(
240
+ __.typx.Protocol,
241
+ metaclass = ProtocolClass,
242
+ class_mutables = abc_class_mutables,
243
+ ):
236
244
  ''' Standard base protocol class. '''
237
245
 
238
246
  _dynadoc_fragments_ = (
@@ -242,7 +250,10 @@ class Protocol( __.typx.Protocol, metaclass = ProtocolClass ):
242
250
 
243
251
 
244
252
  class ProtocolMutable(
245
- __.typx.Protocol, metaclass = ProtocolClass, instances_mutables = '*'
253
+ __.typx.Protocol,
254
+ metaclass = ProtocolClass,
255
+ class_mutables = abc_class_mutables,
256
+ instances_mutables = '*',
246
257
  ):
247
258
  ''' Base protocol class with mutable instance attributes. '''
248
259
 
@@ -253,7 +264,9 @@ class ProtocolMutable(
253
264
 
254
265
 
255
266
  class DataclassProtocol(
256
- __.typx.Protocol, metaclass = ProtocolDataclass,
267
+ __.typx.Protocol,
268
+ metaclass = ProtocolDataclass,
269
+ class_mutables = abc_class_mutables,
257
270
  ):
258
271
  ''' Standard base protocol dataclass. '''
259
272
 
@@ -264,7 +277,9 @@ class DataclassProtocol(
264
277
 
265
278
 
266
279
  class DataclassProtocolMutable(
267
- __.typx.Protocol, metaclass = ProtocolDataclassMutable,
280
+ __.typx.Protocol,
281
+ metaclass = ProtocolDataclassMutable,
282
+ class_mutables = abc_class_mutables,
268
283
  ):
269
284
  ''' Base protocol dataclass with mutable instance attributes. '''
270
285
 
@@ -162,6 +162,7 @@ class _DictionaryOperations( AbstractDictionary[ __.H, __.V ] ):
162
162
  class Dictionary( # noqa: PLW1641
163
163
  _DictionaryOperations[ __.H, __.V ],
164
164
  metaclass = _classes.AbstractBaseClass,
165
+ class_mutables = _classes.abc_class_mutables,
165
166
  ):
166
167
  ''' Immutable dictionary. '''
167
168
 
@@ -32,8 +32,8 @@ from . import classes as _classes
32
32
 
33
33
  class Omniexception(
34
34
  _classes.Object, BaseException,
35
- instances_visibles = (
36
- '__cause__', '__context__', _classes.is_public_identifier ),
35
+ instances_mutables = __.ccexc.exception_mutables_default,
36
+ instances_visibles = __.ccexc.exception_visibles_default,
37
37
  ):
38
38
  ''' Base exceptions for package. '''
39
39
 
@@ -130,4 +130,5 @@ def reclassify_modules(
130
130
  __.ccstd.reclassify_modules(
131
131
  module,
132
132
  attributes_namer = __.calculate_attrname,
133
+ recursive = recursive,
133
134
  replacement_class = Module )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes