ominfra 0.0.0.dev176__py3-none-any.whl → 0.0.0.dev178__py3-none-any.whl

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.
@@ -37,6 +37,7 @@ import base64
37
37
  import collections
38
38
  import collections.abc
39
39
  import contextlib
40
+ import contextvars
40
41
  import ctypes as ct
41
42
  import dataclasses as dc
42
43
  import datetime
@@ -4070,6 +4071,10 @@ class InjectorBinding:
4070
4071
  key: InjectorKey
4071
4072
  provider: InjectorProvider
4072
4073
 
4074
+ def __post_init__(self) -> None:
4075
+ check.isinstance(self.key, InjectorKey)
4076
+ check.isinstance(self.provider, InjectorProvider)
4077
+
4073
4078
 
4074
4079
  class InjectorBindings(abc.ABC):
4075
4080
  @abc.abstractmethod
@@ -4333,6 +4338,164 @@ def build_injector_provider_map(bs: InjectorBindings) -> ta.Mapping[InjectorKey,
4333
4338
  return pm
4334
4339
 
4335
4340
 
4341
+ ###
4342
+ # scopes
4343
+
4344
+
4345
+ class InjectorScope(abc.ABC): # noqa
4346
+ def __init__(
4347
+ self,
4348
+ *,
4349
+ _i: Injector,
4350
+ ) -> None:
4351
+ check.not_in(abc.ABC, type(self).__bases__)
4352
+
4353
+ super().__init__()
4354
+
4355
+ self._i = _i
4356
+
4357
+ all_seeds: ta.Iterable[_InjectorScopeSeed] = self._i.provide(InjectorKey(_InjectorScopeSeed, array=True))
4358
+ self._sks = {s.k for s in all_seeds if s.sc is type(self)}
4359
+
4360
+ #
4361
+
4362
+ @dc.dataclass(frozen=True)
4363
+ class State:
4364
+ seeds: ta.Dict[InjectorKey, ta.Any]
4365
+ prvs: ta.Dict[InjectorKey, ta.Any] = dc.field(default_factory=dict)
4366
+
4367
+ def new_state(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> State:
4368
+ vs = dict(vs)
4369
+ check.equal(set(vs.keys()), self._sks)
4370
+ return InjectorScope.State(vs)
4371
+
4372
+ #
4373
+
4374
+ @abc.abstractmethod
4375
+ def state(self) -> State:
4376
+ raise NotImplementedError
4377
+
4378
+ @abc.abstractmethod
4379
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.ContextManager[None]:
4380
+ raise NotImplementedError
4381
+
4382
+
4383
+ class ExclusiveInjectorScope(InjectorScope, abc.ABC):
4384
+ _st: ta.Optional[InjectorScope.State] = None
4385
+
4386
+ def state(self) -> InjectorScope.State:
4387
+ return check.not_none(self._st)
4388
+
4389
+ @contextlib.contextmanager
4390
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.Iterator[None]:
4391
+ check.none(self._st)
4392
+ self._st = self.new_state(vs)
4393
+ try:
4394
+ yield
4395
+ finally:
4396
+ self._st = None
4397
+
4398
+
4399
+ class ContextvarInjectorScope(InjectorScope, abc.ABC):
4400
+ _cv: contextvars.ContextVar
4401
+
4402
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
4403
+ super().__init_subclass__(**kwargs)
4404
+ check.not_in(abc.ABC, cls.__bases__)
4405
+ check.state(not hasattr(cls, '_cv'))
4406
+ cls._cv = contextvars.ContextVar(f'{cls.__name__}_cv')
4407
+
4408
+ def state(self) -> InjectorScope.State:
4409
+ return self._cv.get()
4410
+
4411
+ @contextlib.contextmanager
4412
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.Iterator[None]:
4413
+ try:
4414
+ self._cv.get()
4415
+ except LookupError:
4416
+ pass
4417
+ else:
4418
+ raise RuntimeError(f'Scope already entered: {self}')
4419
+ st = self.new_state(vs)
4420
+ tok = self._cv.set(st)
4421
+ try:
4422
+ yield
4423
+ finally:
4424
+ self._cv.reset(tok)
4425
+
4426
+
4427
+ #
4428
+
4429
+
4430
+ @dc.dataclass(frozen=True)
4431
+ class ScopedInjectorProvider(InjectorProvider):
4432
+ p: InjectorProvider
4433
+ k: InjectorKey
4434
+ sc: ta.Type[InjectorScope]
4435
+
4436
+ def __post_init__(self) -> None:
4437
+ check.isinstance(self.p, InjectorProvider)
4438
+ check.isinstance(self.k, InjectorKey)
4439
+ check.issubclass(self.sc, InjectorScope)
4440
+
4441
+ def provider_fn(self) -> InjectorProviderFn:
4442
+ def pfn(i: Injector) -> ta.Any:
4443
+ st = i[self.sc].state()
4444
+ try:
4445
+ return st.prvs[self.k]
4446
+ except KeyError:
4447
+ pass
4448
+ v = ufn(i)
4449
+ st.prvs[self.k] = v
4450
+ return v
4451
+
4452
+ ufn = self.p.provider_fn()
4453
+ return pfn
4454
+
4455
+
4456
+ @dc.dataclass(frozen=True)
4457
+ class _ScopeSeedInjectorProvider(InjectorProvider):
4458
+ k: InjectorKey
4459
+ sc: ta.Type[InjectorScope]
4460
+
4461
+ def __post_init__(self) -> None:
4462
+ check.isinstance(self.k, InjectorKey)
4463
+ check.issubclass(self.sc, InjectorScope)
4464
+
4465
+ def provider_fn(self) -> InjectorProviderFn:
4466
+ def pfn(i: Injector) -> ta.Any:
4467
+ st = i[self.sc].state()
4468
+ return st.seeds[self.k]
4469
+ return pfn
4470
+
4471
+
4472
+ def bind_injector_scope(sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
4473
+ return as_injector_bindings(
4474
+ InjectorBinder.bind(sc, singleton=True),
4475
+ )
4476
+
4477
+
4478
+ #
4479
+
4480
+
4481
+ @dc.dataclass(frozen=True)
4482
+ class _InjectorScopeSeed:
4483
+ sc: ta.Type['InjectorScope']
4484
+ k: InjectorKey
4485
+
4486
+ def __post_init__(self) -> None:
4487
+ check.issubclass(self.sc, InjectorScope)
4488
+ check.isinstance(self.k, InjectorKey)
4489
+
4490
+
4491
+ def bind_injector_scope_seed(k: ta.Any, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
4492
+ kk = as_injector_key(k)
4493
+ return as_injector_bindings(
4494
+ InjectorBinding(kk, _ScopeSeedInjectorProvider(kk, sc)),
4495
+ InjectorBinder.bind(_InjectorScopeSeed(sc, kk), array=True),
4496
+ )
4497
+
4498
+
4336
4499
  ###
4337
4500
  # inspection
4338
4501
 
@@ -4477,13 +4640,21 @@ _INJECTOR_EAGER_ARRAY_KEY: InjectorKey[_InjectorEager] = InjectorKey(_InjectorEa
4477
4640
 
4478
4641
 
4479
4642
  class _Injector(Injector):
4643
+ _DEFAULT_BINDINGS: ta.ClassVar[ta.List[InjectorBinding]] = []
4644
+
4480
4645
  def __init__(self, bs: InjectorBindings, p: ta.Optional[Injector] = None) -> None:
4481
4646
  super().__init__()
4482
4647
 
4483
4648
  self._bs = check.isinstance(bs, InjectorBindings)
4484
4649
  self._p: ta.Optional[Injector] = check.isinstance(p, (Injector, type(None)))
4485
4650
 
4486
- self._pfm = {k: v.provider_fn() for k, v in build_injector_provider_map(bs).items()}
4651
+ self._pfm = {
4652
+ k: v.provider_fn()
4653
+ for k, v in build_injector_provider_map(as_injector_bindings(
4654
+ *self._DEFAULT_BINDINGS,
4655
+ bs,
4656
+ )).items()
4657
+ }
4487
4658
 
4488
4659
  if _INJECTOR_INJECTOR_KEY in self._pfm:
4489
4660
  raise DuplicateInjectorKeyError(_INJECTOR_INJECTOR_KEY)
@@ -4650,6 +4821,7 @@ class InjectorBinder:
4650
4821
  to_const: ta.Any = None,
4651
4822
  to_key: ta.Any = None,
4652
4823
 
4824
+ in_: ta.Optional[ta.Type[InjectorScope]] = None,
4653
4825
  singleton: bool = False,
4654
4826
 
4655
4827
  eager: bool = False,
@@ -4659,12 +4831,12 @@ class InjectorBinder:
4659
4831
  if isinstance(obj, cls._BANNED_BIND_TYPES):
4660
4832
  raise TypeError(obj)
4661
4833
 
4662
- ##
4834
+ #
4663
4835
 
4664
4836
  if key is not None:
4665
4837
  key = as_injector_key(key)
4666
4838
 
4667
- ##
4839
+ #
4668
4840
 
4669
4841
  has_to = (
4670
4842
  to_fn is not None or
@@ -4694,7 +4866,7 @@ class InjectorBinder:
4694
4866
  key = InjectorKey(type(obj))
4695
4867
  del has_to
4696
4868
 
4697
- ##
4869
+ #
4698
4870
 
4699
4871
  if tag is not None:
4700
4872
  if key.tag is not None:
@@ -4704,7 +4876,7 @@ class InjectorBinder:
4704
4876
  if array is not None:
4705
4877
  key = dc.replace(key, array=array)
4706
4878
 
4707
- ##
4879
+ #
4708
4880
 
4709
4881
  providers: ta.List[InjectorProvider] = []
4710
4882
  if to_fn is not None:
@@ -4719,23 +4891,34 @@ class InjectorBinder:
4719
4891
  raise TypeError('Must specify provider')
4720
4892
  if len(providers) > 1:
4721
4893
  raise TypeError('May not specify multiple providers')
4722
- provider, = providers
4894
+ provider = check.single(providers)
4723
4895
 
4724
- ##
4896
+ #
4725
4897
 
4898
+ pws: ta.List[ta.Any] = []
4899
+ if in_ is not None:
4900
+ check.issubclass(in_, InjectorScope)
4901
+ check.not_in(abc.ABC, in_.__bases__)
4902
+ pws.append(functools.partial(ScopedInjectorProvider, k=key, sc=in_))
4726
4903
  if singleton:
4727
- provider = SingletonInjectorProvider(provider)
4904
+ pws.append(SingletonInjectorProvider)
4905
+ if len(pws) > 1:
4906
+ raise TypeError('May not specify multiple provider wrappers')
4907
+ elif pws:
4908
+ provider = check.single(pws)(provider)
4909
+
4910
+ #
4728
4911
 
4729
4912
  binding = InjectorBinding(key, provider)
4730
4913
 
4731
- ##
4914
+ #
4732
4915
 
4733
4916
  extras: ta.List[InjectorBinding] = []
4734
4917
 
4735
4918
  if eager:
4736
4919
  extras.append(bind_injector_eager_key(key))
4737
4920
 
4738
- ##
4921
+ #
4739
4922
 
4740
4923
  if extras:
4741
4924
  return as_injector_bindings(binding, *extras)
@@ -4808,7 +4991,8 @@ def bind_injector_eager_key(key: ta.Any) -> InjectorBinding:
4808
4991
  return InjectorBinding(_INJECTOR_EAGER_ARRAY_KEY, ConstInjectorProvider(_InjectorEager(as_injector_key(key))))
4809
4992
 
4810
4993
 
4811
- ##
4994
+ ###
4995
+ # api
4812
4996
 
4813
4997
 
4814
4998
  class InjectionApi:
@@ -4831,6 +5015,14 @@ class InjectionApi:
4831
5015
  def override(self, p: InjectorBindings, *args: InjectorBindingOrBindings) -> InjectorBindings:
4832
5016
  return injector_override(p, *args)
4833
5017
 
5018
+ # scopes
5019
+
5020
+ def bind_scope(self, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
5021
+ return bind_injector_scope(sc)
5022
+
5023
+ def bind_scope_seed(self, k: ta.Any, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
5024
+ return bind_injector_scope_seed(k, sc)
5025
+
4834
5026
  # injector
4835
5027
 
4836
5028
  def create_injector(self, *args: InjectorBindingOrBindings, parent: ta.Optional[Injector] = None) -> Injector:
@@ -4851,6 +5043,7 @@ class InjectionApi:
4851
5043
  to_const: ta.Any = None,
4852
5044
  to_key: ta.Any = None,
4853
5045
 
5046
+ in_: ta.Optional[ta.Type[InjectorScope]] = None,
4854
5047
  singleton: bool = False,
4855
5048
 
4856
5049
  eager: bool = False,
@@ -4867,6 +5060,7 @@ class InjectionApi:
4867
5060
  to_const=to_const,
4868
5061
  to_key=to_key,
4869
5062
 
5063
+ in_=in_,
4870
5064
  singleton=singleton,
4871
5065
 
4872
5066
  eager=eager,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev176
3
+ Version: 0.0.0.dev178
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev176
16
- Requires-Dist: omlish==0.0.0.dev176
15
+ Requires-Dist: omdev==0.0.0.dev178
16
+ Requires-Dist: omlish==0.0.0.dev178
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -33,7 +33,7 @@ ominfra/manage/bootstrap.py,sha256=1RIRhVkUZjxZcZerHMg8U6xgWhhemGgPN5cDye8dQ68,4
33
33
  ominfra/manage/bootstrap_.py,sha256=B9UfR9J7mS3J54PFaSe1MQS5lCnKgxt5dDRJ9mnHYwg,656
34
34
  ominfra/manage/config.py,sha256=1y2N_8nXHBZc6YbW6BaRZoDDCTBmiHuWtTOQ7zdr5VE,184
35
35
  ominfra/manage/inject.py,sha256=_FVaMZUBKi-oObv14H77luWYCodxNJJD1t4pNQzckFE,2030
36
- ominfra/manage/main.py,sha256=LwtkPvnNWH87kxkZOlU925HqVlMtt-nQHHJ8koUYE3E,4564
36
+ ominfra/manage/main.py,sha256=6KulKJqgKHl_wdWEOdY9btoI-pq11tDFqugsUtOpW8A,4389
37
37
  ominfra/manage/marshal.py,sha256=WKj7IU9bo4fBMSSzT6ZMm_WFalXIJZ-V7j8oi92fNhk,305
38
38
  ominfra/manage/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  ominfra/manage/commands/base.py,sha256=LtaI0AgnplttQK7gNncNItq8yuTZQimJTaprVpZktI8,3993
@@ -44,23 +44,24 @@ ominfra/manage/commands/ping.py,sha256=DVZFzL1Z_f-Bq53vxMrL3xOi0iK_nMonJE4KvQf9w
44
44
  ominfra/manage/commands/subprocess.py,sha256=yHGMbAI-xKe_9BUs5IZ3Yav8qRE-I9aGnBtTwW15Pnw,2440
45
45
  ominfra/manage/commands/types.py,sha256=XFZPeqeIBAaIIQF3pdPbGxLlb-LCrz6WtlDWO2q_vz0,210
46
46
  ominfra/manage/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- ominfra/manage/deploy/apps.py,sha256=lowBeJICKMT6CNi7JULd0EbYVatmJRxVgIjTpnqnmgc,4819
48
- ominfra/manage/deploy/commands.py,sha256=fKFKhFwqIqC_PsgA-W66qIJ5S32xRgBBaRt3lbPX5Zg,763
49
- ominfra/manage/deploy/conf.py,sha256=cGu9q-mtbBsBXydTGrNE11NGyYdxbn7aPiGx28rxhsg,5639
50
- ominfra/manage/deploy/config.py,sha256=aR6ubMEWqkTI55XtcG1Cczn6YhCVN6eSL8DT5EHQJN0,166
51
- ominfra/manage/deploy/deploy.py,sha256=zEcuwH7Sj3Z5Wb5U9RDqEG8CHaOZVhGpPBBTGGER2j4,1672
52
- ominfra/manage/deploy/git.py,sha256=cfTCx1qD-FQPFkbYW28tkU8nVxQbnfnWxpuJuGQHtBw,3753
53
- ominfra/manage/deploy/inject.py,sha256=kzGl2N2jhijUw4-PYUK1LNG8_MJD7BMgCbi6nDViMWg,1965
47
+ ominfra/manage/deploy/apps.py,sha256=LeZ2iX2YHviOAnvgut7Oz15301eJoYYCpmD3ffoIagA,4742
48
+ ominfra/manage/deploy/commands.py,sha256=U74HYQ4nhvH7znAKyXGOmZfdnll2gMWxKWVW4GzxG-0,830
49
+ ominfra/manage/deploy/conf.py,sha256=fNfFlIb-bB3KAzaYZcjrbqaqKSiSq0Lpk0mIF6WgXiw,5410
50
+ ominfra/manage/deploy/config.py,sha256=kPpl8TRisz295cM4oj-RHA6oh5jdcJ_N9pVpkl_doO8,114
51
+ ominfra/manage/deploy/deploy.py,sha256=vyBTbBm51HhRE-MQNvxEt39F8uOYsB4ToqZ3zmVkpqU,819
52
+ ominfra/manage/deploy/driver.py,sha256=ccLiVoZz_GnhQ3FRPFCu9hzsU6wsOWTOmHeYNBRIZkg,1576
53
+ ominfra/manage/deploy/git.py,sha256=g4wzUuSu9HwWSDhdVX-7BvA2htMwtWbRcHaoDy-xOJ4,3960
54
+ ominfra/manage/deploy/inject.py,sha256=JHQexbf-789mWL8GTSxyd4SnTbDB0nqwSyiJp-3QvAM,2834
54
55
  ominfra/manage/deploy/interp.py,sha256=OKkenH8YKEW_mEDR6X7_ZLxK9a1Ox6KHSwFPTHT6OzA,1029
55
- ominfra/manage/deploy/specs.py,sha256=XIEOdLwULFprLajjzX6Qf_T3wVvEWeC4tIZgYbycCHI,3656
56
+ ominfra/manage/deploy/specs.py,sha256=usi5AmTlv8OGFcwhVHnu8Qrz1Criu5QP6_ScNMi9ehM,3748
56
57
  ominfra/manage/deploy/tags.py,sha256=NVEJhHKMwoDuCFd8lInH_jIe99FQILBX3wrulh3GiDg,5166
57
- ominfra/manage/deploy/tmp.py,sha256=dFJuqGfSf5otCxSaCI01a5UOSaArMlU4MzzYcyr74-s,1237
58
+ ominfra/manage/deploy/tmp.py,sha256=FqXoVpIpVe8-KWNu7kXt37A4jKdK_y7h_YFvtrUoOG8,729
58
59
  ominfra/manage/deploy/types.py,sha256=ZcIoheZ3zW7n0IZiqTRW_Uo3JyWWeWg5nyKGryvGc2I,112
59
- ominfra/manage/deploy/venvs.py,sha256=XJ6wellka8xpCWf4BAEb3BPwyHummFpSdHGKx4sv1I4,1741
60
+ ominfra/manage/deploy/venvs.py,sha256=h_9Bb4NpvXqO2Hb5t_5qbWs3zfMDPfmKZvMACJ4CY5M,1584
60
61
  ominfra/manage/deploy/paths/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
62
  ominfra/manage/deploy/paths/inject.py,sha256=X81C-Qhef1LQ7tILWvkomBwFTvgooLVmWRnKL7TeVoI,596
62
- ominfra/manage/deploy/paths/manager.py,sha256=gxr_CsjLmjxXx8w3J8ookJk9OGltCpyBFYBnxXaw5lg,1050
63
- ominfra/manage/deploy/paths/owners.py,sha256=GmLy0E70C8CF3eYIdkAhBtYaZXW4QWmSzvgts5l1i_4,1379
63
+ ominfra/manage/deploy/paths/manager.py,sha256=Dnl8euyZQYDGwDzkMvgPAwOssseducr5kP6T0qzVXQk,929
64
+ ominfra/manage/deploy/paths/owners.py,sha256=sgCdKOFve8XZOtoTjrFrOrJd_MhZOGXo4yFJAFGRQ_s,1229
64
65
  ominfra/manage/deploy/paths/paths.py,sha256=i7g8YdYOh4M_jgJXtafTbFkRhlu469cfGxAJAuB3fVY,5531
65
66
  ominfra/manage/deploy/paths/types.py,sha256=TGgtSASmdyuZ2maZnvahfA0QxPLWlHBtpDeIEoEDGxk,112
66
67
  ominfra/manage/remote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -86,8 +87,8 @@ ominfra/manage/targets/inject.py,sha256=P4597xWM-V3I_gCt2O71OLhYQkkXtuJvkYRsIbhh
86
87
  ominfra/manage/targets/targets.py,sha256=7GP6UAZyJFEhpkJN6UQdpr_WN3p7C76v-s445y-WB6U,1885
87
88
  ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
89
  ominfra/scripts/journald2aws.py,sha256=yEnBAd0Q_3lBkVoTvlJ_uCcUxz7Ckn2qoSWZVhMihvQ,157696
89
- ominfra/scripts/manage.py,sha256=Ight37o5Hq0-DRssyDmEtAw5-rF2kI3_hAin72YIj58,318454
90
- ominfra/scripts/supervisor.py,sha256=9pEop3S5txoA2Gip9mcOrOJWFjMJVXCH6-NKYYnOVic,276462
90
+ ominfra/scripts/manage.py,sha256=XDt86ZEFjcShexhLQjmse1N6f_dk7AVVtozzETsNUdY,324293
91
+ ominfra/scripts/supervisor.py,sha256=6RMBLbB4pMNaJlnOBwhdpuhMqv6NDrjTup9SYzKsEjo,281844
91
92
  ominfra/supervisor/LICENSE.txt,sha256=yvqaMNsDhWxziHa9ien6qCW1SkZv-DQlAg96XjfSee8,1746
92
93
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
93
94
  ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
@@ -129,9 +130,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
129
130
  ominfra/tailscale/cli.py,sha256=h6akQJMl0KuWLHS7Ur6WcBZ2JwF0DJQhsPTnFBdGyNk,3571
130
131
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
132
  ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
132
- ominfra-0.0.0.dev176.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
133
- ominfra-0.0.0.dev176.dist-info/METADATA,sha256=pHdVlfo1mvUMcaCwCqtlhJsRy6azW5Ra87B2Fwwt7vU,731
134
- ominfra-0.0.0.dev176.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
135
- ominfra-0.0.0.dev176.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
136
- ominfra-0.0.0.dev176.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
137
- ominfra-0.0.0.dev176.dist-info/RECORD,,
133
+ ominfra-0.0.0.dev178.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
134
+ ominfra-0.0.0.dev178.dist-info/METADATA,sha256=Kfw95dyWOXq2P3oSLxG3ObbDVl139_CQAnrZy5k6QtE,731
135
+ ominfra-0.0.0.dev178.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
136
+ ominfra-0.0.0.dev178.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
137
+ ominfra-0.0.0.dev178.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
138
+ ominfra-0.0.0.dev178.dist-info/RECORD,,