fishertools 0.2.1__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.
Files changed (81) hide show
  1. fishertools/__init__.py +82 -0
  2. fishertools/config/__init__.py +24 -0
  3. fishertools/config/manager.py +247 -0
  4. fishertools/config/models.py +96 -0
  5. fishertools/config/parser.py +265 -0
  6. fishertools/decorators.py +93 -0
  7. fishertools/documentation/__init__.py +38 -0
  8. fishertools/documentation/api.py +242 -0
  9. fishertools/documentation/generator.py +502 -0
  10. fishertools/documentation/models.py +126 -0
  11. fishertools/documentation/visual.py +583 -0
  12. fishertools/errors/__init__.py +29 -0
  13. fishertools/errors/exceptions.py +191 -0
  14. fishertools/errors/explainer.py +303 -0
  15. fishertools/errors/formatters.py +386 -0
  16. fishertools/errors/models.py +228 -0
  17. fishertools/errors/patterns.py +119 -0
  18. fishertools/errors/recovery.py +467 -0
  19. fishertools/examples/__init__.py +22 -0
  20. fishertools/examples/models.py +118 -0
  21. fishertools/examples/repository.py +770 -0
  22. fishertools/helpers.py +116 -0
  23. fishertools/integration.py +451 -0
  24. fishertools/learn/__init__.py +18 -0
  25. fishertools/learn/examples.py +550 -0
  26. fishertools/learn/tips.py +281 -0
  27. fishertools/learning/__init__.py +32 -0
  28. fishertools/learning/core.py +349 -0
  29. fishertools/learning/models.py +112 -0
  30. fishertools/learning/progress.py +314 -0
  31. fishertools/learning/session.py +500 -0
  32. fishertools/learning/tutorial.py +626 -0
  33. fishertools/legacy/__init__.py +76 -0
  34. fishertools/legacy/deprecated.py +261 -0
  35. fishertools/legacy/deprecation.py +149 -0
  36. fishertools/safe/__init__.py +16 -0
  37. fishertools/safe/collections.py +242 -0
  38. fishertools/safe/files.py +240 -0
  39. fishertools/safe/strings.py +15 -0
  40. fishertools/utils.py +57 -0
  41. fishertools-0.2.1.dist-info/METADATA +256 -0
  42. fishertools-0.2.1.dist-info/RECORD +81 -0
  43. fishertools-0.2.1.dist-info/WHEEL +5 -0
  44. fishertools-0.2.1.dist-info/licenses/LICENSE +21 -0
  45. fishertools-0.2.1.dist-info/top_level.txt +2 -0
  46. tests/__init__.py +6 -0
  47. tests/conftest.py +25 -0
  48. tests/test_config/__init__.py +3 -0
  49. tests/test_config/test_basic_config.py +57 -0
  50. tests/test_config/test_config_error_handling.py +287 -0
  51. tests/test_config/test_config_properties.py +435 -0
  52. tests/test_documentation/__init__.py +3 -0
  53. tests/test_documentation/test_documentation_properties.py +253 -0
  54. tests/test_documentation/test_visual_documentation_properties.py +444 -0
  55. tests/test_errors/__init__.py +3 -0
  56. tests/test_errors/test_api.py +301 -0
  57. tests/test_errors/test_error_handling.py +354 -0
  58. tests/test_errors/test_explainer.py +173 -0
  59. tests/test_errors/test_formatters.py +338 -0
  60. tests/test_errors/test_models.py +248 -0
  61. tests/test_errors/test_patterns.py +270 -0
  62. tests/test_examples/__init__.py +3 -0
  63. tests/test_examples/test_example_repository_properties.py +204 -0
  64. tests/test_examples/test_specific_examples.py +303 -0
  65. tests/test_integration.py +298 -0
  66. tests/test_integration_enhancements.py +462 -0
  67. tests/test_learn/__init__.py +3 -0
  68. tests/test_learn/test_examples.py +221 -0
  69. tests/test_learn/test_tips.py +285 -0
  70. tests/test_learning/__init__.py +3 -0
  71. tests/test_learning/test_interactive_learning_properties.py +337 -0
  72. tests/test_learning/test_learning_system_properties.py +194 -0
  73. tests/test_learning/test_progress_tracking_properties.py +279 -0
  74. tests/test_legacy/__init__.py +3 -0
  75. tests/test_legacy/test_backward_compatibility.py +236 -0
  76. tests/test_legacy/test_deprecation_warnings.py +208 -0
  77. tests/test_safe/__init__.py +3 -0
  78. tests/test_safe/test_collections_properties.py +189 -0
  79. tests/test_safe/test_files.py +104 -0
  80. tests/test_structure.py +58 -0
  81. tests/test_structure_enhancements.py +115 -0
