rupython 1.1.5__py3-none-any.whl → 1.1.7__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,358 @@
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
+ 'ВЕЩЕСТВЕННОЕ': 'REAL',
85
+ 'ТЕКСТ': 'TEXT',
86
+ 'ДАННЫЕ': 'BLOB',
87
+ 'ДАТА': 'DATE',
88
+ 'ВРЕМЯ': 'TIME',
89
+ 'ВРЕМЕННАЯ_МЕТКА': 'TIMESTAMP',
90
+ 'ЛОГИЧЕСКОЕ': 'BOOLEAN',
91
+
92
+ 'КЛЮЧ': 'KEY',
93
+ 'ПЕРВИЧНЫЙ': 'PRIMARY',
94
+ 'ВНЕШНИЙ': 'FOREIGN',
95
+ 'ПРОВЕРЯТЬ': 'CHECK',
96
+ 'КАК': 'AS',
97
+ 'ДА': 'TRUE',
98
+ 'НЕТ': 'FALSE',
99
+ 'ПО_УМОЛЧАНИЮ': 'DEFAULT',
100
+ 'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTO_INCREMENT',
101
+
102
+ 'КОЛИЧЕСТВО': 'COUNT',
103
+ 'СУММА': 'SUM',
104
+ 'СРЕДНЕЕ': 'AVG',
105
+ 'МИНИМУМ': 'MIN',
106
+ 'МАКСИМУМ': 'MAX',
107
+ 'СЦЕПИТЬ': 'CONCAT',
108
+ 'ДЛИНА': 'LENGTH',
109
+ 'В_ЗАГЛАВНЫЕ': 'UPPER',
110
+ 'В_СТРОЧНЫЕ': 'LOWER',
111
+ 'ПОДСТРОКА': 'SUBSTRING',
112
+ 'ЗАМЕНИТЬ': 'REPLACE',
113
+ 'ОКРУГЛИТЬ': 'ROUND',
114
+ 'ОКРУГЛИТЬ_ВНИЗ': 'FLOOR',
115
+ 'ОКРУГЛИТЬ_ВВЕРХ': 'CEIL',
116
+ 'МОДУЛЬ': 'ABS',
117
+ 'ТЕКУЩАЯ_ДАТА': 'CURRENT_DATE',
118
+ 'ТЕКУЩЕЕ_ВРЕМЯ': 'CURRENT_TIME',
119
+ 'ТЕКУЩАЯ_ВРЕМЕННАЯ_МЕТКА': 'CURRENT_TIMESTAMP',
120
+ 'ИЗВЛЕЧЬ': 'EXTRACT',
121
+ 'ГОД': 'YEAR',
122
+ 'МЕСЯЦ': 'MONTH',
123
+ 'ДЕНЬ': 'DAY'
124
+ }
125
+
126
+ def Получить_токены(запрос):
127
+ токены = []
128
+ текущий_токен = ''
129
+ в_строке = False
130
+ в_комментарии = False
131
+ строка_символ = None
132
+ i = 0
133
+
134
+ while i < len(запрос):
135
+ символ = запрос[i]
136
+
137
+ if символ in ('"', "'") and not в_комментарии:
138
+ if в_строке and символ == строка_символ:
139
+ в_строке = False
140
+ текущий_токен += символ
141
+ токены.append(текущий_токен)
142
+ текущий_токен = ''
143
+ i += 1
144
+ continue
145
+ elif not в_строке:
146
+ в_строке = True
147
+ строка_символ = символ
148
+ if текущий_токен:
149
+ токены.append(текущий_токен)
150
+ текущий_токен = ''
151
+ текущий_токен = символ
152
+ i += 1
153
+ continue
154
+
155
+ if символ == '-' and i + 1 < len(запрос) and запрос[i + 1] == '-' and not в_строке:
156
+ if текущий_токен:
157
+ токены.append(текущий_токен)
158
+ текущий_токен = ''
159
+ в_комментарии = True
160
+ текущий_токен = '--'
161
+ i += 2
162
+ while i < len(запрос) and запрос[i] != '\n':
163
+ текущий_токен += запрос[i]
164
+ i += 1
165
+ токены.append(текущий_токен)
166
+ текущий_токен = ''
167
+ в_комментарии = False
168
+ continue
169
+
170
+ if символ == '/' and i + 1 < len(запрос) and запрос[i + 1] == '*' and not в_строке:
171
+ if текущий_токен:
172
+ токены.append(текущий_токен)
173
+ текущий_токен = ''
174
+ в_комментарии = True
175
+ текущий_токен = '/*'
176
+ i += 2
177
+ while i < len(запрос) - 1 and not (запрос[i] == '*' and запрос[i + 1] == '/'):
178
+ текущий_токен += запрос[i]
179
+ i += 1
180
+ if i < len(запрос) - 1:
181
+ текущий_токен += '*/'
182
+ i += 2
183
+ токены.append(текущий_токен)
184
+ текущий_токен = ''
185
+ в_комментарии = False
186
+ continue
187
+
188
+ if в_строке or в_комментарии:
189
+ текущий_токен += символ
190
+ i += 1
191
+ continue
192
+
193
+ if символ.isspace() or символ in (',', ';', '(', ')', '=', '<', '>', '!'):
194
+ if текущий_токен:
195
+ токены.append(текущий_токен)
196
+ текущий_токен = ''
197
+ if not символ.isspace():
198
+ токены.append(символ)
199
+ i += 1
200
+ continue
201
+
202
+ текущий_токен += символ
203
+ i += 1
204
+
205
+ if текущий_токен:
206
+ токены.append(текущий_токен)
207
+
208
+ return токены
209
+
210
+ def Перевести_токены(токены):
211
+ переведённые_токены = []
212
+ i = 0
213
+
214
+ while i < len(токены):
215
+ токен = токены[i]
216
+
217
+ if (токен.startswith('"') or токен.startswith("'") or
218
+ токен.startswith('--') or токен.startswith('/*') or
219
+ токен in (',', ';', '(', ')', '=', '<', '>', '!')):
220
+ переведённые_токены.append(токен)
221
+ i += 1
222
+ continue
223
+
224
+ найдено_ключевое_слово = False
225
+ for длина in range(5, 0, -1):
226
+ if i + длина <= len(токены):
227
+ фраза = ' '.join(токены[i:i + длина]).upper()
228
+ if фраза in Словарь_перевода:
229
+ переведённые_токены.append(Словарь_перевода[фраза])
230
+ i += длина
231
+ найдено_ключевое_слово = True
232
+ break
233
+
234
+ if not найдено_ключевое_слово:
235
+ переведённые_токены.append(токен)
236
+ i += 1
237
+
238
+ return переведённые_токены
239
+
240
+ def Собрать_запрос(токены):
241
+ запрос = ''
242
+ for i, токен in enumerate(токены):
243
+ if токен in (',', ';', '(', ')', '=', '<', '>', '!'):
244
+ запрос += токен
245
+ else:
246
+ if i > 0 and токены[i - 1] not in (' ', ',', ';', '(', '=', '<', '>', '!'):
247
+ запрос += ' '
248
+ запрос += токен
249
+ return запрос.strip()
250
+
251
+ def Перевести_код_запроса(текст):
252
+ токены = Получить_токены(текст)
253
+ переведённые_токены = Перевести_токены(токены)
254
+ запрос = Собрать_запрос(переведённые_токены)
255
+ return запрос
256
+
257
+ class Указатель():
258
+ def __init__(здесь, курсор):
259
+ здесь._курсор = курсор
260
+
261
+ def Выполнить_запрос(здесь, запрос, параметры=()):
262
+ запрос = Перевести_код_запроса(запрос)
263
+ здесь._курсор.execute(запрос, параметры)
264
+
265
+ def Выполнить_запросы(здесь, запрос, последовательность_параметров):
266
+ запрос = Перевести_код_запроса(запрос)
267
+ здесь._курсор.executemany(запрос, последовательность_параметров)
268
+
269
+ def Выполнить_сценарий(здесь, сценарий):
270
+ скрипт = Перевести_код_запроса(сценарий)
271
+ здесь._курсор.executescript(скрипт)
272
+
273
+ def Извлечь_запись(здесь):
274
+ return здесь._курсор.fetchone()
275
+
276
+ def Извлечь_записи(здесь, количество):
277
+ return здесь._курсор.fetchmany(количество)
278
+
279
+ def Извлечь_все_записи(здесь):
280
+ return здесь._курсор.fetchall()
281
+
282
+ def Закрыть(здесь): здесь._курсор.close()
283
+
284
+ @property
285
+ def Описание(здесь): return здесь._курсор.description
286
+
287
+ @property
288
+ def Количество_строк(здесь): return здесь._курсор.rowcount
289
+
290
+ @property
291
+ def Последний_идентификатор(здесь): return здесь._курсор.lastrowid
292
+
293
+ class Соединение():
294
+ def __init__(здесь,
295
+ путь, *,
296
+ таймаут = 5.0,
297
+ обнаружение_типов = 0,
298
+ уровень_изоляции = None,
299
+ проверять_тот_же_ли_поток = True,
300
+ кэш_инструкций = 128,
301
+ является_ссылкой = False
302
+ ):
303
+ if уровень_изоляции == 'ОТЛОЖЕННО': уровень_изоляции = 'DEFERRED'
304
+ elif уровень_изоляции == 'НЕМЕДЛЕННО': уровень_изоляции = 'IMMEDIATE'
305
+ elif уровень_изоляции == 'ИСКЛЮЧИТЕЛЬНО': уровень_изоляции = 'EXCLUSIVE'
306
+ else: уровень_изоляции = None
307
+
308
+ здесь._соединение = sqlite3.connect(
309
+ путь,
310
+ timeout=таймаут,
311
+ detect_types=обнаружение_типов,
312
+ isolation_level=уровень_изоляции,
313
+ check_same_thread=проверять_тот_же_ли_поток,
314
+ cached_statements=кэш_инструкций,
315
+ uri=является_ссылкой
316
+ )
317
+
318
+ def Создать_указатель(здесь):
319
+ курсор = здесь._соединение.cursor()
320
+ return Указатель(курсор)
321
+
322
+ def Выполнить_запрос(здесь, запрос, параметры=()):
323
+ запрос = Перевести_код_запроса(запрос)
324
+ указатель = здесь._соединение.execute(запрос, параметры)
325
+ return Указатель(указатель)
326
+
327
+ def Выполнить_запросы(здесь, запрос, последовательность_параметров):
328
+ запрос = Перевести_код_запроса(запрос)
329
+ указатель = здесь._соединение.executemany(запрос, последовательность_параметров)
330
+ return Указатель(указатель)
331
+
332
+ def Выполнить_сценарий(здесь, сценарий):
333
+ скрипт = Перевести_код_запроса(сценарий)
334
+ здесь._соединение.executescript(скрипт)
335
+
336
+ def Создать_функцию(здесь, имя, количество_параметров, функция):
337
+ здесь._соединение.create_function(имя, количество_параметров, функция)
338
+
339
+ def Создать_агрегатную_функцию(здесь, имя, количество_параметров, класс_агрегатной_функции):
340
+ здесь._соединение.create_aggregate(имя, количество_параметров, класс_агрегатной_функции)
341
+
342
+ def Создать_сопоставление(здесь, имя, функция):
343
+ здесь._соединение.create_collation(имя, функция)
344
+
345
+ def Закрыть(здесь): здесь._соединение.close()
346
+
347
+ def Утвердить(здесь): здесь._соединение.commit()
348
+
349
+ def Откатить(здесь): здесь._соединение.rollback()
350
+
351
+ @property
352
+ def В_транзакции(здесь): return здесь._соединение.in_transaction
353
+
354
+ @property
355
+ def Изоляция(здесь): return здесь._соединение.isolation_level
356
+
357
+ @Изоляция.setter
358
+ def Изоляция(здесь, значение): здесь._соединение.isolation_level = значение
@@ -328,9 +328,9 @@ def Прочитать_слова(чтение_строки, путь_к_фай
328
328
  except Exception as ошибка:
329
329
  Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу)
