falyx 0.1.26__py3-none-any.whl → 0.1.28__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.
falyx/exceptions.py CHANGED
@@ -28,3 +28,7 @@ class CircuitBreakerOpen(FalyxError):
28
28
 
29
29
  class EmptyChainError(FalyxError):
30
30
  """Exception raised when the chain is empty."""
31
+
32
+
33
+ class CommandArgumentError(FalyxError):
34
+ """Exception raised when there is an error in the command argument parser."""
@@ -100,7 +100,7 @@ class ExecutionRegistry:
100
100
 
101
101
  @classmethod
102
102
  def summary(cls):
103
- table = Table(title="[📊] Execution History", expand=True, box=box.SIMPLE)
103
+ table = Table(title="📊 Execution History", expand=True, box=box.SIMPLE)
104
104
 
105
105
  table.add_column("Name", style="bold cyan")
106
106
  table.add_column("Start", justify="right", style="dim")
falyx/falyx.py CHANGED
@@ -23,6 +23,7 @@ from __future__ import annotations
23
23
 
24
24
  import asyncio
25
25
  import logging
26
+ import shlex
26
27
  import sys
27
28
  from argparse import Namespace
28
29
  from difflib import get_close_matches
@@ -34,7 +35,8 @@ from prompt_toolkit import PromptSession
34
35
  from prompt_toolkit.completion import WordCompleter
35
36
  from prompt_toolkit.formatted_text import AnyFormattedText
36
37
  from prompt_toolkit.key_binding import KeyBindings
37
- from prompt_toolkit.validation import Validator
38
+ from prompt_toolkit.patch_stdout import patch_stdout
39
+ from prompt_toolkit.validation import ValidationError, Validator
38
40
  from rich import box
39
41
  from rich.console import Console
40
42
  from rich.markdown import Markdown
@@ -47,6 +49,7 @@ from falyx.context import ExecutionContext
47
49
  from falyx.debug import log_after, log_before, log_error, log_success
