focus-validator 0.5.2.dev3__tar.gz → 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/PKG-INFO +4 -5
  2. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/README.md +1 -1
  3. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/config_objects/common.py +5 -0
  4. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/config_objects/focus_to_pandera_schema_converter.py +1 -1
  5. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/config_objects/rule.py +31 -27
  6. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/data_loaders/csv_data_loader.py +1 -1
  7. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/main.py +2 -3
  8. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/outputter/outputter_unittest.py +3 -4
  9. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/BillingCurrency_IsCurrencyCode.yaml +3 -0
  10. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/BillingCurrency_NotNull.yaml +3 -0
  11. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/BillingCurrency_Required.yaml +2 -0
  12. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeCategory_IsString.yaml +3 -0
  13. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeCategory_NotNull.yaml +3 -0
  14. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeCategory_Required.yaml +2 -0
  15. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeClass_Enum.yaml +4 -0
  16. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeClass_IsString.yaml +3 -0
  17. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeClass_Nullable.yaml +3 -0
  18. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeClass_Required.yaml +2 -0
  19. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ChargeDescription_Nullable.yaml +3 -0
  20. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountCategory_Nullable.yaml +3 -0
  21. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountStatus_Enum.yaml +5 -0
  22. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountStatus_IsString.yaml +3 -0
  23. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountStatus_Nullable.yaml +3 -0
  24. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountStatus_Required.yaml +2 -0
  25. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/CommitmentDiscountType_Required.yaml +2 -0
  26. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedQuantity_IsDecimal.yaml +3 -0
  27. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedQuantity_Nullable.yaml +3 -0
  28. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedQuantity_Required.yaml +2 -0
  29. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedUnit_IsString.yaml +3 -0
  30. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedUnit_Nullable.yaml +3 -0
  31. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ConsumedUnit_Required.yaml +2 -0
  32. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedCost_IsDecimal.yaml +3 -0
  33. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedCost_NotNull.yaml +3 -0
  34. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedCost_Required.yaml +2 -0
  35. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedUnitPrice_IsDecimal.yaml +3 -0
  36. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedUnitPrice_Nullable.yaml +3 -0
  37. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ContractedUnitPrice_Required.yaml +2 -0
  38. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/InvoiceIssuer_Required.yaml +2 -0
  39. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/PricingCategory_Enum_1.0.yaml +7 -0
  40. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionId_IsString.yaml +3 -0
  41. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionId_Nullable.yaml +3 -0
  42. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionId_Required.yaml +2 -0
  43. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionName_IsString.yaml +3 -0
  44. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionName_Nullable.yaml +3 -0
  45. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/RegionName_Required.yaml +2 -0
  46. focus_validator-1.0.0/focus_validator/rules/base_rule_definitions/ResourceID_Required.yaml +2 -0
  47. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/checks.py +2 -5
  48. focus_validator-1.0.0/focus_validator/rules/version_sets.yaml +323 -0
  49. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/pyproject.toml +4 -8
  50. focus_validator-0.5.2.dev3/focus_validator/rules/version_sets.yaml +0 -188
  51. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/LICENSE +0 -0
  52. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/build.py +0 -0
  53. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/__init__.py +0 -0
  54. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/config_objects/__init__.py +0 -0
  55. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/config_objects/override.py +0 -0
  56. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/data_loaders/__init__.py +0 -0
  57. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/data_loaders/data_loader.py +0 -0
  58. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/data_loaders/parquet_data_loader.py +0 -0
  59. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/exceptions.py +0 -0
  60. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/outputter/__init__.py +0 -0
  61. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/outputter/outputter.py +0 -0
  62. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/outputter/outputter_console.py +0 -0
  63. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/.gitignore +0 -0
  64. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/__init__.py +0 -0
  65. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/AmortizedCost_IsDecimal.yaml +0 -0
  66. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/AmortizedCost_NotNull.yaml +0 -0
  67. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/AmortizedCost_Required.yaml +0 -0
  68. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/AvailabilityZone_IsString.yaml +0 -0
  69. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/AvailabilityZone_Nullable.yaml +0 -0
  70. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCost_IsDecimal.yaml +0 -0
  71. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCost_NotNull.yaml +0 -0
  72. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCost_Required.yaml +0 -0
  73. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCurrency_IsCurrencyCode.yaml +0 -0
  74. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCurrency_NotNull.yaml +0 -0
  75. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BilledCurrency_Required.yaml +0 -0
  76. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountId_IsString.yaml +0 -0
  77. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountId_NotNull.yaml +0 -0
  78. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountId_Required.yaml +0 -0
  79. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountName_IsString.yaml +0 -0
  80. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountName_Nullable.yaml +0 -0
  81. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingAccountName_Required.yaml +0 -0
  82. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodEnd_IsDateTime.yaml +0 -0
  83. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodEnd_NotNull.yaml +0 -0
  84. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodEnd_Required.yaml +0 -0
  85. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodStart_IsDateTime.yaml +0 -0
  86. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodStart_NotNull.yaml +0 -0
  87. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/BillingPeriodStart_Required.yaml +0 -0
  88. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeDescription_IsString.yaml +0 -0
  89. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeDescription_NotNull.yaml +0 -0
  90. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeDescription_Required.yaml +0 -0
  91. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeFrequency_Enum.yaml +0 -0
  92. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeFrequency_IsString.yaml +0 -0
  93. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeFrequency_NotNull.yaml +0 -0
  94. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeFrequency_Required.yaml +0 -0
  95. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodEnd_IsDateTime.yaml +0 -0
  96. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodEnd_NotNull.yaml +0 -0
  97. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodEnd_Required.yaml +0 -0
  98. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodStart_IsDateTime.yaml +0 -0
  99. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodStart_NotNull.yaml +0 -0
  100. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargePeriodStart_Required.yaml +0 -0
  101. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeSubcategory_Enum.yaml +0 -0
  102. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeSubcategory_IsString.yaml +0 -0
  103. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeSubcategory_NotNull.yaml +0 -0
  104. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeSubcategory_Required.yaml +0 -0
  105. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeType_Enum.yaml +0 -0
  106. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeType_IsString.yaml +0 -0
  107. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeType_NotNull.yaml +0 -0
  108. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ChargeType_Required.yaml +0 -0
  109. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountCategory_Enum.yaml +0 -0
  110. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountCategory_IsString.yaml +0 -0
  111. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountCategory_NotNull.yaml +0 -0
  112. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountCategory_Required.yaml +0 -0
  113. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountId_IsString.yaml +0 -0
  114. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountId_Nullable.yaml +0 -0
  115. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountId_Required.yaml +0 -0
  116. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountName_IsString.yaml +0 -0
  117. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountName_Nullable.yaml +0 -0
  118. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountName_Required.yaml +0 -0
  119. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountType_IsString.yaml +0 -0
  120. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/CommitmentDiscountType_Nullable.yaml +0 -0
  121. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/EffectiveCost_IsDecimal.yaml +0 -0
  122. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/EffectiveCost_NotNull.yaml +0 -0
  123. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/EffectiveCost_Required.yaml +0 -0
  124. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/InvoiceIssuer_IsString.yaml +0 -0
  125. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/InvoiceIssuer_NotNull.yaml +0 -0
  126. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListCost_IsDecimal.yaml +0 -0
  127. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListCost_NotNull.yaml +0 -0
  128. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListCost_Required.yaml +0 -0
  129. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListUnitPrice_IsDecimal.yaml +0 -0
  130. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListUnitPrice_Nullable.yaml +0 -0
  131. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ListUnitPrice_Required.yaml +0 -0
  132. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingCategory_Enum.yaml +0 -0
  133. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingCategory_IsString.yaml +0 -0
  134. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingCategory_Nullable.yaml +0 -0
  135. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingCategory_Required.yaml +0 -0
  136. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingQuantity_IsDecimal.yaml +0 -0
  137. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingQuantity_Nullable.yaml +0 -0
  138. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingQuantity_Required.yaml +0 -0
  139. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingUnit_IsString.yaml +0 -0
  140. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingUnit_Nullable.yaml +0 -0
  141. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/PricingUnit_Required.yaml +0 -0
  142. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Provider_IsString.yaml +0 -0
  143. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Provider_NotNull.yaml +0 -0
  144. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Provider_Required.yaml +0 -0
  145. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Publisher_IsString.yaml +0 -0
  146. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Publisher_NotNull.yaml +0 -0
  147. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Publisher_Required.yaml +0 -0
  148. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Region_IsString.yaml +0 -0
  149. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Region_NotNull.yaml +0 -0
  150. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Region_Required.yaml +0 -0
  151. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceID_IsString.yaml +0 -0
  152. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceID_Nullable.yaml +0 -0
  153. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceName_IsString.yaml +0 -0
  154. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceName_Nullable.yaml +0 -0
  155. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceName_Required.yaml +0 -0
  156. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceType_IsString.yaml +0 -0
  157. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceType_Nullable.yaml +0 -0
  158. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ResourceType_Required.yaml +0 -0
  159. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceCategory_Enum.yaml +0 -0
  160. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceCategory_IsString.yaml +0 -0
  161. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceCategory_NotNull.yaml +0 -0
  162. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceCategory_Required.yaml +0 -0
  163. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceName_IsString.yaml +0 -0
  164. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceName_NotNull.yaml +0 -0
  165. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/ServiceName_Required.yaml +0 -0
  166. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuId_IsString.yaml +0 -0
  167. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuId_Nullable.yaml +0 -0
  168. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuId_Required.yaml +0 -0
  169. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuPriceId_IsString.yaml +0 -0
  170. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuPriceId_Nullable.yaml +0 -0
  171. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SkuPriceId_Required.yaml +0 -0
  172. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountId_IsString.yaml +0 -0
  173. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountId_Nullable.yaml +0 -0
  174. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountId_Required.yaml +0 -0
  175. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountName_IsString.yaml +0 -0
  176. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountName_Nullable.yaml +0 -0
  177. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/SubAccountName_Required.yaml +0 -0
  178. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Tags_IsJSONObject.yaml +0 -0
  179. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Tags_Nullable.yaml +0 -0
  180. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/Tags_Required.yaml +0 -0
  181. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageQuantity_IsDecimal.yaml +0 -0
  182. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageQuantity_Nullable.yaml +0 -0
  183. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageQuantity_Required.yaml +0 -0
  184. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageUnit_IsString.yaml +0 -0
  185. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageUnit_Nullable.yaml +0 -0
  186. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/base_rule_definitions/UsageUnit_Required.yaml +0 -0
  187. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/rules/spec_rules.py +0 -0
  188. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/utils/__init__.py +0 -0
  189. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/utils/currency_codes.csv +0 -0
  190. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/utils/download_currency_codes.py +0 -0
  191. {focus_validator-0.5.2.dev3 → focus_validator-1.0.0}/focus_validator/validator.py +0 -0
