ominfra 0.0.0.dev177__py3-none-any.whl → 0.0.0.dev179__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
@@ -4286,6 +4291,33 @@ def as_injector_bindings(*args: InjectorBindingOrBindings) -> InjectorBindings:
4286
4291
  ##
4287
4292
 
4288
4293
 
4294
+ def build_injector_provider_map(bs: InjectorBindings) -> ta.Mapping[InjectorKey, InjectorProvider]:
4295
+ pm: ta.Dict[InjectorKey, InjectorProvider] = {}
4296
+ am: ta.Dict[InjectorKey, ta.List[InjectorProvider]] = {}
4297
+
4298
+ for b in bs.bindings():
4299
+ if b.key.array:
4300
+ al = am.setdefault(b.key, [])
4301
+ if isinstance(b.provider, ArrayInjectorProvider):
4302
+ al.extend(b.provider.ps)
4303
+ else:
4304
+ al.append(b.provider)
4305
+ else:
4306
+ if b.key in pm:
4307
+ raise KeyError(b.key)
4308
+ pm[b.key] = b.provider
4309
+
4310
+ if am:
4311
+ for k, aps in am.items():
4312
+ pm[k] = ArrayInjectorProvider(aps)
4313
+
4314
+ return pm
4315
+
4316
+
4317
+ ###
4318
+ # overrides
4319
+
4320
+
4289
4321
  @dc.dataclass(frozen=True)
4290
4322
  class OverridesInjectorBindings(InjectorBindings):
4291
4323
  p: InjectorBindings
@@ -4307,30 +4339,160 @@ def injector_override(p: InjectorBindings, *args: InjectorBindingOrBindings) ->
4307
4339
  return OverridesInjectorBindings(p, m)
4308
4340
 
4309
4341
 
4310
- ##
4342
+ ###
4343
+ # scopes
4311
4344
 
4312
4345
 
4313
- def build_injector_provider_map(bs: InjectorBindings) -> ta.Mapping[InjectorKey, InjectorProvider]:
4314
- pm: ta.Dict[InjectorKey, InjectorProvider] = {}
4315
- am: ta.Dict[InjectorKey, ta.List[InjectorProvider]] = {}
4346
+ class InjectorScope(abc.ABC): # noqa
4347
+ def __init__(
4348
+ self,
4349
+ *,
4350
+ _i: Injector,
4351
+ ) -> None:
4352
+ check.not_in(abc.ABC, type(self).__bases__)
4316
4353
 
