leaf-common 1.2.38__tar.gz → 1.2.40__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.
Files changed (259) hide show
  1. {leaf_common-1.2.38 → leaf_common-1.2.40}/.flake8 +1 -1
  2. {leaf_common-1.2.38 → leaf_common-1.2.40}/.pylintrc +7 -8
  3. leaf_common-1.2.40/Makefile +32 -0
  4. {leaf_common-1.2.38 → leaf_common-1.2.40}/PKG-INFO +1 -1
  5. {leaf_common-1.2.38 → leaf_common-1.2.40}/build_scripts/run_pylint.sh +1 -1
  6. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/resolver.py +3 -2
  7. leaf_common-1.2.40/leaf_common/serialization/util/text_file_reader.py +53 -0
  8. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common.egg-info/PKG-INFO +1 -1
  9. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common.egg-info/SOURCES.txt +3 -0
  10. {leaf_common-1.2.38 → leaf_common-1.2.40}/requirements-build.txt +1 -1
  11. leaf_common-1.2.40/tests/serialization/encoding/text_file_reader_test.py +139 -0
  12. {leaf_common-1.2.38 → leaf_common-1.2.40}/.coveragerc +0 -0
  13. {leaf_common-1.2.38 → leaf_common-1.2.40}/.github/workflows/codeql.yml +0 -0
  14. {leaf_common-1.2.38 → leaf_common-1.2.40}/.github/workflows/publish.yml +0 -0
  15. {leaf_common-1.2.38 → leaf_common-1.2.40}/.github/workflows/tests.yml +0 -0
  16. {leaf_common-1.2.38 → leaf_common-1.2.40}/.gitignore +0 -0
  17. {leaf_common-1.2.38 → leaf_common-1.2.40}/CODE_OF_CONDUCT.md +0 -0
  18. {leaf_common-1.2.38 → leaf_common-1.2.40}/CONTRIBUTING.md +0 -0
  19. {leaf_common-1.2.38 → leaf_common-1.2.40}/LICENSE.txt +0 -0
  20. {leaf_common-1.2.38 → leaf_common-1.2.40}/NOTICE.txt +0 -0
  21. {leaf_common-1.2.38 → leaf_common-1.2.40}/README.md +0 -0
  22. {leaf_common-1.2.38 → leaf_common-1.2.40}/SECURITY.md +0 -0
  23. {leaf_common-1.2.38 → leaf_common-1.2.40}/SUPPORT.md +0 -0
  24. {leaf_common-1.2.38 → leaf_common-1.2.40}/build_scripts/copyright_config.json +0 -0
  25. {leaf_common-1.2.38 → leaf_common-1.2.40}/build_scripts/run_flake8.sh +0 -0
  26. {leaf_common-1.2.38 → leaf_common-1.2.40}/build_scripts/source_available_copyright.txt +0 -0
  27. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/__init__.py +0 -0
  28. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/asyncio/__init__.py +0 -0
  29. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/asyncio/async_to_sync_generator.py +0 -0
  30. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/asyncio/asyncio_executor.py +0 -0
  31. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/asyncio/asyncio_executor_pool.py +0 -0
  32. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/asyncio/task_executor.py +0 -0
  33. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/candidates/__init__.py +0 -0
  34. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/candidates/constants.py +0 -0
  35. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/candidates/representation_types.py +0 -0
  36. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/__init__.py +0 -0
  37. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/config_filter.py +0 -0
  38. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/config_filter_chain.py +0 -0
  39. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/config_handler.py +0 -0
  40. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/dictionary_overlay.py +0 -0
  41. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/environment_defaults.py +0 -0
  42. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/file_of_class.py +0 -0
  43. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/config/resolver_util.py +0 -0
  44. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/evaluation/__init__.py +0 -0
  45. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/evaluation/component_evaluator.py +0 -0
  46. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/evaluation/metrics_merger.py +0 -0
  47. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/__init__.py +0 -0
  48. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/composite_string_filter.py +0 -0
  49. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/inclusionary_replacement_string_filter.py +0 -0
  50. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/replacement_string_filter.py +0 -0
  51. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/sanitizer_util.py +0 -0
  52. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/string_filter.py +0 -0
  53. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/strip_whitespace_string_filter.py +0 -0
  54. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/filters/tensorflow_field_name_filter.py +0 -0
  55. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/__init__.py +0 -0
  56. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/candidate_metrics_provider.py +0 -0
  57. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/cmp_to_key.py +0 -0
  58. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/comparator.py +0 -0
  59. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/fitness_objective.py +0 -0
  60. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/fitness_objectives.py +0 -0
  61. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/fitness_objectives_builder.py +0 -0
  62. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/fitness_objectives_from_config.py +0 -0
  63. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/metrics_based_individual_comparator.py +0 -0
  64. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/metrics_provider.py +0 -0
  65. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/none_comparator.py +0 -0
  66. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/number_comparator.py +0 -0
  67. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/fitness/reversed_comparator.py +0 -0
  68. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/log_utils/__init__.py +0 -0
  69. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/log_utils/message_type.py +0 -0
  70. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/log_utils/structured_message.py +0 -0
  71. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/logging/__init__.py +0 -0
  72. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/logging/example_logging_config.hocon +0 -0
  73. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/logging/logging_setup.py +0 -0
  74. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/logging/stream_to_logger.py +0 -0
  75. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/__init__.py +0 -0
  76. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/boolean_list_parser.py +0 -0
  77. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/boolean_parser.py +0 -0
  78. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/canonical_multi_config_parser.py +0 -0
  79. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/dictionary_extractor.py +0 -0
  80. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/field_extractor.py +0 -0
  81. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/list_parser.py +0 -0
  82. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/parser.py +0 -0
  83. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/parsers/string_parser.py +0 -0
  84. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/__init__.py +0 -0
  85. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/__init__.py +0 -0
  86. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/abstract_easy_persistence.py +0 -0
  87. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/composite_persistor.py +0 -0
  88. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/easy_hocon_persistence.py +0 -0
  89. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/easy_json_persistence.py +0 -0
  90. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/easy_txt_persistence.py +0 -0
  91. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/easy/easy_yaml_persistence.py +0 -0
  92. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/README.md +0 -0
  93. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/__init__.py +0 -0
  94. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/abstract_persistence.py +0 -0
  95. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/hocon_persistence.py +0 -0
  96. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/json_gzip_persistence.py +0 -0
  97. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/json_persistence.py +0 -0
  98. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/null_persistence.py +0 -0
  99. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/override_file_extension_provider.py +0 -0
  100. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/persistence_factory.py +0 -0
  101. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/raw_bytes_persistence.py +0 -0
  102. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/reference_helper.py +0 -0
  103. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/simple_file_persistence.py +0 -0
  104. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/text_persistence.py +0 -0
  105. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/factory/yaml_persistence.py +0 -0
  106. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/interface/__init__.py +0 -0
  107. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/interface/persistence.py +0 -0
  108. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/interface/persistence_mechanism.py +0 -0
  109. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/interface/persistor.py +0 -0
  110. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/interface/restorer.py +0 -0
  111. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/__init__.py +0 -0
  112. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/abstract_persistence_mechanism.py +0 -0
  113. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/local_file_persistence_mechanism.py +0 -0
  114. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/persistence_mechanism_factory.py +0 -0
  115. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/persistence_mechanisms.py +0 -0
  116. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/persistence/mechanism/s3_file_persistence_mechanism.py +0 -0
  117. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/__init__.py +0 -0
  118. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/composite_progress_reporter.py +0 -0
  119. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/iterating_progress_reporter.py +0 -0
  120. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/json_progress_reporter.py +0 -0
  121. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/progress_reporter.py +0 -0
  122. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/status_dict_progress_reporter.py +0 -0
  123. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/progress/worker_progress_reporter.py +0 -0
  124. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/__init__.py +0 -0
  125. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/registry/__init__.py +0 -0
  126. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/registry/representation_file_extension_provider_registry.py +0 -0
  127. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/registry/representation_persistence_registry.py +0 -0
  128. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/registry/representation_serialization_format_registry.py +0 -0
  129. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/registry/self_identifying_restorer.py +0 -0
  130. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/__init__.py +0 -0
  131. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/config/__init__.py +0 -0
  132. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/config/rule_set_config_helper.py +0 -0
  133. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/__init__.py +0 -0
  134. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/condition.py +0 -0
  135. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/features.py +0 -0
  136. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/rule.py +0 -0
  137. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/rule_set.py +0 -0
  138. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/rule_set_binding.py +0 -0
  139. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/data/rules_constants.py +0 -0
  140. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/__init__.py +0 -0
  141. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/condition_evaluator.py +0 -0
  142. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/rule_evaluator.py +0 -0
  143. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/rule_metrics_merger.py +0 -0
  144. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/rule_set_binding_evaluator.py +0 -0
  145. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/rule_set_evaluator.py +0 -0
  146. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/evaluation/rule_set_metrics_merger.py +0 -0
  147. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/persistence/__init__.py +0 -0
  148. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/persistence/rule_set_binding_file_persistence.py +0 -0
  149. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/persistence/rule_set_file_persistence.py +0 -0
  150. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/__init__.py +0 -0
  151. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/condition_dictionary_converter.py +0 -0
  152. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/rule_dictionary_converter.py +0 -0
  153. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/rule_set_binding_dictionary_converter.py +0 -0
  154. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/rule_set_dictionary_converter.py +0 -0
  155. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/representation/rule_based/serialization/rule_set_serialization_format.py +0 -0
  156. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/__init__.py +0 -0
  157. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/__init__.py +0 -0
  158. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/auth0_direct_service_accessor.py +0 -0
  159. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/leaf_service_access.py +0 -0
  160. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/service_accessor.py +0 -0
  161. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/service_accessor_factory.py +0 -0
  162. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/static_token_service_accessor.py +0 -0
  163. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/service/vault_dynamic_token_service_accessor.py +0 -0
  164. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/__init__.py +0 -0
  165. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/github_vault_login.py +0 -0
  166. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/kubernetes_vault_login.py +0 -0
  167. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/token_vault_login.py +0 -0
  168. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/vault_login.py +0 -0
  169. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/security/vault/vault_login_factory.py +0 -0
  170. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/__init__.py +0 -0
  171. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/__init__.py +0 -0
  172. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/buffered_gzip_serialization_format.py +0 -0
  173. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/chained_serialization_format.py +0 -0
  174. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/conversion_policy.py +0 -0
  175. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/gzip_serialization_format.py +0 -0
  176. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/hocon_serialization_format.py +0 -0
  177. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/json_serialization_format.py +0 -0
  178. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/raw_bytes_serialization_format.py +0 -0
  179. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/serialization_formats.py +0 -0
  180. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/text_serialization_format.py +0 -0
  181. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/format/yaml_serialization_format.py +0 -0
  182. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/__init__.py +0 -0
  183. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/deserializer.py +0 -0
  184. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/dictionary_converter.py +0 -0
  185. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/file_extension_provider.py +0 -0
  186. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/reference_pruner.py +0 -0
  187. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/self_identifying_representation_error.py +0 -0
  188. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/serialization_format.py +0 -0
  189. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/interface/serializer.py +0 -0
  190. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/__init__.py +0 -0
  191. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/empty_dictionary_converter.py +0 -0
  192. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/metrics_dictionary_converter.py +0 -0
  193. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/pass_through_dictionary_converter.py +0 -0
  194. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/pass_through_reference_pruner.py +0 -0
  195. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/prep/redactor_dictionary_converter.py +0 -0
  196. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/util/__init__.py +0 -0
  197. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/serialization/util/bytes_decoder.py +0 -0
  198. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/__init__.py +0 -0
  199. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/abstract_service_session.py +0 -0
  200. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/async_abstract_service_session.py +0 -0
  201. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/async_grpc_client_retry.py +0 -0
  202. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/extension_packaging.py +0 -0
  203. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/grpc_channel_security.py +0 -0
  204. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/grpc_client_retry.py +0 -0
  205. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/grpc_metadata_util.py +0 -0
  206. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/population_response_dictionary_converter.py +0 -0
  207. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/population_session.py +0 -0
  208. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/population_session_factory.py +0 -0
  209. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/session/response_candidate_dictionary_converter.py +0 -0
  210. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/time/__init__.py +0 -0
  211. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/time/time_util.py +0 -0
  212. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/time/timeout.py +0 -0
  213. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/time/timeout_reached_exception.py +0 -0
  214. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/utils/__init__.py +0 -0
  215. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/utils/async_atomic_counter.py +0 -0
  216. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common/utils/atomic_counter.py +0 -0
  217. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common.egg-info/dependency_links.txt +0 -0
  218. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common.egg-info/requires.txt +0 -0
  219. {leaf_common-1.2.38 → leaf_common-1.2.40}/leaf_common.egg-info/top_level.txt +0 -0
  220. {leaf_common-1.2.38 → leaf_common-1.2.40}/pyproject.toml +0 -0
  221. {leaf_common-1.2.38 → leaf_common-1.2.40}/requirements.txt +0 -0
  222. {leaf_common-1.2.38 → leaf_common-1.2.40}/setup.cfg +0 -0
  223. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/__init__.py +0 -0
  224. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/__init__.py +0 -0
  225. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/async_test_helpers.py +0 -0
  226. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/asyncio_executor_not_started_test.py +0 -0
  227. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/asyncio_executor_started_test.py +0 -0
  228. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/callable_class.py +0 -0
  229. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/asyncio/sync_test_helpers.py +0 -0
  230. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/candidates/__init__.py +0 -0
  231. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/candidates/test_representation_types.py +0 -0
  232. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/config/__init__.py +0 -0
  233. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/config/dictionary_overlay_test.py +0 -0
  234. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/config/resolver_util_test.py +0 -0
  235. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/filters/__init__.py +0 -0
  236. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/filters/test_sanitizer_util.py +0 -0
  237. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/filters/test_tensorflow_field_name_filter.py +0 -0
  238. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/fitness/__init__.py +0 -0
  239. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/fitness/fitness_objectives_from_config_test.py +0 -0
  240. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/fixtures/saved_rule_set.rules +0 -0
  241. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/fixtures/saved_rules_model.json +0 -0
  242. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/parsers/__init__.py +0 -0
  243. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/parsers/canonical_multi_config_parser_test.py +0 -0
  244. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/progress/__init__.py +0 -0
  245. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/progress/test_status_dict_progress_reporter.py +0 -0
  246. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/representation/__init__.py +0 -0
  247. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/representation/rule_based/__init__.py +0 -0
  248. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/representation/rule_based/test_condition.py +0 -0
  249. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/representation/rule_based/test_rule.py +0 -0
  250. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/representation/rule_based/test_rule_set.py +0 -0
  251. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/serialization/__init__.py +0 -0
  252. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/serialization/encoding/__init__.py +0 -0
  253. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/serialization/encoding/decode_text_test.py +0 -0
  254. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/serialization/prep/__init__.py +0 -0
  255. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/serialization/prep/redactor_dictionary_converter_test.py +0 -0
  256. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/session/__init__.py +0 -0
  257. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/session/test_extension_packaging.py +0 -0
  258. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/time/__init__.py +0 -0
  259. {leaf_common-1.2.38 → leaf_common-1.2.40}/tests/time/timeout_test.py +0 -0
