annet 3.17.0__tar.gz → 3.18.0__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.
- {annet-3.17.0/annet.egg-info → annet-3.18.0}/PKG-INFO +1 -1
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/jsontools.py +26 -4
- {annet-3.17.0 → annet-3.18.0}/annet/gen.py +11 -2
- {annet-3.17.0 → annet-3.18.0}/annet/generators/result.py +7 -3
- {annet-3.17.0 → annet-3.18.0/annet.egg-info}/PKG-INFO +1 -1
- {annet-3.17.0 → annet-3.18.0}/AUTHORS +0 -0
- {annet-3.17.0 → annet-3.18.0}/LICENSE +0 -0
- {annet-3.17.0 → annet-3.18.0}/MANIFEST.in +0 -0
- {annet-3.17.0 → annet-3.18.0}/README.md +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/fetchers/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/fetchers/stub/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/fetchers/stub/fetcher.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/file/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/file/provider.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/adapter.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/client.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/manufacturer.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/query.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/status_client.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/storage_base.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/common/storage_opts.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/provider.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v24/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v24/models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v24/storage.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v37/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v37/models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v37/storage.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v41/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v41/models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v41/storage.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v42/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v42/models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/adapters/netbox/v42/storage.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annet.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/command.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/diff.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/errors.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/filter_acl.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/lib.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/db.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/devdb/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/views/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/views/dump.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/netdev/views/hardware.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/output.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/patching.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/acl.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/deploying.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/ordering.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/platform.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rbparser/syntax.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rulebook/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/rulebook/common.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/annlib/types.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/api/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/argparse.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/bgp_models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/cli.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/cli_args.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/configs/context.yml +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/configs/logging.yaml +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/connectors.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/deploy.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/deploy_ui.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/diff.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/filtering.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/base.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/common/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/common/initial.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/entire.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/exceptions.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/jsonfragment.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/partial.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/perf.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/generators/ref.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/hardware.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/implicit.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/lib.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/basemodel.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/device_models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/executor.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/match_args.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/models_converter.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/peer_models.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/port_processor.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/mesh/registry.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/output.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/parallel.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/patching.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/reference.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/action.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/condition.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/match_builder.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/policy.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/result.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/routemap.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl/statement_builder.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/aspath.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/community.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/cumulus_frr.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/entities.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/execute.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/policy.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/prefix_lists.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rpl_generators/rd.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/arista/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/arista/aaa.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/arista/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/aruba/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/aruba/ap_env.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/aruba/misc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/b4com/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/b4com/file.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/b4com/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/cisco/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/cisco/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/cisco/misc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/cisco/vlandb.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/common.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/deploying.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/generic/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/generic/misc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/aaa.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/bgp.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/misc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/h3c/vlandb.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/aaa.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/bgp.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/misc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/huawei/vlandb.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/juniper/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/juniper/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/nexus/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/nexus/iface.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/patching.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/routeros/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/routeros/file.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/arista.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/arista.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/arista.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/aruba.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/aruba.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/aruba.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/b4com.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/b4com.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/b4com.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/cisco.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/cisco.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/cisco.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/h3c.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/h3c.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/h3c.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/huawei.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/huawei.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/huawei.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/iosxr.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/iosxr.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/iosxr.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/juniper.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/juniper.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/nexus.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/nexus.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/nexus.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/nokia.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/optixtrans.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/optixtrans.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/optixtrans.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/pc.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/pc.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/pc.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/ribbon.deploy +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/ribbon.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/routeros.order +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/rulebook/texts/routeros.rul +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/storage.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/text_term_format.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/tracing.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/types.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/base.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/arista.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/aruba.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/b4com.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/cisco.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/h3c.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/huawei.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/iosxr.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/juniper.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/nexus.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/nokia.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/optixtrans.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/pc.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/ribbon.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/library/routeros.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/registry.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet/vendors/tabparser.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet.egg-info/SOURCES.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet.egg-info/dependency_links.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet.egg-info/entry_points.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet.egg-info/requires.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet.egg-info/top_level.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/example/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/example/hostname.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/example/lldp.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/mesh_example/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/mesh_example/bgp.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/mesh_example/mesh_logic.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/rpl_example/__init__.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/rpl_example/generator.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/rpl_example/items.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/rpl_example/mesh.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/annet_generators/rpl_example/route_policy.py +0 -0
- {annet-3.17.0 → annet-3.18.0}/requirements.txt +0 -0
- {annet-3.17.0 → annet-3.18.0}/setup.cfg +0 -0
- {annet-3.17.0 → annet-3.18.0}/setup.py +0 -0
|
@@ -6,13 +6,16 @@ import json
|
|
|
6
6
|
from collections.abc import Mapping, Sequence
|
|
7
7
|
from itertools import starmap
|
|
8
8
|
from operator import itemgetter
|
|
9
|
-
from typing import Any, Dict, Iterable, List, Optional
|
|
9
|
+
from typing import Any, Dict, Final, Iterable, List, Optional
|
|
10
10
|
|
|
11
11
|
import jsonpatch
|
|
12
12
|
import jsonpointer
|
|
13
13
|
from ordered_set import OrderedSet
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
EVERYTHING_ACL: Final = "/*"
|
|
17
|
+
|
|
18
|
+
|
|
16
19
|
def format_json(data: Any, stable: bool = False) -> str:
|
|
17
20
|
"""Serialize to json."""
|
|
18
21
|
return json.dumps(data, indent=4, ensure_ascii=False, sort_keys=not stable) + "\n"
|
|
@@ -21,14 +24,17 @@ def format_json(data: Any, stable: bool = False) -> str:
|
|
|
21
24
|
def apply_json_fragment(
|
|
22
25
|
old: Dict[str, Any],
|
|
23
26
|
new_fragment: Dict[str, Any], *,
|
|
24
|
-
acl: Sequence[str],
|
|
27
|
+
acl: Sequence[str] | None = None,
|
|
25
28
|
filters: Sequence[str] | None = None,
|
|
26
29
|
) -> Dict[str, Any]:
|
|
27
30
|
"""
|
|
28
|
-
Replace parts of the old document with 'new_fragment'
|
|
31
|
+
Replace parts of the old document with 'new_fragment'.
|
|
32
|
+
If `acl` is not `None`, replacement will only be made within specified keys.
|
|
29
33
|
If `filter` is not `None`, only those parts which also matches at least one filter
|
|
30
34
|
from the list will be modified (updated or deleted).
|
|
31
35
|
"""
|
|
36
|
+
if acl is None:
|
|
37
|
+
acl = [EVERYTHING_ACL]
|
|
32
38
|
full_new_config = copy.deepcopy(old)
|
|
33
39
|
for acl_item in acl:
|
|
34
40
|
new_pointers = _resolve_json_pointers(acl_item, new_fragment)
|
|
@@ -91,7 +97,23 @@ def _pointer_set(pointer: jsonpointer.JsonPointer, doc: Any, value: Any) -> None
|
|
|
91
97
|
|
|
92
98
|
def make_patch(old: Dict[str, Any], new: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
93
99
|
"""Generate a JSON patch by comparing the old document with the new one."""
|
|
94
|
-
|
|
100
|
+
# NOTE: changing order of the patch operations (e.g. sorting)
|
|
101
|
+
# may interfere with the `move` logic.
|
|
102
|
+
# E.g.:
|
|
103
|
+
# ```python
|
|
104
|
+
# old = [["a", "b"], ["c", "d"]]
|
|
105
|
+
# new = [["d", "c"], ["b", "a"]]
|
|
106
|
+
# ```
|
|
107
|
+
# produces the following patch:
|
|
108
|
+
# ```json
|
|
109
|
+
# [{"op": "move", "path": "/0/0", "from": "/1/0"},
|
|
110
|
+
# {"op": "move", "path": "/1/0", "from": "/0/2"},
|
|
111
|
+
# {"op": "move", "path": "/0/0", "from": "/1/1"},
|
|
112
|
+
# {"op": "move", "path": "/1/1", "from": "/0/2"}]
|
|
113
|
+
# ```
|
|
114
|
+
# which relies on proper ordering to be correctly applied.
|
|
115
|
+
# See https://github.com/annetutil/annet/pull/452 for details.
|
|
116
|
+
return jsonpatch.make_patch(old, new).patch
|
|
95
117
|
|
|
96
118
|
|
|
97
119
|
def apply_patch(content: Optional[bytes], patch_bytes: bytes) -> bytes:
|
|
@@ -267,11 +267,20 @@ def _old_new_per_device(ctx: OldNewDeviceContext, device: Device, filterer: Filt
|
|
|
267
267
|
filters = filters_text.removesuffix("\n").split("\n")
|
|
268
268
|
|
|
269
269
|
old_json_fragment_files = old_files.json_fragment_files.copy()
|
|
270
|
-
new_json_fragment_files = res.new_json_fragment_files(
|
|
270
|
+
new_json_fragment_files = res.new_json_fragment_files(
|
|
271
|
+
old_json_fragment_files,
|
|
272
|
+
use_acl=not ctx.args.no_acl,
|
|
273
|
+
filters=filters,
|
|
274
|
+
)
|
|
271
275
|
|
|
272
276
|
if ctx.args.acl_safe:
|
|
273
277
|
safe_new_files = res.new_files(safe=True)
|
|
274
|
-
safe_new_json_fragment_files = res.new_json_fragment_files(
|
|
278
|
+
safe_new_json_fragment_files = res.new_json_fragment_files(
|
|
279
|
+
old_json_fragment_files,
|
|
280
|
+
use_acl=not ctx.args.no_acl,
|
|
281
|
+
safe=True,
|
|
282
|
+
filters=filters,
|
|
283
|
+
)
|
|
275
284
|
|
|
276
285
|
if ctx.args.profile:
|
|
277
286
|
perf = res.perf_mesures()
|
|
@@ -85,6 +85,7 @@ class RunGeneratorResult:
|
|
|
85
85
|
def new_json_fragment_files(
|
|
86
86
|
self,
|
|
87
87
|
old_files: Dict[str, Optional[str]],
|
|
88
|
+
use_acl: bool = True,
|
|
88
89
|
safe: bool = False,
|
|
89
90
|
filters: Sequence[str] | None = None,
|
|
90
91
|
) -> Dict[str, Tuple[Any, Optional[str]]]:
|
|
@@ -98,9 +99,12 @@ class RunGeneratorResult:
|
|
|
98
99
|
files[filepath] = (old_files[filepath], None)
|
|
99
100
|
else:
|
|
100
101
|
files[filepath] = ({}, None)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
if use_acl:
|
|
103
|
+
result_acl = generator_result.acl
|
|
104
|
+
if safe:
|
|
105
|
+
result_acl = generator_result.acl_safe
|
|
106
|
+
else:
|
|
107
|
+
result_acl = None
|
|
104
108
|
previous_config: Dict[str, Any] = files[filepath][0]
|
|
105
109
|
new_fragment = generator_result.config
|
|
106
110
|
new_config = jsontools.apply_json_fragment(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|