PyFunceble-dev 4.0.0b34__tar.gz → 4.0.0b36__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PKG-INFO +1 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/base.py +2 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/base.py +3 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/pyfunceble/cli.py +9 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/file_preloader.py +5 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/base.py +16 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/system/launcher.py +4 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/testing.py +12 -0
- PyFunceble-dev-4.0.0b36/PyFunceble/converter/adblock_input_line2subject.py +434 -0
- PyFunceble-dev-4.0.0b36/PyFunceble/converter/cidr2subject.py +114 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/infrastructure/.PyFunceble_production.yaml +3 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/infrastructure/dir_structure_production.json +1 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/download.py +3 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/environment_variable.py +12 -2
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/dns/query_tool.py +1 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/storage.py +1 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/PKG-INFO +1 -1
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/SOURCES.txt +1 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/version.yaml +1 -1
- PyFunceble-dev-4.0.0b34/PyFunceble/converter/adblock_input_line2subject.py +0 -354
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/.PyFunceble_production.yaml +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/CODE_OF_CONDUCT.rst +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/CONTRIBUTING.rst +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/LICENSE +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/MANIFEST.in +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/.vscode/settings.json +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/domain.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/domain_and_ip.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/extra_rules.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/ip.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/params.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/status.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/availability/url.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/complex_json_encoder.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/params_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/domain.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/domain_and_ip.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/ip.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/params.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/status.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/reputation/url.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/status_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/domain.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/domain_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/ip.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/ipv4.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/ipv6.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/params.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/second_lvl_domain.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/status.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/subdomain.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/syntax/url.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/utils/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/checker/utils/whois.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/exceptions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/github_actions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/gitlab_ci.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/jenkins.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/travis_ci.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/continuous_integration/utils.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/credential_loader.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/clean.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/iana.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/production.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/public_suffix.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/pyfunceble/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/pyfunceble/argsparser.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/execution_time.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/facility.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/factory.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/cleanup.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/counter.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/dir_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/dir_structure/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/dir_structure/backup.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/dir_structure/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/dir_structure/restore.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/printer/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/printer/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/printer/file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/printer/stdout.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/filesystem/status_file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/alembic.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/csv_file/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/csv_file/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/csv_file/inactive_source_delete.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/db_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/file_cleanup/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/file_cleanup/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/file_cleanup/hashes_file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/file_cleanup/mining_file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/file_cleanup/production_config_file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/json2csv/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/json2csv/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/json2csv/inactive.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/json2csv/whois.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/mariadb/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/mariadb/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/mariadb/file_and_status.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/migrators/mariadb/whois_record_idna_subject.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/file_sorter.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/migrator.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/miner.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/producer.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/tester.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/file_sorter.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/migrator.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/miner.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/producer.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/processes/workers/tester.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/scripts/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/scripts/iana.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/scripts/production.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/scripts/public_suffix.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/storage.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/storage_facility.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/system/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/system/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/system/integrator.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/ascii_logo.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/sort.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/stdout.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/utils/version.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/config/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/config/compare.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/config/loader.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/input_line2subject.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/internal_url.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/rpz_input_line2subject.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/rpz_policy2subject.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/subject2complements.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/url2netloc.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/converter/wildcard2subject.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/env.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/script.py.mako +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/35c79626ecb9_fix_some_columns.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/3a4c55a9320d_add_continue_table.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/3d6f4a33cdb2_add_inactive_table.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/45713fea8097_deletion_uneeded_columns_from_whois_.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/459a0d7b8f09_add_idna_subject_column_into_whois.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/6f4729deaf03_delete_inactive_source_column.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/7bcf7fa64ba1_rename_created_to_created_at_and.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/83ada95132bf_delete_the_file_table.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/95dc17ddd729_introduction_of_the_session_id_column.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/ade87195b0a0_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/bef7bcaac3f2_make_id_a_bigint.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/d8893cd406db_allow_whois_record_to_be_empty_null.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/alembic/versions/e04e8301d1a2_deletion_of_the_mined_table.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/data/infrastructure/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/credential/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/credential/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/credential/mariadb.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/credential/mysql.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/schemas/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/schemas/autocontinue.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/schemas/inactive.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/schemas/status.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/schemas/whois_record.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/session.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/sqlalchemy/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/sqlalchemy/all_schemas.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/database/sqlalchemy/base_schema.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/autocontinue/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/autocontinue/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/autocontinue/csv.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/autocontinue/mariadb.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/autocontinue/mysql.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/csv_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/db_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/iana.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/inactive/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/inactive/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/inactive/csv.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/inactive/mariadb.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/inactive/mysql.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/ipv4_reputation.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/mariadb_base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/public_suffix.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/user_agent.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/whois/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/whois/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/whois/csv.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/whois/mariadb.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/dataset/whois/mysql.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/exceptions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/iana.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/ipv4_reputation.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/public_suffix.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/downloader/user_agents.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/exceptions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/facility.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/factory.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/command.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/dict.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/directory.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/exceptions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/file.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/hash.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/list.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/merge.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/helpers/regex.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/logger.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/dns/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/dns/nameserver.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/dns/resolver.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/http_status_code.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/netinfo/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/netinfo/address.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/netinfo/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/netinfo/hostbyaddr.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/record/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/record/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/record/dns.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/record/whois.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/adapter/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/adapter/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/adapter/http.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/adapter/https.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/requests/requester.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/converter/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/converter/base.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/converter/digit2digits.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/converter/expiration_date.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/converter/month2unified.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/query/whois/query_tool.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/sessions.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/storage_facility.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/utils/__init__.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/utils/platform.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/utils/profile.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/utils/version.py +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/dependency_links.txt +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/entry_points.txt +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/requires.txt +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble_dev.egg-info/top_level.txt +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/README.rst +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/dir_structure_production.json +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/requirements.txt +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/setup.cfg +0 -0
- {PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/setup.py +0 -0
|
@@ -841,6 +841,8 @@ class AvailabilityCheckerBase(CheckerBase):
|
|
|
841
841
|
lookup_result = self.addressinfo_query_tool.get_info()
|
|
842
842
|
elif self.status.ip_syntax:
|
|
843
843
|
lookup_result = self.hostbyaddr_query_tool.get_info()
|
|
844
|
+
elif self.status.idna_subject.isdigit():
|
|
845
|
+
lookup_result = None
|
|
844
846
|
else:
|
|
845
847
|
lookup_result = self.addressinfo_query_tool.get_info()
|
|
846
848
|
|
|
@@ -122,5 +122,7 @@ class SyntaxCheckerBase(CheckerBase):
|
|
|
122
122
|
raise NotImplementedError()
|
|
123
123
|
|
|
124
124
|
# pylint: disable=useless-super-delegation
|
|
125
|
-
def get_status(
|
|
125
|
+
def get_status(
|
|
126
|
+
self,
|
|
127
|
+
) -> Optional[SyntaxCheckerStatus]: # pragma: no cover ## Safety.
|
|
126
128
|
return super().get_status()
|
{PyFunceble-dev-4.0.0b34 → PyFunceble-dev-4.0.0b36}/PyFunceble/cli/entry_points/pyfunceble/cli.py
RENAMED
|
@@ -219,6 +219,15 @@ def get_filtering_group_data() -> List[Tuple[List[str], dict]]:
|
|
|
219
219
|
"help": argparse.SUPPRESS,
|
|
220
220
|
},
|
|
221
221
|
),
|
|
222
|
+
(
|
|
223
|
+
["--cidr"],
|
|
224
|
+
{
|
|
225
|
+
"dest": "cli_testing.cidr_expand",
|
|
226
|
+
"action": "store_true",
|
|
227
|
+
"help": "Activates or disables the expansion of CIDR formatted\n"
|
|
228
|
+
"addresses. %s" % get_configured_value("cli_testing.cidr_expand"),
|
|
229
|
+
},
|
|
230
|
+
),
|
|
222
231
|
(
|
|
223
232
|
[
|
|
224
233
|
"--complements",
|
|
@@ -66,6 +66,7 @@ from PyFunceble.cli.processes.workers.tester import TesterWorker
|
|
|
66
66
|
from PyFunceble.cli.utils.stdout import print_single_line
|
|
67
67
|
from PyFunceble.cli.utils.testing import get_subjects_from_line
|
|
68
68
|
from PyFunceble.converter.adblock_input_line2subject import AdblockInputLine2Subject
|
|
69
|
+
from PyFunceble.converter.cidr2subject import CIDR2Subject
|
|
69
70
|
from PyFunceble.converter.input_line2subject import InputLine2Subject
|
|
70
71
|
from PyFunceble.converter.rpz_input_line2subject import RPZInputLine2Subject
|
|
71
72
|
from PyFunceble.converter.rpz_policy2subject import RPZPolicy2Subject
|
|
@@ -122,6 +123,7 @@ class FilePreloader:
|
|
|
122
123
|
rpz_policy2subject: Optional[RPZPolicy2Subject] = None
|
|
123
124
|
rpz_inputline2subject: Optional[RPZInputLine2Subject] = None
|
|
124
125
|
url2netloc: Optional[Url2Netloc] = None
|
|
126
|
+
cidr2subject: Optional[CIDR2Subject] = None
|
|
125
127
|
|
|
126
128
|
def __init__(
|
|
127
129
|
self,
|
|
@@ -139,6 +141,7 @@ class FilePreloader:
|
|
|
139
141
|
url2netloc: Optional[Url2Netloc] = None,
|
|
140
142
|
continue_dataset: Optional[ContinueDatasetBase] = None,
|
|
141
143
|
inactive_dataset: Optional[InactiveDatasetBase] = None,
|
|
144
|
+
cidr2subject: Optional[CIDR2Subject] = None,
|
|
142
145
|
) -> None:
|
|
143
146
|
if authorized is not None:
|
|
144
147
|
self.authorized = authorized
|
|
@@ -160,6 +163,7 @@ class FilePreloader:
|
|
|
160
163
|
self.url2netloc = url2netloc
|
|
161
164
|
self.continue_dataset = continue_dataset
|
|
162
165
|
self.inactive_dataset = inactive_dataset
|
|
166
|
+
self.cidr2subject = cidr2subject
|
|
163
167
|
|
|
164
168
|
def execute_if_authorized(default: Any = None): # pylint: disable=no-self-argument
|
|
165
169
|
"""
|
|
@@ -394,6 +398,7 @@ class FilePreloader:
|
|
|
394
398
|
inputline2subject=self.inputline2subject,
|
|
395
399
|
subject2complements=self.subject2complements,
|
|
396
400
|
url2netloc=self.url2netloc,
|
|
401
|
+
cidr2subject=self.cidr2subject,
|
|
397
402
|
):
|
|
398
403
|
|
|
399
404
|
to_send = copy.deepcopy(self.protocol)
|
|
@@ -183,6 +183,21 @@ class ProcessesManagerBase:
|
|
|
183
183
|
|
|
184
184
|
return wrapper
|
|
185
185
|
|
|
186
|
+
def ignore_if_running(func): # pylint: disable=no-self-argument
|
|
187
|
+
"""
|
|
188
|
+
Ignore the launching of the decorated method if the workers are
|
|
189
|
+
running.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
@functools.wraps(func)
|
|
193
|
+
def wrapper(self, *args, **kwargs):
|
|
194
|
+
if not self.is_running():
|
|
195
|
+
return func(self, *args, **kwargs) # pylint: disable=not-callable
|
|
196
|
+
|
|
197
|
+
return self
|
|
198
|
+
|
|
199
|
+
return wrapper
|
|
200
|
+
|
|
186
201
|
@property
|
|
187
202
|
def max_worker(self) -> Optional[int]:
|
|
188
203
|
"""
|
|
@@ -434,6 +449,7 @@ class ProcessesManagerBase:
|
|
|
434
449
|
|
|
435
450
|
@ensure_worker_obj_is_given
|
|
436
451
|
@create_workers_if_missing
|
|
452
|
+
# @ignore_if_running
|
|
437
453
|
def start(self) -> "ProcessesManagerBase":
|
|
438
454
|
"""
|
|
439
455
|
Starts a defined number of worker.
|
|
@@ -101,6 +101,7 @@ from PyFunceble.cli.utils.testing import (
|
|
|
101
101
|
)
|
|
102
102
|
from PyFunceble.cli.utils.version import print_central_messages
|
|
103
103
|
from PyFunceble.converter.adblock_input_line2subject import AdblockInputLine2Subject
|
|
104
|
+
from PyFunceble.converter.cidr2subject import CIDR2Subject
|
|
104
105
|
from PyFunceble.converter.input_line2subject import InputLine2Subject
|
|
105
106
|
from PyFunceble.converter.rpz_input_line2subject import RPZInputLine2Subject
|
|
106
107
|
from PyFunceble.converter.rpz_policy2subject import RPZPolicy2Subject
|
|
@@ -133,6 +134,7 @@ class SystemLauncher(SystemBase):
|
|
|
133
134
|
rpz_policy2subject: RPZPolicy2Subject = RPZPolicy2Subject()
|
|
134
135
|
rpz_inputline2subject: RPZInputLine2Subject = RPZInputLine2Subject()
|
|
135
136
|
url2netloc: Url2Netloc = Url2Netloc()
|
|
137
|
+
cidr2subject: CIDR2Subject = CIDR2Subject()
|
|
136
138
|
|
|
137
139
|
stdout_printer: StdoutPrinter = StdoutPrinter()
|
|
138
140
|
file_printer: FilePrinter = FilePrinter()
|
|
@@ -528,6 +530,7 @@ class SystemLauncher(SystemBase):
|
|
|
528
530
|
inputline2subject=self.inputline2subject,
|
|
529
531
|
subject2complements=self.subject2complements,
|
|
530
532
|
url2netloc=self.url2netloc,
|
|
533
|
+
cidr2subject=self.cidr2subject,
|
|
531
534
|
):
|
|
532
535
|
to_send = copy.deepcopy(protocol)
|
|
533
536
|
to_send["subject"] = subject
|
|
@@ -575,6 +578,7 @@ class SystemLauncher(SystemBase):
|
|
|
575
578
|
inputline2subject=self.inputline2subject,
|
|
576
579
|
subject2complements=self.subject2complements,
|
|
577
580
|
url2netloc=self.url2netloc,
|
|
581
|
+
cidr2subject=self.cidr2subject,
|
|
578
582
|
):
|
|
579
583
|
to_send = copy.deepcopy(protocol)
|
|
580
584
|
to_send["subject"], to_send["idna_subject"] = (
|
|
@@ -57,6 +57,7 @@ from sqlalchemy.orm import Session
|
|
|
57
57
|
|
|
58
58
|
import PyFunceble.storage
|
|
59
59
|
from PyFunceble.converter.adblock_input_line2subject import AdblockInputLine2Subject
|
|
60
|
+
from PyFunceble.converter.cidr2subject import CIDR2Subject
|
|
60
61
|
from PyFunceble.converter.input_line2subject import InputLine2Subject
|
|
61
62
|
from PyFunceble.converter.rpz_input_line2subject import RPZInputLine2Subject
|
|
62
63
|
from PyFunceble.converter.rpz_policy2subject import RPZPolicy2Subject
|
|
@@ -186,6 +187,7 @@ def get_subjects_from_line(
|
|
|
186
187
|
inputline2subject: Optional[InputLine2Subject] = None,
|
|
187
188
|
subject2complements: Optional[Subject2Complements] = None,
|
|
188
189
|
url2netloc: Optional[Url2Netloc] = None,
|
|
190
|
+
cidr2subject: Optional[CIDR2Subject] = None,
|
|
189
191
|
) -> List[str]:
|
|
190
192
|
"""
|
|
191
193
|
Provides the list of subject to test.
|
|
@@ -214,6 +216,9 @@ def get_subjects_from_line(
|
|
|
214
216
|
if url2netloc is None:
|
|
215
217
|
url2netloc = Url2Netloc()
|
|
216
218
|
|
|
219
|
+
if cidr2subject is None:
|
|
220
|
+
cidr2subject = CIDR2Subject()
|
|
221
|
+
|
|
217
222
|
if PyFunceble.storage.CONFIGURATION.cli_decoding.adblock:
|
|
218
223
|
result.extend(
|
|
219
224
|
# pylint: disable=line-too-long
|
|
@@ -244,6 +249,13 @@ def get_subjects_from_line(
|
|
|
244
249
|
]
|
|
245
250
|
)
|
|
246
251
|
|
|
252
|
+
if PyFunceble.storage.CONFIGURATION.cli_testing.cidr_expand:
|
|
253
|
+
result = [
|
|
254
|
+
y
|
|
255
|
+
for x in result
|
|
256
|
+
for y in cidr2subject.set_data_to_convert(x).get_converted()
|
|
257
|
+
]
|
|
258
|
+
|
|
247
259
|
if checker_type.lower() != "syntax":
|
|
248
260
|
for index, subject in enumerate(result):
|
|
249
261
|
if not subject:
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
# pylint:disable=line-too-long
|
|
2
|
+
"""
|
|
3
|
+
The tool to check the availability or syntax of domain, IP or URL.
|
|
4
|
+
|
|
5
|
+
::
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
██████╗ ██╗ ██╗███████╗██╗ ██╗███╗ ██╗ ██████╗███████╗██████╗ ██╗ ███████╗
|
|
9
|
+
██╔══██╗╚██╗ ██╔╝██╔════╝██║ ██║████╗ ██║██╔════╝██╔════╝██╔══██╗██║ ██╔════╝
|
|
10
|
+
██████╔╝ ╚████╔╝ █████╗ ██║ ██║██╔██╗ ██║██║ █████╗ ██████╔╝██║ █████╗
|
|
11
|
+
██╔═══╝ ╚██╔╝ ██╔══╝ ██║ ██║██║╚██╗██║██║ ██╔══╝ ██╔══██╗██║ ██╔══╝
|
|
12
|
+
██║ ██║ ██║ ╚██████╔╝██║ ╚████║╚██████╗███████╗██████╔╝███████╗███████╗
|
|
13
|
+
╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚══════╝╚═════╝ ╚══════╝╚══════╝
|
|
14
|
+
|
|
15
|
+
Provides the conversion of an AdBlock input line into testable subjests.
|
|
16
|
+
|
|
17
|
+
Author:
|
|
18
|
+
Nissar Chababy, @funilrys, contactTATAfunilrysTODTODcom
|
|
19
|
+
|
|
20
|
+
Special thanks:
|
|
21
|
+
https://pyfunceble.github.io/#/special-thanks
|
|
22
|
+
|
|
23
|
+
Contributors:
|
|
24
|
+
https://pyfunceble.github.io/#/contributors
|
|
25
|
+
|
|
26
|
+
Project link:
|
|
27
|
+
https://github.com/funilrys/PyFunceble
|
|
28
|
+
|
|
29
|
+
Project documentation:
|
|
30
|
+
https://pyfunceble.readthedocs.io/en/dev/
|
|
31
|
+
|
|
32
|
+
Project homepage:
|
|
33
|
+
https://pyfunceble.github.io/
|
|
34
|
+
|
|
35
|
+
License:
|
|
36
|
+
::
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
Copyright 2017, 2018, 2019, 2020, 2021 Nissar Chababy
|
|
40
|
+
|
|
41
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
42
|
+
you may not use this file except in compliance with the License.
|
|
43
|
+
You may obtain a copy of the License at
|
|
44
|
+
|
|
45
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
46
|
+
|
|
47
|
+
Unless required by applicable law or agreed to in writing, software
|
|
48
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
49
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
50
|
+
See the License for the specific language governing permissions and
|
|
51
|
+
limitations under the License.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
from typing import Any, List, Optional, Set, Union
|
|
55
|
+
|
|
56
|
+
from PyFunceble.converter.base import ConverterBase
|
|
57
|
+
from PyFunceble.converter.url2netloc import Url2Netloc
|
|
58
|
+
from PyFunceble.helpers.list import ListHelper
|
|
59
|
+
from PyFunceble.helpers.regex import RegexHelper
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AdblockInputLine2Subject(ConverterBase):
|
|
63
|
+
"""
|
|
64
|
+
Provides an interface for the conversion or extraction of valuable subjects
|
|
65
|
+
from an inputted AdBlock line.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
_aggressive: bool = False
|
|
69
|
+
|
|
70
|
+
__regex_helper: Optional[RegexHelper] = None
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self, data_to_convert: Optional[Any] = None, aggressive: bool = False
|
|
74
|
+
) -> None:
|
|
75
|
+
if aggressive is not None:
|
|
76
|
+
self.aggressive = aggressive
|
|
77
|
+
|
|
78
|
+
self.__regex_helper = RegexHelper()
|
|
79
|
+
|
|
80
|
+
super().__init__(data_to_convert=data_to_convert)
|
|
81
|
+
|
|
82
|
+
@ConverterBase.data_to_convert.setter
|
|
83
|
+
def data_to_convert(self, value: Any) -> None:
|
|
84
|
+
"""
|
|
85
|
+
Overrites the default behavior.
|
|
86
|
+
|
|
87
|
+
:raise TypeError:
|
|
88
|
+
When the given data to convert is not :py:class:`str`
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
if not isinstance(value, str):
|
|
92
|
+
raise TypeError(f"<value> should be {str}, {type(value)} given.")
|
|
93
|
+
|
|
94
|
+
# pylint: disable=no-member
|
|
95
|
+
super(AdblockInputLine2Subject, self.__class__).data_to_convert.fset(
|
|
96
|
+
self, value
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def aggressive(self) -> bool:
|
|
101
|
+
"""
|
|
102
|
+
Provides the state of the :code:`_aggressive` attribute.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
return self._aggressive
|
|
106
|
+
|
|
107
|
+
@aggressive.setter
|
|
108
|
+
def aggressive(self, value: bool) -> None:
|
|
109
|
+
"""
|
|
110
|
+
Provides a way to activate/deactivate the aggressive decoding.
|
|
111
|
+
|
|
112
|
+
:raise TypeError:
|
|
113
|
+
When the given data to convert is not :py:class:`str`
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
if not isinstance(value, bool):
|
|
117
|
+
raise TypeError(f"<value> should be {bool}, {type(value)} given.")
|
|
118
|
+
|
|
119
|
+
self._aggressive = value
|
|
120
|
+
|
|
121
|
+
def set_aggressive(self, value: bool) -> "AdblockInputLine2Subject":
|
|
122
|
+
"""
|
|
123
|
+
Provides a way to activate/deactivate the aggressive decoding.
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
self.aggressive = value
|
|
127
|
+
|
|
128
|
+
return self
|
|
129
|
+
|
|
130
|
+
@staticmethod
|
|
131
|
+
def should_be_ignored(line: str) -> bool:
|
|
132
|
+
"""
|
|
133
|
+
Checks if we should ignore the given line.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
starting_chars = ["!", "@@", "/", "[", ".", "-", "_", "?", "&"]
|
|
137
|
+
|
|
138
|
+
return any(line.startswith(x) for x in starting_chars)
|
|
139
|
+
|
|
140
|
+
@staticmethod
|
|
141
|
+
def extract_base(subject: Union[str, List[str]]) -> Union[str, List[str]]:
|
|
142
|
+
"""
|
|
143
|
+
Extracts the base of the given subject (supposely URL).
|
|
144
|
+
|
|
145
|
+
:param subject:
|
|
146
|
+
The subject to work with.
|
|
147
|
+
|
|
148
|
+
Example:
|
|
149
|
+
|
|
150
|
+
Giving :code:`"hello.world/?is=beautiful"` returns :code:`"hello.world"`
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
if isinstance(subject, list):
|
|
154
|
+
return [AdblockInputLine2Subject.extract_base(x) for x in subject]
|
|
155
|
+
|
|
156
|
+
subject = subject.replace("*", "").replace("~", "")
|
|
157
|
+
|
|
158
|
+
try:
|
|
159
|
+
return Url2Netloc(subject).get_converted()
|
|
160
|
+
except ValueError:
|
|
161
|
+
return subject
|
|
162
|
+
|
|
163
|
+
def _decode_multiple_subject(self, decoded: str) -> Set[str]:
|
|
164
|
+
"""
|
|
165
|
+
Implementation of the decoding of the case that multiple
|
|
166
|
+
subjects are possible in the given :py:class:`str`.
|
|
167
|
+
|
|
168
|
+
:param decoded:
|
|
169
|
+
The decoded part to split.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
result = set()
|
|
173
|
+
|
|
174
|
+
rematch = self.__regex_helper.set_regex(r"((?:[^~\*,]+))").match(
|
|
175
|
+
decoded, rematch=True, return_match=True
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if rematch:
|
|
179
|
+
result.update({self.extract_base(x) for x in rematch})
|
|
180
|
+
|
|
181
|
+
return result
|
|
182
|
+
|
|
183
|
+
def _decode_options(self, decoded_options: List[str]) -> Set[str]:
|
|
184
|
+
"""
|
|
185
|
+
Handle the decoding of the options.
|
|
186
|
+
|
|
187
|
+
What it does:
|
|
188
|
+
|
|
189
|
+
- It extracts all :code:`domain=` component - when found.
|
|
190
|
+
- It extracts all :code:`href` URL base - when found.
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
:param decoded_options:
|
|
194
|
+
The splitted list of options.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
result = set()
|
|
198
|
+
|
|
199
|
+
for rule in decoded_options:
|
|
200
|
+
if "domain=" in rule:
|
|
201
|
+
rule = rule.replace("domain=", "").replace("|", ",")
|
|
202
|
+
|
|
203
|
+
result.update(self._decode_multiple_subject(rule))
|
|
204
|
+
continue
|
|
205
|
+
|
|
206
|
+
if "href" in rule:
|
|
207
|
+
matched = self.__regex_helper.set_regex(
|
|
208
|
+
r"((?:\"|\')(.*)(?:\"|\'))"
|
|
209
|
+
).match(rule, return_match=True, rematch=True, group=1)
|
|
210
|
+
|
|
211
|
+
result.add(self.extract_base(matched))
|
|
212
|
+
continue
|
|
213
|
+
|
|
214
|
+
return result
|
|
215
|
+
|
|
216
|
+
def _decode_v1(self, line: str) -> Set[str]:
|
|
217
|
+
"""
|
|
218
|
+
Implementation of our first decoding mode.
|
|
219
|
+
|
|
220
|
+
In this mode we try to decode the simple:
|
|
221
|
+
|
|
222
|
+
||ads.example.com^
|
|
223
|
+
|
|
224
|
+
rule.
|
|
225
|
+
|
|
226
|
+
:param line:
|
|
227
|
+
The line to decode.
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
result = set()
|
|
231
|
+
|
|
232
|
+
local_line = line.strip()
|
|
233
|
+
|
|
234
|
+
if local_line.startswith("||") and (
|
|
235
|
+
local_line.endswith("^") or local_line.endswith("$")
|
|
236
|
+
):
|
|
237
|
+
local_line = local_line.replace("||", "", 1)
|
|
238
|
+
|
|
239
|
+
if local_line.endswith("^"):
|
|
240
|
+
local_line = "".join(local_line.rsplit("^", 1))
|
|
241
|
+
elif local_line.endswith("$"):
|
|
242
|
+
local_line = "".join(local_line.rsplit("$", 1))
|
|
243
|
+
|
|
244
|
+
result.update(self._decode_multiple_subject(local_line))
|
|
245
|
+
|
|
246
|
+
return {x for x in result if "." in x}
|
|
247
|
+
|
|
248
|
+
def _decode_v2(self, line: str) -> Set[str]:
|
|
249
|
+
"""
|
|
250
|
+
Implementation of our second decoding mode.
|
|
251
|
+
|
|
252
|
+
In this mode, we try to decode the simple:
|
|
253
|
+
|
|
254
|
+
|https://ads.example.com|
|
|
255
|
+
|
|
256
|
+
rule.
|
|
257
|
+
|
|
258
|
+
:param line:
|
|
259
|
+
The line to decode.
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
result = set()
|
|
263
|
+
|
|
264
|
+
local_line = line.strip()
|
|
265
|
+
|
|
266
|
+
if local_line.startswith("|") and local_line.endswith("|"):
|
|
267
|
+
local_line = local_line.replace("|", "", 1)
|
|
268
|
+
local_line = "".join(local_line.rsplit("|", 1))
|
|
269
|
+
|
|
270
|
+
result.add(self.extract_base(local_line))
|
|
271
|
+
|
|
272
|
+
return {x for x in result if "." in x}
|
|
273
|
+
|
|
274
|
+
def _decode_v3(self, line: str) -> Set[str]:
|
|
275
|
+
"""
|
|
276
|
+
Implementation of our third decoding mode.
|
|
277
|
+
|
|
278
|
+
In this mode, we try to decode the simple:
|
|
279
|
+
|
|
280
|
+
||ads.example.com^$script,image,domain=example.com|~foo.example.info
|
|
281
|
+
||ads.example.com$script,image,domain=example.com|~foo.example.info
|
|
282
|
+
|
|
283
|
+
rule.
|
|
284
|
+
|
|
285
|
+
:param line:
|
|
286
|
+
The line to decode.
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
result = set()
|
|
290
|
+
|
|
291
|
+
local_line = line.strip()
|
|
292
|
+
|
|
293
|
+
if not local_line.startswith("||"):
|
|
294
|
+
return result
|
|
295
|
+
|
|
296
|
+
if "$" in local_line:
|
|
297
|
+
v1_mode, options = local_line.split("$", 1)
|
|
298
|
+
|
|
299
|
+
if not v1_mode.endswith("^"):
|
|
300
|
+
v1_mode += "^"
|
|
301
|
+
|
|
302
|
+
result.update(self._decode_v1(v1_mode))
|
|
303
|
+
|
|
304
|
+
if self.aggressive:
|
|
305
|
+
result.update(self._decode_options(options.split(",")))
|
|
306
|
+
elif "^" not in local_line:
|
|
307
|
+
result.update(self._decode_v1(f"{local_line}^"))
|
|
308
|
+
else:
|
|
309
|
+
result.update(self._decode_v1(local_line[: local_line.find("^") + 1]))
|
|
310
|
+
|
|
311
|
+
return {x for x in result if "." in x}
|
|
312
|
+
|
|
313
|
+
def _decode_v4(self, line: str) -> Set[str]:
|
|
314
|
+
"""
|
|
315
|
+
Implementation of our fourth decoding mode.
|
|
316
|
+
|
|
317
|
+
In this mode, we try to decode the simple:
|
|
318
|
+
|
|
319
|
+
@@||ads.example.com/notbanner^$~script
|
|
320
|
+
|
|
321
|
+
rule.
|
|
322
|
+
|
|
323
|
+
:param line:
|
|
324
|
+
The line to decode.
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
result = set()
|
|
328
|
+
local_line = line.strip()
|
|
329
|
+
|
|
330
|
+
if (
|
|
331
|
+
not self.aggressive
|
|
332
|
+
or not local_line.startswith("@@||")
|
|
333
|
+
or "^$" not in local_line
|
|
334
|
+
):
|
|
335
|
+
return result
|
|
336
|
+
|
|
337
|
+
print(not local_line.startswith("@@||"), "^$" not in local_line)
|
|
338
|
+
|
|
339
|
+
v1_mode, options = local_line.split("$", 1)
|
|
340
|
+
|
|
341
|
+
result.update(
|
|
342
|
+
{self.extract_base(x) for x in self._decode_v1(v1_mode.replace("@@", ""))}
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
result.update(self._decode_options(options.split(",")))
|
|
346
|
+
|
|
347
|
+
return {x for x in result if "." in x}
|
|
348
|
+
|
|
349
|
+
def _decode_v5(self, line: str) -> Set[str]:
|
|
350
|
+
"""
|
|
351
|
+
Implementation of our fifth decoding mode.
|
|
352
|
+
|
|
353
|
+
In this mode, we try to decode the simple:
|
|
354
|
+
|
|
355
|
+
example.com,example.net##.advert
|
|
356
|
+
exception.example.com#@#.advert
|
|
357
|
+
example.com,example.net#?#div:-abp-has(> div > img.advert)
|
|
358
|
+
exception.example.com#@#div:-abp-has(> div > img.advert)
|
|
359
|
+
|
|
360
|
+
rule.
|
|
361
|
+
|
|
362
|
+
:param line:
|
|
363
|
+
The line to decode.
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
local_line = line.strip()
|
|
367
|
+
result = set()
|
|
368
|
+
|
|
369
|
+
if not self.aggressive:
|
|
370
|
+
return result
|
|
371
|
+
|
|
372
|
+
separators = ["##", "#@#", "#?#"]
|
|
373
|
+
|
|
374
|
+
obj_of_interest, options = "", ""
|
|
375
|
+
|
|
376
|
+
for separator in separators:
|
|
377
|
+
if separator in local_line:
|
|
378
|
+
obj_of_interest, options = local_line.split(separator, 1)
|
|
379
|
+
break
|
|
380
|
+
|
|
381
|
+
result.update(self._decode_multiple_subject(obj_of_interest))
|
|
382
|
+
result.update(self._decode_options(options.split(",")))
|
|
383
|
+
|
|
384
|
+
return {x for x in result if "." in x}
|
|
385
|
+
|
|
386
|
+
def _decode_v6(self, line: str) -> Set[str]:
|
|
387
|
+
"""
|
|
388
|
+
Implementation of our sixth decoding mode.
|
|
389
|
+
|
|
390
|
+
In this mode we try to decode the simple:
|
|
391
|
+
|
|
392
|
+
$domain=exam.pl|elpmaxe.pl|example.pl
|
|
393
|
+
|
|
394
|
+
rule.
|
|
395
|
+
|
|
396
|
+
:param line:
|
|
397
|
+
The line to decode.
|
|
398
|
+
"""
|
|
399
|
+
|
|
400
|
+
local_line = line.strip()
|
|
401
|
+
result = set()
|
|
402
|
+
|
|
403
|
+
if not self.aggressive:
|
|
404
|
+
return result
|
|
405
|
+
|
|
406
|
+
separators = ["$"]
|
|
407
|
+
|
|
408
|
+
for separator in separators:
|
|
409
|
+
if not local_line.startswith(separator):
|
|
410
|
+
continue
|
|
411
|
+
|
|
412
|
+
options = local_line[len(separator) :]
|
|
413
|
+
|
|
414
|
+
result.update(self._decode_options(options.split(",")))
|
|
415
|
+
|
|
416
|
+
return {x for x in result if "." in x}
|
|
417
|
+
|
|
418
|
+
def get_converted(self) -> List[str]:
|
|
419
|
+
"""
|
|
420
|
+
Provides the converted data.
|
|
421
|
+
"""
|
|
422
|
+
|
|
423
|
+
result = set()
|
|
424
|
+
|
|
425
|
+
if not self.should_be_ignored(self.data_to_convert.strip()):
|
|
426
|
+
result.update(self._decode_v1(self.data_to_convert))
|
|
427
|
+
result.update(self._decode_v2(self.data_to_convert))
|
|
428
|
+
result.update(self._decode_v3(self.data_to_convert))
|
|
429
|
+
result.update(self._decode_v5(self.data_to_convert))
|
|
430
|
+
result.update(self._decode_v6(self.data_to_convert))
|
|
431
|
+
|
|
432
|
+
result.update(self._decode_v4(self.data_to_convert))
|
|
433
|
+
|
|
434
|
+
return ListHelper(list(result)).sort().subject
|