<div align="center">
<img src="https://img.shields.io/pypi/v/ruspy-transpiler" alt="PyPI">
<img src="https://github.com/c1cada3301-web/ruspy/actions/workflows/publish-to-pypi.yml/badge.svg" alt="Build">
<img src="https://img.shields.io/codecov/c/github/c1cada3301-web/ruspy" alt="Coverage">
<img src="https://img.shields.io/badge/lint-passing-brightgreen" alt="Lint">
# Русский Python (ruspy-transpiler)
</div>
Транспилятор, позволяющий писать Python-код с русскими ключевыми словами, функциями и идентификаторами.
---
## Установка
1. Склонируйте репозиторий или скачайте исходный код.
2. Перейдите в папку проекта и установите пакет локально:
```bash
pip install .
```
или для разработки:
```bash
pip install -e .
```
## Структура проекта
- `ruspy/` — основной пакет
- `transpiler.py` — логика транспиляции
- `ruspy_dict.py` — официальный словарь (ключевые слова, функции, технические термины)
- `ruspy_user_dict.py` — пользовательский словарь (ваши идентификаторы и сообщения)
- `cli.py` — CLI-интерфейс
- `setup.py` — файл для установки
- `test_ruspy.py` — пример кода на русском синтаксисе
---
## Использование
### Через CLI
```bash
ruspy test_ruspy.py -o test_ruspy_out.py
```
или
```bash
python -m ruspy.cli test_ruspy.py -o test_ruspy_out.py
```
- `test_ruspy.py` — ваш файл с русским синтаксисом.
- `test_ruspy_out.py` — результат на стандартном Python.
### Как библиотека
```python
from ruspy.transpiler import transpile_file
transpile_file('test_ruspy.py', 'test_ruspy_out.py')
```
### Новые команды CLI
```bash
# Пакетная обработка всех .py файлов в папке
ruspy --batch batch_test batch_out
# Статистика замен по словарям для файла
ruspy --stats test_ruspy.py
# Проверка словарей на дубли и пустые значения
ruspy --check-dict
```
---
## Интеграция с редакторами
### VS Code
1. Откройте папку проекта в VS Code.
2. В каталоге .vscode уже есть tasks.json для задачи "Ruspy Transpile".
3. Для запуска транспиляции нажмите Ctrl+Shift+B или выберите задачу "Ruspy Transpile" в палитре команд.
4. Для автоматической транспиляции при сохранении установите расширение "Run on Save" и добавьте в settings.json:
```json
"runOnSave.commands": [
{
"match": "\\.py$",
"command": "workbench.action.tasks.runTask",
"args": "Ruspy Transpile"
}
]
```
### PyCharm
1. Откройте File → Settings → Tools → File Watchers.
2. Нажмите "+" → Custom.
3. Заполните:
- Name: Ruspy Transpile
- File type: Python
- Program: путь до ruspy.exe (например, venv\Scripts\ruspy.exe)
- Arguments: $FileName$ -o $FileNameWithoutExtension$_out.py
- Working directory: $ProjectFileDir$
4. Включите "Auto-save edited files to trigger the watcher".
5. Сохраните настройки.
Теперь транспиляция будет запускаться автоматически при сохранении .py-файла!
---
## Автоматические тесты
В проекте есть папка `tests/` с примерами тестов на pytest. Для запуска тестов:
```bash
pytest tests
# или
python -m pytest tests
```
Тесты проверяют корректность транспиляции и пакетной обработки файлов.
---
## Расширение словарей
- Для добавления новых переводов ключевых слов и функций — редактируйте `ruspy_dict.py` (официальный словарь, только ключевые слова, стандартные функции и технические термины).
- Для пользовательских идентификаторов и сообщений — используйте `ruspy_user_dict.py` (сюда попадают только ваши переменные, функции, сообщения и т.д.).
### Автоматическое обновление пользовательского словаря
Чтобы добавить новые пользовательские идентификаторы автоматически:
1. Просто напишите новые идентификаторы на русском в вашем `.py`-файле.
2. Запустите:
```bash
python ruspy/trans_user_dict.py ваш_файл.py
```
Новые слова будут автоматически найдены в коде, переведены и добавлены в `ruspy_user_dict.py`. Уже существующие идентификаторы не будут затёрты, а новые просто добавятся.
### Проверка полноты
Для проверки, все ли термины переведены, используйте скрипт:
```bash
python check_ruspy_dict.py
```
---
## Список поддерживаемых ключевых слов и функций
Полный список — в файле [`ruspy_dict.py`](ruspy/ruspy_dict.py). Можно вывести через команду:
```bash
python -c "from ruspy.ruspy_dict import RUSPY_DICT; print(list(RUSPY_DICT.keys()))"
```
---
## Примеры кода
### Русский синтаксис (`test_ruspy.py`)
```python
функция приветствие(имя):
печать('Привет,', имя)
если __имя__ == '__главный__':
имя = ввод('Введите имя: ')
приветствие(имя)
```
### После транспиляции (`test_ruspy_out.py`)
```python
def greeting(name):
print('Hello,', name)
if __name__ == '__main__':
name = input('Enter name: ')
greeting(name)
```
---
## Документация и ресурсы
- [PyPI](https://pypi.org/project/ruspy-transpiler/)
- [GitHub](https://github.com/c1cada3301-web/ruspy)
- [Примеры](#примеры-кода)
---
## Быстрый запуск через Docker
```bash
docker build -t ruspy .
docker run --rm -v %cd%:/app ruspy ruspy test_ruspy.py -o test_ruspy_out.py
```
---
## Публикация своего пакета
1. Измените имя пакета в `pyproject.toml`.
2. Соберите и опубликуйте пакет:
```bash
python -m build
twine upload dist/*
```
---
## Лицензия
MIT License. См. файл [LICENSE](LICENSE).
---
## Контакты
- GitHub Issues: https://github.com/c1cada3301-web/ruspy/issues
- Email: shtrnv@ya.ru
- Telegram: [@cicada_web](https://t.me/cicada_web)
---
## Благодарности
Спасибо всем авторам идей, тестировщикам и вдохновителям! А особенно [@mcodeg](https://t.me/mcodeg), его Tik-Tok: <https://www.tiktok.com/@mcodeg_>
---
## FAQ
**Q: Можно ли использовать свои словари?**
A: Да, просто добавьте нужные пары в `ruspy_user_dict.py` или создайте свой файл и импортируйте его в транспилятор.
Официальный словарь (`ruspy_dict.py`) содержит только ключевые слова и стандартные функции, пользовательский (`ruspy_user_dict.py`) — только ваши идентификаторы.
Пользовательский словарь теперь можно автоматически обновлять из любого `.py`-файла с русским кодом командой:
```bash
python ruspy/trans_user_dict.py ваш_файл.py
```
**Q: Как добавить поддержку нового языка?**
A: Создайте отдельный словарь (например, `ruspy_dict_ua.py`) и добавьте опцию выбора словаря в CLI.
**Q: Как проверить, что всё работает?**
A: Запустите автоматические тесты или используйте команду `ruspy --stats` для анализа замен.
**Q: Как интегрировать с редактором?**
A: Смотрите раздел "Интеграция с редакторами" выше.
---
## История изменений (Changelog)
- v0.2.3 — Автоматическое обновление пользовательского словаря из `.py`-файла с русским кодом (теперь не нужен отдельный файл-список, всё ищется и переводится автоматически)
- v0.1.2 — Расширенный CLI, интеграция с редакторами, автоматические тесты, Dockerfile, README.md
- v0.1.0 — Первый релиз
---
<!-- Скриншоты или GIF работы CLI и интеграции с редакторами можно добавить ниже -->
---
Проект в стадии разработки. Приветствуются идеи и pull request'ы!
Raw data
{
"_id": null,
"home_page": null,
"name": "ruspy-transpiler",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "python, transpiler, russian, \u0440\u0443\u0441\u0441\u043a\u0438\u0439 python",
"author": "\u0421\u0430\u0448\u0430 \u0422\u0440\u0443\u043d\u043e\u0432",
"author_email": "\u0421\u0430\u0448\u0430 \u0422\u0440\u043d\u0443\u043e\u0432 <shtrnv@ya.ru>",
"download_url": "https://files.pythonhosted.org/packages/80/30/b1a5829097da552ab107596933bba121e8e2b6312aeb1912a8b04ff9b864/ruspy_transpiler-0.2.3.tar.gz",
"platform": null,
"description": "<div align=\"center\">\r\n\r\n<img src=\"https://img.shields.io/pypi/v/ruspy-transpiler\" alt=\"PyPI\">\r\n<img src=\"https://github.com/c1cada3301-web/ruspy/actions/workflows/publish-to-pypi.yml/badge.svg\" alt=\"Build\">\r\n<img src=\"https://img.shields.io/codecov/c/github/c1cada3301-web/ruspy\" alt=\"Coverage\">\r\n<img src=\"https://img.shields.io/badge/lint-passing-brightgreen\" alt=\"Lint\">\r\n\r\n# \u0420\u0443\u0441\u0441\u043a\u0438\u0439 Python (ruspy-transpiler)\r\n\r\n</div>\r\n\r\n\u0422\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0438\u0441\u0430\u0442\u044c Python-\u043a\u043e\u0434 \u0441 \u0440\u0443\u0441\u0441\u043a\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438.\r\n\r\n---\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\r\n\r\n1. \u0421\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434.\r\n2. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043f\u0430\u043a\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e:\r\n\t ```bash\r\n\t pip install .\r\n\t ```\r\n\t \u0438\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:\r\n\t ```bash\r\n\t pip install -e .\r\n\t ```\r\n\r\n## \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\r\n\r\n- `ruspy/` \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\r\n\t- `transpiler.py` \u2014 \u043b\u043e\u0433\u0438\u043a\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u0438\r\n\t- `ruspy_dict.py` \u2014 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b)\r\n\t- `ruspy_user_dict.py` \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (\u0432\u0430\u0448\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f)\r\n\t- `cli.py` \u2014 CLI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\r\n- `setup.py` \u2014 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\r\n- `test_ruspy.py` \u2014 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435\r\n\r\n---\r\n\r\n## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\r\n\r\n### \u0427\u0435\u0440\u0435\u0437 CLI\r\n\r\n```bash\r\nruspy test_ruspy.py -o test_ruspy_out.py\r\n```\r\n\u0438\u043b\u0438\r\n```bash\r\npython -m ruspy.cli test_ruspy.py -o test_ruspy_out.py\r\n```\r\n- `test_ruspy.py` \u2014 \u0432\u0430\u0448 \u0444\u0430\u0439\u043b \u0441 \u0440\u0443\u0441\u0441\u043a\u0438\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c.\r\n- `test_ruspy_out.py` \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c Python.\r\n\r\n### \u041a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\r\n\r\n```python\r\nfrom ruspy.transpiler import transpile_file\r\ntranspile_file('test_ruspy.py', 'test_ruspy_out.py')\r\n```\r\n\r\n### \u041d\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b CLI\r\n\r\n```bash\r\n# \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0441\u0435\u0445 .py \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0435\r\nruspy --batch batch_test batch_out\r\n\r\n# \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0437\u0430\u043c\u0435\u043d \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430\r\nruspy --stats test_ruspy.py\r\n\r\n# \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u043d\u0430 \u0434\u0443\u0431\u043b\u0438 \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\r\nruspy --check-dict\r\n```\r\n\r\n---\r\n\r\n## \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438\r\n\r\n### VS Code\r\n1. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 VS Code.\r\n2. \u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 .vscode \u0443\u0436\u0435 \u0435\u0441\u0442\u044c tasks.json \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \"Ruspy Transpile\".\r\n3. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl+Shift+B \u0438\u043b\u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \"Ruspy Transpile\" \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434.\r\n4. \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \"Run on Save\" \u0438 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 settings.json:\r\n\t ```json\r\n\t \"runOnSave.commands\": [\r\n\t\t {\r\n\t\t\t \"match\": \"\\\\.py$\",\r\n\t\t\t \"command\": \"workbench.action.tasks.runTask\",\r\n\t\t\t \"args\": \"Ruspy Transpile\"\r\n\t\t }\r\n\t ]\r\n\t ```\r\n\r\n### PyCharm\r\n1. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 File \u2192 Settings \u2192 Tools \u2192 File Watchers.\r\n2. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \"+\" \u2192 Custom.\r\n3. \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435:\r\n\t - Name: Ruspy Transpile\r\n\t - File type: Python\r\n\t - Program: \u043f\u0443\u0442\u044c \u0434\u043e ruspy.exe (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, venv\\Scripts\\ruspy.exe)\r\n\t - Arguments: $FileName$ -o $FileNameWithoutExtension$_out.py\r\n\t - Working directory: $ProjectFileDir$\r\n4. \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \"Auto-save edited files to trigger the watcher\".\r\n5. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.\r\n\r\n\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 .py-\u0444\u0430\u0439\u043b\u0430!\r\n\r\n---\r\n\r\n## \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b\r\n\r\n\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0430 `tests/` \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 pytest. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432:\r\n\r\n```bash\r\npytest tests\r\n# \u0438\u043b\u0438\r\npython -m pytest tests\r\n```\r\n\r\n\u0422\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432.\r\n\r\n---\r\n\r\n## \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439\r\n\r\n- \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 `ruspy_dict.py` (\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b).\r\n- \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 `ruspy_user_dict.py` (\u0441\u044e\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434.).\r\n\r\n### \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:\r\n1. \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0432 \u0432\u0430\u0448\u0435\u043c `.py`-\u0444\u0430\u0439\u043b\u0435.\r\n2. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435:\r\n ```bash\r\n python ruspy/trans_user_dict.py \u0432\u0430\u0448_\u0444\u0430\u0439\u043b.py\r\n ```\r\n \u041d\u043e\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435, \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 `ruspy_user_dict.py`. \u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0451\u0440\u0442\u044b, \u0430 \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044f\u0442\u0441\u044f.\r\n\r\n### \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u0442\u044b\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0432\u0441\u0435 \u043b\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442:\r\n```bash\r\npython check_ruspy_dict.py\r\n```\r\n\r\n---\r\n\r\n## \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439\r\n\r\n\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 \u0432 \u0444\u0430\u0439\u043b\u0435 [`ruspy_dict.py`](ruspy/ruspy_dict.py). \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\r\n```bash\r\npython -c \"from ruspy.ruspy_dict import RUSPY_DICT; print(list(RUSPY_DICT.keys()))\"\r\n```\r\n\r\n---\r\n\r\n## \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430\r\n\r\n### \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 (`test_ruspy.py`)\r\n```python\r\n\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435(\u0438\u043c\u044f):\r\n\t\t\u043f\u0435\u0447\u0430\u0442\u044c('\u041f\u0440\u0438\u0432\u0435\u0442,', \u0438\u043c\u044f)\r\n\r\n\u0435\u0441\u043b\u0438 __\u0438\u043c\u044f__ == '__\u0433\u043b\u0430\u0432\u043d\u044b\u0439__':\r\n\t\t\u0438\u043c\u044f = \u0432\u0432\u043e\u0434('\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f: ')\r\n\t\t\u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435(\u0438\u043c\u044f)\r\n```\r\n\r\n### \u041f\u043e\u0441\u043b\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (`test_ruspy_out.py`)\r\n```python\r\ndef greeting(name):\r\n\t\tprint('Hello,', name)\r\n\r\nif __name__ == '__main__':\r\n\t\tname = input('Enter name: ')\r\n\t\tgreeting(name)\r\n```\r\n\r\n---\r\n\r\n## \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b\r\n\r\n- [PyPI](https://pypi.org/project/ruspy-transpiler/)\r\n- [GitHub](https://github.com/c1cada3301-web/ruspy)\r\n- [\u041f\u0440\u0438\u043c\u0435\u0440\u044b](#\u043f\u0440\u0438\u043c\u0435\u0440\u044b-\u043a\u043e\u0434\u0430)\r\n\r\n---\r\n\r\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u0440\u0435\u0437 Docker\r\n\r\n```bash\r\ndocker build -t ruspy .\r\ndocker run --rm -v %cd%:/app ruspy ruspy test_ruspy.py -o test_ruspy_out.py\r\n```\r\n\r\n---\r\n\r\n## \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430\r\n\r\n1. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 `pyproject.toml`.\r\n2. \u0421\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u043f\u0430\u043a\u0435\u0442:\r\n\t ```bash\r\n\t python -m build\r\n\t twine upload dist/*\r\n\t ```\r\n\r\n---\r\n\r\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\r\n\r\nMIT License. \u0421\u043c. \u0444\u0430\u0439\u043b [LICENSE](LICENSE).\r\n\r\n---\r\n\r\n## \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b\r\n\r\n- GitHub Issues: https://github.com/c1cada3301-web/ruspy/issues\r\n- Email: shtrnv@ya.ru\r\n- Telegram: [@cicada_web](https://t.me/cicada_web)\r\n\r\n---\r\n\r\n## \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438\r\n\r\n\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0438\u0434\u0435\u0439, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u0435\u043b\u044f\u043c! \u0410 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e [@mcodeg](https://t.me/mcodeg), \u0435\u0433\u043e Tik-Tok: <https://www.tiktok.com/@mcodeg_> \r\n\r\n---\r\n\r\n## FAQ\r\n\r\n**Q: \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438?** \r\nA: \u0414\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u0440\u044b \u0432 `ruspy_user_dict.py` \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \r\n\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (`ruspy_dict.py`) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 (`ruspy_user_dict.py`) \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b. \r\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e `.py`-\u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0443\u0441\u0441\u043a\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:\r\n```bash\r\npython ruspy/trans_user_dict.py \u0432\u0430\u0448_\u0444\u0430\u0439\u043b.py\r\n```\r\n\r\n**Q: \u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430?** \r\nA: \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, `ruspy_dict_ua.py`) \u0438 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043e\u043f\u0446\u0438\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0432 CLI.\r\n\r\n**Q: \u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?** \r\nA: \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 `ruspy --stats` \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0437\u0430\u043c\u0435\u043d.\r\n\r\n**Q: \u041a\u0430\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c?** \r\nA: \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b \"\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438\" \u0432\u044b\u0448\u0435.\r\n\r\n---\r\n\r\n## \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (Changelog)\r\n\r\n- v0.2.3 \u2014 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0438\u0437 `.py`-\u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0443\u0441\u0441\u043a\u0438\u043c \u043a\u043e\u0434\u043e\u043c (\u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b-\u0441\u043f\u0438\u0441\u043e\u043a, \u0432\u0441\u0451 \u0438\u0449\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438)\r\n- v0.1.2 \u2014 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 CLI, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, Dockerfile, README.md\r\n- v0.1.0 \u2014 \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437\r\n\r\n---\r\n\r\n<!-- \u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438\u043b\u0438 GIF \u0440\u0430\u0431\u043e\u0442\u044b CLI \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0438\u0436\u0435 -->\r\n\r\n---\r\n\r\n\u041f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0438\u0434\u0435\u0438 \u0438 pull request'\u044b!\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u0422\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e Python: \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0439\u0442\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Python!",
"version": "0.2.3",
"project_urls": {
"Bug Tracker": "https://github.com/c1cada3301-web/ruspy/issues",
"Homepage": "https://github.com/c1cada3301-web/ruspy.git"
},
"split_keywords": [
"python",
" transpiler",
" russian",
" \u0440\u0443\u0441\u0441\u043a\u0438\u0439 python"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "95fb770044e5da8e707a755477176cbb1622646f66742d5c27a333d65cc57a59",
"md5": "cc9a0deebf86d0faf2687139efad2988",
"sha256": "0f257e8b0a145dea6dda065a39433a5f68d10b6fc9f1e6c46e5e15738024ff5b"
},
"downloads": -1,
"filename": "ruspy_transpiler-0.2.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cc9a0deebf86d0faf2687139efad2988",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 18607,
"upload_time": "2025-09-07T11:36:53",
"upload_time_iso_8601": "2025-09-07T11:36:53.823089Z",
"url": "https://files.pythonhosted.org/packages/95/fb/770044e5da8e707a755477176cbb1622646f66742d5c27a333d65cc57a59/ruspy_transpiler-0.2.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8030b1a5829097da552ab107596933bba121e8e2b6312aeb1912a8b04ff9b864",
"md5": "3805aa10034585a734d293cea9d12c1f",
"sha256": "4bb2cc80b9c5baccb1b3cc5a2de51c47d648cddd81b1165abe90c7b27aa5808f"
},
"downloads": -1,
"filename": "ruspy_transpiler-0.2.3.tar.gz",
"has_sig": false,
"md5_digest": "3805aa10034585a734d293cea9d12c1f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 19880,
"upload_time": "2025-09-07T11:36:56",
"upload_time_iso_8601": "2025-09-07T11:36:56.833653Z",
"url": "https://files.pythonhosted.org/packages/80/30/b1a5829097da552ab107596933bba121e8e2b6312aeb1912a8b04ff9b864/ruspy_transpiler-0.2.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-07 11:36:56",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "c1cada3301-web",
"github_project": "ruspy",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "ruspy-transpiler"
}