hunterMakesPy 0.3.4__tar.gz → 0.4.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 (27) hide show
  1. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/PKG-INFO +2 -3
  2. huntermakespy-0.4.0/hunterMakesPy/Z0Z_CallableFunction.py +70 -0
  3. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/__init__.py +8 -1
  4. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/coping.py +2 -4
  5. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/test_theTypes.py +51 -112
  6. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/theTypes.py +3 -2
  7. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy.egg-info/PKG-INFO +2 -3
  8. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy.egg-info/SOURCES.txt +1 -0
  9. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/pyproject.toml +2 -3
  10. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/LICENSE +0 -0
  11. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/README.md +0 -0
  12. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/_theSSOT.py +0 -0
  13. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/dataStructures.py +0 -0
  14. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/filesystemToolkit.py +0 -0
  15. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/parseParameters.py +0 -0
  16. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/py.typed +0 -0
  17. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/pytestForYourUse.py +0 -0
  18. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/__init__.py +0 -0
  19. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/conftest.py +0 -0
  20. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/test_coping.py +0 -0
  21. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/test_dataStructures.py +0 -0
  22. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/test_filesystemToolkit.py +0 -0
  23. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy/tests/test_parseParameters.py +0 -0
  24. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy.egg-info/dependency_links.txt +0 -0
  25. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy.egg-info/requires.txt +0 -0
  26. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/hunterMakesPy.egg-info/top_level.txt +0 -0
  27. {huntermakespy-0.3.4 → huntermakespy-0.4.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hunterMakesPy
3
- Version: 0.3.4
3
+ Version: 0.4.0
4
4
  Summary: Easy Python functions making making functional Python functions easier.
5
5
  Author-email: Hunter Hogan <HunterHogan@pm.me>
6
6
  License: CC-BY-NC-4.0
@@ -19,7 +19,6 @@ Classifier: Natural Language :: English
19
19
  Classifier: Operating System :: OS Independent
20
20
  Classifier: Programming Language :: Python
21
21
  Classifier: Programming Language :: Python :: 3
22
- Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
25
24
  Classifier: Programming Language :: Python :: 3.14
@@ -27,7 +26,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
27
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
27
  Classifier: Topic :: Utilities
29
28
  Classifier: Typing :: Typed
30
- Requires-Python: >=3.11
29
+ Requires-Python: >=3.12
31
30
  Description-Content-Type: text/markdown
32
31
  License-File: LICENSE
33
32
  Requires-Dist: autoflake
@@ -0,0 +1,70 @@
1
+ """Protocols for callable functions with full type safety."""
2
+ from collections.abc import Callable
3
+ from types import CellType, CodeType, MethodType
4
+ from typing import Any, overload, ParamSpec, Protocol, runtime_checkable, Self, TypeVar, TypeVarTuple
5
+ import sys
6
+
7
+ #======== Stolen, uh, I mean copied from typeshed:stdlib\_typeshed\__init__.pyi ========
8
+ type AnnotationForm = Any
9
+
10
+ if sys.version_info >= (3, 14):
11
+ from annotationlib import Format
12
+
13
+ # NOTE These return annotations, which can be arbitrary objects
14
+ type AnnotateFunc = Callable[[Format], dict[str, AnnotationForm]]
15
+ type EvaluateFunc = Callable[[Format], AnnotationForm]
16
+ #======== End stolen, uh, I mean copied from typeshed:stdlib\_typeshed\__init__.pyi ========
17
+
18
+ @runtime_checkable
19
+ class CallableFunction[**P, R](Protocol):
20
+ """A Protocol representing callable functions with descriptor support.
21
+
22
+ Mimics types.FunctionType while being a drop-in replacement for `collections.abc.Callable`. Includes all standard function
23
+ attributes and the descriptor protocol for proper method binding.
24
+
25
+ Note: @runtime_checkable only validates attribute presence, not signatures.
26
+ """
27
+
28
+ # NOTE: The eehhhh, IDK... section
29
+ __doc__: str | None
30
+ __wrapped__: Any # For functools.wraps support
31
+ # NOTE: End eehhhh, IDK... section
32
+
33
+ @property
34
+ def __closure__(self) -> tuple[CellType, ...] | None:
35
+ """Tuple of cells that contain bindings for the function's free variables."""
36
+ ...
37
+ __code__: CodeType
38
+ __defaults__: tuple[Any, ...] | None
39
+ __dict__: dict[str, Any]
40
+ @property
41
+ def __globals__(self) -> dict[str, Any]:
42
+ """The global namespace in which the function was defined."""
43
+ ...
44
+ __name__: str
45
+ __qualname__: str
46
+ __annotations__: dict[str, AnnotationForm]
47
+ if sys.version_info >= (3, 14):
48
+ __annotate__: AnnotateFunc | None
49
+ __kwdefaults__: dict[str, Any] | None
50
+ @property
51
+ def __builtins__(self) -> dict[str, Any]:
52
+ """The built-in namespace in which the function was defined."""
53
+ ...
54
+ __type_params__: tuple[TypeVar | ParamSpec | TypeVarTuple, ...]
55
+ __module__: str
56
+
57
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
58
+ """Execute the callable with the given arguments."""
59
+ ...
60
+
61
+ @overload
62
+ def __get__(self, instance: None, owner: type, /) -> Self: ...
63
+ @overload
64
+ def __get__(self, instance: object, owner: type | None = None, /) -> MethodType: ...
65
+ def __get__(self, instance: object | None, owner: type | None = None) -> Self | MethodType:
66
+ """Descriptor protocol for method binding.
67
+
68
+ Returns self when accessed on the class, or a bound MethodType when accessed on an instance.
69
+ """
70
+ ...
@@ -8,15 +8,22 @@ This package provides:
8
8
 
9
9
  """
10
10
 
11
- from hunterMakesPy.theTypes import identifierDotAttribute as identifierDotAttribute, Ordinals as Ordinals
11
+ # isort: split
12
+ from hunterMakesPy.theTypes import (
13
+ CallableFunction as CallableFunction, identifierDotAttribute as identifierDotAttribute, Ordinals as Ordinals)
12
14
 
15
+ # isort: split
13
16
  from hunterMakesPy.coping import PackageSettings as PackageSettings, raiseIfNone as raiseIfNone
14
17
 
18
+ # isort: split
15
19
  from hunterMakesPy.parseParameters import defineConcurrencyLimit, intInnit, oopsieKwargsie
16
20
 
21
+ # isort: split
17
22
  from hunterMakesPy.filesystemToolkit import (
18
23
  importLogicalPath2Identifier, importPathFilename2Identifier, makeDirsSafely, writePython, writeStringToHere)
19
24
 
25
+ # isort: split
20
26
  from hunterMakesPy.dataStructures import autoDecodingRLE, stringItUp, updateExtendPolishDictionaryLists
21
27
 
28
+ # isort: split
22
29
  from hunterMakesPy._theSSOT import settingsPackage # pyright: ignore[reportUnusedImport]
@@ -2,14 +2,12 @@
2
2
  from importlib.util import find_spec
3
3
  from pathlib import Path
4
4
  from tomllib import loads as tomllib_loads
5
- from typing import TYPE_CHECKING, TypeVar
5
+ from typing import TYPE_CHECKING
6
6
  import dataclasses
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from importlib.machinery import ModuleSpec
10
10
 
11
- TypeSansNone = TypeVar('TypeSansNone')
12
-
13
11
  def getIdentifierPackagePACKAGING(identifierPackageFALLBACK: str) -> str:
14
12
  """Get package name from pyproject.toml or fallback to provided value."""
15
13
  try:
@@ -85,7 +83,7 @@ class PackageSettings:
85
83
  if self.pathPackage == Path() and self.identifierPackage:
86
84
  self.pathPackage = getPathPackageINSTALLING(self.identifierPackage)
87
85
 
88
- def raiseIfNone(expression: TypeSansNone | None, errorMessage: str | None = None) -> TypeSansNone:
86
+ def raiseIfNone[TypeSansNone](expression: TypeSansNone | None, errorMessage: str | None = None) -> TypeSansNone:
89
87
  """Convert the `expression` return annotation from '`cerPytainty | None`' to '`cerPytainty`' because `expression` cannot be `None`; `raise` an `Exception` if you're wrong.
90
88
 
91
89
  The Python interpreter evaluates `expression` to a value: think of a function call or an attribute access. You can use
@@ -5,13 +5,11 @@
5
5
  This module validates comparison semantics and sorting consistency across built-in and custom comparables using `pytest`.
6
6
 
7
7
  """
8
-
9
- from __future__ import annotations
10
-
11
8
  from dataclasses import dataclass
9
+ from hunterMakesPy import CallableFunction, Ordinals
12
10
  from hunterMakesPy.tests.conftest import uniformTestFailureMessage
13
- from hunterMakesPy.theTypes import Ordinals
14
11
  from typing import Self, TYPE_CHECKING, TypeVar
12
+ import functools
15
13
  import inspect
16
14
  import pytest
17
15
 
@@ -107,10 +105,7 @@ class ComparableCardinal:
107
105
 
108
106
  @pytest.mark.parametrize(
109
107
  'floor, ceiling, comparand, expected'
110
- , [
111
- (13, 34, 21, True)
112
- , (13, 34, 8, False)
113
- ]
108
+ , [ (13, 34, 21, True) , (227, 695, 88, False) ]
114
109
  )
115
110
  def testOrdinalsBetweenWorksForInt(floor: int, ceiling: int, comparand: int, expected: bool) -> None:
116
111
  """Verify `between` handles `int` operands.
@@ -135,20 +130,11 @@ def testOrdinalsBetweenWorksForInt(floor: int, ceiling: int, comparand: int, exp
135
130
 
136
131
  """
137
132
  actual: bool = between(floor, ceiling, comparand)
138
- assert actual == expected, uniformTestFailureMessage(
139
- expected
140
- , actual
141
- , 'between'
142
- , floor
143
- , ceiling
144
- , comparand
145
- )
133
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'between' , floor , ceiling , comparand )
146
134
 
147
135
  @pytest.mark.parametrize(
148
136
  'values, expected'
149
- , [
150
- ([21, 13, 34, 8], [8, 13, 21, 34])
151
- ]
137
+ , [ ([21, 13, 34, 8], [8, 13, 21, 34]) ]
152
138
  )
153
139
  def testOrdinalsSortingWorksForInt(values: list[int], expected: list[int]) -> None:
154
140
  """Verify sorting uses ordinal ordering for `int` values.
@@ -169,19 +155,11 @@ def testOrdinalsSortingWorksForInt(values: list[int], expected: list[int]) -> No
169
155
 
170
156
  """
171
157
  actual: list[int] = sorted(values)
172
- assert actual == expected, uniformTestFailureMessage(
173
- expected
174
- , actual
175
- , 'sorted'
176
- , values
177
- )
158
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'sorted' , values )
178
159
 
179
160
  @pytest.mark.parametrize(
180
161
  'floor, ceiling, comparand, expected'
181
- , [
182
- ('fibonacci', 'prime', 'omega', True)
183
- , ('fibonacci', 'prime', 'tango', False)
184
- ]
162
+ , [ ('fibonacci', 'prime', 'omega', True) , ('fibonacci', 'prime', 'tango', False) ]
185
163
  )
186
164
  def testOrdinalsBetweenWorksForStr(floor: str, ceiling: str, comparand: str, expected: bool) -> None:
187
165
  """Verify `between` handles `str` operands.
@@ -206,20 +184,11 @@ def testOrdinalsBetweenWorksForStr(floor: str, ceiling: str, comparand: str, exp
206
184
 
207
185
  """
208
186
  actual: bool = between(floor, ceiling, comparand)
209
- assert actual == expected, uniformTestFailureMessage(
210
- expected
211
- , actual
212
- , 'between'
213
- , floor
214
- , ceiling
215
- , comparand
216
- )
187
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'between' , floor , ceiling , comparand )
217
188
 
218
189
  @pytest.mark.parametrize(
219
190
  'values, expected'
220
- , [
221
- (['prime', 'fibonacci', 'omega'], ['fibonacci', 'omega', 'prime'])
222
- ]
191
+ , [ (['prime', 'fibonacci', 'omega'], ['fibonacci', 'omega', 'prime']) ]
223
192
  )
224
193
  def testOrdinalsSortingWorksForStr(values: list[str], expected: list[str]) -> None:
225
194
  """Verify sorting uses ordinal ordering for `str` values.
@@ -240,19 +209,11 @@ def testOrdinalsSortingWorksForStr(values: list[str], expected: list[str]) -> No
240
209
 
241
210
  """
242
211
  actual: list[str] = sorted(values)
243
- assert actual == expected, uniformTestFailureMessage(
244
- expected
245
- , actual
246
- , 'sorted'
247
- , values
248
- )
212
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'sorted' , values )
249
213
 
250
214
  @pytest.mark.parametrize(
251
215
  'floor, ceiling, comparand, expected'
252
- , [
253
- ((13, 17), (21, 2), (13, 19), True)
254
- , ((13, 17), (21, 2), (8, 34), False)
255
- ]
216
+ , [ ((13, 17), (21, 2), (13, 19), True) , ((13, 17), (21, 2), (8, 34), False) ]
256
217
  )
257
218
  def testOrdinalsBetweenWorksForTuple(floor: tuple[int, int], ceiling: tuple[int, int], comparand: tuple[int, int], expected: bool) -> None:
258
219
  """Verify `between` handles `tuple[int, int]` operands.
@@ -277,24 +238,9 @@ def testOrdinalsBetweenWorksForTuple(floor: tuple[int, int], ceiling: tuple[int,
277
238
 
278
239
  """
279
240
  actual: bool = between(floor, ceiling, comparand)
280
- assert actual == expected, uniformTestFailureMessage(
281
- expected
282
- , actual
283
- , 'between'
284
- , floor
285
- , ceiling
286
- , comparand
287
- )
241
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'between' , floor , ceiling , comparand )
288
242
 
289
- @pytest.mark.parametrize(
290
- 'values, expected'
291
- , [
292
- (
293
- [(21, 2), (13, 19), (13, 17), (8, 34)]
294
- , [(8, 34), (13, 17), (13, 19), (21, 2)]
295
- ),
296
- ],
297
- )
243
+ @pytest.mark.parametrize( 'values, expected' , [ ( [(21, 2), (13, 19), (13, 17), (8, 34)] , [(8, 34), (13, 17), (13, 19), (21, 2)] ) ] )
298
244
  def testOrdinalsSortingWorksForTuple(values: list[tuple[int, int]], expected: list[tuple[int, int]]) -> None:
299
245
  """Verify sorting uses ordinal ordering for `tuple[int, int]` values.
300
246
 
@@ -314,12 +260,7 @@ def testOrdinalsSortingWorksForTuple(values: list[tuple[int, int]], expected: li
314
260
 
315
261
  """
316
262
  actual: list[tuple[int, int]] = sorted(values)
317
- assert actual == expected, uniformTestFailureMessage(
318
- expected
319
- , actual
320
- , 'sorted'
321
- , values
322
- )
263
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'sorted' , values )
323
264
 
324
265
  @pytest.mark.parametrize(
325
266
  'floor, ceiling, comparand, expected'
@@ -328,12 +269,7 @@ def testOrdinalsSortingWorksForTuple(values: list[tuple[int, int]], expected: li
328
269
  , (ComparableCardinal(13), ComparableCardinal(34), ComparableCardinal(8), False)
329
270
  ]
330
271
  )
331
- def testOrdinalsBetweenWorksForCustomComparable(
332
- floor: ComparableCardinal,
333
- ceiling: ComparableCardinal,
334
- comparand: ComparableCardinal,
335
- expected: bool,
336
- ) -> None:
272
+ def testOrdinalsBetweenWorksForCustomComparable( floor: ComparableCardinal, ceiling: ComparableCardinal, comparand: ComparableCardinal, expected: bool ) -> None:
337
273
  """Verify `between` handles `ComparableCardinal` operands.
338
274
 
339
275
  (AI generated docstring)
@@ -356,22 +292,9 @@ def testOrdinalsBetweenWorksForCustomComparable(
356
292
 
357
293
  """
358
294
  actual: bool = between(floor, ceiling, comparand)
359
- assert actual == expected, uniformTestFailureMessage(
360
- expected
361
- , actual
362
- , 'between'
363
- , floor
364
- , ceiling
365
- , comparand
366
- )
295
+ assert actual == expected, uniformTestFailureMessage( expected , actual , 'between' , floor , ceiling , comparand )
367
296
 
368
- @pytest.mark.parametrize(
369
- 'comparisonMethodName'
370
- , [
371
- '__le__'
372
- , '__lt__'
373
- ]
374
- )
297
+ @pytest.mark.parametrize( 'comparisonMethodName' , [ '__le__' , '__lt__' ] )
375
298
  def testOrdinalsComparisonMethodsAcceptOtherOperand(comparisonMethodName: str) -> None:
376
299
  """Validate `Ordinals` comparison method signatures.
377
300
 
@@ -393,28 +316,44 @@ def testOrdinalsComparisonMethodsAcceptOtherOperand(comparisonMethodName: str) -
393
316
  listParameters: list[inspect.Parameter] = list(signature.parameters.values())
394
317
 
395
318
  assert len(listParameters) == 2, uniformTestFailureMessage(
396
- 2
397
- , len(listParameters)
398
- , 'Ordinals comparison parameter count'
399
- , comparisonMethodName
400
- , signature
401
- )
319
+ 2 , len(listParameters) , 'Ordinals comparison parameter count' , comparisonMethodName , signature )
402
320
 
403
321
  listKinds: list[inspect._ParameterKind] = [parameter.kind for parameter in listParameters]
404
322
  expectedKinds: list[inspect._ParameterKind] = [inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_ONLY]
405
323
  assert listKinds == expectedKinds, uniformTestFailureMessage(
406
- expectedKinds
407
- , listKinds
408
- , 'Ordinals comparison parameter kinds'
409
- , comparisonMethodName
410
- , signature
411
- )
324
+ expectedKinds , listKinds , 'Ordinals comparison parameter kinds' , comparisonMethodName , signature )
412
325
 
413
326
  actualReturnAnnotation: object = signature.return_annotation
414
327
  assert actualReturnAnnotation is bool, uniformTestFailureMessage(
415
- bool
416
- , actualReturnAnnotation
417
- , 'Ordinals comparison return annotation'
418
- , comparisonMethodName
419
- , signature
420
- )
328
+ bool , actualReturnAnnotation , 'Ordinals comparison return annotation' , comparisonMethodName , signature )
329
+
330
+ def _plainFunction() -> None:
331
+ """A plain function for testing."""
332
+
333
+ @functools.wraps(_plainFunction)
334
+ def _wrappedFunction() -> None:
335
+ """A wrapped function for testing."""
336
+
337
+ _lambdaFunction = lambda: None # noqa: E731
338
+
339
+ @pytest.mark.parametrize( 'candidate, expected' , [ (_wrappedFunction, True), (_plainFunction, False), (_lambdaFunction, False)] )
340
+ def testCallableFunctionIdentifiesCompatibleObjects(candidate: object, expected: bool) -> None:
341
+ """Verify `CallableFunction` protocol matching.
342
+
343
+ (AI generated docstring)
344
+
345
+ Parameters
346
+ ----------
347
+ candidate : object
348
+ The object to check against `CallableFunction`.
349
+ expected : bool
350
+ Expected result of `isinstance(candidate, CallableFunction)`.
351
+
352
+ Return
353
+ ------
354
+ unusedReturnValue : None
355
+ Returns `None`.
356
+
357
+ """
358
+ actual: bool = isinstance(candidate, CallableFunction)
359
+ assert actual == expected, uniformTestFailureMessage(expected, actual, 'isinstance', candidate)
@@ -1,7 +1,8 @@
1
1
  """I type, you type, we all `type` for `theTypes`."""
2
- from typing import Protocol, Self, TypeAlias
2
+ from hunterMakesPy.Z0Z_CallableFunction import CallableFunction as CallableFunction
3
+ from typing import Protocol, Self
3
4
 
4
- identifierDotAttribute: TypeAlias = str
5
+ type identifierDotAttribute = str
5
6
  """`str` (***str***ing) representing a dotted attribute identifier.
6
7
 
7
8
  `TypeAlias` for a `str` `object` using dot notation to access an attribute, such as 'scipy.signal.windows'.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hunterMakesPy
3
- Version: 0.3.4
3
+ Version: 0.4.0
4
4
  Summary: Easy Python functions making making functional Python functions easier.
5
5
  Author-email: Hunter Hogan <HunterHogan@pm.me>
6
6
  License: CC-BY-NC-4.0
@@ -19,7 +19,6 @@ Classifier: Natural Language :: English
19
19
  Classifier: Operating System :: OS Independent
20
20
  Classifier: Programming Language :: Python
21
21
  Classifier: Programming Language :: Python :: 3
22
- Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
25
24
  Classifier: Programming Language :: Python :: 3.14
@@ -27,7 +26,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
27
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
27
  Classifier: Topic :: Utilities
29
28
  Classifier: Typing :: Typed
30
- Requires-Python: >=3.11
29
+ Requires-Python: >=3.12
31
30
  Description-Content-Type: text/markdown
32
31
  License-File: LICENSE
33
32
  Requires-Dist: autoflake
@@ -1,6 +1,7 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
+ hunterMakesPy/Z0Z_CallableFunction.py
4
5
  hunterMakesPy/__init__.py
5
6
  hunterMakesPy/_theSSOT.py
6
7
  hunterMakesPy/coping.py
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "hunterMakesPy"
3
- version = "0.3.4"
3
+ version = "0.4.0"
4
4
  description = "Easy Python functions making making functional Python functions easier."
5
5
  readme = "README.md"
6
- requires-python = ">=3.11"
6
+ requires-python = ">=3.12"
7
7
  license = { 'text' = "CC-BY-NC-4.0" }
8
8
  authors = [{ name = "Hunter Hogan", email = "HunterHogan@pm.me" }]
9
9
  keywords = [
@@ -37,7 +37,6 @@ classifiers = [
37
37
  "Operating System :: OS Independent",
38
38
  "Programming Language :: Python",
39
39
  "Programming Language :: Python :: 3",
40
- "Programming Language :: Python :: 3.11",
41
40
  "Programming Language :: Python :: 3.12",
42
41
  "Programming Language :: Python :: 3.13",
43
42
  "Programming Language :: Python :: 3.14",
File without changes
File without changes
File without changes