falyx 0.1.55__py3-none-any.whl → 0.1.56__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.
File without changes
@@ -165,6 +165,11 @@ class SelectFileAction(BaseAction):
165
165
  try:
166
166
  await self.hooks.trigger(HookType.BEFORE, context)
167
167
 
168
+ if not self.directory.exists():
169
+ raise FileNotFoundError(f"Directory {self.directory} does not exist.")
170
+ elif not self.directory.is_dir():
171
+ raise NotADirectoryError(f"{self.directory} is not a directory.")
172
+
168
173
  files = [
169
174
  file
170
175
  for file in self.directory.iterdir()
falyx/command.py CHANGED
@@ -91,6 +91,12 @@ class Command(BaseModel):
91
91
  logging_hooks (bool): Whether to attach logging hooks automatically.
92
92
  options_manager (OptionsManager): Manages global command-line options.
93
93
  arg_parser (CommandArgumentParser): Parses command arguments.
94
+ arguments (list[dict[str, Any]]): Argument definitions for the command.
95
+ argument_config (Callable[[CommandArgumentParser], None] | None): Function to configure arguments
96
+ for the command parser.
97
+ arg_metadata (dict[str, str | dict[str, Any]]): Metadata for arguments,
98
+ such as help text or choices.
99
+ simple_help_signature (bool): Whether to use a simplified help signature.
94
100
  custom_parser (ArgParserProtocol | None): Custom argument parser.
95
101
  custom_help (Callable[[], str | None] | None): Custom help message generator.
96
102
  auto_args (bool): Automatically infer arguments from the action.
@@ -227,7 +233,7 @@ class Command(BaseModel):
227
233
  if self.logging_hooks and isinstance(self.action, BaseAction):
228
234
  register_debug_hooks(self.action.hooks)
229
235
 
230
- if self.arg_parser is None:
236
+ if self.arg_parser is None and not self.custom_parser:
231
237
  self.arg_parser = CommandArgumentParser(
232
238
  command_key=self.key,
233
239
  command_description=self.description,
falyx/completer.py ADDED
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ import shlex
4
+ from typing import TYPE_CHECKING, Iterable
5
+
6
+ from prompt_toolkit.completion import Completer, Completion
7
+ from prompt_toolkit.document import Document
8
+
9
+ if TYPE_CHECKING:
10
+ from falyx import Falyx
11
+
12
+
13
+ class FalyxCompleter(Completer):
14
+ """Completer for Falyx commands."""
15
+
16
+ def __init__(self, falyx: "Falyx"):
17
+ self.falyx = falyx
18
+
19
+ def get_completions(self, document: Document, complete_event) -> Iterable[Completion]:
20
+ text = document.text_before_cursor
21
+ try:
22
+ tokens = shlex.split(text)
23
+ cursor_at_end_of_token = document.text_before_cursor.endswith((" ", "\t"))
24
+ except ValueError:
25
+ return
26
+
27
+ if not tokens or (len(tokens) == 1 and not cursor_at_end_of_token):
28
+ # Suggest command keys and aliases
29
+ yield from self._suggest_commands(tokens[0] if tokens else "")
30
+ return
31
+
32
+ def _suggest_commands(self, prefix: str) -> Iterable[Completion]:
33
+ prefix = prefix.upper()
34
+ keys = [self.falyx.exit_command.key]
35
+ keys.extend(self.falyx.exit_command.aliases)
36
+ if self.falyx.history_command:
37
+ keys.append(self.falyx.history_command.key)
38
+ keys.extend(self.falyx.history_command.aliases)
39
+ if self.falyx.help_command:
40
+ keys.append(self.falyx.help_command.key)
41
+ keys.extend(self.falyx.help_command.aliases)
42
+ for cmd in self.falyx.commands.values():
43
+ keys.append(cmd.key)
44
+ keys.extend(cmd.aliases)
45
+ for key in keys:
46
+ if key.upper().startswith(prefix):
47
+ yield Completion(key, start_position=-len(prefix))
falyx/falyx.py CHANGED
@@ -32,7 +32,6 @@ from functools import cached_property
32
32
  from typing import Any, Callable
33
33
 
34
34
  from prompt_toolkit import PromptSession
35
- from prompt_toolkit.completion import WordCompleter
36
35
  from prompt_toolkit.formatted_text import AnyFormattedText
37
36
  from prompt_toolkit.key_binding import KeyBindings
38
37
  from prompt_toolkit.patch_stdout import patch_stdout
@@ -46,6 +45,7 @@ from falyx.action.action import Action
46
45
  from falyx.action.base_action import BaseAction
47
46
  from falyx.bottom_bar import BottomBar
48
47
  from falyx.command import Command
48
+ from falyx.completer import FalyxCompleter
49
49
  from falyx.context import ExecutionContext
50
50
  from falyx.debug import log_after, log_before, log_error, log_success
51
51
  from falyx.exceptions import (
@@ -413,20 +413,9 @@ class Falyx:
413
413
  arg_parser=parser,
414
414
  )
415
415
 
416
- def _get_completer(self) -> WordCompleter:
416
+ def _get_completer(self) -> FalyxCompleter:
417
417
  """Completer to provide auto-completion for the menu commands."""
418
- keys = [self.exit_command.key]
419
- keys.extend(self.exit_command.aliases)
420
- if self.history_command:
421
- keys.append(self.history_command.key)
422
- keys.extend(self.history_command.aliases)
423
- if self.help_command:
424
- keys.append(self.help_command.key)
425
- keys.extend(self.help_command.aliases)
426
- for cmd in self.commands.values():
427
- keys.append(cmd.key)
428
- keys.extend(cmd.aliases)
429
- return WordCompleter(keys, ignore_case=True)
418
+ return FalyxCompleter(self)
430
419
 
431
420
  def _get_validator_error_message(self) -> str:
432
421
  """Validator to check if the input is a valid command or toggle key."""
falyx/falyx_completer.py CHANGED
@@ -1,53 +1,128 @@
1
- import shlex
2
- from typing import Iterable
3
-
1
+ from collections import Counter
4
2
  from prompt_toolkit.completion import Completer, Completion
3
+ from prompt_toolkit.document import Document
4
+ from typing import Iterable, Set, Optional
5
+ import shlex
5
6
 
7
+ from falyx.command import Command
6
8
  from falyx.parser.command_argument_parser import CommandArgumentParser
7
-
9
+ from falyx.parser.argument import Argument
10
+ from falyx.parser.argument_action import ArgumentAction
8
11
 
9
12
  class FalyxCompleter(Completer):
10
- def __init__(self, falyx: "Falyx") -> None:
13
+ """Completer for Falyx commands and their arguments."""
14
+ def __init__(self, falyx: "Falyx"):
11
15
  self.falyx = falyx
16
+ self._used_args: Set[str] = set()
17
+ self._used_args_counter: Counter = Counter()
12
18
 
13
- def get_completions(self, document, complete_event) -> Iterable[Completion]:
14
- text = document.text_before_cursor.strip()
15
- if not text:
16
- yield from self._complete_command("")
17
- return
18
-
19
+ def get_completions(self, document: Document, complete_event) -> Iterable[Completion]:
20
+ text = document.text_before_cursor
19
21
  try:
20
22
  tokens = shlex.split(text)
23
+ cursor_at_end_of_token = document.text_before_cursor.endswith((' ', '\t'))
21
24
  except ValueError:
22
- return # unmatched quotes or syntax error
25
+ return
23
26
 
24
- if not tokens:
25
- yield from self._complete_command("")
27
+ if not tokens or (len(tokens) == 1 and not cursor_at_end_of_token):
28
+ # Suggest command keys and aliases
29
+ yield from self._suggest_commands(tokens[0] if tokens else "")
26
30
  return
27
31
 
28
- command_token = tokens[0]
29
- command_key = command_token.lstrip("?").upper()
30
- command = self.falyx._name_map.get(command_key)
32
+ command = self._match_command(tokens[0])
33
+ if not command:
34
+ return
31
35
 
32
- if command is None:
33
- yield from self._complete_command(command_token)
36
+ if command.arg_parser is None:
34
37
  return
35
38
 
36
- used_flags = set(tokens[1:]) # simplistic
37
- parser: CommandArgumentParser = command.arg_parser or CommandArgumentParser()
38
- for arg in parser._keyword_list:
39
- for flag in arg.flags:
40
- if flag not in used_flags:
41
- yield Completion(flag, start_position=0)
39
+ self._set_used_args(tokens, command)
40
+
41
+ next_arg = self._next_expected_argument(tokens, command.arg_parser)
42
42
 
43
- for dest, arg in parser._positional.items():
44
- if dest not in used_flags:
45
- yield Completion(arg.dest, start_position=0)
43
+ if next_arg:
44
+ # Positional arguments or required flagged arguments
45
+ yield from self._suggest_argument(next_arg, document)
46
+ else:
47
+ # Optional arguments
48
+ for arg in command.arg_parser._keyword.values():
49
+ if not self._arg_already_used(arg.dest):
50
+ yield from self._suggest_argument(arg, document)
46
51
 
47
- def _complete_command(self, prefix: str) -> Iterable[Completion]:
52
+ def _set_used_args(self, tokens: list[str], command: Command) -> None:
53
+ """Extracts used argument flags from the provided tokens."""
54
+ if not command.arg_parser:
55
+ return
56
+ self._used_args.clear()
57
+ self._used_args_counter.clear()
58
+ for token in tokens[1:]:
59
+ if token.startswith('-'):
60
+ if keyword_argument := command.arg_parser._keyword.get(token):
61
+ self._used_args_counter[keyword_argument.dest] += 1
62
+ if isinstance(keyword_argument.nargs, int) and self._used_args_counter[keyword_argument.dest] > keyword_argument.nargs:
63
+ continue
64
+ elif isinstance(keyword_argument.nargs, str) and keyword_argument.nargs in ("?"):
65
+ self._used_args.add(keyword_argument.dest)
66
+ else:
67
+ self._used_args.add(keyword_argument.dest)
68
+ else:
69
+ # Handle positional arguments
70
+ if command.arg_parser._positional:
71
+ for arg in command.arg_parser._positional.values():
72
+ if arg.dest not in self._used_args:
73
+ self._used_args.add(arg.dest)
74
+ break
75
+ print(f"Used args: {self._used_args}, Counter: {self._used_args_counter}")
76
+
77
+ def _suggest_commands(self, prefix: str) -> Iterable[Completion]:
78
+ prefix = prefix.upper()
48
79
  seen = set()
49
80
  for cmd in self.falyx.commands.values():
50
81
  for key in [cmd.key] + cmd.aliases:
51
- if key not in seen and key.upper().startswith(prefix.upper()):
82
+ if key.upper().startswith(prefix) and key not in seen:
52
83
  yield Completion(key, start_position=-len(prefix))
53
84
  seen.add(key)
85
+
86
+ def _match_command(self, token: str) -> Optional[Command]:
87
+ token = token.lstrip("?").upper()
88
+ return self.falyx._name_map.get(token)
89
+
90
+ def _next_expected_argument(
91
+ self, tokens: list[str], parser: CommandArgumentParser
92
+ ) -> Optional[Argument]:
93
+ """Determine the next expected argument based on the current tokens."""
94
+ # Positional arguments first
95
+ for arg in parser._positional.values():
96
+ if arg.dest not in self._used_args:
97
+ return arg
98
+
99
+ # Then required keyword arguments
100
+ for arg in parser._keyword_list:
101
+ if arg.required and not self._arg_already_used(arg.dest):
102
+ return arg
103
+
104
+ return None
105
+
106
+ def _arg_already_used(self, dest: str) -> bool:
107
+ print(f"Checking if argument '{dest}' is already used: {dest in self._used_args} - Used args: {self._used_args}")
108
+ return dest in self._used_args
109
+
110
+ def _suggest_argument(self, arg: Argument, document: Document) -> Iterable[Completion]:
111
+ if not arg.positional:
112
+ for flag in arg.flags:
113
+ yield Completion(flag, start_position=0)
114
+
115
+ if arg.choices:
116
+ for choice in arg.choices:
117
+ yield Completion(
118
+ choice,
119
+ start_position=0,
120
+ display=f"{arg.dest}={choice}"
121
+ )
122
+
123
+ if arg.default is not None and arg.action == ArgumentAction.STORE:
124
+ yield Completion(
125
+ str(arg.default),
126
+ start_position=0,
127
+ display=f"{arg.dest} (default: {arg.default})"
128
+ )
@@ -7,7 +7,6 @@ from typing import Any, Iterable
7
7
 
8
8
  from rich.console import Console
9
9
  from rich.markup import escape
10
- from rich.text import Text
11
10
 
12
11
  from falyx.action.base_action import BaseAction
13
12
  from falyx.exceptions import CommandArgumentError
@@ -466,6 +465,10 @@ class CommandArgumentParser:
466
465
  or isinstance(next_spec.nargs, str)
467
466
  and next_spec.nargs in ("+", "*", "?")
468
467
  ), f"Invalid nargs value: {spec.nargs}"
468
+
469
+ if next_spec.default:
470
+ continue
471
+
469
472
  if next_spec.nargs is None:
470
473
  min_required += 1
471
474
  elif isinstance(next_spec.nargs, int):
@@ -473,9 +476,9 @@ class CommandArgumentParser:
473
476
  elif next_spec.nargs == "+":
474
477
  min_required += 1
475
478
  elif next_spec.nargs == "?":
476
- min_required += 0
479
+ continue
477
480
  elif next_spec.nargs == "*":
478
- min_required += 0
481
+ continue
479
482
 
480
483
  slice_args = args[i:] if is_last else args[i : i + (remaining - min_required)]
481
484
  values, new_i = self._consume_nargs(slice_args, 0, spec)
@@ -484,9 +487,23 @@ class CommandArgumentParser:
484
487
  try:
485
488
  typed = [coerce_value(value, spec.type) for value in values]
486
489
  except Exception as error:
487
- raise CommandArgumentError(
488
- f"Invalid value for '{spec.dest}': {error}"
489
- ) from error
490
+ if len(args[i - new_i :]) == 1 and args[i - new_i].startswith("-"):
491
+ token = args[i - new_i]
492
+ valid_flags = [
493
+ flag for flag in self._flag_map if flag.startswith(token)
494
+ ]
495
+ if valid_flags:
496
+ raise CommandArgumentError(
497
+ f"Unrecognized option '{token}'. Did you mean one of: {', '.join(valid_flags)}?"
498
+ ) from error
499
+ else:
500
+ raise CommandArgumentError(
501
+ f"Unrecognized option '{token}'. Use --help to see available options."
502
+ ) from error
503
+ else:
504
+ raise CommandArgumentError(
505
+ f"Invalid value for '{spec.dest}': {error}"
506
+ ) from error
490
507
  if spec.action == ArgumentAction.ACTION:
491
508
  assert isinstance(
492
509
  spec.resolver, BaseAction
@@ -497,6 +514,8 @@ class CommandArgumentParser:
497
514
  raise CommandArgumentError(
498
515
  f"[{spec.dest}] Action failed: {error}"
499
516
  ) from error
517
+ elif not typed and spec.default:
518
+ result[spec.dest] = spec.default
500
519
  elif spec.action == ArgumentAction.APPEND:
501
520
  assert result.get(spec.dest) is not None, "dest should not be None"
502
521
  if spec.nargs is None:
@@ -515,10 +534,22 @@ class CommandArgumentParser:
515
534
  consumed_positional_indicies.add(j)
516
535
 
517
536
  if i < len(args):
518
- plural = "s" if len(args[i:]) > 1 else ""
519
- raise CommandArgumentError(
520
- f"Unexpected positional argument{plural}: {', '.join(args[i:])}"
521
- )
537
+ if len(args[i:]) == 1 and args[i].startswith("-"):
538
+ token = args[i]
539
+ valid_flags = [flag for flag in self._flag_map if flag.startswith(token)]
540
+ if valid_flags:
541
+ raise CommandArgumentError(
542
+ f"Unrecognized option '{token}'. Did you mean one of: {', '.join(valid_flags)}?"
543
+ )
544
+ else:
545
+ raise CommandArgumentError(
546
+ f"Unrecognized option '{token}'. Use --help to see available options."
547
+ )
548
+ else:
549
+ plural = "s" if len(args[i:]) > 1 else ""
550
+ raise CommandArgumentError(
551
+ f"Unexpected positional argument{plural}: {', '.join(args[i:])}"
552
+ )
522
553
 
523
554
  return i
524
555
 
@@ -624,8 +655,22 @@ class CommandArgumentParser:
624
655
  f"Invalid value for '{spec.dest}': {error}"
625
656
  ) from error
626
657
  if not typed_values and spec.nargs not in ("*", "?"):
658
+ choices = []
659
+ if spec.default:
660
+ choices.append(f"default={spec.default!r}")
661
+ if spec.choices:
662
+ choices.append(f"choices={spec.choices!r}")
663
+ if choices:
664
+ choices_text = ", ".join(choices)
665
+ raise CommandArgumentError(
666
+ f"Argument '{spec.dest}' requires a value. {choices_text}"
667
+ )
668
+ if spec.nargs is None:
669
+ raise CommandArgumentError(
670
+ f"Enter a {spec.type.__name__} value for '{spec.dest}'"
671
+ )
627
672
  raise CommandArgumentError(
628
- f"Expected at least one value for '{spec.dest}'"
673
+ f"Argument '{spec.dest}' requires a value. Expected {spec.nargs} values."
629
674
  )
630
675
  if spec.nargs in (None, 1, "?") and spec.action != ArgumentAction.APPEND:
631
676
  result[spec.dest] = (
@@ -637,7 +682,15 @@ class CommandArgumentParser:
637
682
  i = new_i
638
683
  elif token.startswith("-"):
639
684
  # Handle unrecognized option
640
- raise CommandArgumentError(f"Unrecognized flag: {token}")
685
+ valid_flags = [flag for flag in self._flag_map if flag.startswith(token)]
686
+ if valid_flags:
687
+ raise CommandArgumentError(
688
+ f"Unrecognized option '{token}'. Did you mean one of: {', '.join(valid_flags)}?"
689
+ )
690
+ else:
691
+ raise CommandArgumentError(
692
+ f"Unrecognized option '{token}'. Use --help to see available options."
693
+ )
641
694
  else:
642
695
  # Get the next flagged argument index if it exists
643
696
  next_flagged_index = -1
@@ -692,7 +745,10 @@ class CommandArgumentParser:
692
745
  if spec.dest == "help":
693
746
  continue
694
747
  if spec.required and not result.get(spec.dest):
695
- raise CommandArgumentError(f"Missing required argument: {spec.dest}")
748
+ help_text = f" help: {spec.help}" if spec.help else ""
749
+ raise CommandArgumentError(
750
+ f"Missing required argument {spec.dest}: {spec.get_choice_text()}{help_text}"
751
+ )
696
752
 
697
753
  if spec.choices and result.get(spec.dest) not in spec.choices:
698
754
  raise CommandArgumentError(
@@ -807,22 +863,20 @@ class CommandArgumentParser:
807
863
  self.console.print("[bold]positional:[/bold]")
808
864
  for arg in self._positional.values():
809
865
  flags = arg.get_positional_text()
810
- arg_line = Text(f" {flags:<30} ")
866
+ arg_line = f" {flags:<30} "
811
867
  help_text = arg.help or ""
812
868
  if help_text and len(flags) > 30:
813
869
  help_text = f"\n{'':<33}{help_text}"
814
- arg_line.append(help_text)
815
- self.console.print(arg_line)
870
+ self.console.print(f"{arg_line}{help_text}")
816
871
  self.console.print("[bold]options:[/bold]")
817
872
  for arg in self._keyword_list:
818
873
  flags = ", ".join(arg.flags)
819
874
  flags_choice = f"{flags} {arg.get_choice_text()}"
820
- arg_line = Text(f" {flags_choice:<30} ")
875
+ arg_line = f" {flags_choice:<30} "
821
876
  help_text = arg.help or ""
822
877
  if help_text and len(flags_choice) > 30:
823
878
  help_text = f"\n{'':<33}{help_text}"
824
- arg_line.append(help_text)
825
- self.console.print(arg_line)
879
+ self.console.print(f"{arg_line}{help_text}")
826
880
 
827
881
  # Epilog
828
882
  if self.help_epilog:
falyx/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.55"
1
+ __version__ = "0.1.56"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: falyx
3
- Version: 0.1.55
3
+ Version: 0.1.56
4
4
  Summary: Reliable and introspectable async CLI action framework.
5
5
  License: MIT
6
6
  Author: Roland Thomas Jr
@@ -10,6 +10,7 @@ falyx/action/action_mixins.py,sha256=oUrjbweCeateshg3tqtbQiGuV8u4GvlioIZCUr9D1m4
10
10
  falyx/action/action_types.py,sha256=oG8qIFObZdiU1VZQlnWzR8uBDq8rcxzkCli9A31_tMI,1460
11
11
  falyx/action/base_action.py,sha256=vnbcB3807eHFILy1z7RaIlGKDKnLG6XFQWJ8_B-3dcE,5812
12
12
  falyx/action/chained_action.py,sha256=ARbyPm2AZLsqmap8aFuZuliSSuRtR4_4PXTS2aeILF0,8988
13
+ falyx/action/confirm_action.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
14
  falyx/action/fallback_action.py,sha256=3FGWfoR1MIgY0ZkDNOpKu8p3JqPWzh5ON3943mfgDGs,1708
14
15
  falyx/action/http_action.py,sha256=DNeSBWh58UTFGlfFyTk2GnhS54hpLAJLC0QNbq2cYic,5799
15
16
  falyx/action/io_action.py,sha256=V888tQgAynqsVvkhICnEeE4wRs2vvdTcdlEpDSEbHqo,6128
@@ -20,20 +21,21 @@ falyx/action/process_action.py,sha256=nUNcJD6Ms34vmj8njWzv1R1P9xJTyJmelnyJksHcp7
20
21
  falyx/action/process_pool_action.py,sha256=XeL6e7vsy4OkOWGQHD0ET14CzuyJ0TL-c1W5VIgdCP8,6204
21
22
  falyx/action/prompt_menu_action.py,sha256=SYgSDURsyjeQbEm_lbJCEVjVGPSGN59-xtT_VDyJqVY,5293
22
23
  falyx/action/save_file_action.py,sha256=Ji5ND_zXGo82LkyEfyKGNK3x1nrhgu2oMLXV-aZ0Om4,1331
23
- falyx/action/select_file_action.py,sha256=6zEG_AlmVR4RX6tpOEHxyM_QgxblZYcEbqcd961Q7_o,9967
24
+ falyx/action/select_file_action.py,sha256=cX4vxWribwGd5cQU25KgZWPdbruIR2bTNVkY2xtGakM,10227
24
25
  falyx/action/selection_action.py,sha256=f3m4sYpGVu6nwydtx76OMvp7HFMZqSEr_nL9lwaPd_A,15749
25
26
  falyx/action/shell_action.py,sha256=0A_kvZLsYmeLHInMM_4Jpe8GCSnXzGBm7H9PnXPvbAs,4055
26
27
  falyx/action/signal_action.py,sha256=5UMqvzy7fBnLANGwYUWoe1VRhrr7e-yOVeLdOnCBiJo,1350
27
28
  falyx/action/user_input_action.py,sha256=DnIYy4Bwl3dPbNSiM4ojuv-Y3WDYgIF2cUE3YPu-xCE,3848
28
29
  falyx/bottom_bar.py,sha256=KPACb9VC0I3dv_pYZLqy7e4uA_KT5dSfwnvuknyV0FI,7388
29
- falyx/command.py,sha256=9eRSPJGP7oNzwZPdSr3KV_KZe4nVVZCx-uzqvL03w3Q,16482
30
+ falyx/command.py,sha256=b35L0ZcmC_HYZUC19gVOAz3j0wMrY7p22JsqQZ4Orbk,16935
31
+ falyx/completer.py,sha256=EODbakx5PFAwjNcfuUZPFuSx2Q9MXBlWRZJ2LejF6DI,1686
30
32
  falyx/config.py,sha256=JkGLssxRYgSOFqGhLT19q4dqyLdLQj_NAtzZpcYSU2M,9665
31
33
  falyx/context.py,sha256=b9PGkIfhc1BbFUmaqmr4AojzONfKG1c9WP2uixzCJGQ,10806
32
34
  falyx/debug.py,sha256=pguI0XQcZ-7jte5YUPexAufa1oxxalYO1JgmO6GU3rI,1557
33
35
  falyx/exceptions.py,sha256=58D4BYkyJ7PlpZoNk37GsUsFThm_gIlb2Ex2XXhLklI,1099
34
36
  falyx/execution_registry.py,sha256=7t_96-Q7R7MAJBvWwAt5IAERp0TjbGZPGeeJ1s24ey8,7628
35
- falyx/falyx.py,sha256=IGNgkaSgrF0jydQQulJUl0hJZT56tmy2UCDmC9DSWB8,49773
36
- falyx/falyx_completer.py,sha256=DH6SIkRU1dVdhzJ2NdKRhWaAhdlDe8xLm5aMgWih_oA,1836
37
+ falyx/falyx.py,sha256=G-jg0eEgZtjE07OxoMgvF9U6sOpdyZeRghPhyCyJnKU,49284
38
+ falyx/falyx_completer.py,sha256=MsfuZXpfGwbsGG-4Zp-j-vNsNnaote-UAJkJh0s2NZI,5236
37
39
  falyx/hook_manager.py,sha256=TFuHQnAncS_rk6vuw-VSx8bnAppLuHfrZCrzLwqcO9o,2979
38
40
  falyx/hooks.py,sha256=xMfQROib0BNsaQF4AXJpmCiGePoE1f1xpcdibgnVZWM,2913
39
41
  falyx/init.py,sha256=F9jg7mLPoBWXdJnc_fyWG7zVQSnrAO8ueDiP8AJxDWE,3331
@@ -44,7 +46,7 @@ falyx/parser/.pytyped,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
46
  falyx/parser/__init__.py,sha256=NbxAovKIY-duFTs6DAsdM_OzL7s3VIu19KMOmltX9ts,512
45
47
  falyx/parser/argument.py,sha256=25fyytWj6sH5UROSL-MEEKlDYXm-LwONCBTsn6pbzZ0,3443
46
48
  falyx/parser/argument_action.py,sha256=rNVeth0eMpkZRU_eT1RPVxOGzD4pbdAMx9Kq07T4mG4,709
47
- falyx/parser/command_argument_parser.py,sha256=ajd2_coCZKU37VWXEZGFN1qp54gnjiw1ziCa6FHKUpY,33907
49
+ falyx/parser/command_argument_parser.py,sha256=h0XvjmolJyuJZ7Wj87BwFRmD_yqJI2M8y7Up1EArJ3A,36569
48
50
  falyx/parser/parsers.py,sha256=X3eEltxBbwRwWG5Q1A1GqSdQCJZAYN5Eub0_U6dlBN4,9159
49
51
  falyx/parser/signature.py,sha256=fSltLEr8ctj1qpbU-OvTMnREjlb8OTG5t-guJFR7j4E,2529
50
52
  falyx/parser/utils.py,sha256=HYoTRR9-XbuzV2cz2BCfcHaGlzzFj4j3tlfuAx6-9t4,2942
@@ -59,9 +61,9 @@ falyx/themes/__init__.py,sha256=1CZhEUCin9cUk8IGYBUFkVvdHRNNJBEFXccHwpUKZCA,284
59
61
  falyx/themes/colors.py,sha256=4aaeAHJetmeNInI0Zytg4E3YqKfPFelpf04vtjSvsS8,19776
60
62
  falyx/utils.py,sha256=U45xnZFUdoFC4xiji_9S1jHS5V7MvxSDtufP8EgB0SM,6732
61
63
  falyx/validators.py,sha256=Pbdxh5777Y03HxyArAh2ApeVSx23in4w4K38G43Vt98,5197
62
- falyx/version.py,sha256=mSfkicuxJWIsRzwvWTgXF6azCtmLwU9PYRQ4CHsYpxE,23
63
- falyx-0.1.55.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
64
- falyx-0.1.55.dist-info/METADATA,sha256=MSU6PxGHEDBtNBDvI1irbtRBFf1Sf-SqgfRpZxTjjDM,5561
65
- falyx-0.1.55.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
66
- falyx-0.1.55.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
67
- falyx-0.1.55.dist-info/RECORD,,
64
+ falyx/version.py,sha256=sAxmq9B-f2SmXYi2UsleAKRrYxtQcxVilh7UIDB0-yM,23
65
+ falyx-0.1.56.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
66
+ falyx-0.1.56.dist-info/METADATA,sha256=uFba42NmAeHlTQoZ3gDNMnIBOQFFYvad1YtrfhDjg9M,5561
67
+ falyx-0.1.56.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
68
+ falyx-0.1.56.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
69
+ falyx-0.1.56.dist-info/RECORD,,
File without changes