procd 1.0.0__tar.gz → 1.0.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: procd
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: The Native Stack Runner. Orchestration Without Containers.
5
5
  Keywords:
6
6
  Author: alpine
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "procd"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "The Native Stack Runner. Orchestration Without Containers."
9
9
  readme = "README_PYPI.md"
10
10
  license = "MIT"
@@ -490,6 +490,89 @@ def cmd_get(args: argparse.Namespace) -> None:
490
490
  dl_mod.do_get_parallel(args.names, conf, force=args.force)
491
491
 
492
492
 
493
+ _INIT_TEMPLATE = '''\
494
+ # ============================================================
495
+ # Procd ローカルサービス定義
496
+ # ============================================================
497
+
498
+ [settings]
499
+ run_dir = "var/run" # *.pid ファイルの保存先
500
+ log_dir = "var/log" # procd.jsonl の保存先
501
+
502
+ [settings.download]
503
+ dest = "opt" # download の展開先ルート。各エントリは <dest>/<name>/ に配置される
504
+
505
+ # 全サービス・全コマンド共通の環境変数(下敷き)
506
+ # .env ファイルが存在する場合はその値が最優先で上書きされる
507
+ [env]
508
+ EXAMPLE_VAR = "example"
509
+
510
+
511
+ # --------------------------------------------------
512
+ # [opt.*] バイナリのダウンロード定義
513
+ # url : ダウンロード URL (zip / tar.gz / tgz / tar.bz2 / tar.xz / プレーンファイル)
514
+ # OS サブテーブル ([opt.<name>.win32] 等) で上書き可
515
+ # dest : 展開先ディレクトリ (省略時は settings.download.dest/<name>)
516
+ # strip : アーカイブ内トップディレクトリを何段剖がすか
517
+ # --------------------------------------------------
518
+
519
+ # [opt.example]
520
+ # win32_x86_64.url = "https://example.com/example-win.zip"
521
+ # win32_x86_64.checksum = "sha256:*"
522
+ # darwin_arm64.url = "https://example.com/example-mac.tar.gz"
523
+ # linux_x86_64.url = "https://example.com/example-linux.tar.gz"
524
+ # strip = 1
525
+ # as.CMD_EXAMPLE = "prog" # @{CMD_EXAMPLE} で opt/example/prog 参照できるようにする
526
+
527
+ # --------------------------------------------------
528
+ # [command.*] 名前付きコマンド列
529
+ # description : 説明 (省略可)
530
+ # shell : 実行シェル (bash / sh / cmd / powershell)
531
+ # 省略時は | < > && || を含む行を自動で shell=True 実行
532
+ # steps : 実行するコマンドのリスト
533
+ # @ で始まる行は Procd 組み込みコマンド
534
+ # --------------------------------------------------
535
+
536
+ [command.hello]
537
+ description = "Hello, Procd!"
538
+ steps = [
539
+ "echo Hello, Procd!",
540
+ "echo EXAMPLE_VAR is @{EXAMPLE_VAR}", # [env] で定義した変数を参照する
541
+ ]
542
+
543
+
544
+ # --------------------------------------------------
545
+ # [service.*] 常駐プロセス定義
546
+ # bin : 実行ファイルパス (@{PROCD_HOME} 等の変数展開可)
547
+ # args : 引数リスト (@{PROCD_HOME} 等の変数展開可)
548
+ # ready : 起動確認方法 {tcp = "host:port"}
549
+ # --------------------------------------------------
550
+
551
+ [service.httpd]
552
+ bin = "uv"
553
+ args = ["run", "python", "-m", "http.server", "9999"]
554
+ ready = {tcp = "localhost:9999"}
555
+
556
+
557
+ # --------------------------------------------------
558
+ # [group.*] サービスグループ定義
559
+ # services : サービス名のリスト(起動順)
560
+ # --------------------------------------------------
561
+
562
+ [group.default]
563
+ services = ["httpd"]
564
+ '''
565
+
566
+
567
+ def cmd_init(args: argparse.Namespace) -> None:
568
+ path = Path(args.config)
569
+ if path.exists() and not args.force:
570
+ _err_console.print(f"[bold red]Error:[/bold red] {path} already exists. Use --force to overwrite.")
571
+ sys.exit(1)
572
+ path.write_text(_INIT_TEMPLATE, encoding="utf-8")
573
+ _console.print(f"[green]Created[/green] {path}")
574
+
575
+
493
576
  def cmd_link(args: argparse.Namespace) -> None:
