spaceforge 0.0.6__tar.gz → 0.0.8__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 (57) hide show
  1. {spaceforge-0.0.6 → spaceforge-0.0.8}/PKG-INFO +1 -1
  2. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/plugin.py +5 -2
  3. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/plugin.yaml +12 -9
  4. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/infracost/plugin.py +1 -1
  5. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/infracost/plugin.yaml +2 -2
  6. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/plugin.py +1 -1
  7. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/plugin.yaml +3 -3
  8. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/wiz/plugin.py +1 -1
  9. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/wiz/plugin.yaml +2 -2
  10. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/_version_scm.py +3 -3
  11. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/generator.py +2 -1
  12. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/plugin.py +34 -19
  13. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/PKG-INFO +1 -1
  14. {spaceforge-0.0.6 → spaceforge-0.0.8}/.github/workflows/ci.yml +0 -0
  15. {spaceforge-0.0.6 → spaceforge-0.0.8}/.github/workflows/release.yml +0 -0
  16. {spaceforge-0.0.6 → spaceforge-0.0.8}/.gitignore +0 -0
  17. {spaceforge-0.0.6 → spaceforge-0.0.8}/LICENSE +0 -0
  18. {spaceforge-0.0.6 → spaceforge-0.0.8}/MANIFEST.in +0 -0
  19. {spaceforge-0.0.6 → spaceforge-0.0.8}/README.md +0 -0
  20. {spaceforge-0.0.6 → spaceforge-0.0.8}/go.mod +0 -0
  21. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/requirements.txt +0 -0
  22. {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/requirements.txt +0 -0
  23. {spaceforge-0.0.6 → spaceforge-0.0.8}/pyproject.toml +0 -0
  24. {spaceforge-0.0.6 → spaceforge-0.0.8}/setup.cfg +0 -0
  25. {spaceforge-0.0.6 → spaceforge-0.0.8}/setup.py +0 -0
  26. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/README.md +0 -0
  27. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/__init__.py +0 -0
  28. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/__main__.py +0 -0
  29. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/_version.py +0 -0
  30. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/cls.py +0 -0
  31. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/conftest.py +0 -0
  32. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/runner.py +0 -0
  33. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/schema.json +0 -0
  34. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/templates/binary_install.sh.j2 +0 -0
  35. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
  36. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_cls.py +0 -0
  37. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator.py +0 -0
  38. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_binaries.py +0 -0
  39. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_core.py +0 -0
  40. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_hooks.py +0 -0
  41. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_parameters.py +0 -0
  42. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin.py +0 -0
  43. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_file_operations.py +0 -0
  44. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_hooks.py +0 -0
  45. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_inheritance.py +0 -0
  46. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner.py +0 -0
  47. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_cli.py +0 -0
  48. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_core.py +0 -0
  49. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_execution.py +0 -0
  50. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/SOURCES.txt +0 -0
  51. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/dependency_links.txt +0 -0
  52. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/entry_points.txt +0 -0
  53. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/not-zip-safe +0 -0
  54. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/requires.txt +0 -0
  55. {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/top_level.txt +0 -0
  56. {spaceforge-0.0.6 → spaceforge-0.0.8}/templates.go +0 -0
  57. {spaceforge-0.0.6 → spaceforge-0.0.8}/test.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 0.0.6
3
+ Version: 0.0.8
4
4
  Summary: A Python framework for building Spacelift plugins
5
5
  Home-page: https://github.com/spacelift-io/plugins
6
6
  Author: Spacelift
@@ -149,6 +149,9 @@ resource "spacelift_environment_variable" "__this" {
149
149
  )
150
150
  ]
151
151
 
152
+ def __init__(self):
153
+ super().__init__()
154
+
152
155
  def load_yaml_file(self, file_path):
153
156
  """Load YAML file and return parsed content"""
154
157
  try:
@@ -190,13 +193,13 @@ resource "spacelift_environment_variable" "__this" {
190
193
  query = "{ stack(id: \"" + stack_id + "\") { trackedCommit { hash } } }"
191
194
  response = self.query_api(query)
192
195
  if "errors" in response:
193
- self.logger.error("Error fetching stack tracked commit:", response["errors"])
196
+ self.logger.error(f"Error fetching stack tracked commit: {response['errors']}")
194
197
  continue
195
198
 
196
199
  # Ensure we have a tracked commit
197
200
  try:
198
201
  tracked_commit = response["data"]["stack"]["trackedCommit"]["hash"]
199
- except TypeError:
202
+ except (TypeError, KeyError):
200
203
  tracked_commit = None
201
204
  if tracked_commit is None:
202
205
  self.logger.error(f"Stack {stack_id} has no tracked commit. Skipping.")
@@ -130,10 +130,10 @@ contexts:
130
130
  write_only = each.value.write_only
131
131
  }
132
132
  sensitive: false
133
- - path: /mnt/workspace/plugins/environment manager/requirements.txt
133
+ - path: /mnt/workspace/plugins/environment_manager/requirements.txt
134
134
  content: pyyaml==6.0.2
135
135
  sensitive: false
136
- - path: /mnt/workspace/plugins/environment manager/plugin.py
136
+ - path: /mnt/workspace/plugins/environment_manager/plugin.py
137
137
  content: |-
138
138
  from spaceforge import SpaceforgePlugin, MountedFile, Context
139
139
 
@@ -286,6 +286,9 @@ contexts:
286
286
  )
