splight-cli 4.12.2__tar.gz → 4.14.1__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 (82) hide show
  1. {splight_cli-4.12.2 → splight_cli-4.14.1}/PKG-INFO +2 -2
  2. {splight_cli-4.12.2 → splight_cli-4.14.1}/pyproject.toml +2 -2
  3. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/component.py +0 -23
  4. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/solution/__init__.py +18 -21
  5. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/solution/exceptions.py +8 -0
  6. splight_cli-4.14.1/splight_cli/hub/solution/solution_manager.py +115 -0
  7. splight_cli-4.12.2/splight_cli/hub/solution/solution_manager.py +0 -95
  8. {splight_cli-4.12.2 → splight_cli-4.14.1}/README.md +0 -0
  9. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/__init__.py +0 -0
  10. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/cli.py +0 -0
  11. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/__init__.py +0 -0
  12. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/exceptions.py +0 -0
  13. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/loaders.py +0 -0
  14. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/.splightignore +0 -0
  15. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/Initialization +0 -0
  16. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/README.md +0 -0
  17. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/auto_readme.md +0 -0
  18. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/main.py +0 -0
  19. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/spec.json +0 -0
  20. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/templates/tests.py +0 -0
  21. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/tests/__init__.py +0 -0
  22. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/tests/test_component_manager.py +0 -0
  23. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/component/utils.py +0 -0
  24. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/config/__init__.py +0 -0
  25. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/constants.py +0 -0
  26. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/context/__init__.py +0 -0
  27. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/context/context.py +0 -0
  28. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/context/workspace.py +0 -0
  29. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/__init__.py +0 -0
  30. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/alert/__init__.py +0 -0
  31. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/asset/__init__.py +0 -0
  32. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/attribute/__init__.py +0 -0
  33. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/component/__init__.py +0 -0
  34. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/datalake/__init__.py +0 -0
  35. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/file/__init__.py +0 -0
  36. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/manager/__init__.py +0 -0
  37. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/manager/exceptions.py +0 -0
  38. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/manager/manager.py +0 -0
  39. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/manager/tests/test_datalake_manager.py +0 -0
  40. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/manager/tests/test_resource_manager.py +0 -0
  41. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/engine/secret/__init__.py +0 -0
  42. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/__init__.py +0 -0
  43. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/component/__init__.py +0 -0
  44. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/component/exceptions.py +0 -0
  45. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/component/hub_manager.py +0 -0
  46. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/component/tests/test_hub_manager.py +0 -0
  47. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/hub/solution/constants.py +0 -0
  48. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/settings.py +0 -0
  49. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/__init__.py +0 -0
  50. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/dict.py +0 -0
  51. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/parser.py +0 -0
  52. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/__init__.py +0 -0
  53. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/diff.py +0 -0
  54. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/logger.py +0 -0
  55. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/manager.py +0 -0
  56. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/__init__.py +0 -0
  57. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/alert.py +0 -0
  58. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/asset.py +0 -0
  59. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/attribute.py +0 -0
  60. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/base.py +0 -0
  61. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/component.py +0 -0
  62. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/component_object.py +0 -0
  63. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/file.py +0 -0
  64. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/function.py +0 -0
  65. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/metadata.py +0 -0
  66. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/routine.py +0 -0
  67. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/resource/models/secret.py +0 -0
  68. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/solution/state.py +0 -0
  69. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/tests/test_component/Initialization +0 -0
  70. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/tests/test_component/README.md +0 -0
  71. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/tests/test_component/main.py +0 -0
  72. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/tests/test_component/spec.json +0 -0
  73. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/tests/test_component/tests.py +0 -0
  74. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/__init__.py +0 -0
  75. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/input.py +0 -0
  76. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/json.py +0 -0
  77. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/loader.py +0 -0
  78. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/pprint.py +0 -0
  79. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/template.py +0 -0
  80. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/utils/yaml.py +0 -0
  81. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/version.py +0 -0
  82. {splight_cli-4.12.2 → splight_cli-4.14.1}/splight_cli/workspace/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-cli
3
- Version: 4.12.2
3
+ Version: 4.14.1
4
4
  Summary: Splight Command Line Interface
5
5
  Author: Splight Dev
6
6
  Author-email: dev@splight-ae.com
@@ -21,7 +21,7 @@ Requires-Dist: py7zr (==0.20.8)
21
21
  Requires-Dist: requests (==2.31.0)
22
22
  Requires-Dist: rich (==13.0.1)
