py-simple-wrap 0.3.2__tar.gz → 0.3.4__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 (112) hide show
  1. {py_simple_wrap-0.3.2/py_simple_package/src/py_simple_wrap.egg-info → py_simple_wrap-0.3.4}/PKG-INFO +42 -5
  2. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/README.md +41 -4
  3. py_simple_wrap-0.3.4/docs/contributor-hub/error_template.md +95 -0
  4. py_simple_wrap-0.3.4/docs/contributor-hub/index.md +20 -0
  5. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4/py_simple_package/src/py_simple_wrap.egg-info}/PKG-INFO +42 -5
  6. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple_wrap.egg-info/SOURCES.txt +2 -0
  7. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/pyproject.toml +1 -1
  8. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/LICENSE.md +0 -0
  9. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/MANIFEST.in +0 -0
  10. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/about/contributors.md +0 -0
  11. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/about/license.md +0 -0
  12. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/contributor-hub/docstring_template.md +0 -0
  13. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/contributor-hub/tutorial_template.md +0 -0
  14. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/how-to/contributing.md +0 -0
  15. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/index.md +0 -0
  16. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/readme.md +0 -0
  17. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_async.md +0 -0
  18. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_colors.md +0 -0
  19. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_converter.md +0 -0
  20. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_csv.md +0 -0
  21. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_data_visualization.md +0 -0
  22. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_date_formatter.md +0 -0
  23. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_dict.md +0 -0
  24. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_file_manager.md +0 -0
  25. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_flow.md +0 -0
  26. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_game.md +0 -0
  27. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_generator.md +0 -0
  28. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_images.md +0 -0
  29. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_json.md +0 -0
  30. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_lists.md +0 -0
  31. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_math.md +0 -0
  32. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_numbers.md +0 -0
  33. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_regex.md +0 -0
  34. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_stats.md +0 -0
  35. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_strings.md +0 -0
  36. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_text.md +0 -0
  37. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_validator.md +0 -0
  38. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/reference/easy_web.md +0 -0
  39. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_async.md +0 -0
  40. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_colors.md +0 -0
  41. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_converter.md +0 -0
  42. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_csv.md +0 -0
  43. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_data_visualization.md +0 -0
  44. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_date_formatter.md +0 -0
  45. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_dict.md +0 -0
  46. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_file_manager.md +0 -0
  47. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_flow.md +0 -0
  48. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_game.md +0 -0
  49. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_generator.md +0 -0
  50. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_images.md +0 -0
  51. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_json.md +0 -0
  52. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_json2.md +0 -0
  53. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_lists.md +0 -0
  54. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_math.md +0 -0
  55. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_math2.md +0 -0
  56. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_numbers.md +0 -0
  57. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_numbers2.md +0 -0
  58. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_regex.md +0 -0
  59. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_stats.md +0 -0
  60. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_strings.md +0 -0
  61. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_validator.md +0 -0
  62. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/easy_web.md +0 -0
  63. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/docs/tutorial/quickstart.md +0 -0
  64. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/__init__.py +0 -0
  65. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_async.py +0 -0
  66. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_colors.py +0 -0
  67. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_converter.py +0 -0
  68. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_csv.py +0 -0
  69. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_data_visualization.py +0 -0
  70. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_date_formatter.py +0 -0
  71. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_dict.py +0 -0
  72. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_file_manager.py +0 -0
  73. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_flow.py +0 -0
  74. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_game.py +0 -0
  75. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_generator.py +0 -0
  76. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_images.py +0 -0
  77. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_json.py +0 -0
  78. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_lists.py +0 -0
  79. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_math.py +0 -0
  80. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_numbers.py +0 -0
  81. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_regex.py +0 -0
  82. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_stats.py +0 -0
  83. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_strings.py +0 -0
  84. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_text.py +0 -0
  85. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_validator.py +0 -0
  86. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple/easy_web.py +0 -0
  87. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple_wrap.egg-info/dependency_links.txt +0 -0
  88. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple_wrap.egg-info/requires.txt +0 -0
  89. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/py_simple_package/src/py_simple_wrap.egg-info/top_level.txt +0 -0
  90. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/setup.cfg +0 -0
  91. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_async.py +0 -0
  92. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_colors.py +0 -0
  93. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_converter.py +0 -0
  94. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_csv.py +0 -0
  95. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_date_formatter.py +0 -0
  96. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_dicts.py +0 -0
  97. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_easy_game.py +0 -0
  98. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_file_manager.py +0 -0
  99. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_flow.py +0 -0
  100. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_generator.py +0 -0
  101. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_images.py +0 -0
  102. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_json.py +0 -0
  103. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_lists.py +0 -0
  104. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_math.py +0 -0
  105. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_numbers.py +0 -0
  106. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_regex.py +0 -0
  107. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_stats.py +0 -0
  108. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_strings.py +0 -0
  109. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_text.py +0 -0
  110. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_validator.py +0 -0
  111. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_visualization.py +0 -0
  112. {py_simple_wrap-0.3.2 → py_simple_wrap-0.3.4}/tests/test_web.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py_simple_wrap
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: A package to make complex python functionality simple
5
5
  Author-email: Sara Czasak <sara.p.czasak.m@gmail.com>
