infrahub-server 1.4.0rc0__py3-none-any.whl → 1.4.1__py3-none-any.whl

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.
@@ -22,8 +22,6 @@ if TYPE_CHECKING:
22
22
  from neo4j.graph import Relationship as Neo4jRelationship
23
23
  from whenever import TimeDelta
24
24
 
25
- from infrahub.graphql.initialization import GraphqlContext
26
-
27
25
 
28
26
  @dataclass
29
27
  class TimeRange:
@@ -314,12 +312,6 @@ class EnrichedDiffRelationship(BaseSummary):
314
312
  )
315
313
 
316
314
 
317
- @dataclass
318
- class ParentNodeInfo:
319
- node: EnrichedDiffNode
320
- relationship_name: str = "undefined"
321
-
322
-
323
315
  @dataclass
324
316
  class EnrichedDiffNode(BaseSummary):
325
317
  identifier: NodeIdentifier
@@ -364,37 +356,6 @@ class EnrichedDiffNode(BaseSummary):
364
356
  rel.clear_conflicts()
365
357
  self.conflict = None
366
358
 
367
- def get_parent_info(self, graphql_context: GraphqlContext | None = None) -> ParentNodeInfo | None:
368
- for r in self.relationships:
369
- for n in r.nodes:
370
- relationship_name: str = "undefined"
371
-
372
- if not graphql_context:
373
- return ParentNodeInfo(node=n, relationship_name=relationship_name)
374
-
375
- node_schema = graphql_context.db.schema.get(name=self.kind)
376
- rel_schema = node_schema.get_relationship(name=r.name)
377
-
378
- parent_schema = graphql_context.db.schema.get(name=n.kind)
379
- rels_parent = parent_schema.get_relationships_by_identifier(id=rel_schema.get_identifier())
380
-
381
- if rels_parent and len(rels_parent) == 1:
382
- relationship_name = rels_parent[0].name
383
- elif rels_parent and len(rels_parent) > 1:
384
- for rel_parent in rels_parent:
385
- if (
386
- rel_schema.direction == RelationshipDirection.INBOUND
387
- and rel_parent.direction == RelationshipDirection.OUTBOUND
388
- ) or (
389
- rel_schema.direction == RelationshipDirection.OUTBOUND
390
- and rel_parent.direction == RelationshipDirection.INBOUND
391
- ):
392
- relationship_name = rel_parent.name
393
- break
394
-
395
- return ParentNodeInfo(node=n, relationship_name=relationship_name)
396
- return None
397
-
398
359
  def get_all_child_nodes(self) -> set[EnrichedDiffNode]:
399
360
  all_children = set()
400
361
  for r in self.relationships:
@@ -63,11 +63,6 @@ class NodeSchema(GeneratedNodeSchema):
63
63
  f"{self.kind}.{attribute.name} inherited from {interface.namespace}{interface.name} must be the same kind "
64
64
  f'["{interface_attr.kind}", "{attribute.kind}"]'
65
65
  )
66
- if attribute.optional != interface_attr.optional:
67
- raise ValueError(
68
- f"{self.kind}.{attribute.name} inherited from {interface.namespace}{interface.name} must have the same value for property "
69
- f'"optional" ["{interface_attr.optional}", "{attribute.optional}"]'
70
- )
71
66
 
72
67
  for relationship in self.relationships:
73
68
  if relationship.name in interface.relationship_names and not relationship.inherited:
@@ -226,8 +226,8 @@ class SchemaBranch:
226
226
  def update(self, schema: SchemaBranch) -> None:
227
227
  """Update another SchemaBranch into this one."""
228
228
 
229
- local_kinds = list(self.nodes.keys()) + list(self.generics.keys())
230
- other_kinds = list(schema.nodes.keys()) + list(schema.generics.keys())
229
+ local_kinds = self.all_names
230
+ other_kinds = schema.all_names
231
231
 
232
232
  in_both, _, other_only = compare_lists(list1=local_kinds, list2=other_kinds)
233
233
 
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any
3
+ from typing import TYPE_CHECKING, Any, cast
4
4
 
5
5
  from infrahub.core.constants import NULL_VALUE, PathType
6
6
  from infrahub.core.path import DataPath, GroupedDataPaths
7
+ from infrahub.core.schema.generic_schema import GenericSchema
7
8
 
8
9
  from ..interface import ConstraintCheckerInterface
9
10
  from ..shared import AttributeSchemaValidatorQuery
@@ -18,6 +19,14 @@ if TYPE_CHECKING:
18
19
  class AttributeChoicesUpdateValidatorQuery(AttributeSchemaValidatorQuery):
19
20
  name: str = "attribute_constraints_choices_validator"
20
21
 
22
+ def __init__(
23
+ self,
24
+ excluded_kinds: list[str] | None = None,
25
+ **kwargs: Any,
26
+ ) -> None:
27
+ self.excluded_kinds: list[str] = excluded_kinds or []
28
+ super().__init__(**kwargs)
29
+
21
30
  async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
22
31
  if self.attribute_schema.choices is None:
23
32
  return
@@ -28,9 +37,11 @@ class AttributeChoicesUpdateValidatorQuery(AttributeSchemaValidatorQuery):
28
37
  self.params["attr_name"] = self.attribute_schema.name
29
38
  self.params["allowed_values"] = [choice.name for choice in self.attribute_schema.choices]
30
39
  self.params["null_value"] = NULL_VALUE
40
+ self.params["excluded_kinds"] = self.excluded_kinds
31
41
 
