plexus-python-common 1.0.55__tar.gz → 1.0.56__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 (93) hide show
  1. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/PKG-INFO +2 -1
  2. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/pyproject.toml +2 -0
  3. plexus_python_common-1.0.56/src/plexus/common/resources/tags/unittest.tagset.yaml +97 -0
  4. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/resources/tags/universal.tagset.yaml +521 -43
  5. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/tagutils.py +26 -2
  6. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/PKG-INFO +2 -1
  7. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/SOURCES.txt +1 -0
  8. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/requires.txt +1 -0
  9. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/tagutils_test.py +49 -0
  10. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/.editorconfig +0 -0
  11. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/.github/workflows/pr.yml +0 -0
  12. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/.github/workflows/push.yml +0 -0
  13. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/.gitignore +0 -0
  14. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/MANIFEST.in +0 -0
  15. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/README.md +0 -0
  16. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/VERSION +0 -0
  17. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/jsonutils/dummy.0.jsonl +0 -0
  18. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/jsonutils/dummy.1.jsonl +0 -0
  19. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/jsonutils/dummy.2.jsonl +0 -0
  20. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/0-dummy +0 -0
  21. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/1-dummy +0 -0
  22. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/2-dummy +0 -0
  23. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.0.0.jsonl +0 -0
  24. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.0.0.vol-0.jsonl +0 -0
  25. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.0.jsonl +0 -0
  26. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.1.1.jsonl +0 -0
  27. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.1.1.vol-1.jsonl +0 -0
  28. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.1.jsonl +0 -0
  29. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.2.2.jsonl +0 -0
  30. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.2.2.vol-2.jsonl +0 -0
  31. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.2.jsonl +0 -0
  32. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.csv.part0 +0 -0
  33. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.csv.part1 +0 -0
  34. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.csv.part2 +0 -0
  35. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/pathutils/dummy.txt +0 -0
  36. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.baz/file.bar.baz +0 -0
  37. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.baz/file.foo.bar +0 -0
  38. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.baz/file.foo.baz +0 -0
  39. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/dir.foo.bar/dir.foo.bar.baz/file.foo.bar.baz +0 -0
  40. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.bar.baz +0 -0
  41. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.foo.bar +0 -0
  42. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.foo.baz +0 -0
  43. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/file.bar +0 -0
  44. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/file.baz +0 -0
  45. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils/dir.foo/file.foo +0 -0
  46. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils_archive/archive.compressed.zip +0 -0
  47. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/resources/unittest/s3utils_archive/archive.uncompressed.zip +0 -0
  48. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/setup.cfg +0 -0
  49. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/setup.py +0 -0
  50. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/__init__.py +0 -0
  51. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/carto/OSMFile.py +0 -0
  52. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/carto/OSMNode.py +0 -0
  53. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/carto/OSMTags.py +0 -0
  54. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/carto/OSMWay.py +0 -0
  55. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/carto/__init__.py +0 -0
  56. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/pose.py +0 -0
  57. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/proj.py +0 -0
  58. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/resources/__init__.py +0 -0
  59. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/resources/tags/__init__.py +0 -0
  60. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/__init__.py +0 -0
  61. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/apiutils.py +0 -0
  62. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/bagutils.py +0 -0
  63. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/config.py +0 -0
  64. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/datautils.py +0 -0
  65. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/dockerutils.py +0 -0
  66. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/jsonutils.py +0 -0
  67. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/ormutils.py +0 -0
  68. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/pathutils.py +0 -0
  69. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/s3utils.py +0 -0
  70. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/sqlutils.py +0 -0
  71. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/strutils.py +0 -0
  72. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus/common/utils/testutils.py +0 -0
  73. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/dependency_links.txt +0 -0
  74. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/not-zip-safe +0 -0
  75. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/src/plexus_python_common.egg-info/top_level.txt +0 -0
  76. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/__init__.py +0 -0
  77. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/__init__.py +0 -0
  78. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/carto/__init__.py +0 -0
  79. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/carto/osm_file_test.py +0 -0
  80. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/carto/osm_tags_test.py +0 -0
  81. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/pose_test.py +0 -0
  82. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/proj_test.py +0 -0
  83. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/__init__.py +0 -0
  84. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/bagutils_test.py +0 -0
  85. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/datautils_test.py +0 -0
  86. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/dockerutils_test.py +0 -0
  87. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/jsonutils_test.py +0 -0
  88. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/ormutils_test.py +0 -0
  89. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/pathutils_test.py +0 -0
  90. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/s3utils_test.py +0 -0
  91. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/strutils_test.py +0 -0
  92. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/plexus_tests/common/utils/testutils_test.py +0 -0
  93. {plexus_python_common-1.0.55 → plexus_python_common-1.0.56}/test/testenv.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plexus-python-common
3
- Version: 1.0.55
3
+ Version: 1.0.56
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.12
6
6
  Classifier: Programming Language :: Python :: 3.13
@@ -12,6 +12,7 @@ Requires-Dist: boto3-stubs[s3]<1.42,>=1.41
12
12
  Requires-Dist: docker>=7.1
13
13
  Requires-Dist: fsspec>=2025.10
14
14
  Requires-Dist: jinja2>=3.0
15
+ Requires-Dist: jsonschema>=4.0
15
16
  Requires-Dist: lxml>=6.0
16
17
  Requires-Dist: markdown-it-py>=4.0
17
18
  Requires-Dist: numpy>=2.3
