rupython 1.3.0__py3-none-any.whl → 1.3.2__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.
rupython/__main__.py CHANGED
@@ -9,6 +9,7 @@ import sys as Система
9
9
  def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
10
10
  if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
11
11
  else: Система.__excepthook__(тип_исключения, значение, предыдущие_шаги)
12
+ Преобразователь.Очистить_файлы()
12
13
  Система.excepthook = Перехватчик_прерывания_клавиатурой
13
14
 
14
15
  Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
@@ -3,8 +3,8 @@ import runpy as Запуск_кода
3
3
  import traceback as Разборщик_исключений
4
4
  import os as ОС
5
5
  import sys as Система
6
- import importlib as Импортование
7
6
  import re as РегВыр
7
+ import shutil as Операции_оболочки
8
8
  from io import StringIO as Текстовый_ВВ
9
9
 
10
10
  Служебные_слова = {
@@ -48,7 +48,9 @@ from io import StringIO as Текстовый_ВВ
48
48
  'Используя': 'with',
49
49
  'Удалить': 'del',
50
50
  'Выбрать': 'match',
51
- 'При': 'case'
51
+ 'При': 'case',
52
+ 'Асинхр': 'async',
53
+ 'Ожидать': 'await'
52
54
  }
53
55
 
54
56
  Встроенные_функции = {
@@ -68,10 +70,10 @@ from io import StringIO as Текстовый_ВВ
68
70
  'Двоич': ( 'bin', None, False ),
69
71
  'ДелОст': ( 'divmod', None, False ),
70
72
  'Длина': ( 'len', None, False ), # Размер
71
- 'Знак_в_код': ( 'ord', None, False ),
73
+ 'Код_символа': ( 'ord', None, False ), # Знак_в_код
72
74
  'Идент': ( 'id', None, False ),
73
75
  'Имеет_поле': ( 'hasattr', None, False ),
74
- 'Код_в_знак': ( 'chr', None, False ),
76
+ 'Символ_по_коду': ( 'chr', None, False ), # Код_в_знак
75
77
  'Компл': ( 'complex', { 'действ_часть': 'real', 'мнимая_часть': 'imag' }, True ),
76
78
  'Кортеж': ( 'tuple', None, True ),
77
79
  'Логич': ( 'bool', None, False ),
@@ -321,13 +323,13 @@ from io import StringIO as Текстовый_ВВ
321
323
 
322
324
  def Прочитать_слова(чтение_строки, путь_к_файлу):
323
325
  try:
324
- for тип, название, _,_, строка in Разборщик_слов.generate_tokens(чтение_строки):
326
+ for тип, название, _, _, строка in Разборщик_слов.generate_tokens(чтение_строки):
325
327
  if тип == 5: название = название.replace(' ' * 4, '\t')
326
328
  отступов = 0; сч = 0
327
329
  while (сч < len(строка) and строка[сч] == '\t'): отступов += 1; сч += 1
328
330
  yield тип, название, отступов
329
331
  except Exception as ошибка:
330
- Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу)
332
+ Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
331
333
 
332
334
  def Выполнить_основные_замены(слова, соответствия):
333
335
  for номер, слово in enumerate(слова):
@@ -393,7 +395,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
393
395
  поз += 1
394
396
  if уровень_скобок != 0:
395
397
  искл = SyntaxError('Незакрытое выражение в f-строке')
396
- Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу)
398
+ Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу, True, False)
397
399
  выражение = содержимое[нач_поз:поз-1]
398
400
  try:
399
401
  токены_выражения = list(Разборщик_слов.generate_tokens(Текстовый_ВВ(выражение).readline))
@@ -405,7 +407,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
405
407
  выражение_текст = Разборщик_слов.untokenize((ток[0], ток[1]) for ток in токены_выражения if ток[0] not in (4, 5, 6)).strip()
406
408
  новые_токены.append((3, '{' + выражение_текст + '}', отступов))
407
409
  except Exception as ошибка:
408
- Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу)
410
+ Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу, True, False)
409
411
  else:
410
412
  нач_поз = поз
411
413
  while поз < len(содержимое) and содержимое[поз] not in ['{', '}']:
