falyx 0.1.21__py3-none-any.whl → 0.1.22__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/__main__.py CHANGED
@@ -14,6 +14,7 @@ from typing import Any
14
14
  from falyx.config import loader
15
15
  from falyx.falyx import Falyx
16
16
  from falyx.parsers import FalyxParsers, get_arg_parsers
17
+ from falyx.themes.colors import OneColors
17
18
 
18
19
 
19
20
  def find_falyx_config() -> Path | None:
@@ -71,6 +72,7 @@ def run(args: Namespace) -> Any:
71
72
  title="🛠️ Config-Driven CLI",
72
73
  cli_args=args,
73
74
  columns=4,
75
+ prompt=[(OneColors.BLUE_b, "FALYX > ")],
74
76
  )
75
77
  flx.add_commands(loader(bootstrap_path))
76
78
  return asyncio.run(flx.run())
falyx/command.py CHANGED
@@ -272,15 +272,21 @@ class Command(BaseModel):
272
272
  if hasattr(self.action, "preview") and callable(self.action.preview):
273
273
  tree = Tree(label)
274
274
  await self.action.preview(parent=tree)
275
+ if self.help_text:
276
+ tree.add(f"[dim]💡 {self.help_text}[/dim]")
275
277
  console.print(tree)
276
278
  elif callable(self.action) and not isinstance(self.action, BaseAction):
277
279
  console.print(f"{label}")
280
+ if self.help_text:
281
+ console.print(f"[dim]💡 {self.help_text}[/dim]")
278
282
  console.print(
279
283
  f"[{OneColors.LIGHT_RED_b}]→ Would call:[/] {self.action.__name__}"
280
284
  f"[dim](args={self.args}, kwargs={self.kwargs})[/dim]"
281
285
  )
282
286
  else:
283
287
  console.print(f"{label}")
288
+ if self.help_text:
289
+ console.print(f"[dim]💡 {self.help_text}[/dim]")
284
290
  console.print(
285
291
  f"[{OneColors.DARK_RED}]⚠️ Action is not callable or lacks a preview method.[/]"
286
292
  )
