drift-ml 0.1.9__tar.gz → 0.1.11__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.9
3
+ Version: 0.1.11
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
@@ -62,6 +62,9 @@ def _engine_running() -> bool:
62
62
 
63
63
  def _get_asset_download_url(asset_name: str) -> str:
64
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}"
65
68
  return f"https://github.com/{GITHUB_REPO}/releases/download/{ENGINE_TAG}/{asset_name}"
66
69
 
67
70
 
@@ -91,19 +94,44 @@ def _get_asset_download_url_via_api(asset_name: str) -> str:
91
94
 
92
95
 
93
96
  def _download_file(url: str, dest: Path) -> None:
97
+ dest.parent.mkdir(parents=True, exist_ok=True)
94
98
  token = os.environ.get("DRIFT_GITHUB_TOKEN") or os.environ.get("GITHUB_TOKEN")
95
- headers = {"User-Agent": "Drift-Engine-Launcher/1.0"}
96
- # 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"}
97
100
  if "api.github.com" in url:
98
101
  headers["Accept"] = "application/octet-stream"
99
102
  if token:
100
103
  headers["Authorization"] = f"Bearer {token}"
101
- r = requests.get(url, headers=headers, stream=True, timeout=60)
102
- r.raise_for_status()
103
- dest.parent.mkdir(parents=True, exist_ok=True)
104
- with open(dest, "wb") as f:
105
- for chunk in r.iter_content(chunk_size=65536):
106
- f.write(chunk)
104
+
105
+ def try_requests():
106
+ r = requests.get(url, headers=headers, stream=True, timeout=60)
107
+ r.raise_for_status()
108
+ with open(dest, "wb") as f:
109
+ for chunk in r.iter_content(chunk_size=65536):
110
+ f.write(chunk)
111
+
112
+ def try_urllib():
113
+ import urllib.request
114
+ req = urllib.request.Request(url, headers=headers)
115
+ with urllib.request.urlopen(req, timeout=60) as resp:
116
+ with open(dest, "wb") as f:
117
+ f.write(resp.read())
118
+
119
+ def try_curl():
120
+ result = subprocess.run(
121
+ ["curl", "-fsSL", "-o", str(dest), url],
122
+ capture_output=True,
123
+ timeout=120,
124
+ )
125
+ if result.returncode != 0:
126
+ raise RuntimeError(f"curl failed: {result.stderr.decode() or result.returncode}")
127
+
128
+ for attempt in [try_curl, try_requests, try_urllib]:
129
+ try:
130
+ attempt()
131
+ return
132
+ except Exception:
133
+ continue
134
+ raise RuntimeError(f"Download failed. Try manually: curl -L -o {dest} {url}")
107
135
 
108
136
 
109
137
  def ensure_engine() -> bool:
@@ -131,20 +159,15 @@ def ensure_engine() -> bool:
131
159
  ext = ".exe" if platform.system() == "Windows" else ""
132
160
  asset = f"drift-engine-{plat}-{arch}{ext}"
133
161
  print(f"drift: Downloading engine ({asset})...", file=sys.stderr)
162
+ url = _get_asset_download_url(asset)
134
163
  try:
135
- url = _get_asset_download_url(asset)
136
164
  _download_file(url, bin_path)
137
165
  except Exception as e:
138
- if "404" in str(e) or "Not Found" in str(e):
139
- try:
140
- url = _get_asset_download_url_via_api(asset)
141
- _download_file(url, bin_path)
142
- except Exception as e2:
143
- print(f"drift: Download failed: {e2}", file=sys.stderr)
144
- return False
145
- else:
146
- print(f"drift: Download failed: {e}", file=sys.stderr)
147
- return False
166
+ print(f"drift: Download failed: {e}", file=sys.stderr)
167
+ print(f"drift: Run this manually, then try again:", file=sys.stderr)
168
+ print(f" mkdir -p ~/.drift/bin && curl -L -o ~/.drift/bin/{asset} {url}", file=sys.stderr)
169
+ print(f" chmod +x ~/.drift/bin/{asset}", file=sys.stderr)
170
+ return False
148
171
  if platform.system() != "Windows":
149
172
  bin_path.chmod(0o755)
150
173
  if platform.system() == "Darwin":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drift-ml
3
- Version: 0.1.9
3
+ Version: 0.1.11
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.9"
7
+ version = "0.1.11"
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