|
2 | 2 |
|
3 | 3 | from datetime import datetime |
4 | 4 | from pathlib import Path |
5 | | -from typing import Any |
| 5 | +from typing import TYPE_CHECKING, Any |
6 | 6 |
|
7 | 7 | from pydantic import BaseModel, Field |
8 | 8 |
|
9 | 9 | from .components import MetablockComponent, MetablockEntity |
10 | 10 |
|
| 11 | +if TYPE_CHECKING: |
| 12 | + from .client import Metablock |
| 13 | + |
11 | 14 |
|
12 | 15 | # Space |
13 | 16 | class Space(MetablockEntity): |
@@ -87,7 +90,7 @@ class Block(MetablockEntity): |
87 | 90 | default_factory=list, |
88 | 91 | description="An optional set of strings", |
89 | 92 | ) |
90 | | - # space: Space = Field(description="The space of the block") |
| 93 | + space: Space = Field(description="The space of the block") |
91 | 94 |
|
92 | 95 | @property |
93 | 96 | def deployments(self) -> Deployments: |
@@ -131,47 +134,39 @@ class Blocks(MetablockComponent): |
131 | 134 | async def get(self, block_id: str) -> Block: |
132 | 135 | """Get a block by id""" |
133 | 136 | data = await self.cli.get(f"{self.url}/{block_id}") |
134 | | - return Block( |
135 | | - root=self, |
136 | | - root_path=data["id"], |
137 | | - is_root=data.pop("root", False), |
138 | | - **data, |
139 | | - ) |
| 137 | + return block_from_data(self.cli, data) |
140 | 138 |
|
141 | 139 | async def update(self, block_id: str, **kwargs: Any) -> Block: |
142 | 140 | """Update a block by id""" |
143 | 141 | data = await self.cli.patch(f"{self.url}/{block_id}", json=kwargs) |
144 | | - return Block( |
145 | | - root=self, |
146 | | - root_path=data["id"], |
147 | | - is_root=data.pop("root", False), |
148 | | - **data, |
149 | | - ) |
| 142 | + return block_from_data(self.cli, data) |
150 | 143 |
|
151 | 144 |
|
152 | 145 | class SpaceBlocks(Blocks): |
153 | 146 | async def get_list(self) -> list[Block]: |
154 | 147 | """Get a list of blocks in the space""" |
155 | 148 | data = await self.cli.get(self.url) |
156 | | - return [ |
157 | | - Block( |
158 | | - root=self.cli.blocks, |
159 | | - root_path=s["id"], |
160 | | - is_root=s.pop("root", False), |
161 | | - **s, |
162 | | - ) |
163 | | - for s in data |
164 | | - ] |
| 149 | + return [block_from_data(self.cli, d) for d in data] |
165 | 150 |
|
166 | 151 | async def create(self, name: str, **kwargs: Any) -> Block: |
167 | 152 | """Create a new block in the space""" |
168 | 153 | data = await self.cli.post(self.url, json=dict(name=name, **kwargs)) |
169 | | - return Block( |
170 | | - root=self.cli.cli, |
171 | | - root_path=data["id"], |
172 | | - is_root=data.pop("root", False), |
173 | | - **data, |
174 | | - ) |
| 154 | + return block_from_data(self.cli, data) |
| 155 | + |
| 156 | + |
| 157 | +def block_from_data(cli: Metablock, data: dict) -> Block: |
| 158 | + data = data.copy() |
| 159 | + data["space"] = Space( |
| 160 | + root=cli.spaces, |
| 161 | + root_path=data["space"]["id"], |
| 162 | + **data["space"], |
| 163 | + ) |
| 164 | + return Block( |
| 165 | + root=cli.blocks, |
| 166 | + root_path=data["id"], |
| 167 | + is_root=data.pop("root", False), |
| 168 | + **data, |
| 169 | + ) |
175 | 170 |
|
176 | 171 |
|
177 | 172 | # SpaceExtension |
|
0 commit comments