@@ -475,21 +477,32 @@ def Обработать_импорт(импорт, путь_к_текущему
475
477
  путь = разделитель.join(путь) + \
476
478
  (разделитель + источник.replace('.', разделитель) if len(источник) > 0 else '') + \
477
479
  разделитель + название
478
- if ОС.path.isfile(путь + '.крп') and not ОС.path.isfile(путь + '.py'):
480
+
481
+ def Преобразовать_скрипт(путь, доп_путь = None):
479
482
  if путь not in Временные_файлы:
480
483
  код = Преобразовать_код(путь + '.крп')
481
- файл = open(путь + '.py', mode='w', encoding='utf-8')
482
- if (not файл):
484
+ файл = open((путь if not доп_путь else доп_путь) + '.py', mode='w', encoding='utf-8')
485
+ if not файл:
483
486
  искл = FileNotFoundError('Невозможно открыть файл "' + файл + '".')
484
- Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу)
487
+ Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, True, False)
485
488
  файл.write(код)
486
489
  файл.close()
487
- Временные_файлы.append(путь)
490
+ Временные_файлы.append(путь if not доп_путь else доп_путь)
491
+
492
+ if ОС.path.isfile(путь + '.крп') and not ОС.path.isfile(путь + '.py'):
493
+ Преобразовать_скрипт(путь)
494
+ elif ОС.path.exists(путь):
495
+ for скрипт_пакета in [('__Основа__', '__init__'), ('__Запуск__', '__main__')]:
496
+ if ОС.path.isfile(путь + разделитель + скрипт_пакета[0] + '.крп'):
497
+ Преобразовать_скрипт(
498
+ путь + разделитель + скрипт_пакета[0],
499
+ путь + разделитель + скрипт_пакета[1]
500
+ )
488
501
 
489
502
  def Проверить_соответствие_слов(слова, путь_к_файлу):
490
503
  def Вывести_исключение(инструкция):
491
504
  искл = SyntaxError('Ошибка употребления инструкции "' + инструкция + '".')
492
- Вывести_текст_исключения(искл, 'при разборе кода', путь_к_файлу)
505
+ Вывести_текст_исключения(искл, 'при разборе кода', путь_к_файлу, True, False)
493
506
 
494
507
  for сл in ('Подключить', 'Если', 'Иначе'):
495
508
  for поз in [i for i, x in enumerate(слова) if x[1] == сл]:
@@ -517,7 +530,7 @@ def Преобразовать_код(путь_к_файлу):
517
530
  файл = open(путь_к_файлу, 'r', encoding='utf-8')
518
531
  except:
519
532
  искл = FileNotFoundError('Невозможно открыть файл "' + путь_к_файлу + '".')
520
- Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False)
533
+ Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False, False)
521
534
 
522
535
  слова = list(Прочитать_слова(файл.readline, путь_к_файлу))
523
536
  if not Проверить_соответствие_слов(слова, путь_к_файлу): return
@@ -658,7 +671,7 @@ def Преобразовать_код(путь_к_файлу):
658
671
  try:
659
672
  исходник = Разборщик_слов.untokenize(map(lambda с: (с[0], с[1]), слова))
660
673
  except Exception as ошибка:
661
- Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу)
674
+ Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
662
675
 
663
676
  if исходник:
664
677
  исходник = 'import ' + __name__.split('.')[0] + '.__Заголовочный_код__\n\n' + исходник
@@ -720,12 +733,23 @@ def Посчитать_физические_строки(путь_к_файлу,
720
733
  r"TypeError: cannot unpack non-iterable (\w+) object": r'Невозможно распаковать неитерируемый объект типа "\1".',
721
734
  r"MemoryError": r'Недостаточно памяти для выполнения операции.',
722
735
  r"OverflowError: (.+)": r'Переполнение: \1.',
723
- r"no binding for nonlocal '(.+)' found": 'Не найдена привязка для нелокальной сущности "\1".',
736
+ r"no binding for nonlocal '(.+)' found": r'Не найдена привязка для нелокальной сущности "\1".',
724
737
  r"AssertionError": r'Ошибка проверки: условие не выполнено.',
725
- r"attempted relative import with no known parent package": r'Попытка относительного импорта без известного родительского пакета.'
738
+ r"attempted relative import with no known parent package": r'Попытка относительного импорта без известного родительского пакета.',
739
+ r"pop from empty list": r'Извлечение из пустого списка.',
740
+ r"No module named '(.+)'": r'Модуль под названием "\1" не найден.',
741
+ r"unindent does not match any outer indentation level": r'Отступ не соответствует никакому окружающему уровню.',
742
+ r"int too big to convert": r'Число слишком большое для преобразования.',
743
+ r"unexpected indent": r'Неожиданный отступ.'
726
744
  }