@@ -1,4 +1,4 @@
1
1
  [flake8]
2
2
  max-line-length = 120
3
- exclude = venv,venv3,.git,.idea,generated,extension_packaging.py
3
+ exclude = venv,venv3,.git,.idea,generated,extension_packaging.py,*.egg-info
4
4
  max-complexity = 10
@@ -9,19 +9,18 @@
9
9
 
10
10
  # Add files or directories to the blacklist. They should be base names, not
11
11
  # paths.
12
- ignore=.git, extension_packaging.py
12
+ ignore=.git, dist, extension_packaging.py
13
+ ignore-patterns=.*egg-info
13
14
 
14
15
  # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
15
16
  # number of processors available to use.
16
17
  jobs=0
17
18
 
18
- # Set reasonable line length
19
- max-line-length=120
20
-
21
- # When enabled, pylint would attempt to guess common misconfiguration and emit
22
- # user-friendly hints instead of false-positive error messages.
23
- suggestion-mode=yes
24
-
25
19
  # Not useful warning
26
20
  disable=too-few-public-methods,
27
21
  duplicate-code
22
+
23
+ [FORMAT]
24
+
25
+ # Set reasonable line length
26
+ max-line-length=120
@@ -0,0 +1,32 @@
1
+ .DEFAULT_GOAL := help
2
+
3
+ # Makefile for developer convenience only - not part of build infrastructure
4
+ .PHONY: help install lint test check build
5
+
6
+ help:
7
+ @echo "Makefile for developer convenience only"
8
+ @echo "Usage: make <target>"
9
+ @echo ""
10
+ @echo "Targets:"
11
+ @echo " install Install all dependencies (runtime + build/test)"
12
+ @echo " lint Run pylint and flake8"
13
+ @echo " test Run pytest (excluding integration tests)"
14
+ @echo " check Run lint + test (mirrors CI)"
15
+ @echo " build Build the package distribution"
16
+
17
+ install:
18
+ pip install -r requirements-build.txt
19
+ pip install -r requirements.txt
20
+
21
+ lint:
22
+ build_scripts/run_pylint.sh
23
+ flake8
24
+
25
+ test:
26
+ pytest --verbose -m "not integration" --timer-top-n 10 --cov-config=.coveragerc --cov
27
+ rm -rf .coverage
28
+
29
+ check: lint test
30
+
31
+ build:
32
+ python -m build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: leaf-common
3
- Version: 1.2.38
3
+ Version: 1.2.40
4
4
  Summary: LEAF team common code library