287
287
  ]
288
288
 
289
+ def __init__(self):
290
+ super().__init__()
291
+
289
292
  def load_yaml_file(self, file_path):
290
293
  """Load YAML file and return parsed content"""
291
294
  try:
@@ -327,13 +330,13 @@ contexts:
327
330
  query = "{ stack(id: \"" + stack_id + "\") { trackedCommit { hash } } }"
328
331
  response = self.query_api(query)
329
332
  if "errors" in response:
330
- self.logger.error("Error fetching stack tracked commit:", response["errors"])
333
+ self.logger.error(f"Error fetching stack tracked commit: {response['errors']}")
331
334
  continue
332
335
 
333
336
  # Ensure we have a tracked commit
334
337
  try:
335
338
  tracked_commit = response["data"]["stack"]["trackedCommit"]["hash"]
336
- except TypeError:
339
+ except (TypeError, KeyError):
337
340
  tracked_commit = None
338
341
  if tracked_commit is None:
339
342
  self.logger.error(f"Stack {stack_id} has no tracked commit. Skipping.")
@@ -384,13 +387,13 @@ contexts:
384
387
  # Trigger stack previews
385
388
  self.trigger_stack_previews(runtime_config)
386
389
  sensitive: false
387
- - path: /mnt/workspace/plugins/environment manager/before_init.sh
390
+ - path: /mnt/workspace/plugins/environment_manager/before_init.sh
388
391
  content: |-
389
392
  #!/bin/sh
390
393
 
391
394
  set -e
392
395
 
393
- cd /mnt/workspace/plugins/environment manager
396
+ cd /mnt/workspace/plugins/environment_manager
394
397
 
395
398
  if [ ! -d "./venv" ]; then
396
399
  python -m venv ./venv
@@ -407,10 +410,10 @@ contexts:
407
410
  fi
408
411
 
409
412
  cd /mnt/workspace/source/$TF_VAR_spacelift_project_root
410
- spaceforge runner --plugin-file /mnt/workspace/plugins/environment manager/plugin.py before_init
413
+ spaceforge runner --plugin-file /mnt/workspace/plugins/environment_manager/plugin.py before_init
411
414
  sensitive: false
412
415
  hooks:
413
416
  before_init:
414
417
  - mv /mnt/workspace/__environment_manager.tf /mnt/workspace/source/$TF_VAR_spacelift_project_root/__environment_manager.tf
