drb 2.3.2__tar.gz → 2.3.3__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.
- {drb-2.3.2/drb.egg-info → drb-2.3.3}/PKG-INFO +1 -1
- {drb-2.3.2 → drb-2.3.3}/drb/core/_version.py +3 -3
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_visitor.py +42 -0
- {drb-2.3.2 → drb-2.3.3/drb.egg-info}/PKG-INFO +1 -1
- {drb-2.3.2 → drb-2.3.3}/LICENCE.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/MANIFEST.in +0 -0
- {drb-2.3.2 → drb-2.3.3}/README.md +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/addons/addon.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/cortex_validator.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/events.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/factory.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/impls.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/item.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/path.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/predicate.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/core/signature.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/drivers/file/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/drivers/file/file.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/factory.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/exceptions/core.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/exceptions/file.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/keyring/bitwarden/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/keyring/bitwarden/bitwarden.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/nodes/abstract_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/nodes/logical_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/nodes/mutable_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/nodes/url_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/signatures/core.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/signatures/xquery.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/manager_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/rdf_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/topic_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/topic_schema.yml +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/xml_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/yaml_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/file/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/file/cortex.yml +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/resolver.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/topic.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/xml/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/topics/xml/cortex.yml +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/utils/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/utils/drb_python_script.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/utils/plugins.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/utils/url_security.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/utils/utils.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryLexer.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParser.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParserListener.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParserVisitor.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/__init__.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_cmd.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_context.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_func.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_item.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_res_to_string.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_utils.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_variable.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb/xquery/exceptions.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/SOURCES.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/dependency_links.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/entry_points.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/not-zip-safe +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/requires.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/drb.egg-info/top_level.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/pyproject.toml +0 -0
- {drb-2.3.2 → drb-2.3.3}/requirements.txt +0 -0
- {drb-2.3.2 → drb-2.3.3}/setup.cfg +0 -0
- {drb-2.3.2 → drb-2.3.3}/setup.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_abstract_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_addon.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_drb_node_list.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_drb_python_script.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_event.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_factory.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_factory_resolver.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_implementation_manager.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_keyring_bitwarden.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_logical_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_manager_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_node_descendant.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_path.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_rdf_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_rdf_dao_multi_url.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_signatures.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_topic.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_url_node.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_url_security.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_xml_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/tests/test_yaml_dao.py +0 -0
- {drb-2.3.2 → drb-2.3.3}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-06-18T15:
|
|
11
|
+
"date": "2026-06-18T15:45:35+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.3.
|
|
14
|
+
"full-revisionid": "eee66f5c219c052a2465479e0be57a251647a9fd",
|
|
15
|
+
"version": "2.3.3"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
1
3
|
from antlr4 import InputStream, CommonTokenStream
|
|
2
4
|
from antlr4.error.ErrorListener import ErrorListener
|
|
3
5
|
from antlr4.tree.Tree import TerminalNodeImpl
|
|
@@ -1351,6 +1353,16 @@ class DrbQueryVisitor(XQueryParserVisitor):
|
|
|
1351
1353
|
elif exp.getText() == '//':
|
|
1352
1354
|
step_nav = NavigationStep.DESCENDANT_OR_SELF
|
|
1353
1355
|
elif isinstance(exp, XQueryParser.StepExprContext):
|
|
1356
|
+
# A path step whose whole text is digits is parsed as a numeric
|
|
1357
|
+
# literal because an NCName cannot start with a digit; in
|
|
1358
|
+
# path-step position it is a name test (e.g. /2026/01/15).
|
|
1359
|
+
# Resolve it as such (TICKET-006).
|
|
1360
|
+
if re.fullmatch(r'\d+', exp.getText()):
|
|
1361
|
+
self.list_context = self._numeric_name_step(
|
|
1362
|
+
exp.getText(), step_nav)
|
|
1363
|
+
result = self.list_context
|
|
1364
|
+
continue
|
|
1365
|
+
|
|
1354
1366
|
result = []
|
|
1355
1367
|
index = 0
|
|
1356
1368
|
for node in self.list_context:
|
|
@@ -1373,6 +1385,36 @@ class DrbQueryVisitor(XQueryParserVisitor):
|
|
|
1373
1385
|
self.list_context = result
|
|
1374
1386
|
return result
|
|
1375
1387
|
|
|
1388
|
+
def _numeric_name_step(self, name, step_nav):
|
|
1389
|
+
"""Resolve a numeric path step as a name test (TICKET-006).
|
|
1390
|
+
|
|
1391
|
+
Selects, from the current context, the children named exactly
|
|
1392
|
+
``name`` (CHILD navigation) or any such descendant ('//' navigation).
|
|
1393
|
+
"""
|
|
1394
|
+
result = []
|
|
1395
|
+
for ctx_node in self.list_context:
|
|
1396
|
+
node = ctx_node.node \
|
|
1397
|
+
if isinstance(ctx_node, DynamicContext) else ctx_node
|
|
1398
|
+
if not isinstance(node, DrbNode):
|
|
1399
|
+
continue
|
|
1400
|
+
if step_nav == NavigationStep.DESCENDANT_OR_SELF:
|
|
1401
|
+
candidates = self._all_descendants(node)
|
|
1402
|
+
else:
|
|
1403
|
+
candidates = node._browse_children()
|
|
1404
|
+
for child in candidates:
|
|
1405
|
+
if child.name == name:
|
|
1406
|
+
result.append(DynamicContext(
|
|
1407
|
+
child, position=len(result) + 1))
|
|
1408
|
+
return result
|
|
1409
|
+
|
|
1410
|
+
@staticmethod
|
|
1411
|
+
def _all_descendants(node):
|
|
1412
|
+
result = []
|
|
1413
|
+
for child in node._browse_children():
|
|
1414
|
+
result.append(child)
|
|
1415
|
+
result.extend(DrbQueryVisitor._all_descendants(child))
|
|
1416
|
+
return result
|
|
1417
|
+
|
|
1376
1418
|
# Visit a parse tree produced by XQueryParser#enclosedContentExpr.
|
|
1377
1419
|
|
|
1378
1420
|
def visitEnclosedExpression(self,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drb-2.3.2 → drb-2.3.3}/setup.py
RENAMED
|
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
|
|
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
|
|
File without changes
|