@@ -1,15 +1,14 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: focus_validator
3
- Version: 0.5.2.dev3
3
+ Version: 1.0.0
4
4
  Summary: FOCUS spec validator.
5
- Requires-Python: >=3.8.3,<4.0.0
5
+ Requires-Python: >=3.9,<4.0
6
6
  Classifier: Programming Language :: Python :: 3
7
7
  Classifier: Programming Language :: Python :: 3.9
8
8
  Classifier: Programming Language :: Python :: 3.10
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
- Requires-Dist: numpy (>=1.24,<1.25) ; python_version >= "3.8" and python_version < "3.9"
12
- Requires-Dist: numpy (>=1.26,<1.27) ; python_version >= "3.12" and python_version < "3.13"
11
+ Requires-Dist: numpy (>=1.26,<2.0)
13
12
  Requires-Dist: pandas (>=2,<3)
14
13
  Requires-Dist: pandasql (>=0.7.3,<0.8.0)
15
14
  Requires-Dist: pandera (>=0.17.2,<0.18.0)
@@ -34,7 +33,7 @@ tbd
34
33
 
35
34
  ### Prerequisites
36
35
 
37
- - Python 3.8+
36
+ - Python 3.9+
38
37
  - Poetry (Package & Dependency Manager)
39
38
 
