rupython 1.1.4__py3-none-any.whl → 1.1.6__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.
@@ -0,0 +1,368 @@
1
+ import sqlite3
2
+
3
+ Ошибка = sqlite3.Error
4
+ ОшибкаБазыДанных = sqlite3.DatabaseError
5
+ ОшибкаПрограммования = sqlite3.ProgrammingError
6
+ ОшибкаОперации = sqlite3.OperationalError
7
+
8
+ Разбор_объявленных_типов = sqlite3.PARSE_DECLTYPES
9
+ Разбор_названий_столбцов = sqlite3.PARSE_COLNAMES
10
+ Успешно = sqlite3.SQLITE_OK
11
+ Отказ = sqlite3.SQLITE_DENY
12
+ Игнорировать = sqlite3.SQLITE_IGNORE
13
+ Уровень_интерфейса_взаимодействия = sqlite3.apilevel
14
+ Стиль_параметров = sqlite3.paramstyle
15
+ Потокобезопасность = sqlite3.threadsafety
16
+
17
+ Словарь_перевода = {
18
+ 'НАЧАТЬ': 'BEGIN',
19
+ 'ЗАКОНЧИТЬ': 'END',
20
+ 'ТРАНЗАКЦИЮ': 'TRANSACTION',
21
+ 'ОТЛОЖЕННО': 'DEFERRED',
22
+ 'НЕМЕДЛЕННО': 'IMMEDIATE',
23
+ 'ИСКЛЮЧИТЕЛЬНО': 'EXCLUSIVE',
24
+ 'ОТКАТИТЬ': 'ROLLBACK',
25
+ 'ТОЧКА_СОХРАНЕНИЯ': 'SAVEPOINT',
26
+
27
+ 'ВЫБРАТЬ': 'SELECT',
28
+ 'ИЗ': 'FROM',
29
+ 'ГДЕ': 'WHERE',
30
+ 'УПОРЯДОЧИВ ПО': 'ORDER BY',
31
+ 'ПО ВОЗРАСТАНИЮ': 'ASC',
32
+ 'ПО УБЫВАНИЮ': 'DESC',
33
+ 'ГРУППАМИ ПО': 'GROUP BY',
34
+ 'ИМЕЮЩИМИ': 'HAVING',
35
+ 'РАЗЛИЧАЮЩИЕСЯ': 'DISTINCT',
36
+ 'ОБЪЕДИНИВ С': 'UNION',
37
+ 'СОДЕРЖАЩИЕСЯ В': 'INTERSECT',
38
+ 'ВСЕ': 'ALL',
39
+ 'НЕКОТОРЫЕ': 'ANY',
40
+ 'ИСКЛЮЧАЯ': 'EXCEPT',
41
+ 'НЕ БОЛЕЕ': 'LIMIT',
42
+ 'СО СМЕЩЕНИЕМ': 'OFFSET',
43
+ 'ПРИСОЕДИНИВ': 'JOIN',
44
+ 'ВНУТРЕННЕ': 'INNER',
45
+ 'ВНЕШНЕ': 'OUTER',
46
+ 'ПО ЛЕВОЙ': 'LEFT',
47
+ 'ПО ПРАВОЙ': 'RIGHT',
48
+ 'ПОЛНОСТЬЮ': 'FULL',
49
+ 'ПО': 'ON',
50
+ 'ПЕРЕКРЁСТНО': 'CROSS',
51
+ 'ИСПОЛЬЗУЯ': 'USING',
52
+
53
+ 'ДОБАВИТЬ В': 'INSERT INTO',
54
+ 'ЗНАЧЕНИЯ': 'VALUES',
55
+ 'ИЗМЕНИТЬ': 'UPDATE',
56
+ 'УСТАНОВИВ': 'SET',
57
+ 'УДАЛИТЬ': 'DELETE',
58
+
59
+ 'ИЗМЕНИТЬ ТАБЛИЦУ': 'ALTER TABLE',
60
+ 'ИЗМЕНИТЬ СТОЛБЕЦ': 'ALTER COLUMN',
61
+ 'СОЗДАТЬ': 'CREATE',
62
+ 'БАЗУ ДАННЫХ': 'DATABASE',
63
+ 'ТАБЛИЦУ': 'TABLE',
64
+ 'ДОБАВИВ': 'ADD',
65
+ 'УДАЛИВ': 'DROP',
66
+ 'ИНДЕКС': 'INDEX',
67
+ 'УНИКАЛЬНЫЙ': 'UNIQUE',
68
+ 'ПРЕДСТАВЛЕНИЕ': 'VIEW',
69
+ 'СТОЛБЕЦ': 'COLUMN',
70
+
71
+ 'ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NULL',
72
+ 'НЕ ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NOT NULL',
73
+ 'ПУСТО': 'NULL',
74
+ 'И': 'AND',
75
+ 'ИЛИ': 'OR',
76
+ 'НЕ': 'NOT',
77
+ 'ПОДОБНО': 'LIKE',
78
+ 'МЕЖДУ': 'BETWEEN',
79
+ 'В': 'IN',
80
+ 'ЕСЛИ': 'IF',
81
+ 'СУЩЕСТВУЕТ': 'EXISTS',
82
+
83
+ 'ЦЕЛОЕ': 'INTEGER',
84
+ 'ЧИСЛО': 'NUMBER',
85
+ 'ВЕЩЕСТВЕННОЕ': 'FLOAT',
86
+ 'СТРОКА': 'VARCHAR',
87
+ 'ТЕКСТ': 'TEXT',
88
+ 'ДАННЫЕ': 'BLOB',
89
+ 'ДАТА': 'DATE',
90
+ 'ВРЕМЯ': 'TIME',
91
+ 'ВРЕМЕННАЯ_МЕТКА': 'TIMESTAMP',
92
+ 'ЛОГИЧЕСКОЕ': 'BOOLEAN',
93
+
94
+ 'КЛЮЧ': 'KEY',
95
+ 'ПЕРВИЧНЫЙ': 'PRIMARY',
96
+ 'ВНЕШНИЙ': 'FOREIGN',
97
+ 'ПРОВЕРЯТЬ': 'CHECK',
98
+ 'КАК': 'AS',
99
+ 'ДА': 'TRUE',
100
+ 'НЕТ': 'FALSE',
101
+ 'ПО_УМОЛЧАНИЮ': 'DEFAULT',
102
+ 'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTO_INCREMENT',
103
+
104
+ 'КОЛИЧЕСТВО': 'COUNT',
105
+ 'СУММА': 'SUM',
106
+ 'СРЕДНЕЕ': 'AVG',
107
+ 'МИНИМУМ': 'MIN',
108
+ 'МАКСИМУМ': 'MAX',
109
+ 'СЦЕПИТЬ': 'CONCAT',
110
+ 'ДЛИНА': 'LENGTH',
111
+ 'В_ЗАГЛАВНЫЕ': 'UPPER',
112
+ 'В_СТРОЧНЫЕ': 'LOWER',
113
+ 'ПОДСТРОКА': 'SUBSTRING',
114
+ 'ЗАМЕНИТЬ': 'REPLACE',
115
+ 'ОКРУГЛИТЬ': 'ROUND',
116
+ 'ОКРУГЛИТЬ_ВНИЗ': 'FLOOR',
117
+ 'ОКРУГЛИТЬ_ВВЕРХ': 'CEIL',
118
+ 'МОДУЛЬ': 'ABS',
119
+ 'ТЕКУЩАЯ_ДАТА': 'CURRENT_DATE',
120
+ 'ТЕКУЩЕЕ_ВРЕМЯ': 'CURRENT_TIME',
121
+ 'ТЕКУЩАЯ_ВРЕМЕННАЯ_МЕТКА': 'CURRENT_TIMESTAMP',
122
+ 'ИЗВЛЕЧЬ': 'EXTRACT',
123
+ 'ГОД': 'YEAR',
124
+ 'МЕСЯЦ': 'MONTH',
125
+ 'ДЕНЬ': 'DAY'
126
+ }
127
+
128
+ def Получить_токены(запрос):
129
+ токены = []
130
+ текущий_токен = ''
131
+ в_строке = False
132
+ в_комментарии = False
133
+ строка_символ = None
134
+ i = 0
135
+
136
+ while i < len(запрос):
137
+ символ = запрос[i]
138
+
139
+ if символ in ('"', "'") and not в_комментарии:
140
+ if в_строке and символ == строка_символ:
141
+ в_строке = False
142
+ текущий_токен += символ
143
+ токены.append(текущий_токен)
144
+ текущий_токен = ''
145
+ i += 1
146
+ continue
147
+ elif not в_строке:
148
+ в_строке = True
149
+ строка_символ = символ
150
+ if текущий_токен:
151
+ токены.append(текущий_токен)
152
+ текущий_токен = ''
153
+ текущий_токен = символ
154
+ i += 1
155
+ continue
156
+
157
+ if символ == '-' and i + 1 < len(запрос) and запрос[i + 1] == '-' and not в_строке:
158
+ if текущий_токен:
159
+ токены.append(текущий_токен)
160
+ текущий_токен = ''
161
+ в_комментарии = True
162
+ текущий_токен = '--'
163
+ i += 2
164
+ while i < len(запрос) and запрос[i] != '\n':
165
+ текущий_токен += запрос[i]
166
+ i += 1
167
+ токены.append(текущий_токен)
168
+ текущий_токен = ''
169
+ в_комментарии = False
170
+ continue
171
+
172
+ if символ == '/' and i + 1 < len(запрос) and запрос[i + 1] == '*' and not в_строке:
173
+ if текущий_токен:
174
+ токены.append(текущий_токен)
175
+ текущий_токен = ''
176
+ в_комментарии = True
177
+ текущий_токен = '/*'
178
+ i += 2
179
+ while i < len(запрос) - 1 and not (запрос[i] == '*' and запрос[i + 1] == '/'):
180
+ текущий_токен += запрос[i]
181
+ i += 1
182
+ if i < len(запрос) - 1:
183
+ текущий_токен += '*/'
184
+ i += 2
185
+ токены.append(текущий_токен)
186
+ текущий_токен = ''
187
+ в_комментарии = False
188
+ continue
189
+
190
+ if в_строке or в_комментарии:
191
+ текущий_токен += символ
192
+ i += 1
193
+ continue
194
+
195
+ if символ.isspace() or символ in (',', ';', '(', ')', '=', '<', '>', '!'):
196
+ if текущий_токен:
197
+ токены.append(текущий_токен)
198
+ текущий_токен = ''
199
+ if not символ.isspace():
200
+ токены.append(символ)
201
+ i += 1
202
+ continue
203
+
204
+ текущий_токен += символ
205
+ i += 1
206
+
207
+ if текущий_токен:
208
+ токены.append(текущий_токен)
209
+
210
+ return токены
211
+
212
+ def Перевести_токены(токены):
213
+ переведённые_токены = []
214
+ i = 0
215
+
216
+ while i < len(токены):
217
+ токен = токены[i]
218
+
219
+ if (токен.startswith('"') or токен.startswith("'") or
220
+ токен.startswith('--') or токен.startswith('/*') or
221
+ токен in (',', ';', '(', ')', '=', '<', '>', '!')):
222
+ переведённые_токены.append(токен)
223
+ i += 1
224
+ continue
225
+
226
+ найдено_ключевое_слово = False
227
+ for длина in range(5, 0, -1):
228
+ if i + длина <= len(токены):
229
+ фраза = ' '.join(токены[i:i + длина]).upper()
230
+ if фраза in Словарь_перевода:
231
+ переведённые_токены.append(Словарь_перевода[фраза])
232
+ i += длина
233
+ найдено_ключевое_слово = True
234
+ break
235
+
236
+ if not найдено_ключевое_слово:
237
+ переведённые_токены.append(токен)
238
+ i += 1
239
+
240
+ return переведённые_токены
241
+
242
+ def Собрать_запрос(токены):
243
+ запрос = ''
244
+ for i, токен in enumerate(токены):
245
+ if токен in (',', ';', '(', ')', '=', '<', '>', '!'):
246
+ запрос += токен
247
+ else:
248
+ if i > 0 and токены[i - 1] not in (' ', ',', ';', '(', '=', '<', '>', '!'):
249
+ запрос += ' '
250
+ запрос += токен
251
+ return запрос.strip()
252
+
253
+ def Перевести_код_запроса(текст):
254
+ токены = Получить_токены(текст)
255
+ переведённые_токены = Перевести_токены(токены)
256
+ запрос = Собрать_запрос(переведённые_токены)
257
+ return запрос
258
+
259
+ class Указатель(sqlite3.Cursor):
260
+ def __init__(здесь, курсор):
261
+ super().__init__(курсор.connection)
262
+ здесь.cursor = курсор
263
+
264
+ def Выполнить_запрос(здесь, запрос, параметры=()):
265
+ запрос = Перевести_код_запроса(запрос)
266
+ здесь.execute(запрос, параметры)
267
+
268
+ def Выполнить_запросы(здесь, запрос, последовательность_параметров):
269
+ запрос = Перевести_код_запроса(запрос)
270
+ здесь.executemany(запрос, последовательность_параметров)
271
+
272
+ def Выполнить_скрипт(здесь, скрипт):
273
+ скрипт = Перевести_код_запроса(скрипт)
274
+ здесь.executescript(скрипт)
275
+
276
+ def Извлечь_запись(здесь):
277
+ return здесь.cursor.fetchone()
278
+
279
+ def Извлечь_записи(здесь, количество):
280
+ return здесь.cursor.fetchmany(количество)
281
+
282
+ def Извлечь_все_записи(здесь):
283
+ return здесь.cursor.fetchall()
284
+
285
+ def Закрыть(здесь): здесь.cursor.close()
286
+
287
+ @property
288
+ def Описание(здесь): return здесь.cursor.description
289
+
290
+ @property
291
+ def Количество_строк(здесь): return здесь.cursor.rowcount
292
+
293
+ @property
294
+ def Последний_идентификатор(здесь): return здесь.cursor.lastrowid
295
+
296
+ class Соединение(sqlite3.Connection):
297
+ def __init__(здесь, *ПА, **ИА):
298
+ super().__init__(*ПА, **ИА)
299
+
300
+ def Создать_указатель(здесь):
301
+ курсор = здесь.cursor()
302
+ return Указатель(курсор)
303
+
304
+ def Выполнить_запрос(здесь, запрос, параметры=()):
305
+ запрос = Перевести_код_запроса(запрос)
306
+ указатель = здесь.execute(запрос, параметры)
307
+ return Указатель(указатель)
308
+
309
+ def Выполнить_запросы(здесь, запрос, последовательность_параметров):
310
+ запрос = Перевести_код_запроса(запрос)
311
+ указатель = здесь.executemany(запрос, последовательность_параметров)
312
+ return Указатель(указатель)
313
+
314
+ def Выполнить_скрипт(здесь, скрипт):
315
+ скрипт = Перевести_код_запроса(скрипт)
316
+ здесь.executescript(скрипт)
317
+
318
+ def Создать_функцию(здесь, имя, количество_параметров, функция):
319
+ здесь.create_function(имя, количество_параметров, функция)
320
+
321
+ def Создать_агрегатную_функцию(здесь, имя, количество_параметров, класс_агрегатной_функции):
322
+ здесь.create_aggregate(имя, количество_параметров, класс_агрегатной_функции)
323
+
324
+ def Создать_сопоставление(здесь, имя, функция):
325
+ здесь.create_collation(имя, функция)
326
+
327
+ def Закрыть(здесь): здесь.close()
328
+
329
+ def Утвердить(здесь): здесь.commit()
330
+
331
+ def Откатить(здесь): здесь.rollback()
332
+
333
+ @property
334
+ def В_транзакции(здесь): return здесь.in_transaction
335
+
336
+ @property
337
+ def Изоляция(здесь): return здесь.isolation_level
338
+
339
+ @Изоляция.setter
340
+ def Изоляция(здесь, значение): здесь.isolation_level = значение
341
+
342
+ def Подключиться(
343
+ путь, *,
344
+ таймаут = 5.0,
345
+ обнаружение_типов = 0,
346
+ уровень_изоляции = None,
347
+ проверять_тот_же_ли_поток = True,
348
+ фабрика = Соединение,
349
+ кэш_инструкций = 128,
350
+ является_ссылкой = False
351
+ ):
352
+ if уровень_изоляции == 'ОТЛОЖЕННО': уровень_изоляции = 'DEFERRED'
353
+ elif уровень_изоляции == 'НЕМЕДЛЕННО': уровень_изоляции = 'IMMEDIATE'
354
+ elif уровень_изоляции == 'ИСКЛЮЧИТЕЛЬНО': уровень_изоляции = 'EXCLUSIVE'
355
+ else: уровень_изоляции = None
356
+
357
+ соединение = sqlite3.connect(
358
+ путь,
359
+ timeout=таймаут,
360
+ detect_types=обнаружение_типов,
361
+ isolation_level=уровень_изоляции,
362
+ check_same_thread=проверять_тот_же_ли_поток,
363
+ factory=фабрика,
364
+ cached_statements=кэш_инструкций,
365
+ uri=является_ссылкой
366
+ )
367
+
368
+ return соединение
@@ -4,6 +4,7 @@ import traceback as Разборщик_исключений
4
4
  import os as ОС
