shipit-cli 0.6.1__py3-none-any.whl → 0.7.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.
@@ -1,9 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  import re
4
5
  from pathlib import Path
5
6
  from typing import Dict, Optional, Set
6
7
  from enum import Enum
8
+ from functools import cached_property
7
9
 
8
10
  from .base import (
9
11
  DetectResult,
@@ -12,6 +14,8 @@ from .base import (
12
14
  _exists,
13
15
  MountSpec,
14
16
  ServiceSpec,
17
+ VolumeSpec,
18
+ CustomCommands,
15
19
  )
16
20
 
17
21
 
@@ -47,10 +51,12 @@ class PythonProvider:
47
51
  uses_pandoc: bool = False
48
52
  only_build: bool = False
49
53
  install_requires_all_files: bool = False
54
+ custom_commands: CustomCommands
50
55
 
51
56
  def __init__(
52
57
  self,
53
58
  path: Path,
59
+ custom_commands: CustomCommands,
54
60
  only_build: bool = False,
55
61
  extra_dependencies: Optional[Set[str]] = None,
56
62
  ):
@@ -62,6 +68,7 @@ class PythonProvider:
62
68
  self.default_python_version = python_version
63
69
  self.extra_dependencies = set()
64
70
  self.only_build = only_build
71
+ self.custom_commands = custom_commands
65
72
  self.extra_dependencies = extra_dependencies or set()
66
73
 
67
74
  if self.only_build:
@@ -116,6 +123,11 @@ class PythonProvider:
116
123
  if "pandoc" in found_deps:
117
124
  self.uses_pandoc = True
118
125
 
126
+ if self.custom_commands.start and self.custom_commands.start.startswith("uvicorn "):
127
+ self.server = PythonServer.Uvicorn
128
+ self.custom_commands.start = self.custom_commands.start.replace("uvicorn ", "python -m uvicorn ")
129
+ self.extra_dependencies = {"uvicorn"}
130
+
119
131
  # Set framework
120
132
  if _exists(self.path, "manage.py") and ("django" in found_deps):
121
133
  framework = PythonFramework.Django
@@ -198,11 +210,14 @@ class PythonProvider:
198
210
  return "python"
199
211
 
200
212
  @classmethod
201
- def detect(cls, path: Path) -> Optional[DetectResult]:
213
+ def detect(cls, path: Path, custom_commands: CustomCommands) -> Optional[DetectResult]:
202
214
  if _exists(path, "pyproject.toml", "requirements.txt"):
203
215
  if _exists(path, "manage.py"):
204
216
  return DetectResult(cls.name(), 70)
205
217
  return DetectResult(cls.name(), 50)
218
+ if custom_commands.start:
219
+ if custom_commands.start.startswith("python ") or custom_commands.start.startswith("uv ") or custom_commands.start.startswith("uvicorn "):
220
+ return DetectResult(cls.name(), 80)
206
221
  return None
207
222
 
208
223
  def initialize(self) -> None:
@@ -261,7 +276,8 @@ class PythonProvider:
261
276
  'python_extra_index_url = getenv("SHIPIT_PYTHON_EXTRA_INDEX_URL")\n'
262
277
  'precompile_python = getenv("SHIPIT_PYTHON_PRECOMPILE") in ["true", "True", "TRUE", "1", "on", "yes", "y", "Y", "YES", "On", "ON"]\n'
263
278
  'python_cross_packages_path = venv["build"] + f"/lib/python{python_version}/site-packages"\n'
264
- 'python_serve_path = "{}/lib/python{}/site-packages".format(venv["serve"], python_version)\n'
279
+ 'python_serve_site_packages_path = "{}/lib/python{}/site-packages".format(venv["serve"], python_version)\n'
280
+ 'app_serve_path = app["serve"]\n'
265
281
  )
266
282
 
267
283
  def build_steps(self) -> list[str]:
@@ -278,6 +294,17 @@ class PythonProvider:
278
294
  if _exists(self.path, "uv.lock"):
279
295
  input_files.append("uv.lock")
280
296
  extra_args = " --locked"
