spaceforge 1.2.1__py3-none-any.whl → 1.3.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.
@@ -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 = '1.2.1'
32
- __version_tuple__ = version_tuple = (1, 2, 1)
31
+ __version__ = version = '1.3.0'
32
+ __version_tuple__ = version_tuple = (1, 3, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
spaceforge/cls.py CHANGED
@@ -180,6 +180,7 @@ class Webhook:
180
180
 
181
181
 
182
182
  PolicyTypes = Literal["PUSH", "PLAN", "TRIGGER", "APPROVAL", "NOTIFICATION"]
183
+ EngineTypes = Literal["REGO_V0", "REGO_V1"]
183
184
 
184
185
 
185
186
  @pydantic_dataclass
@@ -197,6 +198,7 @@ class Policy:
197
198
  name_prefix: str
198
199
  type: PolicyTypes
199
200
  body: str
201
+ engine_type: Optional[EngineTypes] = "REGO_V1"
200
202
  labels: Optional[List[str]] = optional_field
201
203
 
202
204
 
spaceforge/schema.json CHANGED
@@ -208,6 +208,22 @@
208
208
  "title": "Body",
209
209
  "type": "string"
210
210
  },
211
+ "engine_type": {
212
+ "anyOf": [
213
+ {
214
+ "enum": [
215
+ "REGO_V0",
216
+ "REGO_V1"
217
+ ],
218
+ "type": "string"
219
+ },
220
+ {
221
+ "type": "null"
222
+ }
223
+ ],
224
+ "default": "REGO_V1",
225
+ "title": "Engine Type"
226
+ },
211
227
  "labels": {
212
228
  "anyOf": [
213
229
  {
@@ -98,8 +98,7 @@ class TestPluginGenerator:
98
98
 
99
99
  # Create a test plugin file
100
100
  with open(self.test_plugin_path, "w") as f:
101
- f.write(
102
- """
101
+ f.write("""
103
102
  from spaceforge import SpaceforgePlugin, Parameter
104
103
 
105
104
  class TestPlugin(SpaceforgePlugin):
@@ -113,8 +112,7 @@ class TestPlugin(SpaceforgePlugin):
113
112
 
114
113
  def after_plan(self) -> None:
115
114
  pass
116
- """
117
- )
115
+ """)
118
116
 
119
117
  def teardown_method(self) -> None:
120
118
  """Cleanup test fixtures."""
@@ -161,12 +159,10 @@ class TestPlugin(SpaceforgePlugin):
161
159
  """Test loading plugin with no SpaceforgePlugin subclass."""
162
160
  no_plugin_path = os.path.join(self.temp_dir, "no_plugin.py")
163
161
  with open(no_plugin_path, "w") as f:
164
- f.write(
165
- """
162
+ f.write("""
166
163
  class NotAPlugin:
167
164
  pass
168
- """
169
- )
165
+ """)
170
166
 
171
167
  generator = PluginGenerator(no_plugin_path)
172
168
 
@@ -606,8 +602,7 @@ class NotAPlugin:
606
602
  # Create a complete test plugin file
607
603
  full_plugin_path = os.path.join(self.temp_dir, "full_plugin.py")
608
604
  with open(full_plugin_path, "w") as f:
609
- f.write(
610
- '''
605
+ f.write('''
611
606
  from spaceforge import SpaceforgePlugin, Parameter
612
607
 
613
608
  class FullTestPlugin(SpaceforgePlugin):
@@ -630,8 +625,7 @@ class FullTestPlugin(SpaceforgePlugin):
630
625
  def after_plan(self):
631
626
  """Override after_plan hook."""
632
627
  pass
633
- '''
634
- )
628
+ ''')
635
629
 
636
630
  generator = PluginGenerator(full_plugin_path, self.test_output_path)
637
631
 
@@ -68,12 +68,10 @@ class TestPluginGeneratorLoading:
68
68
  # Arrange
69
69
  no_plugin_path = os.path.join(temp_dir, "no_plugin.py")
70
70
  with open(no_plugin_path, "w") as f:
71
- f.write(
72
- """
71
+ f.write("""
73
72
  class NotAPlugin:
74
73
  pass
75
- """
76
- )
74
+ """)
77
75
 
78
76
  generator = PluginGenerator(no_plugin_path)
79
77
 
spaceforge/test_runner.py CHANGED
@@ -48,8 +48,7 @@ class TestPluginRunner:
48
48
 
49
49
  # Create a test plugin file
50
50
  with open(self.test_plugin_path, "w") as f:
51
- f.write(
52
- """
51
+ f.write("""
53
52
  from spaceforge import SpaceforgePlugin
54
53
 
55
54
  class TestRunnerPlugin(SpaceforgePlugin):
@@ -67,8 +66,7 @@ class TestRunnerPlugin(SpaceforgePlugin):
67
66
 
68
67
  def error_hook(self) -> None:
69
68
  raise ValueError("Test error from hook")
70
- """
71
- )
69
+ """)
72
70
 
73
71
  def teardown_method(self) -> None:
74
72
  """Cleanup test fixtures."""
@@ -112,12 +110,10 @@ class TestRunnerPlugin(SpaceforgePlugin):
112
110
  """Test loading plugin with no SpaceforgePlugin subclass."""
113
111
  no_plugin_path = os.path.join(self.temp_dir, "no_plugin.py")
114
112
  with open(no_plugin_path, "w") as f:
115
- f.write(
116
- """
113
+ f.write("""
117
114
  class NotAPlugin:
118
115
  pass
119
- """
120
- )
116
+ """)
121
117
 
122
118
  runner = PluginRunner(no_plugin_path)
123
119
 
@@ -234,8 +230,7 @@ class NotAPlugin:
234
230
  # Create a complete test plugin file
235
231
  full_plugin_path = os.path.join(self.temp_dir, "full_plugin.py")
236
232
  with open(full_plugin_path, "w") as f:
237
- f.write(
238
- '''
233
+ f.write('''
239
234
  from spaceforge import SpaceforgePlugin
240
235
 
241
236
  class FullTestPlugin(SpaceforgePlugin):
@@ -251,8 +246,7 @@ class FullTestPlugin(SpaceforgePlugin):
251
246
  """Integration test hook."""
252
247
  self.integration_test_passed = True
253
248
  return "success"
254
- '''
255
- )
249
+ ''')
256
250
 
257
251
  runner = PluginRunner(full_plugin_path)
258
252
 
@@ -276,15 +270,13 @@ class TestRunnerCommand:
276
270
 
277
271
  # Create a test plugin file
278
272
  with open(self.test_plugin_path, "w") as f:
279
- f.write(
280
- """
273
+ f.write("""
281
274
  from spaceforge import SpaceforgePlugin
282
275
 
283
276
  class ClickTestPlugin(SpaceforgePlugin):
284
277
  def after_plan(self) -> None:
285
278
  print("Hook executed via click")
286
- """
287
- )
279
+ """)
288
280
 
289
281
  def teardown_method(self) -> None:
290
282
  """Cleanup test fixtures."""
@@ -345,15 +337,13 @@ class TestMainFunction:
345
337
 
346
338
  # Create a test plugin file
347
339
  with open(self.test_plugin_path, "w") as f:
348
- f.write(
349
- """
340
+ f.write("""
350
341
  from spaceforge import SpaceforgePlugin
351
342
 
352
343
  class MainTestPlugin(SpaceforgePlugin):
353
344
  def after_plan(self) -> None:
354
345
  pass
355
- """
356
- )
346
+ """)
357
347
 
358
348
  def teardown_method(self) -> None:
359
349
  """Cleanup test fixtures."""
@@ -379,8 +369,7 @@ class TestRunnerEdgeCases:
379
369
  """Test plugin file with multiple SpaceforgePlugin subclasses."""
380
370
  multi_plugin_path = os.path.join(self.temp_dir, "multi_plugin.py")
381
371
  with open(multi_plugin_path, "w") as f:
382
- f.write(
383
- """
372
+ f.write("""
384
373
  from spaceforge import SpaceforgePlugin
385
374
 
386
375
  class FirstPlugin(SpaceforgePlugin):
@@ -390,8 +379,7 @@ class FirstPlugin(SpaceforgePlugin):
390
379
  class SecondPlugin(SpaceforgePlugin):
391
380
  def before_apply(self) -> None:
392
381
  pass
393
- """
394
- )
382
+ """)
395
383
 
396
384
  runner = PluginRunner(multi_plugin_path)
397
385
  runner.load_plugin()
@@ -407,8 +395,7 @@ class SecondPlugin(SpaceforgePlugin):
407
395
  """Test plugin with complex inheritance hierarchy."""
408
396
  hierarchy_plugin_path = os.path.join(self.temp_dir, "hierarchy_plugin.py")
409
397
  with open(hierarchy_plugin_path, "w") as f:
410
- f.write(
411
- """
398
+ f.write("""
412
399
  from spaceforge import SpaceforgePlugin
413
400
 
414
401
  class BaseCustomPlugin(SpaceforgePlugin):
@@ -418,8 +405,7 @@ class BaseCustomPlugin(SpaceforgePlugin):
418
405
  class DerivedPlugin(BaseCustomPlugin):
419
406
  def after_plan(self) -> None:
420
407
  self.base_method()
421
- """
422
- )
408
+ """)
423
409
 
424
410
  runner = PluginRunner(hierarchy_plugin_path)
425
411
  runner.load_plugin()
@@ -441,15 +427,13 @@ class DerivedPlugin(BaseCustomPlugin):
441
427
  """Test hook execution that returns a value."""
442
428
  return_plugin_path = os.path.join(self.temp_dir, "return_plugin.py")
443
429
  with open(return_plugin_path, "w") as f:
444
- f.write(
445
- """
430
+ f.write("""
446
431
  from spaceforge import SpaceforgePlugin
447
432
 
448
433
  class ReturnPlugin(SpaceforgePlugin):
449
434
  def after_plan(self) -> dict[str, str]:
450
435
  return {"status": "success", "data": "test"}
451
- """
452
- )
436
+ """)
453
437
 
454
438
  runner = PluginRunner(return_plugin_path)
455
439
  runner.load_plugin()
@@ -462,15 +446,13 @@ class ReturnPlugin(SpaceforgePlugin):
462
446
  """Test hook that expects arguments (should fail gracefully)."""
463
447
  args_plugin_path = os.path.join(self.temp_dir, "args_plugin.py")
464
448
  with open(args_plugin_path, "w") as f:
465
- f.write(
466
- """
449
+ f.write("""
467
450
  from spaceforge import SpaceforgePlugin
468
451
 
469
452
  class ArgsPlugin(SpaceforgePlugin):
470
453
  def after_plan(self, required_arg) -> None:
471
454
  pass
472
- """
473
- )
455
+ """)
474
456
 
475
457
  runner = PluginRunner(args_plugin_path)
476
458
  runner.load_plugin()
@@ -489,16 +471,14 @@ class ArgsPlugin(SpaceforgePlugin):
489
471
  """Test plugin loading when plugin imports fail."""
490
472
  import_error_path = os.path.join(self.temp_dir, "import_error_plugin.py")
491
473
  with open(import_error_path, "w") as f:
492
- f.write(
493
- """
474
+ f.write("""
494
475
  from nonexistent_module import SomeClass
495
476
  from spaceforge import SpaceforgePlugin
496
477
 
497
478
  class ImportErrorPlugin(SpaceforgePlugin):
498
479
  def after_plan(self) -> None:
499
480
  pass
500
- """
501
- )
481
+ """)
502
482
 
503
483
  runner = PluginRunner(import_error_path)
504
484
 
@@ -509,8 +489,7 @@ class ImportErrorPlugin(SpaceforgePlugin):
509
489
  """Test that running hooks preserves plugin instance state."""
510
490
  state_plugin_path = os.path.join(self.temp_dir, "state_plugin.py")
511
491
  with open(state_plugin_path, "w") as f:
512
- f.write(
513
- """
492
+ f.write("""
514
493
  from spaceforge import SpaceforgePlugin
515
494
 
516
495
  class StatePlugin(SpaceforgePlugin):
@@ -523,8 +502,7 @@ class StatePlugin(SpaceforgePlugin):
523
502
 
524
503
  def get_counter_hook(self) -> int:
525
504
  return self.counter
526
- """
527
- )
505
+ """)
528
506
 
529
507
  runner = PluginRunner(state_plugin_path)
530
508
  runner.load_plugin()
@@ -14,15 +14,13 @@ class TestRunnerClickCommand:
14
14
  # Arrange
15
15
  click_plugin_path = os.path.join(temp_dir, "click_plugin.py")
16
16
  with open(click_plugin_path, "w") as f:
17
- f.write(
18
- """
17
+ f.write("""
19
18
  from spaceforge import SpaceforgePlugin
20
19
 
21
20
  class ClickTestPlugin(SpaceforgePlugin):
22
21
  def after_plan(self):
23
22
  print("Hook executed via click")
24
- """
25
- )
23
+ """)
26
24
 
27
25
  # Act
28
26
  from click.testing import CliRunner
@@ -83,12 +83,10 @@ class TestPluginRunnerLoading:
83
83
  # Arrange
84
84
  no_plugin_path = os.path.join(temp_dir, "no_plugin.py")
85
85
  with open(no_plugin_path, "w") as f:
86
- f.write(
87
- """
86
+ f.write("""
88
87
  class NotAPlugin:
89
88
  pass
90
- """
91
- )
89
+ """)
92
90
 
93
91
  runner = PluginRunner(no_plugin_path)
94
92
 
@@ -35,8 +35,7 @@ class TestPluginRunnerExecution:
35
35
  # Arrange
36
36
  runner_plugin_path = os.path.join(temp_dir, "runner_plugin.py")
37
37
  with open(runner_plugin_path, "w") as f:
38
- f.write(
39
- """
38
+ f.write("""
40
39
  from spaceforge import SpaceforgePlugin
41
40
 
42
41
  class TestRunnerPlugin(SpaceforgePlugin):
@@ -46,8 +45,7 @@ class TestRunnerPlugin(SpaceforgePlugin):
46
45
 
47
46
  def after_plan(self):
48
47
  self.executed_hooks.append('after_plan')
49
- """
50
- )
48
+ """)
51
49
 
52
50
  runner = PluginRunner(runner_plugin_path)
53
51
  runner.load_plugin()
@@ -106,15 +104,13 @@ class TestRunnerPlugin(SpaceforgePlugin):
106
104
  # Arrange
107
105
  error_plugin_path = os.path.join(temp_dir, "error_plugin.py")
108
106
  with open(error_plugin_path, "w") as f:
109
- f.write(
110
- """
107
+ f.write("""
111
108
  from spaceforge import SpaceforgePlugin
112
109
 
113
110
  class ErrorPlugin(SpaceforgePlugin):
114
111
  def error_hook(self):
115
112
  raise ValueError("Test error from hook")
116
- """
117
- )
113
+ """)
118
114
 
119
115
  runner = PluginRunner(error_plugin_path)
120
116
  runner.load_plugin()
@@ -135,8 +131,7 @@ class ErrorPlugin(SpaceforgePlugin):
135
131
  # Arrange
136
132
  multi_hook_path = os.path.join(temp_dir, "multi_hook.py")
137
133
  with open(multi_hook_path, "w") as f:
138
- f.write(
139
- """
134
+ f.write("""
140
135
  from spaceforge import SpaceforgePlugin
141
136
 
142
137
  class MultiHookPlugin(SpaceforgePlugin):
@@ -149,8 +144,7 @@ class MultiHookPlugin(SpaceforgePlugin):
149
144
 
150
145
  def before_apply(self):
151
146
  self.executed_hooks.append('before_apply')
152
- """
153
- )
147
+ """)
154
148
 
155
149
  runner = PluginRunner(multi_hook_path)
156
150
  runner.load_plugin()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: A Python framework for building Spacelift plugins
5
5
  Author-email: Spacelift <support@spacelift.io>
6
6
  Maintainer-email: Spacelift <support@spacelift.io>
@@ -14,13 +14,12 @@ Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
21
  Classifier: Topic :: System :: Systems Administration
23
- Requires-Python: >=3.9
22
+ Requires-Python: >=3.10
24
23
  Description-Content-Type: text/markdown
25
24
  License-File: LICENSE
26
25
  Requires-Dist: PyYAML>=6.0
@@ -31,7 +30,7 @@ Requires-Dist: mergedeep>=1.3.4
31
30
  Provides-Extra: dev
32
31
  Requires-Dist: pytest>=6.0; extra == "dev"
33
32
  Requires-Dist: pytest-cov; extra == "dev"
34
- Requires-Dist: black; extra == "dev"
33
+ Requires-Dist: black>=26.1.0; extra == "dev"
35
34
  Requires-Dist: isort; extra == "dev"
36
35
  Requires-Dist: mypy; extra == "dev"
37
36
  Requires-Dist: pylint; extra == "dev"
@@ -2,32 +2,32 @@ spaceforge/README.md,sha256=gDyCQN0EW4xp8Skvs6J0qHpO9CjVTnRfSnhduAIFQs4,7717
2
2
  spaceforge/__init__.py,sha256=TU-vvm15dK1ucixNW0V42eTT72x3_hmKSyxP4MC1Occ,589
3
3
  spaceforge/__main__.py,sha256=UKbeCuEFgoNlEOX44-kYUAQuUdySdkAKsvbjXEyLeWI,965
4
4
  spaceforge/_version.py,sha256=70eCBV_uVCm0U7qrtYRUZM3GJnJRtvZQ_aPFLd8H7CI,1009
5
- spaceforge/_version_scm.py,sha256=vTBkgV8s9uBGLjgp067jeWVTh-Y6mBirMNSkXJot2J8,704
6
- spaceforge/cls.py,sha256=qe_-pQ9G7p6Hxv8FxNw9OwhPeMQk3vIS_SezxSoca2M,7644
5
+ spaceforge/_version_scm.py,sha256=0Oc4EBzGTJOvXX0Vym4evglW1NQPpe8RLn8TdxsKzfs,704
6
+ spaceforge/cls.py,sha256=JujaMYmB8n3LVeZITgAsKbRhnLJQHio9Dc-JHryVFog,7739
7
7
  spaceforge/conftest.py,sha256=J2BIqOu0VYpUlxnJf07cW6l2NHSzVvkXw18jKTTR3hE,2168
8
8
  spaceforge/generator.py,sha256=qOC9YeP9QmwFZQoe0BbvJb8RHtv3BVupYxvu2ceQMkE,18768
9
9
  spaceforge/plugin.py,sha256=Ytm2B7nnJNH231V4gUFY1pBmwVNTpIg3YviUL_Bnf24,14963
10
10
  spaceforge/runner.py,sha256=NNddgK_OsnQWx2YFcyTpAOWfFLBDUphufBVfXYEzfzM,3166
11
- spaceforge/schema.json,sha256=nZf438rSKThw64Au7-tmoVw8EYsb7OGhzLfInO31ddA,11328
11
+ spaceforge/schema.json,sha256=iYhx64wL4Qc2kVqKxs10bPTsnfkyWoBw_35j-knH4HA,11674
12
12
  spaceforge/test_cls.py,sha256=uDnEmgF7bHzu3FjMk4-boEuJqk_B5AWKMPiKgl83Onc,2777
13
- spaceforge/test_generator.py,sha256=Gm3IA-8ykwCbj1JMKe03mj5DMZSNFEtCz8ue0xKjUUs,32791
13
+ spaceforge/test_generator.py,sha256=a2g9WNP5y__c65T7wwQKKbf8Hqorcf0dxYfHZkmN56s,32701
14
14
  spaceforge/test_generator_binaries.py,sha256=X_7pPLGE45eQt-Kv9_ku__LsyLgOvViHc_BvVpSCMp0,7263
15
- spaceforge/test_generator_core.py,sha256=gOqRx0rnME-srGMHun4KidXMN-iaqfKKTyoQ0Tw6b9Q,6253
15
+ spaceforge/test_generator_core.py,sha256=MYBHqBM4abQ2vqNP6OAmPValbRRo0KmLEDDC7Lc12ts,6223
16
16
  spaceforge/test_generator_hooks.py,sha256=2lJs8dYlFb7QehWcYF0O4qg38s5UudEpzJyBi1XiS3k,2542
17
17
  spaceforge/test_generator_parameters.py,sha256=aZRNwYcogJqp2NiYrqEkuxDi2Z6Z2S1SVoejUvsHHCE,1948
18
18
  spaceforge/test_plugin.py,sha256=rZ4Uv_0lIR0qb1GFHkiosGO3WHTWhO7epz8INDxV8Q0,13018
19
19
  spaceforge/test_plugin_file_operations.py,sha256=B0qvIo5EcfKMiHLhBv-hAnpSonn83ojcmJHXasydojA,3782
20
20
  spaceforge/test_plugin_hooks.py,sha256=ugaVdzH1-heRJSJN0lu8zoqLcLPC3tg_PzUX98qu9Sw,1038
21
21
  spaceforge/test_plugin_inheritance.py,sha256=WHfvU5s-2GtfcI9-1bHXH7bacr77ikq68V3Z3BBQKvQ,3617
22
- spaceforge/test_runner.py,sha256=PWFiGsBSJ6QXL5OyGA_OoDIILtRaX1NDQnech15Ady0,17723
23
- spaceforge/test_runner_cli.py,sha256=qkklvRHETCmgKaVxPfUR_IBy7Vne5hKupAOK9igKqLA,2290
24
- spaceforge/test_runner_core.py,sha256=eNR9YOwJwv7LsMtNQ4WXXMPIW6RE_A7hUp4bCpzz1Rk,3941
25
- spaceforge/test_runner_execution.py,sha256=GJhoECdhIY2M3MWcmTrIYfkJd2P5n86zixO3FY38_CQ,5344
22
+ spaceforge/test_runner.py,sha256=JySj0NIF18zOpo-YMxXBxTmuYaSxkp8WHxNPnzZLb7c,17393
23
+ spaceforge/test_runner_cli.py,sha256=c_QM5sA4rl6cWKS6uOY5WI0UfuczfvwkXdBqouefLeY,2260
24
+ spaceforge/test_runner_core.py,sha256=G_4dt59r_AIpn8eCLWp1YNtJUQURfK3zAVyp-1kM8-A,3911
25
+ spaceforge/test_runner_execution.py,sha256=MjhlYQ0D4-o34uVfoblDQC53skdfk6YkS1w01YWjFig,5254
26
26
  spaceforge/templates/binary_install.sh.j2,sha256=xyq-ol6z8M4RJ107GAs5cdvudVV45JmhwExHovfCHMI,1544
27
27
  spaceforge/templates/ensure_spaceforge_and_run.sh.j2,sha256=OKrpZI-M1VU5rCdu7XMbBto7R-HV9lAImc3x3112vhY,580
28
- spaceforge-1.2.1.dist-info/licenses/LICENSE,sha256=qtl16T_VToz1-IpjGKSLCHsy_zmCFg2H5SkvJi85C4c,1065
29
- spaceforge-1.2.1.dist-info/METADATA,sha256=XNh0_CLGSEym4RDnjkVbm8Yo4MIeSzLSXOgTzz7IXLY,2345
30
- spaceforge-1.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
- spaceforge-1.2.1.dist-info/entry_points.txt,sha256=qawuuKBSNTGg-njnQnhxxFldFvXYAPej6bF_f3iyQ48,56
32
- spaceforge-1.2.1.dist-info/top_level.txt,sha256=eVw-Lw4Th0oHM8Gx1Y8YetyNgbNbMBU00yWs-kwGeSs,11
33
- spaceforge-1.2.1.dist-info/RECORD,,
28
+ spaceforge-1.3.0.dist-info/licenses/LICENSE,sha256=qtl16T_VToz1-IpjGKSLCHsy_zmCFg2H5SkvJi85C4c,1065
29
+ spaceforge-1.3.0.dist-info/METADATA,sha256=7s6M2M81_r6onHmn_Q4x-cB4tDQfouJNlWo3POeUC0U,2304
30
+ spaceforge-1.3.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
31
+ spaceforge-1.3.0.dist-info/entry_points.txt,sha256=qawuuKBSNTGg-njnQnhxxFldFvXYAPej6bF_f3iyQ48,56
32
+ spaceforge-1.3.0.dist-info/top_level.txt,sha256=eVw-Lw4Th0oHM8Gx1Y8YetyNgbNbMBU00yWs-kwGeSs,11
33
+ spaceforge-1.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5