falyx/config.py CHANGED
@@ -3,15 +3,21 @@
3
3
  Configuration loader for Falyx CLI commands."""
4
4
 
5
5
  import importlib
6
+ import sys
6
7
  from pathlib import Path
7
8
  from typing import Any
8
9
 
9
10
  import toml
10
11
  import yaml
12
+ from rich.console import Console
11
13
 
12
14
  from falyx.action import Action, BaseAction
13
15
  from falyx.command import Command
14
16
  from falyx.retry import RetryPolicy
17
+ from falyx.themes.colors import OneColors
18
+ from falyx.utils import logger
19
+
20
+ console = Console(color_system="auto")
15
21
 
16
22
 
17
23
  def wrap_if_needed(obj: Any, name=None) -> BaseAction | Command:
@@ -30,9 +36,28 @@ def import_action(dotted_path: str) -> Any:
30
36
  """Dynamically imports a callable from a dotted path like 'my.module.func'."""
31
37
  module_path, _, attr = dotted_path.rpartition(".")
32
38
  if not module_path:
33
- raise ValueError(f"Invalid action path: {dotted_path}")
34
- module = importlib.import_module(module_path)
35
- return getattr(module, attr)
39
+ console.print(f"[{OneColors.DARK_RED}]❌ Invalid action path:[/] {dotted_path}")
40
+ sys.exit(1)
41
+ try:
42
+ module = importlib.import_module(module_path)
43
+ except ModuleNotFoundError as error:
44
+ logger.error("Failed to import module '%s': %s", module_path, error)
45
+ console.print(
46
+ f"[{OneColors.DARK_RED}]❌ Could not import '{dotted_path}': {error}[/]\n"
47
+ f"[{OneColors.COMMENT_GREY}]Ensure the module is installed and discoverable via PYTHONPATH."
48
+ )
49
+ sys.exit(1)
50
+ try:
51
+ action = getattr(module, attr)
52
+ except AttributeError as error:
53
+ logger.error(
54
+ "Module '%s' does not have attribute '%s': %s", module_path, attr, error
55
+ )
56
+ console.print(
57
+ f"[{OneColors.DARK_RED}]❌ Module '{module_path}' has no attribute '{attr}': {error}[/]"
58
+ )
59
+ sys.exit(1)
60
+ return action
36
61
 
37
62
 
38
63
  def loader(file_path: Path | str) -> list[dict[str, Any]]:
falyx/falyx.py CHANGED
@@ -283,7 +283,7 @@ class Falyx:
283
283
  self.console.print(table, justify="center")
284
284
  if self.mode == FalyxMode.MENU:
285
285
  self.console.print(
286
- f"📦 Tip: Type '[{OneColors.LIGHT_YELLOW}]?[KEY][/]' to preview a command before running it.\n",
286
+ f"📦 Tip: '[{OneColors.LIGHT_YELLOW}]?[KEY][/]' to preview a command before running it.\n",
287
287
  justify="center",
288
288
  )
289
289
 
@@ -343,7 +343,9 @@ class Falyx:
343
343
  error_message = " ".join(message_lines)
344
344
 
345
345
  def validator(text):
346
- _, choice = self.get_command(text, from_validate=True)
346
+ is_preview, choice = self.get_command(text, from_validate=True)
347
+ if is_preview and choice is None:
348
+ return True
347
349
  return True if choice else False
348
350
 
349
351
  return Validator.from_callable(
@@ -694,6 +696,13 @@ class Falyx:
694
696
  ) -> tuple[bool, Command | None]:
695
697
  """Returns the selected command based on user input. Supports keys, aliases, and abbreviations."""
696
698
  is_preview, choice = self.parse_preview_command(choice)
699
+ if is_preview and not choice:
700
+ if not from_validate:
701
+ self.console.print(
702
+ f"[{OneColors.DARK_RED}]❌ You must enter a command for preview mode.[/]"
703
+ )
704
+ return is_preview, None
705
+
697
706
  choice = choice.upper()
698
707
  name_map = self._name_map
699
708
 
@@ -788,12 +797,17 @@ class Falyx:
788
797
  async def run_key(self, command_key: str, return_context: bool = False) -> Any:
789
798
  """Run a command by key without displaying the menu (non-interactive mode)."""
790
799
  self.debug_hooks()
791
- _, selected_command = self.get_command(command_key)
800
+ is_preview, selected_command = self.get_command(command_key)
792
801
  self.last_run_command = selected_command
793
802
 
794
803
  if not selected_command:
795
804
  return None
796
805
 
806
+ if is_preview:
807
+ logger.info(f"Preview command '{selected_command.key}' selected.")
808
+ await selected_command.preview()
809
+ return None
810
+
797
811
  logger.info(
798
812
  "[run_key] 🚀 Executing: %s — %s",
799
813
  selected_command.key,
@@ -943,11 +957,14 @@ class Falyx:
943
957
 
944
958
  if self.cli_args.command == "run":
945
959
  self.mode = FalyxMode.RUN
946
- _, command = self.get_command(self.cli_args.name)
960
+ is_preview, command = self.get_command(self.cli_args.name)
961
+ if is_preview:
962
+ if command is None:
963
+ sys.exit(1)
964
+ logger.info(f"Preview command '{command.key}' selected.")
965
+ await command.preview()
966
+ sys.exit(0)
947
967
  if not command:
948
- self.console.print(
949
- f"[{OneColors.DARK_RED}]❌ Command '{self.cli_args.name}' not found.[/]"
950
- )
951
968
  sys.exit(1)
952
969
  self._set_retry_policy(command)
953
970
  try:
@@ -955,6 +972,9 @@ class Falyx:
955
972
  except FalyxError as error:
956
973
  self.console.print(f"[{OneColors.DARK_RED}]❌ Error: {error}[/]")
957
974
  sys.exit(1)
975
+
976
+ if self.cli_args.summary:
977
+ er.summary()
958
978
  sys.exit(0)
959
979
 
960
980
  if self.cli_args.command == "run-all":
@@ -976,6 +996,10 @@ class Falyx:
976
996
  for cmd in matching:
977
997
  self._set_retry_policy(cmd)
978
998
  await self.run_key(cmd.key)
999
+
1000
+ if self.cli_args.summary:
1001
+ er.summary()
1002
+
979
1003
  sys.exit(0)
980
1004
 
981
1005
  await self.menu()
falyx/io_action.py CHANGED
@@ -59,6 +59,7 @@ class BaseIOAction(BaseAction):
59
59
  def __init__(
60
60
  self,
61
61
  name: str,
62
+ *,
62
63
  hooks: HookManager | None = None,
63
64
  mode: str = "buffered",
64
65
  logging_hooks: bool = True,
falyx/parsers.py CHANGED
@@ -36,7 +36,9 @@ def get_arg_parsers(
36
36
  prog: str | None = "falyx",
37
37
  usage: str | None = None,
38
38
  description: str | None = "Falyx CLI - Run structured async command workflows.",
39
- epilog: str | None = None,
39
+ epilog: (
40
+ str | None
41
+ ) = "Tip: Use 'falyx run ?[COMMAND]' to preview any command from the CLI.",
40
42
  parents: Sequence[ArgumentParser] = [],
41
43
  prefix_chars: str = "-",
42
44
  fromfile_prefix_chars: str | None = None,
@@ -79,6 +81,11 @@ def get_arg_parsers(
79
81
 
80
82
  run_parser = subparsers.add_parser("run", help="Run a specific command")
81
83
  run_parser.add_argument("name", help="Key, alias, or description of the command")
84
+ run_parser.add_argument(
85
+ "--summary",
86
+ action="store_true",
87
+ help="Print an execution summary after command completes",
88
+ )
82
89
  run_parser.add_argument(
83
90
  "--retries", type=int, help="Number of retries on failure", default=0
84
91
  )
@@ -111,6 +118,11 @@ def get_arg_parsers(
111
118
  "run-all", help="Run all commands with a given tag"
112
119
  )
113
120
  run_all_parser.add_argument("-t", "--tag", required=True, help="Tag to match")
121
+ run_all_parser.add_argument(
122
+ "--summary",
123
+ action="store_true",
124
+ help="Print a summary after all tagged commands run",
125
+ )
114
126
  run_all_parser.add_argument(
115
127
  "--retries", type=int, help="Number of retries on failure", default=0
116
128
  )
@@ -137,7 +137,9 @@ class SelectFileAction(BaseAction):
137
137
 
138
138
  options = self.get_options(files)
139
139
 
140
- table = render_selection_dict_table(self.title, options, self.columns)
140
+ table = render_selection_dict_table(
141
+ title=self.title, selections=options, columns=self.columns
142
+ )
141
143
 
142
144
  key = await prompt_for_selection(
143
145
  options.keys(),
falyx/selection.py CHANGED
@@ -31,6 +31,7 @@ class SelectionOption:
31
31
 
32
32
  def render_table_base(
33
33
  title: str,
34
+ *,
34
35
  caption: str = "",
35
36
  columns: int = 4,
36
37
  box_style: box.Box = box.SIMPLE,
@@ -71,6 +72,7 @@ def render_table_base(
71
72
  def render_selection_grid(
72
73
  title: str,
73
74
  selections: Sequence[str],
75
+ *,
74
76
  columns: int = 4,
75
77
  caption: str = "",
76
78
  box_style: box.Box = box.SIMPLE,
@@ -86,19 +88,19 @@ def render_selection_grid(
86
88
  ) -> Table:
87
89
  """Create a selection table with the given parameters."""
88
90
  table = render_table_base(
89
- title,
90
- caption,
91
- columns,
92
- box_style,
93
- show_lines,
94
- show_header,
95
- show_footer,
96
- style,
97
- header_style,
98
- footer_style,
99
- title_style,
100
- caption_style,
101
- highlight,
91
+ title=title,
92
+ caption=caption,
93
+ columns=columns,
94
+ box_style=box_style,
95
+ show_lines=show_lines,
96
+ show_header=show_header,
97
+ show_footer=show_footer,
98
+ style=style,
99
+ header_style=header_style,
100
+ footer_style=footer_style,
101
+ title_style=title_style,
102
+ caption_style=caption_style,
103
+ highlight=highlight,
102
104
  )
103
105
 
104
106
  for chunk in chunks(selections, columns):
@@ -110,6 +112,7 @@ def render_selection_grid(
110
112
  def render_selection_indexed_table(
111
113
  title: str,
112
114
  selections: Sequence[str],
115
+ *,
113
116
  columns: int = 4,
114
117
  caption: str = "",
115
118
  box_style: box.Box = box.SIMPLE,
@@ -126,19 +129,19 @@ def render_selection_indexed_table(
126
129
  ) -> Table:
127
130
  """Create a selection table with the given parameters."""
128
131
  table = render_table_base(
129
- title,
130
- caption,
131
- columns,
132
- box_style,
133
- show_lines,
134
- show_header,
135
- show_footer,
136
- style,
137
- header_style,
138
- footer_style,
139
- title_style,
140
- caption_style,
141
- highlight,
132
+ title=title,
133
+ caption=caption,
134
+ columns=columns,
135
+ box_style=box_style,
136
+ show_lines=show_lines,
137
+ show_header=show_header,
138
+ show_footer=show_footer,
139
+ style=style,
140
+ header_style=header_style,
141
+ footer_style=footer_style,
142
+ title_style=title_style,
143
+ caption_style=caption_style,
144
+ highlight=highlight,
142
145
  )
143
146
 
144
147
  for indexes, chunk in zip(
@@ -156,6 +159,7 @@ def render_selection_indexed_table(
156
159
  def render_selection_dict_table(
157
160
  title: str,
158
161
  selections: dict[str, SelectionOption],
162
+ *,
159
163
  columns: int = 2,
160
164
  caption: str = "",
161
165
  box_style: box.Box = box.SIMPLE,
@@ -171,19 +175,19 @@ def render_selection_dict_table(
171
175
  ) -> Table:
172
176
  """Create a selection table with the given parameters."""
173
177
  table = render_table_base(
174
- title,
175
- caption,
176
- columns,
177
- box_style,
178
- show_lines,
179
- show_header,
180
- show_footer,
181
- style,
182
- header_style,
183
- footer_style,
184
- title_style,
185
- caption_style,
186
- highlight,
178
+ title=title,
179
+ caption=caption,
180
+ columns=columns,
181
+ box_style=box_style,
182
+ show_lines=show_lines,
183
+ show_header=show_header,
184
+ show_footer=show_footer,
185
+ style=style,
186
+ header_style=header_style,
187
+ footer_style=footer_style,
188
+ title_style=title_style,
189
+ caption_style=caption_style,
190
+ highlight=highlight,
187
191
  )
188
192
 
189
193
  for chunk in chunks(selections.items(), columns):
@@ -200,6 +204,7 @@ def render_selection_dict_table(
200
204
  async def prompt_for_index(
201
205
  max_index: int,
202
206
  table: Table,
207
+ *,
203
208
  min_index: int = 0,
204
209
  default_selection: str = "",
205
210
  console: Console | None = None,
@@ -224,6 +229,7 @@ async def prompt_for_index(
224
229
  async def prompt_for_selection(
225
230
  keys: Sequence[str] | KeysView[str],
226
231
  table: Table,
232
+ *,
227
233
  default_selection: str = "",
228
234
  console: Console | None = None,
229
235
  prompt_session: PromptSession | None = None,
@@ -249,6 +255,7 @@ async def prompt_for_selection(
249
255
  async def select_value_from_list(
250
256
  title: str,
251
257
  selections: Sequence[str],
258
+ *,
252
259
  console: Console | None = None,
253
260
  prompt_session: PromptSession | None = None,
254
261
  prompt_message: str = "Select an option > ",
@@ -268,20 +275,20 @@ async def select_value_from_list(
268
275
  ):
269
276
  """Prompt for a selection. Return the selected item."""
270
277
  table = render_selection_indexed_table(
271
- title,
272
- selections,
273
- columns,
274
- caption,
275
- box_style,
276
- show_lines,
277
- show_header,
278
- show_footer,
279
- style,
280
- header_style,
281
- footer_style,
282
- title_style,
283
- caption_style,
284
- highlight,
278
+ title=title,
279
+ selections=selections,
280
+ columns=columns,
281
+ caption=caption,
282
+ box_style=box_style,
283
+ show_lines=show_lines,
284
+ show_header=show_header,
285
+ show_footer=show_footer,
286
+ style=style,
287
+ header_style=header_style,
288
+ footer_style=footer_style,
289
+ title_style=title_style,
290
+ caption_style=caption_style,
291
+ highlight=highlight,
285
292
  )
286
293
  prompt_session = prompt_session or PromptSession()
287
294
  console = console or Console(color_system="auto")
@@ -301,6 +308,7 @@ async def select_value_from_list(
301
308
  async def select_key_from_dict(
302
309
  selections: dict[str, SelectionOption],
303
310
  table: Table,
311
+ *,
304
312
  console: Console | None = None,
305
313
  prompt_session: PromptSession | None = None,
306
314
  prompt_message: str = "Select an option > ",
@@ -325,6 +333,7 @@ async def select_key_from_dict(
325
333
  async def select_value_from_dict(
326
334
  selections: dict[str, SelectionOption],
327
335
  table: Table,
336
+ *,
328
337
  console: Console | None = None,
329
338
  prompt_session: PromptSession | None = None,
330
339
  prompt_message: str = "Select an option > ",
@@ -351,6 +360,7 @@ async def select_value_from_dict(
351
360
  async def get_selection_from_dict_menu(
352
361
  title: str,
353
362
  selections: dict[str, SelectionOption],
363
+ *,
354
364
  console: Console | None = None,
355
365
  prompt_session: PromptSession | None = None,
356
366
  prompt_message: str = "Select an option > ",
@@ -363,10 +373,10 @@ async def get_selection_from_dict_menu(
363
373
  )
364
374
 
365
375
  return await select_value_from_dict(
366
- selections,
367
- table,
368
- console,
369
- prompt_session,
370
- prompt_message,
371
- default_selection,
376
+ selections=selections,
377
+ table=table,
378
+ console=console,
379
+ prompt_session=prompt_session,
380
+ prompt_message=prompt_message,
381
+ default_selection=default_selection,
372
382
  )
falyx/selection_action.py CHANGED
@@ -1,6 +1,5 @@
1
1
  # Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
2
2
  """selection_action.py"""
3
- from pathlib import Path
4
3
  from typing import Any
5
4
 
6
5
  from prompt_toolkit import PromptSession
@@ -117,7 +116,9 @@ class SelectionAction(BaseAction):
117
116
  await self.hooks.trigger(HookType.BEFORE, context)
118
117
  if isinstance(self.selections, list):
119
118
  table = render_selection_indexed_table(
120
- self.title, self.selections, self.columns
119
+ title=self.title,
120
+ selections=self.selections,
121
+ columns=self.columns,
121
122
  )
122
123
  if not self.never_prompt:
123
124
  index = await prompt_for_index(
@@ -134,7 +135,7 @@ class SelectionAction(BaseAction):
134
135
  result = self.selections[int(index)]
135
136
  elif isinstance(self.selections, dict):
136
137
  table = render_selection_dict_table(
137
- self.title, self.selections, self.columns
138
+ title=self.title, selections=self.selections, columns=self.columns
138
139
  )
139
140
  if not self.never_prompt:
140
141
  key = await prompt_for_selection(
falyx/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.21"
1
+ __version__ = "0.1.22"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: falyx
3
- Version: 0.1.21
3
+ Version: 0.1.22
4
4
  Summary: Reliable and introspectable async CLI action framework.
5
5
  License: MIT
6
6
  Author: Roland Thomas Jr
@@ -1,40 +1,40 @@
1
1
  falyx/.pytyped,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  falyx/__init__.py,sha256=dYRamQJlT1Zoy5Uu1uG4NCV05Xk98nN1LAQrSR1CT2A,643
3
- falyx/__main__.py,sha256=pXxXLlDot33dc4mR11Njpr4M_xbSTdKEqKWMS2aUqfk,2195
3
+ falyx/__main__.py,sha256=559pd3P1iScvC-V__gfXUbEQTxeV7PXlRcQI9kpMQcg,2286
4
4
  falyx/action.py,sha256=J-SG5zltYbqtdvTwBBUeEj4jp44DOKBR6G5rvmdkkTs,32147
5
5
  falyx/action_factory.py,sha256=SMucCBuigKk3rlKXCEN69Sew4dVaBUxQqxyUUAHMZeo,3629
6
6
  falyx/bottom_bar.py,sha256=NTen52Nfz32eWSBmJtEUuJO33u5sGQj-33IeudPVsqQ,7403
7
- falyx/command.py,sha256=sKUcH0QQ-OXQf6UwxL_cM1lLvBPuNi8yi9cFE8HOGzY,11910
8
- falyx/config.py,sha256=czt_EjOCT0lzWcoRE2F-oS2k1AVBFdiNuTcQXHlUVD0,4534
7
+ falyx/command.py,sha256=8J3xeHw3fYiqf05EUbXd--aEIJso5bzxb5JECGuISQk,12199
8
+ falyx/config.py,sha256=MnZeyti2TpeuOKrvXVaslIxYPHFyE4liREJsmUKlySg,5455
9
9
  falyx/context.py,sha256=Dm7HV-eigU-aTv5ERah6Ow9fIRdrOsB1G6ETPIu42Gw,10070
10
10
  falyx/debug.py,sha256=-jbTti29UC5zP9qQlWs3TbkOQR2f3zKSuNluh-r56wY,1551
11
11
  falyx/exceptions.py,sha256=YVbhPp2BNvZoO_xqeGSRKHVQ2rdLOLf1HCjH4JTj9w8,776
12
12
  falyx/execution_registry.py,sha256=IZvZr2hElzsYcMX3bAXg7sc7V2zi4RURn0OR7de2iCo,2864
13
- falyx/falyx.py,sha256=BlzQaCnrw2uG6YG-6SOKf_LkaZAnOiBXKOfAkbLCrqw,39701
13
+ falyx/falyx.py,sha256=Yj7dYpEiqnswVRWSJyqS45wlRTUKvABIQR8Bh2axA9I,40453
14
14
  falyx/hook_manager.py,sha256=E9Vk4bdoUTeXPQ_BQEvY2Jt-jUAusc40LI8JDy3NLUw,2381
15
15
  falyx/hooks.py,sha256=9zXk62DsJLJrmwTdyeNy5s-rVRvl8feuYRrfMmz6cVQ,2802
16
16
  falyx/http_action.py,sha256=JfopEleXJ0goVHi0VCn983c22GrmJhobnPIP7sTRqzU,5796
17
17
  falyx/init.py,sha256=jP4ZNw7ycDMKw4n1HDifxWSa0NYHaGLq7_LiFt85NpA,1832
18
- falyx/io_action.py,sha256=DTMoIFgbfKvKZvjT_XW_EOSDnnCeEze9XxNyWBFKdcI,8986
18
+ falyx/io_action.py,sha256=mBRX8rqQ11gkcUnJluZ87XT4QBA1oFkof6PaCtuK5o8,8997
19
19
  falyx/menu_action.py,sha256=kagtnn3djDxUm_Cyynp0lj-sZ9D_FZn4IEBYnFYqB74,7986
20
20
  falyx/options_manager.py,sha256=yYpn-moYN-bRYgMLccmi_de4mUzhTT7cv_bR2FFWZ8c,2798
21
- falyx/parsers.py,sha256=Ki0rn2wryPDmMI9WUNBLQ5J5Y64BNten0POMZM8wPKU,5189
21
+ falyx/parsers.py,sha256=r2FZTN26PqrnEQG4hVPorzzTPQZihsb4ca23fQY4Lgo,5574
22
22
  falyx/prompt_utils.py,sha256=JOg3p8Juv6ZdY1srfy_HlMNYfE-ajggDWLqNsjZq87I,560
23
23
  falyx/protocols.py,sha256=yNtQEugq9poN-SbOJf5LL_j6HBWdglbTNghpyopLpTs,216
24
24
  falyx/retry.py,sha256=GncBUiDDfDHUvLsWsWQw2Nq2XYL0TR0Fne3iXPzvQ48,3551
25
25
  falyx/retry_utils.py,sha256=SN5apcsg71IG2-KylysqdJd-PkPBLoCVwsgrSTF9wrQ,666
26
- falyx/select_file_action.py,sha256=hKTiGEA4JcJEj3oxOiTK0eKDURCv51x5tC26NfKu08w,7260
27
- falyx/selection.py,sha256=Hi8vfu6IuKdZ7URLiavb3uD1_Gb50D8XoKpZwAHLjmE,9859
28
- falyx/selection_action.py,sha256=hWsfyRO0cn6Z-sBeDYNTJKZq8CCBxY2GY917U7a8Uo0,8258
26
+ falyx/select_file_action.py,sha256=5Pt9ThIfwqd8ZJLEVDapevV6SF_AQEQFkk-i9Y1to_Q,7315
27
+ falyx/selection.py,sha256=aeJZPDwb5LR9e9iTjCYx4D5bh1mWyn3uBPA-M1AXdAw,10553
28
+ falyx/selection_action.py,sha256=MAKZeDwfCEE3hOoL1hpiMVlFUEDYV6X0oNCVGEcT_ZU,8324
29
29
  falyx/signal_action.py,sha256=wfhW9miSUj9MUoc1WOyk4tU9CtYKAXusHxQdBPYLoyQ,829
30
30
  falyx/signals.py,sha256=tlUbz3x6z3rYlUggan_Ntoy4bU5RbOd8UfR4cNcV6kQ,694
31
31
  falyx/tagged_table.py,sha256=sn2kosRRpcpeMB8vKk47c9yjpffSz_9FXH_e6kw15mA,1019
32
32
  falyx/themes/colors.py,sha256=4aaeAHJetmeNInI0Zytg4E3YqKfPFelpf04vtjSvsS8,19776
33
33
  falyx/utils.py,sha256=b1GQ3ooz4Io3zPE7MsoDm7j42AioTG-ZcWH-N2TRpbI,7710
34
34
  falyx/validators.py,sha256=NMxqCk8Fr8HQGVDYpg8B_JRk5SKR41E_G9gj1YfQnxg,1316
35
- falyx/version.py,sha256=qEmNtjnOwhDYQ0cHPPtUkUaghzD2xl0thJEznl4giYw,23
36
- falyx-0.1.21.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
37
- falyx-0.1.21.dist-info/METADATA,sha256=4T1HDUvMbwiq35W1YvIwjctQU87jTi8F62XzTGgDpKo,5484
38
- falyx-0.1.21.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
39
- falyx-0.1.21.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
40
- falyx-0.1.21.dist-info/RECORD,,
35
+ falyx/version.py,sha256=zmP2TRnzKPjZJ1eiBcT-cRInsji6FW-OVD3FafQFCc4,23
36
+ falyx-0.1.22.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
37
+ falyx-0.1.22.dist-info/METADATA,sha256=jXADXacZ3y4WPCwGkMSg5aGsseu-G98twHd2YIK5Hzg,5484
38
+ falyx-0.1.22.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
39
+ falyx-0.1.22.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
40
+ falyx-0.1.22.dist-info/RECORD,,
File without changes