40
39
  ### Installation
@@ -10,7 +10,7 @@ tbd
10
10
 
11
11
  ### Prerequisites
12
12
 
13
- - Python 3.8+
13
+ - Python 3.9+
14
14
  - Poetry (Package & Dependency Manager)
15
15
 
16
16
  ### Installation
@@ -68,3 +68,8 @@ def generate_check_friendly_name(check, column_id):
68
68
  return f"{column_id} does not allow null values."
69
69
  elif isinstance(check, DataTypeCheck):
70
70
  return f"{column_id} requires values of type {check.data_type.value}."
71
+ elif isinstance(check, SQLQueryCheck):
72
+ sql_query = " ".join([word.strip() for word in check.sql_query.split()])
73
+ return f"{column_id} requires values that return true when evaluated by the following SQL query: {sql_query}"
74
+ else:
75
+ raise NotImplementedError(f"Check {check} not implemented.")
@@ -72,7 +72,7 @@ class FocusToPanderaSchemaConverter:
72
72
  )
73
73
  elif isinstance(check, AllowNullsCheck):
74
74
  return pa.Check.check_not_null(
75
- error=error_string, ignore_na=False, allow_nulls=check.allow_nulls
75
+ error=error_string, ignore_na=check.allow_nulls
76
76
  )
