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,10 +1,10 @@
|
|
|
1
|
-
from .gitapi import *
|
|
2
|
-
|
|
3
|
-
__all__ = [
|
|
4
|
-
'Repository',
|
|
5
|
-
'User',
|
|
6
|
-
'GitError',
|
|
7
|
-
'RateLimitError',
|
|
8
|
-
'NotFoundError',
|
|
9
|
-
'RequestError'
|
|
10
|
-
]
|
|
1
|
+
from .gitapi import *
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
'Repository',
|
|
5
|
+
'User',
|
|
6
|
+
'GitError',
|
|
7
|
+
'RateLimitError',
|
|
8
|
+
'NotFoundError',
|
|
9
|
+
'RequestError'
|
|
10
|
+
]
|
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
# 🚀 GitAPI: GitHub Data Extraction Module
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
GitAPI is a powerful, lightweight GitHub data extraction module within the Webscout Python package. It provides comprehensive tools for retrieving GitHub repository and user information without requiring authentication for public data access.
|
|
6
|
-
|
|
7
|
-
## ✨ Features
|
|
8
|
-
|
|
9
|
-
- **Repository Operations**
|
|
10
|
-
- Repository metadata retrieval
|
|
11
|
-
- Commit history tracking
|
|
12
|
-
- Pull request management
|
|
13
|
-
- Issue tracking
|
|
14
|
-
- Release information
|
|
15
|
-
- Branch management
|
|
16
|
-
- Repository statistics
|
|
17
|
-
- Workflow data
|
|
18
|
-
|
|
19
|
-
- **User Operations**
|
|
20
|
-
- Profile information
|
|
21
|
-
- Repository listing
|
|
22
|
-
- Follower/Following data
|
|
23
|
-
- Organization membership
|
|
24
|
-
- Event tracking
|
|
25
|
-
- Gist management
|
|
26
|
-
- Star history
|
|
27
|
-
|
|
28
|
-
- **Error Handling**
|
|
29
|
-
- Rate limit detection
|
|
30
|
-
- Resource not found handling
|
|
31
|
-
- Request retry mechanism
|
|
32
|
-
- Custom error types
|
|
33
|
-
|
|
34
|
-
## 📦 Installation
|
|
35
|
-
|
|
36
|
-
Install as part of the Webscout package:
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
pip install webscout
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## 💡 Quick Examples
|
|
43
|
-
|
|
44
|
-
### Repository Operations
|
|
45
|
-
|
|
46
|
-
```python
|
|
47
|
-
from webscout.Extra.GitToolkit.gitapi import Repository
|
|
48
|
-
|
|
49
|
-
# Initialize repository client
|
|
50
|
-
repo = Repository("OE-LUCIFER", "Webscout")
|
|
51
|
-
|
|
52
|
-
# Get basic repository info
|
|
53
|
-
info = repo.get_info()
|
|
54
|
-
print(f"Repository: {info['full_name']}")
|
|
55
|
-
print(f"Stars: {info['stargazers_count']}")
|
|
56
|
-
|
|
57
|
-
# Get latest commits
|
|
58
|
-
commits = repo.get_commits(per_page=5)
|
|
59
|
-
for commit in commits:
|
|
60
|
-
print(f"Commit: {commit['commit']['message']}")
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### User Operations
|
|
64
|
-
|
|
65
|
-
```python
|
|
66
|
-
from webscout.Extra.GitToolkit.gitapi import User
|
|
67
|
-
|
|
68
|
-
# Initialize user client
|
|
69
|
-
user = User("OE-LUCIFER")
|
|
70
|
-
|
|
71
|
-
# Get user profile
|
|
72
|
-
profile = user.get_profile()
|
|
73
|
-
print(f"User: {profile['login']}")
|
|
74
|
-
print(f"Followers: {profile['followers']}")
|
|
75
|
-
|
|
76
|
-
# Get user's repositories
|
|
77
|
-
repositories = user.get_repositories()
|
|
78
|
-
for repo in repositories:
|
|
79
|
-
print(f"Repository: {repo['name']}")
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 🔧 Available Methods
|
|
83
|
-
|
|
84
|
-
### Repository Class
|
|
85
|
-
|
|
86
|
-
- `get_info()`: Basic repository information
|
|
87
|
-
- `get_commits()`: Repository commit history
|
|
88
|
-
- `get_pull_requests()`: Repository pull requests
|
|
89
|
-
- `get_issues()`: Repository issues
|
|
90
|
-
- `get_releases()`: Repository releases
|
|
91
|
-
- `get_branches()`: Repository branches
|
|
92
|
-
- And many more...
|
|
93
|
-
|
|
94
|
-
### User Class
|
|
95
|
-
|
|
96
|
-
- `get_profile()`: User profile information
|
|
97
|
-
- `get_repositories()`: User's public repositories
|
|
98
|
-
- `get_followers()`: User's followers
|
|
99
|
-
- `get_following()`: Users being followed
|
|
100
|
-
- `get_organizations()`: User's organizations
|
|
101
|
-
- And many more...
|
|
102
|
-
|
|
103
|
-
## ⚠️ Error Handling
|
|
104
|
-
|
|
105
|
-
The module includes several custom exception types:
|
|
106
|
-
|
|
107
|
-
- `GitError`: Base exception for all GitHub API errors
|
|
108
|
-
- `RateLimitError`: Raised when hitting API rate limits
|
|
109
|
-
- `NotFoundError`: Raised when resource is not found
|
|
110
|
-
- `RequestError`: Raised for general request errors
|
|
1
|
+
# 🚀 GitAPI: GitHub Data Extraction Module
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
GitAPI is a powerful, lightweight GitHub data extraction module within the Webscout Python package. It provides comprehensive tools for retrieving GitHub repository and user information without requiring authentication for public data access.
|
|
6
|
+
|
|
7
|
+
## ✨ Features
|
|
8
|
+
|
|
9
|
+
- **Repository Operations**
|
|
10
|
+
- Repository metadata retrieval
|
|
11
|
+
- Commit history tracking
|
|
12
|
+
- Pull request management
|
|
13
|
+
- Issue tracking
|
|
14
|
+
- Release information
|
|
15
|
+
- Branch management
|
|
16
|
+
- Repository statistics
|
|
17
|
+
- Workflow data
|
|
18
|
+
|
|
19
|
+
- **User Operations**
|
|
20
|
+
- Profile information
|
|
21
|
+
- Repository listing
|
|
22
|
+
- Follower/Following data
|
|
23
|
+
- Organization membership
|
|
24
|
+
- Event tracking
|
|
25
|
+
- Gist management
|
|
26
|
+
- Star history
|
|
27
|
+
|
|
28
|
+
- **Error Handling**
|
|
29
|
+
- Rate limit detection
|
|
30
|
+
- Resource not found handling
|
|
31
|
+
- Request retry mechanism
|
|
32
|
+
- Custom error types
|
|
33
|
+
|
|
34
|
+
## 📦 Installation
|
|
35
|
+
|
|
36
|
+
Install as part of the Webscout package:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install webscout
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 💡 Quick Examples
|
|
43
|
+
|
|
44
|
+
### Repository Operations
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
from webscout.Extra.GitToolkit.gitapi import Repository
|
|
48
|
+
|
|
49
|
+
# Initialize repository client
|
|
50
|
+
repo = Repository("OE-LUCIFER", "Webscout")
|
|
51
|
+
|
|
52
|
+
# Get basic repository info
|
|
53
|
+
info = repo.get_info()
|
|
54
|
+
print(f"Repository: {info['full_name']}")
|
|
55
|
+
print(f"Stars: {info['stargazers_count']}")
|
|
56
|
+
|
|
57
|
+
# Get latest commits
|
|
58
|
+
commits = repo.get_commits(per_page=5)
|
|
59
|
+
for commit in commits:
|
|
60
|
+
print(f"Commit: {commit['commit']['message']}")
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### User Operations
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from webscout.Extra.GitToolkit.gitapi import User
|
|
67
|
+
|
|
68
|
+
# Initialize user client
|
|
69
|
+
user = User("OE-LUCIFER")
|
|
70
|
+
|
|
71
|
+
# Get user profile
|
|
72
|
+
profile = user.get_profile()
|
|
73
|
+
print(f"User: {profile['login']}")
|
|
74
|
+
print(f"Followers: {profile['followers']}")
|
|
75
|
+
|
|
76
|
+
# Get user's repositories
|
|
77
|
+
repositories = user.get_repositories()
|
|
78
|
+
for repo in repositories:
|
|
79
|
+
print(f"Repository: {repo['name']}")
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 🔧 Available Methods
|
|
83
|
+
|
|
84
|
+
### Repository Class
|
|
85
|
+
|
|
86
|
+
- `get_info()`: Basic repository information
|
|
87
|
+
- `get_commits()`: Repository commit history
|
|
88
|
+
- `get_pull_requests()`: Repository pull requests
|
|
89
|
+
- `get_issues()`: Repository issues
|
|
90
|
+
- `get_releases()`: Repository releases
|
|
91
|
+
- `get_branches()`: Repository branches
|
|
92
|
+
- And many more...
|
|
93
|
+
|
|
94
|
+
### User Class
|
|
95
|
+
|
|
96
|
+
- `get_profile()`: User profile information
|
|
97
|
+
- `get_repositories()`: User's public repositories
|
|
98
|
+
- `get_followers()`: User's followers
|
|
99
|
+
- `get_following()`: Users being followed
|
|
100
|
+
- `get_organizations()`: User's organizations
|
|
101
|
+
- And many more...
|
|
102
|
+
|
|
103
|
+
## ⚠️ Error Handling
|
|
104
|
+
|
|
105
|
+
The module includes several custom exception types:
|
|
106
|
+
|
|
107
|
+
- `GitError`: Base exception for all GitHub API errors
|
|
108
|
+
- `RateLimitError`: Raised when hitting API rate limits
|
|
109
|
+
- `NotFoundError`: Raised when resource is not found
|
|
110
|
+
- `RequestError`: Raised for general request errors
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
from .repository import Repository
|
|
2
|
-
from .user import User
|
|
3
|
-
from .utils import GitError, RateLimitError, NotFoundError, RequestError
|
|
4
|
-
|
|
5
|
-
__all__ = [
|
|
6
|
-
'Repository',
|
|
7
|
-
'User',
|
|
8
|
-
'GitError',
|
|
9
|
-
'RateLimitError',
|
|
10
|
-
'NotFoundError',
|
|
11
|
-
'RequestError'
|
|
1
|
+
from .repository import Repository
|
|
2
|
+
from .user import User
|
|
3
|
+
from .utils import GitError, RateLimitError, NotFoundError, RequestError
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
'Repository',
|
|
7
|
+
'User',
|
|
8
|
+
'GitError',
|
|
9
|
+
'RateLimitError',
|
|
10
|
+
'NotFoundError',
|
|
11
|
+
'RequestError'
|
|
12
12
|
]
|
|
@@ -1,195 +1,195 @@
|
|
|
1
|
-
from typing import List, Dict, Any, Optional
|
|
2
|
-
from .utils import request
|
|
3
|
-
from urllib.parse import quote
|
|
4
|
-
|
|
5
|
-
class Repository:
|
|
6
|
-
"""Class for interacting with GitHub repositories"""
|
|
7
|
-
|
|
8
|
-
def __init__(self, owner: str, repo: str):
|
|
9
|
-
"""
|
|
10
|
-
Initialize repository client
|
|
11
|
-
|
|
12
|
-
Args:
|
|
13
|
-
owner: Repository owner
|
|
14
|
-
repo: Repository name
|
|
15
|
-
"""
|
|
16
|
-
self.owner = owner
|
|
17
|
-
self.repo = repo
|
|
18
|
-
self.base_url = f"https://api.github.com/repos/{owner}/{repo}"
|
|
19
|
-
|
|
20
|
-
def get_info(self) -> Dict[str, Any]:
|
|
21
|
-
"""Get basic repository information"""
|
|
22
|
-
return request(self.base_url)
|
|
23
|
-
|
|
24
|
-
def get_commits(self, page: int = 1, per_page: int = 30, sha: str = None) -> List[Dict[str, Any]]:
|
|
25
|
-
"""
|
|
26
|
-
Get repository commits
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
page: Page number
|
|
30
|
-
per_page: Items per page
|
|
31
|
-
sha: SHA or branch name to start listing commits from
|
|
32
|
-
"""
|
|
33
|
-
url = f"{self.base_url}/commits?page={page}&per_page={per_page}"
|
|
34
|
-
if sha:
|
|
35
|
-
url += f"&sha={sha}"
|
|
36
|
-
return request(url)
|
|
37
|
-
|
|
38
|
-
def get_commit(self, sha: str) -> Dict[str, Any]:
|
|
39
|
-
"""Get a specific commit details"""
|
|
40
|
-
url = f"{self.base_url}/commits/{sha}"
|
|
41
|
-
return request(url)
|
|
42
|
-
|
|
43
|
-
def get_pull_requests(self, state: str = "all", page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
44
|
-
"""
|
|
45
|
-
Get repository pull requests
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
state: State of PRs to return (open/closed/all)
|
|
49
|
-
page: Page number
|
|
50
|
-
per_page: Items per page
|
|
51
|
-
"""
|
|
52
|
-
url = f"{self.base_url}/pulls?state={state}&page={page}&per_page={per_page}"
|
|
53
|
-
return request(url)
|
|
54
|
-
|
|
55
|
-
def get_pull_request(self, pr_number: int) -> Dict[str, Any]:
|
|
56
|
-
"""Get specific pull request details"""
|
|
57
|
-
url = f"{self.base_url}/pulls/{pr_number}"
|
|
58
|
-
return request(url)
|
|
59
|
-
|
|
60
|
-
def get_pull_request_commits(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
61
|
-
"""Get commits in a specific pull request"""
|
|
62
|
-
url = f"{self.base_url}/pulls/{pr_number}/commits"
|
|
63
|
-
return request(url)
|
|
64
|
-
|
|
65
|
-
def get_pull_request_files(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
66
|
-
"""Get files changed in a specific pull request"""
|
|
67
|
-
url = f"{self.base_url}/pulls/{pr_number}/files"
|
|
68
|
-
return request(url)
|
|
69
|
-
|
|
70
|
-
def get_issues(self, state: str = "all", page: int = 1, per_page: int = 30, labels: str = None) -> List[Dict[str, Any]]:
|
|
71
|
-
"""
|
|
72
|
-
Get repository issues
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
state: State of issues to return (open/closed/all)
|
|
76
|
-
page: Page number
|
|
77
|
-
per_page: Items per page
|
|
78
|
-
labels: Comma-separated list of label names
|
|
79
|
-
"""
|
|
80
|
-
url = f"{self.base_url}/issues?state={state}&page={page}&per_page={per_page}"
|
|
81
|
-
if labels:
|
|
82
|
-
url += f"&labels={labels}"
|
|
83
|
-
return request(url)
|
|
84
|
-
|
|
85
|
-
def get_issue(self, issue_number: int) -> Dict[str, Any]:
|
|
86
|
-
"""Get specific issue details"""
|
|
87
|
-
url = f"{self.base_url}/issues/{issue_number}"
|
|
88
|
-
return request(url)
|
|
89
|
-
|
|
90
|
-
def get_issue_comments(self, issue_number: int) -> List[Dict[str, Any]]:
|
|
91
|
-
"""Get comments on a specific issue"""
|
|
92
|
-
url = f"{self.base_url}/issues/{issue_number}/comments"
|
|
93
|
-
return request(url)
|
|
94
|
-
|
|
95
|
-
def get_labels(self) -> List[Dict[str, Any]]:
|
|
96
|
-
"""Get repository labels"""
|
|
97
|
-
url = f"{self.base_url}/labels"
|
|
98
|
-
return request(url)
|
|
99
|
-
|
|
100
|
-
def get_milestones(self, state: str = "all") -> List[Dict[str, Any]]:
|
|
101
|
-
"""Get repository milestones"""
|
|
102
|
-
url = f"{self.base_url}/milestones?state={state}"
|
|
103
|
-
return request(url)
|
|
104
|
-
|
|
105
|
-
def get_contributors(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
106
|
-
"""Get repository contributors"""
|
|
107
|
-
url = f"{self.base_url}/contributors?page={page}&per_page={per_page}"
|
|
108
|
-
return request(url)
|
|
109
|
-
|
|
110
|
-
def get_languages(self) -> Dict[str, int]:
|
|
111
|
-
"""Get repository language breakdown"""
|
|
112
|
-
url = f"{self.base_url}/languages"
|
|
113
|
-
return request(url)
|
|
114
|
-
|
|
115
|
-
def get_teams(self) -> List[Dict[str, Any]]:
|
|
116
|
-
"""Get teams with access to repository"""
|
|
117
|
-
url = f"{self.base_url}/teams"
|
|
118
|
-
return request(url)
|
|
119
|
-
|
|
120
|
-
def get_tags(self) -> List[Dict[str, Any]]:
|
|
121
|
-
"""Get repository tags"""
|
|
122
|
-
url = f"{self.base_url}/tags"
|
|
123
|
-
return request(url)
|
|
124
|
-
|
|
125
|
-
def get_releases(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
126
|
-
"""Get repository releases"""
|
|
127
|
-
url = f"{self.base_url}/releases?page={page}&per_page={per_page}"
|
|
128
|
-
return request(url)
|
|
129
|
-
|
|
130
|
-
def get_release(self, release_id: str) -> Dict[str, Any]:
|
|
131
|
-
"""Get specific release details"""
|
|
132
|
-
url = f"{self.base_url}/releases/{release_id}"
|
|
133
|
-
return request(url)
|
|
134
|
-
|
|
135
|
-
def get_latest_release(self) -> Dict[str, Any]:
|
|
136
|
-
"""Get latest release"""
|
|
137
|
-
url = f"{self.base_url}/releases/latest"
|
|
138
|
-
return request(url)
|
|
139
|
-
|
|
140
|
-
def get_branches(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
141
|
-
"""Get repository branches"""
|
|
142
|
-
url = f"{self.base_url}/branches?page={page}&per_page={per_page}"
|
|
143
|
-
return request(url)
|
|
144
|
-
|
|
145
|
-
def get_branch(self, branch: str) -> Dict[str, Any]:
|
|
146
|
-
"""Get specific branch details"""
|
|
147
|
-
url = f"{self.base_url}/branches/{branch}"
|
|
148
|
-
return request(url)
|
|
149
|
-
|
|
150
|
-
def get_contents(self, path: str = "", ref: Optional[str] = None) -> Dict[str, Any]:
|
|
151
|
-
"""Get contents of file or directory"""
|
|
152
|
-
url = f"{self.base_url}/contents/{quote(path)}"
|
|
153
|
-
if ref:
|
|
154
|
-
url += f"?ref={ref}"
|
|
155
|
-
return request(url)
|
|
156
|
-
|
|
157
|
-
def get_collaborators(self) -> List[Dict[str, Any]]:
|
|
158
|
-
"""Get repository collaborators"""
|
|
159
|
-
url = f"{self.base_url}/collaborators"
|
|
160
|
-
return request(url)
|
|
161
|
-
|
|
162
|
-
def get_workflows(self) -> List[Dict[str, Any]]:
|
|
163
|
-
"""Get repository GitHub Actions workflows"""
|
|
164
|
-
url = f"{self.base_url}/actions/workflows"
|
|
165
|
-
return request(url)
|
|
166
|
-
|
|
167
|
-
def get_workflow_runs(self, workflow_id: str) -> List[Dict[str, Any]]:
|
|
168
|
-
"""Get workflow runs for a specific workflow"""
|
|
169
|
-
url = f"{self.base_url}/actions/workflows/{workflow_id}/runs"
|
|
170
|
-
return request(url)
|
|
171
|
-
|
|
172
|
-
def get_deployments(self) -> List[Dict[str, Any]]:
|
|
173
|
-
"""Get repository deployments"""
|
|
174
|
-
url = f"{self.base_url}/deployments"
|
|
175
|
-
return request(url)
|
|
176
|
-
|
|
177
|
-
def get_traffic(self) -> Dict[str, Any]:
|
|
178
|
-
"""Get repository traffic data"""
|
|
179
|
-
url = f"{self.base_url}/traffic/views"
|
|
180
|
-
return request(url)
|
|
181
|
-
|
|
182
|
-
def get_code_frequency(self) -> List[List[int]]:
|
|
183
|
-
"""Get weekly commit activity"""
|
|
184
|
-
url = f"{self.base_url}/stats/code_frequency"
|
|
185
|
-
return request(url)
|
|
186
|
-
|
|
187
|
-
def get_commit_activity(self) -> List[Dict[str, Any]]:
|
|
188
|
-
"""Get last year of commit activity"""
|
|
189
|
-
url = f"{self.base_url}/stats/commit_activity"
|
|
190
|
-
return request(url)
|
|
191
|
-
|
|
192
|
-
def get_community_profile(self) -> Dict[str, Any]:
|
|
193
|
-
"""Get community profile metrics"""
|
|
194
|
-
url = f"{self.base_url}/community/profile"
|
|
195
|
-
return request(url)
|
|
1
|
+
from typing import List, Dict, Any, Optional
|
|
2
|
+
from .utils import request
|
|
3
|
+
from urllib.parse import quote
|
|
4
|
+
|
|
5
|
+
class Repository:
|
|
6
|
+
"""Class for interacting with GitHub repositories"""
|
|
7
|
+
|
|
8
|
+
def __init__(self, owner: str, repo: str):
|
|
9
|
+
"""
|
|
10
|
+
Initialize repository client
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
owner: Repository owner
|
|
14
|
+
repo: Repository name
|
|
15
|
+
"""
|
|
16
|
+
self.owner = owner
|
|
17
|
+
self.repo = repo
|
|
18
|
+
self.base_url = f"https://api.github.com/repos/{owner}/{repo}"
|
|
19
|
+
|
|
20
|
+
def get_info(self) -> Dict[str, Any]:
|
|
21
|
+
"""Get basic repository information"""
|
|
22
|
+
return request(self.base_url)
|
|
23
|
+
|
|
24
|
+
def get_commits(self, page: int = 1, per_page: int = 30, sha: str = None) -> List[Dict[str, Any]]:
|
|
25
|
+
"""
|
|
26
|
+
Get repository commits
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
page: Page number
|
|
30
|
+
per_page: Items per page
|
|
31
|
+
sha: SHA or branch name to start listing commits from
|
|
32
|
+
"""
|
|
33
|
+
url = f"{self.base_url}/commits?page={page}&per_page={per_page}"
|
|
34
|
+
if sha:
|
|
35
|
+
url += f"&sha={sha}"
|
|
36
|
+
return request(url)
|
|
37
|
+
|
|
38
|
+
def get_commit(self, sha: str) -> Dict[str, Any]:
|
|
39
|
+
"""Get a specific commit details"""
|
|
40
|
+
url = f"{self.base_url}/commits/{sha}"
|
|
41
|
+
return request(url)
|
|
42
|
+
|
|
43
|
+
def get_pull_requests(self, state: str = "all", page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
44
|
+
"""
|
|
45
|
+
Get repository pull requests
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
state: State of PRs to return (open/closed/all)
|
|
49
|
+
page: Page number
|
|
50
|
+
per_page: Items per page
|
|
51
|
+
"""
|
|
52
|
+
url = f"{self.base_url}/pulls?state={state}&page={page}&per_page={per_page}"
|
|
53
|
+
return request(url)
|
|
54
|
+
|
|
55
|
+
def get_pull_request(self, pr_number: int) -> Dict[str, Any]:
|
|
56
|
+
"""Get specific pull request details"""
|
|
57
|
+
url = f"{self.base_url}/pulls/{pr_number}"
|
|
58
|
+
return request(url)
|
|
59
|
+
|
|
60
|
+
def get_pull_request_commits(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
61
|
+
"""Get commits in a specific pull request"""
|
|
62
|
+
url = f"{self.base_url}/pulls/{pr_number}/commits"
|
|
63
|
+
return request(url)
|
|
64
|
+
|
|
65
|
+
def get_pull_request_files(self, pr_number: int) -> List[Dict[str, Any]]:
|
|
66
|
+
"""Get files changed in a specific pull request"""
|
|
67
|
+
url = f"{self.base_url}/pulls/{pr_number}/files"
|
|
68
|
+
return request(url)
|
|
69
|
+
|
|
70
|
+
def get_issues(self, state: str = "all", page: int = 1, per_page: int = 30, labels: str = None) -> List[Dict[str, Any]]:
|
|
71
|
+
"""
|
|
72
|
+
Get repository issues
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
state: State of issues to return (open/closed/all)
|
|
76
|
+
page: Page number
|
|
77
|
+
per_page: Items per page
|
|
78
|
+
labels: Comma-separated list of label names
|
|
79
|
+
"""
|
|
80
|
+
url = f"{self.base_url}/issues?state={state}&page={page}&per_page={per_page}"
|
|
81
|
+
if labels:
|
|
82
|
+
url += f"&labels={labels}"
|
|
83
|
+
return request(url)
|
|
84
|
+
|
|
85
|
+
def get_issue(self, issue_number: int) -> Dict[str, Any]:
|
|
86
|
+
"""Get specific issue details"""
|
|
87
|
+
url = f"{self.base_url}/issues/{issue_number}"
|
|
88
|
+
return request(url)
|
|
89
|
+
|
|
90
|
+
def get_issue_comments(self, issue_number: int) -> List[Dict[str, Any]]:
|
|
91
|
+
"""Get comments on a specific issue"""
|
|
92
|
+
url = f"{self.base_url}/issues/{issue_number}/comments"
|
|
93
|
+
return request(url)
|
|
94
|
+
|
|
95
|
+
def get_labels(self) -> List[Dict[str, Any]]:
|
|
96
|
+
"""Get repository labels"""
|
|
97
|
+
url = f"{self.base_url}/labels"
|
|
98
|
+
return request(url)
|
|
99
|
+
|
|
100
|
+
def get_milestones(self, state: str = "all") -> List[Dict[str, Any]]:
|
|
101
|
+
"""Get repository milestones"""
|
|
102
|
+
url = f"{self.base_url}/milestones?state={state}"
|
|
103
|
+
return request(url)
|
|
104
|
+
|
|
105
|
+
def get_contributors(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
106
|
+
"""Get repository contributors"""
|
|
107
|
+
url = f"{self.base_url}/contributors?page={page}&per_page={per_page}"
|
|
108
|
+
return request(url)
|
|
109
|
+
|
|
110
|
+
def get_languages(self) -> Dict[str, int]:
|
|
111
|
+
"""Get repository language breakdown"""
|
|
112
|
+
url = f"{self.base_url}/languages"
|
|
113
|
+
return request(url)
|
|
114
|
+
|
|
115
|
+
def get_teams(self) -> List[Dict[str, Any]]:
|
|
116
|
+
"""Get teams with access to repository"""
|
|
117
|
+
url = f"{self.base_url}/teams"
|
|
118
|
+
return request(url)
|
|
119
|
+
|
|
120
|
+
def get_tags(self) -> List[Dict[str, Any]]:
|
|
121
|
+
"""Get repository tags"""
|
|
122
|
+
url = f"{self.base_url}/tags"
|
|
123
|
+
return request(url)
|
|
124
|
+
|
|
125
|
+
def get_releases(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
126
|
+
"""Get repository releases"""
|
|
127
|
+
url = f"{self.base_url}/releases?page={page}&per_page={per_page}"
|
|
128
|
+
return request(url)
|
|
129
|
+
|
|
130
|
+
def get_release(self, release_id: str) -> Dict[str, Any]:
|
|
131
|
+
"""Get specific release details"""
|
|
132
|
+
url = f"{self.base_url}/releases/{release_id}"
|
|
133
|
+
return request(url)
|
|
134
|
+
|
|
135
|
+
def get_latest_release(self) -> Dict[str, Any]:
|
|
136
|
+
"""Get latest release"""
|
|
137
|
+
url = f"{self.base_url}/releases/latest"
|
|
138
|
+
return request(url)
|
|
139
|
+
|
|
140
|
+
def get_branches(self, page: int = 1, per_page: int = 30) -> List[Dict[str, Any]]:
|
|
141
|
+
"""Get repository branches"""
|
|
142
|
+
url = f"{self.base_url}/branches?page={page}&per_page={per_page}"
|
|
143
|
+
return request(url)
|
|
144
|
+
|
|
145
|
+
def get_branch(self, branch: str) -> Dict[str, Any]:
|
|
146
|
+
"""Get specific branch details"""
|
|
147
|
+
url = f"{self.base_url}/branches/{branch}"
|
|
148
|
+
return request(url)
|
|
149
|
+
|
|
150
|
+
def get_contents(self, path: str = "", ref: Optional[str] = None) -> Dict[str, Any]:
|
|
151
|
+
"""Get contents of file or directory"""
|
|
152
|
+
url = f"{self.base_url}/contents/{quote(path)}"
|
|
153
|
+
if ref:
|
|
154
|
+
url += f"?ref={ref}"
|
|
155
|
+
return request(url)
|
|
156
|
+
|
|
157
|
+
def get_collaborators(self) -> List[Dict[str, Any]]:
|
|
158
|
+
"""Get repository collaborators"""
|
|
159
|
+
url = f"{self.base_url}/collaborators"
|
|
160
|
+
return request(url)
|
|
161
|
+
|
|
162
|
+
def get_workflows(self) -> List[Dict[str, Any]]:
|
|
163
|
+
"""Get repository GitHub Actions workflows"""
|
|
164
|
+
url = f"{self.base_url}/actions/workflows"
|
|
165
|
+
return request(url)
|
|
166
|
+
|
|
167
|
+
def get_workflow_runs(self, workflow_id: str) -> List[Dict[str, Any]]:
|
|
168
|
+
"""Get workflow runs for a specific workflow"""
|
|
169
|
+
url = f"{self.base_url}/actions/workflows/{workflow_id}/runs"
|
|
170
|
+
return request(url)
|
|
171
|
+
|
|
172
|
+
def get_deployments(self) -> List[Dict[str, Any]]:
|
|
173
|
+
"""Get repository deployments"""
|
|
174
|
+
url = f"{self.base_url}/deployments"
|
|
175
|
+
return request(url)
|
|
176
|
+
|
|
177
|
+
def get_traffic(self) -> Dict[str, Any]:
|
|
178
|
+
"""Get repository traffic data"""
|
|
179
|
+
url = f"{self.base_url}/traffic/views"
|
|
180
|
+
return request(url)
|
|
181
|
+
|
|
182
|
+
def get_code_frequency(self) -> List[List[int]]:
|
|
183
|
+
"""Get weekly commit activity"""
|
|
184
|
+
url = f"{self.base_url}/stats/code_frequency"
|
|
185
|
+
return request(url)
|
|
186
|
+
|
|
187
|
+
def get_commit_activity(self) -> List[Dict[str, Any]]:
|
|
188
|
+
"""Get last year of commit activity"""
|
|
189
|
+
url = f"{self.base_url}/stats/commit_activity"
|
|
190
|
+
return request(url)
|
|
191
|
+
|
|
192
|
+
def get_community_profile(self) -> Dict[str, Any]:
|
|
193
|
+
"""Get community profile metrics"""
|
|
194
|
+
url = f"{self.base_url}/community/profile"
|
|
195
|
+
return request(url)
|