32
42
  query = """
33
- MATCH p = (n:%(node_kind)s)
43
+ MATCH (n:%(node_kind)s)
44
+ WHERE size($excluded_kinds) = 0 OR NOT n.kind IN $excluded_kinds
34
45
  CALL (n) {
35
46
  MATCH path = (root:Root)<-[rr:IS_PART_OF]-(n)-[ra:HAS_ATTRIBUTE]-(:Attribute { name: $attr_name } )-[rv:HAS_VALUE]-(av:AttributeValue)
36
47
  WHERE all(
@@ -92,10 +103,24 @@ class AttributeChoicesChecker(ConstraintCheckerInterface):
92
103
  if attribute_schema.choices is None:
93
104
  return grouped_data_paths_list
94
105
 
106
+ # skip inheriting schemas that override the attribute being checked
107
+ excluded_kinds: list[str] = []
108
+ if request.node_schema.is_generic_schema:
109
+ request.node_schema = cast(GenericSchema, request.node_schema)
110
+ for inheriting_kind in request.node_schema.used_by:
111
+ inheriting_schema = request.schema_branch.get_node(name=inheriting_kind, duplicate=False)
112
+ inheriting_schema_attribute = inheriting_schema.get_attribute(name=request.schema_path.field_name)
113
+ if not inheriting_schema_attribute.inherited:
114
+ excluded_kinds.append(inheriting_kind)
115
+
95
116
  for query_class in self.query_classes:
96
117
  # TODO add exception handling
97
118
  query = await query_class.init(
98
- db=self.db, branch=self.branch, node_schema=request.node_schema, schema_path=request.schema_path
119
+ db=self.db,
120
+ branch=self.branch,
121
+ node_schema=request.node_schema,
122
+ schema_path=request.schema_path,
123
+ excluded_kinds=excluded_kinds,
99
124
  )
100
125
  await query.execute(db=self.db)
101
126
  grouped_data_paths_list.append(await query.get_paths())
infrahub/graphql/app.py CHANGED
@@ -231,6 +231,7 @@ class InfrahubGraphQLApp:
231
231
  operation_name=operation_name,
232
232
  branch=branch,
233
233
  )
234
+ impacted_models = analyzed_query.query_report.impacted_models
234
235
 
235
236
  await self._evaluate_permissions(
236
237
  db=db,
@@ -282,7 +283,7 @@ class InfrahubGraphQLApp:
282
283
  GRAPHQL_QUERY_HEIGHT_METRICS.labels(**labels).observe(await analyzed_query.calculate_height())
283
284
  # GRAPHQL_QUERY_VARS_METRICS.labels(**labels).observe(len(analyzed_query.variables))
284
285
  GRAPHQL_TOP_LEVEL_QUERIES_METRICS.labels(**labels).observe(analyzed_query.nbr_queries)
285
- GRAPHQL_QUERY_OBJECTS_METRICS.labels(**labels).observe(len(analyzed_query.query_report.impacted_models))
286
+ GRAPHQL_QUERY_OBJECTS_METRICS.labels(**labels).observe(len(impacted_models))
286
287
 
287
288
  _, errors = analyzed_query.is_valid
288
289
  if errors:
@@ -1,12 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from dataclasses import dataclass
3
4
  from typing import TYPE_CHECKING, Any
4
5
 
5
6
  from graphene import Argument, Boolean, DateTime, Field, InputObjectType, Int, List, NonNull, ObjectType, String
6
7
  from graphene import Enum as GrapheneEnum
7
8
 
8
9
  from infrahub.core import registry
9
- from infrahub.core.constants import DiffAction, RelationshipCardinality
10
+ from infrahub.core.constants import DiffAction, RelationshipCardinality, RelationshipDirection
10
11
  from infrahub.core.constants.database import DatabaseEdgeType
11
12
  from infrahub.core.diff.model.path import NameTrackingId
12
13
  from infrahub.core.diff.query.filters import EnrichedDiffQueryFilters
@@ -38,6 +39,12 @@ GrapheneDiffActionEnum = GrapheneEnum.from_enum(DiffAction)
38
39
  GrapheneCardinalityEnum = GrapheneEnum.from_enum(RelationshipCardinality)
39
40
 
40
41
 
42
+ @dataclass
43
+ class ParentNodeInfo:
44
+ node: EnrichedDiffNode
45
+ relationship_name: str
46
+
47
+
41
48
  class ConflictDetails(ObjectType):
42
49
  uuid = String(required=True)
43
50
  base_branch_action = Field(GrapheneDiffActionEnum, required=True)
@@ -145,9 +152,16 @@ class DiffTreeSummary(DiffSummaryCounts):
145
152
 
146
153
 
147
154
  class DiffTreeResolver:
155
+ def __init__(self) -> None:
156
+ self.source_branch_name: str | None = None
157
+
158
+ def initialize(self, enriched_diff_root: EnrichedDiffRoot) -> None:
159
+ self.source_branch_name = enriched_diff_root.diff_branch_name
160
+
148
161
  async def to_diff_tree(
149
162
  self, enriched_diff_root: EnrichedDiffRoot, graphql_context: GraphqlContext | None = None
150
163
  ) -> DiffTree:
164
+ self.initialize(enriched_diff_root=enriched_diff_root)
151
165
  all_nodes = list(enriched_diff_root.nodes)
152
166
  tree_nodes = [self.to_diff_node(enriched_node=e_node, graphql_context=graphql_context) for e_node in all_nodes]
153
167
  name = None
@@ -166,6 +180,43 @@ class DiffTreeResolver:
166
180
  num_conflicts=enriched_diff_root.num_conflicts,
167
181
  )
168
182
 
183
+ def _get_parent_info(
184
+ self, diff_node: EnrichedDiffNode, graphql_context: GraphqlContext | None = None
185
+ ) -> ParentNodeInfo | None:
186
+ for r in diff_node.relationships:
187
+ for n in r.nodes:
188
+ relationship_name: str = "undefined"
189
+
190
+ if not graphql_context or not self.source_branch_name:
191
+ return ParentNodeInfo(node=n, relationship_name=relationship_name)
192
+
193
+ node_schema = graphql_context.db.schema.get(
194
+ name=diff_node.kind, branch=self.source_branch_name, duplicate=False
195
+ )
196
+ rel_schema = node_schema.get_relationship(name=r.name)
197
+
198
+ parent_schema = graphql_context.db.schema.get(
199
+ name=n.kind, branch=self.source_branch_name, duplicate=False
200
+ )
201
+ rels_parent = parent_schema.get_relationships_by_identifier(id=rel_schema.get_identifier())
202
+
203
+ if rels_parent and len(rels_parent) == 1:
204
+ relationship_name = rels_parent[0].name
205
+ elif rels_parent and len(rels_parent) > 1:
206
+ for rel_parent in rels_parent:
207
+ if (
208
+ rel_schema.direction == RelationshipDirection.INBOUND
209
+ and rel_parent.direction == RelationshipDirection.OUTBOUND
210
+ ) or (
211
+ rel_schema.direction == RelationshipDirection.OUTBOUND
212
+ and rel_parent.direction == RelationshipDirection.INBOUND
213
+ ):
214
+ relationship_name = rel_parent.name
215
+ break
216
+
217
+ return ParentNodeInfo(node=n, relationship_name=relationship_name)
218
+ return None
219
+
169
220
  def to_diff_node(self, enriched_node: EnrichedDiffNode, graphql_context: GraphqlContext | None = None) -> DiffNode:
170
221
  diff_attributes = [
171
222
  self.to_diff_attribute(enriched_attribute=e_attr, graphql_context=graphql_context)
@@ -181,7 +232,7 @@ class DiffTreeResolver:
181
232
  conflict = self.to_diff_conflict(enriched_conflict=enriched_node.conflict, graphql_context=graphql_context)
182
233
 
183
234
  parent = None
184
- if parent_info := enriched_node.get_parent_info(graphql_context=graphql_context):
235
+ if parent_info := self._get_parent_info(diff_node=enriched_node, graphql_context=graphql_context):
185
236
  parent = DiffNodeParent(
186
237
  uuid=parent_info.node.uuid,
187
238
  kind=parent_info.node.kind,
infrahub_sdk/client.py CHANGED
@@ -790,7 +790,7 @@ class InfrahubClient(BaseClient):
790
790
  async def process_page(page_offset: int, page_number: int) -> tuple[dict, ProcessRelationsNode]:
791
791
  """Process a single page of results."""
792
792
  query_data = await InfrahubNode(client=self, schema=schema, branch=branch).generate_query_data(
793
- offset=offset or page_offset,
793
+ offset=page_offset if offset is None else offset,
794
794
  limit=limit or pagination_size,
795
795
  filters=filters,
796
796
  include=include,
@@ -1954,7 +1954,7 @@ class InfrahubClientSync(BaseClient):
1954
1954
  def process_page(page_offset: int, page_number: int) -> tuple[dict, ProcessRelationsNodeSync]:
1955
1955
  """Process a single page of results."""
1956
1956
  query_data = InfrahubNodeSync(client=self, schema=schema, branch=branch).generate_query_data(
1957
- offset=offset or page_offset,
1957
+ offset=page_offset if offset is None else offset,
1958
1958
  limit=limit or pagination_size,
1959
1959
  filters=filters,
1960
1960
  include=include,
@@ -1,10 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  from pathlib import Path
4
5
  from typing import Optional
5
6
 
6
7
  import typer
7
8
  import yaml
9
+ from copier import run_copy
8
10
  from pydantic import ValidationError
9
11
  from rich.console import Console
10
12
  from rich.table import Table
@@ -165,3 +167,52 @@ async def list(
165
167
  )
166
168
 
167
169
  console.print(table)
170
+
171
+
172
+ @app.command()
173
+ async def init(
174
+ directory: Path = typer.Argument(help="Directory path for the new project."),
175
+ template: str = typer.Option(
176
+ default="https://github.com/opsmill/infrahub-template.git",
177
+ help="Template to use for the new repository. Can be a local path or a git repository URL.",
178
+ ),
179
+ data: Optional[Path] = typer.Option(default=None, help="Path to YAML file containing answers to CLI prompt."),
180
+ vcs_ref: Optional[str] = typer.Option(
181
+ default="HEAD",
182
+ help="VCS reference to use for the template. Defaults to HEAD.",
183
+ ),
184
+ trust: Optional[bool] = typer.Option(
185
+ default=False,
186
+ help="Trust the template repository. If set, the template will be cloned without verification.",
187
+ ),
188
+ _: str = CONFIG_PARAM,
189
+ ) -> None:
190
+ """Initialize a new Infrahub repository."""
191
+
192
+ config_data = None
193
+ if data:
194
+ try:
195
+ with Path.open(data, encoding="utf-8") as file:
196
+ config_data = yaml.safe_load(file)
197
+ typer.echo(f"Loaded config: {config_data}")
198
+ except Exception as exc:
199
+ typer.echo(f"Error loading YAML file: {exc}", err=True)
200
+ raise typer.Exit(code=1)
201
+
202
+ # Allow template to be a local path or a URL
203
+ template_source = template or ""
204
+ if template and Path(template).exists():
205
+ template_source = str(Path(template).resolve())
206
+
207
+ try:
208
+ await asyncio.to_thread(
209
+ run_copy,
210
+ template_source,
211
+ str(directory),
212
+ data=config_data,
213
+ vcs_ref=vcs_ref,
214
+ unsafe=trust,
215
+ )
216
+ except Exception as e:
217
+ typer.echo(f"Error running copier: {e}", err=True)
218
+ raise typer.Exit(code=1)
@@ -36,7 +36,7 @@ def validate_schema_content_and_exit(client: InfrahubClient, schemas: list[Schem
36
36
  has_error: bool = False
37
37
  for schema_file in schemas:
38
38
  try:
39
- client.schema.validate(data=schema_file.content)
39
+ client.schema.validate(data=schema_file.payload)
40
40
  except ValidationError as exc:
41
41
  console.print(f"[red]Schema not valid, found '{len(exc.errors())}' error(s) in {schema_file.location}")
42
42
  has_error = True
@@ -48,7 +48,7 @@ def validate_schema_content_and_exit(client: InfrahubClient, schemas: list[Schem
48
48
  raise typer.Exit(1)
49
49
 
50
50
 
51
- def display_schema_load_errors(response: dict[str, Any], schemas_data: list[dict]) -> None:
51
+ def display_schema_load_errors(response: dict[str, Any], schemas_data: list[SchemaFile]) -> None:
52
52
  console.print("[red]Unable to load the schema:")
53
53
  if "detail" not in response:
54
54
  handle_non_detail_errors(response=response)
@@ -87,7 +87,7 @@ def handle_non_detail_errors(response: dict[str, Any]) -> None:
87
87
  if "error" in response:
88
88
  console.print(f" {response.get('error')}")
89
89
  elif "errors" in response:
90
- for error in response.get("errors"):
90
+ for error in response["errors"]:
91
91
  console.print(f" {error.get('message')}")
92
92
  else:
93
93
  console.print(f" '{response}'")
@@ -97,9 +97,9 @@ def valid_error_path(loc_path: list[Any]) -> bool:
97
97
  return len(loc_path) >= 6 and loc_path[0] == "body" and loc_path[1] == "schemas"
98
98
 
99
99
 
100
- def get_node(schemas_data: list[dict], schema_index: int, node_index: int) -> dict | None:
101
- if schema_index < len(schemas_data) and node_index < len(schemas_data[schema_index].content["nodes"]):
102
- return schemas_data[schema_index].content["nodes"][node_index]
100
+ def get_node(schemas_data: list[SchemaFile], schema_index: int, node_index: int) -> dict | None:
101
+ if schema_index < len(schemas_data) and node_index < len(schemas_data[schema_index].payload["nodes"]):
102
+ return schemas_data[schema_index].payload["nodes"][node_index]
103
103
  return None
104
104
 
105
105
 
@@ -122,7 +122,7 @@ async def load(
122
122
  validate_schema_content_and_exit(client=client, schemas=schemas_data)
123
123
 
124
124
  start_time = time.time()
125
- response = await client.schema.load(schemas=[item.content for item in schemas_data], branch=branch)
125
+ response = await client.schema.load(schemas=[item.payload for item in schemas_data], branch=branch)
126
126
  loading_time = time.time() - start_time
127
127
 
128
128
  if response.errors:
@@ -170,10 +170,10 @@ async def check(
170
170
  client = initialize_client()
171
171
  validate_schema_content_and_exit(client=client, schemas=schemas_data)
172
172
 
173
- success, response = await client.schema.check(schemas=[item.content for item in schemas_data], branch=branch)
173
+ success, response = await client.schema.check(schemas=[item.payload for item in schemas_data], branch=branch)
174
174
 
175
175
  if not success:
176
- display_schema_load_errors(response=response, schemas_data=schemas_data)
176
+ display_schema_load_errors(response=response or {}, schemas_data=schemas_data)
177
177
  else:
178
178
  for schema_file in schemas_data:
179
179
  console.print(f"[green] schema '{schema_file.location}' is Valid!")
infrahub_sdk/node/node.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Iterable
4
- from copy import copy
4
+ from copy import copy, deepcopy
5
5
  from typing import TYPE_CHECKING, Any
6
6
 
7
7
  from ..constants import InfrahubClientMode
@@ -397,7 +397,7 @@ class InfrahubNodeBase:
397
397
  "edges": {"node": {"id": None, "hfid": None, "display_label": None, "__typename": None}},
398
398
  }
399
399
 
400
- data["@filters"] = filters or {}
400
+ data["@filters"] = deepcopy(filters) if filters is not None else {}
401
401
 
402
402
  if order:
403
403
  data["@filters"]["order"] = order
@@ -16,7 +16,7 @@ if TYPE_CHECKING:
16
16
 
17
17
  class InfrahubGraphQLQueryItem(InfrahubItem):
18
18
  def validate_resource_config(self) -> None:
19
- # Resource name does not need to match against infrahub repo config
19
+ # Resource name does not need to match against Infrahub repository configuration
20
20
  return
21
21
 
22
22
  def execute_query(self) -> Any:
@@ -24,7 +24,7 @@ ResourceClass = TypeVar("ResourceClass")
24
24
 
25
25
 
26
26
  class InfrahubRepositoryConfigElement(BaseModel):
27
- """Class to regroup all elements of the infrahub configuration for a repository for typing purpose."""
27
+ """Class to regroup all elements of the Infrahub configuration for a repository for typing purpose."""
28
28
 
29
29
 
30
30
  class InfrahubRepositoryArtifactDefinitionConfig(InfrahubRepositoryConfigElement):
@@ -13,7 +13,7 @@ INFRAHUB_VERSION = os.getenv("INFRAHUB_TESTING_IMAGE_VER")
13
13
 
14
14
  def skip_version(min_infrahub_version: str | None = None, max_infrahub_version: str | None = None) -> bool:
15
15
  """