77
77
  else:
78
78
  raise FocusNotImplementedError(
@@ -1,8 +1,9 @@
1
1
  import os
2
- from typing import Optional, Union
2
+ from typing import Annotated, Optional, Union
3
3
 
4
4
  import yaml
5
- from pydantic import BaseModel, ConfigDict, model_validator
5
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
6
+ from pydantic_core.core_schema import ValidationInfo
6
7
 
7
8
  from focus_validator.config_objects.common import (
8
9
  SIMPLE_CHECKS,
@@ -33,44 +34,47 @@ class Rule(BaseModel):
33
34
  SIMPLE_CHECKS, AllowNullsCheck, ValueInCheck, DataTypeCheck, SQLQueryCheck
34
35
  ]
35
36
 
36
- check_friendly_name: Optional[
37
- str
37
+ check_friendly_name: Annotated[
38
+ Optional[str], Field(validate_default=True)
38
39
  ] = None # auto generated or else can be overwritten
39
- check_type_friendly_name: Optional[str] = None
40
+ check_type_friendly_name: Annotated[
41
+ Optional[str], Field(validate_default=True)
42
+ ] = None
40
43
 
41
44
  model_config = ConfigDict(
42
45
  extra="forbid", # prevents config from containing any undesirable keys
43
46
  frozen=True, # prevents any modification to any attribute onces loaded from config
44
47
  )
45
48
 
46
- # @root_validator
47
- @model_validator(mode="before")
48
- @classmethod
49
- def root_val(cls, values):
50
- """
51
- Root validator that checks for all options passed in the config and generate missing options.
52
- """
53
- if values is None:
54
- values = {}
55
-
56
- check = values.get("check")
57
- check_friendly_name = values.get("check_friendly_name")
58
- column_id = values.get("column_id")
59
- if check is not None:
49
+ @field_validator("check_friendly_name")
50
+ def validate_or_generate_check_friendly_name(
51
+ cls, check_friendly_name, validation_info: ValidationInfo
52
+ ):
53
+ values = validation_info.data
54
+ if (
55
+ check_friendly_name is None
56
+ and values.get("check") is not None
57
+ and values.get("column_id") is not None
58
+ ):
59
+ check_friendly_name = generate_check_friendly_name(
60
+ check=values["check"], column_id=values["column_id"]
61
+ )
62
+ return check_friendly_name
63
+
64
+ @field_validator("check_type_friendly_name")
65
+ def validate_or_generate_check_type_friendly_name(
66
+ cls, check_type_friendly_name, validation_info: ValidationInfo
67
+ ):
68
+ values = validation_info.data
69
+ if values.get("check") is not None and values.get("column_id") is not None:
70
+ check = values.get("check")
60
71
  if isinstance(check, str):
61
72
  check_type_friendly_name = "".join(
62
73
  [word.title() for word in check.split("_")]
63
74
  )
64
75
  else:
65
76
  check_type_friendly_name = check.__class__.__name__
66
- values["check_type_friendly_name"] = check_type_friendly_name
67
-
68
- if check_friendly_name is None and column_id is not None:
69
- values["check_friendly_name"] = generate_check_friendly_name(
70
- check=check, column_id=column_id
71
- )
72
-
73
- return values
77
+ return check_type_friendly_name
74
78
 
75
79
  @staticmethod
76
80
  def load_yaml(
@@ -6,4 +6,4 @@ class CSVDataLoader:
6
6
  self.data_filename = data_filename
7
7
 
8
8
  def load(self):
9
- return pd.read_csv(self.data_filename, keep_default_na=False)
9
+ return pd.read_csv(self.data_filename)
@@ -1,8 +1,7 @@
1
1
  import argparse
2
- import os
3
2
  import sys
4
3
 
5
- from focus_validator.validator import Validator
4
+ from focus_validator.validator import DEFAULT_VERSION_SETS_PATH, Validator
6
5
 
7
6
 
8
7
  def main():
@@ -37,7 +36,7 @@ def main():
37
36
  )
38
37
  parser.add_argument(
39
38
  "--rule-set-path",
40
- default=os.path.join("focus_validator", "rules", "version_sets"),
39
+ default=DEFAULT_VERSION_SETS_PATH,
41
40
  help="Path to rules definitions",
42
41
  )
43
42
  parser.add_argument(
@@ -1,5 +1,4 @@
1
1
  import logging
2
- import re
3
2
  import sys
4
3
  import xml.etree.cElementTree as ET
5
4
  from datetime import datetime, timezone
@@ -146,9 +145,9 @@ class UnittestOutputter:
146
145
 
147
146
  # Add the testcases to the testsuites
148
147
  added_testsuites = {}
149
- for testcase in [
150
- r for r in rows if re.match(r"^FV-[D,M][0-9]{3}-[0-9]{4}$", r["check_name"])
151
- ]:
148
+ for testcase in rows:
149
+ if testcase["status"].value == "errored":
150
+ continue
152
151
  test_suite_id = testcase["check_name"].rsplit("-", 1)[0]
153
152
  if test_suite_id not in added_testsuites:
154
153
  formatter.add_testsuite(
@@ -0,0 +1,3 @@
1
+ column_id: BillingCurrency
2
+ check:
3
+ data_type: currency-code
@@ -0,0 +1,3 @@
1
+ column_id: BillingCurrency
2
+ check:
3
+ allow_nulls: false
@@ -0,0 +1,2 @@
1
+ column_id: BillingCurrency
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ChargeCategory
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: ChargeCategory
2
+ check:
3
+ allow_nulls: false
@@ -0,0 +1,2 @@
1
+ column_id: ChargeCategory
2
+ check: column_required
@@ -0,0 +1,4 @@
1
+ column_id: ChargeClass
2
+ check:
3
+ value_in:
4
+ - "Correction"
@@ -0,0 +1,3 @@
1
+ column_id: ChargeClass
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: ChargeClass
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: ChargeClass
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ChargeDescription
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,3 @@
1
+ column_id: CommitmentDiscountCategory
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,5 @@
1
+ column_id: CommitmentDiscountStatus
2
+ check:
3
+ value_in:
4
+ - "Used"
5
+ - "Unused"
@@ -0,0 +1,3 @@
1
+ column_id: CommitmentDiscountStatus
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: CommitmentDiscountStatus
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: CommitmentDiscountStatus
2
+ check: column_required
@@ -0,0 +1,2 @@
1
+ column_id: CommitmentDiscountType
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ConsumedQuantity
2
+ check:
3
+ data_type: decimal
@@ -0,0 +1,3 @@
1
+ column_id: ConsumedQuantity
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: ConsumedQuantity
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ConsumedUnit
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: ConsumedUnit
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: ConsumedUnit
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ContractedCost
2
+ check:
3
+ data_type: decimal
@@ -0,0 +1,3 @@
1
+ column_id: ContractedCost
2
+ check:
3
+ allow_nulls: false
@@ -0,0 +1,2 @@
1
+ column_id: ContractedCost
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: ContractedUnitPrice
2
+ check:
3
+ data_type: decimal
@@ -0,0 +1,3 @@
1
+ column_id: ContractedUnitPrice
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: ContractedUnitPrice
2
+ check: column_required
@@ -0,0 +1,2 @@
1
+ column_id: InvoiceIssuer
2
+ check: column_required
@@ -0,0 +1,7 @@
1
+ column_id: PricingCategory
2
+ check:
3
+ value_in:
4
+ - "Standard"
5
+ - "Dynamic"
6
+ - "Committed"
7
+ - "Other"
@@ -0,0 +1,3 @@
1
+ column_id: RegionId
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: RegionId
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: RegionId
2
+ check: column_required
@@ -0,0 +1,3 @@
1
+ column_id: RegionName
2
+ check:
3
+ data_type: string
@@ -0,0 +1,3 @@
1
+ column_id: RegionName
2
+ check:
3
+ allow_nulls: true
@@ -0,0 +1,2 @@
1
+ column_id: RegionName
2
+ check: column_required
@@ -0,0 +1,2 @@
1
+ column_id: ResourceID
2
+ check: column_required
@@ -21,11 +21,8 @@ def is_camel_case(column_name):
21
21
 
22
22
 
23
23
  @extensions.register_check_method()
24
- def check_not_null(pandas_obj: pd.Series, allow_nulls: bool):
25
- # TODO: works for string type, need to verify for other data types
26
- check_values = pandas_obj.isnull() | (pandas_obj == "")
27
- if not allow_nulls:
28
- check_values = check_values | (pandas_obj == "NULL")
24
+ def check_not_null(pandas_obj: pd.Series):
25
+ check_values = pandas_obj.isnull()
29
26
  return ~check_values
30
27
 
31
28