@@ -0,0 +1,256 @@
1
+ Metadata-Version: 2.4
2
+ Name: fishertools
3
+ Version: 0.2.1
4
+ Summary: Fishertools - инструменты, которые делают Python удобнее и безопаснее для новичков
5
+ Home-page: https://github.com/f1sherFM/My_1st_library_python
6
+ Author: f1sherFM
7
+ Author-email: f1sherFM <kirillka229top@gmail.com>
8
+ License: MIT
9
+ Project-URL: Homepage, https://github.com/f1sherFM/My_1st_library_python
10
+ Project-URL: Repository, https://github.com/f1sherFM/My_1st_library_python
11
+ Project-URL: Issues, https://github.com/f1sherFM/My_1st_library_python/issues
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Requires-Python: >=3.8
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: requests>=2.25.0
28
+ Requires-Dist: click>=8.0.0
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
31
+ Requires-Dist: hypothesis>=6.0.0; extra == "dev"
32
+ Requires-Dist: black>=24.0.0; extra == "dev"
33
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
34
+ Requires-Dist: mypy>=1.8.0; extra == "dev"
35
+ Dynamic: author
36
+ Dynamic: home-page
37
+ Dynamic: license-file
38
+ Dynamic: requires-python
39
+
40
+ # Fishertools
41
+
42
+ **Инструменты, которые делают Python удобнее и безопаснее для новичков**
43
+
44
+ Fishertools - это Python библиотека, созданная специально для начинающих разработчиков. Она предоставляет понятные объяснения ошибок, безопасные утилиты и обучающие инструменты.
45
+
46
+ ## 🎯 Основные возможности
47
+
48
+ ### 🚨 Объяснение ошибок Python
49
+ Получайте понятные объяснения ошибок на русском языке с советами по исправлению:
50
+
51
+ ```python
52
+ from fishertools import explain_error
53
+
54
+ try:
55
+ numbers = [1, 2, 3]
56
+ print(numbers[10])
57
+ except Exception as e:
58
+ explain_error(e)
59
+ ```
60
+
61
+ **Вывод:**
62
+ ```
63
+ 🚨 Ошибка Python: IndexError
64
+
65
+ ═══ Сообщение об ошибке ═══
66
+ list index out of range
67
+
68
+ ═══ Что это означает ═══
69
+ Вы пытаетесь получить элемент списка по индексу, которого не существует.
70
+ Индексы в Python начинаются с 0, а максимальный индекс равен длине списка минус 1.
71
+
72
+ ═══ Как исправить ═══
73
+ Проверьте длину списка перед обращением к элементу или используйте
74
+ безопасные методы получения элементов.
75
+
76
+ ═══ Пример ═══
77
+ ┌─ Правильный код ─┐
78
+ numbers = [1, 2, 3]
79
+ if len(numbers) > 10:
80
+ print(numbers[10])
81
+ else:
82
+ print("Индекс слишком большой!")
83
+ └───────────────────┘
84
+ ```
85
+
86
+ ### 🛡️ Безопасные утилиты
87
+ Функции, которые предотвращают типичные ошибки новичков:
88
+
89
+ ```python
90
+ from fishertools.safe import safe_get, safe_divide, safe_read_file
91
+
92
+ # Безопасное получение элемента
93
+ numbers = [1, 2, 3]
94
+ result = safe_get(numbers, 10, "не найден") # "не найден"
95
+
96
+ # Безопасное деление
97
+ result = safe_divide(10, 0, 0) # 0 вместо ошибки
98
+
99
+ # Безопасное чтение файла
100
+ content = safe_read_file("file.txt", default="файл не найден")
101
+ ```
102
+
103
+ ### 📚 Обучающие инструменты
104
+ Изучайте Python на примерах и лучших практиках:
105
+
106
+ ```python
107
+ from fishertools.learn import show_best_practice, generate_example
108
+
109
+ # Показать лучшие практики
110
+ show_best_practice("variables")
111
+
112
+ # Сгенерировать пример кода
113
+ example = generate_example("functions")
114
+ print(example)
115
+ ```
116
+
117
+ ### 🔄 Обратная совместимость
118
+ Все полезные функции из предыдущих версий сохранены:
119
+
120
+ ```python
121
+ from fishertools.legacy import hash_string, generate_password, QuickConfig
122
+
123
+ # Старые функции работают как прежде
124
+ password = generate_password(12)
125
+ hash_value = hash_string("my_string")
126
+ config = QuickConfig({"debug": True})
127
+ ```
128
+
129
+ ## 📦 Установка
130
+
131
+ ```bash
132
+ pip install fishertools
133
+ ```
134
+
135
+ Или из исходников:
136
+ ```bash
137
+ git clone https://github.com/f1sherFM/My_1st_library_python.git
138
+ cd My_1st_library_python
139
+ pip install -e .
140
+ ```
141
+
142
+ ## 🚀 Быстрый старт
143
+
144
+ ```python
145
+ from fishertools import explain_error
146
+
147
+ # Основная функция - объяснение ошибок
148
+ try:
149
+ result = 10 / 0
150
+ except Exception as e:
151
+ explain_error(e)
152
+
153
+ # Безопасные утилиты
154
+ from fishertools.safe import safe_get, safe_divide
155
+ safe_result = safe_get([1, 2, 3], 5, "default")
156
+
157
+ # Обучающие инструменты
158
+ from fishertools.learn import show_best_practice
159
+ show_best_practice("functions")
160
+ ```
161
+
162
+ ## 📖 Документация
163
+
164
+ ### Поддерживаемые типы ошибок
165
+
166
+ Fishertools объясняет следующие типы ошибок Python:
167
+
168
+ - **TypeError** - ошибки типов данных
169
+ - **ValueError** - неправильные значения
170
+ - **AttributeError** - отсутствующие атрибуты
171
+ - **IndexError** - выход за границы списка
172
+ - **KeyError** - отсутствующие ключи словаря
173
+ - **ImportError** - проблемы с импортом модулей
174
+ - **SyntaxError** - синтаксические ошибки
175
+
176
+ ### Безопасные утилиты
177
+
178
+ - `safe_get(collection, index, default)` - безопасное получение элемента
179
+ - `safe_divide(a, b, default)` - деление без ошибки на ноль
180
+ - `safe_max(collection, default)` - максимум из коллекции
181
+ - `safe_min(collection, default)` - минимум из коллекции
182
+ - `safe_sum(collection, default)` - сумма элементов
183
+ - `safe_read_file(path, default)` - чтение файла без ошибок
184
+
185
+ ### Обучающие функции
186
+
187
+ - `show_best_practice(topic)` - показать лучшие практики
188
+ - `generate_example(concept)` - сгенерировать пример кода
189
+ - `list_available_concepts()` - список доступных концепций
190
+ - `list_available_topics()` - список доступных тем
191
+
192
+ ## 🧪 Тестирование
193
+
194
+ Библиотека покрыта comprehensive тестами:
195
+
196
+ ```bash
197
+ # Запуск всех тестов
198
+ pytest
199
+
200
+ # Запуск property-based тестов
201
+ pytest -k "property"
202
+
203
+ # Запуск с покрытием
204
+ pytest --cov=fishertools
205
+ ```
206
+
207
+ ## 🛠️ Разработка
208
+
209
+ ```bash
210
+ # Установка для разработки
211
+ pip install -e ".[dev]"
212
+
213
+ # Форматирование кода
214
+ black fishertools tests
215
+
216
+ # Проверка типов
217
+ mypy fishertools
218
+
219
+ # Линтинг
220
+ ruff check fishertools
221
+ ```
222
+
223
+ ## 📋 Требования
224
+
225
+ - Python 3.8+
226
+ - requests >= 2.25.0
227
+ - click >= 8.0.0
228
+
229
+ Для разработки:
230
+ - pytest >= 8.0.0
231
+ - hypothesis >= 6.0.0 (для property-based тестов)
232
+ - black >= 24.0.0
233
+ - ruff >= 0.1.0
234
+ - mypy >= 1.8.0
235
+
236
+ ## 🤝 Вклад в проект
237
+
238
+ Мы приветствуем вклад в развитие проекта! Пожалуйста:
239
+
240
+ 1. Форкните репозиторий
241
+ 2. Создайте ветку для новой функции
242
+ 3. Добавьте тесты для новой функциональности
243
+ 4. Убедитесь, что все тесты проходят
244
+ 5. Создайте Pull Request
245
+
246
+ ## 📄 Лицензия
247
+
248
+ MIT License - см. файл [LICENSE](LICENSE)
249
+
250
+ ## 🙏 Благодарности
251
+
252
+ Спасибо всем, кто помогает делать Python более доступным для новичков!
253
+
254
+ ---
255
+
256
+ **Fishertools** - потому что каждый заслуживает понятные инструменты для изучения программирования! 🐍✨
@@ -0,0 +1,81 @@
1
+ fishertools/__init__.py,sha256=vvsR-fPtFTR1zizj3lDr5NHuq0V6VZ2_nCDjiPqlY1k,2754
2
+ fishertools/decorators.py,sha256=DKWLy_USqTOUFGRyWllznYJ61jvRyXLDZ3iKOj6u-6k,3719
3
+ fishertools/helpers.py,sha256=qhSIY4ooZqCM5bKnku5XKjhONy9h1kMnrIEb4uRRZE4,4081
4
+ fishertools/integration.py,sha256=m8oaKPENdS9aOck4gR8ooUqUa7EIdH7r7aOGaVEFWHw,19763
5
+ fishertools/utils.py,sha256=6tUnCsHoHUoIpOYGgHAdqIqQ7FZhWzN3kCavgKKw1Uc,2159
6
+ fishertools/config/__init__.py,sha256=8slBbZSDgQeUIcEmkpZD9o30CMKd8pbJ2bJV3t01j5M,508
7
+ fishertools/config/manager.py,sha256=EPRjqYDcllanPA9w8PLjkanoi5ox38sVsuytz00ROhY,9095
8
+ fishertools/config/models.py,sha256=TXfFTee68B7VK7BFBorHQDPas8sFJacdUQVH61AKSDA,2594
9
+ fishertools/config/parser.py,sha256=oxf-LXf-7qr3aHKDZRFPsinwjSxI0gSY3kEEHALcwhk,10168
10
+ fishertools/documentation/__init__.py,sha256=kA7s2hssDLxxlJPxMeHQIuHm-BPYaS86EXERe4ZcRuU,806
11
+ fishertools/documentation/api.py,sha256=pn3K-3-xygpUfsNml6yAZeIhnGFPJyoL4c4AQJrxWCk,8718
12
+ fishertools/documentation/generator.py,sha256=mOduCARUboSs5Wmai0PCwpmNyNCjQGN756xmouzZtSI,18063
13
+ fishertools/documentation/models.py,sha256=8l2VC8dAib-c5jzuySnuOfKlM7Q1ITxV8phhBZDGd5Y,2884
14
+ fishertools/documentation/visual.py,sha256=JxyFrhkmuHxpIaBMbLtuP3a24FYIwyoT3_mKPV-oZPE,19307
15
+ fishertools/errors/__init__.py,sha256=yo6sd5MvY3jA6QE0G_-zXWAIvMs5Vyod81CTjCZNJEI,1248
16
+ fishertools/errors/exceptions.py,sha256=ocBgqCMw8f_rJ2Rp_3uxlJFc-NphebdM0dizFQoAQcc,7301
17
+ fishertools/errors/explainer.py,sha256=jMxXizmouvDGNLxTB9MCER9fjq1f8lZAE9ggeHWLGuo,14346
18
+ fishertools/errors/formatters.py,sha256=khdiXGx4Lil5cqd3WWkh8ZLrQea0S8u90hbZgKnFsMo,13790
19
+ fishertools/errors/models.py,sha256=v9_dIdiljK0j2ksPu403vei6COlgurtzvDiX8niB1MI,8427
20
+ fishertools/errors/patterns.py,sha256=sbB51eR3JxD_DKWkiqelxnNuJh3X20mcTXL2nnwo6k0,12276
21
+ fishertools/errors/recovery.py,sha256=7-3qd1uIv32vNltjvbVS2O5QJPixBLQVivU17f3Lxwo,17165
22
+ fishertools/examples/__init__.py,sha256=1D6EezNPBqY5blM_SfK0C3dxSnPOnfXOaqnjbCMlH0Y,457
23
+ fishertools/examples/models.py,sha256=gmOIdz29qnbWKMNAQ6r1i4BE7rZHK8Hv5jtF9Z0MYP0,2845
24
+ fishertools/examples/repository.py,sha256=HO-rB2CCnMQBdEQuyfJbDF8PelMecyoltMs3hPUpjFM,31204
25
+ fishertools/learn/__init__.py,sha256=ctPUYBaV_5uMMLgbBssbvs5tLvizIXE3TjhPmmCwgzA,508
26
+ fishertools/learn/examples.py,sha256=Fkt5gA6XUA_QbPq0hRAefMkHB1bz4v8q4oOxonpLa8Y,19907
27
+ fishertools/learn/tips.py,sha256=lGxheuvKe0QgFOn7CDpW2XppZ7bW7a1jYysSghibkUU,9697
28
+ fishertools/learning/__init__.py,sha256=fBwvqElVmhaUnRBwXfwQQSm7A0lzyrZihSNA91cnm_U,780
29
+ fishertools/learning/core.py,sha256=azR7rQLdSglSPZ-q-rZj5DEJ-2Ms0XyA0VV8KUvp1O0,14138
30
+ fishertools/learning/models.py,sha256=eLB9w-lSC0SKRkl-HwYRjfmxhDANtQXdogPFyiuD8cc,2861
31
+ fishertools/learning/progress.py,sha256=Nju1wei_UVYFW7LqYgMjKdLI8jiqHomH97gp-3d2ZOY,12761
32
+ fishertools/learning/session.py,sha256=9ZE-UJpd9tFph0ZaEl8FN1VDJIU-fmTF9CsDyBbpVng,19837
33
+ fishertools/learning/tutorial.py,sha256=jiRcOm0kDTHSMUzNw-1bNlzC9aOMJwHbXn8lW0IQHTc,28325
34
+ fishertools/legacy/__init__.py,sha256=9NYb7gfwtp-4o5TJyUFvFapY1SnDPezfdyrcI-gU97g,2156
35
+ fishertools/legacy/deprecated.py,sha256=rR4Z7eo42LFklkKBkrA05wzkes2IsjayeKzWZV27wI4,10033
36
+ fishertools/legacy/deprecation.py,sha256=2EPKgix0N-F7limO9cirurXvApDJGVxNfh2jCfMZ9uc,5068
37
+ fishertools/safe/__init__.py,sha256=_EtvxjCU2C1GDzVwfAjtsZ3P8a1UjKONvhgZB2Acpbw,638
38
+ fishertools/safe/collections.py,sha256=NTfqVv4alPNr0wrcO5IGYSYk3FSSZYMIaYN3iFnOJlc,9738
39
+ fishertools/safe/files.py,sha256=FNZafMdlBjeM05GIxVxNRyA0s2PlMsDZ7XjGmjWfPqs,9589
40
+ fishertools/safe/strings.py,sha256=8kyN0ajwWBV4VE19LDspoVNFCTjghwx63aADZoX-6j8,315
41
+ fishertools-0.2.1.dist-info/licenses/LICENSE,sha256=eLEqXLzyplfeaqnVJgjvQUsaFYxAPJ38xNpFhlntZrw,1084
42
+ tests/__init__.py,sha256=09o34ess27Hp5ZJ9H6bqAiBkFWsp3cjy6hiT0kUH58E,139
43
+ tests/conftest.py,sha256=DAnUXhbJvYWj8XLuggM3JdL19R8-XJjbZeNYeiWXjik,828
44
+ tests/test_integration.py,sha256=5fmubUAKDCiNfIg-SJAWYeZlLPjgsky8ZmT0BUbd8kI,12236
45
+ tests/test_integration_enhancements.py,sha256=DHHUAn271QZlN-BDsOQNBpEoktQhZvHJKOLwisOyQqw,18708
46
+ tests/test_structure.py,sha256=Lhes-TH2TgbqW4K_G2KOjYPwHQW9dLT4mqLbm6Nc-w4,2015
47
+ tests/test_structure_enhancements.py,sha256=8_6hCYc_jOJVdO3O1dhFFNPc5TCE2kbNkP2LaWS5q98,4760
48
+ tests/test_config/__init__.py,sha256=9_IIF-3DZE06DR388NQp8WPEon2XZLR-VdoQXePkBCw,56
49
+ tests/test_config/test_basic_config.py,sha256=oIwfjhRz1pcZQcAADect9x705cOPFvNQFWFo1QThzAA,2195
50
+ tests/test_config/test_config_error_handling.py,sha256=aa0eviMv1MowPEnf9FK9iE2Ec19rdm-bZYNYxx-KIf0,12163
51
+ tests/test_config/test_config_properties.py,sha256=4wAwc8bAMzqdYqBDndi7nqugwJ1teG4Vdj2Ijj0THWg,20789
52
+ tests/test_documentation/__init__.py,sha256=xsEvmyIlWI3HnTTwr3Go3jGtmw4A0NboXxVYPpSA-tA,56
53
+ tests/test_documentation/test_documentation_properties.py,sha256=5bVq-vUDfM2035jBf5tozTKouS21p_1R0PNncNTZqgA,10742
54
+ tests/test_documentation/test_visual_documentation_properties.py,sha256=Z4LR5LBDlQTwTuDXJej8Itltmw_9NqYZG5uXWEE3lzA,19349
55
+ tests/test_errors/__init__.py,sha256=TgRhzGojrbDYRs4YD4yz7U0YeffhDn8ZO-1C0IS0Hpo,49
56
+ tests/test_errors/test_api.py,sha256=TGUoMKG5oNb6Im8rpXxPdFWEaV0Hu4kuYrDoDpUl5cs,12327
57
+ tests/test_errors/test_error_handling.py,sha256=6D2ak6FXR9PQaakPSEx5kepbra9_MP38g13STuq3OH8,15342
58
+ tests/test_errors/test_explainer.py,sha256=50O9oHOPNmCasp5MR9i2ql-py4HHN48s7nnv5Ck-hkM,7449
59
+ tests/test_errors/test_formatters.py,sha256=D7dHAonDe0Q-uqNvKnccNrMEazgHlV99YrDo54anAfw,16267
60
+ tests/test_errors/test_models.py,sha256=LMg86PO9F5qIrmVIqbWd4tr4zjLu-Tq6m4h95VGkGuM,10566
61
+ tests/test_errors/test_patterns.py,sha256=30unn0-XIkAkvP5gNoskNAlnLDtOZinzV1Iiu6i4Qok,12791
62
+ tests/test_examples/__init__.py,sha256=gf_sI2CD9TaM_mony0sUPEqBsOxXLqXE6WPau7bysWE,51
63
+ tests/test_examples/test_example_repository_properties.py,sha256=ksQgL5oEaJM-tUjOcwVmEBeDEGLqUAVKTXw766NZgJU,10361
64
+ tests/test_examples/test_specific_examples.py,sha256=VjDHvVrheGI2M7UiZVrnoD2qyJ9Q6uQFjG7qbD2zLpk,14698
65
+ tests/test_learn/__init__.py,sha256=Bw7w8u9uiRrvtIg3k9Ac-0gYoE_3_hFvDbEetpZaNFA,35
66
+ tests/test_learn/test_examples.py,sha256=IQtYcVbe1pspiRasLY6JN1MQ20kWoxWCbOetbqMYXAs,8615
67
+ tests/test_learn/test_tips.py,sha256=fRZ8U0jXnpZFkVFbDnLKBoVayXhXJx3qIn0YUgojguc,11201
68
+ tests/test_learning/__init__.py,sha256=h-oxqKnBXNlK_AB8SP1aTP4sChfYDdydpxU6XQUOufc,47
69
+ tests/test_learning/test_interactive_learning_properties.py,sha256=EaCABbHSHFde4E_gyC6vAns1paSE_2dergKxAx_f5jM,17528
70
+ tests/test_learning/test_learning_system_properties.py,sha256=09Ir-s1v7FM9uD6hqprEjLN6JvligxjFDoRdLQ5wPiI,8396
71
+ tests/test_learning/test_progress_tracking_properties.py,sha256=xLwIk_a9Xfhw1WFOO2NxjuC63Fa_KiXmBWWJnhmbB8A,13290
72
+ tests/test_legacy/__init__.py,sha256=ofWG_WJXsOheTEbGn_5Y0wvppcN0kKb2E6aUFL98a_s,62
73
+ tests/test_legacy/test_backward_compatibility.py,sha256=svdImGaTMAyAWoyF_Qm8nCbVrxnT9klg3u-OEVlXaUo,9786
74
+ tests/test_legacy/test_deprecation_warnings.py,sha256=lSFLTDXfTjZcpqczPlxrO6Sw0CErMepxIhuNHdv36PU,9890
75
+ tests/test_safe/__init__.py,sha256=ZEQlbeYtDtcBYqkE7sZbwkjKgqbPOwXI3S5U_2gjo0w,35
76
+ tests/test_safe/test_collections_properties.py,sha256=DYQ542pwoacsTRS3-TMdgtcqLj6SyUnag7gZoK4dFDc,8359
77
+ tests/test_safe/test_files.py,sha256=QSKyImlyIfVqWk_xh2LpD5znZGrJi9HCOrP-ACz3hjE,4162
78
+ fishertools-0.2.1.dist-info/METADATA,sha256=cyBSPWKhxy2ynp-yFDwnAiI0P7QZPPvqd9uOCQELgF0,9049
79
+ fishertools-0.2.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
80
+ fishertools-0.2.1.dist-info/top_level.txt,sha256=rZDacVWxcOzBe1B5mCXYqOShQ1KJyzXIPAAJNZ5OYv4,18
81
+ fishertools-0.2.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 f1sherFM
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.
@@ -0,0 +1,2 @@
1
+ fishertools
2
+ tests
tests/__init__.py ADDED
@@ -0,0 +1,6 @@
1
+ """
2
+ Test suite for fishertools.
3
+
4
+ This package contains both unit tests and property-based tests
5
+ for all fishertools functionality.
6
+ """
tests/conftest.py ADDED
@@ -0,0 +1,25 @@
1
+ """
2
+ Pytest configuration and fixtures for fishertools tests.
3
+ """
4
+
5
+ import pytest
6
+ from hypothesis import settings, Verbosity
7
+
8
+
9
+ # Configure hypothesis for property-based testing
10
+ settings.register_profile("default", max_examples=100, verbosity=Verbosity.normal)
11
+ settings.load_profile("default")
12
+
13
+
14
+ @pytest.fixture
15
+ def sample_exceptions():
16
+ """Fixture providing common exception types for testing."""
17
+ return [
18
+ TypeError("'str' object cannot be interpreted as an integer"),
19
+ ValueError("invalid literal for int() with base 10: 'abc'"),
20
+ AttributeError("'str' object has no attribute 'append'"),
21
+ IndexError("list index out of range"),
22
+ KeyError("'missing_key'"),
23
+ ImportError("No module named 'nonexistent_module'"),
24
+ SyntaxError("invalid syntax"),
25
+ ]
@@ -0,0 +1,3 @@
1
+ """
2
+ Tests for the configuration management module.
3
+ """
@@ -0,0 +1,57 @@
1
+ """
2
+ Basic configuration tests to verify the setup works.
3
+ """
4
+
5
+ import json
6
+ import pytest
7
+ from fishertools.config.models import LearningConfig
8
+
9
+
10
+ class TestBasicConfiguration:
11
+ """Test basic configuration functionality."""
12
+
13
+ def test_default_config_creation(self):
14
+ """Test that default configuration can be created."""
15
+ config = LearningConfig()
16
+
17
+ # Verify default values
18
+ assert config.default_level == "beginner"
19
+ assert config.explanation_verbosity == "detailed"
20
+ assert config.visual_aids_enabled is True
21
+ assert config.progress_tracking_enabled is True
22
+ assert config.suggested_topics_count == 3
23
+ assert config.max_examples_per_topic == 5
24
+ assert config.exercise_difficulty_progression == ["beginner", "intermediate", "advanced"]
25
+
26
+ def test_config_with_custom_values(self):
27
+ """Test configuration with custom values."""
28
+ config = LearningConfig(
29
+ default_level="intermediate",
30
+ explanation_verbosity="brief",
31
+ visual_aids_enabled=False,
32
+ suggested_topics_count=5
33
+ )
34
+
35
+ assert config.default_level == "intermediate"
36
+ assert config.explanation_verbosity == "brief"
37
+ assert config.visual_aids_enabled is False
38
+ assert config.suggested_topics_count == 5
39
+
40
+ def test_default_config_file_exists(self):
41
+ """Test that default configuration file exists and is valid JSON."""
42
+ import os
43
+ from fishertools.config import ConfigurationManager
44
+
45
+ # Check if default config file exists
46
+ config_path = "fishertools/config/default_config.json"
47
+ assert os.path.exists(config_path), "Default configuration file should exist"
48
+
49
+ # Verify it's valid JSON
50
+ with open(config_path, 'r') as f:
51
+ config_data = json.load(f)
52
+
53
+ # Verify required fields exist
54
+ assert "default_level" in config_data
55
+ assert "explanation_verbosity" in config_data
56
+ assert "visual_aids_enabled" in config_data
57
+ assert "progress_tracking_enabled" in config_data