annet 0.16.1__py3-none-any.whl → 0.16.3__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.

Potentially problematic release.


This version of annet might be problematic. Click here for more details.

@@ -123,6 +123,7 @@ class Interface(Entity):
123
123
  display: str = ""
124
124
  ip_addresses: List[IpAddress] = field(default_factory=list)
125
125
  vrf: Optional[Entity] = None
126
+ mtu: int | None = None
126
127
 
127
128
 
128
129
  @dataclass
@@ -31,8 +31,9 @@ class NetboxProvider(StorageProvider, AdapterWithName, AdapterWithConfig):
31
31
  self.url = url
32
32
  self.token = token
33
33
 
34
- def with_config(self, **kwargs: Dict[str, Any]) -> T:
35
- return NetboxProvider(**kwargs)
34
+ @classmethod
35
+ def with_config(cls, **kwargs: Dict[str, Any]) -> T:
36
+ return cls(**kwargs)
36
37
 
37
38
  def storage(self):
38
39
  return storage_factory
@@ -43,5 +44,6 @@ class NetboxProvider(StorageProvider, AdapterWithName, AdapterWithConfig):
43
44
  def query(self):
44
45
  return NetboxQuery
45
46
 
46
- def name(self) -> str:
47
+ @classmethod
48
+ def name(cls) -> str:
47
49
  return "netbox"
@@ -52,6 +52,7 @@
52
52
  "Huawei.CE.CE8800": " CE88\\d\\d",
53
53
  "Huawei.CE.CE8800.CE8850": " CE8850",
54
54
  "Huawei.CE.CE8800.CE8851": " CE8851",
55
+ "Huawei.CE.CE8800.CE8855": " CE8855",
55
56
  "Huawei.CE.CE9800": " CE98\\d\\d",
56
57
  "Huawei.Quidway": " (LS-)?S",
57
58
  "Huawei.Quidway.S2x": "2\\d{3}",
annet/annlib/patching.py CHANGED
@@ -500,18 +500,20 @@ def _select_match(matches, rules):
500
500
 
501
501
  # Мерджим всех потомков которые заматчились
502
502
  local_children = odict()
503
+ global_children = odict()
503
504
  if is_f_cr_allowed:
504
505
  for (rule, is_cr_allowed) in map(operator.itemgetter(0), matches):
505
506
  if is_cr_allowed:
506
507
  local_children = merge_dicts(local_children, rule["children"]["local"])
507
508
  # optional break on is_cr_allowed==False?
508
509
 
510
+ global_children = merge_dicts(global_children, rule["children"]["global"])
511
+
512
+ global_children = merge_dicts(global_children, rules["global"])
513
+
509
514
  children_rules = {
510
515
  "local": local_children,
511
- "global": odict(
512
- (list(f_rule["children"]["global"].items()) if is_f_cr_allowed else [])
513
- + list(rules["global"].items()),
514
- ),
516
+ "global": global_children,
515
517
  }
516
518
 
517
519
  match = {"attrs": f_rule["attrs"]}
annet/configs/context.yml CHANGED
@@ -12,7 +12,7 @@ generators:
12
12
 
13
13
  storage:
14
14
  default:
15
- adapter: annet.adapters.file.provider
15
+ adapter: file
16
16
  params:
17
17
  path: /path/to/file
18
18
 
annet/connectors.py CHANGED
@@ -42,11 +42,11 @@ class Connector(ABC, Generic[T]):
42
42
  res = self._classes[0]
43
43
  return res(*args, **kwargs)
44
44
 
45
- def get_all(self, *args, **kwargs) -> List[T]:
45
+ def get_all(self) -> List[T]:
46
46
  if self._classes is None:
47
47
  self._classes = self._entry_point or [self._get_default()]
48
48
 
49
- return [cls(*args, **kwargs) for cls in self._classes]
49
+ return self._classes.copy()
50
50
 
51
51
  def set(self, cls: Type[T]):
52
52
  if self._classes is not None:
@@ -97,18 +97,20 @@ def load_entry_point_new(group: str) -> List:
97
97
 
98
98
 
99
99
  class AdapterWithConfig(ABC, Generic[T]):
100
+ @classmethod
100
101
  @abstractmethod
101
- def with_config(self, **kwargs: Dict[str, Any]) -> T:
102
+ def with_config(cls, **kwargs: Dict[str, Any]) -> T:
102
103
  pass
103
104
 
104
105
 
105
106
  class AdapterWithName(ABC):
107
+ @classmethod
106
108
  @abstractmethod
107
- def name(self) -> str:
109
+ def name(cls) -> str:
108
110
  pass
109
111
 
110
112
 
111
- def get_connector_from_config(config_key: str, connectors: List[Connector]) -> Tuple[Connector, Dict[str, Any]]:
113
+ def get_connector_from_config(config_key: str, connectors: List[Type[Connector]]) -> Tuple[Connector, Dict[str, Any]]:
112
114
  seen: list[str] = []
113
115
  if not connectors:
