atlas-init 0.8.1__py3-none-any.whl → 0.10.0__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.
@@ -0,0 +1,269 @@
1
+ from datetime import datetime
2
+ from enum import StrEnum
3
+ import fnmatch
4
+ import logging
5
+ from collections import defaultdict
6
+ from pathlib import Path
7
+ from typing import Any, Literal, Self
8
+
9
+ import typer
10
+ import humanize
11
+ from ask_shell import run_and_wait, run_pool
12
+ from model_lib import Entity, dump, parse_model
13
+ from pydantic import ConfigDict, Field
14
+ from zero_3rdparty.file_utils import ensure_parents_write_text, iter_paths_and_relative
15
+ import stringcase
16
+
17
+ from atlas_init.cli_tf.hcl.modifier2 import TFVar
18
+ from atlas_init.settings.env_vars import init_settings
19
+ from atlas_init.settings.env_vars_generated import AtlasSettingsWithProject, AWSSettings
20
+ from atlas_init.tf_ext.paths import find_variables_typed
21
+ from atlas_init.tf_ext.settings import TfExtSettings, init_tf_ext_settings
22
+ from atlas_init.tf_ext.tf_mod_gen import validate_tf_workspace
23
+
24
+ logger = logging.getLogger(__name__)
25
+ LOCKFILE_NAME = ".terraform.tfstate.lock.info"
26
+ PascalAlias = ConfigDict(alias_generator=stringcase.pascalcase, populate_by_name=True)
27
+
28
+
29
+ class Lockfile(Entity):
30
+ model_config = PascalAlias
31
+ created: datetime
32
+ path: str
33
+ operation: str
34
+
35
+ def __str__(self) -> str:
36
+ return (
37
+ f"lockfile for state {self.path} created={humanize.naturaltime(self.created)}, operation={self.operation})"
38
+ )
39
+
40
+
41
+ class ResolvedEnvVar(Entity):
42
+ var_matches: list[str] = Field(default_factory=list)
43
+ name: str
44
+ value: str
45
+ sensitive: bool = False
46
+ type: Literal["env"] = "env"
47
+
48
+ def can_resolve(self, variable: TFVar) -> bool:
49
+ return any(fnmatch.fnmatch(variable.name, var) for var in self.var_matches)
50
+
51
+
52
+ class ResolvedStringVar(Entity):
53
+ var_matches: list[str] = Field(default_factory=list)
54
+ value: str = ""
55
+ sensitive: bool = False
56
+ type: Literal["string"] = "string"
57
+
58
+ def can_resolve(self, variable: TFVar) -> bool:
59
+ if variable.type and variable.type != self.type:
60
+ return False
61
+ return any(fnmatch.fnmatch(variable.name, var) for var in self.var_matches)
62
+
63
+
64
+ ResolverVar = ResolvedStringVar | ResolvedEnvVar
65
+
66
+
67
+ def as_tfvars_env(resolver_vars: dict[str, ResolverVar]) -> tuple[dict[str, Any], dict[str, Any]]:
68
+ env_vars = {}
69
+ tf_vars = {}
70
+ for var_name, var in resolver_vars.items():
71
+ match var:
72
+ case ResolvedEnvVar(name=name, value=value):
73
+ env_vars[name] = value
74
+ case ResolvedStringVar(value=value):
75
+ tf_vars[var_name] = value
76
+ return tf_vars, env_vars
77
+
78
+
79
+ class _MissingResolverVarsError(Exception):
80
+ def __init__(self, missing_vars: list[str], path: Path, rel_path: str):
81
+ self.missing_vars = missing_vars
82
+ self.path = path
83
+ self.rel_path = rel_path
84
+ super().__init__(f"Missing variables: {missing_vars} for path: {path} with rel_path: {rel_path}")
85
+
86
+ def __str__(self) -> str:
87
+ return f"Missing variables: {self.missing_vars} for path: {self.path} with rel_path: {self.rel_path}"
88
+
89
+
90
+ class VariablesPlanResolver(Entity):
91
+ paths: dict[str, list[ResolverVar]]
92
+
93
+ def merge(self, other: Self) -> Self:
94
+ merged = defaultdict(list)
95
+ for path, vars in self.paths.items():
96
+ merged[path].extend(vars)
97
+ for path, vars in other.paths.items():
98
+ merged[path].extend(vars)
99
+ return type(self)(paths=merged)
100
+
101
+ def variable_path_matches(self, path: Path, rel_path: str) -> list[ResolverVar]:
102
+ resolved = []
103
+ for path_pattern, vars in self.paths.items():
104
+ if fnmatch.fnmatch(rel_path, path_pattern):
105
+ resolved.extend(vars)
106
+ return resolved
107
+
108
+ def resolve_vars(self, path: Path, rel_path: str) -> dict[str, ResolverVar]:
109
+ variables = find_variables_typed(path / "variables.tf")
110
+ resolved_vars: dict[str, ResolverVar] = {}
111
+ for var in variables.values():
112
+ for resolver_var in self.variable_path_matches(path, rel_path):
113
+ if resolver_var.can_resolve(var):
114
+ resolved_vars[var.name] = resolver_var
115
+ if missing_vars := set(variables.keys()) - set(resolved_vars.keys()):
116
+ raise _MissingResolverVarsError(sorted(missing_vars), path, rel_path)
117
+ return resolved_vars
118
+
119
+
120
+ def update_dumped_vars(path: Path) -> VariablesPlanResolver:
121
+ assert init_settings(AWSSettings, AtlasSettingsWithProject), "Settings must be initialized"
122
+ project_settings = AtlasSettingsWithProject.from_env()
123
+ dumped_vars = VariablesPlanResolver(
124
+ paths={
125
+ "*": [
126
+ ResolvedStringVar(
127
+ var_matches=["project*"],
128
+ value=project_settings.MONGODB_ATLAS_PROJECT_ID,
129
+ sensitive=False,
130
+ ),
131
+ ResolvedStringVar(
132
+ var_matches=["org*"],
133
+ value=project_settings.MONGODB_ATLAS_ORG_ID,
134
+ sensitive=False,
135
+ ),
136
+ ResolvedEnvVar(
137
+ var_matches=["atlas_private_key"],
138
+ sensitive=True,
139
+ value=project_settings.MONGODB_ATLAS_PRIVATE_KEY,
140
+ name="MONGODB_ATLAS_PRIVATE_KEY",
141
+ ),
142
+ ResolvedEnvVar(
143
+ var_matches=["atlas_public_key"],
144
+ sensitive=True,
145
+ value=project_settings.MONGODB_ATLAS_PUBLIC_KEY,
146
+ name="MONGODB_ATLAS_PUBLIC_KEY",
147
+ ),
148
+ ResolvedEnvVar(
149
+ var_matches=["atlas_base_url"],
150
+ sensitive=False,
151
+ value=project_settings.MONGODB_ATLAS_BASE_URL,
152
+ name="MONGODB_ATLAS_BASE_URL",
153
+ ),
154
+ ]
155
+ }
156
+ )
157
+ yaml = dump(dumped_vars, "yaml")
158
+ ensure_parents_write_text(path, yaml)
159
+ return dumped_vars
160
+
161
+
162
+ _ignored_workspace_dirs = [
163
+ ".terraform",
164
+ ]
165
+
166
+
167
+ class TFWorkspacRunConfig(Entity):
168
+ path: Path
169
+ rel_path: str
170
+ resolved_vars: dict[str, Any]
171
+ resolved_env_vars: dict[str, Any]
172
+
173
+ def tf_data_dir(self, settings: TfExtSettings) -> Path:
174
+ repo_out = settings.repo_out
175
+ assert self.path.is_relative_to(repo_out.base), f"path {self.path} is not relative to {repo_out.base}"
176
+ relative_repo_path = str(self.path.relative_to(repo_out.base))
177
+ return settings.static_root / "tf-ws-check" / relative_repo_path / ".terraform"
178
+
179
+ def tf_vars_path_json(self, settings: TfExtSettings) -> Path:
180
+ return self.tf_data_dir(settings) / "vars.auto.tfvars.json"
181
+
182
+
183
+ class TFWsCommands(StrEnum):
184
+ VALIDATE = "validate"
185
+ PLAN = "plan"
186
+ APPLY = "apply"
187
+ DESTROY = "destroy"
188
+
189
+
190
+ def tf_ws(
191
+ command: TFWsCommands = typer.Argument("plan", help="The command to run in the workspace"),
192
+ root_path: Path = typer.Option(
193
+ ...,
194
+ "-p",
195
+ "--root-path",
196
+ help="Path to the root directory, will recurse and look for **/main.tf",
197
+ default_factory=Path.cwd,
198
+ ),
199
+ ):
200
+ settings = init_tf_ext_settings()
201
+ variable_resolvers = update_dumped_vars(settings.variable_plan_resolvers_dumped_file_path)
202
+ manual_path = settings.variable_plan_resolvers_file_path
203
+ if manual_path.exists():
204
+ manual_resolvers = parse_model(manual_path, t=VariablesPlanResolver)
205
+ variable_resolvers = variable_resolvers.merge(manual_resolvers)
206
+
207
+ def include_path(rel_path: str) -> bool:
208
+ return all(f"/{dir}/" not in rel_path for dir in _ignored_workspace_dirs)
209
+
210
+ paths = sorted(
211
+ (path.parent, rel_path)
212
+ for path, rel_path in iter_paths_and_relative(root_path, "main.tf", only_files=True)
213
+ if include_path(rel_path)
214
+ )
215
+ run_configs = []
216
+ missing_vars_errors = []
217
+ for path, rel_path in paths:
218
+ try:
219
+ resolver_vars = variable_resolvers.resolve_vars(path, rel_path)
220
+ resolved_vars, resolved_env_vars = as_tfvars_env(resolver_vars)
221
+ run_configs.append(
222
+ TFWorkspacRunConfig(
223
+ path=path, rel_path=rel_path, resolved_vars=resolved_vars, resolved_env_vars=resolved_env_vars
224
+ )
225
+ )
226
+ except _MissingResolverVarsError as e:
227
+ missing_vars_errors.append(e)
228
+ continue
229
+ if missing_vars_errors:
230
+ missing_vars_formatted = "\n".join(str(e) for e in missing_vars_errors)
231
+ logger.warning(f"Missing variables:\n{missing_vars_formatted}")
232
+
233
+ run_count = len(run_configs)
234
+ assert run_count > 0, f"No run configs found from {root_path}"
235
+
236
+ def run_cmd(run_config: TFWorkspacRunConfig):
237
+ tf_vars_str = dump(run_config.resolved_vars, "pretty_json")
238
+ tf_vars_path = run_config.tf_vars_path_json(settings)
239
+ ensure_parents_write_text(tf_vars_path, tf_vars_str)
240
+ env_extra = run_config.resolved_env_vars | {"TF_DATA_DIR": str(run_config.tf_data_dir(settings))}
241
+
242
+ lockfile_path = run_config.path / LOCKFILE_NAME
243
+ if lockfile_path.exists():
244
+ lockfile = parse_model(lockfile_path, t=Lockfile, format="json")
245
+ logger.warning(f"Lockfile exists for {run_config.path}, skipping: {lockfile}")
246
+ return
247
+
248
+ validate_tf_workspace(run_config.path, tf_cli_config_file=settings.tf_cli_config_file, env_extra=env_extra)
249
+ if command == TFWsCommands.VALIDATE:
250
+ return
251
+ command_extra = ""
252
+ if command in {TFWsCommands.APPLY, TFWsCommands.DESTROY}:
253
+ command_extra = " -auto-approve"
254
+
255
+ run_and_wait(
256
+ f"terraform {command} -var-file={tf_vars_path}{command_extra}",
257
+ cwd=run_config.path,
258
+ env=env_extra,
259
+ user_input=run_count == 1,
260
+ )
261
+
262
+ with run_pool(f"{command} in TF Workspaces", total=run_count, max_concurrent_submits=9) as pool:
263
+ futures = {pool.submit(run_cmd, run_config): run_config for run_config in run_configs}
264
+ for future, run_config in futures.items():
265
+ try:
266
+ future.result()
267
+ except Exception as e:
268
+ logger.error(f"Error running {command} for {run_config.path}: {e}")
269
+ continue
@@ -1,7 +1,7 @@
1
1
  from ask_shell import configure_logging