415
- - mkdir -p /mnt/workspace/plugins/environment manager
416
- - chmod +x /mnt/workspace/plugins/environment manager/before_init.sh && /mnt/workspace/plugins/environment manager/before_init.sh
418
+ - mkdir -p /mnt/workspace/plugins/environment_manager
419
+ - chmod +x /mnt/workspace/plugins/environment_manager/before_init.sh && /mnt/workspace/plugins/environment_manager/before_init.sh
@@ -6,7 +6,7 @@ class InfracostPlugin(SpaceforgePlugin):
6
6
  """
7
7
 
8
8
  # Plugin metadata
9
- __plugin_name__ = "infracost"
9
+ __plugin_name__ = "Infracost"
10
10
  __labels__ = ["cost estimation", "infrastructure"]
11
11
  __version__ = "1.0.0"
12
12
  __author__ = "Spacelift Team"
@@ -1,4 +1,4 @@
1
- name: infracost
1
+ name: Infracost
2
2
  version: 1.0.0
3
3
  description: A plugin for integrating with Infracost to estimate costs of infrastructure changes.
4
4
  author: Spacelift Team
@@ -29,7 +29,7 @@ contexts:
29
29
  """
30
30
 
31
31
  # Plugin metadata
32
- __plugin_name__ = "infracost"
32
+ __plugin_name__ = "Infracost"
33
33
  __labels__ = ["cost estimation", "infrastructure"]
34
34
  __version__ = "1.0.0"
35
35
  __author__ = "Spacelift Team"
@@ -37,7 +37,7 @@ secrets:
37
37
  """
38
38
 
39
39
  # Plugin metadata
40
- __plugin_name__ = "sops"
40
+ __plugin_name__ = "Sops"
41
41
  __labels__ = ["secrets management", "encryption"]
42
42
  __version__ = "1.0.0"
43
43
  __author__ = "Spacelift Team"
@@ -1,4 +1,4 @@
1
- name: sops
1
+ name: Sops
2
2
  version: 1.0.0
3
3
  description: |-
4
4
  # Plugin Sops
@@ -35,7 +35,7 @@ labels:
35
35
  - encryption
36
36
  contexts:
37
37
  - name_prefix: sops
38
- description: Main context for sops
38
+ description: Main context for Sops
39
39
  env: []
40
40
  mounted_files:
41
41
  - path: /mnt/workspace/plugins/sops/requirements.txt
@@ -84,7 +84,7 @@ contexts:
84
84
  """
85
85
 
86
86
  # Plugin metadata
87
- __plugin_name__ = "sops"
87
+ __plugin_name__ = "Sops"
88
88
  __labels__ = ["secrets management", "encryption"]
89
89
  __version__ = "1.0.0"
90
90
  __author__ = "Spacelift Team"
@@ -23,7 +23,7 @@ Samples of these policies are included with the plugin.
23
23
  """
24
24
 
25
25
  # Plugin metadata
26
- __plugin_name__ = "wiz"
26
+ __plugin_name__ = "Wiz"
27
27
  __labels__ = ["security", "code scanning", "vulnerability"]
28
28
  __version__ = "1.0.0"
29
29
  __author__ = "Spacelift Team"
@@ -1,4 +1,4 @@
1
- name: wiz
1
+ name: Wiz
2
2
  version: 1.0.0
3
3
  description: |-
4
4
  # Plugin Wiz
@@ -69,7 +69,7 @@ contexts:
69
69
  """
70
70
 
71
71
  # Plugin metadata
72
- __plugin_name__ = "wiz"
72
+ __plugin_name__ = "Wiz"
73
73
  __labels__ = ["security", "code scanning", "vulnerability"]
74
74
  __version__ = "1.0.0"
75
75
  __author__ = "Spacelift Team"
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.6'
32
- __version_tuple__ = version_tuple = (0, 0, 6)
31
+ __version__ = version = '0.0.8'
32
+ __version_tuple__ = version_tuple = (0, 0, 8)
33
33
 
34
- __commit_id__ = commit_id = 'gf4078fecf'
34
+ __commit_id__ = commit_id = 'g3b76eed20'
@@ -84,7 +84,8 @@ class PluginGenerator:
84
84
  self.plugin_class = plugin_class
85
85
  self.plugin_instance = plugin_class()
86
86
  self.plugin_working_directory = (
87
- "/mnt/workspace/plugins/" + plugin_class.__plugin_name__.lower()
87
+ "/mnt/workspace/plugins/"
88
+ + plugin_class.__plugin_name__.lower().replace(" ", "_")
88
89
  )
