webscout 8.2.9__py3-none-any.whl → 2026.1.19__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.
- webscout/AIauto.py +524 -251
- webscout/AIbase.py +247 -319
- webscout/AIutel.py +68 -703
- webscout/Bard.py +1072 -1026
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/__init__.py +20 -12
- webscout/Extra/GitToolkit/gitapi/gist.py +142 -0
- webscout/Extra/GitToolkit/gitapi/organization.py +91 -0
- webscout/Extra/GitToolkit/gitapi/repository.py +308 -195
- webscout/Extra/GitToolkit/gitapi/search.py +162 -0
- webscout/Extra/GitToolkit/gitapi/trending.py +236 -0
- webscout/Extra/GitToolkit/gitapi/user.py +128 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +82 -62
- webscout/Extra/YTToolkit/README.md +443 -375
- webscout/Extra/YTToolkit/YTdownloader.py +953 -957
- webscout/Extra/YTToolkit/__init__.py +3 -3
- webscout/Extra/YTToolkit/transcriber.py +595 -476
- webscout/Extra/YTToolkit/ytapi/README.md +230 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +22 -6
- webscout/Extra/YTToolkit/ytapi/captions.py +190 -0
- webscout/Extra/YTToolkit/ytapi/channel.py +302 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +178 -118
- webscout/Extra/YTToolkit/ytapi/hashtag.py +120 -0
- webscout/Extra/YTToolkit/ytapi/https.py +89 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +59 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +8 -8
- webscout/Extra/YTToolkit/ytapi/query.py +143 -40
- webscout/Extra/YTToolkit/ytapi/shorts.py +122 -0
- webscout/Extra/YTToolkit/ytapi/stream.py +68 -63
- webscout/Extra/YTToolkit/ytapi/suggestions.py +97 -0
- webscout/Extra/YTToolkit/ytapi/utils.py +66 -62
- webscout/Extra/YTToolkit/ytapi/video.py +403 -232
- webscout/Extra/__init__.py +2 -3
- webscout/Extra/gguf.py +1298 -684
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +28 -28
- webscout/Extra/tempmail/async_utils.py +143 -141
- webscout/Extra/tempmail/base.py +172 -161
- webscout/Extra/tempmail/cli.py +191 -187
- webscout/Extra/tempmail/emailnator.py +88 -84
- webscout/Extra/tempmail/mail_tm.py +378 -361
- webscout/Extra/tempmail/temp_mail_io.py +304 -292
- webscout/Extra/weather.py +196 -194
- webscout/Extra/weather_ascii.py +17 -15
- webscout/Provider/AISEARCH/PERPLEXED_search.py +175 -0
- webscout/Provider/AISEARCH/Perplexity.py +292 -333
- webscout/Provider/AISEARCH/README.md +106 -279
- webscout/Provider/AISEARCH/__init__.py +16 -9
- webscout/Provider/AISEARCH/brave_search.py +298 -0
- webscout/Provider/AISEARCH/iask_search.py +357 -410
- webscout/Provider/AISEARCH/monica_search.py +200 -220
- webscout/Provider/AISEARCH/webpilotai_search.py +242 -255
- webscout/Provider/Algion.py +413 -0
- webscout/Provider/Andi.py +74 -69
- webscout/Provider/Apriel.py +313 -0
- webscout/Provider/Ayle.py +323 -0
- webscout/Provider/ChatSandbox.py +329 -342
- webscout/Provider/ClaudeOnline.py +365 -0
- webscout/Provider/Cohere.py +232 -208
- webscout/Provider/DeepAI.py +367 -0
- webscout/Provider/Deepinfra.py +467 -340
- webscout/Provider/EssentialAI.py +217 -0
- webscout/Provider/ExaAI.py +274 -261
- webscout/Provider/Gemini.py +175 -169
- webscout/Provider/GithubChat.py +385 -369
- webscout/Provider/Gradient.py +286 -0
- webscout/Provider/Groq.py +556 -801
- webscout/Provider/HadadXYZ.py +323 -0
- webscout/Provider/HeckAI.py +392 -375
- webscout/Provider/HuggingFace.py +387 -0
- webscout/Provider/IBM.py +340 -0
- webscout/Provider/Jadve.py +317 -291
- webscout/Provider/K2Think.py +306 -0
- webscout/Provider/Koboldai.py +221 -384
- webscout/Provider/Netwrck.py +273 -270
- webscout/Provider/Nvidia.py +310 -0
- webscout/Provider/OPENAI/DeepAI.py +489 -0
- webscout/Provider/OPENAI/K2Think.py +423 -0
- webscout/Provider/OPENAI/PI.py +463 -0
- webscout/Provider/OPENAI/README.md +890 -952
- webscout/Provider/OPENAI/TogetherAI.py +405 -0
- webscout/Provider/OPENAI/TwoAI.py +255 -357
- webscout/Provider/OPENAI/__init__.py +148 -40
- webscout/Provider/OPENAI/ai4chat.py +348 -293
- webscout/Provider/OPENAI/akashgpt.py +436 -0
- webscout/Provider/OPENAI/algion.py +303 -0
- webscout/Provider/OPENAI/{exachat.py → ayle.py} +365 -444
- webscout/Provider/OPENAI/base.py +253 -249
- webscout/Provider/OPENAI/cerebras.py +296 -0
- webscout/Provider/OPENAI/chatgpt.py +870 -556
- webscout/Provider/OPENAI/chatsandbox.py +233 -173
- webscout/Provider/OPENAI/deepinfra.py +403 -322
- webscout/Provider/OPENAI/e2b.py +2370 -1414
- webscout/Provider/OPENAI/elmo.py +278 -0
- webscout/Provider/OPENAI/exaai.py +452 -417
- webscout/Provider/OPENAI/freeassist.py +446 -0
- webscout/Provider/OPENAI/gradient.py +448 -0
- webscout/Provider/OPENAI/groq.py +380 -364
- webscout/Provider/OPENAI/hadadxyz.py +292 -0
- webscout/Provider/OPENAI/heckai.py +333 -308
- webscout/Provider/OPENAI/huggingface.py +321 -0
- webscout/Provider/OPENAI/ibm.py +425 -0
- webscout/Provider/OPENAI/llmchat.py +253 -0
- webscout/Provider/OPENAI/llmchatco.py +378 -335
- webscout/Provider/OPENAI/meta.py +541 -0
- webscout/Provider/OPENAI/netwrck.py +374 -357
- webscout/Provider/OPENAI/nvidia.py +317 -0
- webscout/Provider/OPENAI/oivscode.py +348 -287
- webscout/Provider/OPENAI/openrouter.py +328 -0
- webscout/Provider/OPENAI/pydantic_imports.py +1 -172
- webscout/Provider/OPENAI/sambanova.py +397 -0
- webscout/Provider/OPENAI/sonus.py +305 -304
- webscout/Provider/OPENAI/textpollinations.py +370 -339
- webscout/Provider/OPENAI/toolbaz.py +375 -413
- webscout/Provider/OPENAI/typefully.py +419 -355
- webscout/Provider/OPENAI/typliai.py +279 -0
- webscout/Provider/OPENAI/utils.py +314 -318
- webscout/Provider/OPENAI/wisecat.py +359 -387
- webscout/Provider/OPENAI/writecream.py +185 -163
- webscout/Provider/OPENAI/x0gpt.py +462 -365
- webscout/Provider/OPENAI/zenmux.py +380 -0
- webscout/Provider/OpenRouter.py +386 -0
- webscout/Provider/Openai.py +337 -496
- webscout/Provider/PI.py +443 -429
- webscout/Provider/QwenLM.py +346 -254
- webscout/Provider/STT/__init__.py +28 -0
- webscout/Provider/STT/base.py +303 -0
- webscout/Provider/STT/elevenlabs.py +264 -0
- webscout/Provider/Sambanova.py +317 -0
- webscout/Provider/TTI/README.md +69 -82
- webscout/Provider/TTI/__init__.py +37 -7
- webscout/Provider/TTI/base.py +147 -64
- webscout/Provider/TTI/claudeonline.py +393 -0
- webscout/Provider/TTI/magicstudio.py +292 -201
- webscout/Provider/TTI/miragic.py +180 -0
- webscout/Provider/TTI/pollinations.py +331 -221
- webscout/Provider/TTI/together.py +334 -0
- webscout/Provider/TTI/utils.py +14 -11
- webscout/Provider/TTS/README.md +186 -192
- webscout/Provider/TTS/__init__.py +43 -10
- webscout/Provider/TTS/base.py +523 -159
- webscout/Provider/TTS/deepgram.py +286 -156
- webscout/Provider/TTS/elevenlabs.py +189 -111
- webscout/Provider/TTS/freetts.py +218 -0
- webscout/Provider/TTS/murfai.py +288 -113
- webscout/Provider/TTS/openai_fm.py +364 -129
- webscout/Provider/TTS/parler.py +203 -111
- webscout/Provider/TTS/qwen.py +334 -0
- webscout/Provider/TTS/sherpa.py +286 -0
- webscout/Provider/TTS/speechma.py +693 -580
- webscout/Provider/TTS/streamElements.py +275 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TextPollinationsAI.py +331 -308
- webscout/Provider/TogetherAI.py +450 -0
- webscout/Provider/TwoAI.py +309 -475
- webscout/Provider/TypliAI.py +311 -305
- webscout/Provider/UNFINISHED/ChatHub.py +219 -209
- webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +331 -326
- webscout/Provider/{GizAI.py → UNFINISHED/GizAI.py} +300 -295
- webscout/Provider/{Marcus.py → UNFINISHED/Marcus.py} +218 -198
- webscout/Provider/UNFINISHED/Qodo.py +481 -0
- webscout/Provider/{MCPCore.py → UNFINISHED/XenAI.py} +330 -315
- webscout/Provider/UNFINISHED/Youchat.py +347 -330
- webscout/Provider/UNFINISHED/aihumanizer.py +41 -0
- webscout/Provider/UNFINISHED/grammerchecker.py +37 -0
- webscout/Provider/UNFINISHED/liner.py +342 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +246 -263
- webscout/Provider/{samurai.py → UNFINISHED/samurai.py} +231 -224
- webscout/Provider/WiseCat.py +256 -233
- webscout/Provider/WrDoChat.py +390 -370
- webscout/Provider/__init__.py +115 -174
- webscout/Provider/ai4chat.py +181 -174
- webscout/Provider/akashgpt.py +330 -335
- webscout/Provider/cerebras.py +397 -290
- webscout/Provider/cleeai.py +236 -213
- webscout/Provider/elmo.py +291 -283
- webscout/Provider/geminiapi.py +343 -208
- webscout/Provider/julius.py +245 -223
- webscout/Provider/learnfastai.py +333 -325
- webscout/Provider/llama3mitril.py +230 -215
- webscout/Provider/llmchat.py +308 -258
- webscout/Provider/llmchatco.py +321 -306
- webscout/Provider/meta.py +996 -801
- webscout/Provider/oivscode.py +332 -309
- webscout/Provider/searchchat.py +316 -292
- webscout/Provider/sonus.py +264 -258
- webscout/Provider/toolbaz.py +359 -353
- webscout/Provider/turboseek.py +332 -266
- webscout/Provider/typefully.py +262 -202
- webscout/Provider/x0gpt.py +332 -299
- webscout/__init__.py +31 -39
- webscout/__main__.py +5 -5
- webscout/cli.py +585 -524
- webscout/client.py +1497 -70
- webscout/conversation.py +140 -436
- webscout/exceptions.py +383 -362
- webscout/litagent/__init__.py +29 -29
- webscout/litagent/agent.py +492 -455
- webscout/litagent/constants.py +60 -60
- webscout/models.py +505 -181
- webscout/optimizers.py +74 -420
- webscout/prompt_manager.py +376 -288
- webscout/sanitize.py +1514 -0
- webscout/scout/README.md +452 -404
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +7 -7
- webscout/scout/core/crawler.py +330 -210
- webscout/scout/core/scout.py +800 -607
- webscout/scout/core/search_result.py +51 -96
- webscout/scout/core/text_analyzer.py +64 -63
- webscout/scout/core/text_utils.py +412 -277
- webscout/scout/core/web_analyzer.py +54 -52
- webscout/scout/element.py +872 -478
- webscout/scout/parsers/__init__.py +70 -69
- webscout/scout/parsers/html5lib_parser.py +182 -172
- webscout/scout/parsers/html_parser.py +238 -236
- webscout/scout/parsers/lxml_parser.py +203 -178
- webscout/scout/utils.py +38 -37
- webscout/search/__init__.py +47 -0
- webscout/search/base.py +201 -0
- webscout/search/bing_main.py +45 -0
- webscout/search/brave_main.py +92 -0
- webscout/search/duckduckgo_main.py +57 -0
- webscout/search/engines/__init__.py +127 -0
- webscout/search/engines/bing/__init__.py +15 -0
- webscout/search/engines/bing/base.py +35 -0
- webscout/search/engines/bing/images.py +114 -0
- webscout/search/engines/bing/news.py +96 -0
- webscout/search/engines/bing/suggestions.py +36 -0
- webscout/search/engines/bing/text.py +109 -0
- webscout/search/engines/brave/__init__.py +19 -0
- webscout/search/engines/brave/base.py +47 -0
- webscout/search/engines/brave/images.py +213 -0
- webscout/search/engines/brave/news.py +353 -0
- webscout/search/engines/brave/suggestions.py +318 -0
- webscout/search/engines/brave/text.py +167 -0
- webscout/search/engines/brave/videos.py +364 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +80 -0
- webscout/search/engines/duckduckgo/base.py +189 -0
- webscout/search/engines/duckduckgo/images.py +100 -0
- webscout/search/engines/duckduckgo/maps.py +183 -0
- webscout/search/engines/duckduckgo/news.py +70 -0
- webscout/search/engines/duckduckgo/suggestions.py +22 -0
- webscout/search/engines/duckduckgo/text.py +221 -0
- webscout/search/engines/duckduckgo/translate.py +48 -0
- webscout/search/engines/duckduckgo/videos.py +80 -0
- webscout/search/engines/duckduckgo/weather.py +84 -0
- webscout/search/engines/mojeek.py +61 -0
- webscout/search/engines/wikipedia.py +77 -0
- webscout/search/engines/yahoo/__init__.py +41 -0
- webscout/search/engines/yahoo/answers.py +19 -0
- webscout/search/engines/yahoo/base.py +34 -0
- webscout/search/engines/yahoo/images.py +323 -0
- webscout/search/engines/yahoo/maps.py +19 -0
- webscout/search/engines/yahoo/news.py +258 -0
- webscout/search/engines/yahoo/suggestions.py +140 -0
- webscout/search/engines/yahoo/text.py +273 -0
- webscout/search/engines/yahoo/translate.py +19 -0
- webscout/search/engines/yahoo/videos.py +302 -0
- webscout/search/engines/yahoo/weather.py +220 -0
- webscout/search/engines/yandex.py +67 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +34 -0
- webscout/search/engines/yep/images.py +101 -0
- webscout/search/engines/yep/suggestions.py +38 -0
- webscout/search/engines/yep/text.py +99 -0
- webscout/search/http_client.py +172 -0
- webscout/search/results.py +141 -0
- webscout/search/yahoo_main.py +57 -0
- webscout/search/yep_main.py +48 -0
- webscout/server/__init__.py +48 -0
- webscout/server/config.py +78 -0
- webscout/server/exceptions.py +69 -0
- webscout/server/providers.py +286 -0
- webscout/server/request_models.py +131 -0
- webscout/server/request_processing.py +404 -0
- webscout/server/routes.py +642 -0
- webscout/server/server.py +351 -0
- webscout/server/ui_templates.py +1171 -0
- webscout/swiftcli/__init__.py +79 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +574 -297
- webscout/swiftcli/core/context.py +98 -104
- webscout/swiftcli/core/group.py +268 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +243 -221
- webscout/swiftcli/decorators/options.py +247 -220
- webscout/swiftcli/decorators/output.py +392 -252
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +134 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +58 -59
- webscout/swiftcli/utils/formatting.py +251 -252
- webscout/swiftcli/utils/parsing.py +368 -267
- webscout/update_checker.py +280 -136
- webscout/utils.py +28 -14
- webscout/version.py +2 -1
- webscout/version.py.bak +3 -0
- webscout/zeroart/__init__.py +218 -135
- webscout/zeroart/base.py +70 -66
- webscout/zeroart/effects.py +155 -101
- webscout/zeroart/fonts.py +1799 -1239
- webscout-2026.1.19.dist-info/METADATA +638 -0
- webscout-2026.1.19.dist-info/RECORD +312 -0
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/entry_points.txt +1 -1
- webscout/DWEBS.py +0 -520
- webscout/Extra/Act.md +0 -309
- webscout/Extra/GitToolkit/gitapi/README.md +0 -110
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/Extra/gguf.md +0 -430
- webscout/Extra/weather.md +0 -281
- webscout/Litlogger/README.md +0 -10
- webscout/Litlogger/__init__.py +0 -15
- webscout/Litlogger/formats.py +0 -4
- webscout/Litlogger/handlers.py +0 -103
- webscout/Litlogger/levels.py +0 -13
- webscout/Litlogger/logger.py +0 -92
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/AISEARCH/felo_search.py +0 -202
- webscout/Provider/AISEARCH/genspark_search.py +0 -324
- webscout/Provider/AISEARCH/hika_search.py +0 -186
- webscout/Provider/AISEARCH/scira_search.py +0 -298
- webscout/Provider/Aitopia.py +0 -316
- webscout/Provider/AllenAI.py +0 -440
- webscout/Provider/Blackboxai.py +0 -791
- webscout/Provider/ChatGPTClone.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Cloudflare.py +0 -324
- webscout/Provider/ExaChat.py +0 -358
- webscout/Provider/Flowith.py +0 -217
- webscout/Provider/FreeGemini.py +0 -250
- webscout/Provider/Glider.py +0 -225
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HuggingFaceChat.py +0 -469
- webscout/Provider/Hunyuan.py +0 -283
- webscout/Provider/LambdaChat.py +0 -411
- webscout/Provider/Llama3.py +0 -259
- webscout/Provider/Nemotron.py +0 -218
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/BLACKBOXAI.py +0 -766
- webscout/Provider/OPENAI/Cloudflare.py +0 -378
- webscout/Provider/OPENAI/FreeGemini.py +0 -283
- webscout/Provider/OPENAI/NEMOTRON.py +0 -232
- webscout/Provider/OPENAI/Qwen3.py +0 -283
- webscout/Provider/OPENAI/api.py +0 -969
- webscout/Provider/OPENAI/c4ai.py +0 -373
- webscout/Provider/OPENAI/chatgptclone.py +0 -494
- webscout/Provider/OPENAI/copilot.py +0 -242
- webscout/Provider/OPENAI/flowith.py +0 -162
- webscout/Provider/OPENAI/freeaichat.py +0 -359
- webscout/Provider/OPENAI/mcpcore.py +0 -389
- webscout/Provider/OPENAI/multichat.py +0 -376
- webscout/Provider/OPENAI/opkfc.py +0 -496
- webscout/Provider/OPENAI/scirachat.py +0 -477
- webscout/Provider/OPENAI/standardinput.py +0 -433
- webscout/Provider/OPENAI/typegpt.py +0 -364
- webscout/Provider/OPENAI/uncovrAI.py +0 -463
- webscout/Provider/OPENAI/venice.py +0 -431
- webscout/Provider/OPENAI/yep.py +0 -382
- webscout/Provider/OpenGPT.py +0 -209
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -290
- webscout/Provider/TTI/aiarta.py +0 -365
- webscout/Provider/TTI/artbit.py +0 -0
- webscout/Provider/TTI/fastflux.py +0 -200
- webscout/Provider/TTI/piclumen.py +0 -203
- webscout/Provider/TTI/pixelmuse.py +0 -225
- webscout/Provider/TTS/gesserit.py +0 -128
- webscout/Provider/TTS/sthir.py +0 -94
- webscout/Provider/TeachAnything.py +0 -229
- webscout/Provider/UNFINISHED/puterjs.py +0 -635
- webscout/Provider/UNFINISHED/test_lmarena.py +0 -119
- webscout/Provider/Venice.py +0 -258
- webscout/Provider/VercelAI.py +0 -253
- webscout/Provider/Writecream.py +0 -246
- webscout/Provider/WritingMate.py +0 -269
- webscout/Provider/asksteve.py +0 -220
- webscout/Provider/chatglm.py +0 -215
- webscout/Provider/copilot.py +0 -425
- webscout/Provider/freeaichat.py +0 -285
- webscout/Provider/granite.py +0 -235
- webscout/Provider/hermes.py +0 -266
- webscout/Provider/koala.py +0 -170
- webscout/Provider/lmarena.py +0 -198
- webscout/Provider/multichat.py +0 -364
- webscout/Provider/scira_chat.py +0 -299
- webscout/Provider/scnet.py +0 -243
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/typegpt.py +0 -289
- webscout/Provider/uncovr.py +0 -368
- webscout/Provider/yep.py +0 -389
- webscout/litagent/Readme.md +0 -276
- webscout/litprinter/__init__.py +0 -59
- webscout/swiftcli/Readme.md +0 -323
- webscout/tempid.py +0 -128
- webscout/webscout_search.py +0 -1184
- webscout/webscout_search_async.py +0 -654
- webscout/yep_search.py +0 -347
- webscout/zeroart/README.md +0 -89
- webscout-8.2.9.dist-info/METADATA +0 -1033
- webscout-8.2.9.dist-info/RECORD +0 -289
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/top_level.txt +0 -0
|
@@ -1,195 +1,308 @@
|
|
|
1
|
-
from typing import
|
|
2
|
-
from .
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
""
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"""
|
|
40
|
-
url = f"{self.base_url}/commits
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"""
|
|
87
|
-
url = f"{self.base_url}/issues
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return request(url)
|
|
156
|
-
|
|
157
|
-
def
|
|
158
|
-
"""Get
|
|
159
|
-
url = f"{self.base_url}/
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
1
|
+
from typing import Any, Dict, List, Optional, Union, cast
|
|
2
|
+
from urllib.parse import quote
|
|
3
|
+
|
|
4
|
+
from .utils import request
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Repository:
|
|
8
|
+
"""Class for interacting with GitHub repositories"""
|
|
9
|
+
|
|
10
|
+
def __init__(self, owner: str, repo: str):
|
|
11
|
+
"""
|
|
12
|
+
Initialize repository client
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
owner: Repository owner
|
|
16
|
+
repo: Repository name
|
|
17
|
+
"""
|
|
18
|
+
if not owner or not repo:
|
|
19
|
+
raise ValueError("Owner and repository name are required")
|
|
20
|
+
if not isinstance(owner, str) or not isinstance(repo, str):
|
|
21
|
+
raise ValueError("Owner and repository name must be strings")
|
|
22
|
+
|
|
23
|
+
self.owner = owner.strip()
|
|
24
|
+
self.repo = repo.strip()
|
|
25
|
+
self.base_url = f"https://api.github.com/repos/{self.owner}/{self.repo}"
|
|
26
|
+
|
|
27
|
+
def get_info(self) -> Dict[str, Any]:
|
|
28
|
+
"""Get basic repository information"""
|
|
29
|
+
return request(self.base_url)
|
|
30
|
+
|
|
31
|
+
def get_commits(self, page: int = 1, per_page: int = 30, sha: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
32
|
+
"""
|
|
33
|
+
Get repository commits
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
page: Page number
|
|
37
|
+
per_page: Items per page
|
|
38
|
+
sha: SHA or branch name to start listing commits from
|
|
39
|
+
"""
|
|
40
|
+
url = f"{self.base_url}/commits?page={page}&per_page={per_page}"
|
|
41
|
+
if sha:
|
|
42
|
+
url += f"&sha={quote(sha, safe='')}"
|
|
43
|
+
return request(url)
|
|
44
|
+
|
|
45
|
+
def get_commit(self, sha: str) -> Dict[str, Any]:
|
|
46
|
+
"""Get a specific commit details"""
|
|
47
|
+
url = f"{self.base_url}/commits/{quote(sha, safe='')}"
|
|
48
|
+
return request(url)
|
|
49
|
+
|
|
50
|
+
def get_pull_requests(self, state: str = "all", page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
51
|
+
"""
|
|
52
|
+
Get repository pull requests
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
state: State of PRs to return (open/closed/all)
|
|
56
|
+
page: Page number
|
|
57
|
+
per_page: Items per page
|
|
58
|
+
"""
|
|
59
|
+
url = f"{self.base_url}/pulls?state={state}&page={page}&per_page={per_page}"
|
|
60
|
+
return request(url)
|
|
61
|
+
|
|
62
|
+
def get_pull_request(self, pr_number: int) -> Dict[str, Any]:
|
|
63
|
+
"""Get specific pull request details"""
|
|
64
|
+
url = f"{self.base_url}/pulls/{pr_number}"
|
|
65
|
+
return request(url)
|
|
66
|
+
|
|
67
|
+
def get_pull_request_commits(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
68
|
+
"""Get commits in a specific pull request"""
|
|
69
|
+
url = f"{self.base_url}/pulls/{pr_number}/commits"
|
|
70
|
+
return request(url)
|
|
71
|
+
|
|
72
|
+
def get_pull_request_files(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
73
|
+
"""Get files changed in a specific pull request"""
|
|
74
|
+
url = f"{self.base_url}/pulls/{pr_number}/files"
|
|
75
|
+
return request(url)
|
|
76
|
+
|
|
77
|
+
def get_issues(self, state: str = "all", page: int = 1, per_page: int = 30, labels: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
78
|
+
"""
|
|
79
|
+
Get repository issues
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
state: State of issues to return (open/closed/all)
|
|
83
|
+
page: Page number
|
|
84
|
+
per_page: Items per page
|
|
85
|
+
labels: Comma-separated list of label names
|
|
86
|
+
"""
|
|
87
|
+
url = f"{self.base_url}/issues?state={state}&page={page}&per_page={per_page}"
|
|
88
|
+
if labels:
|
|
89
|
+
url += f"&labels={quote(labels, safe='')}"
|
|
90
|
+
return request(url)
|
|
91
|
+
|
|
92
|
+
def get_issue(self, issue_number: int) -> Dict[str, Any]:
|
|
93
|
+
"""Get specific issue details"""
|
|
94
|
+
url = f"{self.base_url}/issues/{issue_number}"
|
|
95
|
+
return request(url)
|
|
96
|
+
|
|
97
|
+
def get_issue_comments(self, issue_number: int) -> List[Dict[str, Any]]:
|
|
98
|
+
"""Get comments on a specific issue"""
|
|
99
|
+
url = f"{self.base_url}/issues/{issue_number}/comments"
|
|
100
|
+
return request(url)
|
|
101
|
+
|
|
102
|
+
def get_labels(self) -> List[Dict[str, Any]]:
|
|
103
|
+
"""Get repository labels"""
|
|
104
|
+
url = f"{self.base_url}/labels"
|
|
105
|
+
return request(url)
|
|
106
|
+
|
|
107
|
+
def get_milestones(self, state: str = "all") -> List[Dict[str, Any]]:
|
|
108
|
+
"""Get repository milestones"""
|
|
109
|
+
url = f"{self.base_url}/milestones?state={state}"
|
|
110
|
+
return request(url)
|
|
111
|
+
|
|
112
|
+
def get_contributors(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
113
|
+
"""Get repository contributors"""
|
|
114
|
+
url = f"{self.base_url}/contributors?page={page}&per_page={per_page}"
|
|
115
|
+
return request(url)
|
|
116
|
+
|
|
117
|
+
def get_languages(self) -> Dict[str, int]:
|
|
118
|
+
"""Get repository language breakdown"""
|
|
119
|
+
url = f"{self.base_url}/languages"
|
|
120
|
+
return request(url)
|
|
121
|
+
|
|
122
|
+
def get_teams(self) -> List[Dict[str, Any]]:
|
|
123
|
+
"""Get teams with access to repository"""
|
|
124
|
+
url = f"{self.base_url}/teams"
|
|
125
|
+
return request(url)
|
|
126
|
+
|
|
127
|
+
def get_tags(self) -> List[Dict[str, Any]]:
|
|
128
|
+
"""Get repository tags"""
|
|
129
|
+
url = f"{self.base_url}/tags"
|
|
130
|
+
return request(url)
|
|
131
|
+
|
|
132
|
+
def get_releases(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
133
|
+
"""Get repository releases"""
|
|
134
|
+
url = f"{self.base_url}/releases?page={page}&per_page={per_page}"
|
|
135
|
+
return request(url)
|
|
136
|
+
|
|
137
|
+
def get_release(self, release_id: str) -> Dict[str, Any]:
|
|
138
|
+
"""Get specific release details"""
|
|
139
|
+
url = f"{self.base_url}/releases/{release_id}"
|
|
140
|
+
return request(url)
|
|
141
|
+
|
|
142
|
+
def get_latest_release(self) -> Dict[str, Any]:
|
|
143
|
+
"""Get latest release"""
|
|
144
|
+
url = f"{self.base_url}/releases/latest"
|
|
145
|
+
return cast(Dict[str, Any], request(url))
|
|
146
|
+
|
|
147
|
+
def get_branches(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
148
|
+
"""Get repository branches"""
|
|
149
|
+
url = f"{self.base_url}/branches?page={page}&per_page={per_page}"
|
|
150
|
+
return request(url)
|
|
151
|
+
|
|
152
|
+
def get_branch(self, branch: str) -> Dict[str, Any]:
|
|
153
|
+
"""Get specific branch details"""
|
|
154
|
+
url = f"{self.base_url}/branches/{quote(branch, safe='')}"
|
|
155
|
+
return request(url)
|
|
156
|
+
|
|
157
|
+
def get_contents(self, path: str = "", ref: Optional[str] = None) -> Dict[str, Any]:
|
|
158
|
+
"""Get contents of file or directory"""
|
|
159
|
+
url = f"{self.base_url}/contents/{quote(path)}"
|
|
160
|
+
if ref:
|
|
161
|
+
url += f"?ref={quote(ref, safe='')}"
|
|
162
|
+
return request(url)
|
|
163
|
+
|
|
164
|
+
def get_collaborators(self) -> List[Dict[str, Any]]:
|
|
165
|
+
"""Get repository collaborators"""
|
|
166
|
+
url = f"{self.base_url}/collaborators"
|
|
167
|
+
return request(url)
|
|
168
|
+
|
|
169
|
+
def get_workflows(self) -> List[Dict[str, Any]]:
|
|
170
|
+
"""Get repository GitHub Actions workflows"""
|
|
171
|
+
url = f"{self.base_url}/actions/workflows"
|
|
172
|
+
return request(url)
|
|
173
|
+
|
|
174
|
+
def get_workflow_runs(self, workflow_id: str) -> List[Dict[str, Any]]:
|
|
175
|
+
"""Get workflow runs for a specific workflow"""
|
|
176
|
+
url = f"{self.base_url}/actions/workflows/{workflow_id}/runs"
|
|
177
|
+
return request(url)
|
|
178
|
+
|
|
179
|
+
def get_deployments(self) -> List[Dict[str, Any]]:
|
|
180
|
+
"""Get repository deployments"""
|
|
181
|
+
url = f"{self.base_url}/deployments"
|
|
182
|
+
return request(url)
|
|
183
|
+
|
|
184
|
+
def get_traffic(self) -> Dict[str, Any]:
|
|
185
|
+
"""Get repository traffic data"""
|
|
186
|
+
url = f"{self.base_url}/traffic/views"
|
|
187
|
+
return request(url)
|
|
188
|
+
|
|
189
|
+
def get_code_frequency(self) -> List[List[int]]:
|
|
190
|
+
"""Get weekly commit activity"""
|
|
191
|
+
url = f"{self.base_url}/stats/code_frequency"
|
|
192
|
+
return request(url)
|
|
193
|
+
|
|
194
|
+
def get_commit_activity(self) -> List[Dict[str, Any]]:
|
|
195
|
+
"""Get last year of commit activity"""
|
|
196
|
+
url = f"{self.base_url}/stats/commit_activity"
|
|
197
|
+
return request(url)
|
|
198
|
+
|
|
199
|
+
def get_community_profile(self) -> Dict[str, Any]:
|
|
200
|
+
"""Get community profile metrics"""
|
|
201
|
+
url = f"{self.base_url}/community/profile"
|
|
202
|
+
return request(url)
|
|
203
|
+
|
|
204
|
+
def get_readme(self, ref: Optional[str] = None) -> Dict[str, Any]:
|
|
205
|
+
"""
|
|
206
|
+
Get repository README.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
ref: The name of the commit/branch/tag (default: repo default branch)
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
README content with encoding and download_url
|
|
213
|
+
"""
|
|
214
|
+
url = f"{self.base_url}/readme"
|
|
215
|
+
if ref:
|
|
216
|
+
url += f"?ref={quote(ref, safe='')}"
|
|
217
|
+
return request(url)
|
|
218
|
+
|
|
219
|
+
def get_license(self) -> Dict[str, Any]:
|
|
220
|
+
"""
|
|
221
|
+
Get repository license.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
License information including name, key, spdx_id, and content
|
|
225
|
+
"""
|
|
226
|
+
url = f"{self.base_url}/license"
|
|
227
|
+
return request(url)
|
|
228
|
+
|
|
229
|
+
def get_topics(self) -> Dict[str, Any]:
|
|
230
|
+
"""
|
|
231
|
+
Get repository topics.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Dict with 'names' key containing list of topic strings
|
|
235
|
+
"""
|
|
236
|
+
url = f"{self.base_url}/topics"
|
|
237
|
+
return request(url)
|
|
238
|
+
|
|
239
|
+
def get_forks(self, sort: str = "newest", page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
240
|
+
"""
|
|
241
|
+
List repository forks.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
sort: Sort by (newest, oldest, stargazers, watchers)
|
|
245
|
+
page: Page number
|
|
246
|
+
per_page: Results per page (max 100)
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
List of forked repositories
|
|
250
|
+
"""
|
|
251
|
+
url = f"{self.base_url}/forks?sort={sort}&page={page}&per_page={per_page}"
|
|
252
|
+
return request(url)
|
|
253
|
+
|
|
254
|
+
def get_stargazers(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
255
|
+
"""
|
|
256
|
+
List users who have starred the repository.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
page: Page number
|
|
260
|
+
per_page: Results per page (max 100)
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
List of users who starred the repo
|
|
264
|
+
"""
|
|
265
|
+
url = f"{self.base_url}/stargazers?page={page}&per_page={per_page}"
|
|
266
|
+
return request(url)
|
|
267
|
+
|
|
268
|
+
def get_watchers(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
269
|
+
"""
|
|
270
|
+
List users watching the repository (subscribers).
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
page: Page number
|
|
274
|
+
per_page: Results per page (max 100)
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
List of users watching the repo
|
|
278
|
+
"""
|
|
279
|
+
url = f"{self.base_url}/subscribers?page={page}&per_page={per_page}"
|
|
280
|
+
return request(url)
|
|
281
|
+
|
|
282
|
+
def compare(self, base: str, head: str) -> Dict[str, Any]:
|
|
283
|
+
"""
|
|
284
|
+
Compare two commits, branches, or tags.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
base: Base commit/branch/tag
|
|
288
|
+
head: Head commit/branch/tag
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
Comparison data including commits, files, and diff stats
|
|
292
|
+
"""
|
|
293
|
+
url = f"{self.base_url}/compare/{quote(base, safe='')}...{quote(head, safe='')}"
|
|
294
|
+
return request(url)
|
|
295
|
+
|
|
296
|
+
def get_events(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
297
|
+
"""
|
|
298
|
+
List repository events.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
page: Page number
|
|
302
|
+
per_page: Results per page (max 100)
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
List of repository events
|
|
306
|
+
"""
|
|
307
|
+
url = f"{self.base_url}/events?page={page}&per_page={per_page}"
|
|
308
|
+
return request(url)
|