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.
Files changed (21) hide show
  1. {ultralytics_actions-0.0.59/ultralytics_actions.egg-info → ultralytics_actions-0.0.61}/PKG-INFO +1 -1
  2. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/__init__.py +1 -1
  3. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/common_utils.py +27 -25
  4. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/tests/test_urls.py +5 -0
  5. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61/ultralytics_actions.egg-info}/PKG-INFO +1 -1
  6. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/LICENSE +0 -0
  7. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/README.md +0 -0
  8. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/first_interaction.py +0 -0
  9. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/summarize_pr.py +0 -0
  10. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/summarize_release.py +0 -0
  11. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/update_markdown_code_blocks.py +0 -0
  12. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/__init__.py +0 -0
  13. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/github_utils.py +0 -0
  14. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/actions/utils/openai_utils.py +0 -0
  15. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/pyproject.toml +0 -0
  16. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/setup.cfg +0 -0
  17. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/SOURCES.txt +0 -0
  18. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/dependency_links.txt +0 -0
  19. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/entry_points.txt +0 -0
  20. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/requires.txt +0 -0
  21. {ultralytics_actions-0.0.59 → ultralytics_actions-0.0.61}/ultralytics_actions.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics-actions
3
- Version: 0.0.59
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>
@@ -22,4 +22,4 @@
22
22
  # ├── test_summarize_pr.py
23
23
  # └── ...
24
24
 
25
- __version__ = "0.0.59"
25
+ __version__ = "0.0.61"
@@ -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
- url = f"https://api.search.brave.com/res/v1/web/search?q={parse.quote(query)}&count={count}"
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 and BRAVE_API_KEY:
160
- replacements = {}
161
- modified_text = text
162
-
163
- for (title, url, is_md), valid in zip(urls, valid_results):
164
- if not valid:
165
- alternative_urls = brave_search(f"{title} {url}", BRAVE_API_KEY, count=3)
166
- if alternative_urls:
167
- # Try each alternative URL until we find one that works
168
- for alt_url in alternative_urls:
169
- if is_url(alt_url, session):
170
- break
171
- replacements[url] = alt_url
172
- modified_text = modified_text.replace(url, alt_url)
173
-
174
- if verbose and replacements:
175
- print(
176
- f"WARNING ⚠️ replaced {len(replacements)} broken links:\n"
177
- + "\n".join(f" {k}: {v}" for k, v in replacements.items())
178
- )
179
- if replacements:
180
- return (True, [], modified_text) if return_bad else modified_text
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))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics-actions
3
- Version: 0.0.59
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>