fujin-cli 0.11.5__py3-none-any.whl → 0.12.1__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.

Potentially problematic release.


This version of fujin-cli might be problematic. Click here for more details.

fujin/__init__.py CHANGED
@@ -0,0 +1 @@
1
+ __version__ = "0.12.1"
fujin/__main__.py CHANGED
@@ -7,6 +7,7 @@ import sys
7
7
  from pathlib import Path
8
8
 
9
9
  import cappa
10
+ import fujin
10
11
 
11
12
  from fujin.commands.app import App
12
13
  from fujin.commands.config import ConfigCMD
@@ -50,9 +51,9 @@ class Fujin:
50
51
  def main():
51
52
  alias_cmd = _parse_aliases()
52
53
  if alias_cmd:
53
- cappa.invoke(Fujin, argv=alias_cmd, version="0.11.5")
54
+ cappa.invoke(Fujin, argv=alias_cmd, version=fujin.__version__)
54
55
  else:
55
- cappa.invoke(Fujin, version="0.11.5")
56
+ cappa.invoke(Fujin, version=fujin.__version__)
56
57
 
57
58
 
58
59
  def _parse_aliases() -> list[str] | None:
fujin/commands/_base.py CHANGED
@@ -2,6 +2,7 @@ import importlib
2
2
  from contextlib import contextmanager
3
3
  from dataclasses import dataclass
4
4
  from functools import cached_property
5
+ from typing import Generator
5
6
 
6
7
  import cappa
7
8
 
@@ -47,7 +48,7 @@ class BaseCommand:
47
48
  yield conn
48
49
 
49
50
  @contextmanager
50
- def app_environment(self) -> Connection:
51
+ def app_environment(self) -> Generator[Connection, None, None]:
51
52
  with self.connection() as conn:
52
53
  with conn.cd(self.app_dir):
53
54
  with conn.prefix("source .appenv"):
fujin/commands/deploy.py CHANGED
@@ -100,7 +100,7 @@ export PATH=".venv/bin:$PATH"
100
100
  conn.run(f"echo '{appenv.strip()}' > {self.app_dir}/.appenv")
101
101
  versioned_assets_dir = f"{self.app_dir}/v{version}"
102
102
  if not skip_setup:
103
- conn.run("rm -rf .venv")
103
+ conn.run("sudo rm -rf .venv")
104
104
  conn.run("uv venv")
105
105
  if self.config.requirements:
106
106
  conn.run(f"uv pip install -r {versioned_assets_dir}/requirements.txt")
fujin/config.py CHANGED
@@ -149,7 +149,9 @@ Path to the production environment file that will be copied to the host.
149
149
 
150
150
  env
151
151
  ~~~
152
- A string containing the production environment variables, ideal for scenarios where most variables are retrieved from secrets and you prefer not to use a separate file.
152
+ A string containing the production environment variables. In combination with the secrets manager, this is most useful when
153
+ you want to automate deployment through a CI/CD platform like GitLab CI or GitHub Actions. For an example of how to do this,
154
+ check out the `integrations guide </integrations.html>`_
153
155
 
154
156
  .. important::
155
157
 
fujin/connection.py CHANGED
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from contextlib import contextmanager
4
4
  from functools import partial
5
- from typing import TYPE_CHECKING
5
+ from typing import TYPE_CHECKING, Generator
6
6
 
7
7
  import cappa
8
8
  from fabric import Connection
@@ -32,7 +32,7 @@ def _get_watchers(host: HostConfig) -> list[Responder]:
32
32
 
33
33
 
34
34
  @contextmanager
35
- def host_connection(host: HostConfig) -> Connection:
35
+ def host_connection(host: HostConfig) -> Generator[Connection, None, None]:
36
36
  connect_kwargs = None
37
37
  if host.key_filename:
38
38
  connect_kwargs = {"key_filename": str(host.key_filename)}
fujin/hooks.py CHANGED
@@ -10,6 +10,7 @@ try:
10
10
  except ImportError:
