gitbolt 0.0.0.dev22__tar.gz → 0.0.0.dev24__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 (40) hide show
  1. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/PKG-INFO +17 -10
  2. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/README.md +16 -9
  3. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/pyproject.toml +1 -1
  4. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/__init__.py +1 -1
  5. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/base.py +54 -17
  6. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/base.py +275 -9
  7. gitbolt-0.0.0.dev24/src/gitbolt/subprocess/constants.py +22 -0
  8. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/impl/simple.py +92 -63
  9. gitbolt-0.0.0.dev22/src/gitbolt/subprocess/utils/cmd.py → gitbolt-0.0.0.dev24/src/gitbolt/subprocess/utils/main_cmd.py +37 -0
  10. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/utils/session.py +2 -2
  11. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/worktree.py +10 -17
  12. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/PKG-INFO +17 -10
  13. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/SOURCES.txt +1 -1
  14. gitbolt-0.0.0.dev22/src/gitbolt/subprocess/constants.py +0 -13
  15. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/LICENSE +0 -0
  16. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/setup.cfg +0 -0
  17. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/_internal_init.py +0 -0
  18. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/add.py +0 -0
  19. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/constants.py +0 -0
  20. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/exceptions.py +0 -0
  21. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/ls_tree.py +0 -0
  22. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/models.py +0 -0
  23. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/py.typed +0 -0
  24. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/pytest_plugin.py +0 -0
  25. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/__init__.py +0 -0
  26. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/_internal_init.py +0 -0
  27. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/add.py +0 -0
  28. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/exceptions.py +0 -0
  29. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/impl/__init__.py +0 -0
  30. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/ls_tree.py +0 -0
  31. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/runner/__init__.py +0 -0
  32. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/runner/base.py +0 -0
  33. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/runner/simple.py +0 -0
  34. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/utils/__init__.py +0 -0
  35. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/subprocess/utils/models.py +0 -0
  36. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt/utils.py +0 -0
  37. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/dependency_links.txt +0 -0
  38. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/entry_points.txt +0 -0
  39. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/requires.txt +0 -0
  40. {gitbolt-0.0.0.dev22 → gitbolt-0.0.0.dev24}/src/gitbolt.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitbolt
3
- Version: 0.0.0.dev22
3
+ Version: 0.0.0.dev24
4
4
  Summary: Fast, flexible and type-safe Git commands in Python.
5
5
  Author-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
6
6
  Maintainer-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
@@ -116,8 +116,8 @@ Gitbolt lets you pass subcommands around as typed objects. This enables highly f
116
116
  import gitbolt
117
117
 
118
118
  git = gitbolt.get_git()
119
- version_subcmd = git.version_subcmd
120
- add_subcmd = git.add_subcmd
119
+ version_subcmd = git.version_subcmd()
120
+ add_subcmd = git.add_subcmd()
121
121
 
122
122
  def method_which_only_adds_a_file(add_subcmd: gitbolt.base.Add):