114
116
  raise Exception("empty connectors")
@@ -119,8 +121,8 @@ def get_connector_from_config(config_key: str, connectors: List[Connector]) -> T
119
121
  connector_params = context_storage.get("params", {})
120
122
  if adapter_name:
121
123
  for con in connectors:
122
- con_name = connector.__class__.__name__
123
- if isinstance(con, AdapterWithName):
124
+ con_name = connector.__name__
125
+ if issubclass(con, AdapterWithName):
124
126
  con_name = con.name()
125
127
  seen.append(con_name)
126
128
  if adapter_name == con_name:
@@ -136,8 +138,10 @@ def get_connector_from_config(config_key: str, connectors: List[Connector]) -> T
136
138
  connector = connectors[0]
137
139
  if len(connectors) > 1:
138
140
  warnings.warn(f"Please specify '{config_key}'. Found more than one classes {connectors}", UserWarning)
139
- if isinstance(connector, AdapterWithConfig):
140
- connector = connector.with_config(**connector_params)
141
+ if issubclass(connector, AdapterWithConfig):
142
+ connector_ins = connector.with_config(**connector_params)
143
+ else:
144
+ connector_ins = connector()
141
145
  # return connector_params only for storage
142
146
  # TODO: switch storage interface to AdapterWithConfig
143
- return connector, connector_params
147
+ return connector_ins, connector_params
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.1
3
+ Version: 0.16.3
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -3,7 +3,7 @@ annet/annet.py,sha256=TMdEuM7GJQ4TjRVmuK3bCTZN-21lxjQ9sXqEdILUuBk,725
3
3
  annet/argparse.py,sha256=v1MfhjR0B8qahza0WinmXClpR8UiDFhmwDDWtNroJPA,12855
4
4
  annet/cli.py,sha256=hDpjIr3w47lgQ_CvCQS1SXFDK-SJrf5slbT__5u6GIA,12342
5
5
  annet/cli_args.py,sha256=KQlihxSl-Phhq1-9oJDdNSbIllEX55LlPfH6viEKOuw,13483
6
- annet/connectors.py,sha256=_DY5JwR_uU_obOpzo2a_JsexIE-lbNjG1Hq2nOpQm4w,5067
6
+ annet/connectors.py,sha256=-Lghz3PtWCBU8Ohrp0KKQcmm1AUZtN0EnOaZ6IQgCQI,5105
7
7
  annet/deploy.py,sha256=pM7r8ipk7y-b4OIenc8FMqZpy5F6TmKdo8DDUJNRBlY,18956
8
8
  annet/diff.py,sha256=zLcaCnb4lZRUb7frpH1CstQ3kacRcCblZs1uLG8J5lk,3391
9
9
  annet/executor.py,sha256=FrYAUuh2TpSVX42SlTN_PhuSHmXG4Wj1nieY9Wqv9so,19122
@@ -23,11 +23,11 @@ annet/tracing.py,sha256=ndpM-au1c88uBBpOuH_z52qWZL773edYozNyys_wA68,4044
23
23
  annet/types.py,sha256=f2HwqoKa6AucwFwDMszoouB6m1B8n6VmdjHMktO30Kc,7175
24
24
  annet/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- annet/adapters/netbox/provider.py,sha256=mnvxSy3vTwdEHvzfy_Tfji4J4-BDmiKwkcF0s-EAs2M,1449
26
+ annet/adapters/netbox/provider.py,sha256=IIs37QFHuJHxq4A0WfBS4JENk--v3BxqgNPal1Or4Xc,1470
27
27
  annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  annet/adapters/netbox/common/client.py,sha256=-lWZmphD-OPuLIHNKhW_h2bnjrVaiyKYAD_MUPasEbo,2483
29
29
  annet/adapters/netbox/common/manufacturer.py,sha256=WZsBfHq6kohbbkszxPARjMdXB5rWGBO4Gz1rA-IlqL8,1555
30
- annet/adapters/netbox/common/models.py,sha256=uAUTzyZk9-B4xdVGCe2nSSBO8PXAiUYvYHOTnQAdQbU,3289
30
+ annet/adapters/netbox/common/models.py,sha256=zWxsChKZiJ_VQ5_K-l_o-iyDQgxNLvYpk4EvVSoga5o,3316
31
31
  annet/adapters/netbox/common/query.py,sha256=ziUFM7cUEbEIf3k1szTll4aO-OCUa-2Ogxbebi7Tegs,646
32
32
  annet/adapters/netbox/common/status_client.py,sha256=W4nTb2yvBlJ2UkWUmUhKQ2PaSQb1shjhHj5ebb4s2s4,591
33
33
  annet/adapters/netbox/common/storage_opts.py,sha256=iadgWGMb-rfSp3SnFAw8SH5bMKjwvcAsJ74v_z0CCXQ,507
@@ -43,13 +43,13 @@ annet/annlib/filter_acl.py,sha256=0w1VF6WcONiTYTQh0yWi6_j9rCTc_kMLAUMr0hbdkNU,72
43
43
  annet/annlib/jsontools.py,sha256=4-2r_mPNbecKreuUr3vlLv3ykJdhRmyUD8AdF2nSAxc,5430