727
745
 
728
- def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу, с_заголовком = True):
746
+ def Очистить_файлы():
747
+ for файл in Временные_файлы:
748
+ ОС.remove(файл + '.py')
749
+ кэш = ОС.path.join(ОС.path.dirname(файл), '__pycache__')
750
+ if ОС.path.exists(кэш): Операции_оболочки.rmtree(кэш)
751
+
752
+ def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу, с_заголовком = True, добавлен_импорт = False):
729
753
  назв_исп_ф = путь_к_файлу.split('\\' if Система.platform.startswith('win32') else '/')[-1]
730
754
  сч = 1
731
755
  while True:
@@ -739,20 +763,14 @@ def Вывести_текст_исключения(исключение, заг
739
763
  if искл.filename == назв_исп_ф: break
740
764
  сч += 1
741
765
  if сч != -1 and искл.filename == назв_исп_ф:
742
- номер_строки = искл.lineno - 2
766
+ номер_строки = искл.lineno - (2 if добавлен_импорт else 0)
743
767
  else:
744
- try: номер_строки = исключение.lineno - 2
768
+ try: номер_строки = исключение.lineno - (2 if добавлен_импорт else 0)
745
769
  except: номер_строки = 0
746
770
 
747
771
  if номер_строки > 0:
748
772
  номер_строки = Посчитать_физические_строки(путь_к_файлу, номер_строки)
749
773
 
750
- выч_стр = 0
751
- for ц in Циклы_со_счётчиком:
752
- if номер_строки > ц[1] + 1: выч_стр += 2;
753
- elif номер_строки > ц[0]: выч_стр += 1; break
754
- else: break
755
- номер_строки -= выч_стр
756
774
  название_исключения = type(исключение).__name__
757
775
  if название_исключения in Исключения.values():
758
776
  название_исключения = next(к for к, з in Исключения.items() if з == название_исключения)
@@ -768,9 +786,9 @@ def Вывести_текст_исключения(исключение, заг
768
786
  if РегВыр.match(шаблон, текст_исключения):
769
787
  текст_исключения = РегВыр.sub(шаблон, перевод, текст_исключения)
770
788
  break
771
- print((' ' if с_заголовком else '') + str(текст_исключения))
789
+ print((' ' if с_заголовком else '') + str(текст_исключения))
772
790
 
773
- for файл in Временные_файлы: ОС.remove(файл + '.py')
791
+ Очистить_файлы()
774
792
  input()
775
793
  Система.exit()
776
794
 
@@ -778,9 +796,9 @@ def Запустить_код(название, исходник, путь_к_ф
778
796
  код = None
779
797
  try: код = compile(исходник, название, 'exec')
780
798
  except Exception as исключение:
781
- Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу)
799
+ Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу, True, True)
782
800
  if код:
783
801
  try: Запуск_кода._run_module_code(код, mod_name="__Главный__", script_name=путь_к_файлу)
784
802
  except Exception as исключение:
785
- Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу)
786
- for файл in Временные_файлы: ОС.remove(файл + '.py')
803
+ Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу, True, True)
804
+ Очистить_файлы()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.3.0
3
+ Version: 1.3.2
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Author: Сообщество русских программистов
6
6
  License: ОДРН
@@ -295,7 +295,7 @@ x = 0
295
295
  ###### `Вызываемое(объект)`
296
296
  Проверяет, можно ли объект вызвать как функцию.
297
297
 