297
+
298
+ # Extra input files check, as glob pattern
299
+ globs = ["README*", "LICENSE*", "LICENCE*", "MAINTAINERS*", "AUTHORS*"]
300
+ # Glob check
301
+ for glob in globs:
302
+ for path in self.path.glob(glob):
303
+ # make path relative to self.path
304
+ path = str(path.relative_to(self.path))
305
+ input_files.append(path)
306
+
307
+ # Join inputs
281
308
  inputs = ", ".join([f'"{input}"' for input in input_files])
282
309
  steps += [
283
310
  'env(UV_PROJECT_ENVIRONMENT=local_venv["build"] if cross_platform else venv["build"])',
@@ -290,7 +317,7 @@ class PythonProvider:
290
317
  ]
291
318
  if not self.only_build:
292
319
  steps += [
293
- 'run(f"uv pip compile pyproject.toml --python-version={python_version} --universal --extra-index-url {python_extra_index_url} --index-url=https://pypi.org/simple --emit-index-url --only-binary :all: -o cross-requirements.txt", outputs=["cross-requirements.txt"]) if cross_platform else None',
320
+ 'run(f"uv pip compile pyproject.toml --python-version={python_version} --universal --extra-index-url {python_extra_index_url} --index-url=https://pypi.org/simple --emit-index-url -o cross-requirements.txt", outputs=["cross-requirements.txt"]) if cross_platform else None',
294
321
  f'run(f"uvx pip install -r cross-requirements.txt {extra_deps} --target {{python_cross_packages_path}} --platform {{cross_platform}} --only-binary=:all: --python-version={{python_version}} --compile") if cross_platform else None',
295
322
  'run("rm cross-requirements.txt") if cross_platform else None',
296
323
  ]
@@ -310,7 +337,7 @@ class PythonProvider:
310
337
  ]
311
338
  if not self.only_build:
312
339
  steps += [
313
- 'run(f"uv pip compile requirements.txt --python-version={python_version} --universal --extra-index-url {python_extra_index_url} --index-url=https://pypi.org/simple --emit-index-url --only-binary :all: -o cross-requirements.txt", inputs=["requirements.txt"], outputs=["cross-requirements.txt"]) if cross_platform else None',
340
+ 'run(f"uv pip compile requirements.txt --python-version={python_version} --universal --extra-index-url {python_extra_index_url} --index-url=https://pypi.org/simple --emit-index-url -o cross-requirements.txt", inputs=["requirements.txt"], outputs=["cross-requirements.txt"]) if cross_platform else None',
314
341
  f'run(f"uvx pip install -r cross-requirements.txt {extra_deps} --target {{python_cross_packages_path}} --platform {{cross_platform}} --only-binary=:all: --python-version={{python_version}} --compile") if cross_platform else None',
315
342
  'run("rm cross-requirements.txt") if cross_platform else None',
316
343
  ]
@@ -331,12 +358,13 @@ class PythonProvider:
331
358
  return []
332
359
  return [
333
360
  'run("echo \\"Precompiling Python code...\\"") if precompile_python else None',
334
- 'run(f"python -m compileall -o 2 {python_serve_path}") if precompile_python else None',
361
+ 'run(f"python -m compileall -o 2 {python_serve_site_packages_path}") if precompile_python else None',
335
362
  'run("echo \\"Precompiling package code...\\"") if precompile_python else None',
336
- 'run("python -m compileall -o 2 {}".format(app["serve"])) if precompile_python else None',
363
+ 'run(f"python -m compileall -o 2 {app_serve_path}") if precompile_python else None',
337
364
  ]
338
365
 
339
- def get_main_file(self) -> Optional[str]:
366
+ @cached_property
367
+ def main_file(self) -> Optional[str]:
340
368
  paths_to_try = ["main.py", "app.py", "streamlit_app.py", "Home.py", "*_app.py"]
341
369
  for path in paths_to_try:
342
370
  if "*" in path:
@@ -347,14 +375,20 @@ class PythonProvider:
347
375
  return f"src/{path}"
348
376
  for path in paths_to_try:
349
377
  try:
350
- found_path = next(self.path.glob(f"**/{path}.py"))
378
+ found_path = next(self.path.glob(f"**/{path}"))
351
379
  except StopIteration:
352
380
  found_path = None
353
381
  if found_path:
