hunterMakesPy 0.3.4__py3-none-any.whl → 0.4.0__py3-none-any.whl
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.
- hunterMakesPy/Z0Z_CallableFunction.py +70 -0
- hunterMakesPy/__init__.py +8 -1
- hunterMakesPy/coping.py +2 -4
- hunterMakesPy/tests/test_theTypes.py +51 -112
- hunterMakesPy/theTypes.py +3 -2
- {huntermakespy-0.3.4.dist-info → huntermakespy-0.4.0.dist-info}/METADATA +2 -3
- {huntermakespy-0.3.4.dist-info → huntermakespy-0.4.0.dist-info}/RECORD +10 -9
- {huntermakespy-0.3.4.dist-info → huntermakespy-0.4.0.dist-info}/WHEEL +1 -1
- {huntermakespy-0.3.4.dist-info → huntermakespy-0.4.0.dist-info}/licenses/LICENSE +0 -0
- {huntermakespy-0.3.4.dist-info → huntermakespy-0.4.0.dist-info}/top_level.txt +0 -0
|
@@ -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
|
+
...
|
hunterMakesPy/__init__.py
CHANGED
|
@@ -8,15 +8,22 @@ This package provides:
|
|
|
8
8
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
|
|
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]
|
hunterMakesPy/coping.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
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)
|
hunterMakesPy/theTypes.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""I type, you type, we all `type` for `theTypes`."""
|
|
2
|
-
from
|
|
2
|
+
from hunterMakesPy.Z0Z_CallableFunction import CallableFunction as CallableFunction
|
|
3
|
+
from typing import Protocol, Self
|
|
3
4
|
|
|
4
|
-
identifierDotAttribute
|
|
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
|
+
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.
|
|
29
|
+
Requires-Python: >=3.12
|
|
31
30
|
Description-Content-Type: text/markdown
|
|
32
31
|
License-File: LICENSE
|
|
33
32
|
Requires-Dist: autoflake
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
hunterMakesPy/
|
|
1
|
+
hunterMakesPy/Z0Z_CallableFunction.py,sha256=MfRFZXc_OrkYKzCk5zt-s0I2VpagoZsYbigG7OFfC7g,2571
|
|
2
|
+
hunterMakesPy/__init__.py,sha256=KOKYnqyIR752RG0KbdC1olOk_lDk9zDVQvJL_W6hJQU,1300
|
|
2
3
|
hunterMakesPy/_theSSOT.py,sha256=x9Rdmw0qeAqgmlMFyFYRTRV5kEDYXcN4aBZ4KjlnKEU,170
|
|
3
|
-
hunterMakesPy/coping.py,sha256=
|
|
4
|
+
hunterMakesPy/coping.py,sha256=HqU5Qei-tK-yFZDmInHXhmEjmgvyd0XLoejN5HeQr9E,6033
|
|
4
5
|
hunterMakesPy/dataStructures.py,sha256=GbFk5uJskkjL5WNCSJbgn7BKQVh0f792gZ4zgSod9H8,11934
|
|
5
6
|
hunterMakesPy/filesystemToolkit.py,sha256=4zgXrDELBnS2UJ4sGPJVFyyrjDwfF0evnGIWssm--Jk,6809
|
|
6
7
|
hunterMakesPy/parseParameters.py,sha256=k5sGBoCeVRK02lNze59xPb99UiXm2l-HXI5HQPcKHnY,11321
|
|
7
8
|
hunterMakesPy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
9
|
hunterMakesPy/pytestForYourUse.py,sha256=wQe9e4ndiVpQQjm_VJFbo1WSRkmiF4Hx3RkCmw5jhcU,413
|
|
9
|
-
hunterMakesPy/theTypes.py,sha256=
|
|
10
|
+
hunterMakesPy/theTypes.py,sha256=HzUPPpR3qv8K_1rccjOpkpqmT3XLfrkF369t3HuE80s,808
|
|
10
11
|
hunterMakesPy/tests/__init__.py,sha256=C_FzfKDi_VrGVxlenWHyOYtKShAKlt3KW14jeRx1mQI,224
|
|
11
12
|
hunterMakesPy/tests/conftest.py,sha256=yX8RCaAnV7cDPk7G0EQsdCUhN3lWtcUzwe-EUjCdWsE,5108
|
|
12
13
|
hunterMakesPy/tests/test_coping.py,sha256=2PE2CRqAvIAWAMCX_lkkRLjH9IXPtMDWOWIDQschcJ0,11412
|
|
13
14
|
hunterMakesPy/tests/test_dataStructures.py,sha256=btLgXK5ksUntYToDFreXv0BMgr9XzH0aP0hgpPsPMBU,19310
|
|
14
15
|
hunterMakesPy/tests/test_filesystemToolkit.py,sha256=obKbiruo8Vpwx7R-5cTQMJHxsQuXQrHRkWIEYOPcy_E,19491
|
|
15
16
|
hunterMakesPy/tests/test_parseParameters.py,sha256=lRsAsAmIoNoSei0xlwek7Uu9ypaWiDFTYe4UnFG9MqU,14585
|
|
16
|
-
hunterMakesPy/tests/test_theTypes.py,sha256
|
|
17
|
-
huntermakespy-0.
|
|
18
|
-
huntermakespy-0.
|
|
19
|
-
huntermakespy-0.
|
|
20
|
-
huntermakespy-0.
|
|
21
|
-
huntermakespy-0.
|
|
17
|
+
hunterMakesPy/tests/test_theTypes.py,sha256=-1HrGD_CGyHIFu6-CsIZT1EZoYOE34GsKbi1QJaQwrM,10010
|
|
18
|
+
huntermakespy-0.4.0.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
|
|
19
|
+
huntermakespy-0.4.0.dist-info/METADATA,sha256=JsLgBKkBChFfwMZFMhfAXsg0cNMwJy3dwLXT5mzxmhY,6268
|
|
20
|
+
huntermakespy-0.4.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
21
|
+
huntermakespy-0.4.0.dist-info/top_level.txt,sha256=Uh4bj8EDTdsRpqY1VlK_his_B4HDfZ6Tqrwhoj75P_w,14
|
|
22
|
+
huntermakespy-0.4.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|