winipedia-utils 0.2.10__py3-none-any.whl → 0.2.17__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.

Potentially problematic release.


This version of winipedia-utils might be problematic. Click here for more details.

Files changed (69) hide show
  1. winipedia_utils/concurrent/concurrent.py +245 -245
  2. winipedia_utils/concurrent/multiprocessing.py +130 -130
  3. winipedia_utils/concurrent/multithreading.py +93 -93
  4. winipedia_utils/consts.py +21 -21
  5. winipedia_utils/data/__init__.py +1 -1
  6. winipedia_utils/data/dataframe/__init__.py +1 -1
  7. winipedia_utils/data/dataframe/cleaning.py +378 -378
  8. winipedia_utils/data/structures/__init__.py +1 -1
  9. winipedia_utils/data/structures/dicts.py +16 -16
  10. winipedia_utils/git/__init__.py +1 -1
  11. winipedia_utils/git/gitignore/__init__.py +1 -1
  12. winipedia_utils/git/gitignore/gitignore.py +136 -136
  13. winipedia_utils/git/pre_commit/__init__.py +1 -1
  14. winipedia_utils/git/pre_commit/config.py +70 -70
  15. winipedia_utils/git/pre_commit/hooks.py +127 -109
  16. winipedia_utils/git/pre_commit/run_hooks.py +49 -49
  17. winipedia_utils/iterating/__init__.py +1 -1
  18. winipedia_utils/iterating/iterate.py +29 -29
  19. winipedia_utils/logging/ansi.py +6 -6
  20. winipedia_utils/logging/config.py +64 -64
  21. winipedia_utils/logging/logger.py +26 -26
  22. winipedia_utils/modules/class_.py +119 -119
  23. winipedia_utils/modules/function.py +101 -101
  24. winipedia_utils/modules/module.py +379 -379
  25. winipedia_utils/modules/package.py +390 -390
  26. winipedia_utils/oop/mixins/meta.py +333 -333
  27. winipedia_utils/oop/mixins/mixin.py +37 -37
  28. winipedia_utils/os/__init__.py +1 -1
  29. winipedia_utils/os/os.py +63 -63
  30. winipedia_utils/projects/__init__.py +1 -1
  31. winipedia_utils/projects/poetry/__init__.py +1 -1
  32. winipedia_utils/projects/poetry/config.py +117 -117
  33. winipedia_utils/projects/poetry/poetry.py +31 -31
  34. winipedia_utils/projects/project.py +48 -48
  35. winipedia_utils/resources/__init__.py +1 -1
  36. winipedia_utils/resources/svgs/__init__.py +1 -1
  37. winipedia_utils/resources/svgs/download_arrow.svg +2 -2
  38. winipedia_utils/resources/svgs/exit_fullscreen_icon.svg +5 -5
  39. winipedia_utils/resources/svgs/fullscreen_icon.svg +2 -2
  40. winipedia_utils/resources/svgs/menu_icon.svg +3 -3
  41. winipedia_utils/resources/svgs/pause_icon.svg +3 -3
  42. winipedia_utils/resources/svgs/play_icon.svg +16 -16
  43. winipedia_utils/resources/svgs/plus_icon.svg +23 -23
  44. winipedia_utils/resources/svgs/svg.py +15 -15
  45. winipedia_utils/security/__init__.py +1 -1
  46. winipedia_utils/security/cryptography.py +29 -29
  47. winipedia_utils/security/keyring.py +70 -70
  48. winipedia_utils/setup.py +47 -47
  49. winipedia_utils/testing/assertions.py +23 -23
  50. winipedia_utils/testing/convention.py +177 -177
  51. winipedia_utils/testing/create_tests.py +297 -297
  52. winipedia_utils/testing/fixtures.py +28 -28
  53. winipedia_utils/testing/tests/base/fixtures/__init__.py +1 -1
  54. winipedia_utils/testing/tests/base/fixtures/fixture.py +6 -6
  55. winipedia_utils/testing/tests/base/fixtures/scopes/class_.py +33 -33
  56. winipedia_utils/testing/tests/base/fixtures/scopes/function.py +7 -7
  57. winipedia_utils/testing/tests/base/fixtures/scopes/module.py +33 -33
  58. winipedia_utils/testing/tests/base/fixtures/scopes/package.py +7 -7
  59. winipedia_utils/testing/tests/base/fixtures/scopes/session.py +296 -296
  60. winipedia_utils/testing/tests/base/utils/utils.py +111 -111
  61. winipedia_utils/testing/tests/conftest.py +32 -32
  62. winipedia_utils/text/string.py +126 -126
  63. winipedia_utils-0.2.17.dist-info/METADATA +716 -0
  64. winipedia_utils-0.2.17.dist-info/RECORD +80 -0
  65. {winipedia_utils-0.2.10.dist-info → winipedia_utils-0.2.17.dist-info}/licenses/LICENSE +21 -21
  66. winipedia_utils/testing/tests/test_0.py +0 -8
  67. winipedia_utils-0.2.10.dist-info/METADATA +0 -355
  68. winipedia_utils-0.2.10.dist-info/RECORD +0 -81
  69. {winipedia_utils-0.2.10.dist-info → winipedia_utils-0.2.17.dist-info}/WHEEL +0 -0