4317
- for b in bs.bindings():
4318
- if b.key.array:
4319
- al = am.setdefault(b.key, [])
4320
- if isinstance(b.provider, ArrayInjectorProvider):
4321
- al.extend(b.provider.ps)
4322
- else:
4323
- al.append(b.provider)
4354
+ super().__init__()
4355
+
4356
+ self._i = _i
4357
+
4358
+ all_seeds: ta.Iterable[_InjectorScopeSeed] = self._i.provide(InjectorKey(_InjectorScopeSeed, array=True))
4359
+ self._sks = {s.k for s in all_seeds if s.sc is type(self)}
4360
+
4361
+ #
4362
+
4363
+ @dc.dataclass(frozen=True)
4364
+ class State:
4365
+ seeds: ta.Dict[InjectorKey, ta.Any]
4366
+ provisions: ta.Dict[InjectorKey, ta.Any] = dc.field(default_factory=dict)
4367
+
4368
+ def new_state(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> State:
4369
+ vs = dict(vs)
4370
+ check.equal(set(vs.keys()), self._sks)
4371
+ return InjectorScope.State(vs)
4372
+
4373
+ #
4374
+
4375
+ @abc.abstractmethod
4376
+ def state(self) -> State:
4377
+ raise NotImplementedError
4378
+
4379
+ @abc.abstractmethod
4380
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.ContextManager[None]:
4381
+ raise NotImplementedError
4382
+
4383
+
4384
+ class ExclusiveInjectorScope(InjectorScope, abc.ABC):
4385
+ _st: ta.Optional[InjectorScope.State] = None
4386
+
4387
+ def state(self) -> InjectorScope.State:
4388
+ return check.not_none(self._st)
4389
+
4390
+ @contextlib.contextmanager
4391
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.Iterator[None]:
4392
+ check.none(self._st)
4393
+ self._st = self.new_state(vs)
4394
+ try:
4395
+ yield
4396
+ finally:
4397
+ self._st = None
4398
+
4399
+
4400
+ class ContextvarInjectorScope(InjectorScope, abc.ABC):
4401
+ _cv: contextvars.ContextVar
4402
+
4403
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
4404
+ super().__init_subclass__(**kwargs)
4405
+ check.not_in(abc.ABC, cls.__bases__)
4406
+ check.state(not hasattr(cls, '_cv'))
4407
+ cls._cv = contextvars.ContextVar(f'{cls.__name__}_cv')
4408
+
4409
+ def state(self) -> InjectorScope.State:
4410
+ return self._cv.get()
4411
+
4412
+ @contextlib.contextmanager
4413
+ def enter(self, vs: ta.Mapping[InjectorKey, ta.Any]) -> ta.Iterator[None]:
4414
+ try:
4415
+ self._cv.get()
4416
+ except LookupError:
4417
+ pass
4324
4418
  else:
4325
- if b.key in pm:
4326
- raise KeyError(b.key)
4327
- pm[b.key] = b.provider
4419
+ raise RuntimeError(f'Scope already entered: {self}')
4420
+ st = self.new_state(vs)
4421
+ tok = self._cv.set(st)
4422
+ try:
4423
+ yield
4424
+ finally:
4425
+ self._cv.reset(tok)
4328
4426
 
4329
- if am:
4330
- for k, aps in am.items():
4331
- pm[k] = ArrayInjectorProvider(aps)
4332
4427
 
4333
- return pm
4428
+ #
4429
+
4430
+
4431
+ @dc.dataclass(frozen=True)
4432
+ class ScopedInjectorProvider(InjectorProvider):
4433
+ p: InjectorProvider
4434
+ k: InjectorKey
4435
+ sc: ta.Type[InjectorScope]
4436
+
4437
+ def __post_init__(self) -> None:
4438
+ check.isinstance(self.p, InjectorProvider)
4439
+ check.isinstance(self.k, InjectorKey)
4440
+ check.issubclass(self.sc, InjectorScope)
4441
+
4442
+ def provider_fn(self) -> InjectorProviderFn:
4443
+ def pfn(i: Injector) -> ta.Any:
4444
+ st = i[self.sc].state()
4445
+ try:
4446
+ return st.provisions[self.k]
4447
+ except KeyError:
4448
+ pass
4449
+ v = ufn(i)
4450
+ st.provisions[self.k] = v
4451
+ return v
4452
+
4453
+ ufn = self.p.provider_fn()
4454
+ return pfn
4455
+
4456
+
4457
+ @dc.dataclass(frozen=True)
4458
+ class _ScopeSeedInjectorProvider(InjectorProvider):
4459
+ k: InjectorKey
4460
+ sc: ta.Type[InjectorScope]
4461
+
4462
+ def __post_init__(self) -> None:
4463
+ check.isinstance(self.k, InjectorKey)
4464
+ check.issubclass(self.sc, InjectorScope)
4465
+
4466
+ def provider_fn(self) -> InjectorProviderFn:
4467
+ def pfn(i: Injector) -> ta.Any:
4468
+ st = i[self.sc].state()
4469
+ return st.seeds[self.k]
4470
+ return pfn
4471
+
4472
+
4473
+ def bind_injector_scope(sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
4474
+ return InjectorBinder.bind(sc, singleton=True)
4475
+
4476
+
4477
+ #
4478
+
4479
+
4480
+ @dc.dataclass(frozen=True)
4481
+ class _InjectorScopeSeed:
4482
+ sc: ta.Type['InjectorScope']
4483
+ k: InjectorKey
4484
+
4485
+ def __post_init__(self) -> None:
4486
+ check.issubclass(self.sc, InjectorScope)
4487
+ check.isinstance(self.k, InjectorKey)
4488
+
4489
+
4490
+ def bind_injector_scope_seed(k: ta.Any, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
4491
+ kk = as_injector_key(k)
4492
+ return as_injector_bindings(
4493
+ InjectorBinding(kk, _ScopeSeedInjectorProvider(kk, sc)),
4494
+ InjectorBinder.bind(_InjectorScopeSeed(sc, kk), array=True),
4495
+ )
4334
4496
 
4335
4497
 
4336
4498
  ###
@@ -4477,13 +4639,21 @@ _INJECTOR_EAGER_ARRAY_KEY: InjectorKey[_InjectorEager] = InjectorKey(_InjectorEa
4477
4639
 
4478
4640
 
4479
4641
  class _Injector(Injector):
4642
+ _DEFAULT_BINDINGS: ta.ClassVar[ta.List[InjectorBinding]] = []
4643
+
4480
4644
  def __init__(self, bs: InjectorBindings, p: ta.Optional[Injector] = None) -> None:
4481
4645
  super().__init__()
4482
4646
 
4483
4647
  self._bs = check.isinstance(bs, InjectorBindings)
4484
4648
  self._p: ta.Optional[Injector] = check.isinstance(p, (Injector, type(None)))
4485
4649
 
4486
- self._pfm = {k: v.provider_fn() for k, v in build_injector_provider_map(bs).items()}
4650
+ self._pfm = {
4651
+ k: v.provider_fn()
4652
+ for k, v in build_injector_provider_map(as_injector_bindings(
4653
+ *self._DEFAULT_BINDINGS,
4654
+ bs,
4655
+ )).items()
4656
+ }
4487
4657
 
4488
4658
  if _INJECTOR_INJECTOR_KEY in self._pfm:
4489
4659
  raise DuplicateInjectorKeyError(_INJECTOR_INJECTOR_KEY)
@@ -4650,6 +4820,7 @@ class InjectorBinder:
4650
4820
  to_const: ta.Any = None,
4651
4821
  to_key: ta.Any = None,
4652
4822
 
4823
+ in_: ta.Optional[ta.Type[InjectorScope]] = None,
4653
4824
  singleton: bool = False,
4654
4825
 
4655
4826
  eager: bool = False,
@@ -4659,12 +4830,12 @@ class InjectorBinder:
4659
4830
  if isinstance(obj, cls._BANNED_BIND_TYPES):
4660
4831
  raise TypeError(obj)
4661
4832
 
4662
- ##
4833
+ #
4663
4834
 
4664
4835
  if key is not None:
4665
4836
  key = as_injector_key(key)
4666
4837
 
4667
- ##
4838
+ #
4668
4839
 
4669
4840
  has_to = (
4670
4841
  to_fn is not None or
@@ -4694,7 +4865,7 @@ class InjectorBinder:
4694
4865
  key = InjectorKey(type(obj))
4695
4866
  del has_to
4696
4867
 
4697
- ##
4868
+ #
4698
4869
 
4699
4870
  if tag is not None:
4700
4871
  if key.tag is not None:
@@ -4704,7 +4875,7 @@ class InjectorBinder:
4704
4875
  if array is not None:
4705
4876
  key = dc.replace(key, array=array)
4706
4877
 
4707
- ##
4878
+ #
4708
4879
 
4709
4880
  providers: ta.List[InjectorProvider] = []
4710
4881
  if to_fn is not None:
@@ -4719,23 +4890,34 @@ class InjectorBinder:
4719
4890
  raise TypeError('Must specify provider')
4720
4891
  if len(providers) > 1:
4721
4892
  raise TypeError('May not specify multiple providers')
4722
- provider, = providers
4893
+ provider = check.single(providers)
4723
4894
 
4724
- ##
4895
+ #
4725
4896
 
4897
+ pws: ta.List[ta.Any] = []
4898
+ if in_ is not None:
4899
+ check.issubclass(in_, InjectorScope)
4900
+ check.not_in(abc.ABC, in_.__bases__)
4901
+ pws.append(functools.partial(ScopedInjectorProvider, k=key, sc=in_))
4726
4902
  if singleton:
4727
- provider = SingletonInjectorProvider(provider)
4903
+ pws.append(SingletonInjectorProvider)
4904
+ if len(pws) > 1:
4905
+ raise TypeError('May not specify multiple provider wrappers')
4906
+ elif pws:
4907
+ provider = check.single(pws)(provider)
4908
+
4909
+ #
4728
4910
 
4729
4911
  binding = InjectorBinding(key, provider)
4730
4912
 
4731
- ##
4913
+ #
4732
4914
 
4733
4915
  extras: ta.List[InjectorBinding] = []
4734
4916
 
4735
4917
  if eager:
4736
4918
  extras.append(bind_injector_eager_key(key))
4737
4919
 
4738
- ##
4920
+ #
4739
4921
 
4740
4922
  if extras:
4741
4923
  return as_injector_bindings(binding, *extras)
@@ -4808,7 +4990,8 @@ def bind_injector_eager_key(key: ta.Any) -> InjectorBinding:
4808
4990
  return InjectorBinding(_INJECTOR_EAGER_ARRAY_KEY, ConstInjectorProvider(_InjectorEager(as_injector_key(key))))
4809
4991
 
4810
4992
 
4811
- ##
4993
+ ###
4994
+ # api
4812
4995
 
4813
4996
 
4814
4997
  class InjectionApi:
@@ -4828,9 +5011,19 @@ class InjectionApi:
4828
5011
  def as_bindings(self, *args: InjectorBindingOrBindings) -> InjectorBindings:
4829
5012
  return as_injector_bindings(*args)
4830
5013
 
5014
+ # overrides
5015
+
4831
5016
  def override(self, p: InjectorBindings, *args: InjectorBindingOrBindings) -> InjectorBindings:
4832
5017
  return injector_override(p, *args)
4833
5018
 
5019
+ # scopes
5020
+
5021
+ def bind_scope(self, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
5022
+ return bind_injector_scope(sc)
5023
+
5024
+ def bind_scope_seed(self, k: ta.Any, sc: ta.Type[InjectorScope]) -> InjectorBindingOrBindings:
5025
+ return bind_injector_scope_seed(k, sc)
5026
+
4834
5027
  # injector
4835
5028
 
4836
5029
  def create_injector(self, *args: InjectorBindingOrBindings, parent: ta.Optional[Injector] = None) -> Injector:
@@ -4851,6 +5044,7 @@ class InjectionApi:
4851
5044
  to_const: ta.Any = None,
4852
5045
  to_key: ta.Any = None,
4853
5046
 
5047
+ in_: ta.Optional[ta.Type[InjectorScope]] = None,
4854
5048
  singleton: bool = False,
4855
5049
 
4856
5050
  eager: bool = False,
@@ -4867,6 +5061,7 @@ class InjectionApi:
4867
5061
  to_const=to_const,
4868
5062
  to_key=to_key,
4869
5063
 
5064
+ in_=in_,
4870
5065
  singleton=singleton,
4871
5066
 
4872
5067
  eager=eager,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev177
3
+ Version: 0.0.0.dev179
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.dev177
16
- Requires-Dist: omlish==0.0.0.dev177
15
+ Requires-Dist: omdev==0.0.0.dev179
16
+ Requires-Dist: omlish==0.0.0.dev179
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -45,18 +45,19 @@ ominfra/manage/commands/subprocess.py,sha256=yHGMbAI-xKe_9BUs5IZ3Yav8qRE-I9aGnBt
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
47
  ominfra/manage/deploy/apps.py,sha256=LeZ2iX2YHviOAnvgut7Oz15301eJoYYCpmD3ffoIagA,4742
48
- ominfra/manage/deploy/commands.py,sha256=fKFKhFwqIqC_PsgA-W66qIJ5S32xRgBBaRt3lbPX5Zg,763
48
+ ominfra/manage/deploy/commands.py,sha256=U74HYQ4nhvH7znAKyXGOmZfdnll2gMWxKWVW4GzxG-0,830
49
49
  ominfra/manage/deploy/conf.py,sha256=fNfFlIb-bB3KAzaYZcjrbqaqKSiSq0Lpk0mIF6WgXiw,5410
50
50
  ominfra/manage/deploy/config.py,sha256=kPpl8TRisz295cM4oj-RHA6oh5jdcJ_N9pVpkl_doO8,114
51
- ominfra/manage/deploy/deploy.py,sha256=OqZOOjT2C_LjK8kwpP8T5VF2vtiDTHnsI-G6yNs4oDg,1965
51
+ ominfra/manage/deploy/deploy.py,sha256=vyBTbBm51HhRE-MQNvxEt39F8uOYsB4ToqZ3zmVkpqU,819
52
+ ominfra/manage/deploy/driver.py,sha256=kSriXFC8L_EpOcHFGxNZDBGyxV_fZAAF95y-czisnwE,1352
52
53
  ominfra/manage/deploy/git.py,sha256=g4wzUuSu9HwWSDhdVX-7BvA2htMwtWbRcHaoDy-xOJ4,3960
53
- ominfra/manage/deploy/inject.py,sha256=vubWT09WfDrSb2f3rLtApl3S_0WJIPwRd_ENVggLmhM,1896
54
- ominfra/manage/deploy/interp.py,sha256=OKkenH8YKEW_mEDR6X7_ZLxK9a1Ox6KHSwFPTHT6OzA,1029
54
+ ominfra/manage/deploy/inject.py,sha256=eTQC8Kyk8S8ogTJqti2lTwD2j7ha5qQG6KxqeIpLoxU,3610
55
+ ominfra/manage/deploy/interp.py,sha256=_5fuHrY5ZA0eGbnNcOqAhAMSWI1UNvbm0l29eDjE5fI,1037
55
56
  ominfra/manage/deploy/specs.py,sha256=usi5AmTlv8OGFcwhVHnu8Qrz1Criu5QP6_ScNMi9ehM,3748
56
57
  ominfra/manage/deploy/tags.py,sha256=NVEJhHKMwoDuCFd8lInH_jIe99FQILBX3wrulh3GiDg,5166
57
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=h_9Bb4NpvXqO2Hb5t_5qbWs3zfMDPfmKZvMACJ4CY5M,1584
60
+ ominfra/manage/deploy/venvs.py,sha256=1Ic3yKap9bTduqHorz1MpmSiQPh9x-vxhLLxgpVpRdc,1592
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
63
  ominfra/manage/deploy/paths/manager.py,sha256=Dnl8euyZQYDGwDzkMvgPAwOssseducr5kP6T0qzVXQk,929
@@ -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=4tzrENQzD7G31SoN2gZxyk0ZBTinEOXGhPzhcTCrjK4,317752
90
- ominfra/scripts/supervisor.py,sha256=9pEop3S5txoA2Gip9mcOrOJWFjMJVXCH6-NKYYnOVic,276462
90
+ ominfra/scripts/manage.py,sha256=8amo3uZzto1lHwrPANYIiQANnI4tg7d2tYPZpLQxOek,327303
91
+ ominfra/scripts/supervisor.py,sha256=fjUREQahtEy3FmuIVJsJIDNKNt002dCSjQO6OYq64SY,281855
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.dev177.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
133
- ominfra-0.0.0.dev177.dist-info/METADATA,sha256=FHfsifQBdOhfEGn69cR4bKYjNxAx_DBQH0OkVjdPMQ8,731
134
- ominfra-0.0.0.dev177.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
135
- ominfra-0.0.0.dev177.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
136
- ominfra-0.0.0.dev177.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
137
- ominfra-0.0.0.dev177.dist-info/RECORD,,
133
+ ominfra-0.0.0.dev179.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
134
+ ominfra-0.0.0.dev179.dist-info/METADATA,sha256=DToWITQGiSWlecrUHlTZfyqAdadg-kSWUpZb8auv38g,731
135
+ ominfra-0.0.0.dev179.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
136
+ ominfra-0.0.0.dev179.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
137
+ ominfra-0.0.0.dev179.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
138
+ ominfra-0.0.0.dev179.dist-info/RECORD,,