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.
Files changed (22) hide show
  1. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/PKG-INFO +7 -1
  2. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/README.md +6 -0
  3. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/pyproject.toml +1 -1
  4. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/pyproject.toml.orig +1 -1
  5. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/api_schema.yaml +6 -0
  6. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/genie.py +4 -2
  7. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/types.py +5 -0
  8. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/__init__.py +0 -0
  9. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/cli.py +0 -0
  10. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/languages.py +0 -0
  11. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/renderable_types.py +0 -0
  12. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/__init__.py.j2 +0 -0
  13. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/__init__.py.j2 +0 -0
  14. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/api.py.j2 +0 -0
  15. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/endpoints.py.j2 +0 -0
  16. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/exceptions.py.j2 +0 -0
  17. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/internal.py.j2 +0 -0
  18. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/python-server/{service}/v{version}/resources.py.j2 +0 -0
  19. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/client.ts.j2 +0 -0
  20. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/endpoints.ts.j2 +0 -0
  21. {geniespec-0.1.2.dev6 → geniespec-0.1.2.dev7}/src/geniespec/templates/typescript-client/{service}/v{version}/index.ts.j2 +0 -0
  22. {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.dev6
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
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "geniespec"
3
- version = "0.1.2.dev6"
3
+ version = "0.1.2.dev7"
4
4
  description = "Generate API code from an api.yaml spec"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "geniespec"
3
- version = "0.1.2.dev6"
3
+ version = "0.1.2.dev7"
4
4
  description = "Generate API code from an api.yaml spec"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -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
- return RenderableString(string=name.string[len(anchor.singleName.string) :]) if anchor is not None else name
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