5
5
  import sys as Система
6
6
  import importlib as Импортование
7
+ import re as РегВыр
7
8
 
8
9
  Служебные_слова = {
9
10
  'Да': 'True',
@@ -306,6 +307,7 @@ import importlib as Импортование
306
307
  'ОшибкаЗакодСимволов': 'UnicodeEncodeError',
307
308
  'ОшибкаРаскодСимволов': 'UnicodeDecodeError',
308
309
  'ОшибкаПереводаКодСимв': 'UnicodeTranslateError',
310
+ 'ОшибкаТокена': 'TokenError',
309
311
  'ОбщееПредупреждение': 'Warning',
310
312
  'ПредупрУстаревание': 'DeprecationWarning',
311
313
  'ПредупрОжидаетсяУстаревание': 'PendingDeprecationWarning',
@@ -614,18 +616,32 @@ def Посчитать_физические_строки(путь_к_файлу,
614
616
  for строка in файл:
615
617
  физические_строки += 1
616
618
  строка = строка.rstrip('\n')
617
- if not продолжение:
618
- текущая_логическая += 1
619
- if строка.endswith('\\'):
620
- продолжение = True
621
- else:
622
- продолжение = False
619
+ if not продолжение: текущая_логическая += 1
620
+ продолжение = строка.endswith('\\')
623
621
  if текущая_логическая >= логическая_строка:
624
622
  return физические_строки
625
623
  return физические_строки
626
624
  except:
627
625
  return логическая_строка
628
626
 
627
+ Переводы_ошибок = {
628
+ r'.*EOF in multi-line statement.*': r'Неожиданный конец файла при обработке многострочной инструкции.',
629
+ r'name "(\w+)" is not defined': r'Переменная "\1" не определена.',
630
+ r'unsupported operand type\(s\) for .+: "(\w+)" and "(\w+)"': r'Неподдерживаемая операция между типами "\1" и "\2".',
631
+ r'invalid literal for int\(\) with base \d+: "(.+)"': r'Недопустимое значение "\1" для преобразования в целое число.',
632
+ r'division by zero': r'Деление на ноль.',
633
+ r'list index out of range': r'Индекс за пределами списка.',
634
+ r'"(\w+)" object has no attribute "(\w+)"': r'Объект типа "\1" не имеет атрибута "\2".',
635
+ r'module "(\w+)" has no attribute "(\w+)"': r'Модуль "\1" не имеет атрибута "\2".',
636
+ r'cannot import name "(\w+)" from "(\w+)"': r'Не удалось импортовать "\1" из модуля "\2".',
637
+ r'no such file or directory: "(.+)"': r'Файл или директория "\1" не найдены.',
638
+ r'index (\d+) is out of range': r'Индекс \1 вне допустимого диапазона.',
639
+ r'key "(\w+)" not found': r'Ключ "\1" не найден.',
640
+ r'invalid syntax': r'Синтаксическая ошибка.',
641
+ r'expected .+, got .+': r'Ожидался один тип данных, получен другой.',
642
+ r'int\(\) argument must be a string, a bytes-like object or a number, not "(\w+)"': r'Аргумент Цел() должен быть строкой, байтовым объектом или числом, а не "\1".'
643
+ }
644
+
629
645
  def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу):
630
646
  назв_исп_ф = путь_к_файлу.split('\\' if Система.platform.startswith('win32') else '/')[-1]
631
647
  сч = 1
@@ -661,8 +677,14 @@ def Вывести_текст_исключения(исключение, заг
661
677
  print(' в файле "' + путь_к_файлу + '"' + ('.\n' if номер_строки == 0 else ''))
662
678
  if номер_строки > 0:
663
679
  print(' на строке № ' + str(номер_строки) + '.\n');
664
- try: print(' ' + исключение.msg)
665
- except: print(' ' + str(исключение))
680
+ try: текст_исключения = исключение.msg
681
+ except AttributeError: текст_исключения = str(исключение)
682
+
683
+ for шаблон, перевод in Переводы_ошибок.items():
684
+ if РегВыр.match(шаблон, текст_исключения):
685
+ текст_исключения = РегВыр.sub(шаблон, перевод, текст_исключения)
686
+ break
687
+ print(' ' + str(текст_исключения))
666
688
 
667
689
  input()
668
690
  Система.exit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.1.4
3
+ Version: 1.1.6
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -1,11 +1,12 @@
1
1
  rupython/__main__.py,sha256=BxtsIK8PJuOOGVDKxqoscwJjjWWhZts7adicFuwUL6k,540
2
2
  rupython/__Заголовочный_код__.py,sha256=VWghfQc6dv9lwIeQvJotpdOlBtHZeN00NBeL4RdWloA,10998
3
- rupython/Преобразователь.py,sha256=zH2eaYqAKwfYXOUU_WWVqC6omm8Cp4jPxo0X_-A_MUk,38855
3
+ rupython/Преобразователь.py,sha256=_oJ2iaUxh5jmKqcIaAPW-9oTdx93rTYGITJGgk3cJQI,41041
4
+ rupython/Модули/БД.py,sha256=eVgOnbqp1dq1r981cGUSKofbFP-Yn4JwdidMoEYiTjM,15142
4
5
  rupython/Модули/Матем.py,sha256=d8ekm7GJreu7LJ9KmAKcTOciIUQ-VBI567BfK_QeLSc,3587
5
6
  rupython/Модули/РегВыр.py,sha256=yeXYfeDF2qw4DSKVdZVSFInMUW52U7Nq_KOJKvm4XnM,6349
6
7
  rupython/Модули/Случ.py,sha256=oeVdSdFVb4X_T-nX2P7NSIhise1zUPIS4lk7h-67XSg,2689
7
- rupython-1.1.4.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
8
- rupython-1.1.4.dist-info/METADATA,sha256=iyWOSt6mARPjZIlvKypU8irr7WB7_f2CwtfkYugETEE,13869
9
- rupython-1.1.4.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10
- rupython-1.1.4.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
11
- rupython-1.1.4.dist-info/RECORD,,
8
+ rupython-1.1.6.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
9
+ rupython-1.1.6.dist-info/METADATA,sha256=vgHzYB-_J7Kjw9tVSiLfERwtwwcplh3bbeDT1klQ_3w,13869
10
+ rupython-1.1.6.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
11
+ rupython-1.1.6.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
12
+ rupython-1.1.6.dist-info/RECORD,,