webscout 8.3.6__py3-none-any.whl → 2025.10.11__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.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +250 -250
- webscout/AIbase.py +379 -379
- webscout/AIutel.py +60 -58
- webscout/Bard.py +1012 -1012
- webscout/Bing_search.py +417 -417
- webscout/DWEBS.py +529 -529
- webscout/Extra/Act.md +309 -309
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/README.md +110 -110
- webscout/Extra/GitToolkit/gitapi/__init__.py +11 -11
- webscout/Extra/GitToolkit/gitapi/repository.py +195 -195
- webscout/Extra/GitToolkit/gitapi/user.py +96 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +61 -61
- webscout/Extra/YTToolkit/README.md +375 -375
- webscout/Extra/YTToolkit/YTdownloader.py +956 -956
- webscout/Extra/YTToolkit/__init__.py +2 -2
- webscout/Extra/YTToolkit/transcriber.py +475 -475
- webscout/Extra/YTToolkit/ytapi/README.md +44 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +6 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +307 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +118 -118
- webscout/Extra/YTToolkit/ytapi/https.py +88 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +58 -58
- webscout/Extra/YTToolkit/ytapi/pool.py +7 -7
- webscout/Extra/YTToolkit/ytapi/query.py +39 -39
- webscout/Extra/YTToolkit/ytapi/stream.py +62 -62
- webscout/Extra/YTToolkit/ytapi/utils.py +62 -62
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Extra/autocoder/__init__.py +9 -9
- webscout/Extra/autocoder/autocoder.py +1105 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +332 -332
- webscout/Extra/gguf.md +429 -429
- webscout/Extra/gguf.py +1213 -1213
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +27 -27
- webscout/Extra/tempmail/async_utils.py +140 -140
- webscout/Extra/tempmail/base.py +160 -160
- webscout/Extra/tempmail/cli.py +186 -186
- webscout/Extra/tempmail/emailnator.py +84 -84
- webscout/Extra/tempmail/mail_tm.py +360 -360
- webscout/Extra/tempmail/temp_mail_io.py +291 -291
- webscout/Extra/weather.md +281 -281
- webscout/Extra/weather.py +193 -193
- webscout/Litlogger/README.md +10 -10
- webscout/Litlogger/__init__.py +15 -15
- webscout/Litlogger/formats.py +13 -13
- webscout/Litlogger/handlers.py +121 -121
- webscout/Litlogger/levels.py +13 -13
- webscout/Litlogger/logger.py +134 -134
- webscout/Provider/AISEARCH/Perplexity.py +332 -332
- webscout/Provider/AISEARCH/README.md +279 -279
- webscout/Provider/AISEARCH/__init__.py +33 -11
- webscout/Provider/AISEARCH/felo_search.py +206 -206
- webscout/Provider/AISEARCH/genspark_search.py +323 -323
- webscout/Provider/AISEARCH/hika_search.py +185 -185
- webscout/Provider/AISEARCH/iask_search.py +410 -410
- webscout/Provider/AISEARCH/monica_search.py +219 -219
- webscout/Provider/AISEARCH/scira_search.py +316 -314
- webscout/Provider/AISEARCH/stellar_search.py +177 -177
- webscout/Provider/AISEARCH/webpilotai_search.py +255 -255
- webscout/Provider/Aitopia.py +314 -315
- webscout/Provider/Andi.py +3 -3
- webscout/Provider/Apriel.py +306 -0
- webscout/Provider/ChatGPTClone.py +236 -236
- webscout/Provider/ChatSandbox.py +343 -342
- webscout/Provider/Cloudflare.py +324 -324
- webscout/Provider/Cohere.py +208 -207
- webscout/Provider/Deepinfra.py +370 -369
- webscout/Provider/ExaAI.py +260 -260
- webscout/Provider/ExaChat.py +308 -387
- webscout/Provider/Flowith.py +221 -221
- webscout/Provider/GMI.py +293 -0
- webscout/Provider/Gemini.py +164 -162
- webscout/Provider/GeminiProxy.py +167 -166
- webscout/Provider/GithubChat.py +371 -370
- webscout/Provider/Groq.py +800 -800
- webscout/Provider/HeckAI.py +383 -379
- webscout/Provider/Jadve.py +282 -297
- webscout/Provider/K2Think.py +308 -0
- webscout/Provider/Koboldai.py +206 -384
- webscout/Provider/LambdaChat.py +423 -425
- webscout/Provider/Nemotron.py +244 -245
- webscout/Provider/Netwrck.py +248 -247
- webscout/Provider/OLLAMA.py +395 -394
- webscout/Provider/OPENAI/Cloudflare.py +394 -395
- webscout/Provider/OPENAI/FalconH1.py +452 -457
- webscout/Provider/OPENAI/FreeGemini.py +297 -299
- webscout/Provider/OPENAI/{monochat.py → K2Think.py} +432 -329
- webscout/Provider/OPENAI/NEMOTRON.py +241 -244
- webscout/Provider/OPENAI/PI.py +428 -427
- webscout/Provider/OPENAI/README.md +959 -959
- webscout/Provider/OPENAI/TogetherAI.py +345 -345
- webscout/Provider/OPENAI/TwoAI.py +466 -467
- webscout/Provider/OPENAI/__init__.py +33 -59
- webscout/Provider/OPENAI/ai4chat.py +313 -303
- webscout/Provider/OPENAI/base.py +249 -269
- webscout/Provider/OPENAI/chatglm.py +528 -0
- webscout/Provider/OPENAI/chatgpt.py +593 -588
- webscout/Provider/OPENAI/chatgptclone.py +521 -524
- webscout/Provider/OPENAI/chatsandbox.py +202 -177
- webscout/Provider/OPENAI/deepinfra.py +319 -315
- webscout/Provider/OPENAI/e2b.py +1665 -1665
- webscout/Provider/OPENAI/exaai.py +420 -420
- webscout/Provider/OPENAI/exachat.py +452 -452
- webscout/Provider/OPENAI/friendli.py +232 -232
- webscout/Provider/OPENAI/{refact.py → gmi.py} +324 -274
- webscout/Provider/OPENAI/groq.py +364 -364
- webscout/Provider/OPENAI/heckai.py +314 -311
- webscout/Provider/OPENAI/llmchatco.py +337 -337
- webscout/Provider/OPENAI/netwrck.py +355 -354
- webscout/Provider/OPENAI/oivscode.py +290 -290
- webscout/Provider/OPENAI/opkfc.py +518 -518
- webscout/Provider/OPENAI/pydantic_imports.py +1 -1
- webscout/Provider/OPENAI/scirachat.py +535 -529
- webscout/Provider/OPENAI/sonus.py +308 -308
- webscout/Provider/OPENAI/standardinput.py +442 -442
- webscout/Provider/OPENAI/textpollinations.py +340 -348
- webscout/Provider/OPENAI/toolbaz.py +419 -413
- webscout/Provider/OPENAI/typefully.py +362 -362
- webscout/Provider/OPENAI/utils.py +295 -295
- webscout/Provider/OPENAI/venice.py +436 -436
- webscout/Provider/OPENAI/wisecat.py +387 -387
- webscout/Provider/OPENAI/writecream.py +166 -166
- webscout/Provider/OPENAI/x0gpt.py +378 -378
- webscout/Provider/OPENAI/yep.py +389 -389
- webscout/Provider/OpenGPT.py +230 -230
- webscout/Provider/Openai.py +244 -496
- webscout/Provider/PI.py +405 -404
- webscout/Provider/Perplexitylabs.py +430 -431
- webscout/Provider/QwenLM.py +272 -254
- webscout/Provider/STT/__init__.py +32 -2
- webscout/Provider/{Llama3.py → Sambanova.py} +257 -258
- webscout/Provider/StandardInput.py +309 -309
- webscout/Provider/TTI/README.md +82 -82
- webscout/Provider/TTI/__init__.py +33 -12
- webscout/Provider/TTI/aiarta.py +413 -413
- webscout/Provider/TTI/base.py +136 -136
- webscout/Provider/TTI/bing.py +243 -243
- webscout/Provider/TTI/gpt1image.py +149 -149
- webscout/Provider/TTI/imagen.py +196 -196
- webscout/Provider/TTI/infip.py +211 -211
- webscout/Provider/TTI/magicstudio.py +232 -232
- webscout/Provider/TTI/monochat.py +219 -219
- webscout/Provider/TTI/piclumen.py +214 -214
- webscout/Provider/TTI/pixelmuse.py +232 -232
- webscout/Provider/TTI/pollinations.py +232 -232
- webscout/Provider/TTI/together.py +288 -288
- webscout/Provider/TTI/utils.py +12 -12
- webscout/Provider/TTI/venice.py +367 -367
- webscout/Provider/TTS/README.md +192 -192
- webscout/Provider/TTS/__init__.py +33 -10
- webscout/Provider/TTS/parler.py +110 -110
- webscout/Provider/TTS/streamElements.py +333 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TeachAnything.py +237 -236
- webscout/Provider/TextPollinationsAI.py +311 -318
- webscout/Provider/TogetherAI.py +356 -357
- webscout/Provider/TwoAI.py +313 -569
- webscout/Provider/TypliAI.py +312 -311
- webscout/Provider/UNFINISHED/ChatHub.py +208 -208
- webscout/Provider/UNFINISHED/ChutesAI.py +313 -313
- webscout/Provider/{GizAI.py → UNFINISHED/GizAI.py} +294 -294
- webscout/Provider/{Marcus.py → UNFINISHED/Marcus.py} +198 -198
- webscout/Provider/{Qodo.py → UNFINISHED/Qodo.py} +477 -477
- webscout/Provider/UNFINISHED/VercelAIGateway.py +338 -338
- webscout/Provider/{XenAI.py → UNFINISHED/XenAI.py} +324 -324
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/liner.py +334 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +262 -262
- webscout/Provider/UNFINISHED/puterjs.py +634 -634
- webscout/Provider/UNFINISHED/samurai.py +223 -223
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Venice.py +251 -250
- webscout/Provider/VercelAI.py +256 -255
- webscout/Provider/WiseCat.py +232 -231
- webscout/Provider/WrDoChat.py +367 -366
- webscout/Provider/__init__.py +33 -86
- webscout/Provider/ai4chat.py +174 -174
- webscout/Provider/akashgpt.py +331 -334
- webscout/Provider/cerebras.py +446 -340
- webscout/Provider/chatglm.py +394 -214
- webscout/Provider/cleeai.py +211 -212
- webscout/Provider/deepseek_assistant.py +1 -1
- webscout/Provider/elmo.py +282 -282
- webscout/Provider/geminiapi.py +208 -208
- webscout/Provider/granite.py +261 -261
- webscout/Provider/hermes.py +263 -265
- webscout/Provider/julius.py +223 -222
- webscout/Provider/learnfastai.py +309 -309
- webscout/Provider/llama3mitril.py +214 -214
- webscout/Provider/llmchat.py +243 -243
- webscout/Provider/llmchatco.py +290 -290
- webscout/Provider/meta.py +801 -801
- webscout/Provider/oivscode.py +309 -309
- webscout/Provider/scira_chat.py +384 -457
- webscout/Provider/searchchat.py +292 -291
- webscout/Provider/sonus.py +258 -258
- webscout/Provider/toolbaz.py +370 -364
- webscout/Provider/turboseek.py +274 -265
- webscout/Provider/typefully.py +208 -207
- webscout/Provider/x0gpt.py +1 -0
- webscout/Provider/yep.py +372 -371
- webscout/__init__.py +30 -31
- webscout/__main__.py +5 -5
- webscout/auth/api_key_manager.py +189 -189
- webscout/auth/config.py +175 -175
- webscout/auth/models.py +185 -185
- webscout/auth/routes.py +664 -664
- webscout/auth/simple_logger.py +236 -236
- webscout/cli.py +523 -523
- webscout/conversation.py +438 -438
- webscout/exceptions.py +361 -361
- webscout/litagent/Readme.md +298 -298
- webscout/litagent/__init__.py +28 -28
- webscout/litagent/agent.py +581 -581
- webscout/litagent/constants.py +59 -59
- webscout/litprinter/__init__.py +58 -58
- webscout/models.py +181 -181
- webscout/optimizers.py +419 -419
- webscout/prompt_manager.py +288 -288
- webscout/sanitize.py +1078 -1078
- webscout/scout/README.md +401 -401
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +6 -6
- webscout/scout/core/crawler.py +297 -297
- webscout/scout/core/scout.py +706 -706
- webscout/scout/core/search_result.py +95 -95
- webscout/scout/core/text_analyzer.py +62 -62
- webscout/scout/core/text_utils.py +277 -277
- webscout/scout/core/web_analyzer.py +51 -51
- webscout/scout/element.py +599 -599
- webscout/scout/parsers/__init__.py +69 -69
- webscout/scout/parsers/html5lib_parser.py +172 -172
- webscout/scout/parsers/html_parser.py +236 -236
- webscout/scout/parsers/lxml_parser.py +178 -178
- webscout/scout/utils.py +37 -37
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/__init__.py +95 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +308 -308
- webscout/swiftcli/core/context.py +104 -104
- webscout/swiftcli/core/group.py +241 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +221 -221
- webscout/swiftcli/decorators/options.py +220 -220
- webscout/swiftcli/decorators/output.py +302 -302
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +135 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +59 -59
- webscout/swiftcli/utils/formatting.py +252 -252
- webscout/swiftcli/utils/parsing.py +267 -267
- webscout/update_checker.py +117 -117
- webscout/version.py +1 -1
- webscout/webscout_search.py +1183 -1183
- webscout/webscout_search_async.py +649 -649
- webscout/yep_search.py +346 -346
- webscout/zeroart/README.md +89 -89
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/base.py +66 -66
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.3.6.dist-info → webscout-2025.10.11.dist-info}/METADATA +937 -936
- webscout-2025.10.11.dist-info/RECORD +300 -0
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/AllenAI.py +0 -440
- webscout/Provider/Blackboxai.py +0 -793
- webscout/Provider/FreeGemini.py +0 -250
- webscout/Provider/GptOss.py +0 -207
- webscout/Provider/Hunyuan.py +0 -283
- webscout/Provider/Kimi.py +0 -445
- webscout/Provider/MCPCore.py +0 -322
- webscout/Provider/MiniMax.py +0 -207
- webscout/Provider/OPENAI/BLACKBOXAI.py +0 -1045
- webscout/Provider/OPENAI/MiniMax.py +0 -298
- webscout/Provider/OPENAI/Qwen3.py +0 -304
- webscout/Provider/OPENAI/autoproxy.py +0 -1067
- webscout/Provider/OPENAI/copilot.py +0 -321
- webscout/Provider/OPENAI/gptoss.py +0 -288
- webscout/Provider/OPENAI/kimi.py +0 -469
- webscout/Provider/OPENAI/mcpcore.py +0 -431
- webscout/Provider/OPENAI/multichat.py +0 -378
- webscout/Provider/OPENAI/qodo.py +0 -630
- webscout/Provider/OPENAI/xenai.py +0 -514
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/UNFINISHED/fetch_together_models.py +0 -90
- webscout/Provider/asksteve.py +0 -220
- webscout/Provider/copilot.py +0 -441
- webscout/Provider/freeaichat.py +0 -294
- webscout/Provider/koala.py +0 -182
- webscout/Provider/lmarena.py +0 -198
- webscout/Provider/monochat.py +0 -275
- webscout/Provider/multichat.py +0 -375
- webscout/Provider/scnet.py +0 -244
- webscout/Provider/talkai.py +0 -194
- webscout/tempid.py +0 -128
- webscout-8.3.6.dist-info/RECORD +0 -327
- {webscout-8.3.6.dist-info → webscout-2025.10.11.dist-info}/WHEEL +0 -0
- {webscout-8.3.6.dist-info → webscout-2025.10.11.dist-info}/entry_points.txt +0 -0
- {webscout-8.3.6.dist-info → webscout-2025.10.11.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.3.6.dist-info → webscout-2025.10.11.dist-info}/top_level.txt +0 -0
|
@@ -1,220 +1,220 @@
|
|
|
1
|
-
"""Option decorators for SwiftCLI."""
|
|
2
|
-
|
|
3
|
-
from typing import Any, Callable, Dict, List, Optional, Union
|
|
4
|
-
|
|
5
|
-
def option(
|
|
6
|
-
*param_decls: str,
|
|
7
|
-
type: Any = str,
|
|
8
|
-
required: bool = False,
|
|
9
|
-
default: Any = None,
|
|
10
|
-
help: str = None,
|
|
11
|
-
is_flag: bool = False,
|
|
12
|
-
multiple: bool = False,
|
|
13
|
-
count: bool = False,
|
|
14
|
-
prompt: bool = False,
|
|
15
|
-
hide_input: bool = False,
|
|
16
|
-
confirmation_prompt: bool = False,
|
|
17
|
-
prompt_required: bool = True,
|
|
18
|
-
show_default: bool = True,
|
|
19
|
-
choices: Optional[List[Any]] = None,
|
|
20
|
-
case_sensitive: bool = True,
|
|
21
|
-
callback: Optional[Callable] = None,
|
|
22
|
-
hidden: bool = False
|
|
23
|
-
) -> Callable:
|
|
24
|
-
"""
|
|
25
|
-
Decorator to add an option to a command.
|
|
26
|
-
|
|
27
|
-
Options are named parameters that can be provided in any order.
|
|
28
|
-
|
|
29
|
-
Args:
|
|
30
|
-
param_decls: Option names (e.g., "--name", "-n")
|
|
31
|
-
type: Expected type
|
|
32
|
-
required: Whether option is required
|
|
33
|
-
default: Default value
|
|
34
|
-
help: Help text
|
|
35
|
-
is_flag: Whether option is a boolean flag
|
|
36
|
-
multiple: Whether option can be specified multiple times
|
|
37
|
-
count: Whether option counts occurrences
|
|
38
|
-
prompt: Whether to prompt for value if not provided
|
|
39
|
-
hide_input: Whether to hide input when prompting
|
|
40
|
-
confirmation_prompt: Whether to prompt for confirmation
|
|
41
|
-
prompt_required: Whether prompt is required
|
|
42
|
-
show_default: Whether to show default in help
|
|
43
|
-
choices: List of valid choices
|
|
44
|
-
case_sensitive: Whether choices are case sensitive
|
|
45
|
-
callback: Function to process/validate value
|
|
46
|
-
hidden: Whether to hide from help output
|
|
47
|
-
|
|
48
|
-
Example:
|
|
49
|
-
@command()
|
|
50
|
-
@option("--count", "-c", type=int, default=1)
|
|
51
|
-
@option("--format", type=str, choices=["json", "yaml"])
|
|
52
|
-
@option("--verbose", is_flag=True)
|
|
53
|
-
def process(count: int, format: str, verbose: bool):
|
|
54
|
-
'''Process data'''
|
|
55
|
-
if verbose:
|
|
56
|
-
print(f"Processing {count} items as {format}")
|
|
57
|
-
"""
|
|
58
|
-
def decorator(f: Callable) -> Callable:
|
|
59
|
-
if not hasattr(f, '_options'):
|
|
60
|
-
f._options = []
|
|
61
|
-
|
|
62
|
-
f._options.append({
|
|
63
|
-
'param_decls': param_decls,
|
|
64
|
-
'type': type,
|
|
65
|
-
'required': required,
|
|
66
|
-
'default': default,
|
|
67
|
-
'help': help,
|
|
68
|
-
'is_flag': is_flag,
|
|
69
|
-
'multiple': multiple,
|
|
70
|
-
'count': count,
|
|
71
|
-
'prompt': prompt,
|
|
72
|
-
'hide_input': hide_input,
|
|
73
|
-
'confirmation_prompt': confirmation_prompt,
|
|
74
|
-
'prompt_required': prompt_required,
|
|
75
|
-
'show_default': show_default,
|
|
76
|
-
'choices': choices,
|
|
77
|
-
'case_sensitive': case_sensitive,
|
|
78
|
-
'callback': callback,
|
|
79
|
-
'hidden': hidden
|
|
80
|
-
})
|
|
81
|
-
return f
|
|
82
|
-
return decorator
|
|
83
|
-
|
|
84
|
-
def envvar(
|
|
85
|
-
name: str,
|
|
86
|
-
type: Any = str,
|
|
87
|
-
required: bool = False,
|
|
88
|
-
default: Any = None,
|
|
89
|
-
help: str = None
|
|
90
|
-
) -> Callable:
|
|
91
|
-
"""
|
|
92
|
-
Decorator to load option value from environment variable.
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
name: Environment variable name
|
|
96
|
-
type: Expected type
|
|
97
|
-
required: Whether variable is required
|
|
98
|
-
default: Default value if not set
|
|
99
|
-
help: Help text
|
|
100
|
-
|
|
101
|
-
Example:
|
|
102
|
-
@command()
|
|
103
|
-
@envvar("API_KEY", required=True)
|
|
104
|
-
@envvar("API_URL", default="https://api.example.com")
|
|
105
|
-
def api_call(api_key: str, api_url: str):
|
|
106
|
-
'''Make API call'''
|
|
107
|
-
print(f"Calling {api_url} with key {api_key}")
|
|
108
|
-
"""
|
|
109
|
-
def decorator(f: Callable) -> Callable:
|
|
110
|
-
if not hasattr(f, '_envvars'):
|
|
111
|
-
f._envvars = []
|
|
112
|
-
|
|
113
|
-
f._envvars.append({
|
|
114
|
-
'name': name,
|
|
115
|
-
'type': type,
|
|
116
|
-
'required': required,
|
|
117
|
-
'default': default,
|
|
118
|
-
'help': help
|
|
119
|
-
})
|
|
120
|
-
return f
|
|
121
|
-
return decorator
|
|
122
|
-
|
|
123
|
-
def config_file(
|
|
124
|
-
path: str = None,
|
|
125
|
-
section: str = None,
|
|
126
|
-
required: bool = False,
|
|
127
|
-
auto_create: bool = True,
|
|
128
|
-
format: str = 'json'
|
|
129
|
-
) -> Callable:
|
|
130
|
-
"""
|
|
131
|
-
Decorator to load configuration from file.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
path: Config file path
|
|
135
|
-
section: Config section to load
|
|
136
|
-
required: Whether config is required
|
|
137
|
-
auto_create: Whether to create file if missing
|
|
138
|
-
format: File format (json, yaml, ini)
|
|
139
|
-
|
|
140
|
-
Example:
|
|
141
|
-
@command()
|
|
142
|
-
@config_file("~/.myapp/config.json")
|
|
143
|
-
def setup(config: dict):
|
|
144
|
-
'''Setup application'''
|
|
145
|
-
print(f"Database: {config.get('database')}")
|
|
146
|
-
|
|
147
|
-
@command()
|
|
148
|
-
@config_file("config.ini", section="api")
|
|
149
|
-
def api(config: dict):
|
|
150
|
-
'''Make API call'''
|
|
151
|
-
print(f"URL: {config.get('url')}")
|
|
152
|
-
"""
|
|
153
|
-
def decorator(f: Callable) -> Callable:
|
|
154
|
-
f._config = {
|
|
155
|
-
'path': path,
|
|
156
|
-
'section': section,
|
|
157
|
-
'required': required,
|
|
158
|
-
'auto_create': auto_create,
|
|
159
|
-
'format': format
|
|
160
|
-
}
|
|
161
|
-
return f
|
|
162
|
-
return decorator
|
|
163
|
-
|
|
164
|
-
def version_option(
|
|
165
|
-
version: str = None,
|
|
166
|
-
prog_name: str = None,
|
|
167
|
-
message: str = None,
|
|
168
|
-
package_name: str = None
|
|
169
|
-
) -> Callable:
|
|
170
|
-
"""
|
|
171
|
-
Decorator to add version option to command.
|
|
172
|
-
|
|
173
|
-
Args:
|
|
174
|
-
version: Version string
|
|
175
|
-
prog_name: Program name
|
|
176
|
-
message: Custom version message
|
|
177
|
-
package_name: Package name to get version from
|
|
178
|
-
|
|
179
|
-
Example:
|
|
180
|
-
@command()
|
|
181
|
-
@version_option(version="1.0.0")
|
|
182
|
-
def main():
|
|
183
|
-
'''Main command'''
|
|
184
|
-
pass
|
|
185
|
-
"""
|
|
186
|
-
def decorator(f: Callable) -> Callable:
|
|
187
|
-
f._version = {
|
|
188
|
-
'version': version,
|
|
189
|
-
'prog_name': prog_name,
|
|
190
|
-
'message': message,
|
|
191
|
-
'package_name': package_name
|
|
192
|
-
}
|
|
193
|
-
return f
|
|
194
|
-
return decorator
|
|
195
|
-
|
|
196
|
-
def help_option(
|
|
197
|
-
param_decls: List[str] = None,
|
|
198
|
-
help: str = None
|
|
199
|
-
) -> Callable:
|
|
200
|
-
"""
|
|
201
|
-
Decorator to customize help option.
|
|
202
|
-
|
|
203
|
-
Args:
|
|
204
|
-
param_decls: Help option flags
|
|
205
|
-
help: Help text
|
|
206
|
-
|
|
207
|
-
Example:
|
|
208
|
-
@command()
|
|
209
|
-
@help_option(["--help", "-h"], "Show this message")
|
|
210
|
-
def main():
|
|
211
|
-
'''Main command'''
|
|
212
|
-
pass
|
|
213
|
-
"""
|
|
214
|
-
def decorator(f: Callable) -> Callable:
|
|
215
|
-
f._help_option = {
|
|
216
|
-
'param_decls': param_decls or ['--help', '-h'],
|
|
217
|
-
'help': help or 'Show this message and exit.'
|
|
218
|
-
}
|
|
219
|
-
return f
|
|
220
|
-
return decorator
|
|
1
|
+
"""Option decorators for SwiftCLI."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable, Dict, List, Optional, Union
|
|
4
|
+
|
|
5
|
+
def option(
|
|
6
|
+
*param_decls: str,
|
|
7
|
+
type: Any = str,
|
|
8
|
+
required: bool = False,
|
|
9
|
+
default: Any = None,
|
|
10
|
+
help: str = None,
|
|
11
|
+
is_flag: bool = False,
|
|
12
|
+
multiple: bool = False,
|
|
13
|
+
count: bool = False,
|
|
14
|
+
prompt: bool = False,
|
|
15
|
+
hide_input: bool = False,
|
|
16
|
+
confirmation_prompt: bool = False,
|
|
17
|
+
prompt_required: bool = True,
|
|
18
|
+
show_default: bool = True,
|
|
19
|
+
choices: Optional[List[Any]] = None,
|
|
20
|
+
case_sensitive: bool = True,
|
|
21
|
+
callback: Optional[Callable] = None,
|
|
22
|
+
hidden: bool = False
|
|
23
|
+
) -> Callable:
|
|
24
|
+
"""
|
|
25
|
+
Decorator to add an option to a command.
|
|
26
|
+
|
|
27
|
+
Options are named parameters that can be provided in any order.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
param_decls: Option names (e.g., "--name", "-n")
|
|
31
|
+
type: Expected type
|
|
32
|
+
required: Whether option is required
|
|
33
|
+
default: Default value
|
|
34
|
+
help: Help text
|
|
35
|
+
is_flag: Whether option is a boolean flag
|
|
36
|
+
multiple: Whether option can be specified multiple times
|
|
37
|
+
count: Whether option counts occurrences
|
|
38
|
+
prompt: Whether to prompt for value if not provided
|
|
39
|
+
hide_input: Whether to hide input when prompting
|
|
40
|
+
confirmation_prompt: Whether to prompt for confirmation
|
|
41
|
+
prompt_required: Whether prompt is required
|
|
42
|
+
show_default: Whether to show default in help
|
|
43
|
+
choices: List of valid choices
|
|
44
|
+
case_sensitive: Whether choices are case sensitive
|
|
45
|
+
callback: Function to process/validate value
|
|
46
|
+
hidden: Whether to hide from help output
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
@command()
|
|
50
|
+
@option("--count", "-c", type=int, default=1)
|
|
51
|
+
@option("--format", type=str, choices=["json", "yaml"])
|
|
52
|
+
@option("--verbose", is_flag=True)
|
|
53
|
+
def process(count: int, format: str, verbose: bool):
|
|
54
|
+
'''Process data'''
|
|
55
|
+
if verbose:
|
|
56
|
+
print(f"Processing {count} items as {format}")
|
|
57
|
+
"""
|
|
58
|
+
def decorator(f: Callable) -> Callable:
|
|
59
|
+
if not hasattr(f, '_options'):
|
|
60
|
+
f._options = []
|
|
61
|
+
|
|
62
|
+
f._options.append({
|
|
63
|
+
'param_decls': param_decls,
|
|
64
|
+
'type': type,
|
|
65
|
+
'required': required,
|
|
66
|
+
'default': default,
|
|
67
|
+
'help': help,
|
|
68
|
+
'is_flag': is_flag,
|
|
69
|
+
'multiple': multiple,
|
|
70
|
+
'count': count,
|
|
71
|
+
'prompt': prompt,
|
|
72
|
+
'hide_input': hide_input,
|
|
73
|
+
'confirmation_prompt': confirmation_prompt,
|
|
74
|
+
'prompt_required': prompt_required,
|
|
75
|
+
'show_default': show_default,
|
|
76
|
+
'choices': choices,
|
|
77
|
+
'case_sensitive': case_sensitive,
|
|
78
|
+
'callback': callback,
|
|
79
|
+
'hidden': hidden
|
|
80
|
+
})
|
|
81
|
+
return f
|
|
82
|
+
return decorator
|
|
83
|
+
|
|
84
|
+
def envvar(
|
|
85
|
+
name: str,
|
|
86
|
+
type: Any = str,
|
|
87
|
+
required: bool = False,
|
|
88
|
+
default: Any = None,
|
|
89
|
+
help: str = None
|
|
90
|
+
) -> Callable:
|
|
91
|
+
"""
|
|
92
|
+
Decorator to load option value from environment variable.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
name: Environment variable name
|
|
96
|
+
type: Expected type
|
|
97
|
+
required: Whether variable is required
|
|
98
|
+
default: Default value if not set
|
|
99
|
+
help: Help text
|
|
100
|
+
|
|
101
|
+
Example:
|
|
102
|
+
@command()
|
|
103
|
+
@envvar("API_KEY", required=True)
|
|
104
|
+
@envvar("API_URL", default="https://api.example.com")
|
|
105
|
+
def api_call(api_key: str, api_url: str):
|
|
106
|
+
'''Make API call'''
|
|
107
|
+
print(f"Calling {api_url} with key {api_key}")
|
|
108
|
+
"""
|
|
109
|
+
def decorator(f: Callable) -> Callable:
|
|
110
|
+
if not hasattr(f, '_envvars'):
|
|
111
|
+
f._envvars = []
|
|
112
|
+
|
|
113
|
+
f._envvars.append({
|
|
114
|
+
'name': name,
|
|
115
|
+
'type': type,
|
|
116
|
+
'required': required,
|
|
117
|
+
'default': default,
|
|
118
|
+
'help': help
|
|
119
|
+
})
|
|
120
|
+
return f
|
|
121
|
+
return decorator
|
|
122
|
+
|
|
123
|
+
def config_file(
|
|
124
|
+
path: str = None,
|
|
125
|
+
section: str = None,
|
|
126
|
+
required: bool = False,
|
|
127
|
+
auto_create: bool = True,
|
|
128
|
+
format: str = 'json'
|
|
129
|
+
) -> Callable:
|
|
130
|
+
"""
|
|
131
|
+
Decorator to load configuration from file.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
path: Config file path
|
|
135
|
+
section: Config section to load
|
|
136
|
+
required: Whether config is required
|
|
137
|
+
auto_create: Whether to create file if missing
|
|
138
|
+
format: File format (json, yaml, ini)
|
|
139
|
+
|
|
140
|
+
Example:
|
|
141
|
+
@command()
|
|
142
|
+
@config_file("~/.myapp/config.json")
|
|
143
|
+
def setup(config: dict):
|
|
144
|
+
'''Setup application'''
|
|
145
|
+
print(f"Database: {config.get('database')}")
|
|
146
|
+
|
|
147
|
+
@command()
|
|
148
|
+
@config_file("config.ini", section="api")
|
|
149
|
+
def api(config: dict):
|
|
150
|
+
'''Make API call'''
|
|
151
|
+
print(f"URL: {config.get('url')}")
|
|
152
|
+
"""
|
|
153
|
+
def decorator(f: Callable) -> Callable:
|
|
154
|
+
f._config = {
|
|
155
|
+
'path': path,
|
|
156
|
+
'section': section,
|
|
157
|
+
'required': required,
|
|
158
|
+
'auto_create': auto_create,
|
|
159
|
+
'format': format
|
|
160
|
+
}
|
|
161
|
+
return f
|
|
162
|
+
return decorator
|
|
163
|
+
|
|
164
|
+
def version_option(
|
|
165
|
+
version: str = None,
|
|
166
|
+
prog_name: str = None,
|
|
167
|
+
message: str = None,
|
|
168
|
+
package_name: str = None
|
|
169
|
+
) -> Callable:
|
|
170
|
+
"""
|
|
171
|
+
Decorator to add version option to command.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
version: Version string
|
|
175
|
+
prog_name: Program name
|
|
176
|
+
message: Custom version message
|
|
177
|
+
package_name: Package name to get version from
|
|
178
|
+
|
|
179
|
+
Example:
|
|
180
|
+
@command()
|
|
181
|
+
@version_option(version="1.0.0")
|
|
182
|
+
def main():
|
|
183
|
+
'''Main command'''
|
|
184
|
+
pass
|
|
185
|
+
"""
|
|
186
|
+
def decorator(f: Callable) -> Callable:
|
|
187
|
+
f._version = {
|
|
188
|
+
'version': version,
|
|
189
|
+
'prog_name': prog_name,
|
|
190
|
+
'message': message,
|
|
191
|
+
'package_name': package_name
|
|
192
|
+
}
|
|
193
|
+
return f
|
|
194
|
+
return decorator
|
|
195
|
+
|
|
196
|
+
def help_option(
|
|
197
|
+
param_decls: List[str] = None,
|
|
198
|
+
help: str = None
|
|
199
|
+
) -> Callable:
|
|
200
|
+
"""
|
|
201
|
+
Decorator to customize help option.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
param_decls: Help option flags
|
|
205
|
+
help: Help text
|
|
206
|
+
|
|
207
|
+
Example:
|
|
208
|
+
@command()
|
|
209
|
+
@help_option(["--help", "-h"], "Show this message")
|
|
210
|
+
def main():
|
|
211
|
+
'''Main command'''
|
|
212
|
+
pass
|
|
213
|
+
"""
|
|
214
|
+
def decorator(f: Callable) -> Callable:
|
|
215
|
+
f._help_option = {
|
|
216
|
+
'param_decls': param_decls or ['--help', '-h'],
|
|
217
|
+
'help': help or 'Show this message and exit.'
|
|
218
|
+
}
|
|
219
|
+
return f
|
|
220
|
+
return decorator
|