11
11
  from enum import Enum
12
12
 
13
+
13
14
  class StrEnum(str, Enum):
14
15
  pass
15
16
 
@@ -36,9 +37,9 @@ class HookManager:
36
37
  if not hooks_folder.exists():
37
38
  return
38
39
  self.hooks = {
39
- h.value: f"./{hooks_folder / h.value}" # noqa
40
+ h: f"./{hooks_folder / h.value}"
40
41
  for h in Hook
41
- if (hooks_folder / h.value).exists() # noqa
42
+ if (hooks_folder / h.value).exists()
42
43
  }
43
44
 
44
45
  def _run_hook(self, type_: Hook) -> None:
fujin/systemd.py CHANGED
@@ -102,7 +102,7 @@ class ProcessManager:
102
102
  body = (
103
103
  local_config.read_text()
104
104
  if local_config.exists() and not ignore_local
105
- else template.format(**context, command=command)
105
+ else template.format(**context, command=command, process_name=name)
106
106
  )
107
107
  files.append((name, body))
108
108
  # if using unix then we are sure a web process was defined and the proxy is not dummy
@@ -1,7 +1,6 @@
1
1
  # All options are documented here https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
2
2
  [Unit]
3
3
  Description={app_name} {process_name}
4
- After=network.target
5
4
 
6
5
  [Service]
7
6
  User={user}
@@ -1,10 +1,13 @@
1
1
  # All options are documented here https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
2
2
  # Inspiration was taken from here https://docs.gunicorn.org/en/stable/deploy.html#systemd
3
3
  [Unit]
4
- Description={app_name} daemon
4
+ Description={app_name} {process_name}
5
+ Requires={app_name}.socket
5
6
  After=network.target
6
7
 
7
8
  [Service]
9
+ #Type=notify
10
+ #NotifyAccess=main
8
11
  User={user}
9
12
  Group={user}
10
13
  RuntimeDirectory={app_name}
@@ -19,4 +22,4 @@ PrivateTmp=true
19
22
  ProtectSystem=strict
20
23
 
21
24
  [Install]
22
- WantedBy=multi-user.target
25
+ WantedBy=multi-user.target
@@ -8,4 +8,4 @@ SocketGroup=www-data
8
8
  SocketMode=0660
9
9
 
10
10
  [Install]
11
- WantedBy=sockets.target
11
+ WantedBy=sockets.target
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fujin-cli
3
- Version: 0.11.5
3
+ Version: 0.12.1
4
4
  Summary: Get your project up and running in a few minutes on your own vps.
5
5
  Project-URL: Documentation, https://github.com/falcopackages/fujin#readme
6
6
  Project-URL: Issues, https://github.com/falcopackages/fujin/issues
@@ -1,15 +1,15 @@
1
- fujin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- fujin/__main__.py,sha256=e9T-E4qC1sIw315_sKpSVCYKScZFYCfig8ShNRyNagM,1849
3
- fujin/config.py,sha256=t7UnhQMl-wYDyFCIcOC5lLdfpSmYWDIRPHvozoSoVME,11707
4
- fujin/connection.py,sha256=LL7LhX9p0X9FmiGdlSroD3Ht216QY0Kd51xkSrXmM3s,2479
1
+ fujin/__init__.py,sha256=PAuBI8I6F9Yu_86XjI2yaWn8QmCd9ZvK7tkZLWvEg-Q,23
2
+ fujin/__main__.py,sha256=KesDQurQ6HNMWBlxBLiSesgLHr6roUko3lgVh1pQNu8,1880
3
+ fujin/config.py,sha256=veZyJ-s8mgk6yMsyBtoRUEbetjCS4d06Xi-_TTQHwOY,11844
4
+ fujin/connection.py,sha256=lL_YBpoQarqhwFb5AIFK6_RQBloXFl9Phyua1mLXSD0,2513
5
5
  fujin/errors.py,sha256=74Rh-Sgql1YspPdR_akQ2G3xZ48zecyafYCptpaFo1A,73