330
330
 
331
- def Выполнить_основные_замены(слова, соответствия, не_после_точки = False):
331
+ def Выполнить_основные_замены(слова, соответствия):
332
332
  for номер, слово in enumerate(слова):
333
- if (not не_после_точки or (номер == 0 or слова[номер - 1][1] != '.')) and \
333
+ if (номер == 0 or слова[номер - 1][1] != '.') and \
334
334
  слово[0] == 1 and слово[1] in соответствия:
335
335
  слова[номер] = (1, соответствия[слово[1]], слово[2])
336
336
 
@@ -625,21 +625,36 @@ def Посчитать_физические_строки(путь_к_файлу,
625
625
  return логическая_строка
626
626
 
627
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".'
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 '(.+)' not found": r'Ключ "\1" не найден в словаре.',
640
+ r"KeyError: '(.+)'": r'Ключ "\1" отсутствует в словаре.',
641
+ r"invalid syntax": r'Синтаксическая ошибка в коде.',
642
+ r"expected .+, got .+": r'Ожидался один тип данных, получен другой.',
643
+ r"int\(\) argument must be a string, a bytes-like object or a number, not '(\w+)'": r'Аргумент функции Цел() должен быть строкой, байтовым объектом или числом, а не "\1".',
644
+ r"IndentationError: expected an indented block": r'Ожидался блок с отступом.',
645
+ r"IndentationError: unindent does not match any outer indentation level": r'Уровень отступа не соответствует внешнему блоку.',
646
+ r"TypeError: (\w+)\(\) takes \d+ positional arguments? but \d+ were given": r'Функция "\1" принимает меньше аргументов, чем было передано.',
647
+ r"ValueError: (.+)": r'Ошибка значения: \1.',
648
+ r"AttributeError: '(\w+)' object is not callable": r'Объект типа "\1" не является вызываемым.',
649
+ r"ImportError: No module named '(\w+)'": r'Ошибка импорта: модуль "\1" не найден.',
650
+ r"FileNotFoundError: \[Errno 2\] No such file or directory: '(.+)'": r'Файл "\1" не найден.',
651
+ r"IndexError: tuple index out of range": r'Индекс за пределами кортежа.',
652
+ r"SyntaxError: unexpected EOF while parsing": r'Неожиданный конец файла при разборе кода.',
653
+ r"ZeroDivisionError: float division by zero": r'Деление числа с плавающей точкой на ноль.',
654
+ r"TypeError: cannot unpack non-iterable (\w+) object": r'Невозможно распаковать неитерируемый объект типа "\1".',
655
+ r"MemoryError": r'Недостаточно памяти для выполнения операции.',
656
+ r"OverflowError: (.+)": r'Переполнение: \1.',
657
+ r"AssertionError": r'Ошибка проверки: условие не выполнено.'
643
658
  }
644
659
 
645
660
  def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.1.5
3
+ Version: 1.1.7
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=_oJ2iaUxh5jmKqcIaAPW-9oTdx93rTYGITJGgk3cJQI,41041
3
+ rupython/Преобразователь.py,sha256=YaR4lZaQxgo4vEZFk0i4_1Nx41AoH3N0mSbV2KH3wEM,42790
4
+ rupython/Модули/БД.py,sha256=9Q3U634QBas1jvf898Lqt1EiMp8YpLGYv9_uXx6CU3I,15299
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.5.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
8
- rupython-1.1.5.dist-info/METADATA,sha256=400O3JzEeSfTKjUFZLtOoaeJ28abRjlaSCud5JjF7MQ,13869
9
- rupython-1.1.5.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10
- rupython-1.1.5.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
11
- rupython-1.1.5.dist-info/RECORD,,
8
+ rupython-1.1.7.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
9
+ rupython-1.1.7.dist-info/METADATA,sha256=_K57p8V9E7pgrXmTqi7-rrBVmZPSnbsz0FZWdFrTUm4,13869
10
+ rupython-1.1.7.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
11
+ rupython-1.1.7.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
12
+ rupython-1.1.7.dist-info/RECORD,,