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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,,