@@ -14,6 +14,7 @@ dev = [
14
14
  "docker>=7.1",
15
15
  "fsspec>=2025.10",
16
16
  "jinja2>=3.0",
17
+ "jsonschema>=4.0",
17
18
  "lxml>=6.0",
18
19
  "markdown-it-py>=4.0",
19
20
  "numpy>=2.3",
@@ -60,6 +61,7 @@ dependencies = [
60
61
  "docker>=7.1",
61
62
  "fsspec>=2025.10",
62
63
  "jinja2>=3.0",
64
+ "jsonschema>=4.0",
63
65
  "lxml>=6.0",
64
66
  "markdown-it-py>=4.0",
65
67
  "numpy>=2.3",
@@ -0,0 +1,97 @@
1
+ $namespace: "unittest"
2
+ # language=markdown
3
+ $desc: !markdown |
4
+ **Unit Test Tagset**
5
+
6
+ A collection of tags designed for annotating and categorizing data in unit tests. This tagset includes categories
7
+ for camera views, radar views, LiDAR views, environmental conditions, and roadway characteristics. Each tag is
8
+ defined with a description that provides context for its use in unit testing scenarios, helping to ensure that
9
+ test cases are accurately annotated and can be easily understood by developers and testers.
10
+ $def:
11
+ anchored_tags:
12
+ &anchored_tags
13
+ anchored:
14
+ # language=markdown
15
+ $desc: !markdown |
16
+ Anchored tags that describe specific perspectives or viewpoints from which data is captured. These tags are
17
+ typically associated with sensor data and provide critical context for understanding the scene and the
18
+ information being analyzed. For example, camera views may include front center, front left, front right, side
19
+ left, side right, rear left, and rear right perspectives, while radar and LiDAR views may include unified,
20
+ bumper center, bumper left, bumper right, and similar perspectives.
21
+ $schema:
22
+ type: object
23
+ properties:
24
+ dummy_property:
25
+ description: "This is a dummy property that serves as a placeholder for the actual properties that would be defined under the anchored tags."
26
+ type: string
27
+ additionalProperties: true
28
+ another_anchored:
29
+ # language=markdown
30
+ $desc: !markdown |
31
+ Another set of anchored tags that describe specific perspectives or viewpoints from which data is captured.
32
+ These tags may be used in different contexts or for different types of sensors, but they serve a similar
33
+ purpose in providing critical context for understanding the scene and the information being analyzed.
34
+ $tags:
35
+ level_1_tag:
36
+ $desc: "This is a level 1 tag that provides a high-level categorization for the data."
37
+ $schema:
38
+ type: object
39
+ properties:
40
+ dummy_property:
41
+ description: "This is a dummy property that serves as a placeholder for the actual properties that would be defined under this level 1 tag."
42
+ type: string
43
+ additionalProperties: true
44
+ level_2_tag:
45
+ $desc: "This is a level 2 tag that provides a more specific categorization for the data."
46
+ level_3_tag: { $desc: "level 3 tag description", <<: *anchored_tags }
47
+ another_level_3_tag: { $desc: "another level 3 tag description" }
48
+ another_level_2_tag:
49
+ $desc: "This is another level 2 tag that provides a different specific categorization for the data."
50
+ $schema:
51
+ type: object
52
+ properties:
53
+ dummy_property:
54
+ description: "This is a dummy property that serves as a placeholder for the actual properties that would be defined under this level 2 tag."
55
+ type: object
56
+ properties:
57
+ dummy_sub_property:
58
+ description: "This is a dummy sub-property that serves as a placeholder for the actual sub-properties that would be defined under this dummy property."
59
+ type: string
60
+ additionalProperties: false
61
+ required: [ dummy_property ]
62
+ additionalProperties: true
63
+ <<: *anchored_tags
64
+ another_level_1_tag:
65
+ # language=markdown
66
+ $desc: !markdown |
67
+ This is another level 1 tag that provides a different high-level categorization for the data. It may be used
68
+ to group data based on different criteria or characteristics, such as environmental conditions, roadway
69
+ characteristics, or other relevant factors that are important for unit testing scenarios.
70
+ $schema:
71
+ type: object
72
+ properties:
73
+ dummy_elements:
74
+ description: "This is a dummy array property that serves as a placeholder for the actual array properties that would be defined under this level 1 tag."
75
+ type: array
76
+ items:
77
+ type: integer
78
+ minimum: 0
79
+ minItems: 1
80
+ maxItems: 3
81
+ required: [ dummy_elements ]
82
+ additionalProperties: true
83
+ level_2_tag:
84
+ # language=markdown
85
+ $desc: !markdown |
86
+ This is a level 2 tag that provides a more specific categorization for the data under the second level 1 tag.
87
+ It may be used to further refine the categorization based on specific criteria or characteristics relevant to
88
+ the second level 1 tag, such as different types of environmental conditions or roadway characteristics.
89
+ level_3_tag:
90
+ # language=markdown
91
+ $desc: !markdown |
92
+ This is a level 3 tag that provides an even more specific categorization for the data under the level 2 tag
93
+ of the second level 1 tag. It may be used to further refine the categorization based on very specific
94
+ criteria or characteristics relevant to the level 2 tag, such as specific weather conditions, road types,
95
+ or other detailed factors that are important for unit testing scenarios.
96
+ level_4_tag:
97
+ $desc: "This is a level 4 tag that provides an even more specific categorization for the data under the level 3 tag. Actually, you can have as many levels as you want, but for the sake of this example, we will stop at level 4."
@@ -1,6 +1,8 @@
1
1
  $namespace: "universal"
2
2
  # language=markdown
3
3
  $desc: !markdown |
4
+ **Universal Tagset**
5
+
4
6
  Universal tags applicable across various scenarios, environments, and data types. This tagset provides a common
5
7
  vocabulary for describing key attributes of roadway scenes, traffic conditions, environmental factors, and data
6
8
  quality issues relevant to autonomous driving and advanced driver-assistance systems (ADAS). The tags are organized
@@ -10,30 +12,282 @@ $desc: !markdown |
10
12
  $def:
11
13
  camera_views:
12
14
  &camera_views
13
- unified: { $desc: "unified" }
14
- front_center: { $desc: "front center" }
15
- front_left: { $desc: "front left" }
16
- front_right: { $desc: "front right" }
17
- side_left: { $desc: "side left" }
18
- side_right: { $desc: "side right" }
19
- rear_left: { $desc: "rear left" }
20
- rear_right: { $desc: "rear right" }
15
+ unified:
16
+ # language=markdown
17
+ $desc: !markdown |
18
+ **Unified Camera View**
19
+
20
+ A camera view that combines the fields of view from multiple cameras into a single, cohesive perspective. This
21
+ view is often used in perception systems to provide a comprehensive understanding of the environment by
22
+ integrating data from front, side, and rear cameras. The unified camera view can enhance object detection,
23
+ tracking, and scene understanding by providing a more complete visual representation of the surroundings.
24
+
25
+ Examples:
26
+
27
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
28
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
29
+ front_center:
30
+ # language=markdown
31
+ $desc: !markdown |
32
+ **Front Center Camera View**
33
+
34
+ A camera view that captures the area directly in front of the vehicle, typically aligned with the center of the
35
+ front bumper. This view is crucial for detecting and tracking objects such as vehicles, pedestrians, and
36
+ traffic signs in the path of travel. The front center camera provides critical information for lane keeping,
37
+ adaptive cruise control, and collision avoidance systems.
38
+
39
+ Examples:
40
+
41
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
42
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
43
+ front_left:
44
+ # language=markdown
45
+ $desc: !markdown |
46
+ **Front Left Camera View**
47
+
48
+ A camera view that captures the area to the front left of the vehicle, typically covering the left lane and
49
+ adjacent areas. This view is important for monitoring traffic in the left lane, detecting pedestrians or
50
+ cyclists approaching from the left, and providing situational awareness for lane changes and turns.
51
+
52
+ Examples:
53
+
54
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
55
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
56
+ front_right:
57
+ # language=markdown
58
+ $desc: !markdown |
59
+ **Front Right Camera View**
60
+
61
+ A camera view that captures the area to the front right of the vehicle, typically covering the right lane and
62
+ adjacent areas. This view is important for monitoring traffic in the right lane, detecting pedestrians or
63
+ cyclists approaching from the right, and providing situational awareness for lane changes and turns.
64
+
65
+ Examples:
66
+
67
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
68
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
69
+ side_left:
70
+ # language=markdown
71
+ $desc: !markdown |
72
+ **Side Left Camera View**
73
+
74
+ A camera view that captures the area directly to the left of the vehicle, typically covering the left side of
75
+ the roadway and adjacent areas. This view is important for monitoring traffic in the left lane, detecting
76
+ pedestrians or cyclists approaching from the left, and providing situational awareness for lane changes and
77
+ turns.
78
+
79
+ Examples:
80
+
81
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
82
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
83
+ side_right:
84
+ # language=markdown
85
+ $desc: !markdown |
86
+ **Side Right Camera View**
87
+
88
+ A camera view that captures the area directly to the right of the vehicle, typically covering the right side
89
+ of the roadway and adjacent areas. This view is important for monitoring traffic in the right lane, detecting
90
+ pedestrians or cyclists approaching from the right, and providing situational awareness for lane changes and
91
+ turns.
92
+
93
+ Examples:
94
+
95
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
96
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
97
+ rear_left:
98
+ # language=markdown
99
+ $desc: !markdown |
100
+ **Rear Left Camera View**
101
+
102
+ A camera view that captures the area to the rear left of the vehicle, typically covering the left rear lane
103
+ and adjacent areas. This view is important for monitoring traffic behind the vehicle, detecting pedestrians or
104
+ cyclists approaching from the rear left, and providing situational awareness for lane changes and turns.
105
+
106
+ Examples:
107
+
108
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
109
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
110
+ rear_right:
111
+ # language=markdown
112
+ $desc: !markdown |
113
+ **Rear Right Camera View**
114
+
115
+ A camera view that captures the area to the rear right of the vehicle, typically covering the right rear lane
116
+ and adjacent areas. This view is important for monitoring traffic behind the vehicle, detecting pedestrians or
117
+ cyclists approaching from the rear right, and providing situational awareness for lane changes and turns.
118
+
119
+ Examples:
120
+
121
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
122
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
21
123
  radar_views:
22
124
  &radar_views
23
- unified: { $desc: "unified" }
24
- bumper_center: { $desc: "bumper center" }
25
- bumper_left: { $desc: "bumper left" }
26
- bumper_right: { $desc: "bumper right" }
125
+ unified:
126
+ # language=markdown
127
+ $desc: !markdown |
128
+ **Unified Radar View**
129
+
130
+ A radar view that combines the data from multiple radar sensors into a single, cohesive perspective. This view
131
+ is often used in perception systems to provide a comprehensive understanding of the environment by integrating
132
+ data from front, side, and rear radars. The unified radar view can enhance object detection, tracking, and
133
+ scene understanding by providing a more complete representation of the surroundings, especially in adverse
134
+ weather conditions where cameras may be less effective.
135
+
136
+ Examples:
137
+
138
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
139
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
140
+ bumper_center:
141
+ # language=markdown
142
+ $desc: !markdown |
143
+ **Bumper Center Radar View**
144
+
145
+ A radar view that captures the area directly in front of the vehicle, typically aligned with the center of the
146
+ front bumper. This view is crucial for detecting and tracking objects such as vehicles, pedestrians, and
147
+ traffic signs in the path of travel. The bumper center radar provides critical information for adaptive cruise
148
+ control, collision avoidance systems, and low-speed maneuvering.
149
+
150
+ Examples:
151
+
152
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
153
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
154
+ bumper_left:
155
+ # language=markdown
156
+ $desc: !markdown |
157
+ **Bumper Left Radar View**
158
+
159
+ A radar view that captures the area to the front left of the vehicle, typically covering the left lane and
160
+ adjacent areas. This view is important for monitoring traffic in the left lane, detecting pedestrians or
161
+ cyclists approaching from the left, and providing situational awareness for lane changes and turns.
162
+
163
+ Examples:
164
+
165
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
166
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
167
+ bumper_right:
168
+ # language=markdown
169
+ $desc: !markdown |
170
+ **Bumper Right Radar View**
171
+
172
+ A radar view that captures the area to the front right of the vehicle, typically covering the right lane and
173
+ adjacent areas. This view is important for monitoring traffic in the right lane, detecting pedestrians or
174
+ cyclists approaching from the right, and providing situational awareness for lane changes and turns.
175
+
176
+ Examples:
177
+
178
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
179
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
27
180
  lidar_views:
28
181
  &lidar_views
29
- unified: { $desc: "unified" }
30
- front_center: { $desc: "front center" }
31
- front_left: { $desc: "front left" }
32
- front_right: { $desc: "front right" }
33
- side_left: { $desc: "side left" }
34
- side_right: { $desc: "side right" }
35
- rear_left: { $desc: "rear left" }
36
- rear_right: { $desc: "rear right" }
182
+ unified:
183
+ # language=markdown
184
+ $desc: !markdown |
185
+ **Unified LiDAR View**
186
+
187
+ A LiDAR view that combines the point cloud data from multiple LiDAR sensors into a single, cohesive
188
+ perspective. This view is often used in perception systems to provide a comprehensive understanding of the
189
+ environment by integrating data from front, side, and rear LiDAR sensors. The unified LiDAR view can enhance
190
+ object detection, tracking, and scene understanding by providing a more complete representation of the
191
+ surroundings, especially in low-light or adverse weather conditions where cameras may be less effective.
192
+
193
+ Examples:
194
+
195
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
196
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
197
+ front_center:
198
+ # language=markdown
199
+ $desc: !markdown |
200
+ **Front Center LiDAR View**
201
+
202
+ A LiDAR view that captures the area directly in front of the vehicle, typically aligned with the center of the
203
+ front bumper. This view is crucial for detecting and tracking objects such as vehicles, pedestrians, and
204
+ traffic signs in the path of travel. The front center LiDAR provides critical information for lane keeping,
205
+ adaptive cruise control, and collision avoidance systems.
206
+
207
+ Examples:
208
+
209
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
210
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
211
+ front_left:
212
+ # language=markdown
213
+ $desc: !markdown |
214
+ **Front Left LiDAR View**
215
+
216
+ A LiDAR view that captures the area to the front left of the vehicle, typically covering the left lane and
217
+ adjacent areas. This view is important for monitoring traffic in the left lane, detecting pedestrians or
218
+ cyclists approaching from the left, and providing situational awareness for lane changes and turns.
219
+
220
+ Examples:
221
+
222
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
223
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
224
+ front_right:
225
+ # language=markdown
226
+ $desc: !markdown |
227
+ **Front Right LiDAR View**
228
+
229
+ A LiDAR view that captures the area to the front right of the vehicle, typically covering the right lane and
230
+ adjacent areas. This view is important for monitoring traffic in the right lane, detecting pedestrians or
231
+ cyclists approaching from the right, and providing situational awareness for lane changes and turns.
232
+
233
+ Examples:
234
+
235
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
236
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
237
+ side_left:
238
+ # language=markdown
239
+ $desc: !markdown |
240
+ **Side Left LiDAR View**
241
+
242
+ A LiDAR view that captures the area directly to the left of the vehicle, typically covering the left side of
243
+ the roadway and adjacent areas. This view is important for monitoring traffic in the left lane, detecting
244
+ pedestrians or cyclists approaching from the left, and providing situational awareness for lane changes and
245
+ turns.
246
+
247
+ Examples:
248
+
249
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
250
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
251
+ side_right:
252
+ # language=markdown
253
+ $desc: !markdown |
254
+ **Side Right LiDAR View**
255
+
256
+ A LiDAR view that captures the area directly to the right of the vehicle, typically covering the right side of
257
+ the roadway and adjacent areas. This view is important for monitoring traffic in the right lane, detecting
258
+ pedestrians or cyclists approaching from the right, and providing situational awareness for lane changes and
259
+ turns.
260
+
261
+ Examples:
262
+
263
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
264
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
265
+ rear_left:
266
+ # language=markdown
267
+ $desc: !markdown |
268
+ **Rear Left LiDAR View**
269
+
270
+ A LiDAR view that captures the area to the rear left of the vehicle, typically covering the left rear lane
271
+ and adjacent areas. This view is important for monitoring traffic behind the vehicle, detecting pedestrians or
272
+ cyclists approaching from the rear left, and providing situational awareness for lane changes and turns.
273
+
274
+ Examples:
275
+
276
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
277
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
278
+ rear_right:
279
+ # language=markdown
280
+ $desc: !markdown |
281
+ **Rear Right LiDAR View**
282
+
283
+ A LiDAR view that captures the area to the rear right of the vehicle, typically covering the right rear lane
284
+ and adjacent areas. This view is important for monitoring traffic behind the vehicle, detecting pedestrians or
285
+ cyclists approaching from the rear right, and providing situational awareness for lane changes and turns.
286
+
287
+ Examples:
288
+
289
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
290
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
37
291
  $tags:
38
292
  environment:
39
293
  # language=markdown
@@ -479,27 +733,111 @@ $tags:
479
733
  # language=markdown
480
734
  $desc: !markdown |
481
735
  Roadway layout types that describe the overall configuration of the road and its lanes. These tags capture
482
- specific layout types such as single way, undivided two way, divided two way, and unknown. Each layout type has
736
+ specific layout types such as single way, undivided two-way, divided two-way, and unknown. Each layout type has
483
737
  unique implications for traffic flow, driver behavior, and sensor coverage, making them important for scenario
484
738
  analysis and data annotation. For example, a single way layout typically involves one lane of traffic in each
485
- direction with no physical separation, while a divided two way layout includes a physical barrier or median
739
+ direction with no physical separation, while a divided two-way layout includes a physical barrier or median
486
740
  separating opposing traffic flows.
487
- single_way: { $desc: "single way" }
488
- undivided_two_way: { $desc: "undivided two way" }
489
- divided_two_way: { $desc: "divided two way" }
741
+ single_way:
742
+ # language=markdown
743
+ $desc: !markdown |
744
+ **Single Way Layout**
745
+
746
+ A roadway configuration where traffic flows in both directions without any physical separation, such as a
747
+ centerline or median. This layout typically involves one lane of traffic in each direction, and drivers must
748
+ exercise caution when passing or making turns due to the potential for head-on collisions. Sensor coverage
749
+ may be more challenging in single way layouts due to the lack of clear lane boundaries and the presence of
750
+ oncoming traffic.
751
+
752
+ Examples:
753
+
754
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
755
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
756
+ undivided_two_way:
757
+ # language=markdown
758
+ $desc: !markdown |
759
+ **Undivided Two Way Layout**
760
+
761
+ A roadway configuration where traffic flows in both directions with a painted centerline but no physical
762
+ separation, such as a median or barrier. This layout typically involves one lane of traffic in each direction,
763
+ and drivers must exercise caution when passing or making turns due to the potential for head-on collisions.
764
+ Sensor coverage may be more challenging in undivided two-way layouts due to the presence of oncoming traffic
765
+ and the potential for lane departures.
766
+
767
+ Examples:
768
+
769
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
770
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
771
+ divided_two_way:
772
+ # language=markdown
773
+ $desc: !markdown |
774
+ **Divided Two Way Layout**
775
+
776
+ A roadway configuration where traffic flows in both directions with a physical separation, such as a median or
777
+ barrier. This layout typically involves one or more lanes of traffic in each direction, and the physical
778
+ separation helps to reduce the risk of head-on collisions. Sensor coverage may be improved in divided two-way
779
+ layouts due to the presence of clear lane boundaries and reduced interaction with oncoming traffic.
780
+
781
+ Examples:
782
+
783
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
784
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
490
785
  unknown: { $desc: "unknown" }
491
786
  lane_config:
492
787
  # language=markdown
493
788
  $desc: !markdown |
494
789
  Lane configuration types that describe the number and arrangement of lanes on the roadway. These tags capture
495
- specific lane configurations such as single lane, two lane, multi lane, and unknown. Each configuration has
790
+ specific lane configurations such as single lane, two lane, multi-lane, and unknown. Each configuration has
496
791
  unique implications for traffic flow, driver behavior, and sensor coverage, making them important for scenario
497
792
  analysis and data annotation. For example, a single lane configuration typically involves one lane of traffic in
498
- each direction with no passing allowed, while a multi lane configuration includes multiple lanes in each
793
+ each direction with no passing allowed, while a multi-lane configuration includes multiple lanes in each
499
794
  direction with opportunities for passing and lane changes.
500
- single_lane: { $desc: "single lane" }
501
- two_lane: { $desc: "two lane" }
502
- multi_lane: { $desc: "multi lane" }
795
+ single_lane:
796
+ # language=markdown
797
+ $desc: !markdown |
798
+ **Single Lane Configuration**
799
+
800
+ A roadway configuration where there is only one lane of traffic in each direction, with no opportunities for
801
+ passing or lane changes. This configuration typically involves a centerline to separate opposing traffic
802
+ flows,
803
+ and drivers must exercise caution when making turns or navigating around obstacles due to the potential for
804
+ head-on collisions. Sensor coverage may be more challenging in single lane configurations due to the presence
805
+ of oncoming traffic and the potential for lane departures.
806
+
807
+ Examples:
808
+
809
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
810
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
811
+ two_lane:
812
+ # language=markdown
813
+ $desc: !markdown |
814
+ **Two Lane Configuration**
815
+
816
+ A roadway configuration where there are two lanes of traffic in each direction, allowing for passing and lane
817
+ changes. This configuration typically involves a centerline to separate opposing traffic flows, and drivers
818
+ must exercise caution when making turns or navigating around obstacles due to the potential for head-on
819
+ collisions. Sensor coverage may be improved in two lane configurations due to the presence of clear lane
820
+ boundaries and reduced interaction with oncoming traffic.
821
+
822
+ Examples:
823
+
824
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
825
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
826
+ multi_lane:
827
+ # language=markdown
828
+ $desc: !markdown |
829
+ **Multi Lane Configuration**
830
+
831
+ A roadway configuration where there are multiple lanes of traffic in each direction, allowing for passing,
832
+ lane changes, and higher traffic volumes. This configuration typically involves a centerline to separate
833
+ opposing traffic flows, and drivers must exercise caution when making turns or navigating around obstacles due
834
+ to the potential for head-on collisions. Sensor coverage may be improved in multi-lane configurations due to
835
+ the presence of clear lane boundaries and reduced interaction with oncoming traffic.
836
+
837
+ Examples:
838
+
839
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
840
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
503
841
  unknown: { $desc: "unknown" }
504
842
  shoulder:
505
843
  # language=markdown
@@ -531,11 +869,11 @@ $tags:
531
869
  **Median Shoulder**
532
870
 
533
871
  A shoulder area located in the median between opposing traffic flows, often separated by a physical barrier or
534
- marked with a painted buffer. Median shoulders can provide a refuge area for disabled vehicles and may
535
- enhance safety by separating opposing traffic, but they may also have limited width and accessibility. Drivers
536
- may use median shoulders for emergency stops or to avoid obstacles, but they should exercise caution due to
537
- potential traffic from both directions. Sensor coverage in median shoulders may be limited, making them an
538
- important consideration for scenario analysis and data annotation.
872
+ marked with a painted buffer. Median shoulders can provide a refuge area for disabled vehicles and may enhance
873
+ safety by separating opposing traffic, but they may also have limited width and accessibility. Drivers may use
874
+ median shoulders for emergency stops or to avoid obstacles, but they should exercise caution due to potential
875
+ traffic from both directions. Sensor coverage in median shoulders may be limited, making them an important
876
+ consideration for scenario analysis and data annotation.
539
877
 
540
878
  Examples:
541
879
 
@@ -747,9 +1085,52 @@ $tags:
747
1085
  for driving behavior, vehicle dynamics, and sensor performance, making them important for scenario analysis and
748
1086
  data annotation. For example, tunnels can create confined spaces with limited visibility and unique lighting
749
1087
  conditions, while bridges/overpasses may involve elevation changes and exposure to wind.
750
- tunnel: { $desc: "tunnel" }
751
- bridge: { $desc: "bridge/overpass" }
752
- underpass: { $desc: "underpass" }
1088
+ tunnel:
1089
+ # language=markdown
1090
+ $desc: !markdown |
1091
+ **Tunnel**
1092
+
1093
+ A roadway feature that involves a passage through or under a structure, such as a mountain, hill, or urban
1094
+ area. Tunnels can create confined spaces with limited visibility and unique lighting conditions, which can
1095
+ affect driver behavior and sensor performance. Drivers may need to adjust their speed and following distance
1096
+ when entering or exiting tunnels due to changes in visibility and road conditions. Sensor coverage in tunnels
1097
+ may be limited, making them an important consideration for scenario analysis and data annotation.
1098
+
1099
+ Examples:
1100
+
1101
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1102
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1103
+ bridge:
1104
+ # language=markdown
1105
+ $desc: !markdown |
1106
+ **Bridge/Overpass**
1107
+
1108
+ A roadway feature that involves a structure spanning a physical obstacle, such as a river, valley, or another
1109
+ road. Bridges and overpasses may involve elevation changes and exposure to wind, which can affect driver
1110
+ behavior and vehicle dynamics. Drivers may need to adjust their speed and following distance when crossing
1111
+ bridges or overpasses due to changes in road conditions and potential crosswinds. Sensor coverage on bridges
1112
+ and overpasses may be affected by the structure itself, making them an important consideration for scenario
1113
+ analysis and data annotation.
1114
+
1115
+ Examples:
1116
+
1117
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1118
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1119
+ underpass:
1120
+ # language=markdown
1121
+ $desc: !markdown |
1122
+ **Underpass**
1123
+
1124
+ A roadway feature that involves a passage under a structure, such as a bridge, railway, or urban area.
1125
+ Underpasses can create confined spaces with limited visibility and unique lighting conditions, which can
1126
+ affect driver behavior and sensor performance. Drivers may need to adjust their speed and following distance
1127
+ when entering or exiting underpasses due to changes in visibility and road conditions. Sensor coverage in
1128
+ underpasses may be limited, making them an important consideration for scenario analysis and data annotation.
1129
+
1130
+ Examples:
1131
+
1132
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1133
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
753
1134
  unknown: { $desc: "unknown" }
754
1135
  geometry:
755
1136
  # language=markdown
@@ -760,11 +1141,108 @@ $tags:
760
1141
  them important for scenario analysis and data annotation. For example, a straight segment typically allows for
761
1142
  higher speeds and better visibility, while a curved segment may require more cautious driving and can create
762
1143
  blind spots.
763
- curved: { $desc: "curved segment" }
764
- incline: { $desc: "incline segment" }
765
- decline: { $desc: "decline segment" }
766
- hill_crest: { $desc: "hill crest" }
767
- sag: { $desc: "sag segment" }
1144
+ curved:
1145
+ # language=markdown
1146
+ $desc: !markdown |
1147
+ **Curved Segment**
1148
+
1149
+ A roadway segment that features a horizontal curvature, requiring drivers to navigate a bend in the road.
1150
+ Curved segments can vary in radius and degree of curvature, affecting vehicle dynamics and driver behavior.
1151
+ Drivers may need to reduce speed and adjust their steering when navigating curved segments, especially if the
1152
+ curve is sharp or if visibility is limited. Sensor performance may also be affected by curved segments due to
1153
+ changes in the field of view and potential occlusions.
1154
+
1155
+ Examples:
1156
+
1157
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1158
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1159
+ $schema:
1160
+ type: object
1161
+ properties:
1162
+ curvature_radius:
1163
+ type: number
1164
+ description: "The radius of the curve in meters"
1165
+ minimum: 0
1166
+ required: [ curvature_radius ]
1167
+ additionalProperties: true
1168
+ incline:
1169
+ # language=markdown
1170
+ $desc: !markdown |
1171
+ **Incline Segment**
1172
+
1173
+ A roadway segment that features a positive vertical grade, requiring drivers to navigate an uphill slope.
1174
+ Incline segments can vary in steepness and length, affecting vehicle dynamics and driver behavior. Drivers may
1175
+ need to reduce speed and adjust their acceleration when navigating incline segments, especially if the incline
1176
+ is steep or if the vehicle is heavily loaded. Sensor performance may also be affected by incline segments due
1177
+ to changes in the field of view and potential occlusions.
1178
+
1179
+ Examples:
1180
+
1181
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1182
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1183
+ $schema:
1184
+ type: object
1185
+ properties:
1186
+ grade_percentage:
1187
+ type: number
1188
+ description: "The grade of the incline in percentage"
1189
+ minimum: 0
1190
+ required: [ grade_percentage ]
1191
+ additionalProperties: false
1192
+ decline:
1193
+ # language=markdown
1194
+ $desc: !markdown |
1195
+ **Decline Segment**
1196
+
1197
+ A roadway segment that features a negative vertical grade, requiring drivers to navigate a downhill slope.
1198
+ Decline segments can vary in steepness and length, affecting vehicle dynamics and driver behavior. Drivers may
1199
+ need to reduce speed and adjust their braking when navigating decline segments, especially if the decline is
1200
+ steep or if the vehicle is heavily loaded. Sensor performance may also be affected by decline segments due to
1201
+ changes in the field of view and potential occlusions.
1202
+
1203
+ Examples:
1204
+
1205
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1206
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1207
+ $schema:
1208
+ type: object
1209
+ properties:
1210
+ grade_percentage:
1211
+ type: number
1212
+ description: "The grade of the decline in percentage"
1213
+ maximum: 0
1214
+ required: [ grade_percentage ]
1215
+ additionalProperties: false
1216
+ hill_crest:
1217
+ # language=markdown
1218
+ $desc: !markdown |
1219
+ **Hill Crest Segment**
1220
+
1221
+ A roadway segment that features a vertical crest, where the road reaches a high point before descending. Hill
1222
+ crest segments can create blind spots and limited visibility for drivers, affecting driver behavior and sensor
1223
+ performance. Drivers may need to reduce speed and exercise caution when navigating hill crest segments,
1224
+ especially if the crest is sharp or if there are potential obstacles on the other side. Sensor coverage may
1225
+ also be affected by hill crest segments due to changes in the field of view and potential occlusions.
1226
+
1227
+ Examples:
1228
+
1229
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1230
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
1231
+ sag:
1232
+ # language=markdown
1233
+ $desc: !markdown |
1234
+ **Sag Segment**
1235
+
1236
+ A roadway segment that features a vertical sag, where the road dips down before ascending. Sag segments can
1237
+ create blind spots and limited visibility for drivers, affecting driver behavior and sensor performance.
1238
+ Drivers may need to reduce speed and exercise caution when navigating sag segments, especially if the sag is
1239
+ sharp or if there are potential obstacles in the dip. Sensor coverage may also be affected by sag segments due
1240
+ to changes in the field of view and potential occlusions.
1241
+
1242
+ Examples:
1243
+
1244
+ - [Case 1](https://image-search.plexus.ai/particular_case_image)
1245
+ - [Case 2](https://image-search.plexus.ai/particular_case_image)
768
1246
  traffic:
769
1247
  # language=markdown
770
1248
  $desc: !markdown |
@@ -10,6 +10,7 @@ from collections.abc import Generator, Mapping, Sequence
10
10
  from typing import Self
11
11
 
12
12
  import jinja2
13
+ import jsonschema
13
14
  import pydantic as pdt
14
15
  import sqlalchemy as sa
15
16
  import sqlalchemy.dialects.sqlite as sa_sqlite
@@ -60,6 +61,7 @@ class RichDesc(object):
60
61
  class Tag(object):
61
62
  name: str
62
63
  desc: str | RichDesc | None
64
+ schema: JsonObject | None = None
63
65
 
64
66
  @property
65
67
  def tag_parts(self) -> list[str]:
@@ -69,6 +71,17 @@ class Tag(object):
69
71
  def parent_tag_name(self) -> str | None:
70
72
  return head_or_none(self.name.rsplit(":", 1))
71
73
 
74
+ def validate(self, props: JsonType | None, *, raise_on_error: bool = False) -> bool:
75
+ if self.schema is None or props is None:
76
+ return True
77
+ try:
78
+ jsonschema.Draft7Validator(self.schema).validate(props)
79
+ return True
80
+ except (jsonschema.ValidationError, jsonschema.SchemaError):
81
+ if raise_on_error:
82
+ raise
83
+ return False
84
+
72
85
 
73
86
  class Tagset(Sequence[Tag], Mapping[str, Tag]):
74
87
  def __init__(self, namespace: str, desc: str | RichDesc) -> None:
@@ -132,6 +145,10 @@ class Tagset(Sequence[Tag], Mapping[str, Tag]):
132
145
 
133
146
  return list(dicttree_lineage(self.tags_tree, child.tag_parts[:-1]))
134
147
 
148
+ def validate(self, tag_name: str, props: JsonType | None, *, raise_on_error: bool = False) -> bool:
149
+ tag = self.get(tag_name)
150
+ return False if tag is None else tag.validate(props, raise_on_error=raise_on_error)
151
+
135
152
 
136
153
  class MutableTagset(Tagset):
137
154
 
@@ -201,10 +218,17 @@ def populate_tagset(tagset_spec: JsonObject) -> Tagset:
201
218
  if isinstance(desc, dict):
202
219
  desc = RichDesc(**desc)
203
220
 
204
- yield Tag(name=name, desc=desc)
221
+ schema = tag_def.get("$schema")
222
+ if schema is not None:
223
+ try:
224
+ jsonschema.Draft7Validator.check_schema(schema)
225
+ except jsonschema.SchemaError as e:
226
+ raise ValueError(f"invalid JSON schema for tag '{name}'") from e
227
+
228
+ yield Tag(name=name, desc=desc, schema=schema)
205
229
 
206
230
  for child_name, child_tag_def in tag_def.items():
207
- if child_name == "$desc":
231
+ if child_name in ("$desc", "$schema"):
208
232
  continue
209
233
 
210
234
  if not isinstance(child_name, str):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plexus-python-common
3
- Version: 1.0.55
3
+ Version: 1.0.56
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.12
6
6
  Classifier: Programming Language :: Python :: 3.13
@@ -12,6 +12,7 @@ Requires-Dist: boto3-stubs[s3]<1.42,>=1.41
12
12
  Requires-Dist: docker>=7.1
13
13
  Requires-Dist: fsspec>=2025.10
14
14
  Requires-Dist: jinja2>=3.0
15
+ Requires-Dist: jsonschema>=4.0
15
16
  Requires-Dist: lxml>=6.0
16
17
  Requires-Dist: markdown-it-py>=4.0
17
18
  Requires-Dist: numpy>=2.3
@@ -48,6 +48,7 @@ src/plexus/common/carto/OSMWay.py
48
48
  src/plexus/common/carto/__init__.py
49
49
  src/plexus/common/resources/__init__.py
50
50
  src/plexus/common/resources/tags/__init__.py
51
+ src/plexus/common/resources/tags/unittest.tagset.yaml
51
52
  src/plexus/common/resources/tags/universal.tagset.yaml
52
53
  src/plexus/common/utils/__init__.py
53
54
  src/plexus/common/utils/apiutils.py
@@ -4,6 +4,7 @@ boto3-stubs[s3]<1.42,>=1.41
4
4
  docker>=7.1
5
5
  fsspec>=2025.10
6
6
  jinja2>=3.0
7
+ jsonschema>=4.0
7
8
  lxml>=6.0
8
9
  markdown-it-py>=4.0
9
10
  numpy>=2.3
@@ -6,6 +6,7 @@ import unittest
6
6
 
7
7
  import ddt
8
8
  from iker.common.utils.dtutils import dt_parse_iso
9
+ from iker.common.utils.jsonutils import JsonObject
9
10
 
10
11
  from plexus.common.utils.tagutils import MutableTagset, Tag, TagCache, Tagset
11
12
  from plexus.common.utils.tagutils import predefined_tagsets, render_tagset_markdown_readme
@@ -32,6 +33,54 @@ class TagUtilsTest(unittest.TestCase):
32
33
 
33
34
  print(markdown)
34
35
 
36
+ data_tag_validate = [
37
+ ("level_1_tag", {"dummy_property": "dummy_value"}, True,),
38
+
39
+ # extra keys should not cause validation failure, as specified in the schema with
40
+ # "additionalProperties": True
41
+ ("level_1_tag", {"dummy_property": "dummy_value", "extra_key": True}, True,),
42
+
43
+ # missing keys should not cause validation failure, as specified in the schema with "required": []
44
+ ("level_1_tag", {"extra_key": True}, True,),
45
+
46
+ # schema absence should not cause validation failure
47
+ ("level_1_tag:level_2_tag", {"dummy_property": "dummy_value"}, True,),
48
+
49
+ ("level_1_tag:another_level_2_tag", {"dummy_property": {"dummy_sub_property": "dummy_value"}}, True,),
50
+
51
+ # extra keys in nested properties should cause validation failure, as specified in the schema with
52
+ # "additionalProperties": False
53
+ ("level_1_tag:another_level_2_tag",
54
+ {"dummy_property": {"dummy_sub_property": "dummy_value", "extra_key": True}},
55
+ False,),
56
+
57
+ # bad type in nested properties should cause validation failure
58
+ ("level_1_tag:another_level_2_tag",
59
+ {"dummy_property": {"dummy_sub_property": 0}},
60
+ False,),
61
+
62
+ # at least one element should be present in the array, as specified in the schema with "minItems": 1
63
+ ("another_level_1_tag", {"dummy_elements": []}, False,),
64
+
65
+ # at most 3 elements should be present in the array, as specified in the schema with "maxItems": 3
66
+ ("another_level_1_tag", {"dummy_elements": [1, 2, 3, 4, 5]}, False,),
67
+
68
+ # integers in the array should be non-negative, as specified in the schema with "minimum": 0
69
+ ("another_level_1_tag", {"dummy_elements": [-1]}, False,),
70
+ ]
71
+
72
+ @ddt.idata(data_tag_validate)
73
+ @ddt.unpack
74
+ def test_tag_validate(self, tag: str, props: JsonObject, should_pass: bool):
75
+ tagset = predefined_tagsets().get("unittest")
76
+
77
+ if should_pass:
78
+ self.assertTrue(tagset.validate(tag, props))
79
+ else:
80
+ self.assertFalse(tagset.validate(tag, props))
81
+ with self.assertRaises(Exception):
82
+ tagset.validate(tag, props, raise_on_error=True)
83
+
35
84
  def test_tag_cache(self):
36
85
  tagset = MutableTagset(namespace="tagset", desc="A dummy tagset for testing")
37
86
  tagset.add(Tag(name="dummy:foo", desc="A dummy tag for testing"))