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.
Files changed (97) hide show
  1. {drb-2.3.2/drb.egg-info → drb-2.3.3}/PKG-INFO +1 -1
  2. {drb-2.3.2 → drb-2.3.3}/drb/core/_version.py +3 -3
  3. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_visitor.py +42 -0
  4. {drb-2.3.2 → drb-2.3.3/drb.egg-info}/PKG-INFO +1 -1
  5. {drb-2.3.2 → drb-2.3.3}/LICENCE.txt +0 -0
  6. {drb-2.3.2 → drb-2.3.3}/MANIFEST.in +0 -0
  7. {drb-2.3.2 → drb-2.3.3}/README.md +0 -0
  8. {drb-2.3.2 → drb-2.3.3}/drb/addons/addon.py +0 -0
  9. {drb-2.3.2 → drb-2.3.3}/drb/core/__init__.py +0 -0
  10. {drb-2.3.2 → drb-2.3.3}/drb/core/cortex_validator.py +0 -0
  11. {drb-2.3.2 → drb-2.3.3}/drb/core/events.py +0 -0
  12. {drb-2.3.2 → drb-2.3.3}/drb/core/factory.py +0 -0
  13. {drb-2.3.2 → drb-2.3.3}/drb/core/impls.py +0 -0
  14. {drb-2.3.2 → drb-2.3.3}/drb/core/item.py +0 -0
  15. {drb-2.3.2 → drb-2.3.3}/drb/core/node.py +0 -0
  16. {drb-2.3.2 → drb-2.3.3}/drb/core/path.py +0 -0
  17. {drb-2.3.2 → drb-2.3.3}/drb/core/predicate.py +0 -0
  18. {drb-2.3.2 → drb-2.3.3}/drb/core/signature.py +0 -0
  19. {drb-2.3.2 → drb-2.3.3}/drb/drivers/file/__init__.py +0 -0
  20. {drb-2.3.2 → drb-2.3.3}/drb/drivers/file/file.py +0 -0
  21. {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/__init__.py +0 -0
  22. {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/factory.py +0 -0
  23. {drb-2.3.2 → drb-2.3.3}/drb/drivers/xml/node.py +0 -0
  24. {drb-2.3.2 → drb-2.3.3}/drb/exceptions/core.py +0 -0
  25. {drb-2.3.2 → drb-2.3.3}/drb/exceptions/file.py +0 -0
  26. {drb-2.3.2 → drb-2.3.3}/drb/keyring/bitwarden/__init__.py +0 -0
  27. {drb-2.3.2 → drb-2.3.3}/drb/keyring/bitwarden/bitwarden.py +0 -0
  28. {drb-2.3.2 → drb-2.3.3}/drb/nodes/abstract_node.py +0 -0
  29. {drb-2.3.2 → drb-2.3.3}/drb/nodes/logical_node.py +0 -0
  30. {drb-2.3.2 → drb-2.3.3}/drb/nodes/mutable_node.py +0 -0
  31. {drb-2.3.2 → drb-2.3.3}/drb/nodes/url_node.py +0 -0
  32. {drb-2.3.2 → drb-2.3.3}/drb/signatures/core.py +0 -0
  33. {drb-2.3.2 → drb-2.3.3}/drb/signatures/xquery.py +0 -0
  34. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/__init__.py +0 -0
  35. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/manager_dao.py +0 -0
  36. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/rdf_dao.py +0 -0
  37. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/topic_dao.py +0 -0
  38. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/topic_schema.yml +0 -0
  39. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/xml_dao.py +0 -0
  40. {drb-2.3.2 → drb-2.3.3}/drb/topics/dao/yaml_dao.py +0 -0
  41. {drb-2.3.2 → drb-2.3.3}/drb/topics/file/__init__.py +0 -0
  42. {drb-2.3.2 → drb-2.3.3}/drb/topics/file/cortex.yml +0 -0
  43. {drb-2.3.2 → drb-2.3.3}/drb/topics/resolver.py +0 -0
  44. {drb-2.3.2 → drb-2.3.3}/drb/topics/topic.py +0 -0
  45. {drb-2.3.2 → drb-2.3.3}/drb/topics/xml/__init__.py +0 -0
  46. {drb-2.3.2 → drb-2.3.3}/drb/topics/xml/cortex.yml +0 -0
  47. {drb-2.3.2 → drb-2.3.3}/drb/utils/__init__.py +0 -0
  48. {drb-2.3.2 → drb-2.3.3}/drb/utils/drb_python_script.py +0 -0
  49. {drb-2.3.2 → drb-2.3.3}/drb/utils/plugins.py +0 -0
  50. {drb-2.3.2 → drb-2.3.3}/drb/utils/url_security.py +0 -0
  51. {drb-2.3.2 → drb-2.3.3}/drb/utils/utils.py +0 -0
  52. {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryLexer.py +0 -0
  53. {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParser.py +0 -0
  54. {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParserListener.py +0 -0
  55. {drb-2.3.2 → drb-2.3.3}/drb/xquery/XQueryParserVisitor.py +0 -0
  56. {drb-2.3.2 → drb-2.3.3}/drb/xquery/__init__.py +0 -0
  57. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery.py +0 -0
  58. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_cmd.py +0 -0
  59. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_context.py +0 -0
  60. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_func.py +0 -0
  61. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_item.py +0 -0
  62. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_res_to_string.py +0 -0
  63. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_utils.py +0 -0
  64. {drb-2.3.2 → drb-2.3.3}/drb/xquery/drb_xquery_variable.py +0 -0
  65. {drb-2.3.2 → drb-2.3.3}/drb/xquery/exceptions.py +0 -0
  66. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/SOURCES.txt +0 -0
  67. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/dependency_links.txt +0 -0
  68. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/entry_points.txt +0 -0
  69. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/not-zip-safe +0 -0
  70. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/requires.txt +0 -0
  71. {drb-2.3.2 → drb-2.3.3}/drb.egg-info/top_level.txt +0 -0
  72. {drb-2.3.2 → drb-2.3.3}/pyproject.toml +0 -0
  73. {drb-2.3.2 → drb-2.3.3}/requirements.txt +0 -0
  74. {drb-2.3.2 → drb-2.3.3}/setup.cfg +0 -0
  75. {drb-2.3.2 → drb-2.3.3}/setup.py +0 -0
  76. {drb-2.3.2 → drb-2.3.3}/tests/test_abstract_node.py +0 -0
  77. {drb-2.3.2 → drb-2.3.3}/tests/test_addon.py +0 -0
  78. {drb-2.3.2 → drb-2.3.3}/tests/test_drb_node_list.py +0 -0
  79. {drb-2.3.2 → drb-2.3.3}/tests/test_drb_python_script.py +0 -0
  80. {drb-2.3.2 → drb-2.3.3}/tests/test_event.py +0 -0
  81. {drb-2.3.2 → drb-2.3.3}/tests/test_factory.py +0 -0
  82. {drb-2.3.2 → drb-2.3.3}/tests/test_factory_resolver.py +0 -0
  83. {drb-2.3.2 → drb-2.3.3}/tests/test_implementation_manager.py +0 -0
  84. {drb-2.3.2 → drb-2.3.3}/tests/test_keyring_bitwarden.py +0 -0
  85. {drb-2.3.2 → drb-2.3.3}/tests/test_logical_node.py +0 -0
  86. {drb-2.3.2 → drb-2.3.3}/tests/test_manager_dao.py +0 -0
  87. {drb-2.3.2 → drb-2.3.3}/tests/test_node_descendant.py +0 -0
  88. {drb-2.3.2 → drb-2.3.3}/tests/test_path.py +0 -0
  89. {drb-2.3.2 → drb-2.3.3}/tests/test_rdf_dao.py +0 -0
  90. {drb-2.3.2 → drb-2.3.3}/tests/test_rdf_dao_multi_url.py +0 -0
  91. {drb-2.3.2 → drb-2.3.3}/tests/test_signatures.py +0 -0
  92. {drb-2.3.2 → drb-2.3.3}/tests/test_topic.py +0 -0
  93. {drb-2.3.2 → drb-2.3.3}/tests/test_url_node.py +0 -0
  94. {drb-2.3.2 → drb-2.3.3}/tests/test_url_security.py +0 -0
  95. {drb-2.3.2 → drb-2.3.3}/tests/test_xml_dao.py +0 -0
  96. {drb-2.3.2 → drb-2.3.3}/tests/test_yaml_dao.py +0 -0
  97. {drb-2.3.2 → drb-2.3.3}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drb
3
- Version: 2.3.2
3
+ Version: 2.3.3
4
4
  Summary: Data Request Broker
5
5
  Author: GAEL Systems
6
6
  Author-email: drb-python@gael.fr
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-06-18T15:10:51+0000",
11
+ "date": "2026-06-18T15:45:35+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "02d64d042c4364857ac89ce8e8f6461acfdf9bb8",
15
- "version": "2.3.2"
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drb
3
- Version: 2.3.2
3
+ Version: 2.3.3
4
4
  Summary: Data Request Broker
5
5
  Author: GAEL Systems
6
6
  Author-email: drb-python@gael.fr
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
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