354
- return found_path.relative_to(self.path)
382
+ return str(found_path.relative_to(self.path))
355
383
  return None
356
384
 
357
385
  def commands(self) -> Dict[str, str]:
386
+ commands = self.base_commands()
387
+ if self.custom_commands.start:
388
+ commands["start"] = json.dumps(self.custom_commands.start)
389
+ return commands
390
+
391
+ def base_commands(self) -> Dict[str, str]:
358
392
  if self.only_build:
359
393
  return {}
360
394
  if self.framework == PythonFramework.Django:
@@ -379,7 +413,7 @@ class PythonProvider:
379
413
  migrate_cmd = '"python manage.py migrate"'
380
414
  return {"start": start_cmd, "after_deploy": migrate_cmd}
381
415
 
382
- main_file = self.get_main_file()
416
+ main_file = self.main_file
383
417
 
384
418
  if not main_file:
385
419
  start_cmd = '"python -c \'print(\\"No start command detected, please provide a start command manually\\")\'"'
@@ -422,9 +456,6 @@ class PythonProvider:
422
456
 
423
457
  return {"start": start_cmd}
424
458
 
425
- def assets(self) -> Optional[Dict[str, str]]:
426
- return None
427
-
428
459
  def mounts(self) -> list[MountSpec]:
429
460
  if self.only_build:
430
461
  return [
@@ -436,12 +467,21 @@ class PythonProvider:
436
467
  MountSpec("local_venv", attach_to_serve=False),
437
468
  ]
438
469
 
470
+ def volumes(self) -> list[VolumeSpec]:
471
+ return []
472
+
439
473
  def env(self) -> Optional[Dict[str, str]]:
440
474
  if self.only_build:
441
475
  return {}
442
476
  # For Django projects, generate an empty env dict to surface the field
443
477
  # in the Shipit file. Other Python projects omit it by default.
444
- env_vars = {"PYTHONPATH": "python_serve_path", "HOME": 'app["serve"]'}
478
+ python_path = "f\"{app_serve_path}:{python_serve_site_packages_path}\""
479
+ main_file = self.main_file
480
+ if main_file and main_file.startswith("src/"):
481
+ python_path = "f\"{app_serve_path}:{app_serve_path}/src:{python_serve_site_packages_path}\""
482
+ else:
483
+ python_path = "f\"{app_serve_path}:{python_serve_site_packages_path}\""
484
+ env_vars = {"PYTHONPATH": python_path, "HOME": 'app["serve"]'}
445
485
  if self.framework == PythonFramework.Streamlit:
446
486
  env_vars["STREAMLIT_SERVER_HEADLESS"] = '"true"'
447
487
  elif self.framework == PythonFramework.MCP:
@@ -6,6 +6,7 @@ from .hugo import HugoProvider
6
6
  from .laravel import LaravelProvider
7
7
  from .mkdocs import MkdocsProvider
8
8
  from .node_static import NodeStaticProvider
9
+ from .wordpress import WordPressProvider
9
10
  from .php import PhpProvider
10
11
  from .python import PythonProvider
11
12
  from .staticfile import StaticFileProvider
@@ -19,6 +20,7 @@ def providers() -> list[type[Provider]]:
19
20
  HugoProvider,
20
21
  MkdocsProvider,
21
22
  PythonProvider,
23
+ WordPressProvider,
22
24
  PhpProvider,
23
25
  NodeStaticProvider,
24
26
  StaticFileProvider,
@@ -3,25 +3,37 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
  from typing import Dict, Optional
5
5
 
6
- from .base import DetectResult, DependencySpec, Provider, _exists, MountSpec, ServiceSpec
6
+ from .base import (
7
+ DetectResult,
8
+ DependencySpec,
9
+ Provider,
10
+ _exists,
11
+ MountSpec,
12
+ ServiceSpec,
13
+ VolumeSpec,
14
+ CustomCommands,
15
+ )
7
16
 
8
17
 
9
18
  class StaticFileProvider:
10
- def __init__(self, path: Path):
19
+ def __init__(self, path: Path, custom_commands: CustomCommands):
11
20
  self.path = path
21
+ self.custom_commands = custom_commands
12
22
 
13
23
  @classmethod
14
24
  def name(cls) -> str:
