drift-ml 0.1.8__tar.gz → 0.1.10__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drift-ml
3
- Version: 0.1.8
3
+ Version: 0.1.10
4
4
  Summary: Terminal-first AutoML CLI - chat-based ML engineer
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: requests>=2.28.0
@@ -10,6 +10,10 @@ from drift.cli.repl import run_repl
10
10
 
11
11
 
12
12
  def main() -> None:
13
+ if "--version" in sys.argv or "-v" in sys.argv:
14
+ from importlib.metadata import version
15
+ print(f"drift-ml {version('drift-ml')}")
16
+ return
13
17
  base_url = os.environ.get("DRIFT_BACKEND_URL")
14
18
  if not base_url:
15
19
  from drift.engine_launcher import ensure_engine
@@ -61,14 +61,15 @@ def _engine_running() -> bool:
61
61
 
62
62
 
63
63
  def _get_asset_download_url(asset_name: str) -> str:
64
- """Resolve GitHub release asset to download URL."""
65
- # Direct URL works for public repos, no API rate limits
66
- direct_url = f"https://github.com/{GITHUB_REPO}/releases/download/{ENGINE_TAG}/{asset_name}"
67
- r = requests.head(direct_url, timeout=10, allow_redirects=True)
68
- if r.status_code == 200:
69
- return r.url # follow redirects to final URL
70
-
71
- # Fallback: API (needed for private repos or if direct fails)
64
+ """Resolve GitHub release asset to download URL. Prefer direct URL (no API)."""
65
+ base = os.environ.get("DRIFT_ENGINE_BASE_URL")
66
+ if base:
67
+ return f"{base.rstrip('/')}/{asset_name}"
68
+ return f"https://github.com/{GITHUB_REPO}/releases/download/{ENGINE_TAG}/{asset_name}"
69
+
70
+
71
+ def _get_asset_download_url_via_api(asset_name: str) -> str:
72
+ """Fallback: get URL via GitHub API (for private repos)."""
72
73
  token = os.environ.get("DRIFT_GITHUB_TOKEN") or os.environ.get("GITHUB_TOKEN")
73
74
  headers = {
74
75
  "User-Agent": "Drift-Engine-Launcher/1.0",
@@ -93,19 +94,26 @@ def _get_asset_download_url(asset_name: str) -> str:
93
94
 
94
95
 
95
96
  def _download_file(url: str, dest: Path) -> None:
97
+ dest.parent.mkdir(parents=True, exist_ok=True)
96
98
  token = os.environ.get("DRIFT_GITHUB_TOKEN") or os.environ.get("GITHUB_TOKEN")
97
- headers = {"User-Agent": "Drift-Engine-Launcher/1.0"}
98
- # API URLs need Accept: application/octet-stream; browser_download_url works with default
99
+ headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"}
99
100
  if "api.github.com" in url:
100
101
  headers["Accept"] = "application/octet-stream"
101
102
  if token:
102
103
  headers["Authorization"] = f"Bearer {token}"
103
- r = requests.get(url, headers=headers, stream=True, timeout=60)
104
- r.raise_for_status()
105
- dest.parent.mkdir(parents=True, exist_ok=True)
106
- with open(dest, "wb") as f:
107
- for chunk in r.iter_content(chunk_size=65536):
108
- f.write(chunk)
104
+ try:
105
+ r = requests.get(url, headers=headers, stream=True, timeout=60)
106
+ r.raise_for_status()
107
+ with open(dest, "wb") as f:
108
+ for chunk in r.iter_content(chunk_size=65536):
109
+ f.write(chunk)
110
+ except Exception:
111
+ # Fallback: urllib (stdlib, no deps, works when requests has issues)
112
+ import urllib.request
113
+ req = urllib.request.Request(url, headers=headers)
114
+ with urllib.request.urlopen(req, timeout=60) as resp:
115
+ with open(dest, "wb") as f:
116
+ f.write(resp.read())
109
117
 
110
118
 
111
119
  def ensure_engine() -> bool:
@@ -133,12 +141,17 @@ def ensure_engine() -> bool:
133
141
  ext = ".exe" if platform.system() == "Windows" else ""
134
142
  asset = f"drift-engine-{plat}-{arch}{ext}"
135
143
  print(f"drift: Downloading engine ({asset})...", file=sys.stderr)
144
+ url = _get_asset_download_url(asset)
136
145
  try:
137
- url = _get_asset_download_url(asset)
138
146
  _download_file(url, bin_path)
139
147
  except Exception as e:
140
- print(f"drift: Download failed: {e}", file=sys.stderr)
141
- return False
148
+ try:
149
+ url = _get_asset_download_url_via_api(asset)
150
+ _download_file(url, bin_path)
151
+ except Exception as e2:
152
+ print(f"drift: Download failed: {e2}", file=sys.stderr)
153
+ print(f"drift: Try manually: curl -L -o {bin_path} {url}", file=sys.stderr)
154
+ return False
142
155
  if platform.system() != "Windows":
143
156
  bin_path.chmod(0o755)
144
157
  if platform.system() == "Darwin":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drift-ml
3
- Version: 0.1.8
3
+ Version: 0.1.10
4
4
  Summary: Terminal-first AutoML CLI - chat-based ML engineer
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: requests>=2.28.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "drift-ml"
7
- version = "0.1.8"
7
+ version = "0.1.10"
8
8
  description = "Terminal-first AutoML CLI - chat-based ML engineer"
9
9
  requires-python = ">=3.10"
10
10
  dependencies = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes