pulze-renderflow 2.0.7__tar.gz → 2.0.8__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 (20) hide show
  1. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/PKG-INFO +8 -4
  2. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/README.md +7 -3
  3. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/pyproject.toml +1 -1
  4. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/wire.py +6 -2
  5. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/.gitignore +0 -0
  6. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/CLAUDE.md +0 -0
  7. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/LICENSE +0 -0
  8. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/MANIFEST.in +0 -0
  9. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/__init__.py +0 -0
  10. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/__init__.pyi +0 -0
  11. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/farm.py +0 -0
  12. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/models.py +0 -0
  13. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/models.pyi +0 -0
  14. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/openapi.json +0 -0
  15. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/py.typed +0 -0
  16. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/renderflow/runtime.py +0 -0
  17. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/scripts/build.py +0 -0
  18. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/scripts/generate.py +0 -0
  19. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/test/test_client.py +0 -0
  20. {pulze_renderflow-2.0.7 → pulze_renderflow-2.0.8}/test/test_runtime.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pulze-renderflow
3
- Version: 2.0.7
3
+ Version: 2.0.8
4
4
  Summary: Official RenderFlow API client for Python
5
5
  Project-URL: Homepage, https://pulze.io/products/renderflow
6
6
  Author-email: Pulze <support@pulze.io>
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
 
21
- # renderflow
21
+ # pulze-renderflow
22
22
 
23
23
  Official Python client for the [RenderFlow](https://pulze.io/products/renderflow) API.
24
24
 
@@ -55,7 +55,7 @@ Operations are grouped by tag and named after the API document's `operationId`,
55
55
  reads the same here, in the TypeScript SDK, in `rfcli` and in the MCP tools:
56
56
 
57
57
  ```python
58
- farm.tags() # every group: jobs, nodes, pools, schedule, ...
58
+ farm.tags() # every group: jobs, nodes, pools, schedule, render_licenses, ...
59
59
  dir(farm.jobs) # every operation in one: get_jobs, create_job, stop_job, ...
60
60
  help(farm.jobs.get_jobs) # the operation's own documentation, generated from the document
61
61
  ```
@@ -73,10 +73,14 @@ help(farm.jobs.get_jobs) # the operation's own documentation, generated from
73
73
  A recipe — `type` plus a file and the flat per-DCC fields — is the short way in; the service
74
74
  expands it into the step tree:
75
75
 
76
+ Every recipe requires `type`, `file` and `host` — `host` is which application renders it, and only
77
+ its `id` is mandatory:
78
+
76
79
  ```python
77
80
  job = farm.jobs.create_job(body={
78
81
  "type": "blender.render",
79
82
  "file": "//share/scenes/shot_010.blend",
83
+ "host": {"id": "blender", "version": "4.5"},
80
84
  "frame": "1-100",
81
85
  "pool_id": "...",
82
86
  })
@@ -96,7 +100,7 @@ reads them from `models.pyi` — autocomplete and type checking with nothing to
96
100
  ```python
97
101
  from renderflow.models import MayaRenderRecipe
98
102
 
99
- recipe: MayaRenderRecipe = {"type": "maya.render", "file": "//share/scenes/hero.mb", "host": {"name": "maya"}}
103
+ recipe: MayaRenderRecipe = {"type": "maya.render", "file": "//share/scenes/hero.mb", "host": {"id": "maya", "version": "2026"}}
100
104
  farm.jobs.create_job(body=recipe)
101
105
  ```
102
106
 
@@ -1,4 +1,4 @@
1
- # renderflow
1
+ # pulze-renderflow
2
2
 
3
3
  Official Python client for the [RenderFlow](https://pulze.io/products/renderflow) API.
4
4
 
@@ -35,7 +35,7 @@ Operations are grouped by tag and named after the API document's `operationId`,
35
35
  reads the same here, in the TypeScript SDK, in `rfcli` and in the MCP tools:
36
36
 
37
37
  ```python
38
- farm.tags() # every group: jobs, nodes, pools, schedule, ...
38
+ farm.tags() # every group: jobs, nodes, pools, schedule, render_licenses, ...
39
39
  dir(farm.jobs) # every operation in one: get_jobs, create_job, stop_job, ...
40
40
  help(farm.jobs.get_jobs) # the operation's own documentation, generated from the document
41
41
  ```
@@ -53,10 +53,14 @@ help(farm.jobs.get_jobs) # the operation's own documentation, generated from
53
53
  A recipe — `type` plus a file and the flat per-DCC fields — is the short way in; the service
54
54
  expands it into the step tree:
55
55
 
56
+ Every recipe requires `type`, `file` and `host` — `host` is which application renders it, and only
57
+ its `id` is mandatory:
58
+
56
59
  ```python
57
60
  job = farm.jobs.create_job(body={
58
61
  "type": "blender.render",
59
62
  "file": "//share/scenes/shot_010.blend",
63
+ "host": {"id": "blender", "version": "4.5"},
60
64
  "frame": "1-100",
61
65
  "pool_id": "...",
62
66
  })
@@ -76,7 +80,7 @@ reads them from `models.pyi` — autocomplete and type checking with nothing to
76
80
  ```python
77
81
  from renderflow.models import MayaRenderRecipe
78
82
 
79
- recipe: MayaRenderRecipe = {"type": "maya.render", "file": "//share/scenes/hero.mb", "host": {"name": "maya"}}
83
+ recipe: MayaRenderRecipe = {"type": "maya.render", "file": "//share/scenes/hero.mb", "host": {"id": "maya", "version": "2026"}}
80
84
  farm.jobs.create_job(body=recipe)
81
85
  ```
82
86
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pulze-renderflow"
7
- version = "2.0.7"
7
+ version = "2.0.8"
8
8
  description = "Official RenderFlow API client for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -26,8 +26,12 @@ _index: Optional[Dict[str, Dict[str, "Operation"]]] = None
26
26
 
27
27
 
28
28
  def snake(name: str) -> str:
29
- """`getJobs` → `get_jobs`, `UserGroups` → `user_groups` — the spelling everything else uses."""
30
- return re.sub(r"(?<=[a-z0-9])([A-Z])", r"_\1", name).lower()
29
+ """`getJobs` → `get_jobs`, `UserGroups` → `user_groups` — the spelling everything else uses.
30
+
31
+ Spaces and dashes separate too: a tag is written for humans (`Render licenses`), and whatever
32
+ it says has to come out as something an attribute can be named.
33
+ """
34
+ return re.sub(r"[\s-]+", "_", re.sub(r"(?<=[a-z0-9])([A-Z])", r"_\1", name).strip()).lower()
31
35
 
32
36
 
33
37
  class Operation: