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 +8 -4
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/241/342/225/250/320/244.py +155 -40
- rupython//342/225/250/320/257/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/233/342/225/250/342/226/222/342/225/244/320/220/342/225/250/342/226/221/342/225/250/342/225/226/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/225/241/342/225/250/342/225/227/342/225/244/320/234.py +6 -5
- rupython-1.2.1.dist-info/METADATA +624 -0
- rupython-1.2.1.dist-info/RECORD +12 -0
- rupython-1.1.7.dist-info/METADATA +0 -333
- rupython-1.1.7.dist-info/RECORD +0 -12
- {rupython-1.1.7.dist-info → rupython-1.2.1.dist-info}/LICENSE +0 -0
- {rupython-1.1.7.dist-info → rupython-1.2.1.dist-info}/WHEEL +0 -0
- {rupython-1.1.7.dist-info → rupython-1.2.1.dist-info}/top_level.txt +0 -0
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
|
-
|
7
|
+
|
8
|
+
def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
|
9
|
+
if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
|
10
|
+
else: Система.__excepthook__(тип, значение, предыдущие_шаги)
|
11
|
+
Система.excepthook = Перехватчик_прерывания_клавиатурой
|
12
|
+
|
8
13
|
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
9
|
-
if Исходник:
|
10
|
-
Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
14
|
+
if Исходник: Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
11
15
|
|
12
|
-
|
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
|
-
'
|
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
|
-
'
|
106
|
-
'
|
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
|
-
|
352
|
+
try:
|
353
|
+
запрос = Перевести_код_запроса(запрос)
|
354
|
+
здесь._курсор.execute(запрос, параметры)
|
355
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
264
356
|
|
265
357
|
def Выполнить_запросы(здесь, запрос, последовательность_параметров):
|
266
|
-
|
267
|
-
|
358
|
+
try:
|
359
|
+
запрос = Перевести_код_запроса(запрос)
|
360
|
+
здесь._курсор.executemany(запрос, последовательность_параметров)
|
361
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
268
362
|
|
269
363
|
def Выполнить_сценарий(здесь, сценарий):
|
270
|
-
|
271
|
-
|
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
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
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
|
-
|
320
|
-
|
417
|
+
try:
|
418
|
+
курсор = здесь._соединение.cursor()
|
419
|
+
return Указатель(курсор)
|
420
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
321
421
|
|
322
422
|
def Выполнить_запрос(здесь, запрос, параметры=()):
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
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
|
-
|
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 Закрыть(здесь):
|
454
|
+
def Закрыть(здесь):
|
455
|
+
try: здесь._соединение.close()
|
456
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
346
457
|
|
347
|
-
def Утвердить(здесь):
|
458
|
+
def Утвердить(здесь):
|
459
|
+
try: здесь._соединение.commit()
|
460
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
348
461
|
|
349
|
-
def Откатить(здесь):
|
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
|
-
'
|
42
|
-
'
|
43
|
-
'
|
41
|
+
'Попробовать': 'try',
|
42
|
+
'Перехватив': 'except',
|
43
|
+
'Завершив': 'finally',
|
44
44
|
'Проверить': 'assert',
|
45
45
|
'фун': 'lambda',
|
46
46
|
'Выдать': 'yield',
|
47
|
-
'
|
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".',
|