annet 0.16.20__tar.gz → 0.16.22__tar.gz

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.

Files changed (180) hide show
  1. {annet-0.16.20/annet.egg-info → annet-0.16.22}/PKG-INFO +1 -1
  2. {annet-0.16.20 → annet-0.16.22}/README.md +1 -1
  3. {annet-0.16.20 → annet-0.16.22}/annet/annlib/tabparser.py +39 -4
  4. {annet-0.16.20 → annet-0.16.22}/annet/tabparser.py +13 -1
  5. {annet-0.16.20 → annet-0.16.22/annet.egg-info}/PKG-INFO +1 -1
  6. {annet-0.16.20 → annet-0.16.22}/AUTHORS +0 -0
  7. {annet-0.16.20 → annet-0.16.22}/LICENSE +0 -0
  8. {annet-0.16.20 → annet-0.16.22}/MANIFEST.in +0 -0
  9. {annet-0.16.20 → annet-0.16.22}/annet/__init__.py +0 -0
  10. {annet-0.16.20 → annet-0.16.22}/annet/adapters/__init__.py +0 -0
  11. {annet-0.16.20 → annet-0.16.22}/annet/adapters/fetchers/__init__.py +0 -0
  12. {annet-0.16.20 → annet-0.16.22}/annet/adapters/fetchers/stub/__init__.py +0 -0
  13. {annet-0.16.20 → annet-0.16.22}/annet/adapters/fetchers/stub/fetcher.py +0 -0
  14. {annet-0.16.20 → annet-0.16.22}/annet/adapters/file/__init__.py +0 -0
  15. {annet-0.16.20 → annet-0.16.22}/annet/adapters/file/provider.py +0 -0
  16. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/__init__.py +0 -0
  17. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/__init__.py +0 -0
  18. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/client.py +0 -0
  19. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/manufacturer.py +0 -0
  20. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/models.py +0 -0
  21. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/query.py +0 -0
  22. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/status_client.py +0 -0
  23. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/common/storage_opts.py +0 -0
  24. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/provider.py +0 -0
  25. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/v24/__init__.py +0 -0
  26. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/v24/storage.py +0 -0
  27. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/v37/__init__.py +0 -0
  28. {annet-0.16.20 → annet-0.16.22}/annet/adapters/netbox/v37/storage.py +0 -0
  29. {annet-0.16.20 → annet-0.16.22}/annet/annet.py +0 -0
  30. {annet-0.16.20 → annet-0.16.22}/annet/annlib/__init__.py +0 -0
  31. {annet-0.16.20 → annet-0.16.22}/annet/annlib/command.py +0 -0
  32. {annet-0.16.20 → annet-0.16.22}/annet/annlib/diff.py +0 -0
  33. {annet-0.16.20 → annet-0.16.22}/annet/annlib/errors.py +0 -0
  34. {annet-0.16.20 → annet-0.16.22}/annet/annlib/filter_acl.py +0 -0
  35. {annet-0.16.20 → annet-0.16.22}/annet/annlib/jsontools.py +0 -0
  36. {annet-0.16.20 → annet-0.16.22}/annet/annlib/lib.py +0 -0
  37. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/__init__.py +0 -0
  38. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/db.py +0 -0
  39. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/devdb/__init__.py +0 -0
  40. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
  41. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/views/__init__.py +0 -0
  42. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/views/dump.py +0 -0
  43. {annet-0.16.20 → annet-0.16.22}/annet/annlib/netdev/views/hardware.py +0 -0
  44. {annet-0.16.20 → annet-0.16.22}/annet/annlib/output.py +0 -0
  45. {annet-0.16.20 → annet-0.16.22}/annet/annlib/patching.py +0 -0
  46. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/__init__.py +0 -0
  47. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/acl.py +0 -0
  48. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/deploying.py +0 -0
  49. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/ordering.py +0 -0
  50. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/platform.py +0 -0
  51. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rbparser/syntax.py +0 -0
  52. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rulebook/__init__.py +0 -0
  53. {annet-0.16.20 → annet-0.16.22}/annet/annlib/rulebook/common.py +0 -0
  54. {annet-0.16.20 → annet-0.16.22}/annet/annlib/types.py +0 -0
  55. {annet-0.16.20 → annet-0.16.22}/annet/api/__init__.py +0 -0
  56. {annet-0.16.20 → annet-0.16.22}/annet/argparse.py +0 -0
  57. {annet-0.16.20 → annet-0.16.22}/annet/bgp_models.py +0 -0
  58. {annet-0.16.20 → annet-0.16.22}/annet/cli.py +0 -0
  59. {annet-0.16.20 → annet-0.16.22}/annet/cli_args.py +0 -0
  60. {annet-0.16.20 → annet-0.16.22}/annet/configs/context.yml +0 -0
  61. {annet-0.16.20 → annet-0.16.22}/annet/configs/logging.yaml +0 -0
  62. {annet-0.16.20 → annet-0.16.22}/annet/connectors.py +0 -0
  63. {annet-0.16.20 → annet-0.16.22}/annet/deploy.py +0 -0
  64. {annet-0.16.20 → annet-0.16.22}/annet/diff.py +0 -0
  65. {annet-0.16.20 → annet-0.16.22}/annet/executor.py +0 -0
  66. {annet-0.16.20 → annet-0.16.22}/annet/filtering.py +0 -0
  67. {annet-0.16.20 → annet-0.16.22}/annet/gen.py +0 -0
  68. {annet-0.16.20 → annet-0.16.22}/annet/generators/__init__.py +0 -0
  69. {annet-0.16.20 → annet-0.16.22}/annet/generators/base.py +0 -0
  70. {annet-0.16.20 → annet-0.16.22}/annet/generators/common/__init__.py +0 -0
  71. {annet-0.16.20 → annet-0.16.22}/annet/generators/common/initial.py +0 -0
  72. {annet-0.16.20 → annet-0.16.22}/annet/generators/entire.py +0 -0
  73. {annet-0.16.20 → annet-0.16.22}/annet/generators/exceptions.py +0 -0
  74. {annet-0.16.20 → annet-0.16.22}/annet/generators/jsonfragment.py +0 -0
  75. {annet-0.16.20 → annet-0.16.22}/annet/generators/partial.py +0 -0
  76. {annet-0.16.20 → annet-0.16.22}/annet/generators/perf.py +0 -0
  77. {annet-0.16.20 → annet-0.16.22}/annet/generators/ref.py +0 -0
  78. {annet-0.16.20 → annet-0.16.22}/annet/generators/result.py +0 -0
  79. {annet-0.16.20 → annet-0.16.22}/annet/hardware.py +0 -0
  80. {annet-0.16.20 → annet-0.16.22}/annet/implicit.py +0 -0
  81. {annet-0.16.20 → annet-0.16.22}/annet/lib.py +0 -0
  82. {annet-0.16.20 → annet-0.16.22}/annet/mesh/__init__.py +0 -0
  83. {annet-0.16.20 → annet-0.16.22}/annet/mesh/basemodel.py +0 -0
  84. {annet-0.16.20 → annet-0.16.22}/annet/mesh/device_models.py +0 -0
  85. {annet-0.16.20 → annet-0.16.22}/annet/mesh/executor.py +0 -0
  86. {annet-0.16.20 → annet-0.16.22}/annet/mesh/match_args.py +0 -0
  87. {annet-0.16.20 → annet-0.16.22}/annet/mesh/models_converter.py +0 -0
  88. {annet-0.16.20 → annet-0.16.22}/annet/mesh/peer_models.py +0 -0
  89. {annet-0.16.20 → annet-0.16.22}/annet/mesh/registry.py +0 -0
  90. {annet-0.16.20 → annet-0.16.22}/annet/output.py +0 -0
  91. {annet-0.16.20 → annet-0.16.22}/annet/parallel.py +0 -0
  92. {annet-0.16.20 → annet-0.16.22}/annet/patching.py +0 -0
  93. {annet-0.16.20 → annet-0.16.22}/annet/reference.py +0 -0
  94. {annet-0.16.20 → annet-0.16.22}/annet/rpl/__init__.py +0 -0
  95. {annet-0.16.20 → annet-0.16.22}/annet/rpl/action.py +0 -0
  96. {annet-0.16.20 → annet-0.16.22}/annet/rpl/condition.py +0 -0
  97. {annet-0.16.20 → annet-0.16.22}/annet/rpl/match_builder.py +0 -0
  98. {annet-0.16.20 → annet-0.16.22}/annet/rpl/policy.py +0 -0
  99. {annet-0.16.20 → annet-0.16.22}/annet/rpl/result.py +0 -0
  100. {annet-0.16.20 → annet-0.16.22}/annet/rpl/routemap.py +0 -0
  101. {annet-0.16.20 → annet-0.16.22}/annet/rpl/statement_builder.py +0 -0
  102. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/__init__.py +0 -0
  103. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/arista/__init__.py +0 -0
  104. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/arista/iface.py +0 -0
  105. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/aruba/__init__.py +0 -0
  106. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/aruba/ap_env.py +0 -0
  107. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/aruba/misc.py +0 -0
  108. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/b4com/__init__.py +0 -0
  109. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/b4com/file.py +0 -0
  110. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/cisco/__init__.py +0 -0
  111. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/cisco/iface.py +0 -0
  112. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/cisco/misc.py +0 -0
  113. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/cisco/vlandb.py +0 -0
  114. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/common.py +0 -0
  115. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/deploying.py +0 -0
  116. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/__init__.py +0 -0
  117. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/aaa.py +0 -0
  118. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/bgp.py +0 -0
  119. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/iface.py +0 -0
  120. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/misc.py +0 -0
  121. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/huawei/vlandb.py +0 -0
  122. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/juniper/__init__.py +0 -0
  123. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/nexus/__init__.py +0 -0
  124. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/nexus/iface.py +0 -0
  125. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/patching.py +0 -0
  126. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/ribbon/__init__.py +0 -0
  127. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/routeros/__init__.py +0 -0
  128. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/routeros/file.py +0 -0
  129. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/arista.deploy +0 -0
  130. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/arista.order +0 -0
  131. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/arista.rul +0 -0
  132. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/aruba.deploy +0 -0
  133. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/aruba.order +0 -0
  134. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/aruba.rul +0 -0
  135. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/b4com.deploy +0 -0
  136. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/b4com.order +0 -0
  137. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/b4com.rul +0 -0
  138. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/cisco.deploy +0 -0
  139. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/cisco.order +0 -0
  140. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/cisco.rul +0 -0
  141. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/huawei.deploy +0 -0
  142. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/huawei.order +0 -0
  143. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/huawei.rul +0 -0
  144. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/juniper.rul +0 -0
  145. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/nexus.deploy +0 -0
  146. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/nexus.order +0 -0
  147. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/nexus.rul +0 -0
  148. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/nokia.rul +0 -0
  149. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/optixtrans.deploy +0 -0
  150. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/optixtrans.order +0 -0
  151. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/optixtrans.rul +0 -0
  152. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/pc.deploy +0 -0
  153. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/pc.order +0 -0
  154. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/pc.rul +0 -0
  155. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/ribbon.deploy +0 -0
  156. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/ribbon.rul +0 -0
  157. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/routeros.order +0 -0
  158. {annet-0.16.20 → annet-0.16.22}/annet/rulebook/texts/routeros.rul +0 -0
  159. {annet-0.16.20 → annet-0.16.22}/annet/storage.py +0 -0
  160. {annet-0.16.20 → annet-0.16.22}/annet/text_term_format.py +0 -0
  161. {annet-0.16.20 → annet-0.16.22}/annet/tracing.py +0 -0
  162. {annet-0.16.20 → annet-0.16.22}/annet/types.py +0 -0
  163. {annet-0.16.20 → annet-0.16.22}/annet.egg-info/SOURCES.txt +0 -0
  164. {annet-0.16.20 → annet-0.16.22}/annet.egg-info/dependency_links.txt +0 -0
  165. {annet-0.16.20 → annet-0.16.22}/annet.egg-info/entry_points.txt +0 -0
  166. {annet-0.16.20 → annet-0.16.22}/annet.egg-info/requires.txt +0 -0
  167. {annet-0.16.20 → annet-0.16.22}/annet.egg-info/top_level.txt +0 -0
  168. {annet-0.16.20 → annet-0.16.22}/annet_generators/__init__.py +0 -0
  169. {annet-0.16.20 → annet-0.16.22}/annet_generators/example/__init__.py +0 -0
  170. {annet-0.16.20 → annet-0.16.22}/annet_generators/example/lldp.py +0 -0
  171. {annet-0.16.20 → annet-0.16.22}/annet_generators/mesh_example/__init__.py +0 -0
  172. {annet-0.16.20 → annet-0.16.22}/annet_generators/mesh_example/bgp.py +0 -0
  173. {annet-0.16.20 → annet-0.16.22}/annet_generators/mesh_example/mesh_logic.py +0 -0
  174. {annet-0.16.20 → annet-0.16.22}/annet_generators/rpl_example/__init__.py +0 -0
  175. {annet-0.16.20 → annet-0.16.22}/annet_generators/rpl_example/items.py +0 -0
  176. {annet-0.16.20 → annet-0.16.22}/annet_generators/rpl_example/policy_generator.py +0 -0
  177. {annet-0.16.20 → annet-0.16.22}/annet_generators/rpl_example/route_policy.py +0 -0
  178. {annet-0.16.20 → annet-0.16.22}/requirements.txt +0 -0
  179. {annet-0.16.20 → annet-0.16.22}/setup.cfg +0 -0
  180. {annet-0.16.20 → annet-0.16.22}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.20