123
123
  """
@@ -138,7 +138,7 @@ git subcommands are modeled as terminal functions that return stdout.
138
138
  import gitbolt
139
139
 
140
140
  git = gitbolt.get_git()
141
- version_stdout = git.version_subcmd.version().version()
141
+ version_stdout = git.version_subcmd().version().version()
142
142
  print(version_stdout)
143
143
  ```
144
144
 
@@ -153,8 +153,8 @@ particular commands.
153
153
  from gitbolt import get_git
154
154
 
155
155
  git = get_git() # get git object for the current working directory
156
- add_subcmd = git.add_subcmd
157
- ls_tree_subcmd = git.ls_tree_subcmd
156
+ add_subcmd = git.add_subcmd()
157
+ ls_tree_subcmd = git.ls_tree_subcmd()
158
158
 
159
159
  # now, functions can be written to accept only the required subcommands and nothing more than that.
160
160
  ```
@@ -338,8 +338,8 @@ import gitbolt
338
338
 
339
339
  git = gitbolt.get_git_command()
340
340
  git = git.git_opts_override(no_advice=True)
341
- git.subcmd_unchecked.run(['--version']) # run the version option for git.
342
- git.subcmd_unchecked.run(['version']) # run the version subcommand.
341
+ git.subcmd_unchecked().run(['--version']) # run the version option for git.
342
+ git.subcmd_unchecked().run(['version']) # run the version subcommand.
343
343
  ```
344
344
 
345
345
  #### 🖥️ Run one long-running process and communicate with it
@@ -354,7 +354,7 @@ import gitbolt
354
354
  import sys
355
355
 
356
356
  git = gitbolt.get_git_command()
357
- with git.subcmd_unchecked.popen(["cat-file", "--batch-command"]) as cf:
357
+ with git.subcmd_unchecked().popen(["cat-file", "--batch-command"]) as cf:
358
358
  cf.stdin.write(b"contents HEAD\n")
359
359
  cf.stdin.flush()
360
360
  header = cf.stdout.readline().strip()
@@ -384,7 +384,7 @@ git = gitbolt.get_git_command()
384
384
  with git.session(
385
385
  cat_file1=["cat-file", "--batch"],
386
386
  cat_file2=["cat-file", "--batch"],
387
- cat_file3=lambda: git.subcmd_unchecked.popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
387
+ cat_file3=lambda: git.subcmd_unchecked().popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
388
388
  mktree=["mktree", "--batch", "-z"]
389
389
  ) as ses: # reusable and reentrant session
390
390
  tree_data: list[bytes] = []
@@ -430,6 +430,13 @@ Transformers for formatting/parsing can be added later.
430
430
 
431
431
  ---
432
432
 
433
+ ## Notes
434
+
435
+
436
+ - 0.0.0.dev24: `worktree` implementations are not stable yet. Use `subcmd_unchecked` directly.
437
+
438
+ ---
439
+
433
440
  ## ✅ Benefits Out-of-the-Box
434
441
 
435
442
  * 🔄 Composable Git commands.
@@ -80,8 +80,8 @@ Gitbolt lets you pass subcommands around as typed objects. This enables highly f
80
80
  import gitbolt
81
81
 
82
82
  git = gitbolt.get_git()
83
- version_subcmd = git.version_subcmd
84
- add_subcmd = git.add_subcmd
83
+ version_subcmd = git.version_subcmd()
84
+ add_subcmd = git.add_subcmd()
85
85
 
86
86
  def method_which_only_adds_a_file(add_subcmd: gitbolt.base.Add):
87
87
  """
@@ -102,7 +102,7 @@ git subcommands are modeled as terminal functions that return stdout.
102
102
  import gitbolt
103
103
 
104
104
  git = gitbolt.get_git()
105
- version_stdout = git.version_subcmd.version().version()
105
+ version_stdout = git.version_subcmd().version().version()
106
106
  print(version_stdout)
107
107
  ```
108
108
 
@@ -117,8 +117,8 @@ particular commands.
117
117
  from gitbolt import get_git
118
118
 
119
119
  git = get_git() # get git object for the current working directory
120
- add_subcmd = git.add_subcmd
121
- ls_tree_subcmd = git.ls_tree_subcmd
120
+ add_subcmd = git.add_subcmd()
121
+ ls_tree_subcmd = git.ls_tree_subcmd()
122
122
 
123
123
  # now, functions can be written to accept only the required subcommands and nothing more than that.
124
124
  ```
@@ -302,8 +302,8 @@ import gitbolt
302
302
 
303
303
  git = gitbolt.get_git_command()
304
304
  git = git.git_opts_override(no_advice=True)