5
5
  Author-email: Dan Fink <Daniel.Fink@cognizant.com>
6
6
  License-Expression: Apache-2.0
@@ -50,4 +50,4 @@ retval=$?
50
50
 
51
51
  echo "Pylint complete."
52
52
 
53
- exit ${retval}
53
+ exit ${retval}
@@ -81,8 +81,9 @@ class Resolver():
81
81
  message: str = f"Could not find code for {use_module_name}"
82
82
  messages.append(message)
83
83
  for message in messages:
84
- # Always print a message when we couldn't find something
85
- logger.info(message)
84
+ # Only print a message when we couldn't find something if verbose.
85
+ if verbose:
86
+ logger.warning(message)
86
87
  if raise_if_not_found:
87
88
  raise ValueError(str(messages))
88
89
  elif verbose:
@@ -0,0 +1,53 @@
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
+ import asyncio
22
+
23
+ from leaf_common.serialization.util.bytes_decoder import BytesDecoder
24
+
25
+
26
+ class TextFileReader:
27
+ """
28
+ Class providing utility methods for reading text files in several possible encodings.
29
+ """
30
+
31
+ @staticmethod
32
+ def read_text_file(filepath: str) -> str:
33
+ """
34
+ Read the content of a text file in some encoding and return it as a string.
35
+ :param filepath: The path to the text file to read
36
+ :return: The content of the text file as a string
37
+ """
38
+ with open(filepath, "rb") as binary_file:
39
+ contents: bytes = binary_file.read()
40
+ text, _ = BytesDecoder.decode_bytes(contents, source_name=filepath)
41
+ return text
42
+
43
+ @staticmethod
44
+ async def async_read_text_file(filepath: str) -> str:
45
+ """
46
+ Asynchronously read the content of a text file in some encoding and return it as a string.
47
+
48
+ Implemented by offloading the blocking read to a default thread executor via
49
+ ``asyncio.to_thread`` to avoid an extra third-party dependency on aiofiles.
50
+ :param filepath: The path to the text file to read
51
+ :return: The content of the text file as a string
52
+ """
53
+ return await asyncio.to_thread(TextFileReader.read_text_file, filepath)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: leaf-common
3
- Version: 1.2.38
3
+ Version: 1.2.40
4
4
  Summary: LEAF team common code library
