ultralytics-actions 0.0.59__tar.gz → 0.0.61__tar.gz
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.
- {ultralytics_actions-0.0.59/ultralytics_actions.egg-info → ultralytics_actions-0.0.61}/PKG-INFO +1 -1
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/__init__.py +1 -1
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/common_utils.py +27 -25
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/tests/test_urls.py +5 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61/ultralytics_actions.egg-info}/PKG-INFO +1 -1
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/LICENSE +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/README.md +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/first_interaction.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/summarize_pr.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/summarize_release.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/update_markdown_code_blocks.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/__init__.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/github_utils.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/openai_utils.py +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/pyproject.toml +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/setup.cfg +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/SOURCES.txt +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/dependency_links.txt +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/entry_points.txt +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/requires.txt +0 -0
- {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/top_level.txt +0 -0
{ultralytics_actions-0.0.59/ultralytics_actions.egg-info → ultralytics_actions-0.0.61}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics-actions
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.61
|
4
4
|
Summary: Ultralytics Actions for GitHub automation and PR management.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
@@ -8,7 +8,6 @@ from urllib import parse
|
|
8
8
|
|
9
9
|
import requests
|
10
10
|
|
11
|
-
BRAVE_API_KEY = os.getenv("BRAVE_API_KEY")
|
12
11
|
REQUESTS_HEADERS = {
|
13
12
|
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
|
14
13
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
|
@@ -67,7 +66,7 @@ URL_PATTERN = re.compile(
|
|
67
66
|
r"(?:www\.)?" # Optional www.
|
68
67
|
r"(?:[\w.-]+)?" # Optional domain name and subdomains
|
69
68
|
r"\.[a-zA-Z]{2,}" # TLD
|
70
|
-
r"(?:/[^\s\"')\]]*)?" # Optional path
|
69
|
+
r"(?:/[^\s\"')\]<>]*)?" # Optional path
|
71
70
|
r")"
|
72
71
|
)
|
73
72
|
|
@@ -87,7 +86,9 @@ def clean_url(url):
|
|
87
86
|
def brave_search(query, api_key, count=5):
|
88
87
|
"""Search for alternative URLs using Brave Search API."""
|
89
88
|
headers = {"X-Subscription-Token": api_key, "Accept": "application/json"}
|
90
|
-
|
89
|
+
if len(query) > 400:
|
90
|
+
print(f"WARNING ⚠️ Brave search query length {len(query)} exceed limit of 400 characters, truncating.")
|
91
|
+
url = f"https://api.search.brave.com/res/v1/web/search?q={parse.quote(query.strip()[:400])}&count={count}"
|
91
92
|
response = requests.get(url, headers=headers)
|
92
93
|
data = response.json() if response.status_code == 200 else {}
|
93
94
|
results = data.get("web", {}).get("results", []) if data else []
|
@@ -156,28 +157,29 @@ def check_links_in_string(text, verbose=True, return_bad=False, replace=False):
|
|
156
157
|
valid_results = list(executor.map(lambda x: is_url(x[1], session), urls))
|
157
158
|
bad_urls = [url for (_, url, _), valid in zip(urls, valid_results) if not valid]
|
158
159
|
|
159
|
-
if replace and bad_urls
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
160
|
+
if replace and bad_urls:
|
161
|
+
if brave_api_key := os.getenv("BRAVE_API_KEY"):
|
162
|
+
replacements = {}
|
163
|
+
modified_text = text
|
164
|
+
|
165
|
+
for (title, url, is_md), valid in zip(urls, valid_results):
|
166
|
+
if not valid:
|
167
|
+
alternative_urls = brave_search(f"{title[:200]} {url[:200]}", brave_api_key, count=3)
|
168
|
+
if alternative_urls:
|
169
|
+
# Try each alternative URL until we find one that works
|
170
|
+
for alt_url in alternative_urls:
|
171
|
+
if is_url(alt_url, session):
|
172
|
+
break
|
173
|
+
replacements[url] = alt_url
|
174
|
+
modified_text = modified_text.replace(url, alt_url)
|
175
|
+
|
176
|
+
if verbose and replacements:
|
177
|
+
print(
|
178
|
+
f"WARNING ⚠️ replaced {len(replacements)} broken links:\n"
|
179
|
+
+ "\n".join(f" {k}: {v}" for k, v in replacements.items())
|
180
|
+
)
|
181
|
+
if replacements:
|
182
|
+
return (True, [], modified_text) if return_bad else modified_text
|
181
183
|
|
182
184
|
passing = not bad_urls
|
183
185
|
if verbose and not passing:
|
@@ -49,6 +49,11 @@ def test_markdown_links_in_string_func():
|
|
49
49
|
assert check_links_in_string(", abc ".join(f"[text]({url})" for url in URLS))
|
50
50
|
|
51
51
|
|
52
|
+
def test_bracket_links_in_string_func():
|
53
|
+
"""Test bracket links in strings function."""
|
54
|
+
assert check_links_in_string(", abc ".join(f"<{url}>" for url in URLS))
|
55
|
+
|
56
|
+
|
52
57
|
def test_html_links_in_string_func():
|
53
58
|
"""Test HTML links in strings function."""
|
54
59
|
assert check_links_in_string(", abc ".join(f'<a href="{url}">text</a>' for url in URLS))
|
{ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61/ultralytics_actions.egg-info}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ultralytics-actions
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.61
|
4
4
|
Summary: Ultralytics Actions for GitHub automation and PR management.
|
5
5
|
Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>
|
6
6
|
Maintainer-email: Ultralytics <hello@ultralytics.com>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/update_markdown_code_blocks.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
{ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/requires.txt
RENAMED
File without changes
|
{ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/top_level.txt
RENAMED
File without changes
|