rupython 1.1.7__py3-none-any.whl → 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
rupython/__main__.py CHANGED
@@ -4,9 +4,13 @@ import sys as Система
4
4
 
5
5
  Путь_к_файлу = ОС.path.realpath(Система.argv[1])
6
6
  Название_файла = ОС.path.basename(Система.argv[1])
7
- Исходник = None
7
+
8
+ def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
9
+ if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
10
+ else: Система.__excepthook__(тип, значение, предыдущие_шаги)
11
+ Система.excepthook = Перехватчик_прерывания_клавиатурой
12
+
8
13
  Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
9
- if Исходник:
10
- Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
14
+ if Исходник: Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
11
15
 
12
- input()
16
+ Преобразователь.Ожидать_нажатие_клавиши('=== Исполнение кода завершено. Нажмите любую клавишу для выхода. ===')
@@ -1,9 +1,7 @@
1
1
  import sqlite3
2
+ import re as РегВыр
2
3
 
3
4
  Ошибка = sqlite3.Error
4
- ОшибкаБазыДанных = sqlite3.DatabaseError
5
- ОшибкаПрограммования = sqlite3.ProgrammingError
6
- ОшибкаОперации = sqlite3.OperationalError
7
5
 
8
6
  Разбор_объявленных_типов = sqlite3.PARSE_DECLTYPES
9
7
  Разбор_названий_столбцов = sqlite3.PARSE_COLNAMES
@@ -16,13 +14,15 @@ import sqlite3
16
14
 