494
577
  import shutil
495
578
  try:
@@ -537,14 +620,19 @@ def build_parser() -> argparse.ArgumentParser:
537
620
  description="Procd - ローカルサービスマネージャー",
538
621
  )
539
622
  parser.add_argument("-c", "--config", default="procd.toml", metavar="FILE")
540
- parser.add_argument("-v", "--verbose", procdn="store_true", help="展開後コマンドなどの詳細を表示する")
541
- parser.add_argument("--pause-on-error", procdn="store_true", help="エラー発生時に終了前に一時停止する(デスクトップショートカット用)")
623
+ parser.add_argument("-v", "--verbose", action="store_true", help="展開後コマンドなどの詳細を表示する")
624
+ parser.add_argument("--pause-on-error", action="store_true", help="エラー発生時に終了前に一時停止する(デスクトップショートカット用)")
542
625
  sub = parser.add_subparsers(dest="command", required=True)
543
626
 
627
+ # init
628
+ p = sub.add_parser("init", help="procd.toml のテンプレートを作成する")
629
+ p.add_argument("--force", action="store_true", help="既存ファイルがあっても上書きする")
630
+ p.set_defaults(func=cmd_init)
631
+
544
632
  # up
545
633
  p = sub.add_parser("up", help="サービスを起動する")
546
634
  p.add_argument("names", nargs="*", metavar="NAME")
547
- p.add_argument("-d", "--detach", procdn="store_true", help="バックグラウンド起動")
635
+ p.add_argument("-d", "--detach", action="store_true", help="バックグラウンド起動")
548
636
  p.set_defaults(func=cmd_up)
549
637
 
550
638
  # down
@@ -564,9 +652,9 @@ def build_parser() -> argparse.ArgumentParser:
564
652
  # logs
565
653
  p = sub.add_parser("logs", help="ログを表示する")
566
654
  p.add_argument("name", nargs="?", default=None, metavar="NAME")
567
- p.add_argument("-f", "--follow", procdn="store_true", help="tail -f スタイルで追跡")
655
+ p.add_argument("-f", "--follow", action="store_true", help="tail -f スタイルで追跡")
568
656
  p.add_argument("-n", "--lines", type=int, default=200, metavar="N", help="表示する行数(デフォルト: 200)")
569
- p.add_argument("-t", "--timestamp", procdn="store_true", help="タイムスタンプを表示する")
657
+ p.add_argument("-t", "--timestamp", action="store_true", help="タイムスタンプを表示する")
570
658
  p.add_argument("--up", nargs="*", metavar="NAME",
571
659
  help="サービスを起動してからログをフォローし、終了時にサービスも停止する")
572
660
  p.set_defaults(func=cmd_logs)
@@ -575,7 +663,7 @@ def build_parser() -> argparse.ArgumentParser:
575
663
  p = sub.add_parser("run", help="[command.*] を実行する")
576
664
  p.add_argument("name", nargs="?", default=None, metavar="NAME",
577
665
  help="実行するコマンド名(省略時は一覧を表示する)")
578
- p.add_argument("-e", "--env", procdn="append", metavar="KEY=VALUE", default=[],
666
+ p.add_argument("-e", "--env", action="append", metavar="KEY=VALUE", default=[],
579
667
  help="環境変数を追加・上書きする(複数指定可)")
580
668
  p.add_argument("extra_args", nargs="*", metavar="ARG",
581
669
  help="コマンドに渡す追加引数(@{ARGS} / @{ARG1} @{ARG2} … で参照)")
@@ -588,7 +676,7 @@ def build_parser() -> argparse.ArgumentParser:
588
676
  # get
589
677
  p = sub.add_parser("get", help="[opt.*] をダウンロード・展開する")
590
678
  p.add_argument("names", nargs="+", metavar="NAME")
591
- p.add_argument("--force", procdn="store_true", help="既存でも強制的に再ダウンロードする")
679
+ p.add_argument("--force", action="store_true", help="既存でも強制的に再ダウンロードする")
592
680
  p.set_defaults(func=cmd_get)
593
681
 
594
682
  # link
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