16
- Check if a test should be skipped depending on infrahub version.
16
+ Check if a test should be skipped depending on Infrahub version.
17
17
  """
18
18
  if INFRAHUB_VERSION is None:
19
19
  return True
infrahub_sdk/utils.py CHANGED
@@ -95,7 +95,7 @@ def decode_json(response: httpx.Response) -> dict:
95
95
  try:
96
96
  return response.json()
97
97
  except json.decoder.JSONDecodeError as exc:
98
- raise JsonDecodeError(content=response.text, url=response.url) from exc
98
+ raise JsonDecodeError(content=response.text, url=str(response.url)) from exc
99
99
 
100
100
 
101
101
  def generate_uuid() -> str:
@@ -232,7 +232,7 @@ def get_branch(branch: str | None = None, directory: str | Path = ".") -> str:
232
232
  if branch:
233
233
  return branch
234
234
 
235
- repo = GitRepoManager(directory)
235
+ repo = GitRepoManager(root_directory=str(directory))
236
236
  return str(repo.active_branch)
237
237
 
238
238
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: infrahub-server
3
- Version: 1.4.0rc0
3
+ Version: 1.4.1
4
4
  Summary: Infrahub is taking a new approach to Infrastructure Management by providing a new generation of datastore to organize and control all the data that defines how an infrastructure should run.
5
5
  License: Apache-2.0
6
6
  Author: OpsMill
@@ -110,7 +110,7 @@ infrahub/core/diff/merger/serializer.py,sha256=N5BJ5I2NkB5RtEMuhDfScM7v19PGCbuXC
110
110
  infrahub/core/diff/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  infrahub/core/diff/model/diff.py,sha256=eS2TjZf9aWTZDvQ479t6C6iXXPtmBqulxA2jWxnEDuU,9501
112
112
  infrahub/core/diff/model/field_specifiers_map.py,sha256=59zsMRuYyb9OJEpH9BZQ9kf2DUiDOM3VtuDGvSK6dJQ,2632
113
- infrahub/core/diff/model/path.py,sha256=xPDyDJni_LMoxcZjsge2XorpGZd1WHZztK0OkFj8e2g,30551
113
+ infrahub/core/diff/model/path.py,sha256=lcKTS7hKvu3Rul0k_vxJTrz7G83HhPPedXlthKkr9ag,28844
114
114
  infrahub/core/diff/models.py,sha256=wmOzW4xQ5YreDCr_i56YMFtxbM4-LRgZort49fGJ0BQ,441
115
115
  infrahub/core/diff/parent_node_adder.py,sha256=AFq2KJHGgUVem4WCg-9Qi9h6TTwt-JID1uGYGBrIZxQ,2840
116
116
  infrahub/core/diff/payload_builder.py,sha256=5R_QuPM5P_uQONmTDbtpIjhshs_OJCcXLnVYjWw-78Q,2094
@@ -300,10 +300,10 @@ infrahub/core/schema/generated/node_schema.py,sha256=PMgbQX1PC5ixQsjOFw_bcEfa4tx
300
300
  infrahub/core/schema/generated/relationship_schema.py,sha256=F198_LNmQRV0xSEBPRA3vBAioEItpYZVNApOmdb8_E4,5851
301
301
  infrahub/core/schema/generic_schema.py,sha256=KSd5fwMDR2hjrsb1vOaK83Lw5jJAob1FLoudgU5_E2Y,1594
302
302
  infrahub/core/schema/manager.py,sha256=RAMox35C36eTELkfukVnQ5L9ob-RIZyDcvrHeVye1Ic,33123
303
- infrahub/core/schema/node_schema.py,sha256=wmEo-yICJlgsKnNC0iSMRYmbMPVa6nrfgEs75sksTvQ,6618
303
+ infrahub/core/schema/node_schema.py,sha256=cWeQ2iu6Z9Ay6l2gYnPRnS0JAqYQccueYhpEcfep9Mo,6252
304
304
  infrahub/core/schema/profile_schema.py,sha256=sV4lp1UyBye12M7BJcA2obb4tx3M9J5P89SLqkmFxJY,1237
305
305
  infrahub/core/schema/relationship_schema.py,sha256=R-1iC1d70bBW0vWhgJhDB0_J3tRpOqcJmmLzh39NuYs,8501
306
- infrahub/core/schema/schema_branch.py,sha256=a9-ZIHvXna1XzGdIaOdXLJy92XlE8kEYiekMAKLMu34,106323
306
+ infrahub/core/schema/schema_branch.py,sha256=sqloV0TzPMoZopSqQpGP1RaZpRQ96N55KJjAvplzeLI,106245
307
307
  infrahub/core/schema/schema_branch_computed.py,sha256=14UUsQJDLMHkYhg7QMqeLiTF3PO8c8rGa90ul3F2ZZo,10629
308
308
  infrahub/core/schema/template_schema.py,sha256=cn7-qFUW_LNRfA5q6e1-PdzGSwubuCkLTL6uad2GhdQ,1229
309
309
  infrahub/core/task/__init__.py,sha256=Ied1NvKGJUDmff27z_-yWW8ArenHxGvSvQTaQyx1iHs,128
@@ -315,7 +315,7 @@ infrahub/core/utils.py,sha256=SzOlfsV5Ebp6VeJXARDIm4C3UUNZsNlXerlQbLMappc,9146
315
315
  infrahub/core/validators/__init__.py,sha256=0287h4i-oCL1seKlcQmZtSdepn-25JBKo5XkRrsiXL8,3189
316
316
  infrahub/core/validators/aggregated_checker.py,sha256=KA23ewrwOz8EsezsvF8cY4U0js_d5YPbeqESjG5sWl0,4719
317
317
  infrahub/core/validators/attribute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
318
- infrahub/core/validators/attribute/choices.py,sha256=a5rMF80FARUvOHjyL9VfpKoQ5oNmQuTr9Kjh6Kr0fMA,4217
318
+ infrahub/core/validators/attribute/choices.py,sha256=YFTt3pM5WzgtXpTLJVniWH-SG2784J07zy4elKNT4r4,5374
319
319
  infrahub/core/validators/attribute/enum.py,sha256=3PzkYUuzbt8NqRH4IP4cMjoDxzUvJzbNYC5ZpW5zKZQ,4161
320
320
  infrahub/core/validators/attribute/kind.py,sha256=uzMo4Qf-AyvSlwgURgALd7QVMEl6237tb148-wgTDjE,4611
321
321
  infrahub/core/validators/attribute/length.py,sha256=H0nP2x2ynzcbMnc6neIje01wXipbt8Wr49iNTqIvWxI,4526
@@ -452,7 +452,7 @@ infrahub/graphql/analyzer.py,sha256=TAWo4AWMr33MFjK3YcYBxXSjdwRHxU2HzpIuY9tTHqU,
452
452
  infrahub/graphql/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
453
453
  infrahub/graphql/api/dependencies.py,sha256=-NMUA_N4tWcVpS6ksCebAyza-JTmHqyYY_QZizgBR1c,1690
454
454
  infrahub/graphql/api/endpoints.py,sha256=wH9eO3CFT-eoSe1Y32BhU9mIf6smEnPeP3tAxZkdt4g,1510
455
- infrahub/graphql/app.py,sha256=zjlsZxkYRqye9yL0c1Y69QcBMr4mwgTu_PdVxyEUlG8,21135
455
+ infrahub/graphql/app.py,sha256=ZoxFravB96Ax3DrQZM0MaK-OsWkFk6Rb-bao7IEE6TI,21177
456
456
  infrahub/graphql/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
457
457
  infrahub/graphql/auth/query_permission_checker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
458
458
  infrahub/graphql/auth/query_permission_checker/anonymous_checker.py,sha256=ibsmGyOelLJbN2Kfkmffv-5D79h7tRc1Fez5tauFY8w,1377
@@ -510,7 +510,7 @@ infrahub/graphql/queries/account.py,sha256=s9re9mSJqfSzQkThdvM9l61sI33EvzXJrihQh
510
510
  infrahub/graphql/queries/branch.py,sha256=-_gRZgEcjj7oWnguPPtELNUCkciPbEpuwST4AknOyws,794
511
511
  infrahub/graphql/queries/convert_object_type_mapping.py,sha256=zLav6Eod0OqLgj4PY7q8fCUE-idYYHFQXf_G-siAgyI,1169
512
512
  infrahub/graphql/queries/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
513
- infrahub/graphql/queries/diff/tree.py,sha256=NfiZH-vv4DPbF1bzetYRIIhXrVlc_9nPWdgdB4yiJoU,23004
513
+ infrahub/graphql/queries/diff/tree.py,sha256=QM4y7uQE-bP48bmfpWBfA22mcWEWTTrwZYCxIhBRz8Y,25256
514
514
  infrahub/graphql/queries/event.py,sha256=m15JAgX5US70bn4INjwJ8UcGJgFCxlGGjHHCPzgorb0,4564
515
515
  infrahub/graphql/queries/internal.py,sha256=pcGLpLrY1fC_HxHNs8NAFjr5FTFzcgRlS1F7b65gqfE,647
516
516
  infrahub/graphql/queries/ipam.py,sha256=dXhzjMBusKDJTJ5gSK_RIVffrH3PVvlpCFdFJhxGFaU,5030
@@ -710,7 +710,7 @@ infrahub_sdk/async_typer.py,sha256=Gj7E8EGdjA-XF404vr9cBt20mmbroQh7N68HXhWYx00,8
710
710
  infrahub_sdk/batch.py,sha256=LRZ_04ic56ll9FBjgXCYrJRDJcwB3wR1yX4grrQutDQ,3795
711
711
  infrahub_sdk/branch.py,sha256=hmtoIekQ1uusoJ6yEKlw6vrFMTAHJrXu-YsqqCQC_kc,12716
712
712
  infrahub_sdk/checks.py,sha256=rFHlEY8XEYcjpLCg6gd9a0R8vPnkxNp0OnXk-odsZKY,5707
713
- infrahub_sdk/client.py,sha256=WhavrpFegrS-b4ghGbO6CBbHLlzHnXGHkrLw9_fMF8I,101571
713
+ infrahub_sdk/client.py,sha256=0llKuTQFKRwtxjsWvavw2brOF5B0gJdxn8iIhxAcQzM,101611
714
714
  infrahub_sdk/config.py,sha256=wnVRkaVO4Nd2IBLRVpLtrC-jjW399mgr1DprohTEzQQ,7936
715
715
  infrahub_sdk/constants.py,sha256=Ca66r09eDzpmMhfFAspKFSehSxOmoflVongP-UuBDc4,138
716
716
  infrahub_sdk/context.py,sha256=QgXZvtUrKolp6ML8TguVK87Wuu-3KyizZVV_N2F4oCw,400
@@ -729,8 +729,8 @@ infrahub_sdk/ctl/menu.py,sha256=A0NHvu48qbo9aWYNc3nGMNMeXr4LnOr_HNKL5arBWNA,2690
729
729
  infrahub_sdk/ctl/object.py,sha256=OEbAx0Yb0zbXxS2ZnXedZRZDHITQd3iAk_cWUlTHLvg,2706
730
730
  infrahub_sdk/ctl/parameters.py,sha256=aU2H41svfG309m2WdH6R9H5xgQ4gevn3ItOu5ltuVas,413
731
731
  infrahub_sdk/ctl/render.py,sha256=zrIz_KXq3QafgNiqqNeYt2JtD2PGOa0D5ujW6NqZdz8,1948
732
- infrahub_sdk/ctl/repository.py,sha256=AcWFxAJ0qbsacXvP3ay5hlH_RwVZUllbHFVrFpqEr8Q,4900
733
- infrahub_sdk/ctl/schema.py,sha256=791JU9ZylqeXQTy7xBMN_4WKnVQgbStvFvEZ8nAkOY8,7056
732
+ infrahub_sdk/ctl/repository.py,sha256=ykvPGT5yuj1iGF_C6hFWS8UIP8p334weYRVBEhFWt_U,6672
733
+ infrahub_sdk/ctl/schema.py,sha256=6MZz36xwrT14eDeDyUG4EGWn-4Rv53DkaBJV1fqscvY,7070
734
734
  infrahub_sdk/ctl/transform.py,sha256=5qRqiKeEefs0rda6RAFAAj1jkCKdbPYE_t8O-n436LQ,414
735
735
  infrahub_sdk/ctl/utils.py,sha256=bvH5JfkLvN_84LeftM-GQU3s3fECbiHCVpBrrpRtJj4,7437
736
736
  infrahub_sdk/ctl/validate.py,sha256=dknc4kMBIdysZNtEBYyvhlFPyUYyLmc2a4OI4cjGj2c,3910
@@ -744,7 +744,7 @@ infrahub_sdk/jinja2.py,sha256=lTfV9E_P5gApaX6RW9M8U8oixQi-0H3U8wcs8fdGVaU,1150
744
744
  infrahub_sdk/node/__init__.py,sha256=clAUZ9lNVPFguelR5Sg9PzklAZruTKEm2xk-BaO68l8,1262
745
745
  infrahub_sdk/node/attribute.py,sha256=oEY1qxip8ETEx9Q33NhSQo013zmzrmpVIFzSkEMUY8M,4547
746
746
  infrahub_sdk/node/constants.py,sha256=TJO4uxvv7sc3FjoLdQdV7Ccymqz8AqxDenARst8awb4,775
747
- infrahub_sdk/node/node.py,sha256=0EuD7N3KyjCK6RkZ48EY0t5LZ68wHrH_wa8PG0tUtZw,73473
747
+ infrahub_sdk/node/node.py,sha256=LPl9w9CySrZSEXuTn6jXuSshQCzAPyehc8Kyzpsq5dE,73518
748
748
  infrahub_sdk/node/parsers.py,sha256=sLDdT6neoYSZIjOCmq8Bgd0LK8FFoasjvJLuSz0whSU,543
749
749
  infrahub_sdk/node/property.py,sha256=8Mjkc8bp3kLlHyllwxDJlpJTuOA1ciMgY8mtH3dFVLM,728
750
750
  infrahub_sdk/node/related_node.py,sha256=fPMnZ83OZnnbimaPC14MdE3lR-kumAA6hbOhRlo1gms,10093
@@ -763,7 +763,7 @@ infrahub_sdk/pytest_plugin/exceptions.py,sha256=ek2WyTBPuZdxhJClOhLo4EcFdvgE4BP0
763
763
  infrahub_sdk/pytest_plugin/items/__init__.py,sha256=Au90dLk6lbSgRAoqrZOdYJ6m0lwFJYHFiAQHrcc6_rI,1026
764
764
  infrahub_sdk/pytest_plugin/items/base.py,sha256=-S7Xp3Zf7oQkw8EuqUI9lWWBzhKTfNdkn0UUjSqX9Zc,3068
765
765
  infrahub_sdk/pytest_plugin/items/check.py,sha256=cEF9jC61EJzlYCf1YUGF241XO7F7zhkHAg2T_EPmIN8,3364
766
- infrahub_sdk/pytest_plugin/items/graphql_query.py,sha256=q6MyqeuwwzHSUyZLGo3wyae8RbVjYSiEN_H6fm4cGT0,2340
766
+ infrahub_sdk/pytest_plugin/items/graphql_query.py,sha256=_OdF5BosbvAuH0b8-CiAFmcYpXGA_Ssnuvb1X6oX9GA,2353
767
767
  infrahub_sdk/pytest_plugin/items/jinja2_transform.py,sha256=N0zzrJ0Dar-ZHF-MQB-rDU8qtoFGfOB2GcnNgl_4I1Q,4694
768
768
  infrahub_sdk/pytest_plugin/items/python_transform.py,sha256=ToIrTiAOYSJLyQh7exPrjnkpSWyx4BHhKhmF4F16M2E,4175
769
769
  infrahub_sdk/pytest_plugin/loader.py,sha256=x9sOKGYQeDewx_y5RlGPF2C-ZV44eolfC0c6BOjDAug,4248
@@ -776,7 +776,7 @@ infrahub_sdk/recorder.py,sha256=_NPtSLX3-Dam6BHt7daLzv-IAVxvU-35GIGu7YtA08Y,2285
776
776
  infrahub_sdk/repository.py,sha256=PbSHHl6ajIeZu1t4pH1j7qzR-DPOkGuzubcNM02NuV0,1011
777
777
  infrahub_sdk/schema/__init__.py,sha256=26pGrfI5fiz5nq9uYxNYuTGWw6zYJCGuWaqJhSPsAiQ,28928
778
778
  infrahub_sdk/schema/main.py,sha256=Cph933k_b20PZEYlLdYcSmXtb4jL5vwxNCO8TTn_7vE,12182
779
- infrahub_sdk/schema/repository.py,sha256=Um7wgmiy_M6tFFk3TprMJBwhcLCyWVOcefT-im40D2w,12279
779
+ infrahub_sdk/schema/repository.py,sha256=oxACAok7fQbwdPhpzZJ8JMwMvHuMG1sNauf5-2cRQCU,12279
780
780
  infrahub_sdk/spec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
781
781
  infrahub_sdk/spec/menu.py,sha256=KG8KpDYqlVWsCQXCUlAX7P7Jbw3bB60hlTMRs0cohOk,1078
782
782
  infrahub_sdk/spec/object.py,sha256=yUgQYfvztpWyn9D8wTQfKmUIxM0jh12dYcy_C5Li9ME,24597
@@ -791,7 +791,7 @@ infrahub_sdk/template/exceptions.py,sha256=mpO09MUZpEhb8OcYGb9MstyAQ16v2f5WA8MzH
791
791
  infrahub_sdk/template/filters.py,sha256=YfNkeJnbBz6Qvi6VmEjctVVifk2cYZPqswrDAEAKhA8,10179
792
792
  infrahub_sdk/template/models.py,sha256=azSXHtKB7qL7m9Z1ckjC99ezwdkxOd-HK_9Cid8SBnM,176
793
793
  infrahub_sdk/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
794
- infrahub_sdk/testing/docker.py,sha256=o9MzPjp0bkS-9sUFX1hFEypnSodxbckqoUgYwYFPjwQ,1808
794
+ infrahub_sdk/testing/docker.py,sha256=G6PvarAOBjVfBp_y8FUGd8g9AQlzCO2pDPBufXfclIM,1808
795
795
  infrahub_sdk/testing/repository.py,sha256=9s4MMaMljbJe97Ua4bJgc64giQ2UMC0bD5qIqYd4YNk,3571
796
796
  infrahub_sdk/testing/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
797
797
  infrahub_sdk/testing/schemas/animal.py,sha256=a1vydXPttoPvsGbSHY5H89AEoi7AWE2JiCGRBE9LJS8,7403
@@ -810,7 +810,7 @@ infrahub_sdk/transfer/importer/json.py,sha256=-Tlmg22TiBrEqXOSLMnUzlCFOZ2M0Q8lWy
810
810
  infrahub_sdk/transfer/schema_sorter.py,sha256=ZoBjJGFT-6jQoKOLaoOPMAWzs7vGOeo7x6zOOP4LNv0,1244
811
811
  infrahub_sdk/transforms.py,sha256=RLiB_CkM-JQSfyifChxxQVl2FrHKOGEf_YynSMKeFZU,2340
812
812
  infrahub_sdk/types.py,sha256=UeZ1rDp4eyH12ApTcUD9a1OOtCp3IL1YZUeeZ06qF-I,1726
813
- infrahub_sdk/utils.py,sha256=zNoBV8nND10j_OQLmt_Sdz_8_vMgw9qQfpsjdm8O-0s,11881
813
+ infrahub_sdk/utils.py,sha256=263i-xkGkPMpSH8n6G6IF8Yt54pHSoTjo5ef30MSWOw,11906
814
814
  infrahub_sdk/uuidt.py,sha256=Tz-4nHkJwbi39UT3gaIe2wJeZNAoBqf6tm3sw7LZbXc,2155
815
815
  infrahub_sdk/yaml.py,sha256=PRsS7BEM-Xn5wRLAAG-YLTGRBEJy5Dnyim2YskFfe8I,5539
816
816
  infrahub_testcontainers/__init__.py,sha256=oPpmesGgYBSdKTg1L37FGwYBeao1EHury5SJGul-CT8,216
@@ -826,8 +826,8 @@ infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe
826
826
  infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
827
827
  infrahub_testcontainers/plugin.py,sha256=I3RuZQ0dARyKHuqCf0y1Yj731P2Mwf3BJUehRJKeWrs,5645
828
828
  infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
829
- infrahub_server-1.4.0rc0.dist-info/LICENSE.txt,sha256=7GQO7kxVoQYnZtFrjZBKLRXbrGwwwimHPPOJtqXsozQ,11340
830
- infrahub_server-1.4.0rc0.dist-info/METADATA,sha256=FObBxNeM6mm8rDQkHv4TvizDyTknKt1Yux2_3LnCksU,8274
831
- infrahub_server-1.4.0rc0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
832
- infrahub_server-1.4.0rc0.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
833
- infrahub_server-1.4.0rc0.dist-info/RECORD,,
829
+ infrahub_server-1.4.1.dist-info/LICENSE.txt,sha256=7GQO7kxVoQYnZtFrjZBKLRXbrGwwwimHPPOJtqXsozQ,11340
830
+ infrahub_server-1.4.1.dist-info/METADATA,sha256=HyDVqhcrCXqCmaJn77mWKJ_40SZ0G_Hmpk5MMvxo08g,8271
831
+ infrahub_server-1.4.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
832
+ infrahub_server-1.4.1.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
833
+ infrahub_server-1.4.1.dist-info/RECORD,,