@@ -44,33 +44,34 @@ from pydantic_pkgr import *
44
44
apt, brew, pip, npm, env = AptProvider(), BrewProvider(), PipProvider(), NpmProvider(), EnvProvider()
45
45
46
46
dependencies = [
47
- Binary(name = ' curl' , providers = [env, apt, brew]),
48
- Binary(name = ' wget' , providers = [env, apt, brew]),
49
- Binary(name = ' yt-dlp' , providers = [env, pip, apt, brew]),
50
- Binary(name = ' playwright' , providers = [env, pip, npm]),
51
- Binary(name = ' puppeteer' , providers = [env, npm]),
47
+ Binary(name = ' curl' , binproviders = [env, apt, brew]),
48
+ Binary(name = ' wget' , binproviders = [env, apt, brew]),
49
+ Binary(name = ' yt-dlp' , binproviders = [env, pip, apt, brew]),
50
+ Binary(name = ' playwright' , binproviders = [env, pip, npm]),
51
+ Binary(name = ' puppeteer' , binproviders = [env, npm]),
52
52
]
53
53
for binary in dependencies:
54
54
binary = binary.load_or_install()
55
55
56
- print (binary.abspath, binary.version, binary.provider , binary.is_valid)
57
- # Path('/usr/bin/curl') SemVer('7.81.0') 'apt' True
56
+ print (binary.abspath, binary.version, binary.binprovider , binary.is_valid)
57
+ # Path('/usr/bin/curl') SemVer('7.81.0') AptProvider() True
58
58
59
59
binary.exec(cmd = [' --version' ]) # curl 7.81.0 (x86_64-apple-darwin23.0) libcurl/7.81.0 ...
60
60
```
61
61
62
62
``` python
63
+ from pydantic import InstanceOf
63
64
from pydantic_pkgr import Binary, BinProvider, BrewProvider, EnvProvider
64
65
65
66
# you can also define binaries as classes, making them usable for type checking
66
67
class CurlBinary (Binary ):
67
68
name: str = ' curl'
68
- providers: list[ BinProvider] = [BrewProvider(), EnvProvider()]
69
+ binproviders: List[InstanceOf[ BinProvider] ] = [BrewProvider(), EnvProvider()]
69
70
70
71
curl = CurlBinary().install()
71
- assert isinstance (curl, CurlBinary) # CurlBinary is a unique type you can use in annotations now
72
- print (curl.abspath, curl.version, curl.provider , curl.is_valid) # Path('/opt/homebrew/bin/curl') SemVer('8.4.0') 'brew' True
73
- curl.exec(cmd = [' --version' ]) # curl 8.4.0 (x86_64-apple-darwin23.0) libcurl/8.4.0 ...
72
+ assert isinstance (curl, CurlBinary) # CurlBinary is a unique type you can use in annotations now
73
+ print (curl.abspath, curl.version, curl.binprovider , curl.is_valid) # Path('/opt/homebrew/bin/curl') SemVer('8.4.0') BrewProvider() True
74
+ curl.exec(cmd = [' --version' ]) # curl 8.4.0 (x86_64-apple-darwin23.0) libcurl/8.4.0 ...
74
75
```
75
76
76
77
``` python
@@ -150,7 +151,7 @@ curl.exec(['--version']) # curl 7.81.0 (x86_64-pc-linux-gnu) libcur
150
151
151
152
# ## Example: Finding/Installing django with pip (w/ customized binpath resolution behavior)
152
153
pip = PipProvider(
153
- abspath_provider = {' *' : lambda bin_name , ** context : inspect.getfile(bin_name)}, # use python inspect to get path instead of os.which
154
+ abspath_handler = {' *' : lambda bin_name , ** context : inspect.getfile(bin_name)}, # use python inspect to get path instead of os.which
154
155
)
155
156
django_bin = pip.load_or_install(bin_name = ' django' )
156
157
print (django_bin.abspath) # Path('/usr/lib/python3.10/site-packages/django/__init__.py')
@@ -164,7 +165,7 @@ It can define one or more `BinProvider`s that it supports, along with overrides
164
165
165
166
` Binary ` s implement the following interface:
166
167
- ` load() ` , ` install() ` , ` load_or_install() ` ` -> ` ` Binary `
167
- - ` provider: BinProviderName ` ( ` BinProviderName == str ` )
168
+ - ` binprovider: InstanceOf[BinProvider] `
168
169
- ` abspath: Path `
169
170
- ` abspaths: List[Path] `
170
171
- ` version: SemVer `
@@ -177,7 +178,7 @@ class YtdlpBinary(Binary):
177
178
name: BinName = ' ytdlp'
178
179
description: str = ' YT-DLP (Replacement for YouTube-DL) Media Downloader'
179
180
180
- providers_supported : List[BinProvider] = [EnvProvider(), PipProvider(), AptProvider(), BrewProvider()]
181
+ binproviders_supported : List[BinProvider] = [EnvProvider(), PipProvider(), AptProvider(), BrewProvider()]
181
182
182
183
# customize installed package names for specific package managers
183
184
provider_overrides: Dict[BinProviderName, ProviderLookupDict] = {
@@ -187,7 +188,7 @@ class YtdlpBinary(Binary):
187
188
}
188
189
189
190
ytdlp = YtdlpBinary().load_or_install()
190
- print (ytdlp.provider ) # 'brew'
191
+ print (ytdlp.binprovider ) # BrewProvider(...)
191
192
print (ytdlp.abspath) # Path('/opt/homebrew/bin/yt-dlp')
192
193
print (ytdlp.abspaths) # [Path('/opt/homebrew/bin/yt-dlp'), Path('/usr/local/bin/yt-dlp')]
193
194
print (ytdlp.version) # SemVer('2024.4.9')
@@ -201,7 +202,7 @@ from pydantic_pkgr import BinProvider, Binary, BinProviderName, BinName, Provide
201
202
class DockerBinary (Binary ):
202
203
name: BinName = ' docker'
203
204
204
- providers_supported : List[BinProvider] = [EnvProvider(), AptProvider()]
205
+ binproviders_supported : List[BinProvider] = [EnvProvider(), AptProvider()]
205
206
206
207
provider_overrides: Dict[BinProviderName, ProviderLookupDict] = {
207
208
' env' : {
@@ -219,7 +220,7 @@ class DockerBinary(Binary):
219
220
}
220
221
221
222
docker = DockerBinary().load_or_install()
222
- print (docker.provider ) # 'env'
223
+ print (docker.binprovider ) # EnvProvider()
223
224
print (docker.abspath) # Path('/usr/local/bin/podman')
224
225
print (docker.abspaths) # [Path('/usr/local/bin/podman'), Path('/opt/homebrew/bin/podman')]
225
226
print (docker.version) # SemVer('6.0.2')
@@ -229,7 +230,7 @@ print(docker.is_valid) # True
229
230
# e.g. if you want to force the abspath to be at a specific path:
230
231
custom_docker = DockerBinary(abspath = ' ~/custom/bin/podman' ).load()
231
232
print (custom_docker.name) # 'docker'
232
- print (custom_docker.provider ) # 'env'
233
+ print (custom_docker.binprovider ) # EnvProvider()
233
234
print (custom_docker.abspath) # Path('/Users/example/custom/bin/podman')
234
235
print (custom_docker.version) # SemVer('5.0.2')
235
236
print (custom_docker.is_valid) # True
@@ -282,15 +283,16 @@ pip install django-pydantic-field
282
283
283
284
Example Django `models.py` showing how to store `Binary` and `BinProvider` instances in DB fields:
284
285
```python
286
+ from typing import List
285
287
from django.db import models
286
- from django_pydantic_field import SchemaField
287
-
288
+ from pydantic import InstanceOf
288
289
from pydantic_pkgr import BinProvider, Binary, SemVer
290
+ from django_pydantic_field import SchemaField
289
291
290
292
class InstalledBinary(models.Model):
291
293
name = models.CharField(max_length = 63 )
292
294
binary: Binary = SchemaField()
293
- providers: list[ BinProvider] = SchemaField(default = [])
295
+ binproviders: List[InstanceOf[ BinProvider] ] = SchemaField(default = [])
294
296
version: SemVer = SchemaField(default = (0 ,0 ,1 ))
295
297
```
296
298
@@ -303,7 +305,7 @@ curl = Binary(name='curl').load()
303
305
obj = InstalledBinary(
304
306
name = ' curl' ,
305
307
binary = curl, # store Binary/BinProvider/SemVer values directly in fields
306
- providers = [env], # no need for manual JSON serialization / schema checking
308
+ binproviders = [env], # no need for manual JSON serialization / schema checking
307
309
min_version = SemVer(' 6.5.0' ),
308
310
)
309
311
obj.save()
@@ -454,7 +456,7 @@ class CargoProvider(BinProvider):
454
456
455
457
cargo = CargoProvider()
456
458
rg = cargo.install(bin_name = ' ripgrep' )
457
- print (rg.provider ) # 'cargo'
459
+ print (rg.binprovider ) # CargoProvider()
458
460
print (rg.version) # SemVer(14, 1, 0)
459
461
```
460
462
0 commit comments