305
- git.subcmd_unchecked.run(['--version']) # run the version option for git.
306
- git.subcmd_unchecked.run(['version']) # run the version subcommand.
305
+ git.subcmd_unchecked().run(['--version']) # run the version option for git.
306
+ git.subcmd_unchecked().run(['version']) # run the version subcommand.
307
307
  ```
308
308
 
309
309
  #### 🖥️ Run one long-running process and communicate with it
@@ -318,7 +318,7 @@ import gitbolt
318
318
  import sys
319
319
 
320
320
  git = gitbolt.get_git_command()
321
- with git.subcmd_unchecked.popen(["cat-file", "--batch-command"]) as cf:
321
+ with git.subcmd_unchecked().popen(["cat-file", "--batch-command"]) as cf:
322
322
  cf.stdin.write(b"contents HEAD\n")
323
323
  cf.stdin.flush()
324
324
  header = cf.stdout.readline().strip()
@@ -348,7 +348,7 @@ git = gitbolt.get_git_command()
348
348
  with git.session(
349
349
  cat_file1=["cat-file", "--batch"],
350
350
  cat_file2=["cat-file", "--batch"],
351
- cat_file3=lambda: git.subcmd_unchecked.popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
351
+ cat_file3=lambda: git.subcmd_unchecked().popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
352
352
  mktree=["mktree", "--batch", "-z"]
353
353
  ) as ses: # reusable and reentrant session
354
354
  tree_data: list[bytes] = []
@@ -394,6 +394,13 @@ Transformers for formatting/parsing can be added later.
394
394
 
395
395
  ---
396
396
 
397
+ ## Notes
398
+
399
+
400
+ - 0.0.0.dev24: `worktree` implementations are not stable yet. Use `subcmd_unchecked` directly.
401
+
402
+ ---
403
+
397
404
  ## ✅ Benefits Out-of-the-Box
398
405
 
399
406
  * 🔄 Composable Git commands.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gitbolt"
3
- version = "0.0.0.dev22"
3
+ version = "0.0.0.dev24"
4
4
  description = "Fast, flexible and type-safe Git commands in Python."
5
5
  requires-python = ">=3.12"
6
6
  readme = "README.md"
@@ -71,7 +71,7 @@ def get_git_command(
71
71
 
72
72
  * Get git version, as a git subcommand. Runs git in subprocess:
73
73
 
74
- >>> assert git.subcmd_unchecked.run(["version"], text=True).stdout.strip() == subprocess.run(['git', 'version'], capture_output=True, text=True).stdout.strip()
74
+ >>> assert git.subcmd_unchecked().run(["version"], text=True).stdout.strip() == subprocess.run(['git', 'version'], capture_output=True, text=True).stdout.strip()
75
75
 
76
76
  :param git_root_dir: Path to the git repo root directory. Defaults to current working directory.
77
77
  :param git_prog: git program name/location. Useful when user wants to run a separate git version/git emulator.
@@ -131,7 +131,7 @@ class LsTree(GitSubCommand, RootDirOp, Protocol):
131
131
 
132
132
  @override
133
133
  def _subcmd_from_git(self, git: "Git") -> "LsTree":
134
- return git.ls_tree_subcmd
134
+ return git.ls_tree_subcmd()
135
135
 
136
136
  @property
137
137
  def args_validator(self) -> LsTreeArgsValidator:
@@ -216,7 +216,7 @@ class Add(GitSubCommand, RootDirOp, Protocol):
216
216
 
217
217
  @override
218
218
  def _subcmd_from_git(self, git: "Git") -> "Add":
219
- return git.add_subcmd
219
+ return git.add_subcmd()
220
220
 
221
221
 
222
222
  class Version(GitSubCommand, Protocol):
@@ -283,7 +283,7 @@ class Version(GitSubCommand, Protocol):
283
283
 
284
284
  @override
285
285
  def _subcmd_from_git(self, git: "Git") -> "Version":
286
- return git.version_subcmd
286
+ return git.version_subcmd()
287
287
 
288
288
 
289
289
  class Worktree(GitSubCommand, RootDirOp, Protocol):
@@ -304,6 +304,22 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
304
304
  """
305
305
  ...
306
306
 
307
+ @abstractmethod
308
+ def clone(self) -> "Worktree.WorktreeSubcmd":
309
+ """
310
+ :return: a clone of the underlying worktree subcommand.
311
+ """
312
+ ...
313
+
314
+ @abstractmethod
315
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> "Worktree.WorktreeSubcmd":
316
+ """
317
+ Protected. Intended for inheritance only.
318
+
319
+ :return: specific implementation of subcommand from ``worktree``.
320
+ """
321
+ ...
322
+
307
323
  # region worktree list subcommands
308
324
  class List(WorktreeSubcmd, Protocol):
309
325
  """
@@ -341,7 +357,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
341
357
  """
342
358
  ...
343
359
 
344
- @property
360
+ @override
361
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.List:
362
+ return worktree.list_subcmd()
363
+
345
364
  @abstractmethod
346
365
  def list_subcmd(self) -> Worktree.List:
347
366
  """
@@ -372,7 +391,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
372
391
  """
373
392
  ...
374
393
 
375
- @property
394
+ @override
395
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Lock:
396
+ return worktree.lock_subcmd()
397
+
376
398
  @abstractmethod
377
399
  def lock_subcmd(self) -> Worktree.Lock:
378
400
  """
@@ -401,7 +423,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
401
423
  """
402
424
  ...
403
425
 
404
- @property
426
+ @override
427
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.UnLock:
428
+ return worktree.unlock_subcmd()
429
+
405
430
  @abstractmethod
406
431
  def unlock_subcmd(self) -> Worktree.UnLock:
407
432
  """
@@ -432,8 +457,12 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
432
457
  :param relative_paths: `use relative paths for worktree <https://git-scm.com/docs/git-worktree#Documentation/git-worktree.txt---no-relative-paths>`_.
