rupython 1.2.14__tar.gz → 1.2.15__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.
Files changed (24) hide show
  1. {rupython-1.2.14 → rupython-1.2.15}/PKG-INFO +1 -1
  2. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/221/320/224.py +163 -9
  3. {rupython-1.2.14 → rupython-1.2.15}/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 +2 -1
  4. {rupython-1.2.14 → rupython-1.2.15}/rupython.egg-info/PKG-INFO +1 -1
  5. {rupython-1.2.14 → rupython-1.2.15}/setup.py +1 -1
  6. {rupython-1.2.14 → rupython-1.2.15}/LICENSE +0 -0
  7. {rupython-1.2.14 → rupython-1.2.15}/README.md +0 -0
  8. {rupython-1.2.14 → rupython-1.2.15}/rupython/__main__.py +0 -0
  9. {rupython-1.2.14 → rupython-1.2.15}/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
  10. {rupython-1.2.14 → rupython-1.2.15}/rupython/__/320/236/320/261/321/211/320/270/320/265_/321/204/321/203/320/275/320/272/321/206/320/270/320/270__.py" +0 -0
  11. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/220/321/201/320/270/320/275/321/205/321/200.py" +0 -0
  12. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/224/320/260/321/202/320/260/320/222/321/200/320/265/320/274/321/217.py" +0 -0
  13. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/232/320/276/320/273/320/273/320/265/320/272/321/206/320/270/320/270.py" +0 -0
  14. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/232/321/203/321/207/320/260.py" +0 -0
  15. {rupython-1.2.14 → rupython-1.2.15}/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
  16. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/236/321/207/320/265/321/200/320/265/320/264/321/214.py" +0 -0
  17. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/237/320/276/321/202/320/276/320/272/320/270.py" +0 -0
  18. {rupython-1.2.14 → rupython-1.2.15}/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
  19. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/241/320/273/321/203/321/207.py" +0 -0
  20. {rupython-1.2.14 → rupython-1.2.15}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/244/320/260/320/271/320/273/321/213.py" +0 -0
  21. {rupython-1.2.14 → rupython-1.2.15}/rupython.egg-info/SOURCES.txt +0 -0
  22. {rupython-1.2.14 → rupython-1.2.15}/rupython.egg-info/dependency_links.txt +0 -0
  23. {rupython-1.2.14 → rupython-1.2.15}/rupython.egg-info/top_level.txt +0 -0
  24. {rupython-1.2.14 → rupython-1.2.15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.2.14
3
+ Version: 1.2.15
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Author: Сообщество русских программистов
6
6
  License: ОДРН
@@ -47,11 +47,11 @@ import re as РегВыр
47
47
  'ПО': 'ON',
48
48
  'ПЕРЕКРЁСТНО': 'CROSS',
49
49
  'ИСПОЛЬЗУЯ': 'USING',
50
- 'ВСТАВИТЬ ИЛИ ПРЕРВАТЬ В': 'INSERT OR ABORT INTO',
51
- 'ВСТАВИТЬ ИЛИ СБОЙ В': 'INSERT OR FAIL INTO',
52
- 'ВСТАВИТЬ ИЛИ ПРОПУСТИТЬ В': 'INSERT OR IGNORE INTO',
53
- 'ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ В': 'INSERT OR REPLACE INTO',
54
- 'ВСТАВИТЬ ИЛИ ОТКАТИТЬ В': 'INSERT OR ROLLBACK INTO',
50
+ 'ДОБАВИТЬ ИЛИ ПРЕРВАТЬ В': 'INSERT OR ABORT INTO',
51
+ 'ДОБАВИТЬ ИЛИ СБОЙ В': 'INSERT OR FAIL INTO',
52
+ 'ДОБАВИТЬ ИЛИ ПРОПУСТИТЬ В': 'INSERT OR IGNORE INTO',
53
+ 'ДОБАВИТЬ ИЛИ ЗАМЕНИТЬ В': 'INSERT OR REPLACE INTO',
54
+ 'ДОБАВИТЬ ИЛИ ОТКАТИТЬ В': 'INSERT OR ROLLBACK INTO',
55
55
  'ДОБАВИТЬ В': 'INSERT INTO',
56
56
  'ЗНАЧЕНИЯ': 'VALUES',
57
57
  'ИЗМЕНИТЬ': 'UPDATE',
@@ -122,7 +122,7 @@ import re as РегВыр
122
122
  'КАК': 'AS',
123
123
  'ДА': 'TRUE',
124
124
  'НЕТ': 'FALSE',
125
- 'ПО_УМОЛЧАНИЮ': 'DEFAULT',
125
+ 'ПО УМОЛЧАНИЮ': 'DEFAULT',
126
126
  'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTOINCREMENT',
127
127
  'ССЫЛАЕТСЯ НА': 'REFERENCES',
128
128
  'БЕЗ ИСКЛЮЧЕНИЙ': 'EXCLUDE NO OTHERS',
@@ -231,8 +231,6 @@ import re as РегВыр
231
231
  }
232
232
 
