pyRegRep 5__tar.gz → 7__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.
- pyregrep-7/PKG-INFO +283 -0
- pyregrep-7/README.md +271 -0
- pyregrep-7/pyRegRep.egg-info/PKG-INFO +283 -0
- {pyregrep-5 → pyregrep-7}/pyRegRep.egg-info/SOURCES.txt +7 -1
- pyregrep-7/pyRegRep4/NS.py +53 -0
- pyregrep-7/pyRegRep4/RIMElement.py +220 -0
- pyregrep-7/pyRegRep4/RIMParsing.py +342 -0
- pyregrep-7/pyRegRep4/__init__.py +36 -0
- pyregrep-7/pyproject.toml +15 -0
- {pyregrep-5 → pyregrep-7}/setup.py +2 -1
- pyregrep-7/tests/test_get_slot_simple.py +85 -0
- pyregrep-7/tests/test_rim_element.py +347 -0
- pyregrep-7/tests/test_rim_parsing.py +439 -0
- pyregrep-5/PKG-INFO +0 -11
- pyregrep-5/pyRegRep.egg-info/PKG-INFO +0 -11
- pyregrep-5/pyRegRep4/RIMParsing.py +0 -135
- pyregrep-5/pyRegRep4/__init__.py +0 -0
- pyregrep-5/tests/test_parsing_1.py +0 -32
- {pyregrep-5 → pyregrep-7}/LICENSE +0 -0
- {pyregrep-5 → pyregrep-7}/pyRegRep.egg-info/dependency_links.txt +0 -0
- {pyregrep-5 → pyregrep-7}/pyRegRep.egg-info/top_level.txt +0 -0
- {pyregrep-5 → pyregrep-7}/setup.cfg +0 -0
pyregrep-7/PKG-INFO
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyRegRep
|
|
3
|
+
Version: 7
|
|
4
|
+
Summary: Your package description
|
|
5
|
+
Author: Andrey Shapovalov
|
|
6
|
+
Author-email: mt.andrey@gmail.com
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Dynamic: author-email
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# pyRegRep
|
|
14
|
+
|
|
15
|
+
Бібліотека Python для парсування та обробки XML документів у форматі RIM (Registry Information Model) / ebXML.
|
|
16
|
+
|
|
17
|
+
## Опис
|
|
18
|
+
|
|
19
|
+
**pyRegRep** — інструмент для роботи з XML документами стандарту Registry Information Model (RIM), що застосовується в системах eGovernment та обміну даними (зокрема, OOTS/EDM). Бібліотека дозволяє легко витягувати, аналізувати та серіалізувати дані з RIM/ebXML документів, а також програмно створювати коректні RIM-слоти різних типів.
|
|
20
|
+
|
|
21
|
+
## Можливості
|
|
22
|
+
|
|
23
|
+
- ✅ Парсування RIM/ebXML XML документів (`bytes` або `str`)
|
|
24
|
+
- ✅ Автоматична обробка просторів імен (namespaces)
|
|
25
|
+
- ✅ Витягування запитів (Query), винятків (Exception) та об'єктів реєстру (RegistryObject)
|
|
26
|
+
- ✅ Обробка всіх типів значень: Boolean, String, Integer, DateTime, Collection, InternationalString, AnyValue
|
|
27
|
+
- ✅ Серіалізація даних у зручний Python-формат (`dict`)
|
|
28
|
+
- ✅ Фабрика слотів `get_slot()` — програмне створення RIM-слотів за типом
|
|
29
|
+
- ✅ Серіалізація `AnyValueType` через `xmltodict` (параметр `any_type=True`)
|
|
30
|
+
- ✅ Підтримка вкладених колекцій та складних структур
|
|
31
|
+
|
|
32
|
+
## Вимоги
|
|
33
|
+
|
|
34
|
+
- **Python**: >= 3.10
|
|
35
|
+
- **Залежності**:
|
|
36
|
+
- `lxml >= 5.2.1` — робота з XML
|
|
37
|
+
- `xmltodict >= 0.13.0` — серіалізація `AnyValueType`
|
|
38
|
+
|
|
39
|
+
## Установка
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# З PyPI (якщо опубліковано)
|
|
43
|
+
pip install pyRegRep
|
|
44
|
+
|
|
45
|
+
# З локального джерела (editable)
|
|
46
|
+
pip install -e .
|
|
47
|
+
|
|
48
|
+
# Залежності вручну
|
|
49
|
+
pip install -r requirements.txt
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Швидкий старт
|
|
53
|
+
|
|
54
|
+
### Парсування XML документу
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from pyRegRep4.RIMParsing import Parsing
|
|
58
|
+
|
|
59
|
+
with open("document.xml", "rb") as f:
|
|
60
|
+
parser = Parsing(f.read())
|
|
61
|
+
|
|
62
|
+
# Усі слоти у вигляді {category: {name: (type, value)}}
|
|
63
|
+
print(parser.slots)
|
|
64
|
+
|
|
65
|
+
# Серіалізовані дані (без типової інформації)
|
|
66
|
+
print(parser.serialize())
|
|
67
|
+
|
|
68
|
+
# Серіалізація з обробкою AnyValueType в dict
|
|
69
|
+
print(parser.serialize(any_type=True))
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Програмне створення RIM-слотів
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import datetime
|
|
76
|
+
from lxml import etree
|
|
77
|
+
from pyRegRep4.RIMElement import get_slot
|
|
78
|
+
|
|
79
|
+
# Текстовий слот
|
|
80
|
+
slot = get_slot("SpecificationIdentifier", "StringValueType", "oots-edm:v1.2")
|
|
81
|
+
print(slot.name) # 'SpecificationIdentifier'
|
|
82
|
+
print(slot.value) # 'oots-edm:v1.2'
|
|
83
|
+
print(slot.text) # XML як bytes
|
|
84
|
+
|
|
85
|
+
# Логічний слот
|
|
86
|
+
slot = get_slot("PossibilityForPreview", "BooleanValueType", True)
|
|
87
|
+
|
|
88
|
+
# Слот дата/час
|
|
89
|
+
slot = get_slot("IssueDateTime", "DateTimeValueType", datetime.datetime.now())
|
|
90
|
+
|
|
91
|
+
# Слот довільного XML (AnyValueType)
|
|
92
|
+
elem = etree.Element("CustomData")
|
|
93
|
+
elem.text = "Payload"
|
|
94
|
+
slot = get_slot("CustomPayload", "AnyValueType", elem)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## API Довідник
|
|
98
|
+
|
|
99
|
+
### Клас `Parsing` (`pyRegRep4.RIMParsing`)
|
|
100
|
+
|
|
101
|
+
#### Конструктор
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
Parsing(doc: bytes | str)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
| Параметр | Тип | Опис |
|
|
108
|
+
|----------|-----|------|
|
|
109
|
+
| `doc` | `bytes \| str` | XML документ |
|
|
110
|
+
|
|
111
|
+
#### Атрибути
|
|
112
|
+
|
|
113
|
+
| Атрибут | Тип | Опис |
|
|
114
|
+
|---------|-----|------|
|
|
115
|
+
| `xml` | `str` | XML як рядок |
|
|
116
|
+
| `doc` | `etree._Element` | Розібраний XML документ |
|
|
117
|
+
| `query` | `etree._Element \| None` | Елемент `Query` (якщо є) |
|
|
118
|
+
| `exception` | `etree._Element \| None` | Елемент `Exception` (якщо є) |
|
|
119
|
+
| `objects` | `list` | Список `RegistryObject` елементів |
|
|
120
|
+
| `slots` | `dict` | Всі слоти у форматі `{category: {name: (type, value)}}` |
|
|
121
|
+
|
|
122
|
+
Категорії `slots`: `"doc"`, `"query"`, `"exception"`, `"object"`.
|
|
123
|
+
|
|
124
|
+
#### Метод `serialize(any_type: bool = False) -> dict`
|
|
125
|
+
|
|
126
|
+
Серіалізує слоти в чистий Python-формат, видаляючи типову інформацію.
|
|
127
|
+
|
|
128
|
+
| Тип значення | Python-результат |
|
|
129
|
+
|---|---|
|
|
130
|
+
| `BooleanValueType` | `bool` |
|
|
131
|
+
| `StringValueType` | `str` |
|
|
132
|
+
| `DateTimeValueType` | `str` (ISO format) |
|
|
133
|
+
| `IntegerValueType` | `int` |
|
|
134
|
+
| `CollectionValueType` | `list` |
|
|
135
|
+
| `InternationalStringValueType` | `list[dict]` |
|
|
136
|
+
| `AnyValueType` (за замовчуванням) | `etree._Element` |
|
|
137
|
+
| `AnyValueType` (з `any_type=True`) | `dict` (через `xmltodict`) |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### Функція `get_slot()` (`pyRegRep4.RIMElement`)
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
get_slot(name: str, slot_type: str, value: Any) -> Xml
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Фабрика для програмного створення RIM-слотів.
|
|
148
|
+
|
|
149
|
+
| Параметр | Тип | Опис |
|
|
150
|
+
|----------|-----|------|
|
|
151
|
+
| `name` | `str` | Ім'я слота |
|
|
152
|
+
| `slot_type` | `str` | Тип слота (див. таблицю нижче) |
|
|
153
|
+
| `value` | `Any` | Значення слота |
|
|
154
|
+
|
|
155
|
+
**Підтримані типи:**
|
|
156
|
+
|
|
157
|
+
| `slot_type` | Тип `value` | Опис |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| `"StringValueType"` | `str` | Текстовий рядок |
|
|
160
|
+
| `"BooleanValueType"` | `bool` | Логічне значення |
|
|
161
|
+
| `"DateTimeValueType"` | `datetime.datetime` або `str` | Дата/час |
|
|
162
|
+
| `"CollectionValueType"` | `etree._Element` | Колекція елементів |
|
|
163
|
+
| `"AnyValueType"` | `etree._Element` | Довільний XML елемент |
|
|
164
|
+
| `"InternationalStringValueType"` | `etree._Element` або `list[etree._Element]` | Багатомовний текст |
|
|
165
|
+
|
|
166
|
+
**Повертає** об'єкт `Xml` з властивостями:
|
|
167
|
+
- `name` — ім'я слота
|
|
168
|
+
- `value` — значення
|
|
169
|
+
- `element` — XML елемент (`etree._Element`)
|
|
170
|
+
- `text` — серіалізований XML (`bytes`)
|
|
171
|
+
|
|
172
|
+
**Викидає** `ValueError` при невідомому типі слота.
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
try:
|
|
176
|
+
slot = get_slot("Bad", "UnknownType", "value")
|
|
177
|
+
except ValueError as e:
|
|
178
|
+
print(e) # Невідомий тип слота: UnknownType. Підтримувані типи: [...]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### Клас `NS` (`pyRegRep4.NS`)
|
|
184
|
+
|
|
185
|
+
Базовий клас для управління RIM namespace. Надає метод `_tname(prefix, localname)` для генерування кваліфікованих імен тегів у нотації Clark.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
### Виняток `ParsingError` (`pyRegRep4.RIMParsing`)
|
|
190
|
+
|
|
191
|
+
Базовий клас для помилок парсування. Кидається при некоректному XML або відсутньому namespace.
|
|
192
|
+
|
|
193
|
+
## Структура проекту
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
pyRegRep/
|
|
197
|
+
├── pyRegRep4/
|
|
198
|
+
│ ├── __init__.py # Експорт: get_slot та типи слотів
|
|
199
|
+
│ ├── RIMElement.py # Класи слотів + фабрика get_slot()
|
|
200
|
+
│ ├── RIMParsing.py # Парсер Parsing + serialize()
|
|
201
|
+
│ └── NS.py # Базовий клас для namespace
|
|
202
|
+
├── tests/
|
|
203
|
+
│ ├── conftest.py # sys.path для CI
|
|
204
|
+
│ ├── test_rim_parsing.py # Тести парсера
|
|
205
|
+
│ ├── test_rim_element.py # Тести get_slot() та типів слотів
|
|
206
|
+
│ ├── EDM_Ferst_Request.xml
|
|
207
|
+
│ ├── EDM_Ferst_Response.xml
|
|
208
|
+
│ ├── EDM_Second_Request.xml
|
|
209
|
+
│ └── EDM_Second_Response.xml
|
|
210
|
+
├── example/
|
|
211
|
+
│ ├── Example_1.py
|
|
212
|
+
│ ├── example_anyvaluetype_usage.py
|
|
213
|
+
│ └── example_get_slot_usage.py
|
|
214
|
+
├── setup.py
|
|
215
|
+
├── pyproject.toml
|
|
216
|
+
├── requirements.txt
|
|
217
|
+
└── README.md
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Запуск тестів
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Встановлення залежностей
|
|
224
|
+
pip install lxml xmltodict pytest
|
|
225
|
+
|
|
226
|
+
# Усі тести
|
|
227
|
+
python -m pytest --disable-warnings -q
|
|
228
|
+
|
|
229
|
+
# Тільки тести парсера
|
|
230
|
+
python -m pytest tests/test_rim_parsing.py -v
|
|
231
|
+
|
|
232
|
+
# Тільки тести слотів
|
|
233
|
+
python -m pytest tests/test_rim_element.py -v
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Логування
|
|
237
|
+
|
|
238
|
+
Бібліотека використовує стандартний `logging`. Для увімкнення:
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
import logging
|
|
242
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Технічні деталі
|
|
246
|
+
|
|
247
|
+
### Обробка просторів імен
|
|
248
|
+
|
|
249
|
+
Namespace витягуються автоматично з кореневого елемента документа та зберігаються у `parser._ns` у форматі `{prefix: uri}`.
|
|
250
|
+
|
|
251
|
+
### Формат `slots`
|
|
252
|
+
|
|
253
|
+
```python
|
|
254
|
+
{
|
|
255
|
+
"doc": {
|
|
256
|
+
"SpecificationIdentifier": ("StringValueType", "oots-edm:v1.2"),
|
|
257
|
+
"IssueDateTime": ("DateTimeValueType", "2024-03-15T10:30:00"),
|
|
258
|
+
"PossibilityForPreview": ("BooleanValueType", "false"),
|
|
259
|
+
},
|
|
260
|
+
"query": {},
|
|
261
|
+
"exception": {},
|
|
262
|
+
"object": {}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Автор
|
|
267
|
+
|
|
268
|
+
**Andrey Shapovalov** — mt.andrey@gmail.com
|
|
269
|
+
|
|
270
|
+
## Ліцензія
|
|
271
|
+
|
|
272
|
+
MIT License — див. файл [LICENSE](LICENSE)
|
|
273
|
+
|
|
274
|
+
## Посилання
|
|
275
|
+
|
|
276
|
+
- [ebXML / Registry Information Model](https://en.wikipedia.org/wiki/ebXML)
|
|
277
|
+
- [OOTS EDM Specification](https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/OOTS)
|
|
278
|
+
- [lxml Documentation](https://lxml.de/)
|
|
279
|
+
- [xmltodict](https://github.com/martinblech/xmltodict)
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
**Версія:** 7 · **Оновлено:** 2026-03-11
|
pyregrep-7/README.md
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# pyRegRep
|
|
2
|
+
|
|
3
|
+
Бібліотека Python для парсування та обробки XML документів у форматі RIM (Registry Information Model) / ebXML.
|
|
4
|
+
|
|
5
|
+
## Опис
|
|
6
|
+
|
|
7
|
+
**pyRegRep** — інструмент для роботи з XML документами стандарту Registry Information Model (RIM), що застосовується в системах eGovernment та обміну даними (зокрема, OOTS/EDM). Бібліотека дозволяє легко витягувати, аналізувати та серіалізувати дані з RIM/ebXML документів, а також програмно створювати коректні RIM-слоти різних типів.
|
|
8
|
+
|
|
9
|
+
## Можливості
|
|
10
|
+
|
|
11
|
+
- ✅ Парсування RIM/ebXML XML документів (`bytes` або `str`)
|
|
12
|
+
- ✅ Автоматична обробка просторів імен (namespaces)
|
|
13
|
+
- ✅ Витягування запитів (Query), винятків (Exception) та об'єктів реєстру (RegistryObject)
|
|
14
|
+
- ✅ Обробка всіх типів значень: Boolean, String, Integer, DateTime, Collection, InternationalString, AnyValue
|
|
15
|
+
- ✅ Серіалізація даних у зручний Python-формат (`dict`)
|
|
16
|
+
- ✅ Фабрика слотів `get_slot()` — програмне створення RIM-слотів за типом
|
|
17
|
+
- ✅ Серіалізація `AnyValueType` через `xmltodict` (параметр `any_type=True`)
|
|
18
|
+
- ✅ Підтримка вкладених колекцій та складних структур
|
|
19
|
+
|
|
20
|
+
## Вимоги
|
|
21
|
+
|
|
22
|
+
- **Python**: >= 3.10
|
|
23
|
+
- **Залежності**:
|
|
24
|
+
- `lxml >= 5.2.1` — робота з XML
|
|
25
|
+
- `xmltodict >= 0.13.0` — серіалізація `AnyValueType`
|
|
26
|
+
|
|
27
|
+
## Установка
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# З PyPI (якщо опубліковано)
|
|
31
|
+
pip install pyRegRep
|
|
32
|
+
|
|
33
|
+
# З локального джерела (editable)
|
|
34
|
+
pip install -e .
|
|
35
|
+
|
|
36
|
+
# Залежності вручну
|
|
37
|
+
pip install -r requirements.txt
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Швидкий старт
|
|
41
|
+
|
|
42
|
+
### Парсування XML документу
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
from pyRegRep4.RIMParsing import Parsing
|
|
46
|
+
|
|
47
|
+
with open("document.xml", "rb") as f:
|
|
48
|
+
parser = Parsing(f.read())
|
|
49
|
+
|
|
50
|
+
# Усі слоти у вигляді {category: {name: (type, value)}}
|
|
51
|
+
print(parser.slots)
|
|
52
|
+
|
|
53
|
+
# Серіалізовані дані (без типової інформації)
|
|
54
|
+
print(parser.serialize())
|
|
55
|
+
|
|
56
|
+
# Серіалізація з обробкою AnyValueType в dict
|
|
57
|
+
print(parser.serialize(any_type=True))
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Програмне створення RIM-слотів
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
import datetime
|
|
64
|
+
from lxml import etree
|
|
65
|
+
from pyRegRep4.RIMElement import get_slot
|
|
66
|
+
|
|
67
|
+
# Текстовий слот
|
|
68
|
+
slot = get_slot("SpecificationIdentifier", "StringValueType", "oots-edm:v1.2")
|
|
69
|
+
print(slot.name) # 'SpecificationIdentifier'
|
|
70
|
+
print(slot.value) # 'oots-edm:v1.2'
|
|
71
|
+
print(slot.text) # XML як bytes
|
|
72
|
+
|
|
73
|
+
# Логічний слот
|
|
74
|
+
slot = get_slot("PossibilityForPreview", "BooleanValueType", True)
|
|
75
|
+
|
|
76
|
+
# Слот дата/час
|
|
77
|
+
slot = get_slot("IssueDateTime", "DateTimeValueType", datetime.datetime.now())
|
|
78
|
+
|
|
79
|
+
# Слот довільного XML (AnyValueType)
|
|
80
|
+
elem = etree.Element("CustomData")
|
|
81
|
+
elem.text = "Payload"
|
|
82
|
+
slot = get_slot("CustomPayload", "AnyValueType", elem)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## API Довідник
|
|
86
|
+
|
|
87
|
+
### Клас `Parsing` (`pyRegRep4.RIMParsing`)
|
|
88
|
+
|
|
89
|
+
#### Конструктор
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
Parsing(doc: bytes | str)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
| Параметр | Тип | Опис |
|
|
96
|
+
|----------|-----|------|
|
|
97
|
+
| `doc` | `bytes \| str` | XML документ |
|
|
98
|
+
|
|
99
|
+
#### Атрибути
|
|
100
|
+
|
|
101
|
+
| Атрибут | Тип | Опис |
|
|
102
|
+
|---------|-----|------|
|
|
103
|
+
| `xml` | `str` | XML як рядок |
|
|
104
|
+
| `doc` | `etree._Element` | Розібраний XML документ |
|
|
105
|
+
| `query` | `etree._Element \| None` | Елемент `Query` (якщо є) |
|
|
106
|
+
| `exception` | `etree._Element \| None` | Елемент `Exception` (якщо є) |
|
|
107
|
+
| `objects` | `list` | Список `RegistryObject` елементів |
|
|
108
|
+
| `slots` | `dict` | Всі слоти у форматі `{category: {name: (type, value)}}` |
|
|
109
|
+
|
|
110
|
+
Категорії `slots`: `"doc"`, `"query"`, `"exception"`, `"object"`.
|
|
111
|
+
|
|
112
|
+
#### Метод `serialize(any_type: bool = False) -> dict`
|
|
113
|
+
|
|
114
|
+
Серіалізує слоти в чистий Python-формат, видаляючи типову інформацію.
|
|
115
|
+
|
|
116
|
+
| Тип значення | Python-результат |
|
|
117
|
+
|---|---|
|
|
118
|
+
| `BooleanValueType` | `bool` |
|
|
119
|
+
| `StringValueType` | `str` |
|
|
120
|
+
| `DateTimeValueType` | `str` (ISO format) |
|
|
121
|
+
| `IntegerValueType` | `int` |
|
|
122
|
+
| `CollectionValueType` | `list` |
|
|
123
|
+
| `InternationalStringValueType` | `list[dict]` |
|
|
124
|
+
| `AnyValueType` (за замовчуванням) | `etree._Element` |
|
|
125
|
+
| `AnyValueType` (з `any_type=True`) | `dict` (через `xmltodict`) |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### Функція `get_slot()` (`pyRegRep4.RIMElement`)
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
get_slot(name: str, slot_type: str, value: Any) -> Xml
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Фабрика для програмного створення RIM-слотів.
|
|
136
|
+
|
|
137
|
+
| Параметр | Тип | Опис |
|
|
138
|
+
|----------|-----|------|
|
|
139
|
+
| `name` | `str` | Ім'я слота |
|
|
140
|
+
| `slot_type` | `str` | Тип слота (див. таблицю нижче) |
|
|
141
|
+
| `value` | `Any` | Значення слота |
|
|
142
|
+
|
|
143
|
+
**Підтримані типи:**
|
|
144
|
+
|
|
145
|
+
| `slot_type` | Тип `value` | Опис |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `"StringValueType"` | `str` | Текстовий рядок |
|
|
148
|
+
| `"BooleanValueType"` | `bool` | Логічне значення |
|
|
149
|
+
| `"DateTimeValueType"` | `datetime.datetime` або `str` | Дата/час |
|
|
150
|
+
| `"CollectionValueType"` | `etree._Element` | Колекція елементів |
|
|
151
|
+
| `"AnyValueType"` | `etree._Element` | Довільний XML елемент |
|
|
152
|
+
| `"InternationalStringValueType"` | `etree._Element` або `list[etree._Element]` | Багатомовний текст |
|
|
153
|
+
|
|
154
|
+
**Повертає** об'єкт `Xml` з властивостями:
|
|
155
|
+
- `name` — ім'я слота
|
|
156
|
+
- `value` — значення
|
|
157
|
+
- `element` — XML елемент (`etree._Element`)
|
|
158
|
+
- `text` — серіалізований XML (`bytes`)
|
|
159
|
+
|
|
160
|
+
**Викидає** `ValueError` при невідомому типі слота.
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
try:
|
|
164
|
+
slot = get_slot("Bad", "UnknownType", "value")
|
|
165
|
+
except ValueError as e:
|
|
166
|
+
print(e) # Невідомий тип слота: UnknownType. Підтримувані типи: [...]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### Клас `NS` (`pyRegRep4.NS`)
|
|
172
|
+
|
|
173
|
+
Базовий клас для управління RIM namespace. Надає метод `_tname(prefix, localname)` для генерування кваліфікованих імен тегів у нотації Clark.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### Виняток `ParsingError` (`pyRegRep4.RIMParsing`)
|
|
178
|
+
|
|
179
|
+
Базовий клас для помилок парсування. Кидається при некоректному XML або відсутньому namespace.
|
|
180
|
+
|
|
181
|
+
## Структура проекту
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
pyRegRep/
|
|
185
|
+
├── pyRegRep4/
|
|
186
|
+
│ ├── __init__.py # Експорт: get_slot та типи слотів
|
|
187
|
+
│ ├── RIMElement.py # Класи слотів + фабрика get_slot()
|
|
188
|
+
│ ├── RIMParsing.py # Парсер Parsing + serialize()
|
|
189
|
+
│ └── NS.py # Базовий клас для namespace
|
|
190
|
+
├── tests/
|
|
191
|
+
│ ├── conftest.py # sys.path для CI
|
|
192
|
+
│ ├── test_rim_parsing.py # Тести парсера
|
|
193
|
+
│ ├── test_rim_element.py # Тести get_slot() та типів слотів
|
|
194
|
+
│ ├── EDM_Ferst_Request.xml
|
|
195
|
+
│ ├── EDM_Ferst_Response.xml
|
|
196
|
+
│ ├── EDM_Second_Request.xml
|
|
197
|
+
│ └── EDM_Second_Response.xml
|
|
198
|
+
├── example/
|
|
199
|
+
│ ├── Example_1.py
|
|
200
|
+
│ ├── example_anyvaluetype_usage.py
|
|
201
|
+
│ └── example_get_slot_usage.py
|
|
202
|
+
├── setup.py
|
|
203
|
+
├── pyproject.toml
|
|
204
|
+
├── requirements.txt
|
|
205
|
+
└── README.md
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Запуск тестів
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Встановлення залежностей
|
|
212
|
+
pip install lxml xmltodict pytest
|
|
213
|
+
|
|
214
|
+
# Усі тести
|
|
215
|
+
python -m pytest --disable-warnings -q
|
|
216
|
+
|
|
217
|
+
# Тільки тести парсера
|
|
218
|
+
python -m pytest tests/test_rim_parsing.py -v
|
|
219
|
+
|
|
220
|
+
# Тільки тести слотів
|
|
221
|
+
python -m pytest tests/test_rim_element.py -v
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Логування
|
|
225
|
+
|
|
226
|
+
Бібліотека використовує стандартний `logging`. Для увімкнення:
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
import logging
|
|
230
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Технічні деталі
|
|
234
|
+
|
|
235
|
+
### Обробка просторів імен
|
|
236
|
+
|
|
237
|
+
Namespace витягуються автоматично з кореневого елемента документа та зберігаються у `parser._ns` у форматі `{prefix: uri}`.
|
|
238
|
+
|
|
239
|
+
### Формат `slots`
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
{
|
|
243
|
+
"doc": {
|
|
244
|
+
"SpecificationIdentifier": ("StringValueType", "oots-edm:v1.2"),
|
|
245
|
+
"IssueDateTime": ("DateTimeValueType", "2024-03-15T10:30:00"),
|
|
246
|
+
"PossibilityForPreview": ("BooleanValueType", "false"),
|
|
247
|
+
},
|
|
248
|
+
"query": {},
|
|
249
|
+
"exception": {},
|
|
250
|
+
"object": {}
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Автор
|
|
255
|
+
|
|
256
|
+
**Andrey Shapovalov** — mt.andrey@gmail.com
|
|
257
|
+
|
|
258
|
+
## Ліцензія
|
|
259
|
+
|
|
260
|
+
MIT License — див. файл [LICENSE](LICENSE)
|
|
261
|
+
|
|
262
|
+
## Посилання
|
|
263
|
+
|
|
264
|
+
- [ebXML / Registry Information Model](https://en.wikipedia.org/wiki/ebXML)
|
|
265
|
+
- [OOTS EDM Specification](https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/OOTS)
|
|
266
|
+
- [lxml Documentation](https://lxml.de/)
|
|
267
|
+
- [xmltodict](https://github.com/martinblech/xmltodict)
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
**Версія:** 7 · **Оновлено:** 2026-03-11
|