44
44
  annet/annlib/lib.py,sha256=eJ4hcVuQ6pdYBzLs4YKCHFtq45idOfZCYp92XfF7_QI,15317
45
45
  annet/annlib/output.py,sha256=_SjJ6G6bejvnTKqNHw6xeio0FT9oO3OIkLaOC3cEga4,7569
46
- annet/annlib/patching.py,sha256=GwG2lT4w-I1Ls3Eswn6SPJLBUVt2M3Ysw1fmXsWamYw,19793
46
+ annet/annlib/patching.py,sha256=Ojfl-LJHHTBLWx_6gV_02FjigqRt1DNaJD64L9iWp_0,19854
47
47
  annet/annlib/tabparser.py,sha256=9ry4DxZn6ibShd7fFtH_TElm3lT5tgMGkHcpGXNVuUY,25997
48
48
  annet/annlib/types.py,sha256=VHU0CBADfYmO0xzB_c5f-mcuU3dUumuJczQnqGlib9M,852
49
49
  annet/annlib/netdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  annet/annlib/netdev/db.py,sha256=fI_u5aya4l61mbYSjj4JwlVfi3s7obt2jqERSuXGRUI,1634
51
51
  annet/annlib/netdev/devdb/__init__.py,sha256=aKYjjLbJebdKBjnGDpVLQdSqrV2JL24spGm58tmMWVU,892
52
- annet/annlib/netdev/devdb/data/devdb.json,sha256=GEKBY3Mx1wjLmhlN9h6VIj5RoTCA2thmDIEXBvv6EVg,5898
52
+ annet/annlib/netdev/devdb/data/devdb.json,sha256=Qph7WxZBEbgBqbCFeYu6ZM0qkEBn80WmJEjfJkcaZ-0,5940
53
53
  annet/annlib/netdev/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  annet/annlib/netdev/views/dump.py,sha256=rIlyvnA3uM8bB_7oq1nS2KDxTp6dQh2hz-FbNhYIpOU,4630
55
55
  annet/annlib/netdev/views/hardware.py,sha256=1JdTkrumOTYd5GKz4_LKg8G-B6ccrzl5VdNT-JhX40A,3495
@@ -62,7 +62,7 @@ annet/annlib/rbparser/syntax.py,sha256=iZ7Y-4QQBw4L3UtjEh54qisiRDhobl7HZxFNdP8mi
62
62
  annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  annet/annlib/rulebook/common.py,sha256=Kd9Xout0xC6ZZDnyaORx0W-1kSM-gTgjQbp1iIXWxic,16489
64
64
  annet/api/__init__.py,sha256=KWoJfo2ByHC8EsIhU4szuhGwE8OKYS7Y1TN2xkhe0qA,33563
65
- annet/configs/context.yml,sha256=jzAQX9WbjFw_nsju8FLCCGfRc4ZXD0Mhb5pvO9emegI,413
65
+ annet/configs/context.yml,sha256=rXbeCmeYGaCEVVncwdouZIx5O7-PzABe4q-tfke0sSA,389
66
66
  annet/configs/logging.yaml,sha256=Hu42lRK248dssp9TgkbHCaZNl0E6f4IChGb0XaQnTVo,970
67
67
  annet/generators/__init__.py,sha256=ACMH9UQ4I3uq2b8nDzOn2dgYxreDq4_3ojOGwht0-No,15543
68
68
  annet/generators/base.py,sha256=rgQLcQBPZm4ecbKmRhVOpBR-GFJAiVfdb_y5f2-LUR8,3670
@@ -133,10 +133,10 @@ annet/rulebook/texts/routeros.rul,sha256=ipfxjj0mjFef6IsUlupqx4BY_Je_OUb8u_U1019
133
133
  annet_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  annet_generators/example/__init__.py,sha256=zVd8_DrXuOASrNzg2Ab94rPyvJff83L-_HppDFxnUjM,228
135
135
  annet_generators/example/lldp.py,sha256=24bGvShxbio-JxUdaehyPRu31LhH9YwSwFDrWVRn6yo,2100
136
- annet-0.16.1.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
137
- annet-0.16.1.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
138
- annet-0.16.1.dist-info/METADATA,sha256=fBLYdAEadQVUPbjdikTJS2OOmaMiWWvIgrGgEv4nLY8,694
139
- annet-0.16.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
140
- annet-0.16.1.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
141
- annet-0.16.1.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
142
- annet-0.16.1.dist-info/RECORD,,
136
+ annet-0.16.3.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
137
+ annet-0.16.3.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
138
+ annet-0.16.3.dist-info/METADATA,sha256=eYoYqcjKGQl81clx9jffupesNMIfZn0XeiYX2so6U_k,694
139
+ annet-0.16.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
140
+ annet-0.16.3.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
141
+ annet-0.16.3.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
142
+ annet-0.16.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5