5
5
  Author-email: Dan Fink <Daniel.Fink@cognizant.com>
6
6
  License-Expression: Apache-2.0
@@ -5,6 +5,7 @@
5
5
  CODE_OF_CONDUCT.md
6
6
  CONTRIBUTING.md
7
7
  LICENSE.txt
8
+ Makefile
8
9
  NOTICE.txt
9
10
  README.md
10
11
  SECURITY.md
@@ -196,6 +197,7 @@ leaf_common/serialization/prep/pass_through_reference_pruner.py
196
197
  leaf_common/serialization/prep/redactor_dictionary_converter.py
197
198
  leaf_common/serialization/util/__init__.py
198
199
  leaf_common/serialization/util/bytes_decoder.py
200
+ leaf_common/serialization/util/text_file_reader.py
199
201
  leaf_common/session/__init__.py
200
202
  leaf_common/session/abstract_service_session.py
201
203
  leaf_common/session/async_abstract_service_session.py
@@ -246,6 +248,7 @@ tests/representation/rule_based/test_rule_set.py
246
248
  tests/serialization/__init__.py
247
249
  tests/serialization/encoding/__init__.py
248
250
  tests/serialization/encoding/decode_text_test.py
251
+ tests/serialization/encoding/text_file_reader_test.py
249
252
  tests/serialization/prep/__init__.py
