hunterMakesPy 0.2.4__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 (25) hide show
  1. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/PKG-INFO +4 -13
  2. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/README.md +0 -9
  3. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/__init__.py +2 -5
  4. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/dataStructures.py +1 -6
  5. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/filesystemToolkit.py +55 -1
  6. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/test_filesystemToolkit.py +187 -1
  7. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy.egg-info/PKG-INFO +4 -13
  8. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy.egg-info/requires.txt +2 -2
  9. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/pyproject.toml +4 -4
  10. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/LICENSE +0 -0
  11. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/_theSSOT.py +0 -0
  12. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/coping.py +0 -0
  13. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/parseParameters.py +0 -0
  14. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/py.typed +0 -0
  15. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/pytestForYourUse.py +0 -0
  16. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/__init__.py +0 -0
  17. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/conftest.py +0 -0
  18. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/test_coping.py +0 -0
  19. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/test_dataStructures.py +0 -0
  20. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/tests/test_parseParameters.py +0 -0
  21. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy/theTypes.py +0 -0
  22. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy.egg-info/SOURCES.txt +0 -0
  23. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy.egg-info/dependency_links.txt +0 -0
  24. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/hunterMakesPy.egg-info/top_level.txt +0 -0
  25. {huntermakespy-0.2.4 → huntermakespy-0.3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hunterMakesPy
3
- Version: 0.2.4
3
+ Version: 0.3.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
@@ -9,7 +9,7 @@ Project-URL: Homepage, https://github.com/hunterhogan/hunterMakesPy
9
9
  Project-URL: Issues, https://github.com/hunterhogan/hunterMakesPy/issues
10
10
  Project-URL: Repository, https://github.com/hunterhogan/hunterMakesPy
11
11
  Keywords: attribute loading,concurrency limit,configuration,defensive programming,dictionary merging,directory creation,dynamic import,error propagation,file system utilities,input validation,integer parsing,module loading,nested data structures,package settings,parameter validation,pytest,string extraction,test utilities
12
- Classifier: Development Status :: 4 - Beta
12
+ Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Framework :: Pytest
15
15
  Classifier: Intended Audience :: Developers
@@ -30,12 +30,12 @@ Classifier: Typing :: Typed
30
30
  Requires-Python: >=3.11
31
31
  Description-Content-Type: text/markdown
32
32
  License-File: LICENSE
33
+ Requires-Dist: autoflake
33
34
  Requires-Dist: charset_normalizer
35
+ Requires-Dist: isort
34
36
  Requires-Dist: more_itertools
35
37
  Requires-Dist: numpy
36
38
  Provides-Extra: development
37
- Requires-Dist: mypy; extra == "development"
38
- Requires-Dist: pyupgrade; extra == "development"
39
39
  Requires-Dist: setuptools-scm; extra == "development"
40
40
  Provides-Extra: testing
41
41
  Requires-Dist: pytest; extra == "testing"
@@ -164,13 +164,4 @@ def test_myFunction(nameOfTest, callablePytest):
164
164
  [![Static Badge](https://img.shields.io/badge/2011_August-Homeless_since-blue?style=flat)](https://HunterThinks.com/support)
165
165
  [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UC3Gx7kz61009NbhpRtPP7tw)](https://www.youtube.com/@HunterHogan)
166
166
 
167
- ## How to code
168
-
169
- Coding One Step at a Time:
170
-
171
- 0. WRITE CODE.
172
- 1. Don't write stupid code that's hard to revise.
173
- 2. Write good code.
174
- 3. When revising, write better code.
175
-
176
167
  [![CC-BY-NC-4.0](https://github.com/hunterhogan/hunterMakesPy/blob/main/CC-BY-NC-4.0.png)](https://creativecommons.org/licenses/by-nc/4.0/)
@@ -119,13 +119,4 @@ def test_myFunction(nameOfTest, callablePytest):
119
119
  [![Static Badge](https://img.shields.io/badge/2011_August-Homeless_since-blue?style=flat)](https://HunterThinks.com/support)
120
120
  [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UC3Gx7kz61009NbhpRtPP7tw)](https://www.youtube.com/@HunterHogan)
121
121
 
122
- ## How to code
123
-
124
- Coding One Step at a Time:
125
-
126
- 0. WRITE CODE.
127
- 1. Don't write stupid code that's hard to revise.
128
- 2. Write good code.
129
- 3. When revising, write better code.
130
-
131
122
  [![CC-BY-NC-4.0](https://github.com/hunterhogan/hunterMakesPy/blob/main/CC-BY-NC-4.0.png)](https://creativecommons.org/licenses/by-nc/4.0/)
@@ -17,13 +17,10 @@ from hunterMakesPy.parseParameters import (defineConcurrencyLimit as defineConcu
17
17
 
18
18
  from hunterMakesPy.filesystemToolkit import (importLogicalPath2Identifier as importLogicalPath2Identifier,
19
19
  importPathFilename2Identifier as importPathFilename2Identifier, makeDirsSafely as makeDirsSafely,
20
- writeStringToHere as writeStringToHere)
20
+ writePython as writePython, writeStringToHere as writeStringToHere)
21
21
 
22
22
  from hunterMakesPy.dataStructures import stringItUp as stringItUp, updateExtendPolishDictionaryLists as updateExtendPolishDictionaryLists
23
23
 
24
- import sys
25
-
26
- if sys.version_info < (3, 14):
27
- from hunterMakesPy.dataStructures import autoDecodingRLE as autoDecodingRLE
24
+ from hunterMakesPy.dataStructures import autoDecodingRLE as autoDecodingRLE
28
25
 
29
26
  from hunterMakesPy._theSSOT import settingsPackage
@@ -8,12 +8,7 @@ import more_itertools
8
8
  import re as regex
9
9
 
10
10
  def removeExtraWhitespace(text: str) -> str:
11
- """Remove extra whitespace from string representation of Python data structures.
12
-
13
- This function replaces python_minifier.minify() for the specific use case of
14
- minimizing string representations of lists, tuples, ranges, etc. It removes
15
- spaces after commas, around brackets and parentheses.
16
- """
11
+ """Remove extra whitespace from string representation of Python data structures."""
17
12
  # Remove spaces after commas
18
13
  text = regex.sub(r',\s+', ',', text)
19
14
  # Remove spaces after opening brackets/parens
@@ -3,8 +3,9 @@
3
3
  This module provides basic file I/O utilities such as importing callables from modules, safely creating directories, and writing to files or streams (pipes).
4
4
 
5
5
  """
6
-
6
+ from autoflake import fix_code as autoflake_fix_code
7
7
  from hunterMakesPy import identifierDotAttribute
8
+ from isort import code as isort_code
8
9
  from os import PathLike
9
10
  from pathlib import Path, PurePath
10
11
  from typing import Any, TYPE_CHECKING, TypeVar
@@ -97,6 +98,59 @@ def makeDirsSafely(pathFilename: Any) -> None:
97
98
  with contextlib.suppress(OSError):
98
99
  Path(pathFilename).parent.mkdir(parents=True, exist_ok=True)
99
100
 
101
+ settings_autoflakeDEFAULT: dict[str, list[str] | bool] = {
102
+ 'additional_imports': [],
103
+ 'expand_star_imports': True,
104
+ 'remove_all_unused_imports': True,
105
+ 'remove_duplicate_keys': False,
106
+ 'remove_unused_variables': False,
107
+ }
108
+
109
+ settings_isortDEFAULT: dict[str, int | str | list[str]] = {
110
+ "combine_as_imports": True,
111
+ "force_alphabetical_sort_within_sections": True,
112
+ "from_first": True,
113
+ "honor_noqa": True,
114
+ "indent": "\t",
115
+ "line_length": 120,
116
+ "lines_after_imports": 1,
117
+ "lines_between_types": 0,
118
+ "multi_line_output": 4,
119
+ "no_sections": True,
120
+ "skip": ["__init__.py"], # TODO think
121
+ "use_parentheses": True,
122
+ }
123
+
124
+ def writePython(pythonSource: str, pathFilename: PathLike[Any] | PurePath | io.TextIOBase, settings: dict[str, dict[str, Any]] | None = None) -> None:
125
+ """Format and write Python source code to a file or text stream.
126
+
127
+ (AI generated docstring)
128
+
129
+ This function processes Python source code through autoflake and isort formatters before writing to the specified destination.
130
+ The formatters remove unused imports, sort imports, and apply consistent code style according to the provided or default
131
+ settings.
132
+
133
+ Parameters
134
+ ----------
135
+ pythonSource : str
136
+ The Python source code to format and write.
137
+ pathFilename : PathLike[Any] | PurePath | io.TextIOBase
138
+ The target destination: either a file path or an open text stream.
139
+ settings : dict[str, dict[str, Any]] | None = None
140
+ Configuration for the formatters. Keys are `'autoflake'` and `'isort'`, each mapping to a dictionary of formatter-specific
141
+ settings. If `None`, default settings are used for both formatters.
142
+
143
+ """
144
+ if settings is None:
145
+ settings = {}
146
+
147
+ settings_autoflake: dict[str, Any] = settings.get('autoflake', settings_autoflakeDEFAULT)
148
+ pythonSource = autoflake_fix_code(pythonSource, **settings_autoflake)
149
+
150
+ settings_isort: dict[str, Any] = settings.get('isort', settings_isortDEFAULT)
151
+ pythonSource = isort_code(pythonSource, **settings_isort)
152
+ writeStringToHere(pythonSource + '\n', pathFilename)
153
+
100
154
  def writeStringToHere(this: str, pathFilename: PathLike[Any] | PurePath | io.TextIOBase) -> None:
101
155
  """Write a string to a file or text stream.
102
156
 
@@ -1,5 +1,6 @@
1
1
  # pyright: standard
2
- from hunterMakesPy import importLogicalPath2Identifier, importPathFilename2Identifier, makeDirsSafely, writeStringToHere
2
+ from hunterMakesPy import (
3
+ importLogicalPath2Identifier, importPathFilename2Identifier, makeDirsSafely, writePython, writeStringToHere)
3
4
  from hunterMakesPy.tests.conftest import standardizedEqualTo
4
5
  import io
5
6
  import math
@@ -261,3 +262,188 @@ def testImportPathFilename2IdentifierWithValidFileInvalidIdentifier(
261
262
  identifierTarget
262
263
  )
263
264
 
265
+
266
+ @pytest.mark.parametrize(
267
+ "pythonSourceTarget, expectedFormattedContent",
268
+ [
269
+ (
270
+ "import sys\nimport os\nimport math\n\ndef fibonacciFunction():\n return 13\n",
271
+ "\ndef fibonacciFunction():\n return 13\n\n"
272
+ ),
273
+ (
274
+ "from pathlib import Path\nimport sys\nimport os\n\ndef primeFunction():\n return 17\n",
275
+ "\ndef primeFunction():\n return 17\n\n"
276
+ ),
277
+ (
278
+ "import unused\nimport sys\n\nvalueCardinal = sys.version\n",
279
+ "import sys\n\nvalueCardinal = sys.version\n\n"
280
+ ),
281
+ (
282
+ "import math\n\nvalueFibonacci = math.sqrt(21)\n",
283
+ "import math\n\nvalueFibonacci = math.sqrt(21)\n\n"
284
+ ),
285
+ ]
286
+ )
287
+ def testWritePythonFormatsAndWritesToFile(
288
+ pathTmpTesting: pathlib.Path,
289
+ pythonSourceTarget: str,
290
+ expectedFormattedContent: str
291
+ ) -> None:
292
+ """Test that writePython formats Python source code and writes it to files."""
293
+ pathFilenameTarget = pathTmpTesting / "formattedModule.py"
294
+ writePython(pythonSourceTarget, pathFilenameTarget)
295
+
296
+ assert pathFilenameTarget.exists(), (
297
+ f"\nTesting: `writePython(..., {pathFilenameTarget})`\n"
298
+ f"Expected: File {pathFilenameTarget} to exist\n"
299
+ f"Got: exists={pathFilenameTarget.exists()}"
300
+ )
301
+
302
+ contentActual = pathFilenameTarget.read_text(encoding="utf-8")
303
+ assert contentActual == expectedFormattedContent, (
304
+ f"\nTesting: `writePython(...)`\n"
305
+ f"Expected content:\n{repr(expectedFormattedContent)}\n"
306
+ f"Got content:\n{repr(contentActual)}"
307
+ )
308
+
309
+
310
+ @pytest.mark.parametrize(
311
+ "pythonSourceTarget, expectedFormattedContent",
312
+ [
313
+ (
314
+ "import sys\nimport unused\n\ndef cardinalFunction():\n return sys.version\n",
315
+ "import sys\n\ndef cardinalFunction():\n return sys.version\n\n"
316
+ ),
317
+ (
318
+ "from pathlib import Path\nfrom os import getcwd\nimport math\n\nvalueSequence = getcwd()\n",
319
+ "from os import getcwd\n\nvalueSequence = getcwd()\n\n"
320
+ ),
321
+ ]
322
+ )
323
+ def testWritePythonFormatsAndWritesToStream(
324
+ pythonSourceTarget: str,
325
+ expectedFormattedContent: str
326
+ ) -> None:
327
+ """Test that writePython formats Python source code and writes it to IO streams."""
328
+ streamMemory = io.StringIO()
329
+ writePython(pythonSourceTarget, streamMemory)
330
+
331
+ contentActual = streamMemory.getvalue()
332
+ assert contentActual == expectedFormattedContent, (
333
+ f"\nTesting: `writePython(..., StringIO)`\n"
334
+ f"Expected content:\n{repr(expectedFormattedContent)}\n"
335
+ f"Got content:\n{repr(contentActual)}"
336
+ )
337
+
338
+
339
+ @pytest.mark.parametrize(
340
+ "pythonSourceTarget, settingsCustom, expectedFormattedContent",
341
+ [
342
+ (
343
+ "import math\nimport unused\n\nvalueFibonacci = 34\n\ndef fibonacciFunction():\n return math.sqrt(13)\n",
344
+ {'autoflake': {'remove_all_unused_imports': True, 'remove_unused_variables': False}},
345
+ "import math\n\nvalueFibonacci = 34\n\ndef fibonacciFunction():\n return math.sqrt(13)\n\n"
346
+ ),
347
+ (
348
+ "from pathlib import Path\nimport sys\n\nvaluePrime = Path.cwd()\n",
349
+ {'isort': {'force_alphabetical_sort_within_sections': False, 'from_first': False}},
350
+ "from pathlib import Path\n\nvaluePrime = Path.cwd()\n\n"
351
+ ),
352
+ ]
353
+ )
354
+ def testWritePythonWithCustomSettings(
355
+ pathTmpTesting: pathlib.Path,
356
+ pythonSourceTarget: str,
357
+ settingsCustom: dict[str, dict[str, object]],
358
+ expectedFormattedContent: str
359
+ ) -> None:
360
+ """Test that writePython respects custom formatter settings."""
361
+ pathFilenameTarget = pathTmpTesting / "customFormattedModule.py"
362
+ writePython(pythonSourceTarget, pathFilenameTarget, settingsCustom)
363
+
364
+ contentActual = pathFilenameTarget.read_text(encoding="utf-8")
365
+ assert contentActual == expectedFormattedContent, (
366
+ f"\nTesting: `writePython(..., custom settings)`\n"
367
+ f"Expected content:\n{repr(expectedFormattedContent)}\n"
368
+ f"Got content:\n{repr(contentActual)}"
369
+ )
370
+
371
+
372
+ @pytest.mark.parametrize(
373
+ "pythonSourceTarget",
374
+ [
375
+ "import math\nimport sys\n\nvalueFibonacci = 34\n",
376
+ "from pathlib import Path\n\nvalueCardinal = 'SW'\n",
377
+ "def primeFunction():\n return 37\n",
378
+ ]
379
+ )
380
+ def testWritePythonCreatesNestedDirectories(
381
+ pathTmpTesting: pathlib.Path,
382
+ pythonSourceTarget: str
383
+ ) -> None:
384
+ """Test that writePython creates nested directories when writing to files."""
385
+ pathFilenameTarget = pathTmpTesting / "nested" / "directories" / "module.py"
386
+ writePython(pythonSourceTarget, pathFilenameTarget)
387
+
388
+ assert pathFilenameTarget.exists(), (
389
+ f"\nTesting: `writePython(..., {pathFilenameTarget})`\n"
390
+ f"Expected: File {pathFilenameTarget} to exist\n"
391
+ f"Got: exists={pathFilenameTarget.exists()}"
392
+ )
393
+
394
+ assert pathFilenameTarget.parent.exists(), (
395
+ f"\nTesting: `writePython(..., {pathFilenameTarget})`\n"
396
+ f"Expected: Parent directory {pathFilenameTarget.parent} to exist\n"
397
+ f"Got: exists={pathFilenameTarget.parent.exists()}"
398
+ )
399
+
400
+
401
+ @pytest.mark.parametrize(
402
+ "pythonSourceTarget, expectedContainsImport",
403
+ [
404
+ ("import math\n\nvaluePrime = math.sqrt(41)\n", "import math"),
405
+ ("from os import getcwd\n\nvalueSequence = getcwd()\n", "from os import getcwd"),
406
+ ("import sys\n\nvalueFibonacci = sys.version\n", "import sys"),
407
+ ]
408
+ )
409
+ def testWritePythonPreservesUsedImports(
410
+ pathTmpTesting: pathlib.Path,
411
+ pythonSourceTarget: str,
412
+ expectedContainsImport: str
413
+ ) -> None:
414
+ """Test that writePython preserves imports that are actually used in the code."""
415
+ pathFilenameTarget = pathTmpTesting / "preservedImports.py"
416
+ writePython(pythonSourceTarget, pathFilenameTarget)
417
+
418
+ contentActual = pathFilenameTarget.read_text(encoding="utf-8")
419
+ assert expectedContainsImport in contentActual, (
420
+ f"\nTesting: `writePython(...)` preserves used imports\n"
421
+ f"Expected content to contain: {expectedContainsImport}\n"
422
+ f"Got content:\n{contentActual}"
423
+ )
424
+
425
+
426
+ @pytest.mark.parametrize(
427
+ "pythonSourceTarget, expectedNotContainsImport",
428
+ [
429
+ ("import math\nimport unused\n\nvaluePrime = 43\n", "import unused"),
430
+ ("from os import getcwd, unused\n\nvalueSequence = getcwd()\n", "unused"),
431
+ ("import sys\nimport collections\n\nvalueFibonacci = sys.version\n", "import collections"),
432
+ ]
433
+ )
434
+ def testWritePythonRemovesUnusedImports(
435
+ pathTmpTesting: pathlib.Path,
436
+ pythonSourceTarget: str,
437
+ expectedNotContainsImport: str
438
+ ) -> None:
439
+ """Test that writePython removes imports that are not used in the code."""
440
+ pathFilenameTarget = pathTmpTesting / "removedImports.py"
441
+ writePython(pythonSourceTarget, pathFilenameTarget)
442
+
443
+ contentActual = pathFilenameTarget.read_text(encoding="utf-8")
444
+ assert expectedNotContainsImport not in contentActual, (
445
+ f"\nTesting: `writePython(...)` removes unused imports\n"
446
+ f"Expected content to NOT contain: {expectedNotContainsImport}\n"
447
+ f"Got content:\n{contentActual}"
448
+ )
449
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hunterMakesPy
3
- Version: 0.2.4
3
+ Version: 0.3.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
@@ -9,7 +9,7 @@ Project-URL: Homepage, https://github.com/hunterhogan/hunterMakesPy
9
9
  Project-URL: Issues, https://github.com/hunterhogan/hunterMakesPy/issues
10
10
  Project-URL: Repository, https://github.com/hunterhogan/hunterMakesPy
11
11
  Keywords: attribute loading,concurrency limit,configuration,defensive programming,dictionary merging,directory creation,dynamic import,error propagation,file system utilities,input validation,integer parsing,module loading,nested data structures,package settings,parameter validation,pytest,string extraction,test utilities
12
- Classifier: Development Status :: 4 - Beta
12
+ Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Framework :: Pytest
15
15
  Classifier: Intended Audience :: Developers
@@ -30,12 +30,12 @@ Classifier: Typing :: Typed
30
30
  Requires-Python: >=3.11
31
31
  Description-Content-Type: text/markdown
32
32
  License-File: LICENSE
33
+ Requires-Dist: autoflake
33
34
  Requires-Dist: charset_normalizer
35
+ Requires-Dist: isort
34
36
  Requires-Dist: more_itertools
35
37
  Requires-Dist: numpy
36
38
  Provides-Extra: development
37
- Requires-Dist: mypy; extra == "development"
38
- Requires-Dist: pyupgrade; extra == "development"
39
39
  Requires-Dist: setuptools-scm; extra == "development"
40
40
  Provides-Extra: testing
41
41
  Requires-Dist: pytest; extra == "testing"
@@ -164,13 +164,4 @@ def test_myFunction(nameOfTest, callablePytest):
164
164
  [![Static Badge](https://img.shields.io/badge/2011_August-Homeless_since-blue?style=flat)](https://HunterThinks.com/support)
165
165
  [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UC3Gx7kz61009NbhpRtPP7tw)](https://www.youtube.com/@HunterHogan)
166
166
 
167
- ## How to code
168
-
169
- Coding One Step at a Time:
170
-
171
- 0. WRITE CODE.
172
- 1. Don't write stupid code that's hard to revise.
173
- 2. Write good code.
174
- 3. When revising, write better code.
175
-
176
167
  [![CC-BY-NC-4.0](https://github.com/hunterhogan/hunterMakesPy/blob/main/CC-BY-NC-4.0.png)](https://creativecommons.org/licenses/by-nc/4.0/)
@@ -1,10 +1,10 @@
1
+ autoflake
1
2
  charset_normalizer
3
+ isort
2
4
  more_itertools
3
5
  numpy
4
6
 
5
7
  [development]
6
- mypy
7
- pyupgrade
8
8
  setuptools-scm
9
9
 
10
10
  [testing]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hunterMakesPy"
3
- version = "0.2.4"
3
+ version = "0.3.0"
4
4
  description = "Easy Python functions making making functional Python functions easier."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -27,7 +27,7 @@ keywords = [
27
27
  "test utilities",
28
28
  ]
29
29
  classifiers = [
30
- "Development Status :: 4 - Beta",
30
+ "Development Status :: 5 - Production/Stable",
31
31
  "Environment :: Console",
32
32
  "Framework :: Pytest",
33
33
  "Intended Audience :: Developers",
@@ -48,13 +48,13 @@ classifiers = [
48
48
  ]
49
49
  urls = { Donate = "https://www.patreon.com/integrated", Homepage = "https://github.com/hunterhogan/hunterMakesPy", Issues = "https://github.com/hunterhogan/hunterMakesPy/issues", Repository = "https://github.com/hunterhogan/hunterMakesPy" }
50
50
  dependencies = [
51
+ "autoflake",
51
52
  "charset_normalizer",
53
+ "isort",
52
54
  "more_itertools",
53
55
  "numpy",
54
56
  ]
55
57
  optional-dependencies = { development = [
56
- "mypy",
57
- "pyupgrade",
58
58
  "setuptools-scm",
59
59
  ], testing = [
60
60
  "pytest",
File without changes
File without changes