3
+ Version: 0.16.22
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  # Annet - configuration generation and deploying utility for network equipment
2
2
 
3
- Annet is a configuration generator that can translate differences between old and new configurations into sequnce of commands. This feature is vital for CLI-based devices, such as Huawei, Cisco IOS, Cisco NX-OS, Juniper. Devices configured via separate config files, Linux, FreeBSD and Cumulus are also supported.
3
+ Annet is a configuration generator that can translate differences between old and new configurations into sequence of commands. This feature is vital for CLI-based devices, such as Huawei, Cisco IOS, Cisco NX-OS, Juniper. Devices configured via separate config files, Linux, FreeBSD and Cumulus are also supported.
4
4
 
5
5
  It works this way. Annet `gen`erates configuration for a device by running Python code, which usually goes to the Network Source of Truth, like NetBox. Annet then gets the `diff`erence by getting the configuration from the device and comparing it. Finally, Annet translates the difference into a sequence of commands, called a `patch`. After `deploy`ing these commands, the diff will be empty.
6
6
 
@@ -330,6 +330,41 @@ class CiscoFormatter(BlockExitFormatter):
330
330
  yield from super().block_exit(context)
331
331
 
332
332
 
333
+ class NexusFormatter(BlockExitFormatter):
334
+ def __init__(self, indent=" "):
335
+ super().__init__("exit", indent)
336
+
337
+ def split(self, text):
338
+ return self.split_remove_spaces(text)
339
+
340
+
341
+ class B4comFormatter(BlockExitFormatter):
342
+ def __init__(self, indent=" "):
343
+ super().__init__("exit", indent)
344
+
345
+ def split(self, text):
346
+ return self.split_remove_spaces(text)
347
+
348
+
349
+ class ArubaFormatter(BlockExitFormatter):
350
+ def __init__(self, indent=" "):
351
+ super().__init__("exit", indent)
352
+
353
+ def split(self, text):
354
+ return self.split_remove_spaces(text)
355
+
356
+
357
+ class AristaFormatter(CiscoFormatter):
358
+
359
+ def block_exit(self, context: Optional[FormatterContext]) -> str:
360
+ current = context and context.row or ""
361
+
362
+ if current.startswith(("address-family")):
363
+ yield from block_wrapper("exit")
364
+ else:
365
+ yield from super().block_exit(context)
366
+
367
+
333
368
  class AsrFormatter(BlockExitFormatter):