6
6
  Maintainer: jagjitkaur0000, atiqur-rahman-pro, Gaohar Imran, Yassin Azzouzi
@@ -74,14 +74,18 @@ Dynamic: license-file
74
74
 
75
75
  [![Home](https://img.shields.io/badge/🏠_home-py--simple--wrap-3F51B5?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/)
76
76
  [![Docs](https://img.shields.io/badge/docs-online-blue?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/)
77
- [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/docstring_template/)
77
+ [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/)
78
78
  [![Contributors Quest](https://img.shields.io/badge/🗺️_contributors_quest-play_now-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/quest/)
79
79
 
80
- [![PyPI](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
81
80
  [![Contributors](https://img.shields.io/badge/contributors-25-orange?style=for-the-badge)](#contributors-)
82
81
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap/blob/main/LICENSE.md)
83
82
  [![GitHub stars](https://img.shields.io/github/stars/sara-czasak/py-simple-wrap?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap)
84
83
 
84
+ [![Downloads/day](https://img.shields.io/pypi/dd/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
85
+ [![Downloads/week](https://img.shields.io/pypi/dw/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
86
+ [![Downloads/month](https://img.shields.io/pypi/dm/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
87
+ [![Latest version](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
88
+
85
89
 
86
90
  py-simple-wrap is a beginner-friendly Python wrapper package designed to help beginners and developers perform common tasks using simple, intuitive functions.
87
91
 
@@ -265,8 +269,8 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
265
269
 
266
270
  <br>
267
271
 
268
- |------------------------------|---------------------------------------------|---------------------------------------------------------------|
269
272
  | Function | What it does | Example |
273
+ |------------------------------|---------------------------------------------|---------------------------------------------------------------|
270
274
  | `truncate(text, length)` | Shorten text and add an ellipsis | `truncate("Hello world!", 5)` → `"Hello…"` |
271
275
  | `remove_punctuation(text)` | Strip punctuation, keep letters and numbers | `remove_punctuation("Hello, world!")` → `"Hello world"` |
272
276
  | `reverse_words(text)` | Reverse the order of words | `reverse_words("Hello world")` → `"world Hello"` |
@@ -562,6 +566,21 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
562
566
 
563
567
  </details>
564
568
 
569
+ ### 📈 Easy Data Visualization
570
+
571
+ <details>
572
+ <summary>Click to expand — auto-picks the right chart type for your data, no matplotlib boilerplate</summary>
573
+
574
+ <br>
575
+
576
+ | Function | What it does | Example |
577
+ |-------------------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------|
578
+ | `plot_data(X)` | Infers whether `X` is quantitative or categorical and plots the right chart(s) automatically | `plot_data([1, 2, 2, 3, 5, 5, 5, 8])` → histogram + line chart |
579
+ | `plot_data(X, Y)` | Same, but plots `X` against a second series `Y` | `plot_data(["A", "B", "C"], [10, 20, 30])` → bar chart |
580
+
581
+ </details>
582
+
583
+
565
584
  ### 🎮 Easy Game
566
585
 
567
586
  <details>
@@ -580,6 +599,24 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
580
599
 
581
600
  </details>
582
601
 
602
+ ### 🎲 Easy Generator
603
+
604
+ <details>
605
+ <summary>Click to expand — passwords, QR codes, UUIDs, and API keys without the boilerplate</summary>
606
+
607
+ <br>
608
+
609
+ | Function | What it does | Example |
610
+ |----------------------------------------------------------------------------|------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
611
+ | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` | Generates a random password with no repeated adjacent characters | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` → `"Kx9!mQ2z..."` |
612
+ | `generate_otp(6, with_letters=True)` | Generates a random one-time password code | `generate_otp(6, with_letters=True)` → `"a1B9x3"` |
613
+ | `generate_api_key()` | Generates a secure, URL-safe API key | `generate_api_key()` → `"kZ8x...Q1w"` |
614
+ | `generate_uuid()` | Generates a random UUID (version 4) | `generate_uuid()` → `"3f2504e0-4f89-11d3-9a0c-0305e82c3301"` |
615
+ | `generate_qr_code("https://example.com")` | Generates a QR code image and saves it to disk | Saves `qrcode0.png` (or the next free filename) |
616
+
617
+ </details>
618
+
619
+
583
620
  ## 🤝 Contributing
584
621
 
585
622
  I would love to have your help in making Python simpler for everyone!
@@ -665,7 +702,7 @@ A huge thank you to these wonderful people for helping make Python simpler for e
665
702
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/smirnov-danil"><img src="https://github.com/smirnov-danil.png?s=80" width="80px;" alt="d.smirnov"/><br /><sub><b>d.smirnov</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=smirnov-danil" title="Code">💻</a></td>
666
703
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/Venkat4real"><img src="https://github.com/Venkat4real.png?s=80" width="80px;" alt="Venkat"/><br /><sub><b>Venkat</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=Venkat4real" title="Docs">📖</a></td>
667
704
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/E4x7k"><img src="https://github.com/E4x7k.png?s=80" width="80px;" alt="E4x7k"/><br /><sub><b>E4x7k</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=E4x7k" title="Docs">📖</a></td>
668
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva " title="Infrastructure">🚇</a></td>
705
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva" title="Infrastructure">🚇</a></td>
669
706
  </tr>
670
707
  </tbody>
671
708
  </table>
@@ -7,14 +7,18 @@
7
7
 
8
8
  [![Home](https://img.shields.io/badge/🏠_home-py--simple--wrap-3F51B5?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/)
9
9
  [![Docs](https://img.shields.io/badge/docs-online-blue?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/)
10
- [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/docstring_template/)
10
+ [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/)
11
11
  [![Contributors Quest](https://img.shields.io/badge/🗺️_contributors_quest-play_now-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/quest/)
12
12
 
13
- [![PyPI](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
14
13
  [![Contributors](https://img.shields.io/badge/contributors-25-orange?style=for-the-badge)](#contributors-)
15
14
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap/blob/main/LICENSE.md)
16
15
  [![GitHub stars](https://img.shields.io/github/stars/sara-czasak/py-simple-wrap?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap)
17
16
 
17
+ [![Downloads/day](https://img.shields.io/pypi/dd/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
18
+ [![Downloads/week](https://img.shields.io/pypi/dw/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
19
+ [![Downloads/month](https://img.shields.io/pypi/dm/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
20
+ [![Latest version](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
21
+
18
22
 
19
23
  py-simple-wrap is a beginner-friendly Python wrapper package designed to help beginners and developers perform common tasks using simple, intuitive functions.
20
24
 
@@ -198,8 +202,8 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
198
202
 
199
203
  <br>
200
204
 
201
- |------------------------------|---------------------------------------------|---------------------------------------------------------------|
202
205
  | Function | What it does | Example |
206
+ |------------------------------|---------------------------------------------|---------------------------------------------------------------|
203
207
  | `truncate(text, length)` | Shorten text and add an ellipsis | `truncate("Hello world!", 5)` → `"Hello…"` |
204
208
  | `remove_punctuation(text)` | Strip punctuation, keep letters and numbers | `remove_punctuation("Hello, world!")` → `"Hello world"` |
205
209
  | `reverse_words(text)` | Reverse the order of words | `reverse_words("Hello world")` → `"world Hello"` |
@@ -495,6 +499,21 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
495
499
 
496
500
  </details>
497
501
 
502
+ ### 📈 Easy Data Visualization
503
+
504
+ <details>
505
+ <summary>Click to expand — auto-picks the right chart type for your data, no matplotlib boilerplate</summary>
506
+
507
+ <br>
508
+
509
+ | Function | What it does | Example |
510
+ |-------------------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------|
511
+ | `plot_data(X)` | Infers whether `X` is quantitative or categorical and plots the right chart(s) automatically | `plot_data([1, 2, 2, 3, 5, 5, 5, 8])` → histogram + line chart |
512
+ | `plot_data(X, Y)` | Same, but plots `X` against a second series `Y` | `plot_data(["A", "B", "C"], [10, 20, 30])` → bar chart |
513
+
514
+ </details>
515
+
516
+
498
517
  ### 🎮 Easy Game
499
518
 
500
519
  <details>
@@ -513,6 +532,24 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
513
532
 
514
533
  </details>
515
534
 
535
+ ### 🎲 Easy Generator
536
+
537
+ <details>
538
+ <summary>Click to expand — passwords, QR codes, UUIDs, and API keys without the boilerplate</summary>
539
+
540
+ <br>
541
+
542
+ | Function | What it does | Example |
543
+ |----------------------------------------------------------------------------|------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
544
+ | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` | Generates a random password with no repeated adjacent characters | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` → `"Kx9!mQ2z..."` |
545
+ | `generate_otp(6, with_letters=True)` | Generates a random one-time password code | `generate_otp(6, with_letters=True)` → `"a1B9x3"` |
546
+ | `generate_api_key()` | Generates a secure, URL-safe API key | `generate_api_key()` → `"kZ8x...Q1w"` |
547
+ | `generate_uuid()` | Generates a random UUID (version 4) | `generate_uuid()` → `"3f2504e0-4f89-11d3-9a0c-0305e82c3301"` |
548
+ | `generate_qr_code("https://example.com")` | Generates a QR code image and saves it to disk | Saves `qrcode0.png` (or the next free filename) |
549
+
550
+ </details>
551
+
552
+
516
553
  ## 🤝 Contributing
517
554
 
518
555
  I would love to have your help in making Python simpler for everyone!
@@ -598,7 +635,7 @@ A huge thank you to these wonderful people for helping make Python simpler for e
598
635
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/smirnov-danil"><img src="https://github.com/smirnov-danil.png?s=80" width="80px;" alt="d.smirnov"/><br /><sub><b>d.smirnov</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=smirnov-danil" title="Code">💻</a></td>
599
636
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/Venkat4real"><img src="https://github.com/Venkat4real.png?s=80" width="80px;" alt="Venkat"/><br /><sub><b>Venkat</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=Venkat4real" title="Docs">📖</a></td>
600
637
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/E4x7k"><img src="https://github.com/E4x7k.png?s=80" width="80px;" alt="E4x7k"/><br /><sub><b>E4x7k</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=E4x7k" title="Docs">📖</a></td>
601
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva " title="Infrastructure">🚇</a></td>
638
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva" title="Infrastructure">🚇</a></td>
602
639
  </tr>
603
640
  </tbody>
604
641
  </table>
@@ -0,0 +1,95 @@
1
+ # Custom Exception Template
2
+
3
+ `py-simple-wrap` wraps risky operations (network calls, file I/O, JSON parsing, external libraries) so beginners get one clear, readable error instead of a random builtin traceback. This page is the template for adding a new custom exception when a module needs one.
4
+
5
+ Modeled on the real exceptions already in the codebase — `SomethingWentWrongError` in `easy_web.py`, `EasyJsonError` in `easy_json.py`, `EasyFlowError`, `EasyAsyncError`, `EasyGameError`, `EasyGeneratorError`, `ImageProcessingError`, and `InvalidExtension` in `easy_file_manager.py` — all follow the same shape.
6
+
7
+ ## Why bother with a custom exception at all?
8
+
9
+ If `easy_web.get_page_content()` just let `requests`' own exceptions bubble up, a beginner would see something like `requests.exceptions.ConnectionError` or `requests.exceptions.Timeout` — different exception types depending on *how* the network failed, none of which say anything about *py-simple-wrap*. A custom exception gives one predictable name per module (`SomethingWentWrongError`) that always means "this py_simple function couldn't do its job," with a plain-English message explaining why. Beginners can write one `except` clause instead of memorizing every exception type a third-party library might throw.
10
+
11
+ ## The template
12
+
13
+ Copy this whole block and fill in the placeholders:
14
+
15
+ ````python
16
+ class ModuleNameError(Exception):
17
+ """
18
+ Raised when <the specific situation this covers>.
19
+
20
+ <A sentence or two on what this covers and, importantly, what it
21
+ does NOT cover — e.g. "this is only for real failures; a function
22
+ that can succeed with an empty result returns None/[] instead of
23
+ raising.">
24
+
25
+ Args:
26
+ message (str): Description of what went wrong, usually
27
+ including the original error message.
28
+ """
29
+ def __init__(self, message):
30
+ self.message = message
31
+ super().__init__(self.message)
32
+ ````
33
+
34
+ And where you raise it, wrap the risky call:
35
+
36
+ ````python
37
+ def do_the_risky_thing(...):
38
+ """... normal docstring ..."""
39
+ try:
40
+ return _actually_risky_stdlib_or_third_party_call(...)
41
+ except Exception as e:
42
+ raise ModuleNameError(f"Couldn't do the thing: {e}") from None
43
+ ````
44
+
45
+ ## Rules of thumb
46
+
47
+ - **Name it `<Module>Error`.** `SomethingWentWrongError`, `EasyJsonError`, `EasyFlowError` all follow this. (`InvalidExtension` in `easy_file_manager.py` is the one exception to the pattern in this codebase — new exceptions should still follow `<Module>Error` rather than add another one-off name.)
48
+ - **Always subclass `Exception` directly**, not a more specific builtin like `ValueError` or `IOError`. Every custom exception in this codebase does this — it keeps the public API surface to one predictable exception type per module, rather than making users guess which builtin subclass a given failure maps to.
49
+ - **Store the message and call `super().__init__()`** exactly like the template — this is what makes `str(the_exception)` and `print(the_exception)` show the readable message, and keeps the exception compatible with normal Python exception handling.
50
+ - **Use `raise ModuleError(...) from None`** when wrapping another exception. The `from None` suppresses Python's "During handling of the above exception, another exception occurred" chained traceback — a beginner doesn't need to see `requests`' internal stack trace, they need to see *your* message. Compare `easy_web.py`'s `get_page_content` for a real example.
51
+ - **Only raise for real failures.** If a function can reasonably return "nothing found" (an empty list, `None`), do that instead of raising — this is called out explicitly in `SomethingWentWrongError`'s own docstring. Custom exceptions are for "the operation could not complete," not "the operation completed and found nothing."
52
+ - **Document what it does and doesn't cover** in the exception's own docstring, not just in the function that raises it — someone catching `EasyJsonError` should be able to read its docstring alone and know what triggers it.
53
+
54
+ ## A minimal worked example
55
+
56
+ ```python
57
+ class EasyColorsError(Exception):
58
+ """
59
+ Raised when a color value can't be parsed or converted.
60
+
61
+ Covers malformed hex codes, out-of-range RGB values, and any other
62
+ input that isn't a valid color py_simple can work with.
63
+
64
+ Args:
65
+ message (str): Description of what went wrong.
66
+ """
67
+ def __init__(self, message):
68
+ self.message = message
69
+ super().__init__(self.message)
70
+
71
+
72
+ def hex_to_rgb(hex_code: str) -> tuple:
73
+ """... docstring ..."""
74
+ try:
75
+ hex_code = hex_code.lstrip("#")
76
+ return tuple(int(hex_code[i:i+2], 16) for i in (0, 2, 4))
77
+ except (ValueError, IndexError) as e:
78
+ raise EasyColorsError(f"'{hex_code}' isn't a valid hex color: {e}") from None
79
+ ```
80
+
81
+ And how a user of the package would catch it today:
82
+
83
+ ```python
84
+ from py_simple import hex_to_rgb
85
+ from py_simple.easy_colors import EasyColorsError
86
+
87
+ try:
88
+ rgb = hex_to_rgb("not-a-color")
89
+ except EasyColorsError as e:
90
+ print(f"Oops: {e}")
91
+ ```
92
+
93
+ ## A known gap worth knowing about
94
+
95
+ None of the eight existing custom exceptions (`SomethingWentWrongError`, `EasyJsonError`, `EasyFlowError`, `EasyAsyncError`, `EasyGameError`, `EasyGeneratorError`, `ImageProcessingError`, `InvalidExtension`) are currently exported from `py_simple/__init__.py` — only functions are. That means today, catching any of them requires importing from the submodule directly (`from py_simple.easy_web import SomethingWentWrongError`), not the flatter `from py_simple import ...` style every function in this package uses. This is inconsistent with the project's whole "simple, flat imports" philosophy, but it's the current reality, not a documentation error — worth raising with the maintainer as its own fix rather than quietly working around it here.
@@ -0,0 +1,20 @@
1
+ # Contributor Hub
2
+
3
+ New here, or making your first contribution to an open-source project ever? You're in the right place. Nobody expects you to already know how this project formats things — that's what this page is for.
4
+
5
+ Pick whatever's stressing you out below, and go straight to it. You don't need to read all of it, and you don't need to read it in order.
6
+
7
+ ## What do you need help with?
8
+
9
+ **📝 "I need to write a docstring and I don't know what that even means."**
10
+ Totally normal. The [Docstring Template](docstring_template.md) has a copy-paste block — just fill in the blanks. It also explains *why* the format looks the way it does, in case you're curious, but you don't have to read that part to use it.
11
+
12
+ **📖 "I added a new module and need to write a tutorial page, but I've never written docs before."**
13
+ The [Tutorial Template](tutorial_template.md) walks through the exact structure every tutorial page in this project uses, with a real example to copy from. You're not writing from a blank page.
14
+
15
+ **🚨 "My function needs to raise an error, and I don't know how this project wants errors to look."**
16
+ The [Custom Exception Template](error_template.md) has a fill-in-the-blanks class definition, plus a worked example showing both raising and catching it. Errors sound intimidating, but the pattern here is always the same one — once you've seen it once, you'll recognize it everywhere in this codebase.
17
+
18
+ ## Still stuck, or something's not covered here?
19
+
20
+ That's okay too. Open an issue, or mention it in your pull request, and it'll get sorted out together — see [CONTRIBUTING.md](https://github.com/sara-czasak/py-simple-wrap/blob/main/CONTRIBUTING.md) for how to reach out. Nobody's expected to figure this out alone.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py_simple_wrap
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: A package to make complex python functionality simple
5
5
  Author-email: Sara Czasak <sara.p.czasak.m@gmail.com>
6
6
  Maintainer: jagjitkaur0000, atiqur-rahman-pro, Gaohar Imran, Yassin Azzouzi
@@ -74,14 +74,18 @@ Dynamic: license-file
74
74
 
75
75
  [![Home](https://img.shields.io/badge/🏠_home-py--simple--wrap-3F51B5?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/)
76
76
  [![Docs](https://img.shields.io/badge/docs-online-blue?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/)
77
- [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/docstring_template/)
77
+ [![Contributor Hub](https://img.shields.io/badge/🤝_contributor_hub-start_here-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/)
78
78
  [![Contributors Quest](https://img.shields.io/badge/🗺️_contributors_quest-play_now-b8863b?style=for-the-badge)](https://sara-czasak.github.io/py-simple-wrap/quest/)
79
79
 
80
- [![PyPI](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
81
80
  [![Contributors](https://img.shields.io/badge/contributors-25-orange?style=for-the-badge)](#contributors-)
82
81
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap/blob/main/LICENSE.md)
83
82
  [![GitHub stars](https://img.shields.io/github/stars/sara-czasak/py-simple-wrap?style=for-the-badge)](https://github.com/sara-czasak/py-simple-wrap)
84
83
 
84
+ [![Downloads/day](https://img.shields.io/pypi/dd/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
85
+ [![Downloads/week](https://img.shields.io/pypi/dw/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
86
+ [![Downloads/month](https://img.shields.io/pypi/dm/py-simple-wrap?style=for-the-badge)](https://pypistats.org/packages/py-simple-wrap)
87
+ [![Latest version](https://img.shields.io/pypi/v/py-simple-wrap?style=for-the-badge)](https://pypi.org/project/py-simple-wrap/)
88
+
85
89
 
86
90
  py-simple-wrap is a beginner-friendly Python wrapper package designed to help beginners and developers perform common tasks using simple, intuitive functions.
87
91
 
@@ -265,8 +269,8 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
265
269
 
266
270
  <br>
267
271
 
268
- |------------------------------|---------------------------------------------|---------------------------------------------------------------|
269
272
  | Function | What it does | Example |
273
+ |------------------------------|---------------------------------------------|---------------------------------------------------------------|
270
274
  | `truncate(text, length)` | Shorten text and add an ellipsis | `truncate("Hello world!", 5)` → `"Hello…"` |
271
275
  | `remove_punctuation(text)` | Strip punctuation, keep letters and numbers | `remove_punctuation("Hello, world!")` → `"Hello world"` |
272
276
  | `reverse_words(text)` | Reverse the order of words | `reverse_words("Hello world")` → `"world Hello"` |
@@ -562,6 +566,21 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
562
566
 
563
567
  </details>
564
568
 
569
+ ### 📈 Easy Data Visualization
570
+
571
+ <details>
572
+ <summary>Click to expand — auto-picks the right chart type for your data, no matplotlib boilerplate</summary>
573
+
574
+ <br>
575
+
576
+ | Function | What it does | Example |
577
+ |-------------------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------|
578
+ | `plot_data(X)` | Infers whether `X` is quantitative or categorical and plots the right chart(s) automatically | `plot_data([1, 2, 2, 3, 5, 5, 5, 8])` → histogram + line chart |
579
+ | `plot_data(X, Y)` | Same, but plots `X` against a second series `Y` | `plot_data(["A", "B", "C"], [10, 20, 30])` → bar chart |
580
+
581
+ </details>
582
+
583
+
565
584
  ### 🎮 Easy Game
566
585
 
567
586
  <details>
@@ -580,6 +599,24 @@ py-simple-wrap provides simple modules designed to make common Python tasks easi
580
599
 
581
600
  </details>
582
601
 
602
+ ### 🎲 Easy Generator
603
+
604
+ <details>
605
+ <summary>Click to expand — passwords, QR codes, UUIDs, and API keys without the boilerplate</summary>
606
+
607
+ <br>
608
+
609
+ | Function | What it does | Example |
610
+ |----------------------------------------------------------------------------|------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
611
+ | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` | Generates a random password with no repeated adjacent characters | `generate_password(16, uppercase_chars=3, digit_chars=3, special_chars=3)` → `"Kx9!mQ2z..."` |
612
+ | `generate_otp(6, with_letters=True)` | Generates a random one-time password code | `generate_otp(6, with_letters=True)` → `"a1B9x3"` |
613
+ | `generate_api_key()` | Generates a secure, URL-safe API key | `generate_api_key()` → `"kZ8x...Q1w"` |
614
+ | `generate_uuid()` | Generates a random UUID (version 4) | `generate_uuid()` → `"3f2504e0-4f89-11d3-9a0c-0305e82c3301"` |
615
+ | `generate_qr_code("https://example.com")` | Generates a QR code image and saves it to disk | Saves `qrcode0.png` (or the next free filename) |
616
+
617
+ </details>
618
+
619
+
583
620
  ## 🤝 Contributing
584
621
 
585
622
  I would love to have your help in making Python simpler for everyone!
@@ -665,7 +702,7 @@ A huge thank you to these wonderful people for helping make Python simpler for e
665
702
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/smirnov-danil"><img src="https://github.com/smirnov-danil.png?s=80" width="80px;" alt="d.smirnov"/><br /><sub><b>d.smirnov</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=smirnov-danil" title="Code">💻</a></td>
666
703
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/Venkat4real"><img src="https://github.com/Venkat4real.png?s=80" width="80px;" alt="Venkat"/><br /><sub><b>Venkat</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=Venkat4real" title="Docs">📖</a></td>
667
704
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/E4x7k"><img src="https://github.com/E4x7k.png?s=80" width="80px;" alt="E4x7k"/><br /><sub><b>E4x7k</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=E4x7k" title="Docs">📖</a></td>
668
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva " title="Infrastructure">🚇</a></td>
705
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/jbsilva"><img src="https://github.com/jbsilva.png?s=80" width="80px;" alt="Julio Batista Silva"/><br /><sub><b>Julio Batista Silva</b></sub></a><br /><a href="https://github.com/sara-czasak/py_simple/commits?author=jbsilva" title="Infrastructure">🚇</a></td>
669
706
  </tr>
670
707
  </tbody>
671
708
  </table>
@@ -7,6 +7,8 @@ docs/readme.md
7
7
  docs/about/contributors.md
8
8
  docs/about/license.md
9
9
  docs/contributor-hub/docstring_template.md
10
+ docs/contributor-hub/error_template.md
11
+ docs/contributor-hub/index.md
10
12
  docs/contributor-hub/tutorial_template.md
11
13
  docs/how-to/contributing.md
12
14
  docs/reference/easy_async.md
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "py_simple_wrap"
7
- version = "0.3.2"
7
+ version = "0.3.4"
8
8
  authors = [
9
9
  { name="Sara Czasak", email="sara.p.czasak.m@gmail.com" },
10
10
  ]
File without changes