From a0abe943d5cd4a5d76742f13c7e176df9929c4f8 Mon Sep 17 00:00:00 2001 From: William Guilherme Date: Tue, 25 Jun 2024 10:03:15 -0700 Subject: [PATCH] feat(new): Added Forwarding Control Rule Resource (#37) * feat(new): Added Forwarding Control Rule Resource * fix: Upgraded to Zscaler SDK Python v.0.5.2 --- .github/workflows/release.yml | 6 +- .github/workflows/zia-test.yml | 6 +- README.md | 21 +- docs/source/installation.rst | 6 +- .../zia_cloud_firewall_network_services.py | 77 +- .../modules/zia_forwarding_control_rule.py | 986 ++++++++++++++++++ .../zia_forwarding_control_rule_facts.py | 129 +++ .../zia_ip_source_anchoring_zpa_gateway.py | 90 +- plugins/modules/zia_url_filtering_rules.py | 6 +- poetry.lock | 675 ++++++------ pyproject.toml | 11 +- requirements.txt | 225 +++- tests/integration/run_all_tests.yml | 1 + .../tasks/main.yml | 2 +- .../tasks/main.yml | 4 +- .../defaults/main.yml | 47 + .../zia_forwarding_control_rule/meta/main.yml | 2 + .../tasks/main.yml | 209 ++++ tests/sanity/ignore-2.13.txt | 4 +- tests/sanity/ignore-2.14.txt | 4 +- tests/sanity/ignore-2.15.txt | 4 +- tests/sanity/ignore-2.16.txt | 4 +- 22 files changed, 2025 insertions(+), 494 deletions(-) create mode 100644 plugins/modules/zia_forwarding_control_rule.py create mode 100644 plugins/modules/zia_forwarding_control_rule_facts.py create mode 100644 tests/integration/targets/zia_forwarding_control_rule/defaults/main.yml create mode 100644 tests/integration/targets/zia_forwarding_control_rule/meta/main.yml create mode 100644 tests/integration/targets/zia_forwarding_control_rule/tasks/main.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a4b1d1..9b54e04 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -124,12 +124,12 @@ jobs: id: release uses: cycjimmy/semantic-release-action@v4 with: - semantic_version: 17.1.1 + semantic_version: 23.1.1 extra_plugins: | conventional-changelog-conventionalcommits@^4.4.0 @semantic-release/changelog@^5.0.1 - @semantic-release/git@^9.0.0 - @semantic-release/exec@^5.0.0 + @semantic-release/git@^10.0.0 + @semantic-release/exec@^6.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/zia-test.yml b/.github/workflows/zia-test.yml index cd0237e..e06eb9c 100644 --- a/.github/workflows/zia-test.yml +++ b/.github/workflows/zia-test.yml @@ -100,11 +100,11 @@ jobs: matrix: python-version: ["3.10"] environment: - - ZIA_ZSCLOUD + # - ZIA_ZSCLOUD - ZIA_ZS0 - # - ZIA_ZS1 + - ZIA_ZS1 - ZIA_ZS2 - # - ZIA_ZS3 + - ZIA_ZS3 environment: ${{ matrix.environment }} steps: - name: Checkout code diff --git a/README.md b/README.md index a4cbc28..aa32c66 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,6 @@ [![License](https://img.shields.io/github/license/zscaler/ziacloud-ansible?color=blue)](https://github.com/zscaler/ziacloud-ansible/v2/blob/master/LICENSE) [![Zscaler Community](https://img.shields.io/badge/zscaler-community-blue)](https://community.zscaler.com/) -
- - RedHat logo - - - Zscaler logo - -
- ## Zscaler Support -> **Disclaimer:** Please refer to our [General Support Statement](https://zscaler.github.io/ziacloud-ansible/support.html) before proceeding with the use of this collection. You can also refer to our [troubleshooting guide](https://zscaler.github.io/ziacloud-ansible/troubleshooting.html) for guidance on typical problems. @@ -29,7 +20,7 @@ This collection contains modules and plugins to assist in automating the configu ## Tested Ansible Versions -This collection is tested with the most current Ansible releases. Ansible versions +This collection is tested with the most current Ansible releases. Ansible versions before 2.15 are **not supported**. ## Python dependencies @@ -40,21 +31,21 @@ The Python module dependencies are not automatically handled by `ansible-galaxy` 1. Utilize the `requirements.txt` file located [here](https://github.com/zscaler/ziacloud-ansible/blob/master/requirements.txt) to install all required packages: - ```bash + ```sh pip install -r requirements.txt - ``` + ``` 2. Alternatively, install the [Zscaler SDK Python](https://pypi.org/project/zscaler-sdk-python/) package directly: - ```bash + ```sh pip install zscaler-sdk-python - ``` + ``` ## Installation Install this collection using the Ansible Galaxy CLI: -```bash +```sh ansible-galaxy collection install zscaler.ziacloud ``` diff --git a/docs/source/installation.rst b/docs/source/installation.rst index ca4d15f..d2da9e9 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -26,6 +26,6 @@ Then in your playbooks you can specify that you want to use the collections: - zscaler.ziacloud -* Ansible Galaxy: https://galaxy.ansible.com/ui/repo/published/zscaler/ziacloud/ -* Red Hat Catalog: https://catalog.redhat.com/software/collection/zscaler/ziacloud -* GitHub repo: https://github.com/zscaler/ziacloud-ansible +* `Ansible Galaxy `_ +* `Red Hat Catalog `_ +* `GitHub repo `_ diff --git a/plugins/modules/zia_cloud_firewall_network_services.py b/plugins/modules/zia_cloud_firewall_network_services.py index 76b24cb..5fdb714 100644 --- a/plugins/modules/zia_cloud_firewall_network_services.py +++ b/plugins/modules/zia_cloud_firewall_network_services.py @@ -228,6 +228,9 @@ from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule +from ansible_collections.zscaler.ziacloud.plugins.module_utils.utils import ( + deleteNone, +) from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ( ZIAClientHelper, ) @@ -235,21 +238,13 @@ def normalize_service(service): """ - Normalize ip source group data by setting computed values. + Normalize network service data by setting computed values. """ normalized = service.copy() computed_values = [ - "id", - "name", - "description", - "tag", - "type", - "src_tcp_ports", - "dest_tcp_ports", - "src_udp_ports", - "dest_udp_ports", - "is_name_l10n_tag", + "creatorContext", + "isNameL10nTag", ] for attr in computed_values: normalized.pop(attr, None) @@ -312,35 +307,51 @@ def core(module): existing_network_service.update(normalized_service) existing_network_service["id"] = id + module.warn(f"Final payload being sent to SDK: {normalized_service}") if state == "present": if existing_network_service is not None: if differences_detected: """Update""" - existing_network_service = client.firewall.update_network_service( - service_id=existing_network_service.get("id", ""), - name=existing_network_service.get("name", ""), - description=existing_network_service.get("description", ""), - type=existing_network_service.get("type", ""), - tag=existing_network_service.get("tag", ""), - src_tcp_ports=existing_network_service.get("src_tcp_ports", ""), - dest_tcp_ports=existing_network_service.get("dest_tcp_ports", ""), - src_udp_ports=existing_network_service.get("src_udp_ports", ""), - dest_udp_ports=existing_network_service.get("dest_udp_ports", ""), - ).to_dict() - module.exit_json(changed=True, data=existing_network_service) + update_service = deleteNone( + dict( + service_id=existing_network_service.get("id"), + name=existing_network_service.get("name"), + description=existing_network_service.get("description"), + type=existing_network_service.get("type"), + tag=existing_network_service.get("tag"), + src_tcp_ports=existing_network_service.get("src_tcp_ports"), + dest_tcp_ports=existing_network_service.get("dest_tcp_ports"), + src_udp_ports=existing_network_service.get("src_udp_ports"), + dest_udp_ports=existing_network_service.get("dest_udp_ports"), + ) + ) + module.warn("Payload Update for SDK: {}".format(update_service)) + update_service = client.firewall.update_network_service( + **update_service + ).to_dict() + module.exit_json(changed=True, data=update_service) + else: + module.exit_json(changed=False, data=existing_network_service) else: + module.warn("Creating new service as no existing service found") """Create""" - network_service = client.firewall.add_network_service( - name=network_service.get("name", ""), - tag=network_service.get("tag", ""), - type=network_service.get("type", ""), - src_tcp_ports=network_service.get("src_tcp_ports", ""), - dest_tcp_ports=network_service.get("dest_tcp_ports", ""), - src_udp_ports=network_service.get("src_udp_ports", ""), - dest_udp_ports=network_service.get("dest_udp_ports", ""), - description=network_service.get("description", ""), + create_service = deleteNone( + dict( + name=network_service.get("name"), + tag=network_service.get("tag"), + type=network_service.get("type"), + src_tcp_ports=network_service.get("src_tcp_ports"), + dest_tcp_ports=network_service.get("dest_tcp_ports"), + src_udp_ports=network_service.get("src_udp_ports"), + dest_udp_ports=network_service.get("dest_udp_ports"), + description=network_service.get("description"), + ) + ) + module.warn("Payload for SDK: {}".format(create_service)) + create_service = client.firewall.add_network_service( + **create_service ).to_dict() - module.exit_json(changed=False, data=network_service) + module.exit_json(changed=True, data=create_service) elif state == "absent": if existing_network_service is not None: service_type = existing_network_service.get("type") diff --git a/plugins/modules/zia_forwarding_control_rule.py b/plugins/modules/zia_forwarding_control_rule.py new file mode 100644 index 0000000..1eb5e96 --- /dev/null +++ b/plugins/modules/zia_forwarding_control_rule.py @@ -0,0 +1,986 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Zscaler Technology Alliances, + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = r""" +--- +module: zia_forwarding_control_rule +short_description: "Forwarding Control policy rule" +description: "Adds a new Forwarding Control policy rule" +author: + - William Guilherme (@willguibr) +version_added: "0.1.0" +requirements: + - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) +extends_documentation_fragment: + - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation + - zscaler.ziacloud.fragments.state + +options: + id: + description: "Unique identifier for the Forwarding Control policy rule" + required: false + type: int + name: + description: "Name of the Forwarding Control policy rule" + required: true + type: str + description: + description: "Indicates whether the forwarding rule is enabled or disabled" + required: false + type: str + order: + description: "Rule order number of the Forwarding Control policy rule" + required: true + type: int + rank: + description: "Admin rank of the Forwarding Control policy rule" + required: false + default: 7 + type: int + locations: + description: "The locations to which the Forwarding Control policy rule applies" + type: list + elements: int + required: false + location_groups: + description: "The location groups to which the Forwarding Control policy rule applies" + type: list + elements: int + required: false + ec_groups: + description: "Name-ID pairs of the Zscaler Cloud Connector groups to which the forwarding rule applies" + type: list + elements: int + required: false + departments: + description: "The departments to which the Forwarding Control policy rule applies" + type: list + elements: int + required: false + groups: + description: "The groups to which the Forwarding Control policy rule applies" + type: list + elements: int + required: false + users: + description: "The users to which the Forwarding Control policy rule applies" + type: list + elements: int + required: false + type: + description: "The rule type selected from the available options" + required: false + type: str + choices: + - FIREWALL + - DNS + - DNAT + - SNAT + - FORWARDING + - INTRUSION_PREVENTION + - EC_DNS + - EC_RDR + - EC_SELF + - DNS_RESPONSE + forward_method: + description: "The type of traffic forwarding method selected from the available options" + required: false + type: str + choices: + - INVALID + - DIRECT + - PROXYCHAIN + - ZIA + - ZPA + - ECZPA + - ECSELF + - DROP + enabled: + description: Determines whether the Forwarding Control policy rule is enabled or disabled + required: false + type: bool + src_ips: + description: + - User-defined source IP addresses for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IP address. + type: list + elements: str + required: false + src_ip_groups: + description: + - User-defined source IP address groups for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IP address group. + type: list + elements: int + required: false + src_ipv6_groups: + description: + - Source IPv6 address groups for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IPv6 address group. + type: list + elements: int + required: false + dest_addresses: + description: + - List of destination IP addresses to which this rule will be applied. + - CIDR notation can be used for destination IP addresses. + type: list + elements: str + required: false + dest_ip_categories: + description: + - IP address categories of destination for which the DNAT rule is applicable. + - If not set, the rule is not restricted to specific destination IP categories. + type: list + elements: str + required: false + res_categories: + description: List of destination domain categories to which the rule applies + type: list + elements: str + required: false + dest_countries: + description: + - Destination countries for which the rule is applicable. + - If not set, the rule is not restricted to specific destination countries. + type: list + elements: str + required: false + dest_ip_groups: + description: + - User-defined destination IP address groups on which the rule is applied. + - If not set, the rule is not restricted to a specific destination IP address group. + type: list + elements: int + required: false + dest_ipv6_groups: + description: + - Destination IPv6 address groups for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IPv6 address group. + type: list + elements: int + required: false + nw_services: + description: + - User-defined network services on which the rule is applied. + - If not set, the rule is not restricted to a specific network service. + type: list + elements: int + required: false + nw_service_groups: + description: + - User-defined network service group on which the rule is applied. + - If not set, the rule is not restricted to a specific network service group. + type: list + elements: int + required: false + nw_applications: + description: + - User-defined network service applications on which the rule is applied. + - If not set, the rule is not restricted to a specific network service application. + type: list + elements: int + required: false + nw_application_groups: + description: + - User-defined network service application group on which the rule is applied. + - If not set, the rule is not restricted to a specific network service application group. + type: list + elements: int + required: false + app_service_groups: + description: "Application service groups on which this rule is applied" + type: list + elements: int + required: false + labels: + description: "Labels that are applicable to the rule." + type: list + elements: int + required: false + proxy_gateway: + description: + - The proxy gateway for which the rule is applicable. + - This field is applicable only for the Proxy Chaining forwarding method. + type: dict + required: false + suboptions: + id: + description: The Identifier that uniquely identifies Proxy Gateway entity + type: int + required: true + name: + description: The configured name of the Proxy Gateway entity + type: str + required: true + zpa_gateway: + description: + - The ZPA Server Group for which this rule is applicable. + - Only the Server Groups that are associated with the selected Application Segments are allowed. + - This field is applicable only for the ZPA forwarding method. + type: dict + required: false + suboptions: + id: + description: The Identifier that uniquely identifies the ZPA Gateway entity + type: int + required: true + name: + description: The configured name of the ZPA Gateway entity + type: str + required: true + zpa_app_segments: + description: + - The list of ZPA Application Segments for which this rule is applicable. + - This field is applicable only for the ZPA forwarding method. + type: list + elements: dict + required: false + suboptions: + external_id: + description: Indicates the external ID. Applicable only when this reference is of an external entity. + type: str + required: true + name: + description: The name of the Application Segment + type: str + required: true + zpa_application_segments: + description: + - List of ZPA Application Segments for which this rule is applicable. + - This field is applicable only for the ECZPA forwarding method (used for Zscaler Cloud Connector). + type: list + elements: dict + required: false + suboptions: + id: + description: A unique identifier assigned to the Application Segment + type: int + required: true + name: + description: The name of the Application Segment + type: str + required: true + zpa_application_segment_groups: + description: + - List of ZPA Application Segment Groups for which this rule is applicable. + - This field is applicable only for the ECZPA forwarding method (used for Zscaler Cloud Connector). + type: list + elements: dict + required: false + suboptions: + id: + description: A unique identifier assigned to the Application Segment Group + type: int + required: true + name: + description: The name of the Application Segment Group + type: str + required: true +""" + +EXAMPLES = r""" +- name: Create/Update Forwarding Control DIRECT Forward Method + zscaler.ziacloud.zia_forwarding_control_rule: + provider: '{{ provider }}' + name: 'Example' + description: 'TT#1965232865' + type: 'FORWARDING' + forward_method: 'DIRECT' + enabled: true + order: 1 + zpa_gateway: + - id: 2590247 + name: 'ZPA_GW01' + +- name: Create/Update Forwarding Control ZPA Forward Method + zscaler.ziacloud.zia_forwarding_control_rule: + provider: '{{ provider }}' + name: 'Example' + description: 'TT#1965232865' + type: 'FORWARDING' + forward_method: 'ZPA' + enabled: true + order: 1 + zpa_app_segments: + - external_id: "216199618143393478" + name: Example300 + - external_id: "216199618143393479" + name: Example400 + zpa_gateway: + - id: 2590247 + name: 'ZPA_GW01' +""" + +RETURN = r""" +# Returns information on the newly created cloud Forwarding Control rule. +""" + + +from traceback import format_exc + +from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.zscaler.ziacloud.plugins.module_utils.utils import ( + deleteNone, + validate_iso3166_alpha2, +) +from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ( + ZIAClientHelper, +) + + +def normalize_rule(rule): + """ + Normalize rule data by setting computed values. + """ + normalized = rule.copy() + + computed_values = [ + "id", + "src_ips", + "dest_addresses", + "dest_countries", + "dest_ip_categories", + "res_categories", + "proxy_gateway", + "zpa_gateway", + "zpa_app_segments", + "zpa_application_segments", + "zpa_application_segment_groups", + ] + + for attr in computed_values: + if attr in normalized and normalized[attr] is None: + normalized[attr] = [] + + if attr == "zpa_app_segments" and attr in normalized: + normalized[attr] = [ + { + "external_id": segment.get("external_id", ""), + "name": segment.get("name", ""), + } + for segment in normalized[attr] or [] + ] + elif attr in normalized: + normalized[attr] = normalized[attr] + else: + normalized[attr] = [] + + return normalized + + +def validate_forwarding_rule_constraints(module): + forward_method = module.params.get("forward_method") + rule_type = module.params.get("type") + + def is_set(attr): + return module.params.get(attr) is not None + + if rule_type == "FORWARDING": + if forward_method == "ZPA": + required_attrs = ["zpa_app_segments", "zpa_gateway"] + missing_attrs = [attr for attr in required_attrs if not is_set(attr)] + if missing_attrs: + missing_attrs_str = ", ".join(missing_attrs) + module.fail_json( + msg=f"The {missing_attrs_str} are required for ZPA forwarding" + ) + + elif forward_method == "DIRECT": + prohibited_attrs = [ + "zpa_gateway", + "proxy_gateway", + "zpa_app_segments", + "zpa_application_segments", + "zpa_application_segment_groups", + ] + for attr in prohibited_attrs: + if is_set(attr): + module.fail_json( + msg=f"{attr} attribute cannot be set when type is 'FORWARDING' and forward_method is 'DIRECT'" + ) + + elif forward_method == "PROXYCHAIN": + if not is_set("proxy_gateway"): + module.fail_json( + msg="Proxy gateway is mandatory for Proxy Chaining forwarding" + ) + prohibited_attrs = [ + "zpa_gateway", + "zpa_app_segments", + "zpa_application_segments", + "zpa_application_segment_groups", + ] + for attr in prohibited_attrs: + if is_set(attr): + module.fail_json( + msg=f"{attr} attribute cannot be set when type is 'FORWARDING' and forward_method is 'PROXYCHAIN'" + ) + + return None + + +def core(module): + state = module.params.get("state", None) + client = ZIAClientHelper(module) + rule = dict() + params = [ + "id", + "name", + "description", + "enabled", + "order", + "rank", + "locations", + "location_groups", + "ec_groups", + "departments", + "groups", + "users", + "type", + "forward_method", + "src_ips", + "src_ip_groups", + "src_ipv6_groups", + "dest_addresses", + "dest_ip_categories", + "dest_countries", + "res_categories", + "dest_ip_groups", + "dest_ipv6_groups", + "nw_services", + "nw_service_groups", + "nw_applications", + "nw_application_groups", + "app_service_groups", + "labels", + "proxy_gateway", + "zpa_gateway", + "zpa_app_segments", + "zpa_application_segments", + "zpa_application_segment_groups", + ] + for param_name in params: + rule[param_name] = module.params.get(param_name, None) + + # Validate forwarding rule constraints + validation_error = validate_forwarding_rule_constraints(module) + if validation_error: + return validation_error # This will terminate the execution if there's a validation error + + # Perform validation and prepending 'COUNTRY_' for dest_countries + dest_countries = rule.get("dest_countries") + if dest_countries: + validated_dest_countries = [] + for country_code in dest_countries: + if validate_iso3166_alpha2(country_code): + validated_dest_countries.append(f"COUNTRY_{country_code}") + else: + module.fail_json( + msg=( + f"The destination country code '{country_code}' is not a valid ISO3166 Alpha2 code. " + "Please visit the following site for reference: " + "https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes" + ) + ) + rule["dest_countries"] = validated_dest_countries + + # Preprocess specific attributes + def preprocess_attributes(rule): + if rule.get("proxy_gateway"): + rule["proxy_gateway"] = { + "id": rule["proxy_gateway"]["id"], + "name": rule["proxy_gateway"]["name"], + } + if rule.get("zpa_gateway"): + rule["zpa_gateway"] = { + "id": rule["zpa_gateway"]["id"], + "name": rule["zpa_gateway"]["name"], + } + if rule.get("zpa_app_segments"): + if rule["zpa_app_segments"] is None: + rule["zpa_app_segments"] = [] + else: + rule["zpa_app_segments"] = [ + {"external_id": segment["external_id"], "name": segment["name"]} + for segment in rule["zpa_app_segments"] + ] + if rule.get("zpa_application_segments"): + rule["zpa_application_segments"] = [ + {"id": segment["id"], "name": segment["name"]} + for segment in rule["zpa_application_segments"] + ] + if rule.get("zpa_application_segment_groups"): + rule["zpa_application_segment_groups"] = [ + {"id": segment["id"], "name": segment["name"]} + for segment in rule["zpa_application_segment_groups"] + ] + + preprocess_attributes(rule) # Ensure this call is included + + rule_id = rule.get("id", None) + rule_name = rule.get("name", None) + + existing_rule = None + if rule_id is not None: + ruleBox = client.forwarding_control.get_rule(rule_id=rule_id) + if ruleBox is not None: + existing_rule = ruleBox.to_dict() + elif rule_name is not None: + rules = client.forwarding_control.list_rules().to_list() + for rule_ in rules: + if rule_.get("name") == rule_name: + existing_rule = rule_ + + # Normalize and compare existing and desired data + desired_rule = normalize_rule(rule) + current_rule = normalize_rule(existing_rule) if existing_rule else {} + + def preprocess_rules(rule, params): + """ + Preprocess specific attributes in the rule based on their type and structure. + :param rule: Dict containing the rule data. + :param params: List of attribute names to be processed. + :return: Preprocessed rule. + """ + for attr in params: + if attr in rule and rule[attr] is not None: + # Process list attributes + if isinstance(rule[attr], list): + # If list contains dictionaries with 'id', extract IDs + if all( + isinstance(item, dict) and "id" in item for item in rule[attr] + ): + rule[attr] = [item["id"] for item in rule[attr]] + elif all(isinstance(item, dict) for item in rule[attr]): + # Handle lists of dictionaries without sorting + rule[attr] = sorted( + rule[attr], + key=lambda x: (x.get("external_id", ""), x.get("name", "")), + ) + else: + # Sort lists for consistent order + rule[attr] = sorted(rule[attr]) + # Add more conditions here if needed for other types + return rule + + existing_rule_preprocessed = preprocess_rules(current_rule, params) + desired_rule_preprocessed = preprocess_rules(desired_rule, params) + + # Then proceed with your comparison logic + differences_detected = False + for key in params: + desired_value = desired_rule_preprocessed.get(key) + current_value = existing_rule_preprocessed.get(key) + + # Handling for list attributes where None should be treated as an empty list + if isinstance(current_value, list) and desired_value is None: + desired_value = [] + + # Skip comparison for 'id' if it's not in the desired rule but present in the existing rule + if key == "id" and desired_value is None and current_value is not None: + continue + + # Convert 'state' in current_rule to boolean 'enabled' + if key == "enabled" and "state" in current_rule: + current_value = current_rule["state"] == "ENABLED" + + # Handling None values for all attributes + if desired_value is None and key != "enabled": + # Explicitly setting to empty list or empty value based on type + rule[key] = [] if isinstance(current_value, list) else None + + # Special handling for lists of IDs + if isinstance(desired_value, list) and isinstance(current_value, list): + if all(isinstance(x, int) for x in desired_value) and all( + isinstance(x, int) for x in current_value + ): + desired_value = sorted(desired_value) + current_value = sorted(current_value) + + if current_value != desired_value: + differences_detected = True + module.warn( + f"Difference detected in {key}. Current: {current_value}, Desired: {desired_value}" + ) + + if existing_rule is not None: + id = existing_rule.get("id") + existing_rule.update(rule) + existing_rule["id"] = id + + module.warn(f"Final payload being sent to SDK: {rule}") + if state == "present": + if existing_rule is not None: + if differences_detected: + """Update""" + update_rule = deleteNone( + dict( + rule_id=existing_rule.get("id"), + name=existing_rule.get("name"), + order=existing_rule.get("order"), + rank=existing_rule.get("rank"), + type=existing_rule.get("type"), + forward_method=existing_rule.get("forward_method"), + enabled=existing_rule.get("enabled"), + description=existing_rule.get("description"), + src_ips=existing_rule.get("src_ips"), + dest_addresses=existing_rule.get("dest_addresses"), + dest_ip_categories=existing_rule.get("dest_ip_categories"), + dest_countries=existing_rule.get("dest_countries"), + res_categories=existing_rule.get("res_categories"), + nw_applications=existing_rule.get("nw_applications"), + dest_ip_groups=existing_rule.get("dest_ip_groups"), + nw_services=existing_rule.get("nw_services"), + nw_service_groups=existing_rule.get("nw_service_groups"), + nw_application_groups=existing_rule.get( + "nw_application_groups" + ), + app_service_groups=existing_rule.get("app_service_groups"), + labels=existing_rule.get("labels"), + locations=existing_rule.get("locations"), + location_groups=existing_rule.get("location_groups"), + ec_groups=existing_rule.get("ec_groups"), + departments=existing_rule.get("departments"), + groups=existing_rule.get("groups"), + users=existing_rule.get("users"), + src_ip_groups=existing_rule.get("src_ip_groups"), + proxy_gateway=existing_rule.get("proxy_gateway"), + zpa_gateway=existing_rule.get("zpa_gateway"), + zpa_app_segments=existing_rule.get("zpa_app_segments"), + zpa_application_segments=existing_rule.get( + "zpa_application_segments" + ), + zpa_application_segment_groups=existing_rule.get( + "zpa_application_segment_groups" + ), + ) + ) + module.warn("Payload Update for SDK: {}".format(update_rule)) + updated_rule = client.forwarding_control.update_rule( + **update_rule + ).to_dict() + module.exit_json(changed=True, data=updated_rule) + else: + """No changes needed""" + module.exit_json( + changed=False, data=existing_rule, msg="No changes detected." + ) + else: + module.warn("Creating new rule as no existing rule found") + """Create""" + create_rule = deleteNone( + dict( + name=rule.get("name"), + description=rule.get("description"), + order=rule.get("order"), + rank=rule.get("rank"), + type=rule.get("type"), + forward_method=rule.get("forward_method"), + enabled=rule.get("enabled"), + src_ips=rule.get("src_ips"), + dest_addresses=rule.get("dest_addresses"), + dest_ip_categories=rule.get("dest_ip_categories"), + dest_countries=rule.get("dest_countries"), + res_categories=rule.get("res_categories"), + nw_applications=rule.get("nw_applications"), + dest_ip_groups=rule.get("dest_ip_groups"), + dest_ipv6_groups=rule.get("dest_ipv6_groups"), + nw_services=rule.get("nw_services"), + nw_service_groups=rule.get("nw_service_groups"), + nw_application_groups=rule.get("nw_application_groups"), + app_service_groups=rule.get("app_service_groups"), + labels=rule.get("labels"), + locations=rule.get("locations"), + location_groups=rule.get("location_groups"), + ec_groups=rule.get("ec_groups"), + departments=rule.get("departments"), + groups=rule.get("groups"), + users=rule.get("users"), + src_ip_groups=rule.get("src_ip_groups"), + src_ipv6_groups=rule.get("src_ipv6_groups"), + proxy_gateway=rule.get("proxy_gateway"), + zpa_gateway=rule.get("zpa_gateway"), + zpa_app_segments=rule.get("zpa_app_segments"), + zpa_application_segments=rule.get("zpa_application_segments"), + zpa_application_segment_groups=rule.get( + "zpa_application_segment_groups" + ), + ) + ) + module.warn("Payload for SDK: {}".format(create_rule)) + new_rule = client.forwarding_control.add_rule(**create_rule).to_dict() + module.exit_json(changed=True, data=new_rule) + elif ( + state == "absent" + and existing_rule is not None + and existing_rule.get("id") is not None + ): + code = client.forwarding_control.delete_rule(rule_id=existing_rule.get("id")) + if code > 299: + module.exit_json(changed=False, data=None) + module.exit_json(changed=True, data=existing_rule) + module.exit_json(changed=False, data={}) + + +def main(): + argument_spec = ZIAClientHelper.zia_argument_spec() + id_spec = dict( + type="list", + elements="int", + required=False, + ) + # Define the spec for a dictionary with id and name + id_name_dict_spec = dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ) + external_id_name_dict_spec = dict( + external_id=dict(type="str", required=True), + name=dict(type="str", required=True), + ) + + # Define specifications for nested dictionaries + proxy_gateway_spec = dict( + type="dict", + required=False, + options=dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ), + ) + + zpa_gateway_spec = dict( + type="dict", + required=False, + options=dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ), + ) + + argument_spec.update( + id=dict(type="int", required=False), + name=dict(type="str", required=True), + description=dict(type="str", required=False), + enabled=dict(type="bool", required=False), + order=dict(type="int", required=True), + rank=dict(type="int", required=False, default=7), + src_ips=dict(type="list", elements="str", required=False), + dest_addresses=dict(type="list", elements="str", required=False), + dest_ip_categories=dict(type="list", elements="str", required=False), + dest_countries=dict(type="list", elements="str", required=False), + res_categories=dict(type="list", elements="str", required=False), + source_countries=dict(type="list", elements="str", required=False), + type=dict( + type="str", + required=False, + choices=[ + "FIREWALL", + "DNS", + "DNAT", + "SNAT", + "FORWARDING", + "INTRUSION_PREVENTION", + "EC_DNS", + "EC_RDR", + "EC_SELF", + "DNS_RESPONSE", + ], + ), + forward_method=dict( + type="str", + required=False, + choices=[ + "INVALID", + "DIRECT", + "PROXYCHAIN", + "ZIA", + "ZPA", + "ECZPA", + "ECSELF", + "DROP", + ], + ), + device_groups=id_spec, + nw_applications=id_spec, + dest_ip_groups=id_spec, + dest_ipv6_groups=id_spec, + nw_services=id_spec, + nw_service_groups=id_spec, + nw_application_groups=id_spec, + app_service_groups=id_spec, + labels=id_spec, + locations=id_spec, + location_groups=id_spec, + ec_groups=id_spec, + departments=id_spec, + groups=id_spec, + users=id_spec, + src_ip_groups=id_spec, + src_ipv6_groups=id_spec, + proxy_gateway=proxy_gateway_spec, + zpa_gateway=zpa_gateway_spec, + zpa_app_segments=external_id_name_dict_spec, + zpa_application_segments=id_name_dict_spec, + zpa_application_segment_groups=id_name_dict_spec, + state=dict(type="str", choices=["present", "absent"], default="present"), + ) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + try: + core(module) + except Exception as e: + module.fail_json(msg=to_native(e), exception=format_exc()) + + +def main(): + argument_spec = ZIAClientHelper.zia_argument_spec() + id_spec = dict( + type="list", + elements="int", + required=False, + ) + # Define the spec for a dictionary with id and name + id_name_dict_spec = dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ) + external_id_name_dict_spec = dict( + external_id=dict(type="str", required=True), + name=dict(type="str", required=True), + ) + + # Define specifications for nested dictionaries + proxy_gateway_spec = dict( + type="dict", + required=False, + options=dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ), + ) + + zpa_gateway_spec = dict( + type="dict", + required=False, + options=dict( + id=dict(type="int", required=True), + name=dict(type="str", required=True), + ), + ) + + # Define the spec for a list of dictionaries with external_id and name + external_id_name_list_spec = dict( + type="list", + elements="dict", + required=False, + options=external_id_name_dict_spec, + ) + + id_name_list_spec = dict( + type="list", + elements="dict", + required=False, + options=id_name_dict_spec, + ) + + argument_spec.update( + id=dict(type="int", required=False), + name=dict(type="str", required=True), + description=dict(type="str", required=False), + enabled=dict(type="bool", required=False), + order=dict(type="int", required=True), + rank=dict(type="int", required=False, default=7), + src_ips=dict(type="list", elements="str", required=False), + dest_addresses=dict(type="list", elements="str", required=False), + dest_ip_categories=dict(type="list", elements="str", required=False), + dest_countries=dict(type="list", elements="str", required=False), + res_categories=dict(type="list", elements="str", required=False), + type=dict( + type="str", + required=False, + choices=[ + "FIREWALL", + "DNS", + "DNAT", + "SNAT", + "FORWARDING", + "INTRUSION_PREVENTION", + "EC_DNS", + "EC_RDR", + "EC_SELF", + "DNS_RESPONSE", + ], + ), + forward_method=dict( + type="str", + required=False, + choices=[ + "INVALID", + "DIRECT", + "PROXYCHAIN", + "ZIA", + "ZPA", + "ECZPA", + "ECSELF", + "DROP", + ], + ), + nw_applications=id_spec, + dest_ip_groups=id_spec, + dest_ipv6_groups=id_spec, + nw_services=id_spec, + nw_service_groups=id_spec, + nw_application_groups=id_spec, + app_service_groups=id_spec, + labels=id_spec, + locations=id_spec, + location_groups=id_spec, + ec_groups=id_spec, + departments=id_spec, + groups=id_spec, + users=id_spec, + src_ip_groups=id_spec, + src_ipv6_groups=id_spec, + proxy_gateway=proxy_gateway_spec, + zpa_gateway=zpa_gateway_spec, + zpa_app_segments=external_id_name_list_spec, + zpa_application_segments=id_name_list_spec, + zpa_application_segment_groups=id_name_list_spec, + state=dict(type="str", choices=["present", "absent"], default="present"), + ) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + try: + core(module) + except Exception as e: + module.fail_json(msg=to_native(e), exception=format_exc()) + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/zia_forwarding_control_rule_facts.py b/plugins/modules/zia_forwarding_control_rule_facts.py new file mode 100644 index 0000000..6528fd6 --- /dev/null +++ b/plugins/modules/zia_forwarding_control_rule_facts.py @@ -0,0 +1,129 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Zscaler Inc, + +# MIT License +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = r""" +--- +module: zia_forwarding_control_rule_facts +short_description: "Gets all rules in the Forwarding Control policy." +description: "Gets the list of forwarding rules configured in the ZIA Admin Portal." +author: + - William Guilherme (@willguibr) +version_added: "1.0.0" +requirements: + - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) +extends_documentation_fragment: + - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation + +options: + id: + description: "Unique identifier for the Forwarding Filtering policy rule" + type: int + required: false + name: + description: "Name of the Forwarding Filtering policy rule" + required: false + type: str +""" + +EXAMPLES = r""" +- name: Gather Information Details of all ZIA Forwarding Control Rule + zscaler.ziacloud.zia_forwarding_control_rules_facts: + provider: '{{ provider }}' + +- name: Gather Information Details of a ZIA Forwarding Control Rule by Name + zscaler.ziacloud.zia_forwarding_control_rules_facts: + provider: '{{ provider }}' + name: "Example" +""" + +RETURN = r""" +# Returns information on a specified ZIA Forwarding Control Rule. +""" + + +from traceback import format_exc + +from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ( + ZIAClientHelper, +) + + +def core(module): + rule_id = module.params.get("id", None) + rule_name = module.params.get("name", None) + client = ZIAClientHelper(module) + rules = [] + + if rule_id is not None: + # Fetch rule by ID + ruleBox = client.forwarding_control.get_rule(rule_id=rule_id) + if ruleBox is None: + module.fail_json( + msg="Failed to retrieve Forwarding Control Rule ID: '%s'" % (rule_id) + ) + rules = [ruleBox.to_dict()] + else: + # Fetch all rules and search by name + all_rules = client.forwarding_control.list_rules().to_list() + if rule_name is not None: + # Iterate over rules to find the matching name + for rule in all_rules: + if rule.get("name") == rule_name: + rules = [rule] + break + # Handle case where no rule with the given name is found + if not rules: + module.fail_json( + msg="Failed to retrieve Forwarding Control Rule Name: '%s'" + % (rule_name) + ) + else: + # Return all rules if no specific name is provided + rules = all_rules + + module.exit_json(changed=False, data=rules) + + +def main(): + argument_spec = ZIAClientHelper.zia_argument_spec() + argument_spec.update( + name=dict(type="str", required=False), + id=dict(type="int", required=False), + ) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + try: + core(module) + except Exception as e: + module.fail_json(msg=to_native(e), exception=format_exc()) + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py b/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py index ed7ad65..a07c1ad 100644 --- a/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py +++ b/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py @@ -72,51 +72,23 @@ external_id: description: "External identifier for the server group, managed outside of ZIA." required: true - type: int - name: - description: "Name of the server group." - required: true type: str - zpa_app_segments: - description: "Application segments associated with the server group. Optional if segments are predefined at the server group level." - required: false - type: list - elements: dict - suboptions: - external_id: - description: "External identifier for the application segment." - required: true - type: int name: - description: "Name of the application segment." + description: "Name of the server group." required: true type: str """ + EXAMPLES = r""" -- name: Create or update a ZPA Gateway with application segments +- name: Create or update a ZPA Gateway zscaler.ziacloud.zia_ip_source_anchoring_zpa_gateway: provider: '{{ provider }}' - name: "ZPA_GW02" - description: "ZPA Gateway for internal apps" + name: 'ZPA_GW01' + description: 'TT#1965432123' type: "ZPA" zpa_server_group: external_id: 216196257331370454 - name: "Server Group for IP Anchoring" - zpa_app_segments: - - external_id: 216196257331370455 - name: "App Segment 1" - - external_id: 216196257331370465 - name: "App Segment 2" - -- name: Update a ZPA Gateway without specifying application segments - zscaler.ziacloud.zia_ip_source_anchoring_zpa_gateway: - provider: '{{ provider }}' - name: "ZPA_GW02" - description: "ZPA Gateway update" - type: "ZPA" - zpa_server_group: - external_id: 216196257331370454 - name: "Updated Server Group" + name: "SRV01" """ RETURN = r""" # Returns information on the newly created ZPA Gateway. @@ -152,13 +124,6 @@ def normalize_gateway(gateway): "name": sg.get("name"), } - # Ensure external_id is a string for each item in 'zpa_app_segments' - if normalized.get("zpa_app_segments"): - normalized["zpa_app_segments"] = [ - {"external_id": str(seg.get("external_id")), "name": seg.get("name")} - for seg in normalized["zpa_app_segments"] - ] - return normalized @@ -197,7 +162,6 @@ def core(module): "name", "description", "zpa_server_group", - "zpa_app_segments", ] for param_name in params: gateway[param_name] = module.params.get(param_name, None) @@ -225,20 +189,8 @@ def core(module): for key, value in desired_gateway.items(): current_value = current_gateway.get(key) - # Skip comparison for 'zpa_app_segments' if it's not provided in the desired state - if key == "zpa_app_segments" and value is None: - continue - - # Special handling for 'type' attribute - if key == "type" and current_value is None: - if value != "ZPA": - differences_detected = True - module.warn( - f"Difference detected in {key}. Current: {current_value}, Desired: {value}" - ) - # Custom comparison for nested fields - elif key in ["zpa_server_group", "zpa_app_segments"]: + if key in ["zpa_server_group"]: if not compare_nested_structures(current_value, value): differences_detected = True module.warn( @@ -269,7 +221,6 @@ def core(module): description=existing_gateway.get("description"), type=existing_gateway.get("type"), zpa_server_group=existing_gateway.get("zpa_server_group"), - zpa_app_segments=existing_gateway.get("zpa_app_segments"), ) ) updated_gateway_response = client.zpa_gateway.update_gateway( @@ -297,7 +248,6 @@ def core(module): description=gateway.get("description"), type=gateway.get("type"), zpa_server_group=gateway.get("zpa_server_group"), - zpa_app_segments=gateway.get("zpa_app_segments"), ) ) module.warn("Payload for SDK: {}".format(create_gateway)) @@ -317,34 +267,24 @@ def core(module): def main(): argument_spec = ZIAClientHelper.zia_argument_spec() - - # Define the spec for a dictionary with external_id and name - external_id_name_dict_spec = dict( - external_id=dict(type="int", required=True), - name=dict(type="str", required=True), - ) - argument_spec.update( id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), - zpa_server_group=dict( - type="dict", - options=external_id_name_dict_spec, - required=True, - ), - zpa_app_segments=dict( - type="list", - elements="dict", - options=external_id_name_dict_spec, - required=False, - ), type=dict( type="str", required=False, default="ZPA", choices=["ZPA", "ECZPA"], ), + zpa_server_group=dict( + type="dict", + required=True, + options=dict( + external_id=dict(type="str", required=True), + name=dict(type="str", required=True), + ), + ), state=dict(type="str", choices=["present", "absent"], default="present"), ) diff --git a/plugins/modules/zia_url_filtering_rules.py b/plugins/modules/zia_url_filtering_rules.py index 8d972b9..ecdc3c7 100644 --- a/plugins/modules/zia_url_filtering_rules.py +++ b/plugins/modules/zia_url_filtering_rules.py @@ -447,7 +447,11 @@ def normalize_rule(rule): # Add 'profile_seq' to the list of computed values to be removed computed_values = ["profile_seq"] for attr in computed_values: - if "cbi_profile" in normalized and isinstance(normalized["cbi_profile"], dict) and attr in normalized["cbi_profile"]: + if ( + "cbi_profile" in normalized + and isinstance(normalized["cbi_profile"], dict) + and attr in normalized["cbi_profile"] + ): normalized["cbi_profile"].pop(attr, None) return normalized diff --git a/poetry.lock b/poetry.lock index 470f2ad..1dda7b9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,26 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "aenum" +version = "3.1.11" +description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" +optional = false +python-versions = "*" +files = [ + {file = "aenum-3.1.11-py2-none-any.whl", hash = "sha256:525b4870a27d0b471c265bda692bc657f1e0dd7597ad4186d072c59f9db666f6"}, + {file = "aenum-3.1.11-py3-none-any.whl", hash = "sha256:12ae89967f2e25c0ce28c293955d643f891603488bc3d9946158ba2b35203638"}, + {file = "aenum-3.1.11.tar.gz", hash = "sha256:aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73"}, +] + [[package]] name = "aiofiles" -version = "23.2.1" +version = "24.1.0" description = "File support for asyncio." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, - {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, + {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, + {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, ] [[package]] @@ -145,17 +157,17 @@ files = [ [[package]] name = "ansible-compat" -version = "24.5.1" +version = "24.6.1" description = "Ansible compatibility goodies" optional = false python-versions = ">=3.9" files = [ - {file = "ansible_compat-24.5.1-py3-none-any.whl", hash = "sha256:8d6dad5b99e87faa82569c2aaa57dd28f07931657a9e56ff2a7fd0e2127cce29"}, - {file = "ansible_compat-24.5.1.tar.gz", hash = "sha256:433fcc2212de13dd852c900bf17a70234847a1fe7b8edbea969cf321d5ad7841"}, + {file = "ansible_compat-24.6.1-py3-none-any.whl", hash = "sha256:1e1695454ea759b24beab7dfbeac18964553edca4a4ad0584567aa3eef491f0e"}, + {file = "ansible_compat-24.6.1.tar.gz", hash = "sha256:f93d4c347d8e1903c292449441c09a987d70366f9cadf9afe5e32dc8a0193cac"}, ] [package.dependencies] -ansible-core = ">=2.12" +ansible-core = ">=2.14" jsonschema = ">=4.6.0" packaging = "*" PyYAML = "*" @@ -432,33 +444,33 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "black" -version = "24.3.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, - {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, - {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, - {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, - {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, - {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, - {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, - {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, - {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, - {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, - {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, - {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, - {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, - {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, - {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, - {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, - {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, - {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, - {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, - {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, - {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, - {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -514,13 +526,13 @@ virtualenv = ["virtualenv (>=20.0.35)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -724,63 +736,63 @@ files = [ [[package]] name = "coverage" -version = "7.5.1" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, - {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, - {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, - {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, - {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, - {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, - {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, - {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, - {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, - {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.extras] @@ -788,43 +800,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -868,13 +880,13 @@ files = [ [[package]] name = "dpath" -version = "2.1.6" +version = "2.2.0" description = "Filesystem-like pathing and searching for dictionaries" optional = false python-versions = ">=3.7" files = [ - {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, - {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, + {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, + {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, ] [[package]] @@ -907,34 +919,34 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] name = "flake8" -version = "7.0.0" +version = "7.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, + {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, + {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" +pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" [[package]] @@ -1057,22 +1069,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "7.2.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, + {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" @@ -1166,6 +1178,21 @@ files = [ [package.dependencies] referencing = ">=0.31.0" +[[package]] +name = "jwcrypto" +version = "1.5.6" +description = "Implementation of JOSE Web standards" +optional = false +python-versions = ">= 3.8" +files = [ + {file = "jwcrypto-1.5.6-py3-none-any.whl", hash = "sha256:150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789"}, + {file = "jwcrypto-1.5.6.tar.gz", hash = "sha256:771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039"}, +] + +[package.dependencies] +cryptography = ">=3.4" +typing-extensions = ">=4.5.0" + [[package]] name = "lazy-object-proxy" version = "1.10.0" @@ -1439,27 +1466,50 @@ files = [ [[package]] name = "netaddr" -version = "1.2.1" +version = "1.3.0" description = "A network address manipulation library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "netaddr-1.2.1-py3-none-any.whl", hash = "sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e"}, - {file = "netaddr-1.2.1.tar.gz", hash = "sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987"}, + {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, + {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, ] [package.extras] nicer-shell = ["ipython"] +[[package]] +name = "okta" +version = "2.9.7" +description = "Python SDK for the Okta Management API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "okta-2.9.7-py2.py3-none-any.whl", hash = "sha256:94d334cffd0b93489c042bb1dc7694cd21635946f1511d8149e3553e4edb8885"}, + {file = "okta-2.9.7.tar.gz", hash = "sha256:c16dd08967321fd6f2332c2c4407562ee94551a828b9633ceef309b50faad941"}, +] + +[package.dependencies] +aenum = "3.1.11" +aiohttp = "*" +flatdict = "*" +jwcrypto = "*" +pycryptodomex = "*" +pydash = "*" +pyjwt = "*" +pyyaml = "*" +xmltodict = "*" +yarl = "*" + [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1517,24 +1567,24 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pycodestyle" -version = "2.11.1" +version = "2.12.0" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, + {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, + {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, ] [[package]] name = "pycountry" -version = "23.12.11" +version = "24.6.1" description = "ISO country, subdivision, language, currency and script definitions and their translations" optional = false python-versions = ">=3.8" files = [ - {file = "pycountry-23.12.11-py3-none-any.whl", hash = "sha256:2ff91cff4f40ff61086e773d61e72005fe95de4a57bfc765509db05695dc50ab"}, - {file = "pycountry-23.12.11.tar.gz", hash = "sha256:00569d82eaefbc6a490a311bfa84a9c571cff9ddbf8b0a4f4e7b4f868b4ad925"}, + {file = "pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f"}, + {file = "pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221"}, ] [[package]] @@ -1591,18 +1641,18 @@ files = [ [[package]] name = "pydantic" -version = "2.7.1" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.2" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -1610,95 +1660,112 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, - {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, - {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, - {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, - {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, - {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, - {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, - {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, - {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, - {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydash" +version = "8.0.1" +description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydash-8.0.1-py3-none-any.whl", hash = "sha256:60265bab97fd00d5afd27dfbff9b6abfa22d0a965e166476b9066d84cd44c940"}, + {file = "pydash-8.0.1.tar.gz", hash = "sha256:a24619643d3c054bfd56a9ae1cb7bd00e9774eaf369d7bb8d62b3daa2462bdbd"}, +] + +[package.dependencies] +typing-extensions = ">3.10,<4.6.0 || >4.6.0" + +[package.extras] +dev = ["build", "coverage", "furo", "invoke", "mypy", "pytest", "pytest-cov", "pytest-mypy-testing", "ruff", "sphinx", "sphinx-autodoc-typehints", "tox", "twine", "wheel"] + [[package]] name = "pyflakes" version = "3.2.0" @@ -1724,6 +1791,23 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pylint" version = "2.13.9" @@ -1761,13 +1845,13 @@ files = [ [[package]] name = "pytest" -version = "8.2.1" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, - {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -1820,25 +1904,28 @@ testing = ["filelock"] [[package]] name = "python-box" -version = "7.1.1" +version = "7.2.0" description = "Advanced Python dictionaries with dot notation access" optional = false python-versions = ">=3.8" files = [ - {file = "python-box-7.1.1.tar.gz", hash = "sha256:2a3df244a5a79ac8f8447b5d11b5be0f2747d7b141cb2866060081ae9b53cc50"}, - {file = "python_box-7.1.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:81ed1ec0f0ff2370227fc07277c5baca46d190a4747631bad7eb6ab1630fb7d9"}, - {file = "python_box-7.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8891735b4148e84d348c6eadd2f127152f751c9603e35d43a1f496183a291ac4"}, - {file = "python_box-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:0036fd47d388deaca8ebd65aea905f88ee6ef91d1d8ce34898b66f1824afbe80"}, - {file = "python_box-7.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aabf8b9ae5dbc8ba431d8cbe0d4cfe737a25d52d68b0f5f2ff34915c21a2c1db"}, - {file = "python_box-7.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c046608337e723ae4de3206db5d1e1202ed166da2dfdc70c1f9361e72ace5633"}, - {file = "python_box-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9266795e9c233874fb5b34fa994054b4fb0371881678e6ec45aec17fc95feac"}, - {file = "python_box-7.1.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f76b5b7f0cdc07bfdd4200dc24e6e33189bb2ae322137a2b7110fd41891a3157"}, - {file = "python_box-7.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea13c98e05a3ec0ff26f254986a17290b69b5ade209fad081fd628f8fcfaa08"}, - {file = "python_box-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3f346e332dba16df0b0543d319d9e7ce07d93e5ae152175302894352aa2d28"}, - {file = "python_box-7.1.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:24c4ec0ee0278f66321100aaa9c615413da27a14ff43d376a2a3b4665e1d9494"}, - {file = "python_box-7.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d95e5eec4fc8f3fc5c9cc7347fc2eb4f9187c853d34c90b1658d1eff96cd4eac"}, - {file = "python_box-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:a0f1333c42e81529b6f68c192050df9d4505b803be7ac47f114036b98707f7cf"}, - {file = "python_box-7.1.1-py3-none-any.whl", hash = "sha256:63b609555554d7a9d4b6e725f8e78ef1717c67e7d386200e03422ad612338df8"}, + {file = "python_box-7.2.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:6bdeec791e25258351388b3029a3ec5da302bb9ed3be175493c43cdc6c47f5e3"}, + {file = "python_box-7.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c449f7b3756a71479fa9c61a86e344ac00ed782a66d7662590f0afa294249d18"}, + {file = "python_box-7.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6b0d61f182d394106d963232854e495b51edc178faa5316a797be1178212d7e0"}, + {file = "python_box-7.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2d752de8c1204255bf7b0c814c59ef48293c187a7e9fdcd2fefa28024b72032"}, + {file = "python_box-7.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a6c35ea356a386077935958a5debcd5b229b9a1b3b26287a52dfe1a7e65d99"}, + {file = "python_box-7.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:32ed58ec4d9e5475efe69f9c7d773dfea90a6a01979e776da93fd2b0a5d04429"}, + {file = "python_box-7.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a2d664c6a27f7515469b6f1e461935a2038ee130b7d194b4b4db4e85d363618"}, + {file = "python_box-7.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a5a7365db1aaf600d3e8a2747fcf6833beb5d45439a54318548f02e302e3ec"}, + {file = "python_box-7.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:739f827056ea148cbea3122d4617c994e829b420b1331183d968b175304e3a4f"}, + {file = "python_box-7.2.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:2617ef3c3d199f55f63c908f540a4dc14ced9b18533a879e6171c94a6a436f23"}, + {file = "python_box-7.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd866bed03087b1d8340014da8c3aaae19135767580641df1b4ae6fff6ac0aa"}, + {file = "python_box-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:9681f059e7e92bdf20782cd9ea6e533d4711fc7b8c57a462922a025d46add4d0"}, + {file = "python_box-7.2.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:6b59b1e2741c9ceecdf5a5bd9b90502c24650e609cd824d434fed3b6f302b7bb"}, + {file = "python_box-7.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23fae825d809ae7520fdeac88bb52be55a3b63992120a00e381783669edf589"}, + {file = "python_box-7.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:573b1abdcb7bd745fa404444f060ee62fc35a74f067181e55dcb43cfe92f2827"}, + {file = "python_box-7.2.0-py3-none-any.whl", hash = "sha256:a3c90832dd772cb0197fdb5bc06123b6e1b846899a1b53d9c39450d27a584829"}, + {file = "python_box-7.2.0.tar.gz", hash = "sha256:551af20bdab3a60a2a21e3435120453c4ca32f7393787c3a5036e1d9fc6a0ede"}, ] [package.extras] @@ -1952,13 +2039,13 @@ rpds-py = ">=0.7.0" [[package]] name = "requests" -version = "2.32.2" +version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1990,13 +2077,13 @@ test = ["commentjson", "packaging", "pytest"] [[package]] name = "responses" -version = "0.25.0" +version = "0.25.3" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, - {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, + {file = "responses-0.25.3-py3-none-any.whl", hash = "sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb"}, + {file = "responses-0.25.3.tar.gz", hash = "sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba"}, ] [package.dependencies] @@ -2290,18 +2377,18 @@ doc = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "setuptools" -version = "70.0.0" +version = "70.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, - {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, + {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, + {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" @@ -2520,16 +2607,17 @@ test = ["pytest"] [[package]] name = "subprocess-tee" -version = "0.4.1" +version = "0.4.2" description = "subprocess-tee" optional = false python-versions = ">=3.8" files = [ - {file = "subprocess-tee-0.4.1.tar.gz", hash = "sha256:b3c124993f8b88d1eb1c2fde0bc2069787eac720ba88771cba17e8c93324825d"}, - {file = "subprocess_tee-0.4.1-py3-none-any.whl", hash = "sha256:eca56973a1c1237093c2055b2731bcaab784683b83f22c76f26e4c5763402e28"}, + {file = "subprocess_tee-0.4.2-py3-none-any.whl", hash = "sha256:21942e976715af4a19a526918adb03a8a27a8edab959f2d075b777e3d78f532d"}, + {file = "subprocess_tee-0.4.2.tar.gz", hash = "sha256:91b2b4da3aae9a7088d84acaf2ea0abee3f4fd9c0d2eae69a9b9122a71476590"}, ] [package.extras] +docs = ["argparse-manpage", "cairosvg", "markdown-include", "mkdocs", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-material-extensions", "mkdocstrings", "mkdocstrings-python", "pillow", "pymdown-extensions"] test = ["enrich (>=1.2.6)", "molecule (>=3.4.0)", "pytest (>=6.2.5)", "pytest-cov (>=2.12.1)", "pytest-plus (>=0.2)", "pytest-xdist (>=2.3.0)"] [[package]] @@ -2587,24 +2675,24 @@ files = [ [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -2615,13 +2703,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "voluptuous" -version = "0.14.2" +version = "0.15.0" description = "Python data validation library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "voluptuous-0.14.2-py3-none-any.whl", hash = "sha256:efc1dadc9ae32a30cc622602c1400a17b7bf8ee2770d64f70418144860739c3b"}, - {file = "voluptuous-0.14.2.tar.gz", hash = "sha256:533e36175967a310f1b73170d091232bf881403e4ebe52a9b4ade8404d151f5d"}, + {file = "voluptuous-0.15.0-py3-none-any.whl", hash = "sha256:ab8d0c3b74b83d062b72fde6ed120b9801d7acb7e504666b0f278dd214ae7ce5"}, + {file = "voluptuous-0.15.0.tar.gz", hash = "sha256:90fb449f6088f3985b24c0df79887e3823355639e0a6a220394ceac07258aea0"}, ] [[package]] @@ -2719,13 +2807,13 @@ files = [ [[package]] name = "xmltodict" -version = "0.12.0" +version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "xmltodict-0.12.0-py2.py3-none-any.whl", hash = "sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051"}, - {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"}, + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, ] [[package]] @@ -2851,54 +2939,55 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "zscaler-sdk-python" -version = "0.1.8" +version = "0.5.2" description = "Official Python SDK for the Zscaler Products (Beta)" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "zscaler_sdk_python-0.1.8-py3-none-any.whl", hash = "sha256:fd2a37b3f1e7b36e2e5e659cbf3c8088d4585b82edc0c37a2d615b4fade46f87"}, - {file = "zscaler_sdk_python-0.1.8.tar.gz", hash = "sha256:2061c8ee9c5c9b19b4eceb0d91e601ca987c5a7096c6066054d29b51c035a387"}, + {file = "zscaler_sdk_python-0.5.2-py3-none-any.whl", hash = "sha256:122fe8f3333fa56049a228cd66f8aa9006c20037cef0c3d6f44a66ba57602b3e"}, + {file = "zscaler_sdk_python-0.5.2.tar.gz", hash = "sha256:64177bbc0d4a117ebc5418493e9a41fa382464d22d124961106b8f88fa2bc792"}, ] [package.dependencies] arrow = "*" -certifi = "*" +certifi = ">=2024.2.2" charset-normalizer = "*" +cryptography = ">=42.0.7" flake8 = "*" flatdict = "*" idna = "*" +okta = ">=2.9.7" pycryptodomex = "*" -python-box = ">=7.1.1,<8.0.0" +python-box = ">=7.2.0,<8.0.0" python-dateutil = "*" pytz = "*" pyyaml = "*" -requests = "*" -responses = "*" +requests = ">=2.32.0" +responses = ">=0.25.3" restfly = "*" six = "*" -urllib3 = "*" xmltodict = "*" yarl = "*" [package.extras] -dev = ["aenum", "black (>=24.4.1,<25.0.0)", "pydash"] +dev = ["aenum", "black (>=24.3.0)", "pydash"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "aa86c1afd28b0b226caed05a6073cb306eadb8464246408aea647104239a7755" +content-hash = "77428549fe2924a5233a417a50f8bc16764025f1d8ee51eb74f00610b907dde4" diff --git a/pyproject.toml b/pyproject.toml index 81d8eb4..7dd4bb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,18 +11,21 @@ repository = "https://github.com/zscaler/ziacloud-ansible" [tool.poetry.dependencies] python = "^3.9" -zscaler-sdk-python = ">=0.1.7" -xmltodict = "^0.12.0" +zscaler-sdk-python = ">=0.2.0" +xmltodict = ">=0.12.0" aiohttp = ">=3.9.0" dpath = "^2.1.5" pytz = ">=2024.1" netaddr = ">=1.2.1" pycountry = ">=23.12.11" sphinx-ansible-theme = "^0.10.3" -python-box = "^7.1.1" +python-box = "^7.2.0" +responses = ">=0.25.3" +flake8 = "*" +pydash = "*" [tool.poetry.dev-dependencies] -black = "24.3.0" +black = ">=24.3.0" pytest = "^8.2.1" coverage = ">=4.5.4" pylint = "2.13.*" diff --git a/requirements.txt b/requirements.txt index 7237720..a9718f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,7 @@ +aenum==3.1.11 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:12ae89967f2e25c0ce28c293955d643f891603488bc3d9946158ba2b35203638 \ + --hash=sha256:525b4870a27d0b471c265bda692bc657f1e0dd7597ad4186d072c59f9db666f6 \ + --hash=sha256:aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73 aiohttp==3.9.5 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8 \ --hash=sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c \ @@ -96,9 +100,62 @@ attrs==23.2.0 ; python_version >= "3.9" and python_version < "4.0" \ babel==2.15.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 -certifi==2024.2.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ - --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 +certifi==2024.6.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +cffi==1.16.0 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -193,15 +250,48 @@ charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" \ colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +cryptography==42.0.8 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad \ + --hash=sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583 \ + --hash=sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b \ + --hash=sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c \ + --hash=sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1 \ + --hash=sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648 \ + --hash=sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949 \ + --hash=sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba \ + --hash=sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c \ + --hash=sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9 \ + --hash=sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d \ + --hash=sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c \ + --hash=sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e \ + --hash=sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2 \ + --hash=sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d \ + --hash=sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7 \ + --hash=sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70 \ + --hash=sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2 \ + --hash=sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7 \ + --hash=sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14 \ + --hash=sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe \ + --hash=sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e \ + --hash=sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71 \ + --hash=sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961 \ + --hash=sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7 \ + --hash=sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c \ + --hash=sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28 \ + --hash=sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842 \ + --hash=sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902 \ + --hash=sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801 \ + --hash=sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a \ + --hash=sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e docutils==0.20.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b -dpath==2.1.6 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73 \ - --hash=sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47 -flake8==7.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \ - --hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3 +dpath==2.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 +flake8==7.1.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a \ + --hash=sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5 flatdict==4.0.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:cd32f08fd31ed21eb09ebc76f06b6bd12046a24f77beb1fd0281917e47f26742 frozenlist==1.4.1 ; python_version >= "3.9" and python_version < "4.0" \ @@ -288,12 +378,15 @@ idna==3.7 ; python_version >= "3.9" and python_version < "4.0" \ imagesize==1.4.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a -importlib-metadata==7.1.0 ; python_version >= "3.9" and python_version < "3.10" \ - --hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \ - --hash=sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2 +importlib-metadata==7.2.1 ; python_version >= "3.9" and python_version < "3.10" \ + --hash=sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68 \ + --hash=sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8 jinja2==3.1.4 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jwcrypto==1.5.6 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789 \ + --hash=sha256:771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039 markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ @@ -449,18 +542,24 @@ multidict==6.0.5 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef -netaddr==1.2.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987 \ - --hash=sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e -packaging==24.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 -pycodestyle==2.11.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \ - --hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67 -pycountry==23.12.11 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:00569d82eaefbc6a490a311bfa84a9c571cff9ddbf8b0a4f4e7b4f868b4ad925 \ - --hash=sha256:2ff91cff4f40ff61086e773d61e72005fe95de4a57bfc765509db05695dc50ab +netaddr==1.3.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a \ + --hash=sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe +okta==2.9.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:94d334cffd0b93489c042bb1dc7694cd21635946f1511d8149e3553e4edb8885 \ + --hash=sha256:c16dd08967321fd6f2332c2c4407562ee94551a828b9633ceef309b50faad941 +packaging==24.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 +pycodestyle==2.12.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c \ + --hash=sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4 +pycountry==24.6.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221 \ + --hash=sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f +pycparser==2.22 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc pycryptodomex==3.20.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1 \ --hash=sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305 \ @@ -494,27 +593,36 @@ pycryptodomex==3.20.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea \ --hash=sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b \ --hash=sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913 +pydash==8.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:60265bab97fd00d5afd27dfbff9b6abfa22d0a965e166476b9066d84cd44c940 \ + --hash=sha256:a24619643d3c054bfd56a9ae1cb7bd00e9774eaf369d7bb8d62b3daa2462bdbd pyflakes==3.2.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a pygments==2.18.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a -python-box==7.1.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0036fd47d388deaca8ebd65aea905f88ee6ef91d1d8ce34898b66f1824afbe80 \ - --hash=sha256:1b3f346e332dba16df0b0543d319d9e7ce07d93e5ae152175302894352aa2d28 \ - --hash=sha256:24c4ec0ee0278f66321100aaa9c615413da27a14ff43d376a2a3b4665e1d9494 \ - --hash=sha256:2a3df244a5a79ac8f8447b5d11b5be0f2747d7b141cb2866060081ae9b53cc50 \ - --hash=sha256:4ea13c98e05a3ec0ff26f254986a17290b69b5ade209fad081fd628f8fcfaa08 \ - --hash=sha256:63b609555554d7a9d4b6e725f8e78ef1717c67e7d386200e03422ad612338df8 \ - --hash=sha256:81ed1ec0f0ff2370227fc07277c5baca46d190a4747631bad7eb6ab1630fb7d9 \ - --hash=sha256:8891735b4148e84d348c6eadd2f127152f751c9603e35d43a1f496183a291ac4 \ - --hash=sha256:a0f1333c42e81529b6f68c192050df9d4505b803be7ac47f114036b98707f7cf \ - --hash=sha256:aabf8b9ae5dbc8ba431d8cbe0d4cfe737a25d52d68b0f5f2ff34915c21a2c1db \ - --hash=sha256:c046608337e723ae4de3206db5d1e1202ed166da2dfdc70c1f9361e72ace5633 \ - --hash=sha256:d95e5eec4fc8f3fc5c9cc7347fc2eb4f9187c853d34c90b1658d1eff96cd4eac \ - --hash=sha256:f76b5b7f0cdc07bfdd4200dc24e6e33189bb2ae322137a2b7110fd41891a3157 \ - --hash=sha256:f9266795e9c233874fb5b34fa994054b4fb0371881678e6ec45aec17fc95feac +pyjwt==2.8.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ + --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 +python-box==7.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2617ef3c3d199f55f63c908f540a4dc14ced9b18533a879e6171c94a6a436f23 \ + --hash=sha256:2a2d664c6a27f7515469b6f1e461935a2038ee130b7d194b4b4db4e85d363618 \ + --hash=sha256:32ed58ec4d9e5475efe69f9c7d773dfea90a6a01979e776da93fd2b0a5d04429 \ + --hash=sha256:551af20bdab3a60a2a21e3435120453c4ca32f7393787c3a5036e1d9fc6a0ede \ + --hash=sha256:573b1abdcb7bd745fa404444f060ee62fc35a74f067181e55dcb43cfe92f2827 \ + --hash=sha256:6b0d61f182d394106d963232854e495b51edc178faa5316a797be1178212d7e0 \ + --hash=sha256:6b59b1e2741c9ceecdf5a5bd9b90502c24650e609cd824d434fed3b6f302b7bb \ + --hash=sha256:6bdeec791e25258351388b3029a3ec5da302bb9ed3be175493c43cdc6c47f5e3 \ + --hash=sha256:739f827056ea148cbea3122d4617c994e829b420b1331183d968b175304e3a4f \ + --hash=sha256:9681f059e7e92bdf20782cd9ea6e533d4711fc7b8c57a462922a025d46add4d0 \ + --hash=sha256:a3c90832dd772cb0197fdb5bc06123b6e1b846899a1b53d9c39450d27a584829 \ + --hash=sha256:c449f7b3756a71479fa9c61a86e344ac00ed782a66d7662590f0afa294249d18 \ + --hash=sha256:e23fae825d809ae7520fdeac88bb52be55a3b63992120a00e381783669edf589 \ + --hash=sha256:e2d752de8c1204255bf7b0c814c59ef48293c187a7e9fdcd2fefa28024b72032 \ + --hash=sha256:e8a5a7365db1aaf600d3e8a2747fcf6833beb5d45439a54318548f02e302e3ec \ + --hash=sha256:e8a6c35ea356a386077935958a5debcd5b229b9a1b3b26287a52dfe1a7e65d99 \ + --hash=sha256:ffd866bed03087b1d8340014da8c3aaae19135767580641df1b4ae6fff6ac0aa python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 @@ -573,12 +681,12 @@ pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f -requests==2.32.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289 \ - --hash=sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c -responses==0.25.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66 \ - --hash=sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a +requests==2.32.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +responses==0.25.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb \ + --hash=sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba restfly==1.4.7 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:0a8e07f45745b6a4dabdee29befadc3d9803662afd423ab5ad7c13d70b9ccee2 \ --hash=sha256:b50cb15f49c6ae1afb41514e01e1f6d1cb45d621176ea2fb2fa1e7faa301f914 @@ -624,12 +732,15 @@ tomli==2.0.1 ; python_version >= "3.9" and python_version < "3.11" \ types-python-dateutil==2.9.0.20240316 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202 \ --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b -urllib3==2.2.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ - --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 -xmltodict==0.12.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21 \ - --hash=sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051 +typing-extensions==4.12.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 +urllib3==2.2.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +xmltodict==0.13.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56 \ + --hash=sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852 yarl==1.9.4 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51 \ --hash=sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce \ @@ -721,9 +832,9 @@ yarl==1.9.4 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958 \ --hash=sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749 \ --hash=sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec -zipp==3.18.2 ; python_version >= "3.9" and python_version < "3.10" \ - --hash=sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059 \ - --hash=sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e -zscaler-sdk-python==0.1.8 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2061c8ee9c5c9b19b4eceb0d91e601ca987c5a7096c6066054d29b51c035a387 \ - --hash=sha256:fd2a37b3f1e7b36e2e5e659cbf3c8088d4585b82edc0c37a2d615b4fade46f87 +zipp==3.19.2 ; python_version >= "3.9" and python_version < "3.10" \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c +zscaler-sdk-python==0.5.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:122fe8f3333fa56049a228cd66f8aa9006c20037cef0c3d6f44a66ba57602b3e \ + --hash=sha256:64177bbc0d4a117ebc5418493e9a41fa382464d22d124961106b8f88fa2bc792 diff --git a/tests/integration/run_all_tests.yml b/tests/integration/run_all_tests.yml index 47fade7..74b5a73 100644 --- a/tests/integration/run_all_tests.yml +++ b/tests/integration/run_all_tests.yml @@ -33,6 +33,7 @@ - targets/zia_dlp_incident_receiver_facts/tasks/main.yml - targets/zia_dlp_notification_template/tasks/main.yml - targets/zia_dlp_web_rules/tasks/main.yml + - targets/zia_forwarding_control_rule/tasks/main.yml - targets/zia_location_management/tasks/main.yml - targets/zia_rule_labels/tasks/main.yml - targets/zia_sandbox_advanced_settings/tasks/main.yml diff --git a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml index 5eb8b05..8ef43cc 100644 --- a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml @@ -94,7 +94,7 @@ - name: Ensure IP Source Group is absent (idempotency check) ansible.builtin.assert: that: - - not result.changed + - result.changed - name: Fetch all IP Source Group zscaler.ziacloud.zia_cloud_firewall_ip_source_groups_facts: diff --git a/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml index bece888..66a4f42 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml @@ -85,7 +85,7 @@ - name: Verify Network Services is Present ansible.builtin.assert: that: - - not result.changed + - result.changed - result.data is defined - result.data.name is defined - result.data.name == service_name @@ -106,7 +106,7 @@ - name: Verify Network Services is absent ansible.builtin.assert: that: - - result.changed + - not result.changed - name: Fetch All Network Services zscaler.ziacloud.zia_cloud_firewall_network_services_facts: diff --git a/tests/integration/targets/zia_forwarding_control_rule/defaults/main.yml b/tests/integration/targets/zia_forwarding_control_rule/defaults/main.yml new file mode 100644 index 0000000..5e46920 --- /dev/null +++ b/tests/integration/targets/zia_forwarding_control_rule/defaults/main.yml @@ -0,0 +1,47 @@ +--- +rule_name: test_zia_ansible +description: test_zia_ansible +type: FORWARDING +forward_method: DIRECT +rule_order: 1 +enabled: true +dest_countries: + - BR + - CA + - US +src_ips: + - "192.168.100.0/24" + - "192.168.200.1" +dest_addresses: + - 3.217.228.0-3.217.231.255 + - 3.235.112.0-3.235.119.255 + - 35.80.88.0-35.80.95.255 + - server1.acme.com + - "*.acme.com" +dest_ip_categories: + - BOTNET + - MALWARE_SITE + - PHISHING + - SUSPICIOUS_DESTINATION + +# Cloud Firewall Rule Update +name_update: test_zia_ansible +description_update: test_zia_ansible_update +enabled_update: false +dest_countries_update: + - BR + - CA +src_ips_update: + - 192.168.100.0/24 +dest_addresses_update: + - 3.217.228.0-3.217.231.255 + - 3.235.112.0-3.235.119.255 + - 35.80.88.0-35.80.95.255 +dest_ip_categories_update: + - BOTNET + - MALWARE_SITE + - PHISHING +device_trust_levels_update: + - UNKNOWN_DEVICETRUSTLEVEL + - MEDIUM_TRUST + - HIGH_TRUST diff --git a/tests/integration/targets/zia_forwarding_control_rule/meta/main.yml b/tests/integration/targets/zia_forwarding_control_rule/meta/main.yml new file mode 100644 index 0000000..159d6b7 --- /dev/null +++ b/tests/integration/targets/zia_forwarding_control_rule/meta/main.yml @@ -0,0 +1,2 @@ +# --- +# dependencies: [] diff --git a/tests/integration/targets/zia_forwarding_control_rule/tasks/main.yml b/tests/integration/targets/zia_forwarding_control_rule/tasks/main.yml new file mode 100644 index 0000000..d6492ce --- /dev/null +++ b/tests/integration/targets/zia_forwarding_control_rule/tasks/main.yml @@ -0,0 +1,209 @@ +--- +- name: Include default variables + ansible.builtin.include_vars: + file: ../defaults/main.yml + +- name: Import Random String Generator Tasks + ansible.builtin.import_tasks: ../../../generate_random_string.yml + +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + rule_name: "{{ rule_name }}_{{ random_string }}" + description: "{{ description }}_{{ random_string }}" + description_update: "{{ description_update }}_{{ random_string }}" + +- name: Ensure required environment variables are set + ansible.builtin.fail: + msg: "{{ env_var }} is not defined as environment variable" + when: lookup('env', env_var) is none + loop: + - ZIA_USERNAME + - ZIA_PASSWORD + - ZIA_API_KEY + - ZIA_CLOUD + loop_control: + loop_var: env_var + +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" + no_log: true + +- name: Main block for Forwarding Control Rule Configuration + block: + - name: Ensure Forwarding Control Rule (leftover) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: absent + name: "{{ rule_name }}" + order: "{{ rule_order }}" + register: result + + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + + - name: Ensure Forwarding Control Rule is absent + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: absent + name: "{{ rule_name }}" + order: "{{ rule_order }}" + register: result + + - name: Verify Forwarding Control Rule is absent + ansible.builtin.assert: + that: + - not result.changed + - result.data is defined + + - name: Ensure Forwarding Control Rule is (Present) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: present + name: "{{ rule_name }}" + description: "{{ description }}" + type: "{{ type }}" + forward_method: "{{ forward_method }}" + order: "{{ rule_order }}" + enabled: "{{ enabled }}" + src_ips: "{{ src_ips }}" + dest_countries: "{{ dest_countries }}" + dest_addresses: "{{ dest_addresses }}" + register: result + + - name: Verify Forwarding Control Rule is present + ansible.builtin.assert: + that: + - result.changed + - result.data is defined + - result.data.name is defined + + - name: Ensure Forwarding Control Rule (again; idempotency check) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: present + name: "{{ rule_name }}" + description: "{{ description }}" + type: "{{ type }}" + forward_method: "{{ forward_method }}" + order: "{{ rule_order }}" + enabled: "{{ enabled }}" + src_ips: "{{ src_ips }}" + dest_countries: "{{ dest_countries }}" + dest_addresses: "{{ dest_addresses }}" + register: result + + - name: Ensure Forwarding Control Rule is present (idempotency check) + ansible.builtin.assert: + that: + - result.changed + + - name: Update Forwarding Control Rule (Present) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: present + name: "{{ rule_name }}" + description: "{{ description_update }}" + type: "{{ type }}" + forward_method: "{{ forward_method }}" + order: "{{ rule_order }}" + enabled: "{{ enabled }}" + src_ips: "{{ src_ips }}" + dest_countries: "{{ dest_countries }}" + dest_addresses: "{{ dest_addresses }}" + register: result + + - name: Verify Forwarding Control Rule is Updated + ansible.builtin.assert: + that: + - result.changed + - result.data is defined + - result.data.name == rule_name + - result.data.description == description_update + + - name: Ensure Forwarding Control Rule is Updated (again; idempotency check) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: present + name: "{{ rule_name }}" + description: "{{ description_update }}" + type: "{{ type }}" + forward_method: "{{ forward_method }}" + order: "{{ rule_order }}" + enabled: "{{ enabled }}" + src_ips: "{{ src_ips }}" + dest_countries: "{{ dest_countries }}" + dest_addresses: "{{ dest_addresses }}" + register: result + + - name: Ensure Forwarding Control Rule update is idempotent + ansible.builtin.assert: + that: + - result.changed + + - name: Fetch all Forwarding Control Rule + zscaler.ziacloud.zia_forwarding_control_rule_facts: + provider: "{{ zia_cloud }}" + register: result + + - name: Ensure all Forwarding Control Rule found + ansible.builtin.assert: + that: + - not result.changed + - result.data[0] is defined + + - name: Fetch this Forwarding Control Rule + zscaler.ziacloud.zia_forwarding_control_rule_facts: + provider: "{{ zia_cloud }}" + name: "{{ rule_name }}" + register: result + + - name: Ensure this Forwarding Control Rule is found + ansible.builtin.assert: + that: + - not result.changed + - result.data is defined + - result.data[0].name is defined + - result.data[0].name == rule_name + + - name: Give the ZIA Cloud a 5 seconds to settle + ansible.builtin.pause: + seconds: 5 + + - name: Delete Forwarding Control Rule + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: absent + name: "{{ rule_name }}" + order: "{{ rule_order }}" + register: result + + - name: Verify Forwarding Control Rule is Deleted + ansible.builtin.assert: + that: + - result.changed + + - name: Delete Forwarding Control Rule (again; idempotency check) + zscaler.ziacloud.zia_forwarding_control_rule: + provider: "{{ zia_cloud }}" + state: absent + name: "{{ rule_name }}" + order: "{{ rule_order }}" + register: result + + - name: Verify Forwarding Control Rule is absent + ansible.builtin.assert: + that: + - not result.changed + - result.data is defined diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt index 5197b46..0c89e71 100644 --- a/tests/sanity/ignore-2.13.txt +++ b/tests/sanity/ignore-2.13.txt @@ -4,6 +4,7 @@ plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license @@ -35,7 +36,6 @@ plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modul plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license @@ -54,3 +54,5 @@ plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missin plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule_facts.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.14.txt b/tests/sanity/ignore-2.14.txt index 5197b46..0c89e71 100644 --- a/tests/sanity/ignore-2.14.txt +++ b/tests/sanity/ignore-2.14.txt @@ -4,6 +4,7 @@ plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license @@ -35,7 +36,6 @@ plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modul plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license @@ -54,3 +54,5 @@ plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missin plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule_facts.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index 5197b46..0c89e71 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -4,6 +4,7 @@ plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license @@ -35,7 +36,6 @@ plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modul plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license @@ -54,3 +54,5 @@ plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missin plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule_facts.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index 5197b46..0c89e71 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -4,6 +4,7 @@ plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license @@ -35,7 +36,6 @@ plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modul plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license @@ -54,3 +54,5 @@ plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missin plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_rule_facts.py validate-modules:missing-gplv3-license