233
233
  def Получить_токены(запрос):
234
- запрос = РегВыр.sub(r'\s+', ' ', запрос.strip())
235
-
236
234
  токены = []
237
235
  текущий_токен = ''
238
236
  в_строке = False
@@ -369,7 +367,7 @@ def Перевести_код_запроса(текст):
369
367
 
370
368
  Переводы_ошибок = {
371
369
  r"no such table: (.+)": r'Таблица "\1" не существует.',
372
- r"database is locked": r'База данных заблокирована.',
370
+ r"database is locked": r'База данных заблокована.',
373
371
  r"near \"(.+)\": syntax error": r'Синтаксическая ошибка около "\1".',
374
372
  r"table (.+) already exists": r'Таблица "\1" уже существует.',
375
373
  r"no such column: (.+)": r'Столбец "\1" не существует.',
@@ -602,3 +600,159 @@ class Соединение():
602
600
  if значение not in (None, 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE'):
603
601
  raise ValueError(f"Недопустимый уровень изоляции: {значение}")
604
602
  экземпляр._соединение.isolation_level = значение
603
+
604
+ class Обёртка:
605
+ def __init__(экземпляр, путь_к_файлу, **аргументы_инициализации):
606
+ экземпляр._соединение = None
607
+
608
+ try:
609
+ экземпляр._соединение = Соединение(путь_к_файлу, **аргументы_инициализации)._соединение
610
+
611
+ except Ошибка as ош:
612
+ экземпляр._Обновить_ошибку(ош)
613
+ except Exception as ош:
614
+ экземпляр._Обновить_ошибку(ош)
615
+
616
+ def __del__(экземпляр):
617
+ if экземпляр._соединение:
618
+ try:
619
+ экземпляр._соединение.close()
620
+ except Ошибка as ош:
621
+ print(f"Ошибка при закрытии соединения: {Перевести_ошибку(ош)}")
622
+
623
+ def _Обновить_ошибку(экземпляр, ош=None):
624
+ if isinstance(ош, Ошибка):
625
+ raise Ошибка(Перевести_ошибку(ош)) from ош
626
+ elif ош:
627
+ raise Exception(f"Неизвестная ошибка: {ош}") from ош
628
+ else:
629
+ raise Exception("Неизвестная ошибка или проблема соединения.")
630
+
631
+ def Выполнить_запрос(экземпляр, запрос, параметры=()):
632
+ # Выполняет запрос к БД.
633
+ if not экземпляр._соединение:
634
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
635
+
636
+ try:
637
+ переведённый_запрос = Перевести_код_запроса(запрос)
638
+ курсор = экземпляр._соединение.cursor()
639
+ курсор.execute(переведённый_запрос, параметры)
640
+ экземпляр._соединение.commit()
641
+
642
+ except Ошибка as ош:
643
+ экземпляр._Обновить_ошибку(ош)
644
+
645
+ def Запросить_таблицу(экземпляр, запрос, параметры=()):
646
+ # Выполняет запрос ВЫБРАТЬ и возвращает все строки как список словарей.
647
+ if not экземпляр._соединение:
648
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
649
+
650
+ try:
651
+ экземпляр._соединение.row_factory = sqlite3.Row
652
+
653
+ переведённый_запрос = Перевести_код_запроса(запрос)
654
+ курсор = экземпляр._соединение.cursor()
655
+ курсор.execute(переведённый_запрос, параметры)
656
+
657
+ результат = [dict(запись) for запись in курсор.fetchall()]
658
+
659
+ return результат
660
+ except Ошибка as ош:
661
+ экземпляр._Обновить_ошибку(ош)
662
+
663
+ def Запросить_столбец(экземпляр, запрос, параметры=()):
664
+ # Выполняет запрос ВЫБРАТЬ и возвращает значения первого столбца всех строк как список.
665
+ if not экземпляр._соединение:
666
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
667
+
668
+ try:
669
+ экземпляр._соединение.row_factory = None
670
+
671
+ переведённый_запрос = Перевести_код_запроса(запрос)
672
+ курсор = экземпляр._соединение.cursor()
673
+ курсор.execute(переведённый_запрос, параметры)
674
+ результат = [строка[0] for строка in курсор.fetchall()]
675
+
676
+ return результат
677
+
678
+ except Ошибка as ош:
679
+ экземпляр._Обновить_ошибку(ош)
680
+
681
+ def Запросить_строку(экземпляр, запрос, параметры=()):
682
+ # Выполняет запрос ВЫБРАТЬ и возвращает первую строку как словарь.
683
+ if not экземпляр._соединение:
684
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
685
+
686
+ try:
687
+ экземпляр._соединение.row_factory = sqlite3.Row
688
+
689
+ переведённый_запрос = Перевести_код_запроса(запрос)
690
+ курсор = экземпляр._соединение.cursor()
691
+ курсор.execute(переведённый_запрос, параметры)
692
+ строка = курсор.fetchone()
693
+
694
+ return dict(строка) if строка else None
695
+
696
+ except Ошибка as ош:
697
+ экземпляр._Обновить_ошибку(ош)
698
+
699
+ def Запросить_таблицу_нум_стр(экземпляр, запрос, параметры=()):
700
+ # Выполняет запрос ВЫБРАТЬ и возвращает все строки как список кортежей.
701
+ if not экземпляр._соединение:
702
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
703
+
704
+ try:
705
+ экземпляр._соединение.row_factory = None
706
+
707
+ переведённый_запрос = Перевести_код_запроса(запрос)
708
+ курсор = экземпляр._соединение.cursor()
709
+ курсор.execute(переведённый_запрос, параметры)
710
+ результат = курсор.fetchall()
711
+
712
+ return результат
713
+
714
+ except Ошибка as ош:
715
+ экземпляр._Обновить_ошибку(ош)
716
+
717
+ def Запросить_строку_нум(экземпляр, запрос, параметры=()):
718
+ # Выполняет запрос ВЫБРАТЬ и возвращает первую строку как кортеж.
719
+ if not экземпляр._соединение:
720
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
721
+
722
+ try:
723
+ экземпляр._соединение.row_factory = None
724
+
725
+ переведённый_запрос = Перевести_код_запроса(запрос)
726
+ курсор = экземпляр._соединение.cursor()
727
+ курсор.execute(переведённый_запрос, параметры)
728
+ строка = курсор.fetchone()
729
+
730
+ return строка
731
+
732
+ except Ошибка as ош:
733
+ экземпляр._Обновить_ошибку(ош)
734
+
735
+ def Запросить_ячейку(экземпляр, запрос, параметры=()):
736
+ # Выполняет запрос ВЫБРАТЬ и возвращает значение первой ячейки первой строки.
737
+ if not экземпляр._соединение:
738
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
739
+
740
+ try:
741
+ экземпляр._соединение.row_factory = None
742
+
743
+ переведённый_запрос = Перевести_код_запроса(запрос)
744
+ курсор = экземпляр._соединение.cursor()
745
+ курсор.execute(переведённый_запрос, параметры)
746
+ строка = курсор.fetchone()
747
+
748
+ return строка[0] if строка else None
749
+
750
+ except Ошибка as ош:
751
+ экземпляр._Обновить_ошибку(ош)
752
+
753
+ def Добавленный_номер(экземпляр):
754
+ # Возвращает номер последней вставленной строки.
755
+ if not экземпляр._соединение:
756
+ экземпляр._Обновить_ошибку(Ошибка("Соединение с БД не установлено."))
757
+
758
+ return экземпляр._соединение.lastrowid
@@ -707,13 +707,14 @@ def Посчитать_физические_строки(путь_к_файлу,
707
707
  r"(.+) takes exactly (\d+) arguments \((\d+) given\)": r'"\1" принимает аргументы в количестве ровно \2 (получено \3).',
708
708
  r"(.+) takes at most (\d+) arguments \((\d+) given\)": r'"\1" принимает аргументы в количестве не более \2 (получено \3).',
709
709
  r"(.+) takes at least (\d+) arguments \((\d+) given\)": r'"\1" принимает аргументы в количестве не менее \2 (получено \3).',
710
+ r"(.+) takes (\d+) positional argument but (\d+) were given": r'Функция "\1" имеет позиционных аргументов: \2, однако получила: \3.',
710
711
  r"ValueError: (.+)": r'Ошибка значения: \1.',
711
712
  r"AttributeError: '(\w+)' object is not callable": r'Объект типа "\1" не является вызываемым.',
712
713
  r"ImportError: No module named '(\w+)'": r'Ошибка импорта: модуль "\1" не найден.',
713
714
  r"FileNotFoundError: \[Errno 2\] No such file or directory: '(.+)'": r'Файл "\1" не найден.',
714
715
  r"IndexError: tuple index out of range": r'Индекс за пределами кортежа.',
715
716
  r"SyntaxError: unexpected EOF while parsing": r'Неожиданный конец файла при разборе кода.',
716
- r"ZeroDivisionError: float division by zero": r'Деление числа с плавающей точкой на ноль.',
717
+ r"ZeroDivisionError: float division by zero": r'Деление числа с плавающей запятой на ноль.',
717
718
  r"TypeError: cannot unpack non-iterable (\w+) object": r'Невозможно распаковать неитерируемый объект типа "\1".',
718
719
  r"MemoryError": r'Недостаточно памяти для выполнения операции.',
719
720
  r"OverflowError: (.+)": r'Переполнение: \1.',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.2.14
3
+ Version: 1.2.15
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Author: Сообщество русских программистов
6
6
  License: ОДРН
@@ -3,7 +3,7 @@ from pathlib import Path as Путь
3
3
 
4
4
  Установить(
5
5
  name = 'rupython',
6
- version = '1.2.14',
6
+ version = '1.2.15',
7
7
  description = "Исполнитель кода Русского Питона",
8
8
  packages = [ 'rupython', 'rupython.Модули' ],
9
9
  long_description = (Путь(__file__).parent / 'README.md').read_text('UTF-8'),
File without changes
File without changes
File without changes