23
23
  Requires-Dist: setuptools (==60.9.3)
24
- Requires-Dist: splight-lib (>=5.6.6,<6.0.0)
24
+ Requires-Dist: splight-lib (>=5.8.0)
25
25
  Requires-Dist: toposort (>=1.10,<2.0)
26
26
  Requires-Dist: typer (==0.9.0)
27
27
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "splight-cli"
3
- version = "4.12.2"
3
+ version = "4.14.1"
4
4
  description = "Splight Command Line Interface"
5
5
  authors = ["Splight Dev <dev@splight-ae.com>"]
6
6
  readme = "README.md"
@@ -11,7 +11,7 @@ case-converter = "1.1.0"
11
11
  click = "8.0.4"
12
12
  click-default-group = "1.2.2"
13
13
  setuptools = "60.9.3"
14
- splight-lib = "^5.6.6"
14
+ splight-lib = ">=5.8.0"
15
15
  py7zr = "0.20.8"
16
16
  typer = "0.9.0"
17
17
  colorama = "0.4.4"
@@ -1,4 +1,3 @@
1
- import json
2
1
  import os
3
2
  import subprocess
4
3
  from enum import auto
@@ -8,7 +7,6 @@ from typing import List, Optional
8
7
  from caseconverter import pascalcase
9
8
  from jinja2 import Template
10
9
  from rich.console import Console
11
- from splight_lib.client.database import LOCAL_DB_FILE
12
10
  from splight_lib.component.spec import Spec
13
11
  from strenum import LowercaseStrEnum
14
12
 
@@ -19,11 +17,6 @@ from splight_cli.component.exceptions import (
19
17
  ReadmeExists,
20
18
  )
21
19
  from splight_cli.component.loaders import InitLoader
