vcti-usd-schema-report 0.1.0__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.
- vcti_usd_schema_report-0.1.0/LICENSE +8 -0
- vcti_usd_schema_report-0.1.0/PKG-INFO +212 -0
- vcti_usd_schema_report-0.1.0/README.md +185 -0
- vcti_usd_schema_report-0.1.0/pyproject.toml +92 -0
- vcti_usd_schema_report-0.1.0/setup.cfg +4 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/__init__.py +110 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/builder.py +585 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/cli.py +49 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/declarations.py +186 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/fixtures.py +80 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/plugin/generatedSchema.usda +65 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/plugin/plugInfo.json +55 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/plugin/schema.usda +45 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/py.typed +0 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/registry.py +95 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/stages/nested_sections.usda +143 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/stages/results_deck.usda +71 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/stages/working_views.usda +36 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/validator.py +249 -0
- vcti_usd_schema_report-0.1.0/src/vcti/usd/schema/report/vocabulary.py +65 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/PKG-INFO +212 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/SOURCES.txt +34 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/dependency_links.txt +1 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/entry_points.txt +5 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/requires.txt +14 -0
- vcti_usd_schema_report-0.1.0/src/vcti_usd_schema_report.egg-info/top_level.txt +1 -0
- vcti_usd_schema_report-0.1.0/tests/test_builder.py +465 -0
- vcti_usd_schema_report-0.1.0/tests/test_cli.py +47 -0
- vcti_usd_schema_report-0.1.0/tests/test_declarations.py +117 -0
- vcti_usd_schema_report-0.1.0/tests/test_docs.py +158 -0
- vcti_usd_schema_report-0.1.0/tests/test_examples.py +268 -0
- vcti_usd_schema_report-0.1.0/tests/test_fixtures.py +98 -0
- vcti_usd_schema_report-0.1.0/tests/test_registry.py +143 -0
- vcti_usd_schema_report-0.1.0/tests/test_validator.py +374 -0
- vcti_usd_schema_report-0.1.0/tests/test_version.py +15 -0
- vcti_usd_schema_report-0.1.0/tests/test_vocabulary.py +44 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Copyright (c) 2018-2026 Visual Collaboration Technologies Inc.
|
|
2
|
+
All Rights Reserved.
|
|
3
|
+
|
|
4
|
+
This software is proprietary and confidential. Unauthorized copying,
|
|
5
|
+
distribution, or use of this software, via any medium, is strictly
|
|
6
|
+
prohibited. Access is granted only to authorized VCollab developers
|
|
7
|
+
and individuals explicitly authorized by Visual Collaboration
|
|
8
|
+
Technologies Inc.
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vcti-usd-schema-report
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Codeless OpenUSD schema for the VCollab report model, the slides of a report and the deck that arranges them: schema source, generated plugin, synthetic fixtures and a validator
|
|
5
|
+
Author: Visual Collaboration Technologies Inc.
|
|
6
|
+
License-Expression: LicenseRef-Proprietary
|
|
7
|
+
Project-URL: Repository, https://github.com/vcollab/vcti-python-usd-schema-report
|
|
8
|
+
Project-URL: Changelog, https://github.com/vcollab/vcti-python-usd-schema-report/blob/main/CHANGELOG.md
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
13
|
+
Requires-Python: <3.15,>=3.12
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: usd-core<27,>=26.11
|
|
17
|
+
Provides-Extra: test
|
|
18
|
+
Requires-Dist: pytest; extra == "test"
|
|
19
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
20
|
+
Provides-Extra: lint
|
|
21
|
+
Requires-Dist: ruff; extra == "lint"
|
|
22
|
+
Provides-Extra: typecheck
|
|
23
|
+
Requires-Dist: mypy; extra == "typecheck"
|
|
24
|
+
Provides-Extra: schema
|
|
25
|
+
Requires-Dist: jinja2; extra == "schema"
|
|
26
|
+
Dynamic: license-file
|
|
27
|
+
|
|
28
|
+
# VCollab USD Report Schema
|
|
29
|
+
|
|
30
|
+
Codeless OpenUSD schema for the VCollab report model, the slides of a report and the deck that arranges them: schema source, generated plugin, synthetic fixtures and a validator
|
|
31
|
+
|
|
32
|
+
## Overview
|
|
33
|
+
|
|
34
|
+
A VCollab report is a set of slides made from one or more models. It is
|
|
35
|
+
defined by its variables and its workflow, which are stored as JSON;
|
|
36
|
+
everything else is produced by running the workflow, and the server holds
|
|
37
|
+
that as a USD stage. This package defines the part of that stage that holds
|
|
38
|
+
the slides and the deck.
|
|
39
|
+
|
|
40
|
+
The stage keeps two things apart. The **list** holds every slide and
|
|
41
|
+
section, flat, each named by a prim path that never changes. The **deck**
|
|
42
|
+
is a tree of nodes under `/Report/deck` that arranges some of them: each
|
|
43
|
+
node places one item, nesting is the hierarchy, and the order of a node's
|
|
44
|
+
children is the order of the deck. Renaming, reordering or moving an item
|
|
45
|
+
touches its name or the nodes, never its path. A slide the deck does not
|
|
46
|
+
reach is a view kept while working.
|
|
47
|
+
|
|
48
|
+
This package ships that schema as a codeless USD plugin, the declarations
|
|
49
|
+
it is generated from, three fixture reports that each exercise one group of
|
|
50
|
+
contracts, authoring helpers that make the changes the viewer protocol's
|
|
51
|
+
deck actions call for, and the validator a server-built stage must pass
|
|
52
|
+
unchanged. It is a sibling of `vcti-usd-schema-delivery`, which describes a
|
|
53
|
+
model. The schema is a candidate, and a slide's content, the capture of the
|
|
54
|
+
screen, is not designed yet: a slide today is a name and the user's
|
|
55
|
+
attributes.
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pip install vcti-usd-schema-report
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### In `requirements.txt`
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
vcti-usd-schema-report>=0.1.0
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### In `pyproject.toml` dependencies
|
|
70
|
+
|
|
71
|
+
```toml
|
|
72
|
+
dependencies = [
|
|
73
|
+
"vcti-usd-schema-report>=0.1.0",
|
|
74
|
+
]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Quick Start
|
|
80
|
+
|
|
81
|
+
### Validate a stage
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from vcti.usd.schema.report import open_fixture, validate
|
|
85
|
+
|
|
86
|
+
stage = open_fixture("results_deck")
|
|
87
|
+
errors = validate(stage)
|
|
88
|
+
print(errors) # [] for a conforming stage
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`open_fixture` and `open_stage` register the plugin first. Any failure is
|
|
92
|
+
one string: the path of the prim it concerns, then a short stable phrase.
|
|
93
|
+
|
|
94
|
+
### Open your own stage with the plugin registered
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
from pxr import Usd
|
|
98
|
+
|
|
99
|
+
from vcti.usd.schema.report import fixture_path, register_plugin
|
|
100
|
+
|
|
101
|
+
register_plugin()
|
|
102
|
+
stage = Usd.Stage.Open(str(fixture_path("nested_sections")))
|
|
103
|
+
report = stage.GetPrimAtPath("/Report")
|
|
104
|
+
print(report.GetTypeName(), report.GetAttribute("vct:schemaVersion").Get())
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Registration is explicit and idempotent, and it also registers every
|
|
108
|
+
installed sibling schema, such as the delivery schema's. USD only knows the
|
|
109
|
+
plugins registered before it first looks up a typed prim, so a process that
|
|
110
|
+
opens stages itself calls `register_plugin()` before the first one.
|
|
111
|
+
|
|
112
|
+
### Build and edit a report
|
|
113
|
+
|
|
114
|
+
The helpers take the prim name of anything they create, because allocating
|
|
115
|
+
it is the server's rule, and return the item's path, its identity from then
|
|
116
|
+
on.
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from vcti.usd.schema.report import (
|
|
120
|
+
DECK_PATH,
|
|
121
|
+
Position,
|
|
122
|
+
add_section,
|
|
123
|
+
add_slide,
|
|
124
|
+
logical_path,
|
|
125
|
+
move_item,
|
|
126
|
+
new_report_stage,
|
|
127
|
+
rename_item,
|
|
128
|
+
validate,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
stage = new_report_stage()
|
|
132
|
+
deck = Position(parent=DECK_PATH)
|
|
133
|
+
overview = add_slide(stage, "s1", "Overview", position=deck)
|
|
134
|
+
results = add_section(stage, "k1", "Results", position=deck)
|
|
135
|
+
stress = add_slide(stage, "s2", "Stress", {"load_case": "LC1"}, Position(parent=results))
|
|
136
|
+
kept = add_slide(stage, "s3", "Before the change") # in the list, not in the deck
|
|
137
|
+
|
|
138
|
+
rename_item(stage, results, "Findings")
|
|
139
|
+
move_item(stage, overview, Position(after=stress))
|
|
140
|
+
|
|
141
|
+
print(stress, logical_path(stage, stress)) # /Report/slides/s2 /Findings/Stress
|
|
142
|
+
print(validate(stage)) # []
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### From the command line
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
vcti-usd-report-validate report.usda other.usda
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
One line per stage, `PASS` or `FAIL`, each failure indented beneath it, and
|
|
152
|
+
a non-zero exit status when any stage fails or cannot be opened.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Key API
|
|
157
|
+
|
|
158
|
+
| Name | What it does |
|
|
159
|
+
|---|---|
|
|
160
|
+
| `register_plugin()` | Register the shipped codeless plugin, and every installed sibling schema's, with this process, once |
|
|
161
|
+
| `open_stage(path)`, `open_fixture(name)` | Open with the plugin registered |
|
|
162
|
+
| `validate(stage)`, `validate_file(path)` | Every contract the schema states, as a list of messages |
|
|
163
|
+
| `new_report_stage(path)` | A stage holding an empty report |
|
|
164
|
+
| `add_slide`, `add_section`, `duplicate_slide`, `duplicate_section` | New items, optionally placed in the deck |
|
|
165
|
+
| `rename_item`, `move_item`, `remove_item`, `set_attributes` | Changes to an item or to where it is |
|
|
166
|
+
| `Position(parent=…)`, `Position(after=…)`, `Position(before=…)` | Where an item goes in the deck |
|
|
167
|
+
| `node_of(stage, item)`, `logical_path(stage, item)` | An item's node, and the path rules look it up by |
|
|
168
|
+
| `fixture_path(name)`, `fixture_paths()`, `FIXTURE_NAMES`, `build_fixtures(dir)` | The three shipped reports, and writing them again |
|
|
169
|
+
| `render_schema()`, `write_schema(path)` | The `schema.usda` text, from the declarations |
|
|
170
|
+
| `SCHEMA_VERSION`, `REPORT_PATH`, `DECK_PATH`, `ITEM_TYPES`, … | The fixed names |
|
|
171
|
+
|
|
172
|
+
The types:
|
|
173
|
+
|
|
174
|
+
| Type | Properties | Purpose |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| `VctReport` | `uniform string vct:schemaVersion` | Anchor for one report, at `/Report` |
|
|
177
|
+
| `VctSlide` | `string vct:name`; `attr:*` | One slide, under `/Report/slides` |
|
|
178
|
+
| `VctSection` | `string vct:name`; `attr:*` | One section, under `/Report/sections` |
|
|
179
|
+
| `VctDeck` | none | The hierarchy's fixed root, `/Report/deck` |
|
|
180
|
+
| `VctDeckNode` | `rel vct:item` | Places one slide or section in the deck |
|
|
181
|
+
|
|
182
|
+
The fixtures, in reading order:
|
|
183
|
+
|
|
184
|
+
| Fixture | Scenario | Contracts it exercises |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| `results_deck` | Three slides, one section | The list beside the hierarchy, a slide outside the deck, a user attribute |
|
|
187
|
+
| `nested_sections` | Sections inside sections | Depth and order, an empty section, a section outside the deck, repeated names, scalar attribute types |
|
|
188
|
+
| `working_views` | Two slides, nothing arranged | An empty deck; the scopes and the deck are always present |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Dependencies
|
|
193
|
+
|
|
194
|
+
- `usd-core` 26.11 or later within the 26 series, the OpenUSD Python
|
|
195
|
+
distribution. The shipped plugin was generated by that version's
|
|
196
|
+
`usdGenSchema`, so a new major is admitted only after regeneration.
|
|
197
|
+
- `jinja2`, in the `schema` extra, only to regenerate the plugin.
|
|
198
|
+
|
|
199
|
+
It does not depend on `vcti-usd-schema-delivery`.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Documentation
|
|
204
|
+
|
|
205
|
+
| If you want to… | Read |
|
|
206
|
+
|---|---|
|
|
207
|
+
| Get started using the package | Quick Start above |
|
|
208
|
+
| Build, edit and read a report, fixture by fixture | [docs/patterns.md](docs/patterns.md) |
|
|
209
|
+
| Understand the list, the deck and the decisions behind them | [docs/design.md](docs/design.md) |
|
|
210
|
+
| Navigate and understand the source | [docs/source-guide.md](docs/source-guide.md) |
|
|
211
|
+
| Add a type, a property, a check, an action or a fixture | [docs/extending.md](docs/extending.md) |
|
|
212
|
+
| See what changed | [CHANGELOG.md](CHANGELOG.md) |
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# VCollab USD Report Schema
|
|
2
|
+
|
|
3
|
+
Codeless OpenUSD schema for the VCollab report model, the slides of a report and the deck that arranges them: schema source, generated plugin, synthetic fixtures and a validator
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
A VCollab report is a set of slides made from one or more models. It is
|
|
8
|
+
defined by its variables and its workflow, which are stored as JSON;
|
|
9
|
+
everything else is produced by running the workflow, and the server holds
|
|
10
|
+
that as a USD stage. This package defines the part of that stage that holds
|
|
11
|
+
the slides and the deck.
|
|
12
|
+
|
|
13
|
+
The stage keeps two things apart. The **list** holds every slide and
|
|
14
|
+
section, flat, each named by a prim path that never changes. The **deck**
|
|
15
|
+
is a tree of nodes under `/Report/deck` that arranges some of them: each
|
|
16
|
+
node places one item, nesting is the hierarchy, and the order of a node's
|
|
17
|
+
children is the order of the deck. Renaming, reordering or moving an item
|
|
18
|
+
touches its name or the nodes, never its path. A slide the deck does not
|
|
19
|
+
reach is a view kept while working.
|
|
20
|
+
|
|
21
|
+
This package ships that schema as a codeless USD plugin, the declarations
|
|
22
|
+
it is generated from, three fixture reports that each exercise one group of
|
|
23
|
+
contracts, authoring helpers that make the changes the viewer protocol's
|
|
24
|
+
deck actions call for, and the validator a server-built stage must pass
|
|
25
|
+
unchanged. It is a sibling of `vcti-usd-schema-delivery`, which describes a
|
|
26
|
+
model. The schema is a candidate, and a slide's content, the capture of the
|
|
27
|
+
screen, is not designed yet: a slide today is a name and the user's
|
|
28
|
+
attributes.
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install vcti-usd-schema-report
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### In `requirements.txt`
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
vcti-usd-schema-report>=0.1.0
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### In `pyproject.toml` dependencies
|
|
43
|
+
|
|
44
|
+
```toml
|
|
45
|
+
dependencies = [
|
|
46
|
+
"vcti-usd-schema-report>=0.1.0",
|
|
47
|
+
]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
### Validate a stage
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from vcti.usd.schema.report import open_fixture, validate
|
|
58
|
+
|
|
59
|
+
stage = open_fixture("results_deck")
|
|
60
|
+
errors = validate(stage)
|
|
61
|
+
print(errors) # [] for a conforming stage
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`open_fixture` and `open_stage` register the plugin first. Any failure is
|
|
65
|
+
one string: the path of the prim it concerns, then a short stable phrase.
|
|
66
|
+
|
|
67
|
+
### Open your own stage with the plugin registered
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from pxr import Usd
|
|
71
|
+
|
|
72
|
+
from vcti.usd.schema.report import fixture_path, register_plugin
|
|
73
|
+
|
|
74
|
+
register_plugin()
|
|
75
|
+
stage = Usd.Stage.Open(str(fixture_path("nested_sections")))
|
|
76
|
+
report = stage.GetPrimAtPath("/Report")
|
|
77
|
+
print(report.GetTypeName(), report.GetAttribute("vct:schemaVersion").Get())
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Registration is explicit and idempotent, and it also registers every
|
|
81
|
+
installed sibling schema, such as the delivery schema's. USD only knows the
|
|
82
|
+
plugins registered before it first looks up a typed prim, so a process that
|
|
83
|
+
opens stages itself calls `register_plugin()` before the first one.
|
|
84
|
+
|
|
85
|
+
### Build and edit a report
|
|
86
|
+
|
|
87
|
+
The helpers take the prim name of anything they create, because allocating
|
|
88
|
+
it is the server's rule, and return the item's path, its identity from then
|
|
89
|
+
on.
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
from vcti.usd.schema.report import (
|
|
93
|
+
DECK_PATH,
|
|
94
|
+
Position,
|
|
95
|
+
add_section,
|
|
96
|
+
add_slide,
|
|
97
|
+
logical_path,
|
|
98
|
+
move_item,
|
|
99
|
+
new_report_stage,
|
|
100
|
+
rename_item,
|
|
101
|
+
validate,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
stage = new_report_stage()
|
|
105
|
+
deck = Position(parent=DECK_PATH)
|
|
106
|
+
overview = add_slide(stage, "s1", "Overview", position=deck)
|
|
107
|
+
results = add_section(stage, "k1", "Results", position=deck)
|
|
108
|
+
stress = add_slide(stage, "s2", "Stress", {"load_case": "LC1"}, Position(parent=results))
|
|
109
|
+
kept = add_slide(stage, "s3", "Before the change") # in the list, not in the deck
|
|
110
|
+
|
|
111
|
+
rename_item(stage, results, "Findings")
|
|
112
|
+
move_item(stage, overview, Position(after=stress))
|
|
113
|
+
|
|
114
|
+
print(stress, logical_path(stage, stress)) # /Report/slides/s2 /Findings/Stress
|
|
115
|
+
print(validate(stage)) # []
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### From the command line
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
vcti-usd-report-validate report.usda other.usda
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
One line per stage, `PASS` or `FAIL`, each failure indented beneath it, and
|
|
125
|
+
a non-zero exit status when any stage fails or cannot be opened.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Key API
|
|
130
|
+
|
|
131
|
+
| Name | What it does |
|
|
132
|
+
|---|---|
|
|
133
|
+
| `register_plugin()` | Register the shipped codeless plugin, and every installed sibling schema's, with this process, once |
|
|
134
|
+
| `open_stage(path)`, `open_fixture(name)` | Open with the plugin registered |
|
|
135
|
+
| `validate(stage)`, `validate_file(path)` | Every contract the schema states, as a list of messages |
|
|
136
|
+
| `new_report_stage(path)` | A stage holding an empty report |
|
|
137
|
+
| `add_slide`, `add_section`, `duplicate_slide`, `duplicate_section` | New items, optionally placed in the deck |
|
|
138
|
+
| `rename_item`, `move_item`, `remove_item`, `set_attributes` | Changes to an item or to where it is |
|
|
139
|
+
| `Position(parent=…)`, `Position(after=…)`, `Position(before=…)` | Where an item goes in the deck |
|
|
140
|
+
| `node_of(stage, item)`, `logical_path(stage, item)` | An item's node, and the path rules look it up by |
|
|
141
|
+
| `fixture_path(name)`, `fixture_paths()`, `FIXTURE_NAMES`, `build_fixtures(dir)` | The three shipped reports, and writing them again |
|
|
142
|
+
| `render_schema()`, `write_schema(path)` | The `schema.usda` text, from the declarations |
|
|
143
|
+
| `SCHEMA_VERSION`, `REPORT_PATH`, `DECK_PATH`, `ITEM_TYPES`, … | The fixed names |
|
|
144
|
+
|
|
145
|
+
The types:
|
|
146
|
+
|
|
147
|
+
| Type | Properties | Purpose |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| `VctReport` | `uniform string vct:schemaVersion` | Anchor for one report, at `/Report` |
|
|
150
|
+
| `VctSlide` | `string vct:name`; `attr:*` | One slide, under `/Report/slides` |
|
|
151
|
+
| `VctSection` | `string vct:name`; `attr:*` | One section, under `/Report/sections` |
|
|
152
|
+
| `VctDeck` | none | The hierarchy's fixed root, `/Report/deck` |
|
|
153
|
+
| `VctDeckNode` | `rel vct:item` | Places one slide or section in the deck |
|
|
154
|
+
|
|
155
|
+
The fixtures, in reading order:
|
|
156
|
+
|
|
157
|
+
| Fixture | Scenario | Contracts it exercises |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| `results_deck` | Three slides, one section | The list beside the hierarchy, a slide outside the deck, a user attribute |
|
|
160
|
+
| `nested_sections` | Sections inside sections | Depth and order, an empty section, a section outside the deck, repeated names, scalar attribute types |
|
|
161
|
+
| `working_views` | Two slides, nothing arranged | An empty deck; the scopes and the deck are always present |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Dependencies
|
|
166
|
+
|
|
167
|
+
- `usd-core` 26.11 or later within the 26 series, the OpenUSD Python
|
|
168
|
+
distribution. The shipped plugin was generated by that version's
|
|
169
|
+
`usdGenSchema`, so a new major is admitted only after regeneration.
|
|
170
|
+
- `jinja2`, in the `schema` extra, only to regenerate the plugin.
|
|
171
|
+
|
|
172
|
+
It does not depend on `vcti-usd-schema-delivery`.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Documentation
|
|
177
|
+
|
|
178
|
+
| If you want to… | Read |
|
|
179
|
+
|---|---|
|
|
180
|
+
| Get started using the package | Quick Start above |
|
|
181
|
+
| Build, edit and read a report, fixture by fixture | [docs/patterns.md](docs/patterns.md) |
|
|
182
|
+
| Understand the list, the deck and the decisions behind them | [docs/design.md](docs/design.md) |
|
|
183
|
+
| Navigate and understand the source | [docs/source-guide.md](docs/source-guide.md) |
|
|
184
|
+
| Add a type, a property, a check, an action or a fixture | [docs/extending.md](docs/extending.md) |
|
|
185
|
+
| See what changed | [CHANGELOG.md](CHANGELOG.md) |
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "vcti-usd-schema-report"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Codeless OpenUSD schema for the VCollab report model, the slides of a report and the deck that arranges them: schema source, generated plugin, synthetic fixtures and a validator"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [
|
|
11
|
+
{name = "Visual Collaboration Technologies Inc."}
|
|
12
|
+
]
|
|
13
|
+
license = "LicenseRef-Proprietary"
|
|
14
|
+
license-files = ["LICENSE"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Programming Language :: Python :: 3.14",
|
|
20
|
+
]
|
|
21
|
+
requires-python = ">=3.12,<3.15"
|
|
22
|
+
dependencies = [
|
|
23
|
+
# The shipped plugin was generated by usdGenSchema 26.11; a new major is
|
|
24
|
+
# admitted only after the plugin is regenerated and checked against it.
|
|
25
|
+
"usd-core>=26.11,<27",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Repository = "https://github.com/vcollab/vcti-python-usd-schema-report"
|
|
30
|
+
Changelog = "https://github.com/vcollab/vcti-python-usd-schema-report/blob/main/CHANGELOG.md"
|
|
31
|
+
|
|
32
|
+
[project.scripts]
|
|
33
|
+
vcti-usd-report-validate = "vcti.usd.schema.report.cli:main"
|
|
34
|
+
|
|
35
|
+
# Every schema package of the family names its plugin directory here, and
|
|
36
|
+
# each one's register_plugin() registers them all; see registry.py.
|
|
37
|
+
[project.entry-points."vcti.usd.schema"]
|
|
38
|
+
report = "vcti.usd.schema.report.registry:PLUGIN_DIR"
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.packages.find]
|
|
41
|
+
where = ["src"]
|
|
42
|
+
include = ["vcti.usd.schema.report", "vcti.usd.schema.report.*"]
|
|
43
|
+
|
|
44
|
+
[tool.setuptools.package-data]
|
|
45
|
+
"vcti.usd.schema.report" = [
|
|
46
|
+
"py.typed",
|
|
47
|
+
"plugin/*.json",
|
|
48
|
+
"plugin/*.usda",
|
|
49
|
+
"stages/*.usda",
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
[project.optional-dependencies]
|
|
53
|
+
test = ["pytest", "pytest-cov"]
|
|
54
|
+
lint = ["ruff"]
|
|
55
|
+
typecheck = ["mypy"]
|
|
56
|
+
# usdGenSchema, which regenerates the plugin, renders its output with jinja2.
|
|
57
|
+
schema = ["jinja2"]
|
|
58
|
+
|
|
59
|
+
[tool.pytest.ini_options]
|
|
60
|
+
addopts = "--cov=vcti.usd.schema.report --cov-report=term-missing --cov-fail-under=95"
|
|
61
|
+
|
|
62
|
+
[tool.mypy]
|
|
63
|
+
python_version = "3.12"
|
|
64
|
+
strict = true
|
|
65
|
+
files = ["src"]
|
|
66
|
+
namespace_packages = true
|
|
67
|
+
explicit_package_bases = true
|
|
68
|
+
mypy_path = ["src"]
|
|
69
|
+
|
|
70
|
+
[tool.coverage.run]
|
|
71
|
+
branch = true
|
|
72
|
+
|
|
73
|
+
[tool.coverage.report]
|
|
74
|
+
exclude_also = [
|
|
75
|
+
"raise NotImplementedError",
|
|
76
|
+
"if TYPE_CHECKING:",
|
|
77
|
+
"if __name__ == .__main__.:",
|
|
78
|
+
"@(abc\\.)?abstractmethod",
|
|
79
|
+
"^\\s*\\.\\.\\.\\s*$",
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
[tool.ruff]
|
|
83
|
+
target-version = "py312"
|
|
84
|
+
line-length = 99
|
|
85
|
+
|
|
86
|
+
[tool.ruff.lint]
|
|
87
|
+
select = ["E", "F", "W", "I", "UP"]
|
|
88
|
+
|
|
89
|
+
# usd-core ships no type information, so its modules are untyped here.
|
|
90
|
+
[[tool.mypy.overrides]]
|
|
91
|
+
module = ["pxr.*"]
|
|
92
|
+
ignore_missing_imports = true
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Copyright Visual Collaboration Technologies Inc. All Rights Reserved.
|
|
2
|
+
# See LICENSE for details.
|
|
3
|
+
"""vcti.usd.schema.report: the OpenUSD schema for the VCollab report model.
|
|
4
|
+
|
|
5
|
+
A report's slides and its deck, as the stage the VCollab server holds once it
|
|
6
|
+
has run the report's workflow. The stage keeps two things apart: the list,
|
|
7
|
+
every slide and section, flat and named by prim path; and the deck, a tree of
|
|
8
|
+
nodes that arranges some of them in order. This package ships that schema as
|
|
9
|
+
a codeless USD plugin, the declarations it is generated from, three fixture
|
|
10
|
+
reports that exercise its contracts, the authoring helpers that make the
|
|
11
|
+
changes the protocol's deck actions call for, and the validator a
|
|
12
|
+
server-built stage must pass.
|
|
13
|
+
|
|
14
|
+
Typical use::
|
|
15
|
+
|
|
16
|
+
from vcti.usd.schema.report import open_fixture, validate
|
|
17
|
+
|
|
18
|
+
stage = open_fixture("results_deck")
|
|
19
|
+
assert validate(stage) == []
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from importlib.metadata import version
|
|
23
|
+
|
|
24
|
+
from .builder import (
|
|
25
|
+
Position,
|
|
26
|
+
add_section,
|
|
27
|
+
add_slide,
|
|
28
|
+
build_fixtures,
|
|
29
|
+
duplicate_section,
|
|
30
|
+
duplicate_slide,
|
|
31
|
+
finish,
|
|
32
|
+
item_path,
|
|
33
|
+
logical_path,
|
|
34
|
+
move_item,
|
|
35
|
+
new_report_stage,
|
|
36
|
+
node_of,
|
|
37
|
+
remove_item,
|
|
38
|
+
rename_item,
|
|
39
|
+
set_attributes,
|
|
40
|
+
)
|
|
41
|
+
from .declarations import normalize_plugin_info, render_schema, write_schema
|
|
42
|
+
from .fixtures import (
|
|
43
|
+
FIXTURE_NAMES,
|
|
44
|
+
STAGES_DIR,
|
|
45
|
+
fixture_path,
|
|
46
|
+
fixture_paths,
|
|
47
|
+
open_fixture,
|
|
48
|
+
open_stage,
|
|
49
|
+
)
|
|
50
|
+
from .registry import ENTRY_POINT_GROUP, PLUGIN_DIR, is_registered, plugin_dirs, register_plugin
|
|
51
|
+
from .validator import validate, validate_file
|
|
52
|
+
from .vocabulary import (
|
|
53
|
+
ATTRIBUTE_NAMESPACE,
|
|
54
|
+
DECK_NAME,
|
|
55
|
+
DECK_PATH,
|
|
56
|
+
ITEM_SCOPES,
|
|
57
|
+
ITEM_TYPES,
|
|
58
|
+
LIBRARY_NAME,
|
|
59
|
+
REPORT_PATH,
|
|
60
|
+
SCHEMA_VERSION,
|
|
61
|
+
SECTIONS_SCOPE,
|
|
62
|
+
SLIDES_SCOPE,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
__version__ = version("vcti-usd-schema-report")
|
|
66
|
+
|
|
67
|
+
__all__ = [
|
|
68
|
+
"ATTRIBUTE_NAMESPACE",
|
|
69
|
+
"DECK_NAME",
|
|
70
|
+
"DECK_PATH",
|
|
71
|
+
"ENTRY_POINT_GROUP",
|
|
72
|
+
"FIXTURE_NAMES",
|
|
73
|
+
"ITEM_SCOPES",
|
|
74
|
+
"ITEM_TYPES",
|
|
75
|
+
"LIBRARY_NAME",
|
|
76
|
+
"PLUGIN_DIR",
|
|
77
|
+
"REPORT_PATH",
|
|
78
|
+
"SCHEMA_VERSION",
|
|
79
|
+
"SECTIONS_SCOPE",
|
|
80
|
+
"SLIDES_SCOPE",
|
|
81
|
+
"STAGES_DIR",
|
|
82
|
+
"Position",
|
|
83
|
+
"__version__",
|
|
84
|
+
"add_section",
|
|
85
|
+
"add_slide",
|
|
86
|
+
"build_fixtures",
|
|
87
|
+
"duplicate_section",
|
|
88
|
+
"duplicate_slide",
|
|
89
|
+
"finish",
|
|
90
|
+
"fixture_path",
|
|
91
|
+
"fixture_paths",
|
|
92
|
+
"is_registered",
|
|
93
|
+
"item_path",
|
|
94
|
+
"logical_path",
|
|
95
|
+
"move_item",
|
|
96
|
+
"new_report_stage",
|
|
97
|
+
"node_of",
|
|
98
|
+
"normalize_plugin_info",
|
|
99
|
+
"open_fixture",
|
|
100
|
+
"open_stage",
|
|
101
|
+
"plugin_dirs",
|
|
102
|
+
"register_plugin",
|
|
103
|
+
"remove_item",
|
|
104
|
+
"rename_item",
|
|
105
|
+
"render_schema",
|
|
106
|
+
"set_attributes",
|
|
107
|
+
"validate",
|
|
108
|
+
"validate_file",
|
|
109
|
+
"write_schema",
|
|
110
|
+
]
|