ruspy-transpiler


Nameruspy-transpiler JSON
Version 0.2.3 PyPI version JSON
download
home_pageNone
SummaryТранспилятор русского Python: пишите код на русском, получайте стандартный Python!
upload_time2025-09-07 11:36:56
maintainerNone
docs_urlNone
authorСаша Трунов
requires_python>=3.7
licenseMIT
keywords python transpiler russian русский python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <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"
}
        
Elapsed time: 1.49904s