2
2
  from typer import Typer
3
3
 
4
- from atlas_init.tf_ext import api_call, settings, tf_desc_gen, tf_mod_gen_provider
4
+ from atlas_init.tf_ext import api_call, settings, tf_desc_gen, tf_example_readme, tf_mod_gen_provider, tf_ws
5
5
 
6
6
 
7
7
  def typer_main():
@@ -20,6 +20,8 @@ def typer_main():
20
20
  app.command(name="api-config")(api_call.api_config)
21
21
  app.command(name="mod-gen-provider")(tf_mod_gen_provider.tf_mod_gen_provider_resource_modules)
22
22
  app.command(name="check-env-vars")(settings.init_tf_ext_settings)
23
+ app.command(name="example-readme")(tf_example_readme.tf_example_readme)
24
+ app.command(name="ws")(tf_ws.tf_ws)
23
25
  configure_logging(app)
24
26
  app()
25
27
 
atlas_init/typer_app.py CHANGED
@@ -58,11 +58,12 @@ app_command = partial(
58
58
 
59
59
 
60
60
  def extra_root_commands():
61
- from atlas_init.cli_root import go_test, trigger, mms_released
61
+ from atlas_init.cli_root import go_test, trigger, mms_released, aws_clean
62
62
 
63
63
  assert trigger
64
64
  assert go_test
65
65
  assert mms_released
66
+ assert aws_clean
66
67
 
67
68
 
68
69
  @app.callback(invoke_without_command=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atlas-init
3
- Version: 0.8.1
3
+ Version: 0.10.0
4
4
  Project-URL: Documentation, https://github.com/EspenAlbert/atlas-init#readme
5
5
  Project-URL: Issues, https://github.com/EspenAlbert/atlas-init/issues
6
6
  Project-URL: Source, https://github.com/EspenAlbert/atlas-init
@@ -20,6 +20,7 @@ Requires-Dist: inflection==0.5.1
20
20
  Requires-Dist: model-lib
21
21
  Requires-Dist: motor==3.7.1
22
22
  Requires-Dist: mypy-boto3-cloudformation==1.37.22
23
+ Requires-Dist: mypy-boto3-iam>=1.40.0
23
24
  Requires-Dist: orjson==3.10.13
24
25
  Requires-Dist: pydantic-settings==2.7.1
25
26
  Requires-Dist: pydot==4.0.1
@@ -1,11 +1,11 @@
1
- atlas_init/__init__.py,sha256=bE8OXKBhQOEYQBlOStpyAixc8Il2l2NRdaFMFXjCLq4,213
1
+ atlas_init/__init__.py,sha256=Q4aM4T7e9LAIWZNe0514lJ1Mi_S3ixIJVWFvbzSGLTg,214
2
2
  atlas_init/__main__.py,sha256=dY1dWWvwxRZMmnOFla6RSfti-hMeLeKdoXP7SVYqMUc,52
3
3
  atlas_init/atlas_init.yaml,sha256=aCCg6PJgLcqh75v3tdEEG4UPrcJlbmbRaLj0c7PCumE,2373
4
4
  atlas_init/cli.py,sha256=0b4_osi67Oj-hZnrtK70IbSKQDREjwUFv1_30_A03Zg,9447
5
5
  atlas_init/cli_args.py,sha256=4lbEz6IVf0kHSULLXQ05SLmB4gvLfminbxFJ3qVTFNU,1202
6
6
  atlas_init/humps.py,sha256=l0ZXXuI34wwd9TskXhCjULfGbUyK-qNmiyC6_2ow6kU,7339
7
7
  atlas_init/terraform.yaml,sha256=qPrnbzBEP-JAQVkYadHsggRnDmshrOJyiv0ckyZCxwY,2734
8
- atlas_init/typer_app.py,sha256=TBOT986r7kmvDYQ7_XS0VQuak0zPjvF3ujykCvNrbgs,3959
8
+ atlas_init/typer_app.py,sha256=rEEDe871M4D1eVciDHMQhv59k8GdvG5-0pBwHH0h9OE,3991
9
9
  atlas_init/cli_cfn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  atlas_init/cli_cfn/app.py,sha256=N0z4LtAyfnKAZHlrWNQ0m5TbmarECrwXBH1qp-0xkrA,6025
11
11
  atlas_init/cli_cfn/aws.py,sha256=KtJWJmYDknPFtd4j6evMFRwmnFGcLYUFHArV6J49TjI,17911
@@ -21,9 +21,10 @@ atlas_init/cli_helper/sdk.py,sha256=exh58-VZwxtosaxM269C62EEy1VnpJPOVziPDPkGsmE,
21
21
  atlas_init/cli_helper/sdk_auto_changes.py,sha256=oWyXw7P0PdO28hclRvza_RcIVXAyzu0lCYTJTNBDMeo,189
22
22
  atlas_init/cli_helper/tf_runner.py,sha256=V8pfxPSDBSeQWkR27kI8JLu-MEadUR9TGnoXBjSP4G4,3610
23
23
  atlas_init/cli_root/__init__.py,sha256=Mf0wqy4kqq8pmbjLa98zOGuUWv0bLk2OYGc1n1_ZmZ4,223
24
+ atlas_init/cli_root/aws_clean.py,sha256=n5bTjEhV5whVVN3W6Lk91Mb5LFwcR0ZBLiJS4V4H-Ak,4061
24
25
  atlas_init/cli_root/go_test.py,sha256=roQIOS-qVfNhJMztR-V3hjtxFMf7-Ioy3e1ffqtTRyo,4601
25
26
  atlas_init/cli_root/mms_released.py,sha256=gaUWzY4gqb1Tuo7u-8HqkOC6pW8QSjcwTz2UJMCV3Cw,1765
26
- atlas_init/cli_root/trigger.py,sha256=5TMc_depk9MOkfEfq3WWWgyCpPmAvoZywmeNnU0QZGg,8520
27
+ atlas_init/cli_root/trigger.py,sha256=vT32qeWq946r8UaU8ZUKtWafpU0kodbUJpQXctFGjjk,8526
27
28
  atlas_init/cli_tf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
29
  atlas_init/cli_tf/app.py,sha256=SDIWy1B8cEIA5ieqL8fEhVHwQdK919MjdCSiWgB1M8M,8522
29
30
  atlas_init/cli_tf/changelog.py,sha256=biWYKf1pZvXZ-jEgcZ5q9sY7nTGrL2PuI0h9mCILf_g,3181
@@ -57,7 +58,7 @@ atlas_init/cli_tf/hcl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
57
58
  atlas_init/cli_tf/hcl/cli.py,sha256=6V1kU_a1c4LA3rS7sWN821gQex00fb70AUyd07xO0es,5760
58
59
  atlas_init/cli_tf/hcl/cluster_mig.py,sha256=kMb_0V_XWr_iQj-mZZ-mmzIvYOLfuC4FYGYYSe9VKkQ,12496
59
60
  atlas_init/cli_tf/hcl/modifier.py,sha256=imcKuQZLkzeD_-_DKAUjwbW_zKbPvAElmVDIjKaQfrI,8199
60
- atlas_init/cli_tf/hcl/modifier2.py,sha256=Ra9Wx6BT0uF43n49MIx1WDTryt8T1vkqEU4Rtzn4Zmc,7815
61
+ atlas_init/cli_tf/hcl/modifier2.py,sha256=jszWiCzwcKJquG8bb9SMqH8TA3Y3jRVRGORHgGW7GkI,9317
61
62
  atlas_init/cli_tf/hcl/parser.py,sha256=wqj0YIn9nyEfjRqZnM7FH4yL43-K9ANvRiy9RCahImc,4833
62
63
  atlas_init/cloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
64
  atlas_init/cloud/aws.py,sha256=AXVobJ724S6OeEs_uXH9dvecc_klnXqejRnI7KaLyzo,4935
@@ -82,7 +83,7 @@ atlas_init/settings/env_vars_modules.py,sha256=fqVndOn8ZesuudijakzPZKsrXnm-iezGH
82
83
  atlas_init/settings/interactive.py,sha256=Xy1Z5WMAOSaJ-vQI_4xjAbSR92rWQgnffwVoDT27L68,340
83
84
  atlas_init/settings/interactive2.py,sha256=Z0-AptV19Eq1GizouOUhD-vA8IWnTejo_urnS7D4gdY,3856
84
85
  atlas_init/settings/path.py,sha256=vFRmoUHQplWuKsICu8uHPNAYhsuJu_xoVhmTnii_p7M,2301
85
- atlas_init/settings/rich_utils.py,sha256=mjYCZ7Sx-OTsjv7AZ4qyjXqvq3TOaczLfDjOQK_dKWk,2012
86
+ atlas_init/settings/rich_utils.py,sha256=MSk-sqj-5B0dMBL4Dvq-B1nursXbxOxKZzqEBRogcQU,2765
86
87
  atlas_init/tf/.terraform.lock.hcl,sha256=8petzLKtZy0Yi-Iy5QmkdkkuwRfHnPJSskQhlHROpyo,6880
87
88
  atlas_init/tf/always.tf,sha256=WbatrKzdmeV_fWNjO8u3dw96o5nvfB1ciZ4H4E7aSvM,1398
88
89
  atlas_init/tf/main.tf,sha256=O-Q72u8iJ9bS8tQPx7VR5dwG925QcyuUCxY92VR7Vng,4623
@@ -124,31 +125,34 @@ atlas_init/tf_ext/__main__.py,sha256=pCZ1j_TIo1lFCBdfrqw-EGta2dEs_oONd_IktW3jlOA
124
125
  atlas_init/tf_ext/api_call.py,sha256=vJmCkP-fMLM4qLcFxzbTZUKSxk5Yx1U3tHQZAKFyJ0I,12868
125
126
  atlas_init/tf_ext/args.py,sha256=m77eU6DPPD4vFpMWPR7UqH65vBp3AGV7fyXDIe-uORE,1031
126
127
  atlas_init/tf_ext/constants.py,sha256=FU8JA-JvbkbtpRykilMCKk7YiREPFpZI0hW_My4kvJE,202
127
- atlas_init/tf_ext/gen_examples.py,sha256=nN-KhPFs3PnW4PWgEop4fXFTQf1jP6A3pGdKFRWBmCA,4803
128
- atlas_init/tf_ext/gen_module_readme.py,sha256=04Lu9dYRMnYeKoQrIclpxUCT5YZctNzK71mzhFr_07E,4421
128
+ atlas_init/tf_ext/gen_examples.py,sha256=b_1d7rdLofqmH8d-Q6hjpbhcUXRrkIQYqvj51CeVZLI,4842
129
+ atlas_init/tf_ext/gen_readme.py,sha256=9CjQRJnMHeLJMGfF9k9DvcApk9I64vaB5cKwVPA6gNs,5153
129
130
  atlas_init/tf_ext/gen_resource_main.py,sha256=C-aqkOFXH5ffT51igPtNW7szIH-MkY3HnMcSZ0Q4OdE,7263
130
131
  atlas_init/tf_ext/gen_resource_output.py,sha256=_LM3mKMVmcqm2uWokvIfMxOnyCD4aCDUNGUp5DujF7E,3518
131
132
  atlas_init/tf_ext/gen_resource_variables.py,sha256=hgaHJlgnk1bNCV46TlvUIVZ5PVUQvxxnfo-hKN05SEU,6954
132
133
  atlas_init/tf_ext/gen_versions.py,sha256=yYX4jIgQfAZuG2wfu6OsIbDAqt9g8btiLcgKm7DvNqM,469
133
- atlas_init/tf_ext/models.py,sha256=8tJmLtwzzuNp_waG2eZ9bFmqRx6dJeYivu-ygvJUiLM,3631
134
- atlas_init/tf_ext/models_module.py,sha256=JpMGSdjgS6D8NlTJNcSIOdq0dDagKyIfSeoFI_-eVMM,18113
134
+ atlas_init/tf_ext/models.py,sha256=vS725jiEc0t61IO1Db0mpxWVQPGaJKIGeZLOb2SOf4I,4430
135
+ atlas_init/tf_ext/models_module.py,sha256=JngaAxN-54hYPffx1rZ-_j-hYT_GELq7lf24e-EQHb0,18276
135
136
  atlas_init/tf_ext/newres.py,sha256=quMSLlkJRuvA3attTvJ-DQNSwRPFyT_XJ32ucmEhA-s,3104
136
- atlas_init/tf_ext/paths.py,sha256=3VQri_VKS5sVKdkHu2XKgHziB1uQpB8hBGBY7GwiAwU,4917
137
+ atlas_init/tf_ext/paths.py,sha256=9MK7UdiHs9ViUmUOa1MhXsZjhlGIH1MHe53_s2yztxg,5264
137
138
  atlas_init/tf_ext/plan_diffs.py,sha256=Sc-VFrq2k7p01ZZzgtAfqRXCog2h6bbFlonGfaxSzog,5237
138
139
  atlas_init/tf_ext/provider_schema.py,sha256=6XrJ3UHjpQ_8yBqWeZ1b4xIPLOqPL9L1ljn4mGF2Cj4,6908
139
140
  atlas_init/tf_ext/py_gen.py,sha256=orZLX2c-tw9eJb8MyTunhkdfqs-f6uOngu5RlLUb9uI,11243
141
+ atlas_init/tf_ext/run_tf.py,sha256=iMaNbjsq4sQe9cesP-uI9En3FifPUaqXFQFbm7K20kM,818
140
142
  atlas_init/tf_ext/schema_to_dataclass.py,sha256=kqg0OxqYZwmNGvlayZkXPwU2CueiHsnAAgLyoXkDUtY,19797
141
- atlas_init/tf_ext/settings.py,sha256=qRSm8e_TquEKoBpYE6VFmXSpiRaHExR00cVykpK1_OI,6814
142
- atlas_init/tf_ext/tf_dep.py,sha256=mHCfI0LpL1bCru9m2Rh7otGbCexh0lUiZoDAguB1A4g,12229
143
+ atlas_init/tf_ext/settings.py,sha256=_NVOt_464XyWq69sT-dwA1hfJ9Ag1H2QssE2datx_rU,7102
144
+ atlas_init/tf_ext/tf_dep.py,sha256=UFrNmolw3qW02E7mq23vVGY0C8HOSSY3-6AHmSEqYno,13453
143
145
  atlas_init/tf_ext/tf_desc_gen.py,sha256=G6Hv9kKJDNbNL8nRRkPA7w8c7MCDgijjdTv-2BjKrZ0,2575
144
146
  atlas_init/tf_ext/tf_desc_update.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
- atlas_init/tf_ext/tf_mod_gen.py,sha256=wsn9gxu2IKpOEE_KS09e5e-3VT4xjs73cjL_HSWmIo4,12250
147
+ atlas_init/tf_ext/tf_example_readme.py,sha256=A8yBJq9Ts0NzBnurWbbmADrfursjhxfdWX3ZxkYZ5cs,14992
148
+ atlas_init/tf_ext/tf_mod_gen.py,sha256=J3BDPHoTqScZ0CmNiYpE_sJaV17jFkMrfgtgejGzhi4,11536
146
149
  atlas_init/tf_ext/tf_mod_gen_provider.py,sha256=M7jJeH0VR1uN440d2H5-9lnj0s0d9QtaMeYsLwWW3Ak,5866
147
- atlas_init/tf_ext/tf_modules.py,sha256=_JokgP-i1iS-iEXVI0MMNorrBHjFG6XcJRKiUe6JbvY,16200
150
+ atlas_init/tf_ext/tf_modules.py,sha256=h_E8Po1fmOcIjU_d92dCjKZytBij4N9Mux70yLW7xVQ,16248
148
151
  atlas_init/tf_ext/tf_vars.py,sha256=A__zcIBNvJ5y0l5F5G7KMQsYCuyr3iBZtRzXm4e6DQU,7875
149
- atlas_init/tf_ext/typer_app.py,sha256=gGVdttrSzUX2uzTAeXzvCF4BQnMxrkltAAc3_BCsiGc,968
150
- atlas_init-0.8.1.dist-info/METADATA,sha256=s0HRa9fecuwCA269e3NhIF-DkyTJtPGGK5Ddgfy0Lk0,5863
151
- atlas_init-0.8.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
152
- atlas_init-0.8.1.dist-info/entry_points.txt,sha256=l38KdfCjY2v5q8Ves1qkWNvPTPND6Tp2EKX-RL-MN3c,200
153
- atlas_init-0.8.1.dist-info/licenses/LICENSE,sha256=aKnucPyXnK1A-aXn4vac71zRpcB5BXjDyl4PDyi_hZg,1069
154
- atlas_init-0.8.1.dist-info/RECORD,,
152
+ atlas_init/tf_ext/tf_ws.py,sha256=Wm17_Zgn4KrnWFpuShuEPabE8M4TtOxoG3EM3gCOr1Y,10099
153
+ atlas_init/tf_ext/typer_app.py,sha256=wzC6pwt7W0u2Ce3xcWVYRbFeP8C8pLw1Gy5BPeWQjZo,1110
154
+ atlas_init-0.10.0.dist-info/METADATA,sha256=JwoMAGhhoJc1VD5usMTGOZvRIgRLHyH1CuCjw9sx2Us,5902
155
+ atlas_init-0.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
156
+ atlas_init-0.10.0.dist-info/entry_points.txt,sha256=l38KdfCjY2v5q8Ves1qkWNvPTPND6Tp2EKX-RL-MN3c,200
157
+ atlas_init-0.10.0.dist-info/licenses/LICENSE,sha256=aKnucPyXnK1A-aXn4vac71zRpcB5BXjDyl4PDyi_hZg,1069
158
+ atlas_init-0.10.0.dist-info/RECORD,,