@@ -253,7 +253,7 @@ def exec(self, bin_name: BinName | HostBinPath=None, cmd: Iterable[str | Path |
253
253
254
254
255
255
def is_valid_install_args (install_args : List [str ]) -> List [str ]:
256
- """Make sure a string is a valid install string for a package manager, e.g. 'yt-dlp ffmpeg'"""
256
+ """Make sure a string is a valid install string for a package manager, e.g. [ 'yt-dlp', ' ffmpeg'] """
257
257
assert install_args
258
258
assert all (len (arg ) for arg in install_args )
259
259
return install_args
@@ -289,7 +289,7 @@ class BinProvider(BaseModel):
289
289
name : BinProviderName = ''
290
290
291
291
PATH : PATHStr = Field (default = '' ) # e.g. '/opt/homebrew/bin:/opt/archivebox/bin'
292
- BIN : BinName = 'env'
292
+ INSTALLER_BIN : BinName = 'env'
293
293
294
294
abspath_provider : ProviderLookupDict = Field (default = {'*' : 'self.on_get_abspath' }, exclude = True )
295
295
version_provider : ProviderLookupDict = Field (default = {'*' : 'self.on_get_version' }, exclude = True )
@@ -308,13 +308,13 @@ def __getattr__(self, item):
308
308
return super ().__getattr__ (item )
309
309
310
310
def __str__ (self ) -> str :
311
- return f'{ self .BIN .title ()} Provider[{ self .BIN_ABSPATH or self .BIN } )]'
311
+ return f'{ self .INSTALLER_BIN .title ()} Provider[{ self .INSTALLER_BIN_ABSPATH or self .INSTALLER_BIN } )]'
312
312
313
313
@computed_field
314
314
@property
315
- def BIN_ABSPATH (self ) -> HostBinPath | None :
315
+ def INSTALLER_BIN_ABSPATH (self ) -> HostBinPath | None :
316
316
"""Actual absolute path of the underlying package manager (e.g. /usr/local/bin/npm)"""
317
- abspath = bin_abspath (self .BIN , PATH = None ) or shutil .which (self .BIN ) # find self.BIN abspath using environment path
317
+ abspath = bin_abspath (self .INSTALLER_BIN , PATH = None ) or shutil .which (self .INSTALLER_BIN ) # find self.INSTALLER_BIN abspath using environment path
318
318
if not abspath :
319
319
# underlying package manager not found on this host, return None
320
320
return None
@@ -323,7 +323,7 @@ def BIN_ABSPATH(self) -> HostBinPath | None:
323
323
@computed_field
324
324
@property
325
325
def is_valid (self ) -> bool :
326
- return bool (self .BIN_ABSPATH )
326
+ return bool (self .INSTALLER_BIN_ABSPATH )
327
327
328
328
# def provider_version(self) -> SemVer | None:
329
329
# """Version of the actual underlying package manager (e.g. pip v20.4.1)"""
@@ -489,10 +489,10 @@ def on_get_packages(self, bin_name: BinName, **context) -> InstallArgs:
489
489
490
490
def on_install (self , bin_name : BinName , packages : Optional [InstallArgs ]= None , ** context ):
491
491
packages = packages or self .get_packages (bin_name )
492
- if not self .BIN_ABSPATH :
493
- raise Exception (f'{ self .name } install method is not available on this host ({ self .BIN } not found in $PATH)' )
492
+ if not self .INSTALLER_BIN_ABSPATH :
493
+ raise Exception (f'{ self .name } install method is not available on this host ({ self .INSTALLER_BIN } not found in $PATH)' )
494
494
495
- print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .BIN_ABSPATH } { packages } ' )
495
+ print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .INSTALLER_BIN_ABSPATH } { packages } ' )
496
496
# ... install logic here
497
497
assert True
498
498
@@ -611,7 +611,7 @@ def load_or_install(self, bin_name: BinName, overrides: Optional[ProviderLookupD
611
611
612
612
class PipProvider (BinProvider ):
613
613
name : BinProviderName = 'pip'
614
- BIN : BinName = 'pip'
614
+ INSTALLER_BIN : BinName = 'pip'
615
615
616
616
@field_validator ('PATH' , mode = 'after' )
617
617
@classmethod
@@ -628,12 +628,12 @@ def load_PATH(cls, PATH: PATHStr) -> PATHStr:
628
628
629
629
def on_install (self , bin_name : str , packages : Optional [InstallArgs ]= None , ** context ):
630
630
packages = packages or self .on_get_packages (bin_name )
631
- if not self .BIN_ABSPATH :
632
- raise Exception (f'{ self .__class__ .__name__ } install method is not available on this host ({ self .BIN } not found in $PATH)' )
631
+ if not self .INSTALLER_BIN_ABSPATH :
632
+ raise Exception (f'{ self .__class__ .__name__ } install method is not available on this host ({ self .INSTALLER_BIN } not found in $PATH)' )
633
633
634
- print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .BIN_ABSPATH } install { packages } ' )
634
+ print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .INSTALLER_BIN_ABSPATH } install { packages } ' )
635
635
636
- proc = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['install' , '--upgrade' , * packages ])
636
+ proc = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['install' , '--upgrade' , * packages ])
637
637
638
638
if proc .returncode != 0 :
639
639
print (proc .stdout .strip ())
@@ -642,19 +642,19 @@ def on_install(self, bin_name: str, packages: Optional[InstallArgs]=None, **cont
642
642
643
643
class NpmProvider (BinProvider ):
644
644
name : BinProviderName = 'npm'
645
- BIN : BinName = 'npm'
645
+ INSTALLER_BIN : BinName = 'npm'
646
646
647
647
@model_validator (mode = 'after' )
648
648
def load_PATH_from_npm_prefix (self ):
649
- if not self .BIN_ABSPATH :
649
+ if not self .INSTALLER_BIN_ABSPATH :
650
650
return TypeAdapter (PATHStr ).validate_python ('' )
651
651
652
652
PATH = self .PATH
653
653
654
- npm_global_dir = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['prefix' , '-g' ]).stdout .strip () + '/bin' # /opt/homebrew/bin
654
+ npm_global_dir = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['prefix' , '-g' ]).stdout .strip () + '/bin' # /opt/homebrew/bin
655
655
npm_bin_dirs = {npm_global_dir }
656
656
657
- search_dir = Path (self .exec (bin_name = self .BIN_ABSPATH , cmd = ['prefix' ]).stdout .strip ())
657
+ search_dir = Path (self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['prefix' ]).stdout .strip ())
658
658
stop_if_reached = [str (Path ('/' )), str (Path ('~' ).expanduser ().absolute ())]
659
659
num_hops , max_hops = 0 , 6
660
660
while num_hops < max_hops and str (search_dir ) not in stop_if_reached :
@@ -674,12 +674,12 @@ def load_PATH_from_npm_prefix(self):
674
674
675
675
def on_install (self , bin_name : str , packages : Optional [InstallArgs ]= None , ** context ):
676
676
packages = packages or self .on_get_packages (bin_name )
677
- if not self .BIN_ABSPATH :
678
- raise Exception (f'{ self .__class__ .__name__ } install method is not available on this host ({ self .BIN } not found in $PATH)' )
677
+ if not self .INSTALLER_BIN_ABSPATH :
678
+ raise Exception (f'{ self .__class__ .__name__ } install method is not available on this host ({ self .INSTALLER_BIN } not found in $PATH)' )
679
679
680
- print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .BIN_ABSPATH } install { packages } ' )
680
+ print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .INSTALLER_BIN_ABSPATH } install { packages } ' )
681
681
682
- proc = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['install' , * packages ])
682
+ proc = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['install' , * packages ])
683
683
684
684
if proc .returncode != 0 :
685
685
print (proc .stdout .strip ())
@@ -689,7 +689,7 @@ def on_install(self, bin_name: str, packages: Optional[InstallArgs]=None, **cont
689
689
690
690
class AptProvider (BinProvider ):
691
691
name : BinProviderName = 'apt'
692
- BIN : BinName = 'apt-get'
692
+ INSTALLER_BIN : BinName = 'apt-get'
693
693
694
694
packages_provider : ProviderLookupDict = {
695
695
** BinProvider .model_fields ['packages_provider' ].default ,
@@ -698,7 +698,7 @@ class AptProvider(BinProvider):
698
698
699
699
@model_validator (mode = 'after' )
700
700
def load_PATH_from_dpkg_install_location (self ):
701
- if not self .BIN_ABSPATH :
701
+ if not self .INSTALLER_BIN_ABSPATH :
702
702
# package manager is not available on this host
703
703
self .PATH = ''
704
704
return self
@@ -716,10 +716,10 @@ def load_PATH_from_dpkg_install_location(self):
716
716
def on_install (self , bin_name : BinName , packages : Optional [InstallArgs ]= None , ** context ):
717
717
packages = packages or self .on_get_packages (bin_name )
718
718
719
- if not (self .BIN_ABSPATH and shutil .which ('dpkg' ) and shutil .which ('apt-get' )):
720
- raise Exception (f'{ self .__class__ .__name__ } .BIN is not available on this host: { self .BIN } ' )
719
+ if not (self .INSTALLER_BIN_ABSPATH and shutil .which ('dpkg' ) and shutil .which ('apt-get' )):
720
+ raise Exception (f'{ self .__class__ .__name__ } .INSTALLER_BIN is not available on this host: { self .INSTALLER_BIN } ' )
721
721
722
- print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .BIN } install { packages } ' )
722
+ print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .INSTALLER_BIN } install { packages } ' )
723
723
try :
724
724
# if pyinfra is installed, use it
725
725
from pyinfra .operations import apt
@@ -737,8 +737,8 @@ def on_install(self, bin_name: BinName, packages: Optional[InstallArgs]=None, **
737
737
_sudo = True ,
738
738
)
739
739
except (ImportError , ModuleNotFoundError ):
740
- self .exec (bin_name = self .BIN_ABSPATH , cmd = ['update' , '-qq' ])
741
- proc = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['install' , '-y' , * packages ])
740
+ self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['update' , '-qq' ])
741
+ proc = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['install' , '-y' , * packages ])
742
742
743
743
if proc .returncode != 0 :
744
744
print (proc .stdout .strip ())
@@ -747,18 +747,18 @@ def on_install(self, bin_name: BinName, packages: Optional[InstallArgs]=None, **
747
747
748
748
class BrewProvider (BinProvider ):
749
749
name : BinProviderName = 'brew'
750
- BIN : BinName = 'brew'
750
+ INSTALLER_BIN : BinName = 'brew'
751
751
PATH : PATHStr = '/opt/homebrew/bin:/usr/local/bin'
752
752
753
753
@model_validator (mode = 'after' )
754
754
def load_PATH (self ):
755
- if not self .BIN_ABSPATH :
755
+ if not self .INSTALLER_BIN_ABSPATH :
756
756
# brew is not availabe on this host
757
757
self .PATH = ''
758
758
return self
759
759
760
760
PATH = self .PATH
761
- brew_bin_dir = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['--prefix' ]).stdout .strip () + '/bin'
761
+ brew_bin_dir = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['--prefix' ]).stdout .strip () + '/bin'
762
762
if brew_bin_dir not in PATH :
763
763
PATH = ':' .join ([brew_bin_dir , * PATH .split (':' )])
764
764
self .PATH = TypeAdapter (PATHStr ).validate_python (PATH )
@@ -767,11 +767,11 @@ def load_PATH(self):
767
767
def on_install (self , bin_name : str , packages : Optional [InstallArgs ]= None , ** context ):
768
768
packages = packages or self .on_get_packages (bin_name )
769
769
770
- if not self .BIN_ABSPATH :
771
- raise Exception (f'{ self .__class__ .__name__ } .BIN is not available on this host: { self .BIN } ' )
770
+ if not self .INSTALLER_BIN_ABSPATH :
771
+ raise Exception (f'{ self .__class__ .__name__ } .INSTALLER_BIN is not available on this host: { self .INSTALLER_BIN } ' )
772
772
773
- print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .BIN_ABSPATH } install { packages } ' )
774
- proc = self .exec (bin_name = self .BIN_ABSPATH , cmd = ['install' , * packages ])
773
+ print (f'[*] { self .__class__ .__name__ } : Installing { bin_name } : { self .INSTALLER_BIN_ABSPATH } install { packages } ' )
774
+ proc = self .exec (bin_name = self .INSTALLER_BIN_ABSPATH , cmd = ['install' , * packages ])
775
775
776
776
if proc .returncode != 0 :
777
777
print (proc .stdout .strip ())
@@ -788,7 +788,7 @@ def on_install(self, bin_name: str, packages: Optional[InstallArgs]=None, **cont
788
788
789
789
class EnvProvider (BinProvider ):
790
790
name : BinProviderName = 'env'
791
- BIN : BinName = 'env'
791
+ INSTALLER_BIN : BinName = 'env'
792
792
PATH : PATHStr = Field (default = DEFAULT_ENV_PATH ) # add dir containing python to $PATH
793
793
794
794
abspath_provider : ProviderLookupDict = {
0 commit comments