89
90
  self.config = {
90
91
  "setup_virtual_env": (
@@ -8,6 +8,7 @@ import logging
8
8
  import os
9
9
  import subprocess
10
10
  import urllib.request
11
+ from urllib.error import HTTPError
11
12
  from abc import ABC
12
13
  from typing import Any, Dict, List, Optional, Tuple
13
14
 
@@ -48,14 +49,14 @@ class SpaceforgePlugin(ABC):
48
49
  if self.spacelift_domain and isinstance(self.spacelift_domain, str):
49
50
  # this must occur after we check if spacelift domain is false
50
51
  # because the domain could be set but not start with https://
51
- if self.spacelift_domain.startswith("https://"):
52
- if self.spacelift_domain.endswith("/"):
53
- self.spacelift_domain = self.spacelift_domain[:-1]
54
- else:
55
- self.logger.warning(
56
- "SPACELIFT_DOMAIN does not start with https://, api calls will fail."
57
- )
58
- self._api_enabled = False
52
+ # if self.spacelift_domain.startswith("https://"):
53
+ # if self.spacelift_domain.endswith("/"):
54
+ # self.spacelift_domain = self.spacelift_domain[:-1]
55
+ # else:
56
+ # self.logger.warning(
57
+ # "SPACELIFT_DOMAIN does not start with https://, api calls will fail."
58
+ # )
59
+ # self._api_enabled = False
59
60
 
60
61
  if self._api_enabled:
61
62
  self._spacelift_markdown_endpoint = self.spacelift_domain.replace(
@@ -204,8 +205,17 @@ class SpaceforgePlugin(ABC):
204
205
  json.dumps(data).encode("utf-8"),
205
206
  headers,
206
207
  )
207
- with urllib.request.urlopen(req) as response:
208
- resp: Dict[str, Any] = json.loads(response.read().decode("utf-8"))
208
+
209
+ try:
210
+ with urllib.request.urlopen(req) as response:
211
+ resp: Dict[str, Any] = json.loads(response.read().decode("utf-8"))
212
+ except urllib.error.HTTPError as e:
213
+ if hasattr(e, 'read'):
214
+ resp = json.loads(e.read().decode('utf-8'))
215
+ else:
216
+ # We should not get here, but if we do re-raise the exception
217
+ self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
218
+ raise e
209
219
 
210
220
  if "errors" in resp:
211
221
  self.logger.error(f"Error: {resp['errors']}")
@@ -287,8 +297,8 @@ class SpaceforgePlugin(ABC):
287
297
  headers = resp["headers"]
288
298
  headers["Content-Type"] = "text/markdown"
289
299
  headers["Content-Length"] = str(len(markdown))
290
- except urllib.request.HTTPError as e:
291
- self.logger.error(f"HTTP error occurred: {e.code} - {e.reason}")
300
+ except HTTPError as e:
301
+ self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
292
302
  return False
293
303
 
294
304
  # Now we upload the markdown content to the signed URL
@@ -299,13 +309,18 @@ class SpaceforgePlugin(ABC):
299
309
  method="PUT",
300
310
  )
301
311
 
302
- with urllib.request.urlopen(req) as put_response:
303
- if put_response.status != 200:
304
- self.logger.error(
305
- f"Error uploading markdown content: {put_response.status}"
306
- )
307
- return False
308
- self.logger.debug("Markdown content uploaded successfully.")
312
+ try:
313
+ with urllib.request.urlopen(req) as put_response:
314
+ if put_response.status != 200:
315
+ self.logger.error(
316
+ f"Error uploading markdown content: {put_response.status}"
317
+ )
318
+ return False
319
+ self.logger.debug("Markdown content uploaded successfully.")
320
+ except HTTPError as e:
321
+ self.logger.error(f"HTTP error occurred during upload: ({e.code}) {e.reason} {e.msg}")
322
+ return False
323
+
309
324
  return True
310
325
 
311
326
  def add_to_policy_input(self, input_name: str, data: Dict[str, Any]) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 0.0.6
3
+ Version: 0.0.8
4
4
  Summary: A Python framework for building Spacelift plugins
5
5
  Home-page: https://github.com/spacelift-io/plugins
6
6
  Author: Spacelift
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes