fishertools 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. fishertools-0.2.0/LICENSE +21 -0
  2. fishertools-0.2.0/PKG-INFO +256 -0
  3. fishertools-0.2.0/README.md +217 -0
  4. fishertools-0.2.0/fishertools/__init__.py +72 -0
  5. fishertools-0.2.0/fishertools/decorators.py +93 -0
  6. fishertools-0.2.0/fishertools/errors/__init__.py +23 -0
  7. fishertools-0.2.0/fishertools/errors/exceptions.py +191 -0
  8. fishertools-0.2.0/fishertools/errors/explainer.py +303 -0
  9. fishertools-0.2.0/fishertools/errors/formatters.py +358 -0
  10. fishertools-0.2.0/fishertools/errors/models.py +228 -0
  11. fishertools-0.2.0/fishertools/errors/patterns.py +119 -0
  12. fishertools-0.2.0/fishertools/helpers.py +116 -0
  13. fishertools-0.2.0/fishertools/learn/__init__.py +18 -0
  14. fishertools-0.2.0/fishertools/learn/examples.py +550 -0
  15. fishertools-0.2.0/fishertools/learn/tips.py +281 -0
  16. fishertools-0.2.0/fishertools/legacy/__init__.py +76 -0
  17. fishertools-0.2.0/fishertools/legacy/deprecated.py +261 -0
  18. fishertools-0.2.0/fishertools/legacy/deprecation.py +149 -0
  19. fishertools-0.2.0/fishertools/safe/__init__.py +16 -0
  20. fishertools-0.2.0/fishertools/safe/collections.py +234 -0
  21. fishertools-0.2.0/fishertools/safe/files.py +240 -0
  22. fishertools-0.2.0/fishertools/safe/strings.py +15 -0
  23. fishertools-0.2.0/fishertools/utils.py +57 -0
  24. fishertools-0.2.0/fishertools.egg-info/PKG-INFO +256 -0
  25. fishertools-0.2.0/fishertools.egg-info/SOURCES.txt +49 -0
  26. fishertools-0.2.0/fishertools.egg-info/dependency_links.txt +1 -0
  27. fishertools-0.2.0/fishertools.egg-info/requires.txt +9 -0
  28. fishertools-0.2.0/fishertools.egg-info/top_level.txt +2 -0
  29. fishertools-0.2.0/pyproject.toml +99 -0
  30. fishertools-0.2.0/setup.cfg +4 -0
  31. fishertools-0.2.0/setup.py +35 -0
  32. fishertools-0.2.0/tests/__init__.py +6 -0
  33. fishertools-0.2.0/tests/conftest.py +25 -0
  34. fishertools-0.2.0/tests/test_errors/__init__.py +3 -0
  35. fishertools-0.2.0/tests/test_errors/test_api.py +301 -0
  36. fishertools-0.2.0/tests/test_errors/test_error_handling.py +354 -0
  37. fishertools-0.2.0/tests/test_errors/test_explainer.py +173 -0
  38. fishertools-0.2.0/tests/test_errors/test_formatters.py +338 -0
  39. fishertools-0.2.0/tests/test_errors/test_models.py +248 -0
  40. fishertools-0.2.0/tests/test_errors/test_patterns.py +270 -0
  41. fishertools-0.2.0/tests/test_integration.py +298 -0
  42. fishertools-0.2.0/tests/test_learn/__init__.py +3 -0
  43. fishertools-0.2.0/tests/test_learn/test_examples.py +221 -0
  44. fishertools-0.2.0/tests/test_learn/test_tips.py +285 -0
  45. fishertools-0.2.0/tests/test_legacy/__init__.py +3 -0
  46. fishertools-0.2.0/tests/test_legacy/test_backward_compatibility.py +236 -0
  47. fishertools-0.2.0/tests/test_legacy/test_deprecation_warnings.py +208 -0
  48. fishertools-0.2.0/tests/test_safe/__init__.py +3 -0
  49. fishertools-0.2.0/tests/test_safe/test_collections_properties.py +189 -0
  50. fishertools-0.2.0/tests/test_safe/test_files.py +104 -0
  51. fishertools-0.2.0/tests/test_structure.py +58 -0