6
- fujin/hooks.py,sha256=EDVYNozlDJ5kc1xHtZrXgtuKplUMEMPTp65TLMP02Ek,1449
7
- fujin/systemd.py,sha256=aWfN3CDl_NACjsfzyiVmO2h0-VTgc7y3g8RMG2jVsb4,6640
6
+ fujin/hooks.py,sha256=-iTnWToDq6vg-qQPhay4IzZaSLKDxCHrpPvNX615BEU,1428
7
+ fujin/systemd.py,sha256=pHhnIkQppR9d_usP942DcSinADl-jpghPg-0jjvB3S4,6659
8
8
  fujin/commands/__init__.py,sha256=g0b13vzidPUbxne_Zo_Wv5jpEmwCiSK4AokCinH9uo4,39
9
- fujin/commands/_base.py,sha256=2k9HGcxskFZQ7qYw8hcJh_73EZ_qVngLot7lOo2hQuw,2193
9
+ fujin/commands/_base.py,sha256=lVIqlZsfM9cMbo4U3bK91n6YyWkLOBkkeIKoUk1cJt0,2245
10
10
  fujin/commands/app.py,sha256=mazb4dCTdR5juh79bL3a9b68Nd6O8u_nR9IgYqQlqWE,5279
11
11
  fujin/commands/config.py,sha256=WymGla-H2yduhLcYE1Nb6IJaFIj0S0KIhV9fBDCKsAw,2779
12
- fujin/commands/deploy.py,sha256=AylcVNX47ekf-AFfQrYcSh86I3qltADEgjPtV9lQAfE,5831
12
+ fujin/commands/deploy.py,sha256=aCMBLN3SnZENQm8DrtZzhP4OlaIbpGJJQWHvsAae2wg,5836
13
13
  fujin/commands/docs.py,sha256=b5FZ8AgoAfn4q4BueEQvM2w5HCuh8-rwBqv_CRFVU8E,349
14
14
  fujin/commands/down.py,sha256=aw_mxl_TMC66plKTXwlYP1W2XQBmHeROltQqOpQssyE,1577
15
15
  fujin/commands/init.py,sha256=9yrja4YYFlJqEarN0ekg6yPd5niifPwvQ4i4wnC55a0,4007
@@ -29,14 +29,11 @@ fujin/secrets/bitwarden.py,sha256=01GZL5hYwZzL6yXy5ab3L3kgBFBeOT8i3Yg9GC8YwFU,20
29
29
  fujin/secrets/dopppler.py,sha256=t5SGfyuA0RxsD9uvrAu4cG2TBDIUgB5gb6XYXPrd61Y,724
30
30
  fujin/secrets/onepassword.py,sha256=6Xj3XWttKfcjMbcoMZvXVpJW1KHxlD785DysmX_mqvk,654
31
31
  fujin/secrets/system.py,sha256=Z5uNc2V3rcR75ffBnOsJywndoWuDcih88O9nPXIJ3U0,382
