geniespec 0.1.2.dev6__tar.gz → 0.1.2.dev7__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.
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/PKG-INFO +7 -1
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/README.md +6 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/pyproject.toml +1 -1
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/pyproject.toml.orig +1 -1
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/api_schema.yaml +6 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/genie.py +4 -2
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/types.py +5 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/__init__.py +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/cli.py +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/languages.py +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/renderable_types.py +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/__init__.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/__init__.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/api.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/endpoints.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/exceptions.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/internal.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/resources.py.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/client.ts.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/endpoints.ts.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/index.ts.j2 +0 -0
- {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/resources.ts.j2 +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: geniespec
|
|
3
|
-
Version: 0.1.2.
|
|
3
|
+
Version: 0.1.2.dev7
|
|
4
4
|
Summary: Generate API code from an api.yaml spec
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Requires-Dist: jinja2>=3.1.6
|
|
@@ -117,6 +117,12 @@ resources:
|
|
|
117
117
|
|
|
118
118
|
`python-server` passes the transition fields to kiba-core's `route`, whose `OpenApiSchemaGenerator` documents every route with an `operationId` (and skips the rest); `extensions` reach `OpenApiExtension`s as `metadata['extensions']`. Field descriptions become pydantic `Field(description=...)`, so they show up in the request and response schemas. Each `operationId` must be unique, so a transition that generates more than one route (for example `GET` on a resource with unique attributes) can't set one. `typescript-client` ignores these fields.
|
|
119
119
|
|
|
120
|
+
## Overrides
|
|
121
|
+
|
|
122
|
+
`overrides` keep an API that existed before genie working the same way once it moves to genie. They are meant to be dropped in the next major version of that API.
|
|
123
|
+
|
|
124
|
+
- `shouldPrefixParentName: false` on a child resource names it without its parent's name: `Agent` under `User` stays `Agent` (not `UserAgent`), so its primary attribute is `agent-id` rather than `user-agent-id` and its fields keep their names. Its path is unchanged (`/users/{userId}/agents/{agentId}`).
|
|
125
|
+
|
|
120
126
|
# Development
|
|
121
127
|
|
|
122
128
|
```
|
|
@@ -103,6 +103,12 @@ resources:
|
|
|
103
103
|
|
|
104
104
|
`python-server` passes the transition fields to kiba-core's `route`, whose `OpenApiSchemaGenerator` documents every route with an `operationId` (and skips the rest); `extensions` reach `OpenApiExtension`s as `metadata['extensions']`. Field descriptions become pydantic `Field(description=...)`, so they show up in the request and response schemas. Each `operationId` must be unique, so a transition that generates more than one route (for example `GET` on a resource with unique attributes) can't set one. `typescript-client` ignores these fields.
|
|
105
105
|
|
|
106
|
+
## Overrides
|
|
107
|
+
|
|
108
|
+
`overrides` keep an API that existed before genie working the same way once it moves to genie. They are meant to be dropped in the next major version of that API.
|
|
109
|
+
|
|
110
|
+
- `shouldPrefixParentName: false` on a child resource names it without its parent's name: `Agent` under `User` stays `Agent` (not `UserAgent`), so its primary attribute is `agent-id` rather than `user-agent-id` and its fields keep their names. Its path is unchanged (`/users/{userId}/agents/{agentId}`).
|
|
111
|
+
|
|
106
112
|
# Development
|
|
107
113
|
|
|
108
114
|
```
|
|
@@ -208,6 +208,12 @@ definitions:
|
|
|
208
208
|
type: array
|
|
209
209
|
items:
|
|
210
210
|
type: string
|
|
211
|
+
overrides:
|
|
212
|
+
type: object
|
|
213
|
+
additionalProperties: false
|
|
214
|
+
properties:
|
|
215
|
+
shouldPrefixParentName:
|
|
216
|
+
type: boolean
|
|
211
217
|
BaseTransition:
|
|
212
218
|
type: object
|
|
213
219
|
additionalProperties: false
|
|
@@ -266,7 +266,7 @@ class Renderer:
|
|
|
266
266
|
|
|
267
267
|
@staticmethod
|
|
268
268
|
def _resource_full_name(resource: Resource, name: str) -> str:
|
|
269
|
-
return f'{resource.parentResource or ""}{name}'
|
|
269
|
+
return f'{resource.parentResource or ""}{name}' if resource.overrides.shouldPrefixParentName else name
|
|
270
270
|
|
|
271
271
|
def _resource_to_renderable_resource(self, resource: Resource, knownTypeNames: dict[str, str]) -> RenderableResource:
|
|
272
272
|
attributes = [self._attribute_to_renderable_attribute(attribute=attribute, knownTypeNames=knownTypeNames) for attribute in resource.attributes]
|
|
@@ -298,7 +298,9 @@ class Renderer:
|
|
|
298
298
|
|
|
299
299
|
@staticmethod
|
|
300
300
|
def _relative_name(name: RenderableString, anchor: RenderableResource | None) -> RenderableString:
|
|
301
|
-
|
|
301
|
+
if anchor is None or name.string[: len(anchor.singleName.string)] != anchor.singleName.string:
|
|
302
|
+
return name
|
|
303
|
+
return RenderableString(string=name.string[len(anchor.singleName.string) :])
|
|
302
304
|
|
|
303
305
|
def _resource_component(self, resource: RenderableResource, attribute: RenderableAttribute | None, anchor: RenderableResource | None) -> ResourceEndpointComponent:
|
|
304
306
|
return ResourceEndpointComponent(
|
|
@@ -140,6 +140,10 @@ class RootTransition(BaseTransition):
|
|
|
140
140
|
pass
|
|
141
141
|
|
|
142
142
|
|
|
143
|
+
class ResourceOverrides(BaseModel):
|
|
144
|
+
shouldPrefixParentName: bool = True
|
|
145
|
+
|
|
146
|
+
|
|
143
147
|
class Resource(BaseModel):
|
|
144
148
|
singleName: str
|
|
145
149
|
collectionName: str
|
|
@@ -147,6 +151,7 @@ class Resource(BaseModel):
|
|
|
147
151
|
attributes: list[Attribute] = []
|
|
148
152
|
transitions: list[Transition] = []
|
|
149
153
|
accessibleFrom: list[str] = []
|
|
154
|
+
overrides: ResourceOverrides = ResourceOverrides()
|
|
150
155
|
|
|
151
156
|
@property
|
|
152
157
|
def primaryAttribute(self) -> Attribute | None: # noqa: N802
|
|
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
|