falyx 0.1.23__py3-none-any.whl → 0.1.24__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/action.py +40 -22
- falyx/action_factory.py +15 -3
- falyx/bottom_bar.py +2 -2
- falyx/command.py +10 -7
- falyx/config.py +15 -7
- falyx/context.py +16 -8
- falyx/debug.py +2 -1
- falyx/exceptions.py +3 -0
- falyx/execution_registry.py +58 -12
- falyx/falyx.py +65 -75
- falyx/hook_manager.py +20 -3
- falyx/hooks.py +12 -5
- falyx/http_action.py +8 -7
- falyx/init.py +1 -0
- falyx/io_action.py +17 -12
- falyx/logger.py +5 -0
- falyx/menu_action.py +8 -2
- falyx/options_manager.py +7 -3
- falyx/parsers.py +2 -2
- falyx/prompt_utils.py +30 -1
- falyx/protocols.py +1 -0
- falyx/retry.py +23 -12
- falyx/retry_utils.py +1 -0
- falyx/select_file_action.py +4 -1
- falyx/selection.py +6 -2
- falyx/selection_action.py +20 -6
- falyx/signal_action.py +1 -0
- falyx/signals.py +3 -0
- falyx/tagged_table.py +2 -1
- falyx/utils.py +11 -39
- falyx/validators.py +8 -7
- falyx/version.py +1 -1
- {falyx-0.1.23.dist-info → falyx-0.1.24.dist-info}/METADATA +1 -1
- falyx-0.1.24.dist-info/RECORD +42 -0
- falyx-0.1.23.dist-info/RECORD +0 -41
- {falyx-0.1.23.dist-info → falyx-0.1.24.dist-info}/LICENSE +0 -0
- {falyx-0.1.23.dist-info → falyx-0.1.24.dist-info}/WHEEL +0 -0
- {falyx-0.1.23.dist-info → falyx-0.1.24.dist-info}/entry_points.txt +0 -0
falyx/prompt_utils.py
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
|
2
|
+
"""prompt_utils.py"""
|
3
|
+
from prompt_toolkit import PromptSession
|
4
|
+
from prompt_toolkit.formatted_text import (
|
5
|
+
AnyFormattedText,
|
6
|
+
FormattedText,
|
7
|
+
merge_formatted_text,
|
8
|
+
)
|
9
|
+
|
2
10
|
from falyx.options_manager import OptionsManager
|
11
|
+
from falyx.themes.colors import OneColors
|
12
|
+
from falyx.validators import yes_no_validator
|
3
13
|
|
4
14
|
|
5
15
|
def should_prompt_user(
|
@@ -8,7 +18,10 @@ def should_prompt_user(
|
|
8
18
|
options: OptionsManager,
|
9
19
|
namespace: str = "cli_args",
|
10
20
|
):
|
11
|
-
"""
|
21
|
+
"""
|
22
|
+
Determine whether to prompt the user for confirmation based on command
|
23
|
+
and global options.
|
24
|
+
"""
|
12
25
|
never_prompt = options.get("never_prompt", False, namespace)
|
13
26
|
force_confirm = options.get("force_confirm", False, namespace)
|
14
27
|
skip_confirm = options.get("skip_confirm", False, namespace)
|
@@ -17,3 +30,19 @@ def should_prompt_user(
|
|
17
30
|
return False
|
18
31
|
|
19
32
|
return confirm or force_confirm
|
33
|
+
|
34
|
+
|
35
|
+
async def confirm_async(
|
36
|
+
message: AnyFormattedText = "Are you sure?",
|
37
|
+
prefix: AnyFormattedText = FormattedText([(OneColors.CYAN, "❓ ")]),
|
38
|
+
suffix: AnyFormattedText = FormattedText([(OneColors.LIGHT_YELLOW_b, " [Y/n] > ")]),
|
39
|
+
session: PromptSession | None = None,
|
40
|
+
) -> bool:
|
41
|
+
"""Prompt the user with a yes/no async confirmation and return True for 'Y'."""
|
42
|
+
session = session or PromptSession()
|
43
|
+
merged_message: AnyFormattedText = merge_formatted_text([prefix, message, suffix])
|
44
|
+
answer = await session.prompt_async(
|
45
|
+
merged_message,
|
46
|
+
validator=yes_no_validator(),
|
47
|
+
)
|
48
|
+
return answer.upper() == "Y"
|
falyx/protocols.py
CHANGED
falyx/retry.py
CHANGED
@@ -8,10 +8,12 @@ import random
|
|
8
8
|
from pydantic import BaseModel, Field
|
9
9
|
|
10
10
|
from falyx.context import ExecutionContext
|
11
|
-
from falyx.
|
11
|
+
from falyx.logger import logger
|
12
12
|
|
13
13
|
|
14
14
|
class RetryPolicy(BaseModel):
|
15
|
+
"""RetryPolicy"""
|
16
|
+
|
15
17
|
max_retries: int = Field(default=3, ge=0)
|
16
18
|
delay: float = Field(default=1.0, ge=0.0)
|
17
19
|
backoff: float = Field(default=2.0, ge=1.0)
|
@@ -34,6 +36,8 @@ class RetryPolicy(BaseModel):
|
|
34
36
|
|
35
37
|
|
36
38
|
class RetryHandler:
|
39
|
+
"""RetryHandler class to manage retry policies for actions."""
|
40
|
+
|
37
41
|
def __init__(self, policy: RetryPolicy = RetryPolicy()):
|
38
42
|
self.policy = policy
|
39
43
|
|
@@ -49,7 +53,7 @@ class RetryHandler:
|
|
49
53
|
self.policy.delay = delay
|
50
54
|
self.policy.backoff = backoff
|
51
55
|
self.policy.jitter = jitter
|
52
|
-
logger.info(
|
56
|
+
logger.info("🔄 Retry policy enabled: %s", self.policy)
|
53
57
|
|
54
58
|
async def retry_on_error(self, context: ExecutionContext) -> None:
|
55
59
|
from falyx.action import Action
|
@@ -63,21 +67,21 @@ class RetryHandler:
|
|
63
67
|
last_error = error
|
64
68
|
|
65
69
|
if not target:
|
66
|
-
logger.warning(
|
70
|
+
logger.warning("[%s] ⚠️ No action target. Cannot retry.", name)
|
67
71
|
return None
|
68
72
|
|
69
73
|
if not isinstance(target, Action):
|
70
74
|
logger.warning(
|
71
|
-
|
75
|
+
"[%s] ❌ RetryHandler only supports only supports Action objects.", name
|
72
76
|
)
|
73
77
|
return None
|
74
78
|
|
75
79
|
if not getattr(target, "is_retryable", False):
|
76
|
-
logger.warning(
|
80
|
+
logger.warning("[%s] ❌ Not retryable.", name)
|
77
81
|
return None
|
78
82
|
|
79
83
|
if not self.policy.enabled:
|
80
|
-
logger.warning(
|
84
|
+
logger.warning("[%s] ❌ Retry policy is disabled.", name)
|
81
85
|
return None
|
82
86
|
|
83
87
|
while retries_done < self.policy.max_retries:
|
@@ -88,23 +92,30 @@ class RetryHandler:
|
|
88
92
|
sleep_delay += random.uniform(-self.policy.jitter, self.policy.jitter)
|
89
93
|
|
90
94
|
logger.info(
|
91
|
-
|
92
|
-
|
95
|
+
"[%s] 🔄 Retrying (%s/%s) in %ss due to '%s'...",
|
96
|
+
name,
|
97
|
+
retries_done,
|
98
|
+
self.policy.max_retries,
|
99
|
+
current_delay,
|
100
|
+
last_error,
|
93
101
|
)
|
94
102
|
await asyncio.sleep(current_delay)
|
95
103
|
try:
|
96
104
|
result = await target.action(*context.args, **context.kwargs)
|
97
105
|
context.result = result
|
98
106
|
context.exception = None
|
99
|
-
logger.info(
|
107
|
+
logger.info("[%s] ✅ Retry succeeded on attempt %s.", name, retries_done)
|
100
108
|
return None
|
101
109
|
except Exception as retry_error:
|
102
110
|
last_error = retry_error
|
103
111
|
current_delay *= self.policy.backoff
|
104
112
|
logger.warning(
|
105
|
-
|
106
|
-
|
113
|
+
"[%s] ⚠️ Retry attempt %s/%s failed due to '%s'.",
|
114
|
+
name,
|
115
|
+
retries_done,
|
116
|
+
self.policy.max_retries,
|
117
|
+
retry_error,
|
107
118
|
)
|
108
119
|
|
109
120
|
context.exception = last_error
|
110
|
-
logger.error(
|
121
|
+
logger.error("[%s] ❌ All %s retries failed.", name, self.policy.max_retries)
|
falyx/retry_utils.py
CHANGED
falyx/select_file_action.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
|
2
|
+
"""select_file_action.py"""
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import csv
|
@@ -18,16 +19,18 @@ from falyx.action import BaseAction
|
|
18
19
|
from falyx.context import ExecutionContext
|
19
20
|
from falyx.execution_registry import ExecutionRegistry as er
|
20
21
|
from falyx.hook_manager import HookType
|
22
|
+
from falyx.logger import logger
|
21
23
|
from falyx.selection import (
|
22
24
|
SelectionOption,
|
23
25
|
prompt_for_selection,
|
24
26
|
render_selection_dict_table,
|
25
27
|
)
|
26
28
|
from falyx.themes.colors import OneColors
|
27
|
-
from falyx.utils import logger
|
28
29
|
|
29
30
|
|
30
31
|
class FileReturnType(Enum):
|
32
|
+
"""Enum for file return types."""
|
33
|
+
|
31
34
|
TEXT = "text"
|
32
35
|
PATH = "path"
|
33
36
|
JSON = "json"
|
falyx/selection.py
CHANGED
@@ -16,6 +16,8 @@ from falyx.validators import int_range_validator, key_validator
|
|
16
16
|
|
17
17
|
@dataclass
|
18
18
|
class SelectionOption:
|
19
|
+
"""Represents a single selection option with a description and a value."""
|
20
|
+
|
19
21
|
description: str
|
20
22
|
value: Any
|
21
23
|
style: str = OneColors.WHITE
|
@@ -26,7 +28,8 @@ class SelectionOption:
|
|
26
28
|
|
27
29
|
def render(self, key: str) -> str:
|
28
30
|
"""Render the selection option for display."""
|
29
|
-
|
31
|
+
key = escape(f"[{key}]")
|
32
|
+
return f"[{OneColors.WHITE}]{key}[/] [{self.style}]{self.description}[/]"
|
30
33
|
|
31
34
|
|
32
35
|
def render_table_base(
|
@@ -194,7 +197,8 @@ def render_selection_dict_table(
|
|
194
197
|
row = []
|
195
198
|
for key, option in chunk:
|
196
199
|
row.append(
|
197
|
-
f"[{OneColors.WHITE}][{key.upper()}]
|
200
|
+
f"[{OneColors.WHITE}][{key.upper()}] "
|
201
|
+
f"[{option.style}]{option.description}[/]"
|
198
202
|
)
|
199
203
|
table.add_row(*row)
|
200
204
|
|
falyx/selection_action.py
CHANGED
@@ -10,6 +10,7 @@ from falyx.action import BaseAction
|
|
10
10
|
from falyx.context import ExecutionContext
|
11
11
|
from falyx.execution_registry import ExecutionRegistry as er
|
12
12
|
from falyx.hook_manager import HookType
|
13
|
+
from falyx.logger import logger
|
13
14
|
from falyx.selection import (
|
14
15
|
SelectionOption,
|
15
16
|
prompt_for_index,
|
@@ -18,10 +19,18 @@ from falyx.selection import (
|
|
18
19
|
render_selection_indexed_table,
|
19
20
|
)
|
20
21
|
from falyx.themes.colors import OneColors
|
21
|
-
from falyx.utils import CaseInsensitiveDict
|
22
|
+
from falyx.utils import CaseInsensitiveDict
|
22
23
|
|
23
24
|
|
24
25
|
class SelectionAction(BaseAction):
|
26
|
+
"""
|
27
|
+
A selection action that prompts the user to select an option from a list or
|
28
|
+
dictionary. The selected option is then returned as the result of the action.
|
29
|
+
|
30
|
+
If return_key is True, the key of the selected option is returned instead of
|
31
|
+
the value.
|
32
|
+
"""
|
33
|
+
|
25
34
|
def __init__(
|
26
35
|
self,
|
27
36
|
name: str,
|
@@ -45,7 +54,8 @@ class SelectionAction(BaseAction):
|
|
45
54
|
inject_into=inject_into,
|
46
55
|
never_prompt=never_prompt,
|
47
56
|
)
|
48
|
-
|
57
|
+
# Setter normalizes to correct type, mypy can't infer that
|
58
|
+
self.selections: list[str] | CaseInsensitiveDict = selections # type: ignore[assignment]
|
49
59
|
self.return_key = return_key
|
50
60
|
self.title = title
|
51
61
|
self.columns = columns
|
@@ -71,7 +81,8 @@ class SelectionAction(BaseAction):
|
|
71
81
|
self._selections = cid
|
72
82
|
else:
|
73
83
|
raise TypeError(
|
74
|
-
|
84
|
+
"'selections' must be a list[str] or dict[str, SelectionOption], "
|
85
|
+
f"got {type(value).__name__}"
|
75
86
|
)
|
76
87
|
|
77
88
|
async def _run(self, *args, **kwargs) -> Any:
|
@@ -108,7 +119,8 @@ class SelectionAction(BaseAction):
|
|
108
119
|
|
109
120
|
if self.never_prompt and not effective_default:
|
110
121
|
raise ValueError(
|
111
|
-
f"[{self.name}] 'never_prompt' is True but no valid default_selection
|
122
|
+
f"[{self.name}] 'never_prompt' is True but no valid default_selection "
|
123
|
+
"was provided."
|
112
124
|
)
|
113
125
|
|
114
126
|
context.start_timer()
|
@@ -152,7 +164,8 @@ class SelectionAction(BaseAction):
|
|
152
164
|
result = key if self.return_key else self.selections[key].value
|
153
165
|
else:
|
154
166
|
raise TypeError(
|
155
|
-
|
167
|
+
"'selections' must be a list[str] or dict[str, tuple[str, Any]], "
|
168
|
+
f"got {type(self.selections).__name__}"
|
156
169
|
)
|
157
170
|
context.result = result
|
158
171
|
await self.hooks.trigger(HookType.ON_SUCCESS, context)
|
@@ -205,5 +218,6 @@ class SelectionAction(BaseAction):
|
|
205
218
|
return (
|
206
219
|
f"SelectionAction(name={self.name!r}, type={selection_type}, "
|
207
220
|
f"default_selection={self.default_selection!r}, "
|
208
|
-
f"return_key={self.return_key},
|
221
|
+
f"return_key={self.return_key}, "
|
222
|
+
f"prompt={'off' if self.never_prompt else 'on'})"
|
209
223
|
)
|
falyx/signal_action.py
CHANGED
falyx/signals.py
CHANGED
falyx/tagged_table.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
|
2
|
+
"""tagged_table.py"""
|
2
3
|
from collections import defaultdict
|
3
4
|
|
4
5
|
from rich import box
|
@@ -10,7 +11,7 @@ from falyx.falyx import Falyx
|
|
10
11
|
|
11
12
|
def build_tagged_table(flx: Falyx) -> Table:
|
12
13
|
"""Custom table builder that groups commands by tags."""
|
13
|
-
table = Table(title=flx.title, show_header=False, box=box.SIMPLE)
|
14
|
+
table = Table(title=flx.title, show_header=False, box=box.SIMPLE) # type: ignore[arg-type]
|
14
15
|
|
15
16
|
# Group commands by first tag
|
16
17
|
grouped: dict[str, list[Command]] = defaultdict(list)
|
falyx/utils.py
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
|
2
2
|
"""utils.py"""
|
3
|
+
from __future__ import annotations
|
4
|
+
|
3
5
|
import functools
|
4
6
|
import inspect
|
5
7
|
import logging
|
@@ -10,23 +12,12 @@ from itertools import islice
|
|
10
12
|
from typing import Any, Awaitable, Callable, TypeVar
|
11
13
|
|
12
14
|
import pythonjsonlogger.json
|
13
|
-
from prompt_toolkit import PromptSession
|
14
|
-
from prompt_toolkit.formatted_text import (
|
15
|
-
AnyFormattedText,
|
16
|
-
FormattedText,
|
17
|
-
merge_formatted_text,
|
18
|
-
)
|
19
15
|
from rich.logging import RichHandler
|
20
16
|
|
21
|
-
from falyx.themes.colors import OneColors
|
22
|
-
from falyx.validators import yes_no_validator
|
23
|
-
|
24
|
-
logger = logging.getLogger("falyx")
|
25
|
-
|
26
17
|
T = TypeVar("T")
|
27
18
|
|
28
19
|
|
29
|
-
async def _noop(*
|
20
|
+
async def _noop(*_, **__):
|
30
21
|
pass
|
31
22
|
|
32
23
|
|
@@ -70,22 +61,6 @@ def chunks(iterator, size):
|
|
70
61
|
yield chunk
|
71
62
|
|
72
63
|
|
73
|
-
async def confirm_async(
|
74
|
-
message: AnyFormattedText = "Are you sure?",
|
75
|
-
prefix: AnyFormattedText = FormattedText([(OneColors.CYAN, "❓ ")]),
|
76
|
-
suffix: AnyFormattedText = FormattedText([(OneColors.LIGHT_YELLOW_b, " [Y/n] > ")]),
|
77
|
-
session: PromptSession | None = None,
|
78
|
-
) -> bool:
|
79
|
-
"""Prompt the user with a yes/no async confirmation and return True for 'Y'."""
|
80
|
-
session = session or PromptSession()
|
81
|
-
merged_message: AnyFormattedText = merge_formatted_text([prefix, message, suffix])
|
82
|
-
answer = await session.prompt_async(
|
83
|
-
merged_message,
|
84
|
-
validator=yes_no_validator(),
|
85
|
-
)
|
86
|
-
return True if answer.upper() == "Y" else False
|
87
|
-
|
88
|
-
|
89
64
|
class CaseInsensitiveDict(dict):
|
90
65
|
"""A case-insensitive dictionary that treats all keys as uppercase."""
|
91
66
|
|
@@ -114,12 +89,6 @@ class CaseInsensitiveDict(dict):
|
|
114
89
|
items.update({self._normalize_key(k): v for k, v in kwargs.items()})
|
115
90
|
super().update(items)
|
116
91
|
|
117
|
-
def __iter__(self):
|
118
|
-
return super().__iter__()
|
119
|
-
|
120
|
-
def keys(self):
|
121
|
-
return super().keys()
|
122
|
-
|
123
92
|
|
124
93
|
def running_in_container() -> bool:
|
125
94
|
try:
|
@@ -143,11 +112,13 @@ def setup_logging(
|
|
143
112
|
console_log_level: int = logging.WARNING,
|
144
113
|
):
|
145
114
|
"""
|
146
|
-
Configure logging for Falyx with support for both CLI-friendly and structured
|
115
|
+
Configure logging for Falyx with support for both CLI-friendly and structured
|
116
|
+
JSON output.
|
147
117
|
|
148
|
-
This function sets up separate logging handlers for console and file output,
|
149
|
-
support for JSON formatting. It also auto-detects whether the
|
150
|
-
a container to default to machine-readable logs
|
118
|
+
This function sets up separate logging handlers for console and file output,
|
119
|
+
with optional support for JSON formatting. It also auto-detects whether the
|
120
|
+
application is running inside a container to default to machine-readable logs
|
121
|
+
when appropriate.
|
151
122
|
|
152
123
|
Args:
|
153
124
|
mode (str | None):
|
@@ -170,7 +141,8 @@ def setup_logging(
|
|
170
141
|
- Clears existing root handlers before setup.
|
171
142
|
- Configures console logging using either Rich (for CLI) or JSON formatting.
|
172
143
|
- Configures file logging in plain text or JSON based on `json_log_to_file`.
|
173
|
-
- Automatically sets logging levels for noisy third-party modules
|
144
|
+
- Automatically sets logging levels for noisy third-party modules
|
145
|
+
(`urllib3`, `asyncio`, `markdown_it`).
|
174
146
|
- Propagates logs from the "falyx" logger to ensure centralized output.
|
175
147
|
|
176
148
|
Raises:
|
falyx/validators.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Falyx CLI Framework — (c) 2025 rtj.dev LLC — MIT Licensed
|
2
|
+
"""validators.py"""
|
2
3
|
from typing import KeysView, Sequence
|
3
4
|
|
4
5
|
from prompt_toolkit.validation import Validator
|
@@ -7,10 +8,10 @@ from prompt_toolkit.validation import Validator
|
|
7
8
|
def int_range_validator(minimum: int, maximum: int) -> Validator:
|
8
9
|
"""Validator for integer ranges."""
|
9
10
|
|
10
|
-
def validate(
|
11
|
+
def validate(text: str) -> bool:
|
11
12
|
try:
|
12
|
-
value = int(
|
13
|
-
if not
|
13
|
+
value = int(text)
|
14
|
+
if not minimum <= value <= maximum:
|
14
15
|
return False
|
15
16
|
return True
|
16
17
|
except ValueError:
|
@@ -25,8 +26,8 @@ def int_range_validator(minimum: int, maximum: int) -> Validator:
|
|
25
26
|
def key_validator(keys: Sequence[str] | KeysView[str]) -> Validator:
|
26
27
|
"""Validator for key inputs."""
|
27
28
|
|
28
|
-
def validate(
|
29
|
-
if
|
29
|
+
def validate(text: str) -> bool:
|
30
|
+
if text.upper() not in [key.upper() for key in keys]:
|
30
31
|
return False
|
31
32
|
return True
|
32
33
|
|
@@ -38,8 +39,8 @@ def key_validator(keys: Sequence[str] | KeysView[str]) -> Validator:
|
|
38
39
|
def yes_no_validator() -> Validator:
|
39
40
|
"""Validator for yes/no inputs."""
|
40
41
|
|
41
|
-
def validate(
|
42
|
-
if
|
42
|
+
def validate(text: str) -> bool:
|
43
|
+
if text.upper() not in ["Y", "N"]:
|
43
44
|
return False
|
44
45
|
return True
|
45
46
|
|
falyx/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.1.
|
1
|
+
__version__ = "0.1.24"
|
@@ -0,0 +1,42 @@
|
|
1
|
+
falyx/.pytyped,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
falyx/__init__.py,sha256=dYRamQJlT1Zoy5Uu1uG4NCV05Xk98nN1LAQrSR1CT2A,643
|
3
|
+
falyx/__main__.py,sha256=g_LwJieofK3DJzCYtpkAMEeOXhzSLQenb7pRVUqcf-Y,2152
|
4
|
+
falyx/action.py,sha256=9iOsqi-7tiNdBcGFrAQHGBCsTKZoBYXkClZE0DM9qhQ,32495
|
5
|
+
falyx/action_factory.py,sha256=RKKb9C49xYNnMBgNvaDYTspVF3jmpBtNibrxlzLGiQQ,4228
|
6
|
+
falyx/bottom_bar.py,sha256=GdyM-IY-E08c2GSaeAGVv1h1suOQuohFTRwbqtawbW0,7390
|
7
|
+
falyx/command.py,sha256=PCnGDbx8E-168FcuUvz87YqR94FvYCQX8dj6tVXnMtw,12231
|
8
|
+
falyx/config.py,sha256=nbAEea1-3zNhycrQ9aKuMqqa_EaQGBK0HcCAGsj_rZ0,7204
|
9
|
+
falyx/config_schema.py,sha256=j5GQuHVlaU-VLxLF9t8idZRjqOP9MIKp1hyd9NhpAGU,3124
|
10
|
+
falyx/context.py,sha256=FNF-IS7RMDxel2l3kskEqQImZ0mLO6zvGw_xC9cIzgI,10338
|
11
|
+
falyx/debug.py,sha256=oWWTLOF8elrx_RGZ1G4pbzfFr46FjB0woFXpVU2wmjU,1567
|
12
|
+
falyx/exceptions.py,sha256=Qxp6UScZWEyno-6Lgksrv3s9iwjbr2U-d6hun-_xpc0,798
|
13
|
+
falyx/execution_registry.py,sha256=io2hX9VkWJBRch-G7thla1eH_PgyVjjWf9qU5foOOEA,4719
|
14
|
+
falyx/falyx.py,sha256=KuIAaZj4RgiFdiAzOMswZ8n6lUKN00L5k4zWoJA1PBk,40545
|
15
|
+
falyx/hook_manager.py,sha256=GuGxVVz9FXrU39Tk220QcsLsMXeut7ZDkGW3hU9GcwQ,2952
|
16
|
+
falyx/hooks.py,sha256=KOmUGP6xWU-eTW8QOl-qEflNRxZRf_OHA0N7gph13UM,2947
|
17
|
+
falyx/http_action.py,sha256=sGADtRhSRuNu4UiEo1oeTHeC2rgAlALZm08-X4Pne34,5806
|
18
|
+
falyx/init.py,sha256=abcSlPmxVeByLIHdUkNjqtO_tEkO3ApC6f9WbxsSEWg,3393
|
19
|
+
falyx/io_action.py,sha256=5TIWeRUIffvkbdMbureLMiNk6mcy-tCaMMBRCeFFfgM,9718
|
20
|
+
falyx/logger.py,sha256=1Mfb_vJFJ1tQwziuyU2p-cSMi2Js8N2byniFEnI6vOQ,132
|
21
|
+
falyx/menu_action.py,sha256=jLYUR6-6F5NIDb9kP0Ysovmy3mtfO8xTXRRZMRaTtY0,8183
|
22
|
+
falyx/options_manager.py,sha256=dFAnQw543tQ6Xupvh1PwBrhiSWlSACHw8K-sHP_lUh4,2842
|
23
|
+
falyx/parsers.py,sha256=hxrBouQEqdgk6aWzNa7UwTg7u55vJffSEUUTiiQoI0U,5602
|
24
|
+
falyx/prompt_utils.py,sha256=6qt65HESo79-rZhIWpgndrYG6yJwk8tMSJCKXar0dP0,1549
|
25
|
+
falyx/protocols.py,sha256=Sk2a1rz5Tk7iDUVTeitItNX-Kg3kwXOSwIjojEOE1mI,299
|
26
|
+
falyx/retry.py,sha256=UUzY6FlKobr84Afw7yJO9rj3AIQepDk2fcWs6_1gi6Q,3788
|
27
|
+
falyx/retry_utils.py,sha256=1xPSr-1ZJsUXnXFyGNZZJ9h9eE4ExHjJMkyjHIm5cd8,687
|
28
|
+
falyx/select_file_action.py,sha256=698t0Mc5_6dPXjxuKBC_O7u35o08nLqkgpQH82dZafc,8678
|
29
|
+
falyx/selection.py,sha256=r__wrXaLz4oJobeqniKvHrEhe9vYVsZo1SoB3Cn6qRM,10738
|
30
|
+
falyx/selection_action.py,sha256=PdY-3ewMhgC8F3DKS6TCWcAoOD3va9Hp8bPkdZSMWBE,8811
|
31
|
+
falyx/signal_action.py,sha256=DSwVkL81PLWAHRHZbpiYlPH1ew97KL6TPs3XlU--RJY,916
|
32
|
+
falyx/signals.py,sha256=4PTuVRB_P_aWfnU8pANqhMxGTLq7TJDEyk9jCp0Bx2c,713
|
33
|
+
falyx/tagged_table.py,sha256=4SV-SdXFrAhy1JNToeBCvyxT-iWVf6cWY7XETTys4n8,1067
|
34
|
+
falyx/themes/colors.py,sha256=4aaeAHJetmeNInI0Zytg4E3YqKfPFelpf04vtjSvsS8,19776
|
35
|
+
falyx/utils.py,sha256=uss-FV8p164pmhoqYtQt8gNp5z8fGbuMAk4dRJ6RopI,6717
|
36
|
+
falyx/validators.py,sha256=t5iyzVpY8tdC4rfhr4isEfWpD5gNTzjeX_Hbi_Uq6sA,1328
|
37
|
+
falyx/version.py,sha256=Jq7e1LcKcQSNVg4EOJ-acPyPgs8Os5cYEZWXrQsI7Pg,23
|
38
|
+
falyx-0.1.24.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
|
39
|
+
falyx-0.1.24.dist-info/METADATA,sha256=b7Ca1bcIlHrVsb3YLlSUQCgzoh0Jvd7qfUeD6ms5mWo,5484
|
40
|
+
falyx-0.1.24.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
41
|
+
falyx-0.1.24.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
|
42
|
+
falyx-0.1.24.dist-info/RECORD,,
|
falyx-0.1.23.dist-info/RECORD
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
falyx/.pytyped,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
falyx/__init__.py,sha256=dYRamQJlT1Zoy5Uu1uG4NCV05Xk98nN1LAQrSR1CT2A,643
|
3
|
-
falyx/__main__.py,sha256=g_LwJieofK3DJzCYtpkAMEeOXhzSLQenb7pRVUqcf-Y,2152
|
4
|
-
falyx/action.py,sha256=J-SG5zltYbqtdvTwBBUeEj4jp44DOKBR6G5rvmdkkTs,32147
|
5
|
-
falyx/action_factory.py,sha256=VDy-EcdAs8-Xu-HVMeQi7NGZWmT2MP7AWYKhmcSsNDE,3693
|
6
|
-
falyx/bottom_bar.py,sha256=NTen52Nfz32eWSBmJtEUuJO33u5sGQj-33IeudPVsqQ,7403
|
7
|
-
falyx/command.py,sha256=8J3xeHw3fYiqf05EUbXd--aEIJso5bzxb5JECGuISQk,12199
|
8
|
-
falyx/config.py,sha256=FyM9euPgEDS9kmL8foO-qAOeV8IqCEj2L4vc5SlzNA4,6959
|
9
|
-
falyx/config_schema.py,sha256=j5GQuHVlaU-VLxLF9t8idZRjqOP9MIKp1hyd9NhpAGU,3124
|
10
|
-
falyx/context.py,sha256=Dm7HV-eigU-aTv5ERah6Ow9fIRdrOsB1G6ETPIu42Gw,10070
|
11
|
-
falyx/debug.py,sha256=-jbTti29UC5zP9qQlWs3TbkOQR2f3zKSuNluh-r56wY,1551
|
12
|
-
falyx/exceptions.py,sha256=YVbhPp2BNvZoO_xqeGSRKHVQ2rdLOLf1HCjH4JTj9w8,776
|
13
|
-
falyx/execution_registry.py,sha256=lZVQBuuyijuOcFcYFmKmLe-wofKjYz2NiY3dhdRLuTI,2932
|
14
|
-
falyx/falyx.py,sha256=M6M8s4Rq-aYelDGH4NJYgdXKBNMnzfwux57GJLnDthY,41322
|
15
|
-
falyx/hook_manager.py,sha256=E9Vk4bdoUTeXPQ_BQEvY2Jt-jUAusc40LI8JDy3NLUw,2381
|
16
|
-
falyx/hooks.py,sha256=9zXk62DsJLJrmwTdyeNy5s-rVRvl8feuYRrfMmz6cVQ,2802
|
17
|
-
falyx/http_action.py,sha256=JfopEleXJ0goVHi0VCn983c22GrmJhobnPIP7sTRqzU,5796
|
18
|
-
falyx/init.py,sha256=RPD2CBIqjOGGjW545IaCKUbjGsE_XnScuuDSrP058uM,3379
|
19
|
-
falyx/io_action.py,sha256=hrMT2JKWvFDOPgwTJSHCz8OiGkxl-bULhm6NoIBLA1g,9602
|
20
|
-
falyx/menu_action.py,sha256=kagtnn3djDxUm_Cyynp0lj-sZ9D_FZn4IEBYnFYqB74,7986
|
21
|
-
falyx/options_manager.py,sha256=yYpn-moYN-bRYgMLccmi_de4mUzhTT7cv_bR2FFWZ8c,2798
|
22
|
-
falyx/parsers.py,sha256=r2FZTN26PqrnEQG4hVPorzzTPQZihsb4ca23fQY4Lgo,5574
|
23
|
-
falyx/prompt_utils.py,sha256=l2uyem7f_lrvsh7L62BcJ9cAwoRSjo4NFsN43UgrBhs,624
|
24
|
-
falyx/protocols.py,sha256=c32UniP5SKeoxHINZyuXrpSAOjlOKjYJ-SvsVcrgFjg,280
|
25
|
-
falyx/retry.py,sha256=GncBUiDDfDHUvLsWsWQw2Nq2XYL0TR0Fne3iXPzvQ48,3551
|
26
|
-
falyx/retry_utils.py,sha256=SN5apcsg71IG2-KylysqdJd-PkPBLoCVwsgrSTF9wrQ,666
|
27
|
-
falyx/select_file_action.py,sha256=EWM_qpHtzj5Ol7TSzKxDpevgym6QIwAzJFqLkg8x6IU,8610
|
28
|
-
falyx/selection.py,sha256=bgMYVHicE8aQXdvccxOK2i5ijtftUMlRyT-wsGSogHQ,10607
|
29
|
-
falyx/selection_action.py,sha256=oBAJ2r9-O27BYk4Lkx_vBUDNrHuC4JyIROfL0MGZOd8,8339
|
30
|
-
falyx/signal_action.py,sha256=wsG-Rmgif2Q1AACY-Ie7oyGdbk9AyYvAHSg7mFxNprI,893
|
31
|
-
falyx/signals.py,sha256=tlUbz3x6z3rYlUggan_Ntoy4bU5RbOd8UfR4cNcV6kQ,694
|
32
|
-
falyx/tagged_table.py,sha256=sn2kosRRpcpeMB8vKk47c9yjpffSz_9FXH_e6kw15mA,1019
|
33
|
-
falyx/themes/colors.py,sha256=4aaeAHJetmeNInI0Zytg4E3YqKfPFelpf04vtjSvsS8,19776
|
34
|
-
falyx/utils.py,sha256=b1GQ3ooz4Io3zPE7MsoDm7j42AioTG-ZcWH-N2TRpbI,7710
|
35
|
-
falyx/validators.py,sha256=NMxqCk8Fr8HQGVDYpg8B_JRk5SKR41E_G9gj1YfQnxg,1316
|
36
|
-
falyx/version.py,sha256=0byemO6n6WCv41u9vBG2AIsOkVbxLvok7puvwy8EhfU,23
|
37
|
-
falyx-0.1.23.dist-info/LICENSE,sha256=B0yqgaHuSdhN7T3OBmgQSiDTy8HqT5Oe_dLypRe4Ra4,1073
|
38
|
-
falyx-0.1.23.dist-info/METADATA,sha256=j9Eamk8lsuPAByILQpiGVB3hyVoDnqRzf7gOAxJB62E,5484
|
39
|
-
falyx-0.1.23.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
40
|
-
falyx-0.1.23.dist-info/entry_points.txt,sha256=j8owOSl2j1Ss8DtGMnKfgehKaolqnIPhVFHaUBLUnMs,45
|
41
|
-
falyx-0.1.23.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|