15
25
  return "staticfile"
16
26
 
17
27
  @classmethod
18
- def detect(cls, path: Path) -> Optional[DetectResult]:
28
+ def detect(cls, path: Path, custom_commands: CustomCommands) -> Optional[DetectResult]:
19
29
  if _exists(path, "Staticfile"):
20
30
  return DetectResult(cls.name(), 50)
21
31
  if _exists(path, "index.html") and not _exists(
22
32
  path, "package.json", "pyproject.toml", "composer.json"
23
33
  ):
24
34
  return DetectResult(cls.name(), 10)
35
+ if custom_commands.start and custom_commands.start.startswith("static-web-server "):
36
+ return DetectResult(cls.name(), 70)
25
37
  return None
26
38
 
27
39
  def initialize(self) -> None:
@@ -60,12 +72,12 @@ class StaticFileProvider:
60
72
  "start": '"static-web-server --root={} --log-level=info".format(app["serve"])'
61
73
  }
62
74
 
63
- def assets(self) -> Optional[Dict[str, str]]:
64
- return None
65
-
66
75
  def mounts(self) -> list[MountSpec]:
67
76
  return [MountSpec("app")]
68
77
 
78
+ def volumes(self) -> list[VolumeSpec]:
79
+ return []
80
+
69
81
  def env(self) -> Optional[Dict[str, str]]:
70
82
  return None
71
83
 
@@ -0,0 +1,88 @@
1
+ from __future__ import annotations
2
+ from shipit.providers.php import PhpProvider
3
+
4
+ from pathlib import Path
5
+ from typing import Dict, Optional
6
+
7
+ from .base import (
8
+ DetectResult,
9
+ DependencySpec,
10
+ Provider,
11
+ _exists,
12
+ MountSpec,
13
+ ServiceSpec,
14
+ VolumeSpec,
15
+ CustomCommands,
16
+ )
17
+ from .php import PhpProvider
18
+
19
+
20
+ class WordPressProvider(PhpProvider):
21
+ def __init__(self, path: Path, custom_commands: CustomCommands):
22
+ self.path = path
23
+ self.custom_commands = custom_commands
24
+
25
+ @classmethod
26
+ def name(cls) -> str:
27
+ return "wordpress"
28
+
29
+ @classmethod
30
+ def detect(cls, path: Path, custom_commands: CustomCommands) -> Optional[DetectResult]:
31
+ if _exists(path, "wp-content") and _exists(path, "index.php") and _exists(path, "wp-load.php"):
32
+ return DetectResult(cls.name(), 80)
33
+ return None
34
+
35
+ def initialize(self) -> None:
36
+ pass
37
+
38
+ def serve_name(self) -> str:
39
+ return self.path.name
40
+
41
+ def provider_kind(self) -> str:
42
+ return "php"
43
+
44
+ def dependencies(self) -> list[DependencySpec]:
45
+ return [
46
+ *super().dependencies(),
47
+ DependencySpec("bash", use_in_build=False, use_in_serve=True),
48
+ ]
49
+
50
+ def declarations(self) -> Optional[str]:
51
+ return super().declarations() + (
52
+ "wp_cli_version = getenv(\"SHIPIT_WPCLI_VERSION\")\n"
53
+ "if wp_cli_version:\n"
54
+ " wp_cli_download_url = f\"https://github.com/wp-cli/wp-cli/releases/download/v{wp_cli_version}/wp-cli-{wp_cli_version}.phar\"\n"
55
+ "else:\n"
56
+ " wp_cli_download_url = \"https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar\"\n"
57
+ )
58
+
59
+ def build_steps(self) -> list[str]:
60
+ steps = [
61
+ 'copy(wp_cli_download_url, "{}/wp-cli.phar".format(assets["build"]))',
62
+ 'copy("wordpress/install.sh", "{}/wordpress-install.sh".format(assets["build"]), base="assets")',
63
+ ]
64
+ if not _exists(self.path, "wp-config.php"):
65
+ steps.append('copy("wordpress/wp-config.php", "{}/wp-config.php".format(app["build"]), base="assets")')
66
+ return steps + super().build_steps()
67
+
68
+ def prepare_steps(self) -> Optional[list[str]]:
69
+ return super().prepare_steps()
70
+
71
+ def commands(self) -> Dict[str, str]:
72
+ return {
73
+ "start": '"php -S localhost:8080 -t ."',
74
+ "wp": '"php {}/wp-cli.phar --allow-root --path={}".format(assets[\"serve\"], app[\"serve\"])',
75
+ "after_deploy": '"bash {}/wordpress-install.sh".format(assets["serve"])',
76
+ }
77
+
78
+ def mounts(self) -> list[MountSpec]:
79
+ return super().mounts()
80
+
81
+ def volumes(self) -> list[VolumeSpec]:
82
+ return [VolumeSpec(name="wp-content", serve_path="\"{}/wp-content/\".format(app[\"serve\"])", var_name="wp_content")]
83
+
84
+ def env(self) -> Optional[Dict[str, str]]:
85
+ return None
86
+
87
+ def services(self) -> list[ServiceSpec]:
88
+ return [ServiceSpec(name="database", provider="mysql")]
shipit/version.py CHANGED
@@ -1,5 +1,5 @@
1
1
  __all__ = ["version", "version_info"]