250
253
  tests/serialization/prep/redactor_dictionary_converter_test.py
251
254
  tests/session/__init__.py
@@ -6,7 +6,7 @@
6
6
  hvac>=1.1.0
7
7
 
8
8
  # Tests
9
- pytest==8.3.3
9
+ pytest==9.0.3
10
10
  pytest-timer==1.0.0
11
11
  timeout-decorator==0.5.0
12
12
  coverage==7.6.1
@@ -0,0 +1,139 @@
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
+ import asyncio
22
+ import os
23
+ import tempfile
24
+ from unittest import TestCase
25
+
26
+ from leaf_common.serialization.util.text_file_reader import TextFileReader
27
+
28
+
29
+ # ---------------------------------------------------------------------------
30
+ # Encoding fixtures
31
+ #
32
+ # BytesDecoder tries the encodings utf-8, cp1252, latin-1 in that order and
33
+ # returns as soon as one succeeds. The byte sequences below are chosen so
34
+ # that each encoding's branch is exercised exactly once:
35
+ #
36
+ # * utf-8 : valid UTF-8 multibyte sequence (E2 80 99 -> U+2019)
37
+ # * cp1252 : 0x92 -- invalid as standalone UTF-8, valid in cp1252 (U+2019)
38
+ # * latin-1 : 0x81 -- invalid in UTF-8 *and* in strict cp1252, valid in latin-1 (U+0081)
39
+ # ---------------------------------------------------------------------------
40
+
41
+ UTF8_BYTES = "hello ’world’".encode("utf-8")
42
+ UTF8_EXPECTED = "hello ’world’"
43
+
44
+ CP1252_BYTES = b"hello \x92world\x92"
45
+ CP1252_EXPECTED = "hello ’world’"
46
+
47
+ LATIN1_BYTES = b"hello \x81world\x81"
48
+ LATIN1_EXPECTED = LATIN1_BYTES.decode("latin-1")
49
+
50
+
51
+ class TextFileReaderTest(TestCase):
52
+ """
53
+ Test class for the TextFileReader utility, covering both the synchronous
54
+ and asynchronous read methods over all three encodings tried by BytesDecoder
55
+ (utf-8, cp1252, latin-1).
56
+ """
57
+
58
+ def setUp(self):
59
+ """Create a fresh temporary directory for each test."""
60
+ # pylint: disable=consider-using-with
61
+ self._tmp_dir = tempfile.TemporaryDirectory()
62
+ self.tmp_path = self._tmp_dir.name
63
+
64
+ def tearDown(self):
65
+ """Clean up the temporary directory created in setUp."""
66
+ self._tmp_dir.cleanup()
67
+
68
+ def _write_bytes(self, content: bytes, filename: str = "sample.txt") -> str:
69
+ """Write raw bytes to a file in the per-test temp directory and return its path."""
70
+ path = os.path.join(self.tmp_path, filename)
71
+ with open(path, "wb") as fileobj:
72
+ fileobj.write(content)
73
+ return path
74
+
75
+ # -----------------------------------------------------------------------
76
+ # read_text_file (synchronous)
77
+ # -----------------------------------------------------------------------
78
+
79
+ def test_read_text_file_decodes_utf8(self):
80
+ """A UTF-8 encoded file is decoded via the utf-8 branch."""
81
+ path = self._write_bytes(UTF8_BYTES)
82
+ self.assertEqual(TextFileReader.read_text_file(path), UTF8_EXPECTED)
83
+
84
+ def test_read_text_file_decodes_cp1252(self):
85
+ """A cp1252-only byte sequence falls through utf-8 and is decoded as cp1252."""
86
+ path = self._write_bytes(CP1252_BYTES)
87
+ self.assertEqual(TextFileReader.read_text_file(path), CP1252_EXPECTED)
88
+
89
+ def test_read_text_file_decodes_latin1(self):
90
+ """A latin-1-only byte sequence falls through utf-8 and cp1252, decoded as latin-1."""
91
+ path = self._write_bytes(LATIN1_BYTES)
92
+ self.assertEqual(TextFileReader.read_text_file(path), LATIN1_EXPECTED)
93
+
94
+ def test_read_text_file_empty_file_returns_empty_string(self):
95
+ """An empty file decodes to an empty string."""
96
+ path = self._write_bytes(b"")
97
+ self.assertEqual(TextFileReader.read_text_file(path), "")
98
+
99
+ def test_read_text_file_raises_file_not_found(self):
100
+ """A missing file raises FileNotFoundError."""
101
+ with self.assertRaises(FileNotFoundError):
102
+ TextFileReader.read_text_file(os.path.join(self.tmp_path, "does_not_exist.txt"))
103
+
104
+ # -----------------------------------------------------------------------
105
+ # async_read_text_file
106
+ # -----------------------------------------------------------------------
107
+
108
+ def test_async_read_text_file_decodes_utf8(self):
109
+ """A UTF-8 encoded file is decoded via the utf-8 branch (async)."""
110
+ path = self._write_bytes(UTF8_BYTES)
111
+ result = asyncio.run(TextFileReader.async_read_text_file(path))
112
+ self.assertEqual(result, UTF8_EXPECTED)
113
+
114
+ def test_async_read_text_file_decodes_cp1252(self):
115
+ """A cp1252-only byte sequence falls through utf-8 and is decoded as cp1252 (async)."""
116
+ path = self._write_bytes(CP1252_BYTES)
117
+ result = asyncio.run(TextFileReader.async_read_text_file(path))
118
+ self.assertEqual(result, CP1252_EXPECTED)
119
+
120
+ def test_async_read_text_file_decodes_latin1(self):
121
+ """A latin-1-only byte sequence falls through utf-8 and cp1252, decoded as latin-1 (async)."""
122
+ path = self._write_bytes(LATIN1_BYTES)
123
+ result = asyncio.run(TextFileReader.async_read_text_file(path))
124
+ self.assertEqual(result, LATIN1_EXPECTED)
125
+
126
+ def test_async_read_text_file_empty_file_returns_empty_string(self):
127
+ """An empty file decodes to an empty string (async)."""
128
+ path = self._write_bytes(b"")
129
+ result = asyncio.run(TextFileReader.async_read_text_file(path))
130
+ self.assertEqual(result, "")
131
+
132
+ def test_async_read_text_file_raises_file_not_found(self):
133
+ """A missing file raises FileNotFoundError (async)."""
134
+ with self.assertRaises(FileNotFoundError):
135
+ asyncio.run(
136
+ TextFileReader.async_read_text_file(
137
+ os.path.join(self.tmp_path, "does_not_exist.txt")
138
+ )
139
+ )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes