leaf-common 1.2.43__tar.gz → 1.2.45__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.
- leaf_common-1.2.45/.github/workflows/checkmarx.yml +27 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/PKG-INFO +1 -1
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/asyncio_executor.py +3 -1
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/asyncio_executor_pool.py +6 -3
- leaf_common-1.2.45/leaf_common/logging/conditional_logger.py +138 -0
- leaf_common-1.2.45/leaf_common/logging/sensitive_logger.py +43 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/local_file_persistence_mechanism.py +3 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/s3_file_persistence_mechanism.py +6 -4
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/grpc_channel_security.py +5 -3
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/grpc_client_retry.py +9 -7
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common.egg-info/PKG-INFO +1 -1
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common.egg-info/SOURCES.txt +3 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.coveragerc +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.flake8 +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.github/workflows/publish.yml +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.github/workflows/tests.yml +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.gitignore +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/.pylintrc +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/CODE_OF_CONDUCT.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/CONTRIBUTING.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/LICENSE.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/Makefile +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/NOTICE.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/README.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/SECURITY.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/SUPPORT.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/build_scripts/copyright_config.json +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/build_scripts/run_flake8.sh +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/build_scripts/run_pylint.sh +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/build_scripts/source_available_copyright.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/async_to_sync_generator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/asyncio_threadpool_executor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/event_loop_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/task_executor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/candidates/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/candidates/constants.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/candidates/representation_types.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/config_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/config_filter_chain.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/config_handler.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/dictionary_overlay.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/environment_defaults.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/file_of_class.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/resolver.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/config/resolver_util.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/evaluation/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/evaluation/component_evaluator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/evaluation/metrics_merger.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/composite_string_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/inclusionary_replacement_string_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/replacement_string_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/sanitizer_util.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/string_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/strip_whitespace_string_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/tensorflow_field_name_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/candidate_metrics_provider.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/cmp_to_key.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/comparator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/fitness_objective.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/fitness_objectives.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/fitness_objectives_builder.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/fitness_objectives_from_config.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/metrics_based_individual_comparator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/metrics_provider.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/none_comparator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/number_comparator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/reversed_comparator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/log_utils/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/log_utils/message_type.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/log_utils/structured_message.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/logging/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/logging/example_logging_config.hocon +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/logging/logging_setup.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/logging/stream_to_logger.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/boolean_list_parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/boolean_parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/canonical_multi_config_parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/dictionary_extractor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/field_extractor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/list_parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/string_parser.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/abstract_easy_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/composite_persistor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_hocon_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_json_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_txt_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_yaml_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/README.md +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/abstract_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/hocon_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/json_gzip_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/json_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/null_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/override_file_extension_provider.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/persistence_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/raw_bytes_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/reference_helper.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/simple_file_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/text_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/yaml_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/interface/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/interface/persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/interface/persistence_mechanism.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/interface/persistor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/interface/restorer.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/abstract_persistence_mechanism.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/persistence_mechanism_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/mechanism/persistence_mechanisms.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/composite_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/iterating_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/json_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/status_dict_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/progress/worker_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/registry/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/registry/representation_file_extension_provider_registry.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/registry/representation_persistence_registry.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/registry/representation_serialization_format_registry.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/registry/self_identifying_restorer.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/config/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/config/rule_set_config_helper.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/condition.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/features.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/rule.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/rule_set.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/rule_set_binding.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/data/rules_constants.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/condition_evaluator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/rule_evaluator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/rule_metrics_merger.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/rule_set_binding_evaluator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/rule_set_evaluator.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/evaluation/rule_set_metrics_merger.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/persistence/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/persistence/rule_set_binding_file_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/persistence/rule_set_file_persistence.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/condition_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/rule_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/rule_set_binding_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/rule_set_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/representation/rule_based/serialization/rule_set_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/auth0_direct_service_accessor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/leaf_service_access.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/service_accessor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/service_accessor_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/static_token_service_accessor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/service/vault_dynamic_token_service_accessor.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/github_vault_login.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/kubernetes_vault_login.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/token_vault_login.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/vault_login.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/security/vault/vault_login_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/buffered_gzip_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/chained_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/conversion_policy.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/gzip_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/hocon_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/json_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/raw_bytes_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/serialization_formats.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/text_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/format/yaml_serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/deserializer.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/file_extension_provider.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/reference_pruner.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/self_identifying_representation_error.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/serialization_format.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/interface/serializer.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/empty_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/metrics_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/pass_through_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/pass_through_reference_pruner.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/prep/redactor_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/util/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/util/bytes_decoder.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/serialization/util/text_file_reader.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/abstract_service_session.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/async_abstract_service_session.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/async_grpc_client_retry.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/extension_packaging.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/grpc_metadata_util.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/population_response_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/population_session.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/population_session_factory.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/session/response_candidate_dictionary_converter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/time/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/time/time_util.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/time/timeout.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/time/timeout_reached_exception.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/utils/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/utils/async_atomic_counter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/utils/atomic_counter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common.egg-info/dependency_links.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common.egg-info/requires.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common.egg-info/top_level.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/pyproject.toml +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/requirements-build.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/requirements.txt +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/setup.cfg +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/async_test_helpers.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_executor_metrics_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_executor_not_started_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_executor_pool_gc_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_executor_pool_metrics_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_executor_started_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/asyncio_threadpool_executor_metrics_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/callable_class.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/event_loop_factory_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/asyncio/sync_test_helpers.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/candidates/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/candidates/test_representation_types.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/config/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/config/dictionary_overlay_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/config/resolver_util_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/filters/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/filters/test_sanitizer_util.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/filters/test_tensorflow_field_name_filter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/fitness/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/fitness/fitness_objectives_from_config_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/fixtures/saved_rule_set.rules +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/fixtures/saved_rules_model.json +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/parsers/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/parsers/canonical_multi_config_parser_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/progress/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/progress/test_status_dict_progress_reporter.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/representation/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/representation/rule_based/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/representation/rule_based/test_condition.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/representation/rule_based/test_rule.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/representation/rule_based/test_rule_set.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/encoding/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/encoding/decode_text_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/encoding/text_file_reader_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/prep/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/serialization/prep/redactor_dictionary_converter_test.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/session/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/session/test_extension_packaging.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/time/__init__.py +0 -0
- {leaf_common-1.2.43 → leaf_common-1.2.45}/tests/time/timeout_test.py +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Checkmarx One
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
schedule:
|
|
6
|
+
# M-F at 2 am UTC
|
|
7
|
+
- cron: '0 2 * * 1-5'
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
release:
|
|
10
|
+
types:
|
|
11
|
+
- published
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
checkmarx:
|
|
15
|
+
# 1.0.8
|
|
16
|
+
uses: cognizant-ai-lab/build-common/.github/workflows/_checkmarx.yml@30321843331e00848309b34e08b839e1f6490ba2
|
|
17
|
+
with:
|
|
18
|
+
base-uri: ${{ vars.CX_BASE_URI }}
|
|
19
|
+
cx-tenant: ${{ vars.CX_TENANT }}
|
|
20
|
+
cx-client-id: ${{ vars.CX_CLIENT_ID }}
|
|
21
|
+
scan-params: '--sast-preset-name "Checkmarx Default" --threshold "sast-critical=1;sast-high=1"'
|
|
22
|
+
secrets:
|
|
23
|
+
CX_CLIENT_SECRET: ${{ secrets.CX_CLIENT_SECRET }}
|
|
24
|
+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
25
|
+
permissions:
|
|
26
|
+
contents: write
|
|
27
|
+
security-events: write
|
|
@@ -39,6 +39,7 @@ from concurrent import futures
|
|
|
39
39
|
from leaf_common.asyncio.event_loop_factory import EventLoopFactory
|
|
40
40
|
from leaf_common.asyncio.task_executor import TaskExecutor
|
|
41
41
|
from leaf_common.asyncio.asyncio_threadpool_executor import AsyncioThreadPoolExecutor
|
|
42
|
+
from leaf_common.logging.sensitive_logger import SensitiveLogger
|
|
42
43
|
|
|
43
44
|
EXECUTOR_START_TIMEOUT_SECONDS: int = 5
|
|
44
45
|
|
|
@@ -444,7 +445,8 @@ class AsyncioExecutor(TaskExecutor):
|
|
|
444
445
|
for line in formatted_exception:
|
|
445
446
|
if line.endswith("\n"):
|
|
446
447
|
line = line[:-1]
|
|
447
|
-
self.logger
|
|
448
|
+
sensitive_logger = SensitiveLogger(self.logger)
|
|
449
|
+
sensitive_logger.info("%s", line)
|
|
448
450
|
|
|
449
451
|
# As a last gesture, remove the background task from the map
|
|
450
452
|
# we use to keep its reference around. Do it safely:
|
|
@@ -29,6 +29,7 @@ import threading
|
|
|
29
29
|
import time
|
|
30
30
|
|
|
31
31
|
from leaf_common.asyncio.asyncio_executor import AsyncioExecutor
|
|
32
|
+
from leaf_common.logging.sensitive_logger import SensitiveLogger
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
class AsyncioExecutorPool:
|
|
@@ -214,17 +215,19 @@ class AsyncioExecutorPool:
|
|
|
214
215
|
try:
|
|
215
216
|
self._sweep_once()
|
|
216
217
|
except Exception as exc: # pylint: disable=broad-exception-caught
|
|
217
|
-
self.logger
|
|
218
|
+
sensitive_logger = SensitiveLogger(self.logger)
|
|
219
|
+
sensitive_logger.warning("GC: sweep raised %s; continuing", exc, exc_info=True)
|
|
218
220
|
# Sleep until the next sweep tick or until shutdown is signaled.
|
|
219
221
|
self._gc_stop_event.wait(timeout=self.gc_sweep_interval_seconds)
|
|
220
222
|
|
|
221
223
|
def _collect_executors(self, executors: Sequence[AsyncioExecutor]) -> None:
|
|
224
|
+
sensitive_logger = SensitiveLogger(self.logger)
|
|
222
225
|
for executor in executors:
|
|
223
226
|
try:
|
|
224
|
-
|
|
227
|
+
sensitive_logger.debug("GC: shutting down idle AsyncioExecutor %s", id(executor))
|
|
225
228
|
executor.shutdown(wait=True)
|
|
226
229
|
except Exception as exc: # pylint: disable=broad-exception-caught
|
|
227
|
-
|
|
230
|
+
sensitive_logger.warning(
|
|
228
231
|
"GC: shutdown failed for AsyncioExecutor %s: %s", id(executor), exc, exc_info=True)
|
|
229
232
|
|
|
230
233
|
def _sweep_once(self, now: Optional[float] = None) -> None:
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
|
|
2
|
+
# Copyright © 2019-2026 Cognizant Technology Solutions Corp, www.cognizant.com.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# END COPYRIGHT
|
|
17
|
+
"""
|
|
18
|
+
See class comment for details.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from logging import Logger
|
|
22
|
+
from os import getenv
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ConditionalLogger:
|
|
26
|
+
"""
|
|
27
|
+
Wraps a logger to mask logged information conditionally based on an environment variable setting.
|
|
28
|
+
Uses the same general Logger interface as the whole world already uses.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, logger: Logger, env_var: str):
|
|
32
|
+
"""
|
|
33
|
+
Constructor.
|
|
34
|
+
|
|
35
|
+
:param logger: The wrapped logger to redirect write() calls to.
|
|
36
|
+
"""
|
|
37
|
+
self.logger: Logger = logger
|
|
38
|
+
self._should_log: bool = getenv(env_var, "true").lower() == "true"
|
|
39
|
+
|
|
40
|
+
def should_log(self) -> bool:
|
|
41
|
+
"""
|
|
42
|
+
:return: True if this logger should log
|
|
43
|
+
"""
|
|
44
|
+
return self._should_log
|
|
45
|
+
|
|
46
|
+
def debug(self, msg, *args, **kwargs):
|
|
47
|
+
"""
|
|
48
|
+
Log 'msg % args' with severity 'DEBUG'.
|
|
49
|
+
|
|
50
|
+
To pass exception information, use the keyword argument exc_info with
|
|
51
|
+
a true value, e.g.
|
|
52
|
+
|
|
53
|
+
logger.debug("Houston, we have a %s", "thorny problem", exc_info=True)
|
|
54
|
+
"""
|
|
55
|
+
if not self.should_log():
|
|
56
|
+
return
|
|
57
|
+
self.logger.debug(msg, *args, **kwargs)
|
|
58
|
+
|
|
59
|
+
def info(self, msg, *args, **kwargs):
|
|
60
|
+
"""
|
|
61
|
+
Log 'msg % args' with severity 'INFO'.
|
|
62
|
+
|
|
63
|
+
To pass exception information, use the keyword argument exc_info with
|
|
64
|
+
a true value, e.g.
|
|
65
|
+
|
|
66
|
+
logger.info("Houston, we have a %s", "notable problem", exc_info=True)
|
|
67
|
+
"""
|
|
68
|
+
if not self.should_log():
|
|
69
|
+
return
|
|
70
|
+
self.logger.info(msg, *args, **kwargs)
|
|
71
|
+
|
|
72
|
+
def warning(self, msg, *args, **kwargs):
|
|
73
|
+
"""
|
|
74
|
+
Log 'msg % args' with severity 'WARNING'.
|
|
75
|
+
|
|
76
|
+
To pass exception information, use the keyword argument exc_info with
|
|
77
|
+
a true value, e.g.
|
|
78
|
+
|
|
79
|
+
logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True)
|
|
80
|
+
"""
|
|
81
|
+
if not self.should_log():
|
|
82
|
+
return
|
|
83
|
+
self.logger.warning(msg, *args, **kwargs)
|
|
84
|
+
|
|
85
|
+
def error(self, msg, *args, **kwargs):
|
|
86
|
+
"""
|
|
87
|
+
Log 'msg % args' with severity 'ERROR'.
|
|
88
|
+
|
|
89
|
+
To pass exception information, use the keyword argument exc_info with
|
|
90
|
+
a true value, e.g.
|
|
91
|
+
|
|
92
|
+
logger.error("Houston, we have a %s", "major problem", exc_info=True)
|
|
93
|
+
"""
|
|
94
|
+
if not self.should_log():
|
|
95
|
+
return
|
|
96
|
+
self.logger.error(msg, *args, **kwargs)
|
|
97
|
+
|
|
98
|
+
def exception(self, msg, *args, exc_info=True, **kwargs):
|
|
99
|
+
"""
|
|
100
|
+
Convenience method for logging an ERROR with exception information.
|
|
101
|
+
"""
|
|
102
|
+
if not self.should_log():
|
|
103
|
+
return
|
|
104
|
+
self.logger.exception(msg, *args, exc_info=exc_info, **kwargs)
|
|
105
|
+
|
|
106
|
+
def critical(self, msg, *args, **kwargs):
|
|
107
|
+
"""
|
|
108
|
+
Log 'msg % args' with severity 'CRITICAL'.
|
|
109
|
+
|
|
110
|
+
To pass exception information, use the keyword argument exc_info with
|
|
111
|
+
a true value, e.g.
|
|
112
|
+
|
|
113
|
+
logger.critical("Houston, we have a %s", "major disaster", exc_info=True)
|
|
114
|
+
"""
|
|
115
|
+
if not self.should_log():
|
|
116
|
+
return
|
|
117
|
+
self.logger.critical(msg, *args, **kwargs)
|
|
118
|
+
|
|
119
|
+
def fatal(self, msg, *args, **kwargs):
|
|
120
|
+
"""
|
|
121
|
+
Don't use this method, use critical() instead.
|
|
122
|
+
"""
|
|
123
|
+
if not self.should_log():
|
|
124
|
+
return
|
|
125
|
+
self.logger.fatal(msg, *args, **kwargs)
|
|
126
|
+
|
|
127
|
+
def log(self, level, msg, *args, **kwargs):
|
|
128
|
+
"""
|
|
129
|
+
Log 'msg % args' with the integer severity 'level'.
|
|
130
|
+
|
|
131
|
+
To pass exception information, use the keyword argument exc_info with
|
|
132
|
+
a true value, e.g.
|
|
133
|
+
|
|
134
|
+
logger.log(level, "We have a %s", "mysterious problem", exc_info=True)
|
|
135
|
+
"""
|
|
136
|
+
if not self.should_log():
|
|
137
|
+
return
|
|
138
|
+
self.logger.log(level, msg, *args, **kwargs)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
# Copyright © 2019-2026 Cognizant Technology Solutions Corp, www.cognizant.com.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# END COPYRIGHT
|
|
17
|
+
"""
|
|
18
|
+
See class comment for details.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from logging import Logger
|
|
22
|
+
|
|
23
|
+
from leaf_common.logging.conditional_logger import ConditionalLogger
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SensitiveLogger(ConditionalLogger):
|
|
27
|
+
"""
|
|
28
|
+
Wraps a logger to mask sensitive information.
|
|
29
|
+
Uses the same general Logger interface as the whole world already uses.
|
|
30
|
+
|
|
31
|
+
We assume that any information coming in to this logger is considered sensitive information.
|
|
32
|
+
Turning off senstive logging information can be done by setting the LEAF_LOG_SENSTIVE to "false".
|
|
33
|
+
By default this is turned on, allowing developers to see sensitive information.
|
|
34
|
+
Strongly consider turning this off for production deployments.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, logger: Logger):
|
|
38
|
+
"""
|
|
39
|
+
Constructor.
|
|
40
|
+
|
|
41
|
+
:param logger: The wrapped logger to redirect write() calls to.
|
|
42
|
+
"""
|
|
43
|
+
super().__init__(logger, "LEAF_LOG_SENSITIVE")
|
|
@@ -66,6 +66,9 @@ class LocalFilePersistenceMechanism(AbstractPersistenceMechanism):
|
|
|
66
66
|
if self.must_exist():
|
|
67
67
|
raise ex
|
|
68
68
|
|
|
69
|
+
# CheckMarx false-positive. This is flagged as an Improper Resource Shutdown or Release
|
|
70
|
+
# This is simply how the contract works with these classes.
|
|
71
|
+
# We return a fileobj so a higher-level abstract API can close it.
|
|
69
72
|
return fileobj
|
|
70
73
|
|
|
71
74
|
def open_dest_for_write(self, send_from_fileobj,
|
|
@@ -20,6 +20,7 @@ See class comment for details.
|
|
|
20
20
|
import logging
|
|
21
21
|
import os
|
|
22
22
|
|
|
23
|
+
from leaf_common.logging.sensitive_logger import SensitiveLogger
|
|
23
24
|
from leaf_common.persistence.mechanism.abstract_persistence_mechanism \
|
|
24
25
|
import AbstractPersistenceMechanism
|
|
25
26
|
|
|
@@ -103,10 +104,11 @@ class S3FilePersistenceMechanism(AbstractPersistenceMechanism):
|
|
|
103
104
|
return_fileobj = None
|
|
104
105
|
else:
|
|
105
106
|
# Something else has gone wrong
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
sensitive_logger = SensitiveLogger(logger)
|
|
108
|
+
sensitive_logger.error("S3 file read %s %s some other error happened %s",
|
|
109
|
+
str(self.bucket_base),
|
|
110
|
+
str(key),
|
|
111
|
+
str(exception.response['Error']['Code']))
|
|
110
112
|
raise
|
|
111
113
|
|
|
112
114
|
return return_fileobj
|
|
@@ -33,6 +33,7 @@ from grpc import composite_call_credentials
|
|
|
33
33
|
from grpc import composite_channel_credentials
|
|
34
34
|
from grpc import ssl_channel_credentials
|
|
35
35
|
|
|
36
|
+
from leaf_common.logging.sensitive_logger import SensitiveLogger
|
|
36
37
|
from leaf_common.time.timeout import Timeout
|
|
37
38
|
from leaf_common.security.service.service_accessor_factory \
|
|
38
39
|
import ServiceAccessorFactory
|
|
@@ -206,9 +207,10 @@ class GrpcChannelSecurity():
|
|
|
206
207
|
except Exception as err:
|
|
207
208
|
frameinfo = getframeinfo(currentframe())
|
|
208
209
|
logger = logging.getLogger(__name__)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
sensitive_logger = SensitiveLogger(logger)
|
|
211
|
+
sensitive_logger.warning("%s %s %s", str(err),
|
|
212
|
+
str(frameinfo.filename),
|
|
213
|
+
str(frameinfo.lineno))
|
|
212
214
|
raise err
|
|
213
215
|
|
|
214
216
|
# Any one of the certs provided can be None.
|
|
@@ -32,10 +32,10 @@ from grpc import channel_ready_future
|
|
|
32
32
|
from grpc import insecure_channel
|
|
33
33
|
from grpc import secure_channel
|
|
34
34
|
|
|
35
|
-
from leaf_common.
|
|
36
|
-
|
|
35
|
+
from leaf_common.logging.sensitive_logger import SensitiveLogger
|
|
37
36
|
from leaf_common.session.grpc_channel_security import GrpcChannelSecurity
|
|
38
37
|
from leaf_common.session.grpc_metadata_util import GrpcMetadataUtil
|
|
38
|
+
from leaf_common.time.timeout import Timeout
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class GrpcClientRetry():
|
|
@@ -195,7 +195,7 @@ class GrpcClientRetry():
|
|
|
195
195
|
|
|
196
196
|
return stub_instance
|
|
197
197
|
|
|
198
|
-
# pylint: disable=too-many-branches
|
|
198
|
+
# pylint: disable=too-many-branches,too-many-locals
|
|
199
199
|
def must_have_response(self, method_name, rpc_call_from_stub, *args): # noqa: C901
|
|
200
200
|
"""
|
|
201
201
|
Keeps trying to connect to the gRPC service to make a single
|
|
@@ -270,9 +270,10 @@ class GrpcClientRetry():
|
|
|
270
270
|
# See if the error is an RpcError with status codes
|
|
271
271
|
# that are registered as limited-retry.
|
|
272
272
|
if self.debug:
|
|
273
|
-
self.logger
|
|
273
|
+
sensitive_logger = SensitiveLogger(self.logger)
|
|
274
|
+
sensitive_logger.error(exception)
|
|
274
275
|
error = traceback.format_exc()
|
|
275
|
-
|
|
276
|
+
sensitive_logger.error(error)
|
|
276
277
|
|
|
277
278
|
log_exception = True
|
|
278
279
|
exception_str = str(exception)
|
|
@@ -331,8 +332,9 @@ class GrpcClientRetry():
|
|
|
331
332
|
# Log the problem and wait to try again.
|
|
332
333
|
info = "Info: Exception when calling %s: %s. " + \
|
|
333
334
|
"Retrying in %s secs."
|
|
334
|
-
self.logger
|
|
335
|
-
|
|
335
|
+
sensitive_logger = SensitiveLogger(self.logger)
|
|
336
|
+
sensitive_logger.warning(info, str(method_name), exception_str,
|
|
337
|
+
str(self.poll_interval_seconds))
|
|
336
338
|
|
|
337
339
|
# Close the channel before sleep to tidy up sooner
|
|
338
340
|
# We do not necessarily want a new token just
|
|
@@ -13,6 +13,7 @@ SUPPORT.md
|
|
|
13
13
|
pyproject.toml
|
|
14
14
|
requirements-build.txt
|
|
15
15
|
requirements.txt
|
|
16
|
+
.github/workflows/checkmarx.yml
|
|
16
17
|
.github/workflows/publish.yml
|
|
17
18
|
.github/workflows/tests.yml
|
|
18
19
|
build_scripts/copyright_config.json
|
|
@@ -72,8 +73,10 @@ leaf_common/log_utils/__init__.py
|
|
|
72
73
|
leaf_common/log_utils/message_type.py
|
|
73
74
|
leaf_common/log_utils/structured_message.py
|
|
74
75
|
leaf_common/logging/__init__.py
|
|
76
|
+
leaf_common/logging/conditional_logger.py
|
|
75
77
|
leaf_common/logging/example_logging_config.hocon
|
|
76
78
|
leaf_common/logging/logging_setup.py
|
|
79
|
+
leaf_common/logging/sensitive_logger.py
|
|
77
80
|
leaf_common/logging/stream_to_logger.py
|
|
78
81
|
leaf_common/parsers/__init__.py
|
|
79
82
|
leaf_common/parsers/boolean_list_parser.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/asyncio/asyncio_threadpool_executor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/strip_whitespace_string_filter.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/filters/tensorflow_field_name_filter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/fitness_objectives_from_config.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/fitness/metrics_based_individual_comparator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/parsers/canonical_multi_config_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/abstract_easy_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/composite_persistor.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_hocon_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_json_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_txt_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/easy/easy_yaml_persistence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/abstract_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/hocon_persistence.py
RENAMED
|
File without changes
|
{leaf_common-1.2.43 → leaf_common-1.2.45}/leaf_common/persistence/factory/json_gzip_persistence.py
RENAMED
|
File without changes
|