298
- ###### `Код_в_знак(i)`
298
+ ###### `Символ_по_коду(i)`
299
299
  Возвращает многобайтовый символ по его числовому коду.
300
300
 
301
301
  ###### `@Метод_класса`
@@ -409,7 +409,7 @@ x = 0
409
409
  ###### `Открыть(название, режим = 'r', буферизация = -1, кодование = Пусто, при_ошибках = Пусто, новая_строка = Пусто, закрыть_описатель = Да, открыватель = Пусто)`
410
410
  Открывает файл и возвращает файловый объект.
411
411
 
412
- ###### `Знак_в_код(c)`
412
+ ###### `Код_символа(c)`
413
413
  Возвращает многобайтовый код символа `c`.
414
414
 
415
415
  ###### `Степень(основание, показатель, модуль = Пусто)`
@@ -1,7 +1,7 @@
1
- rupython/__main__.py,sha256=wfmjyJhg6iQN1_9Hl6tIu6mKHO95xP2ibVcDdIIEXjE,1256
1
+ rupython/__main__.py,sha256=sb4hTmi5_MtnNDEpm43DAgklVPWT4ddm4yQtattUdeE,1322
2
2
  rupython/__Заголовочный_код__.py,sha256=yTxMJ93pxJeg_h-BnrTMoAqSB_a0tliYX6gkXtTyWx8,13594
3
3
  rupython/__Общие_функции__.py,sha256=MH9QLcXqeFmpOS5_N8P5wA5eCYutlHRc7YUatn3CUIk,1255
4
- rupython/Преобразователь.py,sha256=7-lzB-kZmuekzYYrFblbnVGw7WHfZDSsM6voS9dTiV4,49373
4
+ rupython/Преобразователь.py,sha256=dxVD7cqs_zQAm6RMIv8hM5ImouaY7T7lCsnFSbEhUBM,50995
5
5
  rupython/Модули/Асинхр.py,sha256=sPQUgbS_kXj-Gyn2YCjXNCUqAy8aUW2-P6gO5e7f6Cc,9925
6
6
  rupython/Модули/БД.py,sha256=GQSKiv3fRF9Bsw4S7jXw4KR1Ibqvk8TwQbEe1JjvsGA,38392
7
7
  rupython/Модули/ДатаВремя.py,sha256=Ec9YyY1jb-R9uyXrrDNfaTqBQVv98_GPn29OY8dUkj8,27523
@@ -14,8 +14,8 @@ rupython/Модули/Потоки.py,sha256=am6hWxcrCx4Vx_FFPMIIhSl_ShWSV5vjW5d
14
14
  rupython/Модули/РегВыр.py,sha256=OWgYtgBDtHsEHUOAsGx7K0UGq92sumSqEyf-sVpICjw,6709
15
15
  rupython/Модули/Случ.py,sha256=foIuQo2QZ5z0iyxp9fn4NaunSx96vYzC2pRjwaT2FD8,2723
16
16
  rupython/Модули/Файлы.py,sha256=AekdYf2jmPhRW_9BngbQDzgTfsMr4zPpKzuwp6fRfzQ,6895
17
- rupython-1.3.0.dist-info/LICENSE,sha256=qqVMvbdzR5e4XIV6qwYVgI5Ovki8wR0qZaKB2Oj9DXw,25656
18
- rupython-1.3.0.dist-info/METADATA,sha256=0Uu6U66o5-ucmZhNvFGpworW1fxOq4BBAHtg8-MYi1A,30445
19
- rupython-1.3.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
20
- rupython-1.3.0.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
21
- rupython-1.3.0.dist-info/RECORD,,
17
+ rupython-1.3.2.dist-info/LICENSE,sha256=qqVMvbdzR5e4XIV6qwYVgI5Ovki8wR0qZaKB2Oj9DXw,25656
18
+ rupython-1.3.2.dist-info/METADATA,sha256=UsXvGM99Hn_il6wjJVCi4DN-qTyKcC5pqlvh64s3CO4,30456
19
+ rupython-1.3.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
20
+ rupython-1.3.2.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
21
+ rupython-1.3.2.dist-info/RECORD,,