@@ -0,0 +1,80 @@
1
+ winipedia_utils/__init__.py,sha256=vOWZ8n-YemVIzDLd8eWw1HVPGH3jxuT6VtDKHbmxk_A,43
2
+ winipedia_utils/concurrent/__init__.py,sha256=Tu0ig4gVCk_f1n74G35hDwH-WS3P3STVQGWjxTIbbo8,54
3
+ winipedia_utils/concurrent/concurrent.py,sha256=b-el36KyB1cT23Fog9Ix1TT386XF9iWahsRTX5N19TM,8521
4
+ winipedia_utils/concurrent/multiprocessing.py,sha256=P1dgiooms-PH7ZLei9MgGyjpSdgMG5yvhFflAAvCNew,4726
5
+ winipedia_utils/concurrent/multithreading.py,sha256=Fuc4qWECvOk2y2jPQW-XN3p-5NLvBvNBpVglk4mpEH4,3084
6
+ winipedia_utils/consts.py,sha256=LHw5hc5ILuu3AIxaB0cJxRtZzeOi75h0FDS0Ymcfuug,476
7
+ winipedia_utils/data/__init__.py,sha256=o6SXX1gBCwhb9abo8xTfZtqUNuLqXmdo2VervnJxRzc,48
8
+ winipedia_utils/data/dataframe/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
9
+ winipedia_utils/data/dataframe/cleaning.py,sha256=iZC6AI2Di6nLwb_A698JCoeT4221Rd8WpzfZwbzZuM8,13261
10
+ winipedia_utils/data/structures/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
11
+ winipedia_utils/data/structures/dicts.py,sha256=jsFzQ96cvyHsvPSnsEUhksuWvLSGq6-Rryfw6gEXq-c,274
12
+ winipedia_utils/git/__init__.py,sha256=IRmEVz0sUEw47Eli--57YaypWitxlcYThT_ulwkhNTE,47
13
+ winipedia_utils/git/gitignore/__init__.py,sha256=k-2E26JaZPkF69UUOJkpQl8T_PudrC7EYCIOxwgIQVU,57
14
+ winipedia_utils/git/gitignore/gitignore.py,sha256=PoXPA2F1mptirwhTXgv-iC_ivQReAWqNpHDEaFAmPkE,4376
15
+ winipedia_utils/git/pre_commit/__init__.py,sha256=gFLVGQRmS6abgy5MfPQy_GZiF1_hGxuXtcOHX95WL-A,58
16
+ winipedia_utils/git/pre_commit/config.py,sha256=HNThJhfA15erOLWNIaOMJN7z6uSGbpNbpFewSvK4qKQ,2262
17
+ winipedia_utils/git/pre_commit/hooks.py,sha256=qBGZa4Gdp6E9Yqhd0boo2SZjDAK2Gzs0QZb7MTc76mg,3657
18
+ winipedia_utils/git/pre_commit/run_hooks.py,sha256=HFsomU-KV89gVLAzmHtLnwekldO8vpTX3Nmmp-aJc0g,1523
19
+ winipedia_utils/iterating/__init__.py,sha256=rlF9hzxbowq5yOfcXvOKOQdB-EQmfrislQpf659Zeu4,53
20
+ winipedia_utils/iterating/iterate.py,sha256=fP0cgEOmmwqt5wg6v61Kw3Jx9TtE8bC_a2jVd270NCM,944
21
+ winipedia_utils/logging/__init__.py,sha256=AMt1LwA_E7hexYjMpGzUempoyDdAF-dowWvq59wC5aM,51
22
+ winipedia_utils/logging/ansi.py,sha256=7Z-FITaUn5B1ZE0OUVARjNzuMui1V36iu4YTjlD6QfI,101
23
+ winipedia_utils/logging/config.py,sha256=sdC3GHMkJqlY-WwIsOMeTcy1bihthWV2LbvxLt9dhc4,2895
24
+ winipedia_utils/logging/logger.py,sha256=NluvfRpY4SfJi6URjfV52l3cxeUYFMeCAJULK_PQXpQ,701
25
+ winipedia_utils/modules/__init__.py,sha256=e3CFaC3FhK4ibknFOv1bqOZxA7XeVwmLqWX7oajUm78,51
26
+ winipedia_utils/modules/class_.py,sha256=8-CS_x3mPaed39Cvo93ZnOQGLU2tndqxbIUlkQ_FAIM,3577
27
+ winipedia_utils/modules/function.py,sha256=9evE45wtUaEWQ23rZ0HqFZ0nZw5JTpse6ebcWJAQYRI,2827
28
+ winipedia_utils/modules/module.py,sha256=B2BLh-GVapSCBWc8Hx1U8jEN-yWVuGJls8LThVp8BTs,13041
29
+ winipedia_utils/modules/package.py,sha256=S-pysPGIXW4JCGPhgO7Z1iU0gZb-_23opodb-zQLq5E,13058
30
+ winipedia_utils/oop/__init__.py,sha256=wGjsVwLbTVEQWOfDJvN9nlvC-3NmAi8Doc2xIrm6e78,47
31
+ winipedia_utils/oop/mixins/__init__.py,sha256=PDK-cJcdRUfDUCz36qQ5pmMW07G133WtN49OpmILGNI,54
32
+ winipedia_utils/oop/mixins/meta.py,sha256=0G4CzzzCoeP1Eas3vWe-uxvB5n5ncyw7Wc-sI9zmEBc,11150
33
+ winipedia_utils/oop/mixins/mixin.py,sha256=S5y1IVRtkghxV7y0ttdmSYO439NHChRIFTOwlK7kmTo,1401
34
+ winipedia_utils/os/__init__.py,sha256=cBRq8hWhaWvYeC3cSBYL6Y70kM9COQWHj8vVxxSadIg,46
35
+ winipedia_utils/os/os.py,sha256=K_5FD1sC1h5aSdtqXAG0uq90sSweLYLkgkRPQS0Jfxg,1768
36
+ winipedia_utils/projects/__init__.py,sha256=_iYHzUcTPmutpsExPDcMF9OQDgnz-kTSuWens9iP9bI,52
37
+ winipedia_utils/projects/poetry/__init__.py,sha256=tbvV3wYd3H39hjjlKbF84Irj4hYgv1A7KWyXdCQzFro,59
38
+ winipedia_utils/projects/poetry/config.py,sha256=8QTsTh3kgmINufELAxnIIM61mYk3AfPlb2EzVAreavk,3724
39
+ winipedia_utils/projects/poetry/poetry.py,sha256=UiLTnmqzfeZV79ffHEnwHRNEI-bi6tMkdnmhZH5GrTg,934
40
+ winipedia_utils/projects/project.py,sha256=oRIzF2HT1mkgnOhbgfi9_Bb2Ga3oNi_Ru7a1rbySvyQ,1539
41
+ winipedia_utils/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
42
+ winipedia_utils/resources/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
43
+ winipedia_utils/resources/svgs/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
44
+ winipedia_utils/resources/svgs/delete_garbage_can.svg,sha256=UxEEh46w1JD4VViUBx-Ahaq5_ZR4zOjfeJn5_aM8114,318
45
+ winipedia_utils/resources/svgs/download_arrow.svg,sha256=8g_cBwKFHyoeSmaLMXcGwIHT4_rZDDtDGm35E0PkniE,242
46
+ winipedia_utils/resources/svgs/exit_fullscreen_icon.svg,sha256=sZSexEjab82zhAK3JRtOWH19aAFa1GhuGLChDz9wFFc,523
47
+ winipedia_utils/resources/svgs/fullscreen_icon.svg,sha256=mm2n6WvaSu0OqiQSAw0QPNwzXpPLaF53_XAklUfQQPo,406
48
+ winipedia_utils/resources/svgs/menu_icon.svg,sha256=pA1Z_x5gDkhYLQA0dL0l_8uBP-e6mKLcEOYwlhURUv4,344
49
+ winipedia_utils/resources/svgs/pause_icon.svg,sha256=z-Cj3DOI0rwRbWCOhaiHtDQYM4s6OgkCBVcdip77rQE,179
50
+ winipedia_utils/resources/svgs/play_icon.svg,sha256=7gx1EWZnyu1pA6WboAfVH3OGcp_uYPpT1syqHe-jaGE,953
51
+ winipedia_utils/resources/svgs/plus_icon.svg,sha256=1ucedu8ucLI7LMNsfNN2GYiwNUe8-ViNBcanDwzTqHc,552
52
+ winipedia_utils/resources/svgs/svg.py,sha256=uzlp4Rhnenvkq_YI409ZvR7JMTZmB5JpKsDBOvPNr0I,415
53
+ winipedia_utils/security/__init__.py,sha256=HmGXOCROqIGHlBs2bEWRMkEX3rlXNsnA9Tef58AlCo4,52
54
+ winipedia_utils/security/cryptography.py,sha256=5LMat3-9nDW2cQBr_dU7MFRdgbiK53zQqHyacs-Jq-s,793
55
+ winipedia_utils/security/keyring.py,sha256=6kKgSTz1G80F6XeZ3Lskxdl2N6JgUH8gJdFYcGJuysU,2273
56
+ winipedia_utils/setup.py,sha256=GIniddS2gqSV5wYZUkuI2hC7esEChnWA3SyMFYB48Ms,1603
57
+ winipedia_utils/testing/__init__.py,sha256=kXhB5xw02ec5xpcW_KV--9CBKdyCjnuR-NZzAJ5tq0g,51
58
+ winipedia_utils/testing/assertions.py,sha256=WUJwIkPyRduiouqWQwk5-D_mF9ZU1Ffw0q4790lbKnI,828
59
+ winipedia_utils/testing/convention.py,sha256=7vurpqS--awhN_FLSOviSKENGuFyY9Ejr1NKRm0MPsg,4833
60
+ winipedia_utils/testing/create_tests.py,sha256=bBVh2zfuGVgtJpPEc9JgvK3ol7sNz0_hZqh1_oY0ckw,9884
61
+ winipedia_utils/testing/fixtures.py,sha256=G8QIrZXndtud0uOk6PY3f8IIDoyX_ronogjeLAYGjrM,1033
62
+ winipedia_utils/testing/tests/__init__.py,sha256=kL-1O6lAO5j4JPOqPdi3dHdbOQ_UXcgPFppj82HhrRU,57
63
+ winipedia_utils/testing/tests/base/__init__.py,sha256=dBH1yfONmqUC49zshS6BJ4ZgEcw7iFGoFCqRmU7Vhrw,62
64
+ winipedia_utils/testing/tests/base/fixtures/__init__.py,sha256=Bs_HSqx8DcMb8yU1vNbgIEszOMNVnIW02C4tmDdHB8E,71
65
+ winipedia_utils/testing/tests/base/fixtures/fixture.py,sha256=KfCYXDXT-wfeuf9uiUugB4ZEWXBPuhQ-bRZ-pb99pCg,181
66
+ winipedia_utils/testing/tests/base/fixtures/scopes/__init__.py,sha256=-n_BLhTVC1oH7qVL0JYXm82zqFPgobQCojO-PirrKo0,78
67
+ winipedia_utils/testing/tests/base/fixtures/scopes/class_.py,sha256=zesyJxerjI3qDtIUuaEaXp2IBbmsDJYi07JQqK9yUsk,1100
68
+ winipedia_utils/testing/tests/base/fixtures/scopes/function.py,sha256=l1zCCiTkXUSZp0n9QOyejhfszFJiMH88bhGMwNY5r8A,302
69
+ winipedia_utils/testing/tests/base/fixtures/scopes/module.py,sha256=jzr4D6x82xvbCt8x7Han6pDOg27kEiPZf-oPfx2jHN0,1195
70
+ winipedia_utils/testing/tests/base/fixtures/scopes/package.py,sha256=pR3so6QPymIRM4PJTODrlBKI-yQnZ2P78BsiyTPaF8o,302
71
+ winipedia_utils/testing/tests/base/fixtures/scopes/session.py,sha256=uLvqjIWRXCnqD4L4cgzqLJI9hZEETKlE1YW7cJRpH5g,9805
72
+ winipedia_utils/testing/tests/base/utils/__init__.py,sha256=mC-8dCkp8xarqkQu2QQLrPjHi6Ww9hcixWdHeQHWeRs,68
73
+ winipedia_utils/testing/tests/base/utils/utils.py,sha256=3c_SNbzjkQypzsc-BONo5C1-Vb7pgbRl6uR6DmTGJRg,3456
74
+ winipedia_utils/testing/tests/conftest.py,sha256=BLgUJtLecOwuEsIyJ__0buqovd5AhiGvbMNk8CHgSQs,888
75
+ winipedia_utils/text/__init__.py,sha256=j2bwtK6kyeHI6SnoBjpRju0C1W2n2paXBDlNjNtaUxA,48
76
+ winipedia_utils/text/string.py,sha256=yXmwOab5hXyVQG1NwlWDpy2prj0U7Vb2F5HKLT2Y77Q,3382
77
+ winipedia_utils-0.2.17.dist-info/METADATA,sha256=oWT6WLbVHY6zcui7EGYGg3Pc5Y3bB68ye7qfhOkbIWg,19905
78
+ winipedia_utils-0.2.17.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
79
+ winipedia_utils-0.2.17.dist-info/licenses/LICENSE,sha256=o316mE2gGzd__JT69p7S_zlOmKiHh8YjpImCCcWyTvM,1066
80
+ winipedia_utils-0.2.17.dist-info/RECORD,,
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Winipedia
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Winipedia
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,8 +0,0 @@
1
- """Contains an empty test."""
2
-
3
-
4
- def test_0() -> None:
5
- """Empty test.
6
-
7
- Exists so that when no tests are written yet the base fixtures are executed.
8
- """
@@ -1,355 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: winipedia-utils
3
- Version: 0.2.10
4
- Summary: A package with many utility functions
5
- License-Expression: MIT
6
- License-File: LICENSE
7
- Author: Winipedia
8
- Author-email: win.steveker@gmx.de
9
- Requires-Python: >=3.12
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.12
12
- Classifier: Programming Language :: Python :: 3.13
13
- Classifier: Programming Language :: Python :: 3.14
14
- Requires-Dist: cryptography (>=45.0.5,<46.0.0)
15
- Requires-Dist: defusedxml (>=0.7.1,<0.8.0)
16
- Requires-Dist: keyring (>=25.6.0,<26.0.0)
17
- Requires-Dist: pathspec (>=0.12.1,<0.13.0)
18
- Requires-Dist: polars (>=1.34.0,<2.0.0)
19
- Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
20
- Requires-Dist: setuptools (>=80.3.1,<81.0.0)
21
- Requires-Dist: tomlkit (>=0.13.2,<0.14.0)
22
- Requires-Dist: tqdm (>=4.67.1,<5.0.0)
23
- Description-Content-Type: text/markdown
24
-
25
- # Winipedia Utils
26
-
27
- [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
28
- [![Poetry](https://img.shields.io/badge/dependency%20management-poetry-blue.svg)](https://python-poetry.org/)
29
- [![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff)
30
- [![Type checked: mypy](https://img.shields.io/badge/type%20checked-mypy-blue.svg)](https://mypy-lang.org/)
31
- [![Security: bandit](https://img.shields.io/badge/security-bandit-yellow.svg)](https://bandit.readthedocs.io/)
32
-
33
- A comprehensive Python utility ecosystem designed to scale into an all-in-one toolkit for Python development. Winipedia Utils provides battle-tested utilities for Django, dataframes, strings, concurrent processing, iterating, and any other tools needed for full Python projects, while enforcing clean code practices through automated tooling.
34
-
35
- ## 🎯 Core Purpose
36
-
37
- Winipedia Utils serves as the **foundation for reducing repeated code** across Python projects while **enforcing clean code practices** through automated tooling. The project setup script automatically configures your development environment with industry best practices, ensuring consistent code quality across all your projects.
38
-
39
- ### Key Benefits
40
-
41
- - **🚀 Zero-configuration setup** - Complete development environment in one command
42
- - **🧪 Automated test generation** - 100% test coverage scaffolding for your entire codebase
43
- - **🔍 Quality assurance** - Automated linting, type checking, and security scanning
44
- - **📦 Comprehensive utilities** - Growing collection of production-ready utility functions
45
- - **🔄 Consistent standards** - Enforced code style and testing patterns across projects
46
-
47
- ## 🏗️ Some Implementation
48
-
49
- ### Project Setup & Automation
50
- - **Automated dependency installation** (ruff, mypy, pytest, bandit, pre-commit)
51
- - **Pre-commit hook configuration** for code quality enforcement
52
- - **pyproject.toml configuration** with optimal tool settings
53
- - **Complete development environment setup** in a single command
54
-
55
- ### Core Utility Modules
56
-
57
- #### 🧪 Testing Infrastructure (`testing/`)
58
- - **Automated test file generation** for entire codebases
59
- - **Test stub creation** for every function, class, and method
60
- - **Mirror test structure** maintaining 1:1 correspondence with source code
61
- - **Testing convention enforcement** with pytest integration
62
-
63
- #### 🔍 Module Introspection (`modules/`)
64
- - **Package discovery and manipulation** utilities
65
- - **Dynamic module creation and import** capabilities
66
- - **Code analysis and extraction** tools
67
- - **Python object introspection** and manipulation
68
-
69
- #### ⚡ Concurrent Processing (`concurrent/`)
70
- - **Multiprocessing utilities** with automatic worker optimization
71
- - **Multithreading support** for I/O-bound tasks
72
- - **Timeout handling** and process management
73
- - **Progress tracking** with tqdm integration
74
-
75
- #### 🌐 Django Utilities (`django/`)
76
- - **Bulk operations** with multithreaded processing for create, update, delete
77
- - **Advanced BaseCommand** with logging, validation, and common arguments
78
- - **Database utilities** including model hashing and topological sorting
79
- - **Model introspection** and dependency analysis tools
80
-
81
- #### 📊 Data Processing (`data/`)
82
- - **DataFrame utilities** for data manipulation and analysis
83
- - **Data cleaning and transformation** operations
84
- - **Aggregation and preprocessing** tools
85
-
86
- #### 🔄 Iterating Utilities (`iterating/`)
87
- - **Iterable manipulation** with safe length operations
88
- - **Generator utilities** and iteration helpers
89
- - **Collection processing** tools
90
-
91
- #### 📝 Text Processing (`text/`)
92
- - **String manipulation** utilities
93
- - **XML parsing** with security features
94
- - **Input handling** with timeout support
95
- - **Hash generation** and text truncation
96
-
97
- #### 🔧 Development Tools
98
- - **Git integration** (`git/`) - gitignore handling, pre-commit management
99
- - **Logging configuration** (`logging/`) - standardized logging setup
100
- - **OS utilities** (`os/`) - command finding, subprocess management
101
- - **OOP enhancements** (`oop/mixins/`) - advanced metaclasses and mixins
102
- - **Project configuration** (`projects/poetry/`) - Poetry integration and management
103
-
104
- ## 🚀 Installation & Quick Start
105
-
106
- ### Prerequisites
107
- - Python 3.12+
108
- - Poetry (for dependency management)
109
-
110
- ### Installation
111
-
112
- ```bash
113
- # Add to your project
114
- poetry add winipedia-utils
115
-
116
- # Run the setup script
117
- poetry run python -m winipedia_utils.setup
118
- ```
119
-
120
- ### What Happens During Setup
121
-
122
- The setup script automatically:
123
-
124
- 1. **Installs development dependencies**: ruff, mypy, pytest, bandit, pre-commit, and type stubs
125
- 2. **Configures pre-commit hooks**: Automated code quality checks on every commit
126
- 3. **Sets up pyproject.toml**: Optimal configurations for all development tools
127
- 4. **Generates comprehensive tests**: Creates test files for your entire codebase
128
- 5. **Runs initial quality checks**: Ensures everything is properly configured
129
-
130
- ```python
131
- # winipedia_utils/setup.py
132
- def _setup() -> None:
133
- """Set up the project."""
134
- _install_dev_dependencies() # Install quality tools
135
- _add_package_hook_to_pre_commit_config() # Configure pre-commit
136
- _add_tool_configurations_to_pyproject_toml() # Setup tool configs
137
- _run_all_hooks() # Generate tests & run checks
138
- logger.info("Setup complete!")
139
- ```
140
-
141
- ## 💡 Usage Examples
142
-
143
- ### Automated Test Generation
144
-
145
- ```python
146
- from winipedia_utils.testing.create_tests import create_tests
147
-
148
- # Automatically generate test files for your entire project
149
- create_tests()
150
- # Creates comprehensive test structure with stubs for every function/class
151
- ```
152
-
153
- ### Module Introspection
154
-
155
- ```python
156
- from winipedia_utils.modules.package import get_src_package, walk_package
157
- from winipedia_utils.modules.function import get_all_functions_from_module
158
-
159
- # Discover your main source package
160
- src_package = get_src_package()
161
-
162
- # Walk through all modules in a package
163
- for package, modules in walk_package(src_package):
164
- for module in modules:
165
- functions = get_all_functions_from_module(module)
166
- print(f"Found {len(functions)} functions in {module.__name__}")
167
- ```
168
-
169
- ### Concurrent Processing
170
-
171
- ```python
172
- from winipedia_utils.concurrent.multiprocessing import multiprocess_loop
173
- from winipedia_utils.concurrent.multithreading import multithread_loop
174
-
175
- # CPU-bound tasks with multiprocessing
176
- def cpu_intensive_task(data):
177
- return complex_calculation(data)
178
-
179
- results = multiprocess_loop(
180
- process_function=cpu_intensive_task,
181
- process_args=[[item] for item in large_dataset]
182
- )
183
-
184
- # I/O-bound tasks with multithreading
185
- def io_task(url):
186
- return fetch_data(url)
187
-
188
- results = multithread_loop(
189
- process_function=io_task,
190
- process_args=[[url] for url in urls]
191
- )
192
- ```
193
-
194
- ### Django Bulk Operations
195
-
196
- ```python
197
- from winipedia_utils.django.bulk import (
198
- bulk_create_in_steps,
199
- bulk_update_in_steps,
200
- bulk_delete_in_steps
201
- )
202
-
203
- # Efficient bulk creation with multithreading
204
- created_objects = bulk_create_in_steps(
205
- model=MyModel,
206
- bulk=[MyModel(name=f"item_{i}") for i in range(10000)],
207
- step=1000
208
- )
209
-
210
- # Bulk update with field specification
211
- updated_count = bulk_update_in_steps(
212
- model=MyModel,
213
- bulk=objects_to_update,
214
- update_fields=['name', 'status'],
215
- step=1000
216
- )
217
-
218
- # Safe bulk deletion with cascade handling
219
- deleted_count, deletion_summary = bulk_delete_in_steps(
220
- model=MyModel,
221
- bulk=objects_to_delete,
222
- step=1000
223
- )
224
- ```
225
-
226
- ### Django Management Commands
227
-
228
- ```python
229
- from winipedia_utils.django.command import ABCBaseCommand
230
-
231
- class MyCommand(ABCBaseCommand):
232
- """Custom Django command with built-in logging and validation."""
233
-
234
- help = "Process data with automatic logging and error handling"
235
-
236
- def add_command_arguments(self, parser):
237
- parser.add_argument('--batch-size', type=int, default=1000)
238
-
239
- def handle_command(self, *args, **options):
240
- # Command logic with automatic logging and performance tracking
241
- batch_size = options['batch_size']
242
- self.stdout.write(f"Processing with batch size: {batch_size}")
243
- ```
244
-
245
- ### String Utilities
246
-
247
- ```python
248
- from winipedia_utils.text.string import (
249
- value_to_truncated_string,
250
- ask_for_input_with_timeout,
251
- get_reusable_hash
252
- )
253
-
254
- # Safely truncate any value to string
255
- truncated = value_to_truncated_string(large_object, max_length=100)
256
-
257
- # Get user input with timeout
258
- try:
259
- user_input = ask_for_input_with_timeout("Enter value: ", timeout=30)
260
- except TimeoutError:
261
- print("Input timeout exceeded")
262
-
263
- # Generate consistent hashes
264
- hash_value = get_reusable_hash("some data")
265
- ```
266
-
267
- ### Iterating Utilities
268
-
269
- ```python
270
- from winipedia_utils.iterating.iterate import get_len_with_default
271
-
272
- # Safe length operations with fallback
273
- length = get_len_with_default(some_iterable, default=0)
274
-
275
- # Works with generators and other iterables that don't support len()
276
- gen = (x for x in range(100))
277
- safe_length = get_len_with_default(gen, default=100)
278
- ```
279
-
280
- ### Advanced OOP Features
281
-
282
- ```python
283
- from winipedia_utils.oop.mixins.meta import ABCImplementationLoggingMeta
284
-
285
- class MyClass(metaclass=ABCImplementationLoggingMeta):
286
- """Class with automatic logging and implementation enforcement."""
287
-
288
- def my_method(self):
289
- # Automatically logged with performance tracking
290
- return "result"
291
- ```
292
-
293
- ## 🔮 Future Vision
294
-
295
- Winipedia Utils is designed to scale into a comprehensive ecosystem covering many utilities
296
-
297
- ## 🛡️ Development Standards
298
-
299
- ### Automated Quality Assurance
300
-
301
- Every utility in the ecosystem benefits from:
302
-
303
- - **🧪 100% Test Coverage Scaffolding**: Automated test generation ensures no function goes untested
304
- - **🔍 Static Type Checking**: MyPy ensures type safety across all utilities
305
- - **🎨 Code Formatting**: Ruff enforces consistent code style
306
- - **🔒 Security Scanning**: Bandit identifies potential security issues
307
- - **📝 Documentation Standards**: Consistent docstring patterns and examples
308
-
309
- ### Pre-commit Hooks
310
-
311
- Automatically configured hooks ensure:
312
- - Code formatting with ruff
313
- - Type checking with mypy
314
- - Security scanning with bandit
315
- - Test generation and execution
316
- - Dependency validation
317
- See details in `winipedia_utils/git/pre_commit/hooks.py` and `winipedia_utils/git/pre_commit/run_hooks.py`
318
-
319
- ## 🏗️ Project Structure
320
-
321
- ```
322
- winipedia_utils/
323
- ├── concurrent/ # Parallel processing utilities
324
- ├── conventions/ # Testing and naming conventions
325
- ├── data/ # Data science utilities (expanding)
326
- ├── git/ # Git integration and workflows
327
- ├── logging/ # Standardized logging configuration
328
- ├── modules/ # Package/module introspection
329
- ├── oop/ # Object-oriented programming enhancements
330
- ├── os/ # Operating system utilities
331
- ├── projects/ # Project configuration (Poetry, etc.)
332
- ├── testing/ # Automated test generation
333
- ├── text/ # String and text processing
334
- └── setup.py # Main setup script
335
- ```
336
-
337
- ## 🤝 Contributing
338
-
339
- Winipedia Utils welcomes contributions! The automated setup ensures that all contributions maintain high quality standards:
340
-
341
- 1. Fork the repository
342
- 2. Run `poetry run python -m winipedia_utils.setup` in your fork
343
- 3. Add your utilities following the established patterns
344
- 4. Tests are automatically generated - implement the test logic
345
- 5. Pre-commit hooks ensure code quality
346
- 6. Submit a pull request
347
-
348
- ## 📄 License
349
-
350
- MIT License - see LICENSE file for details.
351
-
352
- ---
353
-
354
- **Note**: All `_private_methods` are intended for internal use within the winipedia_utils package and cannot be used directly in external projects.
355
-
@@ -1,81 +0,0 @@
1
- winipedia_utils/__init__.py,sha256=vOWZ8n-YemVIzDLd8eWw1HVPGH3jxuT6VtDKHbmxk_A,43
2
- winipedia_utils/concurrent/__init__.py,sha256=Tu0ig4gVCk_f1n74G35hDwH-WS3P3STVQGWjxTIbbo8,54
3
- winipedia_utils/concurrent/concurrent.py,sha256=CU90hqsdfQzxtiGSBiuqHd9JnRFCU1kaAoiQ42r_DA8,8766
4
- winipedia_utils/concurrent/multiprocessing.py,sha256=GUM9rVKDq-0ikBBIO6VF4UULwKG1lY_3aTMqp6fVoeI,4856
5
- winipedia_utils/concurrent/multithreading.py,sha256=myrHoSSc6UW86SdCz1OksQcAcq29-2Rk7fa1wTT89BM,3177
6
- winipedia_utils/consts.py,sha256=YCJAOKdWK8beerJD8iUTXAS-cGKyLVWr8AsW0M1M3kM,497
7
- winipedia_utils/data/__init__.py,sha256=9RZFoceil00La5TyNM1baF-fjfAKKV22auLSxvJ_QD0,49
8
- winipedia_utils/data/dataframe/__init__.py,sha256=p-maJQh7gYbXwhkqKU4wL6UNGzRAy988JP8_qLoTZDk,24
9
- winipedia_utils/data/dataframe/cleaning.py,sha256=9FYKax_Y2CMDmEh01C6zSFnXdOJ1mjWo4V6TLyxwhTI,13639
10
- winipedia_utils/data/structures/__init__.py,sha256=p-maJQh7gYbXwhkqKU4wL6UNGzRAy988JP8_qLoTZDk,24
11
- winipedia_utils/data/structures/dicts.py,sha256=reLUI-K5iQiA16u-wHLzn6GCCTUvh5SKvlRtVR8pqwM,290
12
- winipedia_utils/git/__init__.py,sha256=pPo5DDqaQkFim8L6x22DXjqthLnKAxLyXlXl7JXGUdw,48
13
- winipedia_utils/git/gitignore/__init__.py,sha256=t65uvpOaNvh7ICgwuJFRr7vS2nWfxzWUGIpnJs0_jzE,58
14
- winipedia_utils/git/gitignore/gitignore.py,sha256=wCU2lRztTFKQ7JrKnCqPLCsuVRjfx8wGfTy42BLgFJI,4512
15
- winipedia_utils/git/pre_commit/__init__.py,sha256=2sBe5nOqmm3qb8YjhZzE4tCHhqxWOZ6R2ECljSVG7i4,59
16
- winipedia_utils/git/pre_commit/config.py,sha256=bIncUO4et0B5XYPUlSJskl_8Lg6si45ALyM9cEVJpfU,2332
17
- winipedia_utils/git/pre_commit/hooks.py,sha256=Q6rXvbpUf9UasQ8vSBruoLA-wjm37jamvIUkXJ1B3FE,3210
18
- winipedia_utils/git/pre_commit/run_hooks.py,sha256=WoF1WDr07mS2GpKt0M-TpnuWfS0-Hwa4tP6z_9-JqlU,1572
19
- winipedia_utils/iterating/__init__.py,sha256=TZ0SSFA3zCJLk0z3IsLMxJqsfGzfxOSUKbQmwW-Dsqg,54
20
- winipedia_utils/iterating/iterate.py,sha256=IpV710BS5fBPSzwZTTJLUqEhSHT-gmnQxMg3uEt85CA,973
21
- winipedia_utils/logging/__init__.py,sha256=AMt1LwA_E7hexYjMpGzUempoyDdAF-dowWvq59wC5aM,51
22
- winipedia_utils/logging/ansi.py,sha256=54MIYKppssv-TBFavOAi28aCo4Cg--cChTzdjGsBXJY,107
23
- winipedia_utils/logging/config.py,sha256=NAXCxVRkEfkf119HCg1zrdP1l37DW4cFDHvKrBEjQ0o,2959
24
- winipedia_utils/logging/logger.py,sha256=tCcUwAVLVr3Bec7_i-SoKvBPNCJSEmyuvBW2gbqjPMk,727
25
- winipedia_utils/modules/__init__.py,sha256=e3CFaC3FhK4ibknFOv1bqOZxA7XeVwmLqWX7oajUm78,51
26
- winipedia_utils/modules/class_.py,sha256=fe0czYVM-UWGVcv6YdiP6SfMfX1asb7HeiWp1yLJVbA,3696
27
- winipedia_utils/modules/function.py,sha256=h9GvY0UHMOxE751uh62YG6Eek9YDA6Cav5iBXQS_2FI,2928
28
- winipedia_utils/modules/module.py,sha256=UHgkiCkpFjrUrdjBd_U1oyDOJK4ikPHxs8P-0ykPk5M,13420
29
- winipedia_utils/modules/package.py,sha256=izu5OUnPP6xkn9uwS1itJIxXOn6Qg6DUdy8aFCnuuAg,13448
30
- winipedia_utils/oop/__init__.py,sha256=wGjsVwLbTVEQWOfDJvN9nlvC-3NmAi8Doc2xIrm6e78,47
31
- winipedia_utils/oop/mixins/__init__.py,sha256=PDK-cJcdRUfDUCz36qQ5pmMW07G133WtN49OpmILGNI,54
32
- winipedia_utils/oop/mixins/meta.py,sha256=kkWfIpp2iHSk544CuOGWOHCb3ON_OmwcgOw4jxYckEc,11483
33
- winipedia_utils/oop/mixins/mixin.py,sha256=sFImqDFX0TtdAAYHgepVT_UqJ50juvDdwGG9vMNa3PE,1438
34
- winipedia_utils/os/__init__.py,sha256=WSLt7tb6HqWRlCGGIEwRfVksF0sLJNeEW3iZeJhGWk0,47
35
- winipedia_utils/os/os.py,sha256=CXPVnagfj3dXlc8OIv1DirJpin8oaGXWetnmx2lULE4,1831
36
- winipedia_utils/projects/__init__.py,sha256=6oTiSlUMAwO5xnH4SGVnvspzKcxrxo9kn1L4xkjq1p8,53
37
- winipedia_utils/projects/poetry/__init__.py,sha256=0yNMuu9KmM19od4VBxBV3HLK-RdCsa0e2Zhg33J7RmQ,60
38
- winipedia_utils/projects/poetry/config.py,sha256=EzCYL21rlddVG4lI_USXo1M4Jk9w4sBNva_U_IdueCE,3841
39
- winipedia_utils/projects/poetry/poetry.py,sha256=QoQ-b8NgMiWaqq85gs2HZh_436VpNqKzGogrWPS5DrU,965
40
- winipedia_utils/projects/project.py,sha256=2nz1Hh51A-shjgdPCgiDw-ODrVtOtiHEHQnMPjAJZ-A,1587
41
- winipedia_utils/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
42
- winipedia_utils/resources/__init__.py,sha256=p-maJQh7gYbXwhkqKU4wL6UNGzRAy988JP8_qLoTZDk,24
43
- winipedia_utils/resources/svgs/__init__.py,sha256=p-maJQh7gYbXwhkqKU4wL6UNGzRAy988JP8_qLoTZDk,24
44
- winipedia_utils/resources/svgs/delete_garbage_can.svg,sha256=UxEEh46w1JD4VViUBx-Ahaq5_ZR4zOjfeJn5_aM8114,318
45
- winipedia_utils/resources/svgs/download_arrow.svg,sha256=R5WNz0JOxkRi5LOuDtc_eZESZN4W0JAuvr-5_ZRqeks,244
46
- winipedia_utils/resources/svgs/exit_fullscreen_icon.svg,sha256=4wpP-pWg7z4c62c9MGUcU-rWcRVUEBSl1fGiJ1HDR3g,528
47
- winipedia_utils/resources/svgs/fullscreen_icon.svg,sha256=nN4Y5CA7AuwOvyhgtJWZtBT5uSzO7NFJivVRFNqooe0,408
48
- winipedia_utils/resources/svgs/menu_icon.svg,sha256=HDhjlCfkcZe9hNeSERhuOXvhmKzusuhSL1Poe6vMypg,347
49
- winipedia_utils/resources/svgs/pause_icon.svg,sha256=mNrEoAOhbvxsJmBg4xZ08kdahAG6gA4LqmHXYNOOKB0,182
50
- winipedia_utils/resources/svgs/play_icon.svg,sha256=9X7nBxFdJRKmvt6xKZx8WdYZPL7WgxZVG4cp3Xb1sKA,969
51
- winipedia_utils/resources/svgs/plus_icon.svg,sha256=CHjIzOUbDH4xHlwX5MbTsdL0HnkuMg3DHv1t0WHJSg0,575
52
- winipedia_utils/resources/svgs/svg.py,sha256=-Dw6m7cm9CHT2076oZIMx7kTQw0v_ifJajXzWcpUtI0,430
53
- winipedia_utils/security/__init__.py,sha256=ZBa72J6MNtYumBFMoVc0ia4jsoS7oNgjaTCW0xDb6EI,53
54
- winipedia_utils/security/cryptography.py,sha256=zfxSDo7aE9ecmZNC6URMSEUYRpOuJ1iESg-WCSS5HP0,822
55
- winipedia_utils/security/keyring.py,sha256=AKpIGRh7RAWzzdIjTLZRXndxgbsX5DJxdHaRk40zw7o,2343
56
- winipedia_utils/setup.py,sha256=F4NneO0wVTf7JCXLorWjTOdJl36N5fLSksoWMe4p86o,1650
57
- winipedia_utils/testing/__init__.py,sha256=kXhB5xw02ec5xpcW_KV--9CBKdyCjnuR-NZzAJ5tq0g,51
58
- winipedia_utils/testing/assertions.py,sha256=0JF4mqVTnLQ1qkAL_FuTwyN_idr00rvVlta7aDdnUXA,851
59
- winipedia_utils/testing/convention.py,sha256=NxC_hYaUXshsa6LL6nQoEEKpTzC1KwTloKL8aS2gUPI,5010
60
- winipedia_utils/testing/create_tests.py,sha256=WYxpLFmdLsWjJDxLitmWPcbfv5LDSKp2GsuNuLkzg2A,10181
61
- winipedia_utils/testing/fixtures.py,sha256=e0ax1n1zqzmLawA26k0EtNa3rYSMu10lMNVRjBuIGMs,1061
62
- winipedia_utils/testing/tests/__init__.py,sha256=kL-1O6lAO5j4JPOqPdi3dHdbOQ_UXcgPFppj82HhrRU,57
63
- winipedia_utils/testing/tests/base/__init__.py,sha256=dBH1yfONmqUC49zshS6BJ4ZgEcw7iFGoFCqRmU7Vhrw,62
64
- winipedia_utils/testing/tests/base/fixtures/__init__.py,sha256=CeRM8RSAA1UnH81OI09ZgGWxryUDvDz6gSahGa-U2hI,72
65
- winipedia_utils/testing/tests/base/fixtures/fixture.py,sha256=-MHvMCwLJwJrkie7fgVIhFA_nt-fp0-KfiisERcHb_E,187
66
- winipedia_utils/testing/tests/base/fixtures/scopes/__init__.py,sha256=-n_BLhTVC1oH7qVL0JYXm82zqFPgobQCojO-PirrKo0,78
67
- winipedia_utils/testing/tests/base/fixtures/scopes/class_.py,sha256=XCx4HZeHbJJ-C7wGsi5bQx7nPGTuAI3xhHp1FpGeom8,1133
68
- winipedia_utils/testing/tests/base/fixtures/scopes/function.py,sha256=5dW7-IPqJ_3Q2j1vftZL5FYKvNSKufqiHzLTTWYhja4,309
69
- winipedia_utils/testing/tests/base/fixtures/scopes/module.py,sha256=E-vUOnXIHWWynnFhzglKp6T-qcdMG63oY9p5rMTxbyo,1228
70
- winipedia_utils/testing/tests/base/fixtures/scopes/package.py,sha256=IKOfj6vfyjEQdRV5cJoPRQvALmePpGxWkGy23di00-w,309
71
- winipedia_utils/testing/tests/base/fixtures/scopes/session.py,sha256=aarxA_ElCZ0wNq3L1WG9PmGXfIEn1G7_785rosTYkUw,10101
72
- winipedia_utils/testing/tests/base/utils/__init__.py,sha256=mC-8dCkp8xarqkQu2QQLrPjHi6Ww9hcixWdHeQHWeRs,68
73
- winipedia_utils/testing/tests/base/utils/utils.py,sha256=h1n7USp8NRC6rbC-O_Z7YGi96lq1nEPjb-S_T0Ry8fE,3567
74
- winipedia_utils/testing/tests/conftest.py,sha256=8RounBlI8Jq1aLaLNpv84MW4ne8Qq0aavQextDOp5ng,920
75
- winipedia_utils/testing/tests/test_0.py,sha256=vWPpuYk_VY8_RLFQtd9RXFifOBndf1NOOGop4DSA_1A,171
76
- winipedia_utils/text/__init__.py,sha256=j2bwtK6kyeHI6SnoBjpRju0C1W2n2paXBDlNjNtaUxA,48
77
- winipedia_utils/text/string.py,sha256=pK_VQXxSZa8HqHY1a6oMKfmN-OKteFE32eZaweCI22E,3508
78
- winipedia_utils-0.2.10.dist-info/licenses/LICENSE,sha256=3PrKJ2CWNrnyyHaC_r0wPDSukVWgmjOxHr__eQVH7cw,1087
79
- winipedia_utils-0.2.10.dist-info/METADATA,sha256=_nIM0_R-GYnI6p6jvCRNXX1iSU7dVr5mZWSFCtQIaUM,12508
80
- winipedia_utils-0.2.10.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
81
- winipedia_utils-0.2.10.dist-info/RECORD,,