rupython 1.1.8__tar.gz → 1.1.9__tar.gz
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-1.1.8 → rupython-1.1.9}/PKG-INFO +1 -1
- rupython-1.1.9/rupython/__main__.py +30 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/221/320/224.py +111 -39
- {rupython-1.1.8 → rupython-1.1.9}/rupython.egg-info/PKG-INFO +1 -1
- {rupython-1.1.8 → rupython-1.1.9}/setup.py +1 -1
- rupython-1.1.8/rupython/__main__.py +0 -12
- {rupython-1.1.8 → rupython-1.1.9}/LICENSE +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/README.md +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython/__/320/227/320/260/320/263/320/276/320/273/320/276/320/262/320/276/321/207/320/275/321/213/320/271_/320/272/320/276/320/264__.py" +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/234/320/260/321/202/320/265/320/274.py" +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/240/320/265/320/263/320/222/321/213/321/200.py" +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/241/320/273/321/203/321/207.py" +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython//320/237/321/200/320/265/320/276/320/261/321/200/320/260/320/267/320/276/320/262/320/260/321/202/320/265/320/273/321/214.py" +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython.egg-info/SOURCES.txt +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython.egg-info/dependency_links.txt +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/rupython.egg-info/top_level.txt +0 -0
- {rupython-1.1.8 → rupython-1.1.9}/setup.cfg +0 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
from . import Преобразователь
|
2
|
+
import os as ОС
|
3
|
+
import sys as Система
|
4
|
+
|
5
|
+
Путь_к_файлу = ОС.path.realpath(Система.argv[1])
|
6
|
+
Название_файла = ОС.path.basename(Система.argv[1])
|
7
|
+
|
8
|
+
def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
|
9
|
+
if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
|
10
|
+
else: Система.__excepthook__(тип, значение, предыдущие_шаги)
|
11
|
+
Система.excepthook = Перехватчик_прерывания_клавиатурой
|
12
|
+
|
13
|
+
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
14
|
+
if Исходник: Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
15
|
+
|
16
|
+
def Ожидать_нажатие_клавиши(сообщение):
|
17
|
+
if ОС.name == 'nt':
|
18
|
+
import msvcrt
|
19
|
+
print('\n' + сообщение)
|
20
|
+
msvcrt.getch()
|
21
|
+
else:
|
22
|
+
import tty
|
23
|
+
import termios
|
24
|
+
print('\n' + сообщение)
|
25
|
+
fd = Система.stdin.fileno()
|
26
|
+
old_settings = termios.tcgetattr(fd)
|
27
|
+
try: tty.setraw(fd); Система.stdin.read(1)
|
28
|
+
finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
|
29
|
+
|
30
|
+
Ожидать_нажатие_клавиши('=== Исполнение кода завершено. Нажмите любую клавишу для выхода. ===')
|
@@ -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
|
@@ -82,8 +80,8 @@ import sqlite3
|
|
82
80
|
|
83
81
|
'ОПРЕДЕЛИВ': 'WITH',
|
84
82
|
'ВЫБОР': 'CASE',
|
85
|
-
'
|
86
|
-
'
|
83
|
+
'ПРИ': 'WHEN',
|
84
|
+
'ЭТО': 'THEN',
|
87
85
|
'КОНЕЦ': 'END',
|
88
86
|
'РЕКУРСИВНО': 'RECURSIVE',
|
89
87
|
|
@@ -262,21 +260,76 @@ def Перевести_код_запроса(текст):
|
|
262
260
|
запрос = Собрать_запрос(переведённые_токены)
|
263
261
|
return запрос
|
264
262
|
|
263
|
+
Переводы_ошибок = {
|
264
|
+
r"no such table: (.+)": r'Таблица "\1" не существует.',
|
265
|
+
r"database is locked": r'База данных заблокована.',
|
266
|
+
r"near \"(.+)\": syntax error": r'Синтаксическая ошибка около "\1".',
|
267
|
+
r"table (.+) already exists": r'Таблица "\1" уже существует.',
|
268
|
+
r"no such column: (.+)": r'Столбец "\1" не существует.',
|
269
|
+
r"(.+) has no column named (.+)": r'Таблица "\1" не имеет столбца "\2".',
|
270
|
+
r"cannot open database file": r'Не удалось открыть файл базы данных.',
|
271
|
+
r"database or disk is full": r'База данных или диск переполнены.',
|
272
|
+
r"attempt to write a readonly database": r'Попытка записи в базу данных, доступную только для чтения.',
|
273
|
+
r"no such index: (.+)": r'Индекс "\1" не существует.',
|
274
|
+
r"too many SQL variables": r'Слишком много переменных в запросе.',
|
275
|
+
r"maximum recursion depth exceeded": r'Превышена максимальная глубина рекурсии в запросе.',
|
276
|
+
r"incomplete input": r'Неполный запрос.',
|
277
|
+
r"malformed database schema \((.+)\)": r'Некорректная схема базы данных: \1.',
|
278
|
+
r"file is not a database": r'Файл не является базой данных.',
|
279
|
+
r"database disk image is malformed": r'Образ диска базы данных повреждён.',
|
280
|
+
r"incorrect number of bindings supplied. The statement has (\d+) parameters, and (\d+) were supplied": r'Неверное количество переданных параметров. Ожидаемых запросом параметров - \1, передано - \2.',
|
281
|
+
r"You did not supply a value for binding (\d+)": r'Не указано значение для параметра \1.',
|
282
|
+
r"Cannot operate on a closed database": r'Невозможно выполнить операцию на закрытой базе данных.',
|
283
|
+
r"Cannot operate on a closed cursor": r'Невозможно выполнить операцию на закрытом указателе.',
|
284
|
+
r"column (.+) is not unique": r'Столбец "\1" должен быть уникальным.',
|
285
|
+
r"number of bound variables does not match number of parameters": r'Количество привязанных переменных не соответствует количеству параметров.',
|
286
|
+
r"only one statement is allowed": r'Разрешено выполнять только один запрос за раз.',
|
287
|
+
r"NOT NULL constraint failed: (.+)": r'Нарушение ограничения НЕ ПУСТО для столбца "\1".',
|
288
|
+
r"UNIQUE constraint failed: (.+)": r'Нарушение ограничения УНИКАЛЬНЫЙ для столбца "\1".',
|
289
|
+
r"FOREIGN KEY constraint failed": r'Нарушение ограничения ВНЕШНИЙ КЛЮЧ.',
|
290
|
+
r"CHECK constraint failed: (.+)": r'Нарушение ограничения ПРОВЕРЯТЬ: \1.',
|
291
|
+
r"PRIMARY KEY must be unique": r'Первичный ключ должен быть уникальным.',
|
292
|
+
r"Error binding parameter (\d+) - probably unsupported type": r'Ошибка привязки параметра \1 - вероятно, неподдерживаемый тип.',
|
293
|
+
r"Cursor needed to be reset because of commit/rollback and can no longer be fetched from": r'Указатель должен быть сброшен из-за утверждения или отката и больше не может быть использован.',
|
294
|
+
r"Warning: You can only execute one statement at a time": r'Можно выполнять только один запрос за раз.',
|
295
|
+
r"(.+) not supported by this database": r'Операция "\1" не поддерживается этой базой данных.',
|
296
|
+
r"too many connections": r'Слишком много активных подключений к базе данных.',
|
297
|
+
r"no such function: (.+)": r'Функция "\1" не существует.',
|
298
|
+
r"no such module: (.+)": r'Модуль "\1" не существует.',
|
299
|
+
r"parameters are of unsupported type": r'Параметры имеют неподдерживаемый тип.',
|
300
|
+
r"interrupted": r'Операция была прервана.',
|
301
|
+
r"out of memory": r'Недостаточно памяти для выполнения операции.'
|
302
|
+
}
|
303
|
+
|
304
|
+
def Перевести_ошибку(исключение):
|
305
|
+
сообщение = str(исключение)
|
306
|
+
for шаблон, перевод in Переводы_ошибок.items():
|
307
|
+
совпадение = РегВыр.match(шаблон, сообщение)
|
308
|
+
if совпадение:
|
309
|
+
return РегВыр.sub(шаблон, перевод, сообщение)
|
310
|
+
return f"Неизвестная ошибка: {сообщение}"
|
311
|
+
|
265
312
|
class Указатель():
|
266
313
|
def __init__(здесь, курсор):
|
267
314
|
здесь._курсор = курсор
|
268
315
|
|
269
316
|
def Выполнить_запрос(здесь, запрос, параметры=()):
|
270
|
-
|
271
|
-
|
317
|
+
try:
|
318
|
+
запрос = Перевести_код_запроса(запрос)
|
319
|
+
здесь._курсор.execute(запрос, параметры)
|
320
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
272
321
|
|
273
322
|
def Выполнить_запросы(здесь, запрос, последовательность_параметров):
|
274
|
-
|
275
|
-
|
323
|
+
try:
|
324
|
+
запрос = Перевести_код_запроса(запрос)
|
325
|
+
здесь._курсор.executemany(запрос, последовательность_параметров)
|
326
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
276
327
|
|
277
328
|
def Выполнить_сценарий(здесь, сценарий):
|
278
|
-
|
279
|
-
|
329
|
+
try:
|
330
|
+
скрипт = Перевести_код_запроса(сценарий)
|
331
|
+
здесь._курсор.executescript(скрипт)
|
332
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
280
333
|
|
281
334
|
def Извлечь_запись(здесь):
|
282
335
|
return здесь._курсор.fetchone()
|
@@ -313,48 +366,67 @@ class Соединение():
|
|
313
366
|
elif уровень_изоляции == 'ИСКЛЮЧИТЕЛЬНО': уровень_изоляции = 'EXCLUSIVE'
|
314
367
|
else: уровень_изоляции = None
|
315
368
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
369
|
+
try:
|
370
|
+
здесь._соединение = sqlite3.connect(
|
371
|
+
путь,
|
372
|
+
timeout=таймаут,
|
373
|
+
detect_types=обнаружение_типов,
|
374
|
+
isolation_level=уровень_изоляции,
|
375
|
+
check_same_thread=проверять_тот_же_ли_поток,
|
376
|
+
cached_statements=кэш_инструкций,
|
377
|
+
uri=является_ссылкой
|
378
|
+
)
|
379
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
325
380
|
|
326
381
|
def Создать_указатель(здесь):
|
327
|
-
|
328
|
-
|
382
|
+
try:
|
383
|
+
курсор = здесь._соединение.cursor()
|
384
|
+
return Указатель(курсор)
|
385
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
329
386
|
|
330
387
|
def Выполнить_запрос(здесь, запрос, параметры=()):
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
388
|
+
try:
|
389
|
+
запрос = Перевести_код_запроса(запрос)
|
390
|
+
указатель = здесь._соединение.execute(запрос, параметры)
|
391
|
+
return Указатель(указатель)
|
392
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
393
|
+
|
394
|
+
def Выполнить_запросы(здесь, запрос, параметры):
|
395
|
+
try:
|
396
|
+
запрос = Перевести_код_запроса(запрос)
|
397
|
+
указатель = здесь._соединение.executemany(запрос, параметры)
|
398
|
+
return Указатель(указатель)
|
399
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
339
400
|
|
340
401
|
def Выполнить_сценарий(здесь, сценарий):
|
341
|
-
|
342
|
-
|
402
|
+
try:
|
403
|
+
скрипт = Перевести_код_запроса(сценарий)
|
404
|
+
здесь._соединение.executescript(скрипт)
|
405
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
343
406
|
|
344
407
|
def Создать_функцию(здесь, имя, количество_параметров, функция):
|
345
|
-
здесь._соединение.create_function(имя, количество_параметров, функция)
|
408
|
+
try: здесь._соединение.create_function(имя, количество_параметров, функция)
|
409
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
346
410
|
|
347
|
-
def Создать_агрегатную_функцию(здесь, имя,
|
348
|
-
здесь._соединение.create_aggregate(имя,
|
411
|
+
def Создать_агрегатную_функцию(здесь, имя, число_аргументов, класс):
|
412
|
+
try: здесь._соединение.create_aggregate(имя, число_аргументов)
|
413
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
349
414
|
|
350
415
|
def Создать_сопоставление(здесь, имя, функция):
|
351
|
-
здесь._соединение.create_collation(имя, функция)
|
416
|
+
try: здесь._соединение.create_collation(имя, функция)
|
417
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
352
418
|
|
353
|
-
def Закрыть(здесь):
|
419
|
+
def Закрыть(здесь):
|
420
|
+
try: здесь._соединение.close()
|
421
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
354
422
|
|
355
|
-
def Утвердить(здесь):
|
423
|
+
def Утвердить(здесь):
|
424
|
+
try: здесь._соединение.commit()
|
425
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
356
426
|
|
357
|
-
def Откатить(здесь):
|
427
|
+
def Откатить(здесь):
|
428
|
+
try: здесь._соединение.rollback()
|
429
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
358
430
|
|
359
431
|
@property
|
360
432
|
def В_транзакции(здесь): return здесь._соединение.in_transaction
|
@@ -3,7 +3,7 @@ from pathlib import Path as Путь
|
|
3
3
|
|
4
4
|
Установить(
|
5
5
|
name = 'rupython',
|
6
|
-
version = '1.1.
|
6
|
+
version = '1.1.9',
|
7
7
|
description = "Исполнитель кода Русского Питона",
|
8
8
|
packages = [ 'rupython', 'rupython.Модули' ],
|
9
9
|
long_description = (Путь(__file__).parent / "README.md").read_text("UTF-8"),
|
@@ -1,12 +0,0 @@
|
|
1
|
-
from . import Преобразователь
|
2
|
-
import os as ОС
|
3
|
-
import sys as Система
|
4
|
-
|
5
|
-
Путь_к_файлу = ОС.path.realpath(Система.argv[1])
|
6
|
-
Название_файла = ОС.path.basename(Система.argv[1])
|
7
|
-
Исходник = None
|
8
|
-
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
9
|
-
if Исходник:
|
10
|
-
Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
11
|
-
|
12
|
-
input()
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|