334
369
  def __init__(self, indent=" "):
335
370
  super().__init__("exit", indent)
@@ -702,16 +737,16 @@ def make_formatter(vendor, **kwargs):
702
737
  formatters = {
703
738
  "juniper": JuniperFormatter,
704
739
  "cisco": CiscoFormatter,
705
- "nexus": CiscoFormatter,
740
+ "nexus": NexusFormatter,
706
741
  "huawei": HuaweiFormatter,
707
742
  "optixtrans": OptixtransFormatter,
708
- "arista": CiscoFormatter,
743
+ "arista": AristaFormatter,
709
744
  "nokia": NokiaFormatter,
710
745
  "routeros": RosFormatter,
711
- "aruba": CiscoFormatter,
746
+ "aruba": ArubaFormatter,
712
747
  "pc": CommonFormatter,
713
748
  "ribbon": RibbonFormatter,
714
- "b4com": CiscoFormatter,
749
+ "b4com": B4comFormatter,
715
750
  }
716
751
  return formatters[vendor](**kwargs)
717
752
 
@@ -11,6 +11,10 @@ from annet.annlib.tabparser import ( # pylint: disable=unused-import
11
11
  RibbonFormatter,
12
12
  RosFormatter,
13
13
  parse_to_tree,
14
+ AristaFormatter,
15
+ NexusFormatter,
16
+ B4comFormatter,
17
+ ArubaFormatter,
14
18
  )
15
19
 
16
20
 
@@ -21,8 +25,14 @@ def make_formatter(hw, **kwargs):
21
25
  cls = HuaweiFormatter
22
26
  elif hw.Cisco.ASR or hw.Cisco.XRV:
23
27
  cls = AsrFormatter
24
- elif hw.Nexus or hw.Cisco or hw.Arista or hw.Aruba or hw.B4com:
28
+ elif hw.Nexus:
29
+ cls = NexusFormatter
30
+ elif hw.Cisco:
25
31
  cls = CiscoFormatter
32
+ elif hw.B4com:
33
+ cls = B4comFormatter
34
+ elif hw.Aruba:
35
+ cls = ArubaFormatter
26
36
  elif hw.Juniper:
27
37
  cls = JuniperFormatter
28
38
  elif hw.Nokia:
@@ -35,6 +45,8 @@ def make_formatter(hw, **kwargs):
35
45
  cls = RibbonFormatter
36
46
  elif hw.H3C:
37
47
  cls = HuaweiFormatter
48
+ elif hw.Arista:
49
+ cls = AristaFormatter
38
50
  else:
39
51
  raise NotImplementedError("Unknown formatter for hw '%s'" % hw)
40
52
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.20
3
+ Version: 0.16.22
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes