webscout 8.2.6__py3-none-any.whl → 8.2.7__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/AIutel.py +97 -87
- webscout/version.py +1 -1
- {webscout-8.2.6.dist-info → webscout-8.2.7.dist-info}/METADATA +2 -15
- webscout-8.2.7.dist-info/RECORD +26 -0
- {webscout-8.2.6.dist-info → webscout-8.2.7.dist-info}/WHEEL +1 -1
- webscout-8.2.7.dist-info/entry_points.txt +3 -0
- webscout-8.2.7.dist-info/top_level.txt +1 -0
- webscout/Extra/GitToolkit/__init__.py +0 -10
- webscout/Extra/GitToolkit/gitapi/__init__.py +0 -12
- webscout/Extra/GitToolkit/gitapi/repository.py +0 -195
- webscout/Extra/GitToolkit/gitapi/user.py +0 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +0 -62
- webscout/Extra/YTToolkit/YTdownloader.py +0 -957
- webscout/Extra/YTToolkit/__init__.py +0 -3
- webscout/Extra/YTToolkit/transcriber.py +0 -476
- webscout/Extra/YTToolkit/ytapi/__init__.py +0 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +0 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +0 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +0 -45
- webscout/Extra/YTToolkit/ytapi/https.py +0 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +0 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +0 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +0 -8
- webscout/Extra/YTToolkit/ytapi/query.py +0 -40
- webscout/Extra/YTToolkit/ytapi/stream.py +0 -63
- webscout/Extra/YTToolkit/ytapi/utils.py +0 -62
- webscout/Extra/YTToolkit/ytapi/video.py +0 -232
- webscout/Extra/__init__.py +0 -7
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -910
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/Extra/gguf.py +0 -684
- webscout/Extra/tempmail/__init__.py +0 -28
- webscout/Extra/tempmail/async_utils.py +0 -141
- webscout/Extra/tempmail/base.py +0 -161
- webscout/Extra/tempmail/cli.py +0 -187
- webscout/Extra/tempmail/emailnator.py +0 -84
- webscout/Extra/tempmail/mail_tm.py +0 -361
- webscout/Extra/tempmail/temp_mail_io.py +0 -292
- webscout/Extra/weather.py +0 -194
- webscout/Extra/weather_ascii.py +0 -76
- webscout/Litlogger/__init__.py +0 -67
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -250
- webscout/Provider/AISEARCH/ISou.py +0 -256
- webscout/Provider/AISEARCH/Perplexity.py +0 -359
- webscout/Provider/AISEARCH/__init__.py +0 -10
- webscout/Provider/AISEARCH/felo_search.py +0 -228
- webscout/Provider/AISEARCH/genspark_search.py +0 -208
- webscout/Provider/AISEARCH/hika_search.py +0 -198
- webscout/Provider/AISEARCH/iask_search.py +0 -436
- webscout/Provider/AISEARCH/monica_search.py +0 -246
- webscout/Provider/AISEARCH/scira_search.py +0 -322
- webscout/Provider/AISEARCH/webpilotai_search.py +0 -281
- webscout/Provider/Aitopia.py +0 -316
- webscout/Provider/AllenAI.py +0 -447
- webscout/Provider/Andi.py +0 -228
- webscout/Provider/Blackboxai.py +0 -229
- webscout/Provider/ChatGPTClone.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/ChatSandbox.py +0 -342
- webscout/Provider/Cloudflare.py +0 -325
- webscout/Provider/Cohere.py +0 -208
- webscout/Provider/Deepinfra.py +0 -338
- webscout/Provider/ElectronHub.py +0 -773
- webscout/Provider/ExaAI.py +0 -261
- webscout/Provider/ExaChat.py +0 -358
- webscout/Provider/Free2GPT.py +0 -241
- webscout/Provider/GPTWeb.py +0 -249
- webscout/Provider/Gemini.py +0 -169
- webscout/Provider/GithubChat.py +0 -370
- webscout/Provider/GizAI.py +0 -285
- webscout/Provider/Glider.py +0 -222
- webscout/Provider/Groq.py +0 -801
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HeckAI.py +0 -257
- webscout/Provider/HuggingFaceChat.py +0 -469
- webscout/Provider/Hunyuan.py +0 -283
- webscout/Provider/Jadve.py +0 -291
- webscout/Provider/Koboldai.py +0 -381
- webscout/Provider/LambdaChat.py +0 -411
- webscout/Provider/Llama3.py +0 -259
- webscout/Provider/MCPCore.py +0 -315
- webscout/Provider/Marcus.py +0 -206
- webscout/Provider/Nemotron.py +0 -218
- webscout/Provider/Netwrck.py +0 -270
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/__init__.py +0 -28
- webscout/Provider/OPENAI/ai4chat.py +0 -286
- webscout/Provider/OPENAI/base.py +0 -46
- webscout/Provider/OPENAI/c4ai.py +0 -367
- webscout/Provider/OPENAI/chatgpt.py +0 -549
- webscout/Provider/OPENAI/chatgptclone.py +0 -481
- webscout/Provider/OPENAI/deepinfra.py +0 -309
- webscout/Provider/OPENAI/e2b.py +0 -1350
- webscout/Provider/OPENAI/exaai.py +0 -404
- webscout/Provider/OPENAI/exachat.py +0 -437
- webscout/Provider/OPENAI/freeaichat.py +0 -352
- webscout/Provider/OPENAI/glider.py +0 -316
- webscout/Provider/OPENAI/groq.py +0 -354
- webscout/Provider/OPENAI/heckai.py +0 -341
- webscout/Provider/OPENAI/llmchatco.py +0 -327
- webscout/Provider/OPENAI/mcpcore.py +0 -376
- webscout/Provider/OPENAI/multichat.py +0 -368
- webscout/Provider/OPENAI/netwrck.py +0 -350
- webscout/Provider/OPENAI/opkfc.py +0 -488
- webscout/Provider/OPENAI/scirachat.py +0 -462
- webscout/Provider/OPENAI/sonus.py +0 -294
- webscout/Provider/OPENAI/standardinput.py +0 -425
- webscout/Provider/OPENAI/textpollinations.py +0 -329
- webscout/Provider/OPENAI/toolbaz.py +0 -406
- webscout/Provider/OPENAI/typegpt.py +0 -346
- webscout/Provider/OPENAI/uncovrAI.py +0 -455
- webscout/Provider/OPENAI/utils.py +0 -211
- webscout/Provider/OPENAI/venice.py +0 -413
- webscout/Provider/OPENAI/wisecat.py +0 -381
- webscout/Provider/OPENAI/writecream.py +0 -156
- webscout/Provider/OPENAI/x0gpt.py +0 -371
- webscout/Provider/OPENAI/yep.py +0 -327
- webscout/Provider/OpenGPT.py +0 -209
- webscout/Provider/Openai.py +0 -496
- webscout/Provider/PI.py +0 -429
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/QwenLM.py +0 -254
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -290
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/__init__.py +0 -12
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/TTS/__init__.py +0 -8
- webscout/Provider/TTS/base.py +0 -159
- webscout/Provider/TTS/deepgram.py +0 -156
- webscout/Provider/TTS/elevenlabs.py +0 -111
- webscout/Provider/TTS/gesserit.py +0 -128
- webscout/Provider/TTS/murfai.py +0 -113
- webscout/Provider/TTS/parler.py +0 -111
- webscout/Provider/TTS/speechma.py +0 -180
- webscout/Provider/TTS/streamElements.py +0 -333
- webscout/Provider/TTS/utils.py +0 -280
- webscout/Provider/TeachAnything.py +0 -233
- webscout/Provider/TextPollinationsAI.py +0 -306
- webscout/Provider/TwoAI.py +0 -280
- webscout/Provider/TypliAI.py +0 -305
- webscout/Provider/Venice.py +0 -258
- webscout/Provider/VercelAI.py +0 -253
- webscout/Provider/WiseCat.py +0 -233
- webscout/Provider/WrDoChat.py +0 -370
- webscout/Provider/Writecream.py +0 -237
- webscout/Provider/WritingMate.py +0 -269
- webscout/Provider/Youchat.py +0 -330
- webscout/Provider/__init__.py +0 -178
- webscout/Provider/ai4chat.py +0 -203
- webscout/Provider/aimathgpt.py +0 -189
- webscout/Provider/akashgpt.py +0 -335
- webscout/Provider/asksteve.py +0 -212
- webscout/Provider/bagoodex.py +0 -145
- webscout/Provider/cerebras.py +0 -288
- webscout/Provider/chatglm.py +0 -215
- webscout/Provider/cleeai.py +0 -213
- webscout/Provider/copilot.py +0 -425
- webscout/Provider/elmo.py +0 -283
- webscout/Provider/freeaichat.py +0 -285
- webscout/Provider/geminiapi.py +0 -208
- webscout/Provider/geminiprorealtime.py +0 -160
- webscout/Provider/granite.py +0 -235
- webscout/Provider/hermes.py +0 -266
- webscout/Provider/julius.py +0 -223
- webscout/Provider/koala.py +0 -268
- webscout/Provider/learnfastai.py +0 -325
- webscout/Provider/llama3mitril.py +0 -215
- webscout/Provider/llmchat.py +0 -255
- webscout/Provider/llmchatco.py +0 -306
- webscout/Provider/meta.py +0 -798
- webscout/Provider/multichat.py +0 -364
- webscout/Provider/scira_chat.py +0 -297
- webscout/Provider/scnet.py +0 -243
- webscout/Provider/searchchat.py +0 -292
- webscout/Provider/sonus.py +0 -258
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/toolbaz.py +0 -353
- webscout/Provider/turboseek.py +0 -266
- webscout/Provider/typefully.py +0 -330
- webscout/Provider/typegpt.py +0 -289
- webscout/Provider/uncovr.py +0 -368
- webscout/Provider/x0gpt.py +0 -299
- webscout/Provider/yep.py +0 -389
- webscout/litagent/__init__.py +0 -29
- webscout/litagent/agent.py +0 -455
- webscout/litagent/constants.py +0 -60
- webscout/litprinter/__init__.py +0 -59
- webscout/scout/__init__.py +0 -8
- webscout/scout/core/__init__.py +0 -7
- webscout/scout/core/crawler.py +0 -140
- webscout/scout/core/scout.py +0 -568
- webscout/scout/core/search_result.py +0 -96
- webscout/scout/core/text_analyzer.py +0 -63
- webscout/scout/core/text_utils.py +0 -277
- webscout/scout/core/web_analyzer.py +0 -52
- webscout/scout/core.py +0 -881
- webscout/scout/element.py +0 -460
- webscout/scout/parsers/__init__.py +0 -69
- webscout/scout/parsers/html5lib_parser.py +0 -172
- webscout/scout/parsers/html_parser.py +0 -236
- webscout/scout/parsers/lxml_parser.py +0 -178
- webscout/scout/utils.py +0 -37
- webscout/swiftcli/__init__.py +0 -95
- webscout/swiftcli/core/__init__.py +0 -7
- webscout/swiftcli/core/cli.py +0 -297
- webscout/swiftcli/core/context.py +0 -104
- webscout/swiftcli/core/group.py +0 -241
- webscout/swiftcli/decorators/__init__.py +0 -28
- webscout/swiftcli/decorators/command.py +0 -221
- webscout/swiftcli/decorators/options.py +0 -220
- webscout/swiftcli/decorators/output.py +0 -252
- webscout/swiftcli/exceptions.py +0 -21
- webscout/swiftcli/plugins/__init__.py +0 -9
- webscout/swiftcli/plugins/base.py +0 -135
- webscout/swiftcli/plugins/manager.py +0 -262
- webscout/swiftcli/utils/__init__.py +0 -59
- webscout/swiftcli/utils/formatting.py +0 -252
- webscout/swiftcli/utils/parsing.py +0 -267
- webscout/zeroart/__init__.py +0 -55
- webscout/zeroart/base.py +0 -60
- webscout/zeroart/effects.py +0 -99
- webscout/zeroart/fonts.py +0 -816
- webscout-8.2.6.dist-info/RECORD +0 -307
- webscout-8.2.6.dist-info/entry_points.txt +0 -3
- webscout-8.2.6.dist-info/top_level.txt +0 -2
- webstoken/__init__.py +0 -30
- webstoken/classifier.py +0 -189
- webstoken/keywords.py +0 -216
- webstoken/language.py +0 -128
- webstoken/ner.py +0 -164
- webstoken/normalizer.py +0 -35
- webstoken/processor.py +0 -77
- webstoken/sentiment.py +0 -206
- webstoken/stemmer.py +0 -73
- webstoken/tagger.py +0 -60
- webstoken/tokenizer.py +0 -158
- {webscout-8.2.6.dist-info → webscout-8.2.7.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
"""Utility functions for parsing and validating command-line arguments."""
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
import json
|
|
5
|
-
import yaml
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from typing import Any, Dict, List, Optional, Union, Type
|
|
8
|
-
|
|
9
|
-
from ..exceptions import BadParameter, UsageError
|
|
10
|
-
|
|
11
|
-
def parse_args(args: List[str]) -> Dict[str, Any]:
|
|
12
|
-
"""
|
|
13
|
-
Parse command line arguments into a dictionary.
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
args: List of command line arguments
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Dictionary of parsed arguments
|
|
20
|
-
|
|
21
|
-
Example:
|
|
22
|
-
>>> parse_args(['--name', 'test', '--flag', '-n', '42'])
|
|
23
|
-
{'name': 'test', 'flag': True, 'n': '42'}
|
|
24
|
-
"""
|
|
25
|
-
parsed = {}
|
|
26
|
-
i = 0
|
|
27
|
-
while i < len(args):
|
|
28
|
-
arg = args[i]
|
|
29
|
-
|
|
30
|
-
# Handle flags/options
|
|
31
|
-
if arg.startswith('-'):
|
|
32
|
-
key = arg.lstrip('-').replace('-', '_')
|
|
33
|
-
|
|
34
|
-
# Check if next arg is a value or another flag
|
|
35
|
-
if i + 1 >= len(args) or args[i + 1].startswith('-'):
|
|
36
|
-
parsed[key] = True # Flag without value
|
|
37
|
-
else:
|
|
38
|
-
parsed[key] = args[i + 1]
|
|
39
|
-
i += 1
|
|
40
|
-
else:
|
|
41
|
-
# Positional argument
|
|
42
|
-
parsed[f'arg{len([k for k in parsed.keys() if k.startswith("arg")])}'] = arg
|
|
43
|
-
|
|
44
|
-
i += 1
|
|
45
|
-
|
|
46
|
-
return parsed
|
|
47
|
-
|
|
48
|
-
def validate_required(
|
|
49
|
-
params: Dict[str, Any],
|
|
50
|
-
required: List[str]
|
|
51
|
-
) -> None:
|
|
52
|
-
"""
|
|
53
|
-
Validate required parameters are present.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
params: Parameter dictionary
|
|
57
|
-
required: List of required parameter names
|
|
58
|
-
|
|
59
|
-
Raises:
|
|
60
|
-
UsageError: If required parameter is missing
|
|
61
|
-
"""
|
|
62
|
-
missing = [p for p in required if p not in params]
|
|
63
|
-
if missing:
|
|
64
|
-
raise UsageError(f"Missing required parameters: {', '.join(missing)}")
|
|
65
|
-
|
|
66
|
-
def convert_type(
|
|
67
|
-
value: str,
|
|
68
|
-
type_: Type,
|
|
69
|
-
param_name: str
|
|
70
|
-
) -> Any:
|
|
71
|
-
"""
|
|
72
|
-
Convert string value to specified type.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
value: String value to convert
|
|
76
|
-
type_: Target type
|
|
77
|
-
param_name: Parameter name for error messages
|
|
78
|
-
|
|
79
|
-
Returns:
|
|
80
|
-
Converted value
|
|
81
|
-
|
|
82
|
-
Raises:
|
|
83
|
-
BadParameter: If conversion fails
|
|
84
|
-
"""
|
|
85
|
-
try:
|
|
86
|
-
if type_ == bool:
|
|
87
|
-
return value.lower() in ('true', 't', 'yes', 'y', '1')
|
|
88
|
-
return type_(value)
|
|
89
|
-
except (ValueError, TypeError):
|
|
90
|
-
raise BadParameter(
|
|
91
|
-
f"Invalid value for {param_name}: {value} (expected {type_.__name__})"
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
def validate_choice(
|
|
95
|
-
value: Any,
|
|
96
|
-
choices: List[Any],
|
|
97
|
-
param_name: str,
|
|
98
|
-
case_sensitive: bool = True
|
|
99
|
-
) -> None:
|
|
100
|
-
"""
|
|
101
|
-
Validate value is one of allowed choices.
|
|
102
|
-
|
|
103
|
-
Args:
|
|
104
|
-
value: Value to validate
|
|
105
|
-
choices: List of allowed choices
|
|
106
|
-
param_name: Parameter name for error messages
|
|
107
|
-
case_sensitive: Whether to do case-sensitive comparison
|
|
108
|
-
|
|
109
|
-
Raises:
|
|
110
|
-
BadParameter: If value not in choices
|
|
111
|
-
"""
|
|
112
|
-
if not case_sensitive and isinstance(value, str):
|
|
113
|
-
if value.lower() not in [str(c).lower() for c in choices]:
|
|
114
|
-
raise BadParameter(
|
|
115
|
-
f"Invalid choice for {param_name}: {value} "
|
|
116
|
-
f"(choose from {', '.join(str(c) for c in choices)})"
|
|
117
|
-
)
|
|
118
|
-
elif value not in choices:
|
|
119
|
-
raise BadParameter(
|
|
120
|
-
f"Invalid choice for {param_name}: {value} "
|
|
121
|
-
f"(choose from {', '.join(str(c) for c in choices)})"
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
def load_config_file(
|
|
125
|
-
path: Union[str, Path],
|
|
126
|
-
format: str = 'auto',
|
|
127
|
-
required: bool = True
|
|
128
|
-
) -> Dict[str, Any]:
|
|
129
|
-
"""
|
|
130
|
-
Load configuration from file.
|
|
131
|
-
|
|
132
|
-
Args:
|
|
133
|
-
path: Path to config file
|
|
134
|
-
format: File format (json, yaml, or auto)
|
|
135
|
-
required: Whether file is required
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
Configuration dictionary
|
|
139
|
-
|
|
140
|
-
Raises:
|
|
141
|
-
UsageError: If required file not found or invalid format
|
|
142
|
-
"""
|
|
143
|
-
path = Path(os.path.expanduser(path))
|
|
144
|
-
|
|
145
|
-
if not path.exists():
|
|
146
|
-
if required:
|
|
147
|
-
raise UsageError(f"Config file not found: {path}")
|
|
148
|
-
return {}
|
|
149
|
-
|
|
150
|
-
# Auto-detect format from extension
|
|
151
|
-
if format == 'auto':
|
|
152
|
-
format = path.suffix.lstrip('.').lower()
|
|
153
|
-
if format not in ('json', 'yaml', 'yml'):
|
|
154
|
-
raise UsageError(f"Unsupported config format: {format}")
|
|
155
|
-
|
|
156
|
-
try:
|
|
157
|
-
with open(path) as f:
|
|
158
|
-
if format == 'json':
|
|
159
|
-
return json.load(f)
|
|
160
|
-
elif format in ('yaml', 'yml'):
|
|
161
|
-
return yaml.safe_load(f)
|
|
162
|
-
else:
|
|
163
|
-
raise UsageError(f"Unsupported config format: {format}")
|
|
164
|
-
except Exception as e:
|
|
165
|
-
raise UsageError(f"Error loading config file: {str(e)}")
|
|
166
|
-
|
|
167
|
-
def parse_key_value(
|
|
168
|
-
value: str,
|
|
169
|
-
separator: str = '='
|
|
170
|
-
) -> tuple:
|
|
171
|
-
"""
|
|
172
|
-
Parse key-value string.
|
|
173
|
-
|
|
174
|
-
Args:
|
|
175
|
-
value: String in format "key=value"
|
|
176
|
-
separator: Key-value separator
|
|
177
|
-
|
|
178
|
-
Returns:
|
|
179
|
-
Tuple of (key, value)
|
|
180
|
-
|
|
181
|
-
Raises:
|
|
182
|
-
BadParameter: If string not in key=value format
|
|
183
|
-
"""
|
|
184
|
-
try:
|
|
185
|
-
key, value = value.split(separator, 1)
|
|
186
|
-
return key.strip(), value.strip()
|
|
187
|
-
except ValueError:
|
|
188
|
-
raise BadParameter(
|
|
189
|
-
f"Invalid key-value pair: {value} (expected format: key{separator}value)"
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
def parse_list(
|
|
193
|
-
value: str,
|
|
194
|
-
separator: str = ','
|
|
195
|
-
) -> List[str]:
|
|
196
|
-
"""
|
|
197
|
-
Parse comma-separated list.
|
|
198
|
-
|
|
199
|
-
Args:
|
|
200
|
-
value: Comma-separated string
|
|
201
|
-
separator: List item separator
|
|
202
|
-
|
|
203
|
-
Returns:
|
|
204
|
-
List of strings
|
|
205
|
-
"""
|
|
206
|
-
return [x.strip() for x in value.split(separator) if x.strip()]
|
|
207
|
-
|
|
208
|
-
def parse_dict(
|
|
209
|
-
value: str,
|
|
210
|
-
item_separator: str = ',',
|
|
211
|
-
key_value_separator: str = '='
|
|
212
|
-
) -> Dict[str, str]:
|
|
213
|
-
"""
|
|
214
|
-
Parse dictionary string.
|
|
215
|
-
|
|
216
|
-
Args:
|
|
217
|
-
value: String in format "key1=value1,key2=value2"
|
|
218
|
-
item_separator: Separator between items
|
|
219
|
-
key_value_separator: Separator between keys and values
|
|
220
|
-
|
|
221
|
-
Returns:
|
|
222
|
-
Dictionary of key-value pairs
|
|
223
|
-
|
|
224
|
-
Example:
|
|
225
|
-
>>> parse_dict("name=test,count=42")
|
|
226
|
-
{'name': 'test', 'count': '42'}
|
|
227
|
-
"""
|
|
228
|
-
result = {}
|
|
229
|
-
if not value:
|
|
230
|
-
return result
|
|
231
|
-
|
|
232
|
-
items = parse_list(value, item_separator)
|
|
233
|
-
for item in items:
|
|
234
|
-
key, value = parse_key_value(item, key_value_separator)
|
|
235
|
-
result[key] = value
|
|
236
|
-
|
|
237
|
-
return result
|
|
238
|
-
|
|
239
|
-
def get_env_var(
|
|
240
|
-
name: str,
|
|
241
|
-
type_: Type = str,
|
|
242
|
-
required: bool = False,
|
|
243
|
-
default: Any = None
|
|
244
|
-
) -> Any:
|
|
245
|
-
"""
|
|
246
|
-
Get and validate environment variable.
|
|
247
|
-
|
|
248
|
-
Args:
|
|
249
|
-
name: Environment variable name
|
|
250
|
-
type_: Expected type
|
|
251
|
-
required: Whether variable is required
|
|
252
|
-
default: Default value if not set
|
|
253
|
-
|
|
254
|
-
Returns:
|
|
255
|
-
Environment variable value
|
|
256
|
-
|
|
257
|
-
Raises:
|
|
258
|
-
UsageError: If required variable not set
|
|
259
|
-
"""
|
|
260
|
-
value = os.environ.get(name)
|
|
261
|
-
|
|
262
|
-
if value is None:
|
|
263
|
-
if required:
|
|
264
|
-
raise UsageError(f"Required environment variable not set: {name}")
|
|
265
|
-
return default
|
|
266
|
-
|
|
267
|
-
return convert_type(value, type_, name)
|
webscout/zeroart/__init__.py
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
ZeroArt: A zero-dependency ASCII art text generator
|
|
3
|
-
|
|
4
|
-
Create awesome ASCII art text without external dependencies!
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from .base import ZeroArtFont
|
|
8
|
-
from .fonts import BlockFont, SlantFont, NeonFont, CyberFont
|
|
9
|
-
from .effects import AsciiArtEffects
|
|
10
|
-
|
|
11
|
-
def figlet_format(text, font='block'):
|
|
12
|
-
"""
|
|
13
|
-
Generate ASCII art text
|
|
14
|
-
|
|
15
|
-
:param text: Text to convert
|
|
16
|
-
:param font: Font style (default: 'block')
|
|
17
|
-
:return: ASCII art representation of text
|
|
18
|
-
"""
|
|
19
|
-
font_map = {
|
|
20
|
-
'block': BlockFont(),
|
|
21
|
-
'slant': SlantFont(),
|
|
22
|
-
'neon': NeonFont(),
|
|
23
|
-
'cyber': CyberFont()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
selected_font = font_map.get(font.lower(), BlockFont())
|
|
27
|
-
return selected_font.render(text)
|
|
28
|
-
|
|
29
|
-
def print_figlet(text, font='block'):
|
|
30
|
-
"""
|
|
31
|
-
Print ASCII art text directly
|
|
32
|
-
|
|
33
|
-
:param text: Text to convert and print
|
|
34
|
-
:param font: Font style (default: 'block')
|
|
35
|
-
"""
|
|
36
|
-
print(figlet_format(text, font))
|
|
37
|
-
|
|
38
|
-
# Expose additional effects
|
|
39
|
-
rainbow = AsciiArtEffects.rainbow_effect
|
|
40
|
-
glitch = AsciiArtEffects.glitch_effect
|
|
41
|
-
wrap_text = AsciiArtEffects.wrap_text
|
|
42
|
-
outline = AsciiArtEffects.outline_effect
|
|
43
|
-
|
|
44
|
-
__all__ = [
|
|
45
|
-
'figlet_format',
|
|
46
|
-
'print_figlet',
|
|
47
|
-
'rainbow',
|
|
48
|
-
'glitch',
|
|
49
|
-
'wrap_text',
|
|
50
|
-
'outline',
|
|
51
|
-
'BlockFont',
|
|
52
|
-
'SlantFont',
|
|
53
|
-
'NeonFont',
|
|
54
|
-
'CyberFont'
|
|
55
|
-
]
|
webscout/zeroart/base.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
ZeroArt Base: Core classes and utilities for ASCII art generation
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
class ZeroArtFont:
|
|
6
|
-
"""Base class for ASCII art fonts"""
|
|
7
|
-
def __init__(self, name):
|
|
8
|
-
self.name = name
|
|
9
|
-
self.letters = {}
|
|
10
|
-
self.special_chars = {}
|
|
11
|
-
|
|
12
|
-
def add_letter(self, char, art_lines):
|
|
13
|
-
"""
|
|
14
|
-
Add a custom letter to the font
|
|
15
|
-
|
|
16
|
-
:param char: Character to add
|
|
17
|
-
:param art_lines: List of art lines representing the character
|
|
18
|
-
"""
|
|
19
|
-
self.letters[char.upper()] = art_lines
|
|
20
|
-
|
|
21
|
-
def add_special_char(self, name, art_lines):
|
|
22
|
-
"""
|
|
23
|
-
Add a special ASCII art character or design
|
|
24
|
-
|
|
25
|
-
:param name: Name of the special character
|
|
26
|
-
:param art_lines: List of art lines representing the character
|
|
27
|
-
"""
|
|
28
|
-
self.special_chars[name] = art_lines
|
|
29
|
-
|
|
30
|
-
def get_letter(self, char):
|
|
31
|
-
"""
|
|
32
|
-
Get ASCII art for a specific character
|
|
33
|
-
|
|
34
|
-
:param char: Character to retrieve
|
|
35
|
-
:return: List of art lines or default space
|
|
36
|
-
"""
|
|
37
|
-
return self.letters.get(char.upper(), self.letters.get(' ', [' ']))
|
|
38
|
-
|
|
39
|
-
def render(self, text):
|
|
40
|
-
if not text:
|
|
41
|
-
return ""
|
|
42
|
-
|
|
43
|
-
# Get the maximum height of any character in the font
|
|
44
|
-
max_height = max(len(self.get_letter(c)) for c in text)
|
|
45
|
-
|
|
46
|
-
# Initialize art_lines with empty strings
|
|
47
|
-
art_lines = ["" for _ in range(max_height)]
|
|
48
|
-
|
|
49
|
-
# Process each character
|
|
50
|
-
for char in text:
|
|
51
|
-
char_art = self.get_letter(char)
|
|
52
|
-
# Pad shorter characters with empty lines to match max_height
|
|
53
|
-
while len(char_art) < max_height:
|
|
54
|
-
char_art.append(" " * len(char_art[0]))
|
|
55
|
-
|
|
56
|
-
# Add character art to each line
|
|
57
|
-
for i in range(max_height):
|
|
58
|
-
art_lines[i] += char_art[i] + " "
|
|
59
|
-
|
|
60
|
-
return "\n".join(art_lines)
|
webscout/zeroart/effects.py
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
ZeroArt Effects: ASCII art text effects and transformations
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import random
|
|
6
|
-
import textwrap
|
|
7
|
-
|
|
8
|
-
class AsciiArtEffects:
|
|
9
|
-
"""Collection of ASCII art text effects"""
|
|
10
|
-
|
|
11
|
-
@staticmethod
|
|
12
|
-
def rainbow_effect(text, font):
|
|
13
|
-
"""
|
|
14
|
-
Apply a rainbow-like color effect to ASCII art
|
|
15
|
-
|
|
16
|
-
:param text: Text to render
|
|
17
|
-
:param font: Font to use
|
|
18
|
-
:return: Rainbow-styled ASCII art
|
|
19
|
-
"""
|
|
20
|
-
colors = [
|
|
21
|
-
'\033[91m', # Red
|
|
22
|
-
'\033[93m', # Yellow
|
|
23
|
-
'\033[92m', # Green
|
|
24
|
-
'\033[94m', # Blue
|
|
25
|
-
'\033[95m', # Magenta
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
art = font.render(text)
|
|
29
|
-
art_lines = art.split('\n')
|
|
30
|
-
|
|
31
|
-
colored_lines = []
|
|
32
|
-
for line in art_lines:
|
|
33
|
-
colored_line = ''
|
|
34
|
-
for char in line:
|
|
35
|
-
color = random.choice(colors)
|
|
36
|
-
colored_line += color + char
|
|
37
|
-
colored_lines.append(colored_line + '\033[0m') # Reset color
|
|
38
|
-
|
|
39
|
-
return '\n'.join(colored_lines)
|
|
40
|
-
|
|
41
|
-
@staticmethod
|
|
42
|
-
def glitch_effect(text, font, glitch_intensity=0.1):
|
|
43
|
-
"""
|
|
44
|
-
Apply a glitch-like distortion to ASCII art
|
|
45
|
-
|
|
46
|
-
:param text: Text to render
|
|
47
|
-
:param font: Font to use
|
|
48
|
-
:param glitch_intensity: Probability of character distortion
|
|
49
|
-
:return: Glitched ASCII art
|
|
50
|
-
"""
|
|
51
|
-
art = font.render(text)
|
|
52
|
-
art_lines = art.split('\n')
|
|
53
|
-
|
|
54
|
-
glitched_lines = []
|
|
55
|
-
glitch_chars = ['~', '^', '`', '¯', '±']
|
|
56
|
-
|
|
57
|
-
for line in art_lines:
|
|
58
|
-
glitched_line = ''
|
|
59
|
-
for char in line:
|
|
60
|
-
if random.random() < glitch_intensity:
|
|
61
|
-
glitched_line += random.choice(glitch_chars)
|
|
62
|
-
else:
|
|
63
|
-
glitched_line += char
|
|
64
|
-
glitched_lines.append(glitched_line)
|
|
65
|
-
|
|
66
|
-
return '\n'.join(glitched_lines)
|
|
67
|
-
|
|
68
|
-
@staticmethod
|
|
69
|
-
def wrap_text(text, width=20):
|
|
70
|
-
"""
|
|
71
|
-
Wrap ASCII art text to a specific width
|
|
72
|
-
|
|
73
|
-
:param text: Text to wrap
|
|
74
|
-
:param width: Maximum line width
|
|
75
|
-
:return: Wrapped text
|
|
76
|
-
"""
|
|
77
|
-
return textwrap.fill(text, width=width)
|
|
78
|
-
|
|
79
|
-
@staticmethod
|
|
80
|
-
def outline_effect(text, font, outline_char='*'):
|
|
81
|
-
"""
|
|
82
|
-
Add an outline effect to ASCII art
|
|
83
|
-
|
|
84
|
-
:param text: Text to render
|
|
85
|
-
:param font: Font to use
|
|
86
|
-
:param outline_char: Character to use for outline
|
|
87
|
-
:return: ASCII art with outline
|
|
88
|
-
"""
|
|
89
|
-
art = font.render(text)
|
|
90
|
-
art_lines = art.split('\n')
|
|
91
|
-
|
|
92
|
-
outlined_lines = []
|
|
93
|
-
for line in art_lines:
|
|
94
|
-
outlined_line = outline_char + line + outline_char
|
|
95
|
-
outlined_lines.append(outlined_line)
|
|
96
|
-
|
|
97
|
-
top_bottom_line = outline_char * (len(outlined_lines[0]))
|
|
98
|
-
|
|
99
|
-
return '\n'.join([top_bottom_line] + outlined_lines + [top_bottom_line])
|