ominfra 0.0.0.dev177__py3-none-any.whl → 0.0.0.dev179__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
@@ -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,,