2
2
 
3
3
 
4
- version = "0.6.1"
5
- version_info = (0, 6, 1, "final", 0)
4
+ version = "0.7.0"
5
+ version_info = (0, 7, 0, "final", 0)
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shipit-cli
3
- Version: 0.6.1
3
+ Version: 0.7.0
4
4
  Summary: Add your description here
5
5
  Project-URL: homepage, https://wasmer.io
6
6
  Project-URL: repository, https://github.com/wasmerio/shipit
7
7
  Project-URL: Changelog, https://github.com/wasmerio/shipit/changelog
8
8
  Requires-Python: >=3.10
9
9
  Requires-Dist: pyyaml>=6.0.2
10
+ Requires-Dist: requests>=2.32.5
10
11
  Requires-Dist: rich>=14.1.0
11
12
  Requires-Dist: sh>=2.2.2
12
13
  Requires-Dist: starlark-pyo3>=2025.1
@@ -0,0 +1,24 @@
1
+ shipit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ shipit/cli.py,sha256=cLWFBrY24w--GQj_YtRo7U7jnGITEG_TWo4D9W6XH1Q,57549
3
+ shipit/env.py,sha256=Bede00-iFI67RZ0bx92JyX49XL7Q91HK-QoKRpwPaGQ,725
4
+ shipit/generator.py,sha256=GFsuqZG83gn7yxphE4GHwZjEB3sToJn24yNDE-zrTtM,6400
5
+ shipit/procfile.py,sha256=GlfdwzFUr0GWGKaaiXlLKNFInWaRNMy_wN14UEyU_5Q,2974
6
+ shipit/version.py,sha256=myhj6JcZUHlBRvAyfRYaJ_bv3PrzoXvUd5ppXAZh014,95
7
+ shipit/assets/php/php.ini,sha256=f4irndAjB4GuuouEImRkNV22Q-yw1KqR-43jAMDw730,2531
8
+ shipit/assets/wordpress/install.sh,sha256=GOIwJX3qPp7VuZXjkKVFFY6Mo9k7VFWfobS6aZYitPg,817
9
+ shipit/assets/wordpress/wp-config.php,sha256=IdGQoeg8E89JiqwxO2i8WnGMzmhNWgRz80X6lbU5GXc,4134
10
+ shipit/providers/base.py,sha256=-lraLhnXtc2SfYNIUiyry7xD2NL4q0n6voNjr6qfRis,2994
11
+ shipit/providers/gatsby.py,sha256=kzfS-z040GaJ0a9u2_6S6K-ykGSX2yPG17VpjUWBOBA,2393
12
+ shipit/providers/hugo.py,sha256=BvSYTDTVxHz6FW2mA4sqIsNayFRo5BK6Z4tWFRRimmY,1644
13
+ shipit/providers/laravel.py,sha256=yhOnaaXZ2US8EO5ZD5pBTerSOBi9IWBBIqeQrbW7YoM,3028
14
+ shipit/providers/mkdocs.py,sha256=pWTeIUEnSyB653s7Cw_OSllgiSGcDymRTEHgV5ChDLM,2070
15
+ shipit/providers/node_static.py,sha256=QVUTTZbvUGtj2yT9WTbGmuM30rJzejnp76crIqSGA7o,2564
16
+ shipit/providers/php.py,sha256=JIWl5CdVEdf9DAr9O9rR8NucucYCj_M5PbJRw_SnmYU,3541
17
+ shipit/providers/python.py,sha256=n0748miZ5RpQyQUCmkq3_G2Nnub8SaogZoJTNNFalZc,20801
18
+ shipit/providers/registry.py,sha256=lHUViVuPJf1OIZD8I_NTX4LP7E3Uo5-MmLfarmAA_cM,729
19
+ shipit/providers/staticfile.py,sha256=O1D0cXa_cFZH4OXRFLjBG3e-LbjMDo7ZBC2D3CvrPo4,2218
20
+ shipit/providers/wordpress.py,sha256=wMIcBpICqcEpbOgJCufrnM-r76AVI7_xC-NUlh9XMmE,3016
21
+ shipit_cli-0.7.0.dist-info/METADATA,sha256=Ang6CnPqUUcKRovpIAMHMsnccw640bQUYlpPOZ3MNoA,494
22
+ shipit_cli-0.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
23
+ shipit_cli-0.7.0.dist-info/entry_points.txt,sha256=7AE1NjSrHaSDfbfsRRO50KKnHFTbB0Imsccd1WynzAQ,72
24
+ shipit_cli-0.7.0.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- shipit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- shipit/cli.py,sha256=9L2BIxwZsRrOOR5hIw75NhQWlFqXchMlrbS7qslGWfs,53264
3
- shipit/generator.py,sha256=7kOUUDdibUM8-KRUJJugyVLAdu9UIAtWEe6aU6NVajU,6106
4
- shipit/version.py,sha256=Ct7YXXUESk4JUZghzhEdPrW4vt9J9zlnrxuYtQ5snpI,95
5
- shipit/assets/php/php.ini,sha256=f4irndAjB4GuuouEImRkNV22Q-yw1KqR-43jAMDw730,2531
6
- shipit/providers/base.py,sha256=WyVazgB1otGiTXOezYmvqPOm1Nt6mYdLvflSiZrXT7g,2593
7
- shipit/providers/gatsby.py,sha256=2m00AuiuacOgJpDMjp5v7WIG9kC9RGKFBG6-rzwbiW0,2219
8
- shipit/providers/hugo.py,sha256=YtOmPw4KaE3f8GnPjzLrO3IxlEATCvkc86HOlKDPfMc,1520
9
- shipit/providers/laravel.py,sha256=1RrwReqDU5OL2NDRKIJEITP3V_M1fC7jndsLN08zW4Y,2858
10
- shipit/providers/mkdocs.py,sha256=jkBMgkcIyGYBC56m9OzpgaqDy1rdQ0xLpo6nKdqOkZQ,1931
11
- shipit/providers/node_static.py,sha256=unjswalAp-KX1xnexzpPOyN5Qls00Cvi1MK7lBbYkKQ,2390
12
- shipit/providers/php.py,sha256=nvB4JHwCxyRbayj3waEHicjATE8C0KxtRnwJuZ7mvFY,2675
13
- shipit/providers/python.py,sha256=dPKOaxbzUaK1_2LiBpOPZlKfU4dlcac-rWDCew69JKE,18968
14
- shipit/providers/registry.py,sha256=UisII1dr24ZxmDD8GnpTsyNwPN9W8MnAHQ1Px1iJ-OQ,661
15
- shipit/providers/staticfile.py,sha256=m1rzbCRO7YWdUH6j0HSMp8OMBktdfwoY_PhFNYe71Xk,1908
16
- shipit_cli-0.6.1.dist-info/METADATA,sha256=Z9h1DnDBU-3cbqzZ2W0gCce6volmhcDoktd-Atp3C4I,462
17
- shipit_cli-0.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
18
- shipit_cli-0.6.1.dist-info/entry_points.txt,sha256=7AE1NjSrHaSDfbfsRRO50KKnHFTbB0Imsccd1WynzAQ,72
19
- shipit_cli-0.6.1.dist-info/RECORD,,