32
- fujin/templates/simple.service,sha256=ySlLqF354UCvlQaJcEVj4jf4hK7aKAq9qseE6pmtXJI,350
33
- fujin/templates/web.service,sha256=D3vHOHdP3wrZueKuhlhkB4syOCVvGSciDsNsmU_Bp68,626
34
- fujin/templates/web.socket,sha256=2lJsiOHlMJL0YlN7YBLLnr5zqsytPEt81yP34nk0dmc,173
35
- fujin/templates/granian/web.service,sha256=D3vHOHdP3wrZueKuhlhkB4syOCVvGSciDsNsmU_Bp68,626
36
- fujin/templates/gunicorn/web.service,sha256=EfTJQP4VvwlOTDyVCch5Y7iVhpPvZVaRWE6MHI4_z4k,683
37
- fujin/templates/gunicorn/web.socket,sha256=2lJsiOHlMJL0YlN7YBLLnr5zqsytPEt81yP34nk0dmc,173
38
- fujin_cli-0.11.5.dist-info/METADATA,sha256=SMsJ4wtSPlaJJtLU1erFIYzE8gZWp5Bw5fB-ZpCeYI8,4603
39
- fujin_cli-0.11.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
40
- fujin_cli-0.11.5.dist-info/entry_points.txt,sha256=Y_TBtKt3j11qhwquMexZR5yqnDEqOBDACtresqQFE-s,46
41
- fujin_cli-0.11.5.dist-info/licenses/LICENSE.txt,sha256=0QF8XfuH0zkIHhSet6teXfiCze6JSdr8inRkmLLTDyo,1099
42
- fujin_cli-0.11.5.dist-info/RECORD,,
32
+ fujin/templates/simple.service,sha256=1Hp8GfpBevULTaBMHAimdBPPee4W1tStQyKP2xQ0hHE,329
33
+ fujin/templates/web.service,sha256=oOWLWonMl258xxNCYwGXHta427D86p2rH15cxkpHcLc,692
34
+ fujin/templates/web.socket,sha256=f-gq8g1loYkWEDq_30sNtgDdPX0lwddK0jQDQzHLuus,172
35
+ fujin_cli-0.12.1.dist-info/METADATA,sha256=91_DkybCmIOX6s2r0jxkV39IisQQwsV7hSQCnhatR1M,4603
36
+ fujin_cli-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
37
+ fujin_cli-0.12.1.dist-info/entry_points.txt,sha256=Y_TBtKt3j11qhwquMexZR5yqnDEqOBDACtresqQFE-s,46
38
+ fujin_cli-0.12.1.dist-info/licenses/LICENSE.txt,sha256=0QF8XfuH0zkIHhSet6teXfiCze6JSdr8inRkmLLTDyo,1099
39
+ fujin_cli-0.12.1.dist-info/RECORD,,
@@ -1,22 +0,0 @@
1
- # All options are documented here https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
2
- # Inspiration was taken from here https://docs.gunicorn.org/en/stable/deploy.html#systemd
3
- [Unit]
4
- Description={app_name} daemon
5
- After=network.target
6
-
7
- [Service]
8
- User={user}
9
- Group={user}
10
- RuntimeDirectory={app_name}
11
- WorkingDirectory={app_dir}
12
- ExecStart={app_dir}/{command}
13
- EnvironmentFile={app_dir}/.env
14
- ExecReload=/bin/kill -s HUP $MAINPID
15
- KillMode=mixed
16
- TimeoutStopSec=5
17
- PrivateTmp=true
18
- # if your app does not need administrative capabilities, let systemd know
19
- ProtectSystem=strict
20
-
21
- [Install]
22
- WantedBy=multi-user.target
@@ -1,25 +0,0 @@
1
- # All options are documented here https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
2
- # Inspiration was taken from here https://docs.gunicorn.org/en/stable/deploy.html#systemd
3
- [Unit]
4
- Description={app_name} daemon
5
- Requires={app_name}.socket
6
- After=network.target
7
-
8
- [Service]
9
- Type=notify
10
- NotifyAccess=main
11
- User={user}
12
- Group={user}
13
- RuntimeDirectory={app_name}
14
- WorkingDirectory={app_dir}
15
- ExecStart={app_dir}/{command}
16
- EnvironmentFile={app_dir}/.env
17
- ExecReload=/bin/kill -s HUP $MAINPID
18
- KillMode=mixed
19
- TimeoutStopSec=5
20
- PrivateTmp=true
21
- # if your app does not need administrative capabilities, let systemd know
22
- ProtectSystem=strict
23
-
24
- [Install]
25
- WantedBy=multi-user.target
@@ -1,11 +0,0 @@
1
- [Unit]
2
- Description={app_name} socket
3
-
4
- [Socket]
5
- ListenStream=/run/{app_name}.sock
6
- SocketUser=www-data
7
- SocketGroup=www-data
8
- SocketMode=0660
9
-
10
- [Install]
11
- WantedBy=sockets.target