@@ -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,256 @@
1
+ Metadata-Version: 2.4
2
+ Name: fishertools
3
+ Version: 0.2.0
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,217 @@
1
+ # Fishertools
2
+
3
+ **Инструменты, которые делают Python удобнее и безопаснее для новичков**
4
+
5
+ Fishertools - это Python библиотека, созданная специально для начинающих разработчиков. Она предоставляет понятные объяснения ошибок, безопасные утилиты и обучающие инструменты.
6
+
7
+ ## 🎯 Основные возможности
8
+
9
+ ### 🚨 Объяснение ошибок Python
10
+ Получайте понятные объяснения ошибок на русском языке с советами по исправлению:
11
+
12
+ ```python
13
+ from fishertools import explain_error
14
+
15
+ try:
16
+ numbers = [1, 2, 3]
17
+ print(numbers[10])
18
+ except Exception as e:
19
+ explain_error(e)
20
+ ```
21
+
22
+ **Вывод:**
23
+ ```
24
+ 🚨 Ошибка Python: IndexError
25
+
26
+ ═══ Сообщение об ошибке ═══
27
+ list index out of range
28
+
29
+ ═══ Что это означает ═══
30
+ Вы пытаетесь получить элемент списка по индексу, которого не существует.
31
+ Индексы в Python начинаются с 0, а максимальный индекс равен длине списка минус 1.
32
+
33
+ ═══ Как исправить ═══
34
+ Проверьте длину списка перед обращением к элементу или используйте
35
+ безопасные методы получения элементов.
36
+
37
+ ═══ Пример ═══
38
+ ┌─ Правильный код ─┐
39
+ numbers = [1, 2, 3]
40
+ if len(numbers) > 10:
41
+ print(numbers[10])
42
+ else:
43
+ print("Индекс слишком большой!")
44
+ └───────────────────┘
45
+ ```
46
+
47
+ ### 🛡️ Безопасные утилиты
48
+ Функции, которые предотвращают типичные ошибки новичков:
49
+
50
+ ```python
51
+ from fishertools.safe import safe_get, safe_divide, safe_read_file
52
+
53
+ # Безопасное получение элемента
54
+ numbers = [1, 2, 3]
55
+ result = safe_get(numbers, 10, "не найден") # "не найден"
56
+
57
+ # Безопасное деление
58
+ result = safe_divide(10, 0, 0) # 0 вместо ошибки
59
+
60
+ # Безопасное чтение файла
61
+ content = safe_read_file("file.txt", default="файл не найден")
62
+ ```
63
+
64
+ ### 📚 Обучающие инструменты
65
+ Изучайте Python на примерах и лучших практиках:
66
+
67
+ ```python
68
+ from fishertools.learn import show_best_practice, generate_example
69
+
70
+ # Показать лучшие практики
71
+ show_best_practice("variables")
72
+
73
+ # Сгенерировать пример кода
74
+ example = generate_example("functions")
75
+ print(example)
76
+ ```
77
+
78
+ ### 🔄 Обратная совместимость
79
+ Все полезные функции из предыдущих версий сохранены:
80
+
81
+ ```python
82
+ from fishertools.legacy import hash_string, generate_password, QuickConfig
83
+
84
+ # Старые функции работают как прежде
85
+ password = generate_password(12)
86
+ hash_value = hash_string("my_string")
87
+ config = QuickConfig({"debug": True})
88
+ ```
89
+
90
+ ## 📦 Установка
91
+
92
+ ```bash
93
+ pip install fishertools
94
+ ```
95
+
96
+ Или из исходников:
97
+ ```bash
98
+ git clone https://github.com/f1sherFM/My_1st_library_python.git
99
+ cd My_1st_library_python
100
+ pip install -e .
101
+ ```
102
+
103
+ ## 🚀 Быстрый старт
104
+
105
+ ```python
106
+ from fishertools import explain_error
107
+
108
+ # Основная функция - объяснение ошибок
109
+ try:
110
+ result = 10 / 0
111
+ except Exception as e:
112
+ explain_error(e)
113
+
114
+ # Безопасные утилиты
115
+ from fishertools.safe import safe_get, safe_divide
116
+ safe_result = safe_get([1, 2, 3], 5, "default")
117
+
118
+ # Обучающие инструменты
119
+ from fishertools.learn import show_best_practice
120
+ show_best_practice("functions")
121
+ ```
122
+
123
+ ## 📖 Документация
124
+
125
+ ### Поддерживаемые типы ошибок
126
+
127
+ Fishertools объясняет следующие типы ошибок Python:
128
+
129
+ - **TypeError** - ошибки типов данных
130
+ - **ValueError** - неправильные значения
131
+ - **AttributeError** - отсутствующие атрибуты
132
+ - **IndexError** - выход за границы списка
133
+ - **KeyError** - отсутствующие ключи словаря
134
+ - **ImportError** - проблемы с импортом модулей
135
+ - **SyntaxError** - синтаксические ошибки
136
+
137
+ ### Безопасные утилиты
138
+
139
+ - `safe_get(collection, index, default)` - безопасное получение элемента
140
+ - `safe_divide(a, b, default)` - деление без ошибки на ноль
141
+ - `safe_max(collection, default)` - максимум из коллекции
142
+ - `safe_min(collection, default)` - минимум из коллекции
143
+ - `safe_sum(collection, default)` - сумма элементов
144
+ - `safe_read_file(path, default)` - чтение файла без ошибок
145
+
146
+ ### Обучающие функции
147
+
148
+ - `show_best_practice(topic)` - показать лучшие практики
149
+ - `generate_example(concept)` - сгенерировать пример кода
150
+ - `list_available_concepts()` - список доступных концепций
151
+ - `list_available_topics()` - список доступных тем
152
+
153
+ ## 🧪 Тестирование
154
+
155
+ Библиотека покрыта comprehensive тестами:
156
+
157
+ ```bash
158
+ # Запуск всех тестов
159
+ pytest
160
+
161
+ # Запуск property-based тестов
162
+ pytest -k "property"
163
+
164
+ # Запуск с покрытием
165
+ pytest --cov=fishertools
166
+ ```
167
+
168
+ ## 🛠️ Разработка
169
+
170
+ ```bash
171
+ # Установка для разработки
172
+ pip install -e ".[dev]"
173
+
174
+ # Форматирование кода
175
+ black fishertools tests
176
+
177
+ # Проверка типов
178
+ mypy fishertools
179
+
180
+ # Линтинг
181
+ ruff check fishertools
182
+ ```
183
+
184
+ ## 📋 Требования
185
+
186
+ - Python 3.8+
187
+ - requests >= 2.25.0
188
+ - click >= 8.0.0
189
+
190
+ Для разработки:
191
+ - pytest >= 8.0.0
192
+ - hypothesis >= 6.0.0 (для property-based тестов)
193
+ - black >= 24.0.0
194
+ - ruff >= 0.1.0
195
+ - mypy >= 1.8.0
196
+
197
+ ## 🤝 Вклад в проект
198
+
199
+ Мы приветствуем вклад в развитие проекта! Пожалуйста:
200
+
201
+ 1. Форкните репозиторий
202
+ 2. Создайте ветку для новой функции
203
+ 3. Добавьте тесты для новой функциональности
204
+ 4. Убедитесь, что все тесты проходят
205
+ 5. Создайте Pull Request
206
+
207
+ ## 📄 Лицензия
208
+
209
+ MIT License - см. файл [LICENSE](LICENSE)
210
+
211
+ ## 🙏 Благодарности
212
+
213
+ Спасибо всем, кто помогает делать Python более доступным для новичков!
214
+
215
+ ---
216
+
217
+ **Fishertools** - потому что каждый заслуживает понятные инструменты для изучения программирования! 🐍✨
@@ -0,0 +1,72 @@
1
+ """
2
+ Fishertools - инструменты, которые делают Python удобнее и безопаснее для новичков
3
+
4
+ Основная функция:
5
+ explain_error() - объясняет ошибки Python в понятных словах
6
+
7
+ Модули:
8
+ errors - система объяснения ошибок
9
+ safe - безопасные утилиты для новичков
10
+ learn - обучающие инструменты
11
+ legacy - функции для обратной совместимости
12
+ """
13
+
14
+ __version__ = "0.2.0"
15
+ __author__ = "f1sherFM"
16
+
17
+ # Primary API - main interface for users
18
+ from .errors import explain_error
19
+
20
+ # Exception classes for error handling
21
+ from .errors import (
22
+ FishertoolsError, ExplanationError, FormattingError,
23
+ ConfigurationError, PatternError, SafeUtilityError
24
+ )
25
+
26
+ # Safe utilities - commonly used beginner-friendly functions
27
+ from .safe import (
28
+ safe_get, safe_divide, safe_max, safe_min, safe_sum,
29
+ safe_read_file, safe_write_file, safe_file_exists,
30
+ safe_get_file_size, safe_list_files
31
+ )
32
+
33
+ # Learning tools - educational functions
34
+ from .learn import (
35
+ generate_example, show_best_practice,
36
+ list_available_concepts, list_available_topics
37
+ )
38
+
39
+ # Legacy imports for backward compatibility
40
+ from . import utils
41
+ from . import decorators
42
+ from . import helpers
43
+
44
+ # Module imports for advanced users who want to access specific modules
45
+ from . import errors
46
+ from . import safe
47
+ from . import learn
48
+ from . import legacy
49
+
50
+ __all__ = [
51
+ # Primary API - the main function users should import
52
+ "explain_error",
53
+
54
+ # Exception classes for error handling
55
+ "FishertoolsError", "ExplanationError", "FormattingError",
56
+ "ConfigurationError", "PatternError", "SafeUtilityError",
57
+
58
+ # Safe utilities - direct access to commonly used functions
59
+ "safe_get", "safe_divide", "safe_max", "safe_min", "safe_sum",
60
+ "safe_read_file", "safe_write_file", "safe_file_exists",
61
+ "safe_get_file_size", "safe_list_files",
62
+
63
+ # Learning tools - direct access to educational functions
64
+ "generate_example", "show_best_practice",
65
+ "list_available_concepts", "list_available_topics",
66
+
67
+ # Legacy modules for backward compatibility
68
+ "utils", "decorators", "helpers",
69
+
70
+ # New modules for advanced usage
71
+ "errors", "safe", "learn", "legacy"
72
+ ]
@@ -0,0 +1,93 @@
1
+ """
2
+ Полезные декораторы для отладки, профилирования и других задач
3
+ """
4
+
5
+ import time
6
+ import functools
7
+ from typing import Any, Callable
8
+
9
+
10
+ def timer(func: Callable) -> Callable:
11
+ """Декоратор для измерения времени выполнения функции"""
12
+ @functools.wraps(func)
13
+ def wrapper(*args, **kwargs):
14
+ start_time = time.time()
15
+ result = func(*args, **kwargs)
16
+ end_time = time.time()
17
+ print(f"{func.__name__} выполнилась за {end_time - start_time:.4f} секунд")
18
+ return result
19
+ return wrapper
20
+
21
+
22
+ def debug(func: Callable) -> Callable:
23
+ """Декоратор для отладки - выводит аргументы и результат функции"""
24
+ @functools.wraps(func)
25
+ def wrapper(*args, **kwargs):
26
+ print(f"Вызов {func.__name__} с аргументами: args={args}, kwargs={kwargs}")
27
+ result = func(*args, **kwargs)
28
+ print(f"{func.__name__} вернула: {result}")
29
+ return result
30
+ return wrapper
31
+
32
+
33
+ def retry(max_attempts: int = 3, delay: float = 1.0):
34
+ """Декоратор для повторных попыток выполнения функции при ошибке"""
35
+ def decorator(func: Callable) -> Callable:
36
+ @functools.wraps(func)
37
+ def wrapper(*args, **kwargs):
38
+ for attempt in range(max_attempts):
39
+ try:
40
+ return func(*args, **kwargs)
41
+ except Exception as e:
42
+ if attempt == max_attempts - 1:
43
+ raise e
44
+ print(f"Попытка {attempt + 1} не удалась: {e}. Повтор через {delay} сек...")
45
+ time.sleep(delay)
46
+ return wrapper
47
+ return decorator
48
+
49
+
50
+ def cache_result(func: Callable) -> Callable:
51
+ """Простой декоратор для кеширования результатов функции"""
52
+ cache = {}
53
+
54
+ @functools.wraps(func)
55
+ def wrapper(*args, **kwargs):
56
+ # Создаем ключ из аргументов
57
+ key = str(args) + str(sorted(kwargs.items()))
58
+
59
+ if key in cache:
60
+ print(f"Результат {func.__name__} взят из кеша")
61
+ return cache[key]
62
+
63
+ result = func(*args, **kwargs)
64
+ cache[key] = result
65
+ return result
66
+
67
+ return wrapper
68
+
69
+
70
+ def validate_types(**expected_types):
71
+ """Декоратор для проверки типов аргументов функции"""
72
+ def decorator(func: Callable) -> Callable:
73
+ @functools.wraps(func)
74
+ def wrapper(*args, **kwargs):
75
+ # Получаем имена параметров функции
76
+ import inspect
77
+ sig = inspect.signature(func)
78
+ bound_args = sig.bind(*args, **kwargs)
79
+ bound_args.apply_defaults()
80
+
81
+ # Проверяем типы
82
+ for param_name, expected_type in expected_types.items():
83
+ if param_name in bound_args.arguments:
84
+ value = bound_args.arguments[param_name]
85
+ if not isinstance(value, expected_type):
86
+ raise TypeError(
87
+ f"Параметр '{param_name}' должен быть типа {expected_type.__name__}, "
88
+ f"получен {type(value).__name__}"
89
+ )
90
+
91
+ return func(*args, **kwargs)
92
+ return wrapper
93
+ return decorator
@@ -0,0 +1,23 @@
1
+ """
2
+ Error explanation system for fishertools.
3
+
4
+ This module provides tools to explain Python errors in simple, understandable terms
5
+ for beginners learning Python.
6
+ """
7
+
8
+ from .explainer import ErrorExplainer, explain_error
9
+ from .patterns import ErrorPattern
10
+ from .formatters import ConsoleFormatter, PlainFormatter, JsonFormatter, get_formatter
11
+ from .models import ErrorExplanation, ExplainerConfig
12
+ from .exceptions import (
13
+ FishertoolsError, ExplanationError, FormattingError,
14
+ ConfigurationError, PatternError, SafeUtilityError
15
+ )
16
+
17
+ __all__ = [
18
+ "ErrorExplainer", "explain_error", "ErrorPattern",
19
+ "ConsoleFormatter", "PlainFormatter", "JsonFormatter", "get_formatter",
20
+ "ErrorExplanation", "ExplainerConfig",
21
+ "FishertoolsError", "ExplanationError", "FormattingError",
22
+ "ConfigurationError", "PatternError", "SafeUtilityError"
23
+ ]