48
50
  from falyx.exceptions import (
49
51
  CommandAlreadyExistsError,
52
+ CommandArgumentError,
50
53
  FalyxError,
51
54
  InvalidActionError,
52
55
  NotAFalyxError,
@@ -57,19 +60,39 @@ from falyx.logger import logger
57
60
  from falyx.options_manager import OptionsManager
58
61
  from falyx.parsers import get_arg_parsers
59
62
  from falyx.retry import RetryPolicy
60
- from falyx.signals import BackSignal, QuitSignal
63
+ from falyx.signals import BackSignal, CancelSignal, HelpSignal, QuitSignal
61
64
  from falyx.themes import OneColors, get_nord_theme
62
- from falyx.utils import CaseInsensitiveDict, chunks, get_program_invocation
65
+ from falyx.utils import CaseInsensitiveDict, _noop, chunks, get_program_invocation
63
66
  from falyx.version import __version__
64
67
 
65
68
 
66
- class FalyxMode(str, Enum):
69
+ class FalyxMode(Enum):
67
70
  MENU = "menu"
68
71
  RUN = "run"
69
72
  PREVIEW = "preview"
70
73
  RUN_ALL = "run-all"
71
74
 
72
75
 
76
+ class CommandValidator(Validator):
77
+ """Validator to check if the input is a valid command or toggle key."""
78
+
79
+ def __init__(self, falyx: Falyx, error_message: str) -> None:
80
+ super().__init__()
81
+ self.falyx = falyx
82
+ self.error_message = error_message
83
+
84
+ def validate(self, document) -> None:
85
+ text = document.text
86
+ is_preview, choice, _, __ = self.falyx.get_command(text, from_validate=True)
87
+ if is_preview:
88
+ return None
89
+ if not choice:
90
+ raise ValidationError(
91
+ message=self.error_message,
92
+ cursor_position=document.get_end_of_document_position(),
93
+ )
94
+
95
+
73
96
  class Falyx:
74
97
  """
75
98
  Main menu controller for Falyx CLI applications.
@@ -237,8 +260,9 @@ class Falyx:
237
260
  def _get_exit_command(self) -> Command:
238
261
  """Returns the back command for the menu."""
239
262
  return Command(
240
- key="Q",
263
+ key="X",
241
264
  description="Exit",
265
+ action=Action("Exit", action=_noop),
242
266
  aliases=["EXIT", "QUIT"],
243
267
  style=OneColors.DARK_RED,
244
268
  )
@@ -266,9 +290,9 @@ class Falyx:
266
290
  help_text += " [dim](requires input)[/dim]"
267
291
  table.add_row(
268
292
  f"[{command.style}]{command.key}[/]",
269
- ", ".join(command.aliases) if command.aliases else "None",
293
+ ", ".join(command.aliases) if command.aliases else "",
270
294
  help_text,
271
- ", ".join(command.tags) if command.tags else "None",
295
+ ", ".join(command.tags) if command.tags else "",
272
296
  )
273
297
 
274
298
  table.add_row(
@@ -305,7 +329,7 @@ class Falyx:
305
329
  key="H",
306
330
  aliases=["HELP", "?"],
307
331
  description="Help",
308
- action=self._show_help,
332
+ action=Action("Help", self._show_help),
309
333
  style=OneColors.LIGHT_YELLOW,
310
334
  )
311
335
 
@@ -324,7 +348,7 @@ class Falyx:
324
348
  keys.extend(cmd.aliases)
325
349
  return WordCompleter(keys, ignore_case=True)
326
350
 
327
- def _get_validator(self) -> Validator:
351
+ def _get_validator_error_message(self) -> str:
328
352
  """Validator to check if the input is a valid command or toggle key."""
329
353
  keys = {self.exit_command.key.upper()}
330
354
  keys.update({alias.upper() for alias in self.exit_command.aliases})
@@ -353,18 +377,7 @@ class Falyx:
353
377
  if toggle_keys:
354
378
  message_lines.append(f" Toggles: {toggles_str}")
355
379
  error_message = " ".join(message_lines)
356
-
357
- def validator(text):
358
- is_preview, choice = self.get_command(text, from_validate=True)
359
- if is_preview and choice is None:
360
- return True
361
- return bool(choice)
362
-
363
- return Validator.from_callable(
364
- validator,
365
- error_message=error_message,
366
- move_cursor_to_end=True,
367
- )
380
+ return error_message
368
381
 
369
382
  def _invalidate_prompt_session_cache(self):
370
383
  """Forces the prompt session to be recreated on the next access."""
@@ -427,9 +440,10 @@ class Falyx:
427
440
  multiline=False,
428
441
  completer=self._get_completer(),
429
442
  reserve_space_for_menu=1,
430
- validator=self._get_validator(),
443
+ validator=CommandValidator(self, self._get_validator_error_message()),
431
444
  bottom_toolbar=self._get_bottom_bar_render(),
432
445
  key_bindings=self.key_bindings,
446
+ validate_while_typing=False,
433
447
  )
434
448
  return self._prompt_session
435
449
 
@@ -507,18 +521,19 @@ class Falyx:
507
521
 
508
522
  def update_exit_command(
509
523
  self,
510
- key: str = "Q",
524
+ key: str = "X",
511
525
  description: str = "Exit",
512
526
  aliases: list[str] | None = None,
513
- action: Callable[[], Any] = lambda: None,
527
+ action: Callable[[], Any] | None = None,
514
528
  style: str = OneColors.DARK_RED,
515
529
  confirm: bool = False,
516
530
  confirm_message: str = "Are you sure?",
517
531
  ) -> None:
518
532
  """Updates the back command of the menu."""
533
+ self._validate_command_key(key)
534
+ action = action or Action(description, action=_noop)
519
535
  if not callable(action):
520
536
  raise InvalidActionError("Action must be a callable.")
521
- self._validate_command_key(key)
522
537
  self.exit_command = Command(
523
538
  key=key,
524
539
  description=description,
@@ -537,7 +552,7 @@ class Falyx:
537
552
  raise NotAFalyxError("submenu must be an instance of Falyx.")
538
553
  self._validate_command_key(key)
539
554
  self.add_command(key, description, submenu.menu, style=style)
540
- if submenu.exit_command.key == "Q":
555
+ if submenu.exit_command.key == "X":
541
556
  submenu.update_exit_command(key="B", description="Back", aliases=["BACK"])
542
557
 
543
558
  def add_commands(self, commands: list[Command] | list[dict]) -> None:
@@ -692,32 +707,52 @@ class Falyx:
692
707
  return False, input_str.strip()
693
708
 
694
709
  def get_command(
695
- self, choice: str, from_validate=False
696
- ) -> tuple[bool, Command | None]:
710
+ self, raw_choices: str, from_validate=False
711
+ ) -> tuple[bool, Command | None, tuple, dict[str, Any]]:
697
712
  """
698
713
  Returns the selected command based on user input.
699
714
  Supports keys, aliases, and abbreviations.
700
715
  """
716
+ args = ()
717
+ kwargs: dict[str, Any] = {}
718
+ choice, *input_args = shlex.split(raw_choices)
701
719
  is_preview, choice = self.parse_preview_command(choice)
702
720
  if is_preview and not choice and self.help_command:
703
721
  is_preview = False
704
722
  choice = "?"
705
723
  elif is_preview and not choice:
724
+ # No help command enabled
706
725
  if not from_validate:
707
726
  self.console.print(
708
727
  f"[{OneColors.DARK_RED}]❌ You must enter a command for preview mode."
709
728
  )
710
- return is_preview, None
729
+ return is_preview, None, args, kwargs
711
730
 
712
731
  choice = choice.upper()
713
732
  name_map = self._name_map
714
-
715
733
  if choice in name_map:
716
- return is_preview, name_map[choice]
734
+ if not from_validate:
735
+ logger.info("Command '%s' selected.", choice)
736
+ if input_args and name_map[choice].arg_parser:
737
+ try:
738
+ args, kwargs = name_map[choice].parse_args(input_args)
739
+ except CommandArgumentError as error:
740
+ if not from_validate:
741
+ if not name_map[choice].show_help():
742
+ self.console.print(
743
+ f"[{OneColors.DARK_RED}]❌ Invalid arguments for '{choice}': {error}"
744
+ )
745
+ else:
746
+ name_map[choice].show_help()
747
+ raise ValidationError(
748
+ message=str(error), cursor_position=len(raw_choices)
749
+ )
750
+ return is_preview, None, args, kwargs
751
+ return is_preview, name_map[choice], args, kwargs
717
752
 
718
753
  prefix_matches = [cmd for key, cmd in name_map.items() if key.startswith(choice)]
719
754
  if len(prefix_matches) == 1:
720
- return is_preview, prefix_matches[0]
755
+ return is_preview, prefix_matches[0], args, kwargs
721
756
 
722
757
  fuzzy_matches = get_close_matches(choice, list(name_map.keys()), n=3, cutoff=0.7)
723
758
  if fuzzy_matches:
@@ -734,7 +769,7 @@ class Falyx:
734
769
  self.console.print(
735
770
  f"[{OneColors.LIGHT_YELLOW}]⚠️ Unknown command '{choice}'[/]"
736
771
  )
737
- return is_preview, None
772
+ return is_preview, None, args, kwargs
738
773
 
739
774
  def _create_context(self, selected_command: Command) -> ExecutionContext:
740
775
  """Creates a context dictionary for the selected command."""
@@ -757,8 +792,9 @@ class Falyx:
757
792
 
758
793
  async def process_command(self) -> bool:
759
794
  """Processes the action of the selected command."""
760
- choice = await self.prompt_session.prompt_async()
761
- is_preview, selected_command = self.get_command(choice)
795
+ with patch_stdout(raw=True):
796
+ choice = await self.prompt_session.prompt_async()
797
+ is_preview, selected_command, args, kwargs = self.get_command(choice)
762
798
  if not selected_command:
763
799
  logger.info("Invalid command '%s'.", choice)
764
800
  return True
@@ -787,8 +823,8 @@ class Falyx:
787
823
  context.start_timer()
788
824
  try:
789
825
  await self.hooks.trigger(HookType.BEFORE, context)
790
-
791
- result = await selected_command()
826
+ print(args, kwargs)
827
+ result = await selected_command(*args, **kwargs)
792
828
  context.result = result
793
829
  await self.hooks.trigger(HookType.ON_SUCCESS, context)
794
830
  except Exception as error:
@@ -801,10 +837,18 @@ class Falyx:
801
837
  await self.hooks.trigger(HookType.ON_TEARDOWN, context)
802
838
  return True
803
839
 
804
- async def run_key(self, command_key: str, return_context: bool = False) -> Any:
840
+ async def run_key(
841
+ self,
842
+ command_key: str,
843
+ return_context: bool = False,
844
+ args: tuple = (),
845
+ kwargs: dict[str, Any] | None = None,
846
+ ) -> Any:
805
847
  """Run a command by key without displaying the menu (non-interactive mode)."""
806
848
  self.debug_hooks()
807
- is_preview, selected_command = self.get_command(command_key)
849
+ is_preview, selected_command, _, __ = self.get_command(command_key)
850
+ kwargs = kwargs or {}
851
+
808
852
  self.last_run_command = selected_command
809
853
 
810
854
  if not selected_command:
@@ -825,7 +869,7 @@ class Falyx:
825
869
  context.start_timer()
826
870
  try:
827
871
  await self.hooks.trigger(HookType.BEFORE, context)
828
- result = await selected_command()
872
+ result = await selected_command(*args, **kwargs)
829
873
  context.result = result
830
874
 
831
875
  await self.hooks.trigger(HookType.ON_SUCCESS, context)
@@ -918,6 +962,10 @@ class Falyx:
918
962
  break
919
963
  except BackSignal:
920
964
  logger.info("BackSignal received.")
965
+ except CancelSignal:
966
+ logger.info("CancelSignal received.")
967
+ except HelpSignal:
968
+ logger.info("HelpSignal received.")
921
969
  finally:
922
970
  logger.info("Exiting menu: %s", self.get_title())
923
971
  if self.exit_message:
@@ -952,7 +1000,7 @@ class Falyx:
952
1000
 
953
1001
  if self.cli_args.command == "preview":
954
1002
  self.mode = FalyxMode.PREVIEW
955
- _, command = self.get_command(self.cli_args.name)
1003
+ _, command, args, kwargs = self.get_command(self.cli_args.name)
956
1004
  if not command:
957
1005
  self.console.print(
958
1006
  f"[{OneColors.DARK_RED}]❌ Command '{self.cli_args.name}' not found."
@@ -966,7 +1014,7 @@ class Falyx:
966
1014
 
967
1015
  if self.cli_args.command == "run":
968
1016
  self.mode = FalyxMode.RUN
969
- is_preview, command = self.get_command(self.cli_args.name)
1017
+ is_preview, command, _, __ = self.get_command(self.cli_args.name)
970
1018
  if is_preview:
971
1019
  if command is None:
972
1020
  sys.exit(1)
@@ -977,7 +1025,11 @@ class Falyx:
977
1025
  sys.exit(1)
978
1026
  self._set_retry_policy(command)
979
1027
  try:
980
- await self.run_key(self.cli_args.name)
1028
+ args, kwargs = command.parse_args(self.cli_args.command_args)
1029
+ except HelpSignal:
1030
+ sys.exit(0)
1031
+ try:
1032
+ await self.run_key(self.cli_args.name, args=args, kwargs=kwargs)
981
1033
  except FalyxError as error:
982
1034
  self.console.print(f"[{OneColors.DARK_RED}]❌ Error: {error}[/]")
983
1035
  sys.exit(1)
falyx/parsers.py CHANGED
@@ -2,7 +2,7 @@
2
2
  """parsers.py
3
3
  This module contains the argument parsers used for the Falyx CLI.
4
4
  """
5
- from argparse import ArgumentParser, Namespace, _SubParsersAction
5
+ from argparse import REMAINDER, ArgumentParser, Namespace, _SubParsersAction
6
6
  from dataclasses import asdict, dataclass
7
7
  from typing import Any, Sequence
8
8
 
@@ -114,6 +114,12 @@ def get_arg_parsers(
114
114
  help="Skip confirmation prompts",
115
115
  )
116
116
 
117
+ run_group.add_argument(
118
+ "command_args",
119
+ nargs=REMAINDER,
120
+ help="Arguments to pass to the command (if applicable)",
121
+ )
122
+
117
123
  run_all_parser = subparsers.add_parser(
118
124
  "run-all", help="Run all commands with a given tag"
119
125
  )
falyx/protocols.py CHANGED
@@ -2,10 +2,16 @@
2
2
  """protocols.py"""
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any, Protocol
5
+ from typing import Any, Awaitable, Protocol, runtime_checkable
6
6
 
7
7
  from falyx.action.action import BaseAction
8
8
 
9
9
 
10
+ @runtime_checkable
10
11
  class ActionFactoryProtocol(Protocol):
11
- def __call__(self, *args: Any, **kwargs: Any) -> BaseAction: ...
12
+ async def __call__(self, *args: Any, **kwargs: Any) -> Awaitable[BaseAction]: ...
13
+
14
+
15
+ @runtime_checkable
16
+ class ArgParserProtocol(Protocol):
17
+ def __call__(self, args: list[str]) -> tuple[tuple, dict]: ...
falyx/signals.py CHANGED
@@ -22,3 +22,17 @@ class BackSignal(FlowSignal):
22
22
 
23
23
  def __init__(self, message: str = "Back signal received."):
24
24
  super().__init__(message)
25
+
26
+
27
+ class CancelSignal(FlowSignal):
28
+ """Raised to cancel the current command or action."""
29
+
30
+ def __init__(self, message: str = "Cancel signal received."):
31
+ super().__init__(message)
32
+
33
+
34
+ class HelpSignal(FlowSignal):
35
+ """Raised to display help information."""
36
+
37
+ def __init__(self, message: str = "Help signal received."):
38
+ super().__init__(message)
falyx/utils.py CHANGED
@@ -48,6 +48,7 @@ def ensure_async(function: Callable[..., T]) -> Callable[..., Awaitable[T]]:
48
48
 
49
49
  if not callable(function):
50
50
  raise TypeError(f"{function} is not callable")
51
+
51
52
  return async_wrapper
52
53
 
53
54
 
falyx/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.26"
1
+ __version__ = "0.1.28"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: falyx
3
- Version: 0.1.26
3
+ Version: 0.1.28
4
4
  Summary: Reliable and introspectable async CLI action framework.
5
5
  License: MIT
6
6
  Author: Roland Thomas Jr
@@ -1,46 +1,48 @@
1
1
  falyx/.pytyped,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  falyx/__init__.py,sha256=L40665QyjAqHQxHdxxY2_yPeDa4p0LE7Nu_2dkm08Ls,650
3
3
  falyx/__main__.py,sha256=g_LwJieofK3DJzCYtpkAMEeOXhzSLQenb7pRVUqcf-Y,2152
4
- falyx/action/__init__.py,sha256=P3Eh0lE2VunzxqwfLbZKxE6FEcdR_u5OROkDTBYgeP0,904
4
+ falyx/action/__init__.py,sha256=zpOK5g4DybydV8d3QI0Zq52aWaKFPYi-J6szAQTsQ2c,974
5
5
  falyx/action/action.py,sha256=CJB9eeeEqBGkZHjMpG24eXHRjouKSfESCI1zWzoE7JQ,32488
6
- falyx/action/action_factory.py,sha256=qhlx8-BAEiNDJrbzF0HZzipY09Ple6J7FxxNvoBda9Y,4228
6
+ falyx/action/action_factory.py,sha256=qNtEnsbKsNl-WijChbTQYfdI3k14fN-1bzDsGFx8yZI,4517
7
7
  falyx/action/http_action.py,sha256=aIieGHyZSkz1ZGay-fwgDYZ0QF17XypAWtKeVAYp5f4,5806
8
8
  falyx/action/io_action.py,sha256=zdDq07zSLlaShBQ3ztXTRC6aZL0JoERNZSmvHy1V22w,9718
9
- falyx/action/menu_action.py,sha256=8qttPuq0AUh_oFaa3A82e19dSl4ZhQ9Y_j5CU7zHAlc,5532
9
+ falyx/action/menu_action.py,sha256=cboCpXyl0fZUxpFsvEPu0dGhFfr_vdfllceQnICA0gU,5683
10
10
  falyx/action/select_file_action.py,sha256=hHLhmTSacWaUXhRTeIIiXt8gR7zbjkXJ2MAkKQYCpp4,7799
11
11
  falyx/action/selection_action.py,sha256=22rF7UqRrQAMjGIheDqAbUizVMBg9aCl9e4VOLLZZJo,8811
12
12
  falyx/action/signal_action.py,sha256=5UMqvzy7fBnLANGwYUWoe1VRhrr7e-yOVeLdOnCBiJo,1350
13
13
  falyx/action/types.py,sha256=iVD-bHm1GRXOTIlHOeT_KcDBRZm4Hz5Xzl_BOalvEf4,961
14
+ falyx/action/user_input_action.py,sha256=LSTzC_3TfsfXdz-qV3GlOIGpZWAOgO9J5DnNsHO7ee8,3398
15
+ falyx/argparse.py,sha256=kI_tLYD6KOiWvXEHEvOi8bprx5sQm9KTrgens2_nWKU,24498
14
16
  falyx/bottom_bar.py,sha256=iWxgOKWgn5YmREeZBuGA50FzqzEfz1-Vnqm0V_fhldc,7383
15
- falyx/command.py,sha256=s7r9aeUYEk9iUNE69JQtlFoPx9AehTxkHMPxpLKVIOA,12238
17
+ falyx/command.py,sha256=Vr5YHehZB6GavBbHe9diNbdeXNWfnWTkuDZ-NfymcFo,13437
16
18
  falyx/config.py,sha256=8dkQfL-Ro-vWw1AcO2fD1PGZ92Cyfnwl885ZlpLkp4Y,9636
17
19
  falyx/config_schema.py,sha256=j5GQuHVlaU-VLxLF9t8idZRjqOP9MIKp1hyd9NhpAGU,3124
18
20
  falyx/context.py,sha256=FNF-IS7RMDxel2l3kskEqQImZ0mLO6zvGw_xC9cIzgI,10338
19
21
  falyx/debug.py,sha256=oWWTLOF8elrx_RGZ1G4pbzfFr46FjB0woFXpVU2wmjU,1567
20
- falyx/exceptions.py,sha256=Qxp6UScZWEyno-6Lgksrv3s9iwjbr2U-d6hun-_xpc0,798
21
- falyx/execution_registry.py,sha256=re56TImfL67p30ZlVBjqxz9Nn34SD4gvTlwFVPSzVCM,4712
22
- falyx/falyx.py,sha256=JvFbq_7tiyW5axGRIy4UDf3s0gBDbw1MZr_ivkUqH3k,40627
22
+ falyx/exceptions.py,sha256=kK9k1v7LVNjJSwYztRa9Krhr3ZOI-6Htq2ZjlYICPKg,922
23
+ falyx/execution_registry.py,sha256=rctsz0mrIHPToLZqylblVjDdKWdq1x_JBc8GwMP5sJ8,4710
24
+ falyx/falyx.py,sha256=3OrmQ0p7ZOpjLaH5mqTYVEZ96KKTygSLYlPqg3eH5eM,43061
23
25
  falyx/hook_manager.py,sha256=GuGxVVz9FXrU39Tk220QcsLsMXeut7ZDkGW3hU9GcwQ,2952
24
26
  falyx/hooks.py,sha256=IV2nbj5FjY2m3_L7x4mYBnaRDG45E8tWQU90i4butlw,2940
25
27
  falyx/init.py,sha256=abcSlPmxVeByLIHdUkNjqtO_tEkO3ApC6f9WbxsSEWg,3393
26
28
  falyx/logger.py,sha256=1Mfb_vJFJ1tQwziuyU2p-cSMi2Js8N2byniFEnI6vOQ,132
27
29
  falyx/menu.py,sha256=faxGgocqQYY6HtzVbenHaFj8YqsmycBEyziC8Ahzqjo,2870
28
30
  falyx/options_manager.py,sha256=dFAnQw543tQ6Xupvh1PwBrhiSWlSACHw8K-sHP_lUh4,2842
29
- falyx/parsers.py,sha256=hxrBouQEqdgk6aWzNa7UwTg7u55vJffSEUUTiiQoI0U,5602
31
+ falyx/parsers.py,sha256=KsDFEmJLM86d2X4Kh4SHA9mBbUk351NjLhhFYzQkaPk,5762
30
32
  falyx/prompt_utils.py,sha256=qgk0bXs7mwzflqzWyFhEOTpKQ_ZtMIqGhKeg-ocwNnE,1542
31
- falyx/protocols.py,sha256=dXNS-kh-5XB92PE5POy4uJ4KLT0O3ZAoiqw55jgR2IM,306
33
+ falyx/protocols.py,sha256=mesdq5CjPF_5Kyu7Evwr6qMT71tUHlw0SjjtmnggTZw,495
32
34
  falyx/retry.py,sha256=UUzY6FlKobr84Afw7yJO9rj3AIQepDk2fcWs6_1gi6Q,3788
33
35
  falyx/retry_utils.py,sha256=EAzc-ECTu8AxKkmlw28ioOW9y-Y9tLQ0KasvSkBRYgs,694
34
36
  falyx/selection.py,sha256=l2LLISqgP8xfHdcTAEbTTqs_Bae4-LVUKMN7VQH7tM0,10731
35
- falyx/signals.py,sha256=4PTuVRB_P_aWfnU8pANqhMxGTLq7TJDEyk9jCp0Bx2c,713
37
+ falyx/signals.py,sha256=Y_neFXpfHs7qY0syw9XcfR9WeAGRcRw1nG_2L1JJqKE,1083
36
38
  falyx/tagged_table.py,sha256=4SV-SdXFrAhy1JNToeBCvyxT-iWVf6cWY7XETTys4n8,1067
37
39
  falyx/themes/__init__.py,sha256=1CZhEUCin9cUk8IGYBUFkVvdHRNNJBEFXccHwpUKZCA,284
38
40
  falyx/themes/colors.py,sha256=4aaeAHJetmeNInI0Zytg4E3YqKfPFelpf04vtjSvsS8,19776
39
- falyx/utils.py,sha256=uss-FV8p164pmhoqYtQt8gNp5z8fGbuMAk4dRJ6RopI,6717
41
+ falyx/utils.py,sha256=u3puR4Bh-unNBw9a0V9sw7PDTIzRaNLolap0oz5bVIk,6718
40
42
  falyx/validators.py,sha256=t5iyzVpY8tdC4rfhr4isEfWpD5gNTzjeX_Hbi_Uq6sA,1328
41
- falyx/version.py,sha256=3_QdGLpuk_SDY7k9PpNcHpSTjlPdhadPiEgF82wzkqk,23
42
- falyx-0.1.26.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
43
- falyx-0.1.26.dist-info/METADATA,sha256=Z1v5YL-vgfSBwAaYzcaZI4oUq0ee_3ul2D6jHqbpv_M,5521
44
- falyx-0.1.26.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
45
- falyx-0.1.26.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
46
- falyx-0.1.26.dist-info/RECORD,,
43
+ falyx/version.py,sha256=MWZDdAHrdUZS0c3VlLqX4O1eaxPodI7irMtEvknKQ94,23
44
+ falyx-0.1.28.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
45
+ falyx-0.1.28.dist-info/METADATA,sha256=n-VK44OFgjFxyRn1-LdysM1ciDF8RKxlKfAy_0Yz_Zc,5521
46
+ falyx-0.1.28.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
47
+ falyx-0.1.28.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
48
+ falyx-0.1.28.dist-info/RECORD,,
File without changes