17
15
  Словарь_перевода = {
18
16
  'НАЧАТЬ': 'BEGIN',
19
- 'ЗАКОНЧИТЬ': 'END',
17
+ 'ЗАВЕРШИТЬ': 'END',
20
18
  'ТРАНЗАКЦИЮ': 'TRANSACTION',
19
+ 'УТВЕРДИТЬ': 'COMMIT',
21
20
  'ОТЛОЖЕННО': 'DEFERRED',
22
21
  'НЕМЕДЛЕННО': 'IMMEDIATE',
23
22
  'ИСКЛЮЧИТЕЛЬНО': 'EXCLUSIVE',
24
23
  'ОТКАТИТЬ': 'ROLLBACK',
25
24
  'ТОЧКА_СОХРАНЕНИЯ': 'SAVEPOINT',
25
+ 'НАСТРОИТЬ': 'PRAGMA',
26
26
 
27
27
  'ВЫБРАТЬ': 'SELECT',
28
28
  'ИЗ': 'FROM',
@@ -50,23 +50,36 @@ import sqlite3
50
50
  'ПЕРЕКРЁСТНО': 'CROSS',
51
51
  'ИСПОЛЬЗУЯ': 'USING',
52
52
 
53
+ 'ВСТАВИТЬ ИЛИ ___ В': 'INSERT OR ___ INTO',
53
54
  'ДОБАВИТЬ В': 'INSERT INTO',
54
55
  'ЗНАЧЕНИЯ': 'VALUES',
55
56
  'ИЗМЕНИТЬ': 'UPDATE',
56
57
  'УСТАНОВИВ': 'SET',
57
58
  'УДАЛИТЬ': 'DELETE',
59
+ 'ПРИ КОНФЛИКТЕ': 'ON CONFLICT',
60
+ 'ВЫПОЛНЯТЬ': 'DO',
61
+ 'НИЧЕГО': 'NOTHING',
62
+ 'ПРОПУСТИТЬ': 'IGNORE',
63
+ 'ПРЕРВАТЬ': 'ABORT',
64
+ 'ЗАМЕНИТЬ': 'REPLACE',
65
+ 'ОТКАТИТЬ': 'ROLLBACK',
66
+ 'СБОЙ': 'FAIL',
58
67
 
59
68
  'ИЗМЕНИТЬ ТАБЛИЦУ': 'ALTER TABLE',
60
69
  'ИЗМЕНИТЬ СТОЛБЕЦ': 'ALTER COLUMN',
61
70
  'СОЗДАТЬ': 'CREATE',
62
71
  'БАЗУ ДАННЫХ': 'DATABASE',
63
72
  'ТАБЛИЦУ': 'TABLE',
73
+ 'ВРЕМЕННУЮ': 'TEMPORARY',
64
74
  'ДОБАВИВ': 'ADD',
65
75
  'УДАЛИВ': 'DROP',
66
76
  'ИНДЕКС': 'INDEX',
77
+ 'СХЕМУ': 'SCHEME',
78
+ 'ТАБЛИЦУ': 'TABLE',
67
79
  'УНИКАЛЬНЫЙ': 'UNIQUE',
68
80
  'ПРЕДСТАВЛЕНИЕ': 'VIEW',
69
81
  'СТОЛБЕЦ': 'COLUMN',
82
+ 'СТРОГО': 'STRICT',
70
83
 
71
84
  'ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NULL',
72
85
  'НЕ ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NOT NULL',
@@ -79,6 +92,14 @@ import sqlite3
79
92
  'В': 'IN',
80
93
  'ЕСЛИ': 'IF',
81
94
  'СУЩЕСТВУЕТ': 'EXISTS',
95
+ 'БЕЗ': 'WITHOUT',
96
+
97
+ 'ОПРЕДЕЛИВ': 'WITH',
98
+ 'ВЫБОР': 'CASE',
99
+ 'ПРИ': 'WHEN',
100
+ 'ЭТО': 'THEN',
101
+ 'КОНЕЦ': 'END',
102
+ 'РЕКУРСИВНО': 'RECURSIVE',
82
103
 
83
104
  'ЦЕЛОЕ': 'INTEGER',
84
105
  'ВЕЩЕСТВЕННОЕ': 'REAL',
@@ -98,12 +119,14 @@ import sqlite3
98
119
  'НЕТ': 'FALSE',
99
120
  'ПО_УМОЛЧАНИЮ': 'DEFAULT',
100
121
  'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTO_INCREMENT',
122
+ 'ССЫЛАЕТСЯ НА': 'REFERENCES',
101
123
 
124
+ 'ОТОБРАВ': 'FILTER',
102
125
  'КОЛИЧЕСТВО': 'COUNT',
103
126
  'СУММА': 'SUM',
104
127
  'СРЕДНЕЕ': 'AVG',
105
- 'МИНИМУМ': 'MIN',
106
- 'МАКСИМУМ': 'MAX',
128
+ 'НАИМЕНЬШЕЕ': 'MIN',
129
+ 'НАИБОЛЬШЕЕ': 'MAX',
107
130
  'СЦЕПИТЬ': 'CONCAT',
108
131
  'ДЛИНА': 'LENGTH',
109
132
  'В_ЗАГЛАВНЫЕ': 'UPPER',
@@ -225,6 +248,24 @@ def Перевести_токены(токены):
225
248
  for длина in range(5, 0, -1):
226
249
  if i + длина <= len(токены):
227
250
  фраза = ' '.join(токены[i:i + длина]).upper()
251
+
252
+ for ключ, значение in Словарь_перевода.items():
253
+ if '___' in ключ:
254
+ шаблон = '^' + ключ.replace('___', r'(\S+)') + '$'
255
+ совпадение = re.match(шаблон, фраза)
256
+ if совпадение:
257
+ переменная = совпадение.group(1).upper()
258
+ if переменная in Словарь_перевода:
259
+ переведённая_переменная = Словарь_перевода[переменная]
260
+ переведённая_фраза = значение.replace('___', переведённая_переменная)
261
+ переведённые_токены.append(переведённая_фраза)
262
+ i += длина
263
+ найдено_ключевое_слово = True
264
+ break
265
+
266
+ if найдено_ключевое_слово:
267
+ break
268
+
228
269
  if фраза in Словарь_перевода:
229
270
  переведённые_токены.append(Словарь_перевода[фраза])
230
271
  i += длина
@@ -254,21 +295,76 @@ def Перевести_код_запроса(текст):
254
295
  запрос = Собрать_запрос(переведённые_токены)
255
296
  return запрос
256
297
 
298
+ Переводы_ошибок = {
299
+ r"no such table: (.+)": r'Таблица "\1" не существует.',
300
+ r"database is locked": r'База данных заблокована.',
301
+ r"near \"(.+)\": syntax error": r'Синтаксическая ошибка около "\1".',
302
+ r"table (.+) already exists": r'Таблица "\1" уже существует.',
303
+ r"no such column: (.+)": r'Столбец "\1" не существует.',
304
+ r"(.+) has no column named (.+)": r'Таблица "\1" не имеет столбца "\2".',
305
+ r"cannot open database file": r'Не удалось открыть файл базы данных.',
306
+ r"database or disk is full": r'База данных или диск переполнены.',
307
+ r"attempt to write a readonly database": r'Попытка записи в базу данных, доступную только для чтения.',
308
+ r"no such index: (.+)": r'Индекс "\1" не существует.',
309
+ r"too many SQL variables": r'Слишком много переменных в запросе.',
310
+ r"maximum recursion depth exceeded": r'Превышена максимальная глубина рекурсии в запросе.',
311
+ r"incomplete input": r'Неполный запрос.',
312
+ r"malformed database schema \((.+)\)": r'Некорректная схема базы данных: \1.',
313
+ r"file is not a database": r'Файл не является базой данных.',
314
+ r"database disk image is malformed": r'Образ диска базы данных повреждён.',
315
+ r"incorrect number of bindings supplied. The statement has (\d+) parameters, and (\d+) were supplied": r'Неверное количество переданных параметров. Ожидаемых запросом параметров - \1, передано - \2.',
316
+ r"You did not supply a value for binding (\d+)": r'Не указано значение для параметра \1.',
317
+ r"Cannot operate on a closed database": r'Невозможно выполнить операцию на закрытой базе данных.',
318
+ r"Cannot operate on a closed cursor": r'Невозможно выполнить операцию на закрытом указателе.',
319
+ r"column (.+) is not unique": r'Столбец "\1" должен быть уникальным.',
320
+ r"number of bound variables does not match number of parameters": r'Количество привязанных переменных не соответствует количеству параметров.',
321
+ r"only one statement is allowed": r'Разрешено выполнять только один запрос за раз.',
322
+ r"NOT NULL constraint failed: (.+)": r'Нарушение ограничения НЕ ПУСТО для столбца "\1".',
323
+ r"UNIQUE constraint failed: (.+)": r'Нарушение ограничения УНИКАЛЬНЫЙ для столбца "\1".',
324
+ r"FOREIGN KEY constraint failed": r'Нарушение ограничения ВНЕШНИЙ КЛЮЧ.',
325
+ r"CHECK constraint failed: (.+)": r'Нарушение ограничения ПРОВЕРЯТЬ: \1.',
326
+ r"PRIMARY KEY must be unique": r'Первичный ключ должен быть уникальным.',
327
+ r"Error binding parameter (\d+) - probably unsupported type": r'Ошибка привязки параметра \1 - вероятно, неподдерживаемый тип.',
328
+ r"Cursor needed to be reset because of commit/rollback and can no longer be fetched from": r'Указатель должен быть сброшен из-за утверждения или отката и больше не может быть использован.',
329
+ r"Warning: You can only execute one statement at a time": r'Можно выполнять только один запрос за раз.',
330
+ r"(.+) not supported by this database": r'Операция "\1" не поддерживается этой базой данных.',
331
+ r"too many connections": r'Слишком много активных подключений к базе данных.',
332
+ r"no such function: (.+)": r'Функция "\1" не существует.',
333
+ r"no such module: (.+)": r'Модуль "\1" не существует.',
334
+ r"parameters are of unsupported type": r'Параметры имеют неподдерживаемый тип.',
335
+ r"interrupted": r'Операция была прервана.',
336
+ r"out of memory": r'Недостаточно памяти для выполнения операции.'
337
+ }
338
+
339
+ def Перевести_ошибку(исключение):
340
+ сообщение = str(исключение)
341
+ for шаблон, перевод in Переводы_ошибок.items():
342
+ совпадение = РегВыр.match(шаблон, сообщение)
343
+ if совпадение:
344
+ return РегВыр.sub(шаблон, перевод, сообщение)
345
+ return f"Неизвестная ошибка: {сообщение}"
346
+
257
347
  class Указатель():
258
348
  def __init__(здесь, курсор):
259
349
  здесь._курсор = курсор
260
350
 
261
351
  def Выполнить_запрос(здесь, запрос, параметры=()):
262
- запрос = Перевести_код_запроса(запрос)
263
- здесь._курсор.execute(запрос, параметры)
352
+ try:
353
+ запрос = Перевести_код_запроса(запрос)
354
+ здесь._курсор.execute(запрос, параметры)
355
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
264
356
 
265
357
  def Выполнить_запросы(здесь, запрос, последовательность_параметров):
266
- запрос = Перевести_код_запроса(запрос)
267
- здесь._курсор.executemany(запрос, последовательность_параметров)
358
+ try:
359
+ запрос = Перевести_код_запроса(запрос)
360
+ здесь._курсор.executemany(запрос, последовательность_параметров)
361
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
268
362
 
269
363
  def Выполнить_сценарий(здесь, сценарий):
270
- скрипт = Перевести_код_запроса(сценарий)
271
- здесь._курсор.executescript(скрипт)
364
+ try:
365
+ скрипт = Перевести_код_запроса(сценарий)
366
+ здесь._курсор.executescript(скрипт)
367
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
272
368
 
273
369
  def Извлечь_запись(здесь):
274
370
  return здесь._курсор.fetchone()
@@ -305,48 +401,67 @@ class Соединение():
305
401
  elif уровень_изоляции == 'ИСКЛЮЧИТЕЛЬНО': уровень_изоляции = 'EXCLUSIVE'
306
402
  else: уровень_изоляции = None
307
403
 
308
- здесь._соединение = sqlite3.connect(
309
- путь,
310
- timeout=таймаут,
311
- detect_types=обнаружение_типов,
312
- isolation_level=уровень_изоляции,
313
- check_same_thread=проверять_тот_же_ли_поток,
314
- cached_statements=кэш_инструкций,
315
- uri=является_ссылкой
316
- )
404
+ try:
405
+ здесь._соединение = sqlite3.connect(
406
+ путь,
407
+ timeout=таймаут,
408
+ detect_types=обнаружение_типов,
409
+ isolation_level=уровень_изоляции,
410
+ check_same_thread=проверять_тот_же_ли_поток,
411
+ cached_statements=кэш_инструкций,
412
+ uri=является_ссылкой
413
+ )
414
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
317
415
 
318
416
  def Создать_указатель(здесь):
319
- курсор = здесь._соединение.cursor()
320
- return Указатель(курсор)
417
+ try:
418
+ курсор = здесь._соединение.cursor()
419
+ return Указатель(курсор)
420
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
321
421
 
322
422
  def Выполнить_запрос(здесь, запрос, параметры=()):
323
- запрос = Перевести_код_запроса(запрос)
324
- указатель = здесь._соединение.execute(запрос, параметры)
325
- return Указатель(указатель)
326
-
327
- def Выполнить_запросы(здесь, запрос, последовательность_параметров):
328
- запрос = Перевести_код_запроса(запрос)
329
- указатель = здесь._соединение.executemany(запрос, последовательность_параметров)
330
- return Указатель(указатель)
423
+ try:
424
+ запрос = Перевести_код_запроса(запрос)
425
+ указатель = здесь._соединение.execute(запрос, параметры)
426
+ return Указатель(указатель)
427
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
428
+
429
+ def Выполнить_запросы(здесь, запрос, параметры):
430
+ try:
431
+ запрос = Перевести_код_запроса(запрос)
432
+ указатель = здесь._соединение.executemany(запрос, параметры)
433
+ return Указатель(указатель)
434
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
331
435
 
332
436
  def Выполнить_сценарий(здесь, сценарий):
333
- скрипт = Перевести_код_запроса(сценарий)
334
- здесь._соединение.executescript(скрипт)
437
+ try:
438
+ скрипт = Перевести_код_запроса(сценарий)
439
+ здесь._соединение.executescript(скрипт)
440
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
335
441
 
336
442
  def Создать_функцию(здесь, имя, количество_параметров, функция):
337
- здесь._соединение.create_function(имя, количество_параметров, функция)
443
+ try: здесь._соединение.create_function(имя, количество_параметров, функция)
444
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
338
445
 
339
- def Создать_агрегатную_функцию(здесь, имя, количество_параметров, класс_агрегатной_функции):
340
- здесь._соединение.create_aggregate(имя, количество_параметров, класс_агрегатной_функции)
446
+ def Создать_агрегатную_функцию(здесь, имя, число_аргументов, класс):
447
+ try: здесь._соединение.create_aggregate(имя, число_аргументов)
448
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
341
449
 
342
450
  def Создать_сопоставление(здесь, имя, функция):
343
- здесь._соединение.create_collation(имя, функция)
451
+ try: здесь._соединение.create_collation(имя, функция)
452
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
344
453
 
345
- def Закрыть(здесь): здесь._соединение.close()
454
+ def Закрыть(здесь):
455
+ try: здесь._соединение.close()
456
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
346
457
 
347
- def Утвердить(здесь): здесь._соединение.commit()
458
+ def Утвердить(здесь):
459
+ try: здесь._соединение.commit()
460
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
348
461
 
349
- def Откатить(здесь): здесь._соединение.rollback()
462
+ def Откатить(здесь):
463
+ try: здесь._соединение.rollback()
464
+ except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
350
465
 
351
466
  @property
352
467
  def В_транзакции(здесь): return здесь._соединение.in_transaction
@@ -27,6 +27,7 @@ import re as РегВыр
27
27
  'Пропустить': 'pass',
28
28
  'Бросить': 'raise',
29
29
  'Продолжить': 'continue',
30
+ 'в': 'in',
30
31
  'Если': 'if',
31
32
  'АЕсли': 'elif',
32
33
  'Иначе': 'else',
@@ -35,16 +36,15 @@ import re as РегВыр
35
36
  'Для': 'for',
36
37
  'из': 'in',
37
38
  'для': 'for',
38
- 'в': 'in',
39
39
  'Пока': 'while',
40
40
  'Прервать': 'break',
41
- 'Проба': 'try',
42
- 'Исключение': 'except',
43
- 'ВКонце': 'finally',
41
+ 'Попробовать': 'try',
42
+ 'Перехватив': 'except',
43
+ 'Завершив': 'finally',
44
44
  'Проверить': 'assert',
45
45
  'фун': 'lambda',
46
46
  'Выдать': 'yield',
47
- 'ВКонтексте': 'with',
47
+ 'Используя': 'with',
48
48
  'Удалить': 'del',
49
49
  'Выбрать': 'match',
50
50
  'При': 'case'
@@ -638,6 +638,7 @@ def Посчитать_физические_строки(путь_к_файлу,
638
638
  r"index (\d+) is out of range": r'Индекс \1 вне допустимого диапазона.',
639
639
  r"key '(.+)' not found": r'Ключ "\1" не найден в словаре.',
640
640
  r"KeyError: '(.+)'": r'Ключ "\1" отсутствует в словаре.',
641
+ r"invalid syntax\. Perhaps you forgot a comma\?": r'Ошибочный синтаксис. Может быть, вы забыли запятую?',
641
642
  r"invalid syntax": r'Синтаксическая ошибка в коде.',
642
643
  r"expected .+, got .+": r'Ожидался один тип данных, получен другой.',
643
644
  r"int\(\) argument must be a string, a bytes-like object or a number, not '(\w+)'": r'Аргумент функции Цел() должен быть строкой, байтовым объектом или числом, а не "\1".',