433
458
  :return: output of ``git worktree move``.
434
459
  """
460
+ ...
461
+
462
+ @override
463
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Move:
464
+ return worktree.move_subcmd()
435
465
 
436
- @property
437
466
  @abstractmethod
438
467
  def move_subcmd(self) -> Worktree.Move:
439
468
  """
@@ -467,7 +496,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
467
496
  """
468
497
  ...
469
498
 
470
- @property
499
+ @override
500
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Prune:
501
+ return worktree.prune_subcmd()
502
+
471
503
  @abstractmethod
472
504
  def prune_subcmd(self) -> Worktree.Prune:
473
505
  """
@@ -497,7 +529,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
497
529
  """
498
530
  ...
499
531
 
500
- @property
532
+ @override
533
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Remove:
534
+ return worktree.remove_subcmd()
535
+
501
536
  @abstractmethod
502
537
  def remove_subcmd(self) -> Worktree.Remove:
503
538
  """
@@ -526,7 +561,10 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
526
561
  """
527
562
  ...
528
563
 
529
- @property
564
+ @override
565
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Repair:
566
+ return worktree.repair_subcmd()
567
+
530
568
  @abstractmethod
531
569
  def repair_subcmd(self) -> Worktree.Repair:
532
570
  """
@@ -586,8 +624,11 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
586
624
  """
587
625
  ...
588
626
 
627
+ @override
628
+ def _subcmd_from_worktree(self, worktree: "Worktree") -> Worktree.Add:
629
+ return worktree.add_subcmd()
630
+
589
631
 
590
- @property
591
632
  @abstractmethod
592
633
  def add_subcmd(self) -> Worktree.Add:
593
634
  """
@@ -598,7 +639,7 @@ class Worktree(GitSubCommand, RootDirOp, Protocol):
598
639
 
599
640
  @override
600
641
  def _subcmd_from_git(self, git: "Git") -> "Worktree":
601
- return git.worktree_subcmd
642
+ return git.worktree_subcmd()
602
643
 
603
644
 
604
645
  class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
@@ -610,7 +651,7 @@ class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
610
651
  """
611
652
  :return: current git version.
612
653
  """
613
- return self.version_subcmd.version()
654
+ return self.version_subcmd().version()
614
655
 
615
656
  @abstractmethod
616
657
  def exec_path(self) -> Path:
@@ -640,7 +681,6 @@ class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
640
681
  """
641
682
  ...
642
683
 
643
- @property
644
684
  @abstractmethod
645
685
  def version_subcmd(self) -> Version:
646
686
  """
@@ -648,7 +688,6 @@ class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
648
688
  """
649
689
  ...
650
690
 
651
- @property
652
691
  @abstractmethod
653
692
  def ls_tree_subcmd(self) -> LsTree:
654
693
  """
@@ -656,7 +695,6 @@ class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
656
695
  """
657
696
  ...
658
697
 
659
- @property
660
698
  @abstractmethod
661
699
  def add_subcmd(self) -> Add:
662
700
  """
@@ -664,7 +702,6 @@ class Git(CanOverrideGitOpts, CanOverrideGitEnvs, Protocol):
664
702
  """
665
703
  ...
666
704
 
667
- @property
668
705
  @abstractmethod
669
706
  def worktree_subcmd(self) -> Worktree:
670
707
  """