22
- from splight_cli.component.utils import (
23
- db_from_spec,
24
- fake_asset,
25
- fake_attribute,
26
- )
27
20
  from splight_cli.constants import (
28
21
  INIT_FILE,
29
22
  PYTHON_CMD,
@@ -207,19 +200,3 @@ class ComponentManager:
207
200
  def _validate_cli_version(self, component_cli_version: str):
208
201
  if component_cli_version != __version__:
209
202
  raise InvalidSplightCLIVersion(component_cli_version, __version__)
210
-
211
- def create_local_db(self, path: str):
212
- spec = Spec.from_file(os.path.join(path, SPEC_FILE))
213
- json_spec = spec.model_dump()
214
-
215
- splight_db = db_from_spec(json_spec)
216
-
217
- # agnostic from component
218
- asset = fake_asset()
219
- splight_db["asset"].update(asset)
220
-
221
- attribute = fake_attribute()
222
- splight_db["attribute"].update(attribute)
223
-
224
- with open(LOCAL_DB_FILE, "w") as db_file:
225
- json.dump(splight_db, db_file, indent=4)
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  import typer
4
2
  from rich.console import Console
5
3
  from splight_lib.models import Component
@@ -21,11 +19,7 @@ MODEL = Component
21
19
  @solution_app.command()
22
20
  def push(
23
21
  ctx: typer.Context,
24
- name: str = typer.Option(..., help="The solution's name"),
25
- version: str = typer.Option(..., help="The solution's version"),
26
- description: str = typer.Option("", help="The solution's description"),
27
- tags: List[str] = typer.Option([], help="The solution's tags"),
28
- path: str = typer.Option(".", help="Path to solution files"),
22
+ path: str = typer.Argument(..., help="Path to solution files"),
29
23
  force: bool = typer.Option(
30
24
  False,
31
25
  "--force",
@@ -35,25 +29,28 @@ def push(
35
29
  ):
36
30
  try:
37
31
  manager = HubSolutionManager()
38
- manager.push(name, version, description, tags, path, force=force)
32
+ manager.push(path, force=force)
39
33
  except Exception as exc:
40
- console.print(f"Error pushing component: {exc}", style=error_style)
34
+ import traceback
35
+ import sys
36
+ traceback.print_exc(file=sys.stdout)
37
+ console.print(f"Error pushing solution: {exc}", style=error_style)
41
38
  raise typer.Exit(code=1)
42
39
 
43
40
 
44
41
  # TODO: Define the pull command
45
- # @solution_app.command()
46
- # def pull(
47
- # ctx: typer.Context,
48
- # name: str = typer.Argument(..., help="The component's name"),
49
- # version: str = typer.Argument(..., help="The component's version"),
50
- # ):
51
- # try:
52
- # manager = HubComponentManager()
53
- # manager.pull(name=name, version=version)
54
- # except Exception as exc:
55
- # console.print(f"Error pulling component: {exc}", style=error_style)
56
- # raise typer.Exit(code=1)
42
+ @solution_app.command()
43
+ def pull(
44
+ ctx: typer.Context,
45
+ name: str = typer.Argument(..., help="The component's name"),
46
+ version: str = typer.Argument(..., help="The component's version"),
47
+ ):
48
+ try:
49
+ manager = HubSolutionManager()
50
+ manager.pull(name=name, version=version)
51
+ except Exception as exc:
52
+ console.print(f"Error pulling solution: {exc}", style=error_style)
53
+ raise typer.Exit(code=1)
57
54
 
58
55
 
59
56
  @solution_app.command()
@@ -20,3 +20,11 @@ class MissingSolutionFile(Exception):
20
20
 
21
21
  def __str__(self) -> str:
22
22
  return self._msg
23
+
24
+
25
+ class SolutionDirectoryAlreadyExists(Exception):
26
+ def __init__(self, path: str):
27
+ self._msg = f"Solution directory {path} already exists"
28
+
29
+ def __str__(self) -> str:
30
+ return self._msg
@@ -0,0 +1,115 @@
1
+ import json
2
+ import os
3
+ import shutil
4
+ from collections import namedtuple
5
+
6
+ import py7zr
7
+ from pydantic import ValidationError
8
+ from rich.console import Console
9
+ from rich.table import Table
10
+ from splight_lib.models import HubSolution
11
+
12
+ from splight_cli.constants import COMPRESSION_TYPE, SPEC_FILE, success_style
13
+ from splight_cli.hub.component.exceptions import (
14
+ SpecFormatError,
15
+ SpecValidationError,
16
+ )
17
+ from splight_cli.hub.solution.exceptions import (
18
+ HubSolutionAlreadyExists,
19
+ HubSolutionNotFound,
20
+ SolutionDirectoryAlreadyExists,
21
+ )
22
+ from splight_cli.utils.loader import Loader
23
+
24
+ console = Console()
25
+
26
+
27
+ class HubSolutionManager:
28
+ def list_solutions(self):
29
+ solution_tuple = namedtuple("Solution", ["name", "version"])
30
+ all_solutions = HubSolution.list()
31
+ solutions = set(
32
+ [
33
+ solution_tuple(solution.name, solution.version)
34
+ for solution in all_solutions
35
+ ]
36
+ )
37
+ table = Table("Name", "Version", title="Hub Solution List")
38
+ [table.add_row(sol.name, sol.version) for sol in solutions]
39
+ console.print(table)
40
+
41
+ def push(
42
+ self,
43
+ path: str = ".",
44
+ force: bool = False,
45
+ ):
46
+ try:
47
+ with open(os.path.join(path, SPEC_FILE)) as fid:
48
+ spec = json.load(fid)
49
+ except Exception as exc:
50
+ raise SpecFormatError(exc)
51
+
52
+ # Validate spec fields before pushing the model
53
+ try:
54
+ instance = HubSolution.model_validate(spec)
55
+ except ValidationError as exc:
56
+ raise SpecValidationError(exc)
57
+
58
+ name = instance.name
59
+ version = instance.version
60
+
61
+ if not force and self._exists_in_hub(name, version):
62
+ raise HubSolutionAlreadyExists(name, version)
63
+
64
+ with Loader("Pushing Solution to Splight Hub"):
65
+ solution = HubSolution.upload(path)
66
+
67
+ console.print(
68
+ f"Solution {solution.id} pushed succesfully", style=success_style
69
+ )
70
+
71
+ def pull(self, name: str, version: str):
72
+ with Loader("Pulling solution from Splight Hub"):
73
+ self._pull_solution(name, version)
74
+ console.print(
75
+ f"Solution {name} pulled succesfully", style=success_style
76
+ )
77
+
78
+ def _pull_solution(self, name: str, version: str):
79
+ solution = self._get_hub_solution(name, version)
80
+ name, version = solution.name, solution.version
81
+ file_wrapper = solution.download()
82
+ file_data = file_wrapper.read()
83
+
84
+ version_modified = version.replace(".", "_")
85
+ solution_path = f"{name}/{version_modified}"
86
+ versioned_name = f"{name}-{version}"
87
+ file_name = f"{versioned_name}.{COMPRESSION_TYPE}"
88
+ if os.path.exists(solution_path):
89
+ raise SolutionDirectoryAlreadyExists(solution_path)
90
+
91
+ try:
92
+ with open(file_name, "wb") as fid:
93
+ fid.write(file_data)
94
+
95
+ with py7zr.SevenZipFile(file_name, "r") as z:
96
+ z.extractall(path=".")
97
+ shutil.move(f"{versioned_name}", solution_path)
98
+ except Exception as exc:
99
+ raise exc
100
+ finally:
101
+ if os.path.exists(file_name):
102
+ os.remove(file_name)
103
+
104
+ def _get_hub_solution(self, name: str, version: str) -> HubSolution:
105
+ solutions = HubSolution.list(name=name, version=version)
106
+ if not solutions:
107
+ raise HubSolutionNotFound(name, version)
108
+ return solutions[0]
109
+
110
+ def _exists_in_hub(self, name: str, version: str) -> bool:
111
+ try:
112
+ self._get_hub_solution(name, version)
113
+ return True
114
+ except HubSolutionNotFound:
115
+ return False
@@ -1,95 +0,0 @@
1
- import os
2
- from collections import namedtuple
3
- from typing import List
4
-
5
- from rich.console import Console
6
- from rich.table import Table
7
- from splight_lib.models import HubSolution
8
-
9
- from splight_cli.hub.solution.constants import (
10
- MAIN_FILE,
11
- README_FILE,
12
- VALUES_FILE,
13
- VARIABLES_FILE,
14
- )
15
- from splight_cli.hub.solution.exceptions import (
16
- HubSolutionAlreadyExists,
17
- HubSolutionNotFound,
18
- MissingSolutionFile,
19
- )
20
- from splight_cli.utils.loader import Loader
21
-
22
- console = Console()
23
-
24
-
25
- class HubSolutionManager:
26
- def list_solutions(self):
27
- solution_tuple = namedtuple("Solution", ["name", "version"])
28
- all_solutions = HubSolution.list()
29
- solutions = set(
30
- [
31
- solution_tuple(solution.name, solution.version)
32
- for solution in all_solutions
33
- ]
34
- )
35
- table = Table("Name", "Version", title="Hub Solution List")
36
- [table.add_row(sol.name, sol.version) for sol in solutions]
37
- console.print(table)
38
-
39
- def push(
40
- self,
41
- name: str,
42
- version: str,
43
- description: str,
44
- tags: List[str] = [],
45
- path: str = ".",
46
- force: bool = False,
47
- ):
48
- try:
49
- solution = self._get_component(name, version)
50
- except HubSolutionNotFound:
51
- exist_in_hub = False
52
- solution = HubSolution(
53
- name=name, version=version, description=description, tags=tags
54
- )
55
- else:
56
- exist_in_hub = True
57
-
58
- if not force and exist_in_hub:
59
- raise HubSolutionAlreadyExists(name, version)
60
-
61
- self._set_files_from_path(solution, path)
62
-
63
- with Loader("Pushing Solution to Splight Hub"):
64
- solution.save()
65
-
66
- def _set_files_from_path(self, solution: HubSolution, path: str):
67
- main_file_path = os.path.join(path, MAIN_FILE)
68
- if os.path.exists(main_file_path):
69
- solution.main_file = main_file_path
70
- else:
71
- raise MissingSolutionFile(MAIN_FILE, path)
72
-
73
- variables_file_path = os.path.join(path, VARIABLES_FILE)
74
- if os.path.exists(variables_file_path):
75
- solution.variables_file = variables_file_path
76
- else:
77
- raise MissingSolutionFile(VARIABLES_FILE, path)
78
-
79
- values_file_path = os.path.join(path, VALUES_FILE)
80
- if os.path.exists(values_file_path):
81
- solution.values_file = values_file_path
82
- else:
83
- raise MissingSolutionFile(VALUES_FILE, path)
84
-
85
- readme_file_path = os.path.join(path, README_FILE)
86
- if os.path.exists(readme_file_path):
87
- solution.readme_file = readme_file_path
88
- else:
89
- raise MissingSolutionFile(README_FILE, path)
90
-
91
- def _get_component(self, name: str, version: str) -> HubSolution:
92
- solutions = HubSolution.list(name=name, version=version)
93
- if not solutions:
94
- raise HubSolutionNotFound(name, version)
95
- return solutions[0]
File without changes