@@ -105,7 +105,7 @@ def main(argv, stdin, stdout, stderr):
105105
106106 # Check for upgrades.
107107 wait_until = None
108- if builder .version != 'dev' :
108+ if not ( is_dev ( builder .version ) or is_wheel ( builder . version )) :
109109 checker = threading .Thread (target = env .check_upgrade , daemon = True )
110110 checker .start ()
111111 wait_until = time .monotonic () + 5
@@ -114,7 +114,7 @@ def main(argv, stdin, stdout, stderr):
114114 try :
115115 args = argv [1 :] if len (argv ) > 1 \
116116 else builder .config ['defaults' ]['command-dev' ] \
117- if builder .version == 'dev' \
117+ if is_dev ( builder .version ) \
118118 else builder .config ['defaults' ]['command' ]
119119 args [0 ] = env .bin_path (args [0 ])
120120 rc = subprocess .run (args ).returncode
@@ -147,6 +147,8 @@ def merge_dict(dst, src):
147147
148148def is_version (version ): return version_re .match (version )
149149def is_tag (version ): return tag_re .match (version )
150+ def is_dev (version ): return version == 'dev'
151+ def is_wheel (version ): return pathlib .Path (version ).resolve ().is_file ()
150152
151153
152154@contextlib .contextmanager
@@ -259,7 +261,7 @@ def __init__(self, base, config, version, out, debug):
259261 self .config_url = config
260262 self .out , self .debug = out , debug
261263 if version is None : version = self .config ['version' ]
262- if not (is_version (version ) or is_tag (version )):
264+ if not (is_version (version ) or is_tag (version ) or is_wheel ( version ) ):
263265 raise Exception (f"Invalid version: { version } " )
264266 self .version = version
265267
@@ -296,7 +298,8 @@ def merge_local_config(self, config):
296298 merge_dict (config , tomllib .load (f ))
297299
298300 def requirements (self , config = None ):
299- if (v := self .version ) == 'dev' : return f'-e { self .base .as_uri ()} \n '
301+ if is_dev (v := self .version ): return f'-e { self .base .as_uri ()} \n '
302+ if is_wheel (v ): return f'{ pathlib .Path (v ).resolve ().as_uri ()} \n '
300303 if config is None : config = self .config
301304 version_num = config .get ('tags' , {}).get (v ) if is_tag (v ) else v
302305 if version_num is None :
@@ -309,22 +312,24 @@ def version_from(self, requirements):
309312 if (m := pat .search (requirements )) is not None : return m .group (1 )
310313
311314 def find (self ):
312- pat = 'dev' if self .version == 'dev' else f'{ self .version } -*'
315+ pat = 'dev' if is_dev (self .version ) \
316+ else 'wheel' if is_wheel (self .version ) else f'{ self .version } -*'
313317 envs = [Env (path , self ) for path in self .root .glob (pat )]
314318 envs .sort (key = lambda e : e .path , reverse = True )
315319 matching = [e for e in envs if e .requirements is not None ]
316320 return envs , matching
317321
318322 def new (self ):
319- name = 'dev' if self .version == 'dev' \
323+ name = 'dev' if is_dev (self .version ) \
324+ else 'wheel' if is_wheel (self .version ) \
320325 else f'{ self .version } -{ time .time_ns ():024x} '
321326 return Env (self .root / name , self )
322327
323328 def post_setup (self , ctx ):
324329 super ().post_setup (ctx )
325330 env , requirements = Env .env .get ()
326331 pip_args = []
327- if self .version == 'dev' :
332+ if is_dev ( self .version ) :
328333 uv_req = self .base / 'config' / 'uv.req'
329334 env .pip ('install' , '--require-hashes' , '--only-binary=:all:' ,
330335 '--no-deps' , f'--requirement={ uv_req } ' ,
0 commit comments