@hestia-earth/data-validation 0.37.7 → 0.37.9

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 (411) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +17 -0
  3. package/dist/validations.d.ts +10 -0
  4. package/dist/validations.js +10 -0
  5. package/package.json +4 -3
  6. package/search-results.json +1 -1
  7. package/src/version.ts +1 -1
  8. package/validation.json +639 -0
  9. package/.coveragerc +0 -14
  10. package/.dockerignore +0 -19
  11. package/.eslintignore +0 -17
  12. package/.eslintrc.js +0 -11
  13. package/.flake8 +0 -5
  14. package/.gitlab/issue_templates/new validation.md +0 -82
  15. package/.gitlab-ci.yml +0 -216
  16. package/.readthedocs.yml +0 -24
  17. package/CODEOWNERS +0 -11
  18. package/Dockerfile +0 -13
  19. package/MANIFEST.in +0 -2
  20. package/bin/hestia-validate-data +0 -80
  21. package/build_mocking.py +0 -14
  22. package/commitlint.config.js +0 -1
  23. package/docs/Makefile +0 -20
  24. package/docs/_static/styles.css +0 -4
  25. package/docs/_templates/custom-class-template.rst +0 -34
  26. package/docs/_templates/custom-module-template.rst +0 -66
  27. package/docs/_templates/layout.html +0 -4
  28. package/docs/conf.py +0 -74
  29. package/docs/index.rst +0 -42
  30. package/docs/make.bat +0 -35
  31. package/docs/requirements.txt +0 -13
  32. package/envs/.develop.env +0 -1
  33. package/envs/.master.env +0 -1
  34. package/guide-assets/.gitkeep +0 -0
  35. package/hestia_earth/validation/README.md +0 -5
  36. package/hestia_earth/validation/__init__.py +0 -32
  37. package/hestia_earth/validation/distribution.py +0 -22
  38. package/hestia_earth/validation/gee.py +0 -162
  39. package/hestia_earth/validation/log.py +0 -44
  40. package/hestia_earth/validation/models.py +0 -141
  41. package/hestia_earth/validation/preload_requests.py +0 -61
  42. package/hestia_earth/validation/terms.py +0 -88
  43. package/hestia_earth/validation/utils.py +0 -444
  44. package/hestia_earth/validation/validators/__init__.py +0 -141
  45. package/hestia_earth/validation/validators/aggregated_cycle.py +0 -32
  46. package/hestia_earth/validation/validators/aggregated_shared.py +0 -37
  47. package/hestia_earth/validation/validators/animal.py +0 -88
  48. package/hestia_earth/validation/validators/completeness.py +0 -252
  49. package/hestia_earth/validation/validators/cycle.py +0 -1123
  50. package/hestia_earth/validation/validators/distribution.py +0 -86
  51. package/hestia_earth/validation/validators/emission.py +0 -109
  52. package/hestia_earth/validation/validators/impact_assessment.py +0 -138
  53. package/hestia_earth/validation/validators/indicator.py +0 -154
  54. package/hestia_earth/validation/validators/infrastructure.py +0 -25
  55. package/hestia_earth/validation/validators/input.py +0 -268
  56. package/hestia_earth/validation/validators/management.py +0 -131
  57. package/hestia_earth/validation/validators/measurement.py +0 -368
  58. package/hestia_earth/validation/validators/organisation.py +0 -43
  59. package/hestia_earth/validation/validators/practice.py +0 -590
  60. package/hestia_earth/validation/validators/product.py +0 -263
  61. package/hestia_earth/validation/validators/property.py +0 -266
  62. package/hestia_earth/validation/validators/shared.py +0 -940
  63. package/hestia_earth/validation/validators/site.py +0 -312
  64. package/hestia_earth/validation/validators/source.py +0 -20
  65. package/hestia_earth/validation/validators/transformation.py +0 -250
  66. package/hestia_earth/validation/version.py +0 -1
  67. package/layer/build.sh +0 -34
  68. package/layer/deploy.sh +0 -18
  69. package/release.sh +0 -11
  70. package/requirements-ci.txt +0 -6
  71. package/requirements-test.txt +0 -4
  72. package/requirements.txt +0 -2
  73. package/run-docker-test.sh +0 -7
  74. package/run-docker.sh +0 -9
  75. package/run.py +0 -99
  76. package/scripts/build_docs.py +0 -283
  77. package/scripts/build_validation_list.py +0 -160
  78. package/scripts/guide-create-branch.sh +0 -15
  79. package/scripts/update-package-version.js +0 -28
  80. package/setup.py +0 -35
  81. package/tests/Dockerfile +0 -13
  82. package/tests/__init__.py +0 -3
  83. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-no-impactAssessment.json +0 -64
  84. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-world.json +0 -69
  85. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/valid.json +0 -69
  86. package/tests/fixtures/animal/duplicated-input-cycle/invalid.json +0 -98
  87. package/tests/fixtures/animal/duplicated-input-cycle/valid.json +0 -91
  88. package/tests/fixtures/animal/pregnancyRateTotal/invalid.json +0 -49
  89. package/tests/fixtures/animal/pregnancyRateTotal/valid.json +0 -60
  90. package/tests/fixtures/animal/required/invalid.json +0 -59
  91. package/tests/fixtures/animal/required/valid.json +0 -72
  92. package/tests/fixtures/completeness/all-values/warning.json +0 -22
  93. package/tests/fixtures/completeness/animalPopulation/invalid.json +0 -58
  94. package/tests/fixtures/completeness/animalPopulation/valid-animals.json +0 -71
  95. package/tests/fixtures/completeness/animalPopulation/valid-incomplete.json +0 -58
  96. package/tests/fixtures/completeness/animalPopulation/valid-no-liveAnimals.json +0 -37
  97. package/tests/fixtures/completeness/blank-nodes/agri-food processor-invalid.json +0 -52
  98. package/tests/fixtures/completeness/blank-nodes/invalid.json +0 -124
  99. package/tests/fixtures/completeness/blank-nodes/valid.json +0 -128
  100. package/tests/fixtures/completeness/cropland/site.json +0 -16
  101. package/tests/fixtures/completeness/cropland/valid.json +0 -22
  102. package/tests/fixtures/completeness/cropland/warning.json +0 -22
  103. package/tests/fixtures/completeness/freshForage/error-animals.json +0 -63
  104. package/tests/fixtures/completeness/freshForage/error-products.json +0 -65
  105. package/tests/fixtures/completeness/freshForage/valid-animal-inputs.json +0 -63
  106. package/tests/fixtures/completeness/freshForage/valid-animals.json +0 -63
  107. package/tests/fixtures/completeness/freshForage/valid-not-grazing-liveAnimal.json +0 -55
  108. package/tests/fixtures/completeness/freshForage/valid-not-liveAnimal.json +0 -47
  109. package/tests/fixtures/completeness/freshForage/valid-products.json +0 -68
  110. package/tests/fixtures/completeness/ingredient/invalid-agri-food-processor.json +0 -37
  111. package/tests/fixtures/completeness/ingredient/invalid.json +0 -49
  112. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-complete.json +0 -49
  113. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-incomplete.json +0 -37
  114. package/tests/fixtures/completeness/ingredient/valid.json +0 -49
  115. package/tests/fixtures/completeness/material/error.json +0 -49
  116. package/tests/fixtures/completeness/material/valid-fuel-material.json +0 -60
  117. package/tests/fixtures/completeness/material/valid-incomplete.json +0 -36
  118. package/tests/fixtures/completeness/material/valid-no-fuel.json +0 -36
  119. package/tests/fixtures/completeness/valid.json +0 -22
  120. package/tests/fixtures/cycle/aboveGroundCropResidue/invalid.json +0 -76
  121. package/tests/fixtures/cycle/aboveGroundCropResidue/valid.json +0 -76
  122. package/tests/fixtures/cycle/aggregated-valid.json +0 -102
  123. package/tests/fixtures/cycle/coverCrop/invalid.json +0 -64
  124. package/tests/fixtures/cycle/coverCrop/valid-not-coverCrop.json +0 -54
  125. package/tests/fixtures/cycle/coverCrop/valid.json +0 -64
  126. package/tests/fixtures/cycle/cropResidue/complete/invalid.json +0 -56
  127. package/tests/fixtures/cycle/cropResidue/complete/valid.json +0 -82
  128. package/tests/fixtures/cycle/cropResidue/incomplete/invalid.json +0 -42
  129. package/tests/fixtures/cycle/cropResidue/incomplete/valid.json +0 -56
  130. package/tests/fixtures/cycle/dates/invalid-emissions.json +0 -70
  131. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/invalid.json +0 -63
  132. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/valid.json +0 -63
  133. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates-year-only.json +0 -48
  134. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates.json +0 -48
  135. package/tests/fixtures/cycle/maximumCycleDuration/invalid.json +0 -48
  136. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates-year-only.json +0 -48
  137. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates.json +0 -48
  138. package/tests/fixtures/cycle/maximumCycleDuration/valid.json +0 -48
  139. package/tests/fixtures/cycle/otherSites/cycleDuration/invalid.json +0 -52
  140. package/tests/fixtures/cycle/otherSites/cycleDuration/valid-no-siteDuration.json +0 -40
  141. package/tests/fixtures/cycle/otherSites/cycleDuration/valid.json +0 -52
  142. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/invalid.json +0 -56
  143. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/valid.json +0 -65
  144. package/tests/fixtures/cycle/primary-product-as-input/invalid.json +0 -59
  145. package/tests/fixtures/cycle/primary-product-as-input/valid.json +0 -48
  146. package/tests/fixtures/cycle/product-linked-ia/cycle.json +0 -66
  147. package/tests/fixtures/cycle/product-linked-ia/invalid-multiple.json +0 -58
  148. package/tests/fixtures/cycle/product-linked-ia/valid.json +0 -57
  149. package/tests/fixtures/cycle/products/animals/invalid.json +0 -69
  150. package/tests/fixtures/cycle/products/animals/valid.json +0 -58
  151. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/invalid.json +0 -53
  152. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/valid.json +0 -53
  153. package/tests/fixtures/cycle/siteDuration/crop/invalid.json +0 -53
  154. package/tests/fixtures/cycle/siteDuration/crop/valid-different-duration.json +0 -53
  155. package/tests/fixtures/cycle/siteDuration/crop/valid-same-duration.json +0 -53
  156. package/tests/fixtures/cycle/siteDuration/invalid.json +0 -41
  157. package/tests/fixtures/cycle/siteDuration/valid-no-siteDuration.json +0 -40
  158. package/tests/fixtures/cycle/siteDuration/valid-otherSites.json +0 -48
  159. package/tests/fixtures/cycle/siteDuration/valid.json +0 -45
  160. package/tests/fixtures/cycle/substrate/required/invalid.json +0 -50
  161. package/tests/fixtures/cycle/substrate/required/valid.json +0 -60
  162. package/tests/fixtures/cycle/valid.json +0 -343
  163. package/tests/fixtures/emission/linked-terms/inputs/invalid.json +0 -78
  164. package/tests/fixtures/emission/linked-terms/inputs/valid.json +0 -106
  165. package/tests/fixtures/emission/linked-terms/transformation/error.json +0 -104
  166. package/tests/fixtures/emission/linked-terms/transformation/valid.json +0 -107
  167. package/tests/fixtures/emission/linked-terms/transformation/warning.json +0 -76
  168. package/tests/fixtures/emission/methodTier-background/invalid.json +0 -60
  169. package/tests/fixtures/emission/methodTier-background/valid.json +0 -60
  170. package/tests/fixtures/emission/not-relevant/invalid.json +0 -71
  171. package/tests/fixtures/emission/not-relevant/valid.json +0 -95
  172. package/tests/fixtures/emission/not-relevant-methodTier/invalid.json +0 -70
  173. package/tests/fixtures/emission/not-relevant-methodTier/valid.json +0 -95
  174. package/tests/fixtures/impactAssessment/aggregated-valid.json +0 -43
  175. package/tests/fixtures/impactAssessment/cycle-contains-product/invalid.json +0 -34
  176. package/tests/fixtures/impactAssessment/cycle-contains-product/valid.json +0 -34
  177. package/tests/fixtures/impactAssessment/cycle-endDate/invalid.json +0 -26
  178. package/tests/fixtures/impactAssessment/cycle-endDate/valid.json +0 -26
  179. package/tests/fixtures/impactAssessment/valid.json +0 -93
  180. package/tests/fixtures/indicator/characterisedIndicator-methodModel/invalid.json +0 -52
  181. package/tests/fixtures/indicator/characterisedIndicator-methodModel/valid.json +0 -52
  182. package/tests/fixtures/indicator/ionisingCompounds/invalid.json +0 -23
  183. package/tests/fixtures/indicator/ionisingCompounds/valid.json +0 -23
  184. package/tests/fixtures/indicator/landTransformation/invalid-grouped.json +0 -257
  185. package/tests/fixtures/indicator/landTransformation/invalid.json +0 -100
  186. package/tests/fixtures/indicator/landTransformation/valid-grouped-full.json +0 -507
  187. package/tests/fixtures/indicator/landTransformation/valid-grouped.json +0 -507
  188. package/tests/fixtures/indicator/landTransformation/valid.json +0 -100
  189. package/tests/fixtures/infrastructure/lifespan/invalid.json +0 -26
  190. package/tests/fixtures/infrastructure/lifespan/valid.json +0 -45
  191. package/tests/fixtures/input/animalFeed-fate/invalid.json +0 -103
  192. package/tests/fixtures/input/animalFeed-fate/valid.json +0 -90
  193. package/tests/fixtures/input/country/invalid.json +0 -64
  194. package/tests/fixtures/input/country/valid.json +0 -64
  195. package/tests/fixtures/input/distribution/animalHousing.json +0 -103
  196. package/tests/fixtures/input/distribution/complete/invalid.json +0 -177
  197. package/tests/fixtures/input/distribution/complete/valid.json +0 -163
  198. package/tests/fixtures/input/distribution/incomplete/valid.json +0 -139
  199. package/tests/fixtures/input/impactAssessment/invalid.json +0 -99
  200. package/tests/fixtures/input/impactAssessment/valid.json +0 -89
  201. package/tests/fixtures/input/input-as-product/invalid.json +0 -57
  202. package/tests/fixtures/input/input-as-product/valid.json +0 -59
  203. package/tests/fixtures/input/mustIncludeId/invalid.json +0 -13
  204. package/tests/fixtures/input/mustIncludeId/valid-multiple-ids.json +0 -31
  205. package/tests/fixtures/input/mustIncludeId/valid.json +0 -22
  206. package/tests/fixtures/input/saplings/invalid.json +0 -58
  207. package/tests/fixtures/input/saplings/valid-no-saplings.json +0 -58
  208. package/tests/fixtures/input/saplings/valid-not-plantation.json +0 -58
  209. package/tests/fixtures/input/saplings/valid.json +0 -58
  210. package/tests/fixtures/integration/distribution/product-yield-invalid.json +0 -54
  211. package/tests/fixtures/management/cycle-overlap/cycles.json +0 -39
  212. package/tests/fixtures/management/cycle-overlap/invalid.json +0 -26
  213. package/tests/fixtures/management/cycle-overlap/valid.json +0 -26
  214. package/tests/fixtures/management/exists/invalid.json +0 -13
  215. package/tests/fixtures/management/exists/valid.json +0 -25
  216. package/tests/fixtures/management/fallow-dates/invalid.json +0 -24
  217. package/tests/fixtures/management/fallow-dates/valid.json +0 -24
  218. package/tests/fixtures/management/termType/invalid-cropland.json +0 -35
  219. package/tests/fixtures/management/termType/invalid-permanent-pasture.json +0 -25
  220. package/tests/fixtures/management/termType/valid-cropland.json +0 -55
  221. package/tests/fixtures/management/termType/valid-no-management.json +0 -13
  222. package/tests/fixtures/management/termType/valid-permanent-pasture.json +0 -35
  223. package/tests/fixtures/measurement/depths/invalid.json +0 -44
  224. package/tests/fixtures/measurement/depths/valid.json +0 -50
  225. package/tests/fixtures/measurement/models/valid.json +0 -33
  226. package/tests/fixtures/measurement/models/warning-no-value.json +0 -30
  227. package/tests/fixtures/measurement/models/warning.json +0 -33
  228. package/tests/fixtures/measurement/pond-measurements/invalid.json +0 -11
  229. package/tests/fixtures/measurement/pond-measurements/valid.json +0 -23
  230. package/tests/fixtures/measurement/required-depths/error.json +0 -71
  231. package/tests/fixtures/measurement/required-depths/valid.json +0 -126
  232. package/tests/fixtures/measurement/required-depths/warning.json +0 -29
  233. package/tests/fixtures/measurement/soilTexture/missing-texture-value.json +0 -227
  234. package/tests/fixtures/measurement/soilTexture/percent-invalid.json +0 -110
  235. package/tests/fixtures/measurement/soilTexture/percent-missing-value.json +0 -43
  236. package/tests/fixtures/measurement/soilTexture/percent-valid.json +0 -110
  237. package/tests/fixtures/measurement/startDate-endDate-required/invalid.json +0 -32
  238. package/tests/fixtures/measurement/startDate-endDate-required/valid.json +0 -46
  239. package/tests/fixtures/measurement/unique/invalid.json +0 -28
  240. package/tests/fixtures/measurement/unique/valid.json +0 -16
  241. package/tests/fixtures/measurement/value-length/invalid.json +0 -46
  242. package/tests/fixtures/measurement/value-length/valid.json +0 -44
  243. package/tests/fixtures/measurement/water-salinity/invalid.json +0 -33
  244. package/tests/fixtures/measurement/water-salinity/valid-brakish.json +0 -40
  245. package/tests/fixtures/measurement/water-salinity/valid.json +0 -33
  246. package/tests/fixtures/organisation/valid.json +0 -26
  247. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/invalid.json +0 -63
  248. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/valid.json +0 -63
  249. package/tests/fixtures/practice/defaultValue/invalid.json +0 -12
  250. package/tests/fixtures/practice/defaultValue/valid.json +0 -15
  251. package/tests/fixtures/practice/excretaManagement/invalid.json +0 -50
  252. package/tests/fixtures/practice/excretaManagement/valid.json +0 -60
  253. package/tests/fixtures/practice/irrigated-complete/invalid.json +0 -47
  254. package/tests/fixtures/practice/irrigated-complete/valid-incomplete.json +0 -47
  255. package/tests/fixtures/practice/irrigated-complete/valid.json +0 -60
  256. package/tests/fixtures/practice/landCover-products/invalid.json +0 -58
  257. package/tests/fixtures/practice/landCover-products/valid-coverCrop.json +0 -69
  258. package/tests/fixtures/practice/landCover-products/valid.json +0 -58
  259. package/tests/fixtures/practice/liveAnimal-system/invalid.json +0 -58
  260. package/tests/fixtures/practice/liveAnimal-system/valid.json +0 -69
  261. package/tests/fixtures/practice/longFallowDuration/invalid.json +0 -20
  262. package/tests/fixtures/practice/longFallowDuration/valid.json +0 -20
  263. package/tests/fixtures/practice/noTillage/invalid.json +0 -23
  264. package/tests/fixtures/practice/noTillage/valid-value-not-100.json +0 -23
  265. package/tests/fixtures/practice/noTillage/valid.json +0 -21
  266. package/tests/fixtures/practice/pastureGrass/key-termType/invalid.json +0 -16
  267. package/tests/fixtures/practice/pastureGrass/key-termType/valid.json +0 -16
  268. package/tests/fixtures/practice/pastureGrass/key-value/invalid-numbers.json +0 -67
  269. package/tests/fixtures/practice/pastureGrass/key-value/invalid.json +0 -67
  270. package/tests/fixtures/practice/pastureGrass/key-value/valid.json +0 -67
  271. package/tests/fixtures/practice/pastureGrass/permanent-pasture/invalid.json +0 -37
  272. package/tests/fixtures/practice/pastureGrass/permanent-pasture/valid.json +0 -47
  273. package/tests/fixtures/practice/primaryPercent/invalid.json +0 -49
  274. package/tests/fixtures/practice/primaryPercent/valid.json +0 -49
  275. package/tests/fixtures/practice/processingOperation/invalid-no-primary.json +0 -48
  276. package/tests/fixtures/practice/processingOperation/invalid.json +0 -49
  277. package/tests/fixtures/practice/processingOperation/valid-cropland.json +0 -37
  278. package/tests/fixtures/practice/processingOperation/valid.json +0 -49
  279. package/tests/fixtures/practice/productivePhasePermanentCrops/invalid.json +0 -48
  280. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-0-value.json +0 -58
  281. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-no-value.json +0 -47
  282. package/tests/fixtures/practice/productivePhasePermanentCrops/valid.json +0 -48
  283. package/tests/fixtures/practice/site-management/invalid.json +0 -75
  284. package/tests/fixtures/practice/site-management/valid.json +0 -75
  285. package/tests/fixtures/practice/tillage-siteType/valid.json +0 -51
  286. package/tests/fixtures/practice/tillage-siteType/warning.json +0 -42
  287. package/tests/fixtures/practice/tillage-values/invalid-fullTillage.json +0 -61
  288. package/tests/fixtures/practice/tillage-values/invalid-noTillage.json +0 -61
  289. package/tests/fixtures/practice/tillage-values/valid.json +0 -61
  290. package/tests/fixtures/practice/waterRegime/rice/invalid.json +0 -59
  291. package/tests/fixtures/practice/waterRegime/rice/valid-0-value.json +0 -59
  292. package/tests/fixtures/practice/waterRegime/rice/valid.json +0 -58
  293. package/tests/fixtures/product/economicValueShare/invalid.json +0 -31
  294. package/tests/fixtures/product/economicValueShare/valid.json +0 -22
  295. package/tests/fixtures/product/excreta/invalid.json +0 -62
  296. package/tests/fixtures/product/excreta/valid.json +0 -62
  297. package/tests/fixtures/product/excreta/warning.json +0 -53
  298. package/tests/fixtures/product/excreta/with-system/invalid.json +0 -79
  299. package/tests/fixtures/product/excreta/with-system/valid.json +0 -88
  300. package/tests/fixtures/product/excreta/with-system/warning.json +0 -70
  301. package/tests/fixtures/product/fu_ha/invalid.json +0 -49
  302. package/tests/fixtures/product/fu_ha/valid.json +0 -49
  303. package/tests/fixtures/product/primary/invalid.json +0 -22
  304. package/tests/fixtures/product/primary/valid.json +0 -22
  305. package/tests/fixtures/product/value/valid.json +0 -26
  306. package/tests/fixtures/product/value/value-0/error.json +0 -40
  307. package/tests/fixtures/product/value/value-empty/warning.json +0 -23
  308. package/tests/fixtures/product/yield/invalid.json +0 -54
  309. package/tests/fixtures/product/yield/no-value.json +0 -75
  310. package/tests/fixtures/product/yield/valid.json +0 -54
  311. package/tests/fixtures/property/default-value/valid-allowed-exception.json +0 -61
  312. package/tests/fixtures/property/default-value/valid.json +0 -61
  313. package/tests/fixtures/property/default-value/warning.json +0 -61
  314. package/tests/fixtures/property/termType/invalid.json +0 -60
  315. package/tests/fixtures/property/termType/valid.json +0 -60
  316. package/tests/fixtures/property/value-min-max/invalid.json +0 -77
  317. package/tests/fixtures/property/value-min-max/valid-skip-maximum.json +0 -57
  318. package/tests/fixtures/property/value-min-max/valid.json +0 -78
  319. package/tests/fixtures/property/valueType/invalid.json +0 -79
  320. package/tests/fixtures/property/valueType/valid.json +0 -79
  321. package/tests/fixtures/property/volatileSolidsContent/invalid.json +0 -99
  322. package/tests/fixtures/property/volatileSolidsContent/valid.json +0 -99
  323. package/tests/fixtures/shared/coordinates/invalid.json +0 -18
  324. package/tests/fixtures/shared/coordinates/valid.json +0 -18
  325. package/tests/fixtures/shared/data-duplicates/valid.json +0 -113
  326. package/tests/fixtures/shared/data-duplicates/warning.json +0 -172
  327. package/tests/fixtures/shared/duplicated-term-units/invalid-animalProduct.json +0 -61
  328. package/tests/fixtures/shared/duplicated-term-units/invalid-organicFertiliser.json +0 -61
  329. package/tests/fixtures/shared/duplicated-term-units/valid.json +0 -49
  330. package/tests/fixtures/shared/list-country-region/invalid.json +0 -54
  331. package/tests/fixtures/shared/list-country-region/valid.json +0 -54
  332. package/tests/fixtures/shared/list-percent-value/invalid.json +0 -49
  333. package/tests/fixtures/shared/list-percent-value/valid.json +0 -52
  334. package/tests/fixtures/shared/list-valueType/invalid.json +0 -49
  335. package/tests/fixtures/shared/list-valueType/valid.json +0 -49
  336. package/tests/fixtures/shared/list-values-sum-100/management/with-properties/valid.json +0 -91
  337. package/tests/fixtures/shared/list-values-sum-100/measurements/missing-soil.json +0 -46
  338. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-high-value.json +0 -63
  339. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-valid.json +0 -40
  340. package/tests/fixtures/shared/list-values-sum-100/measurements/with-depth-high-value.json +0 -71
  341. package/tests/fixtures/shared/list-values-sum-100/practices/total-100.json +0 -61
  342. package/tests/fixtures/shared/list-values-sum-100/practices/total-110.json +0 -61
  343. package/tests/fixtures/shared/list-values-sum-100/practices/total-90.json +0 -61
  344. package/tests/fixtures/shared/min-max/value-above.json +0 -31
  345. package/tests/fixtures/shared/min-max/value-below.json +0 -31
  346. package/tests/fixtures/shared/min-max/value-valid.json +0 -45
  347. package/tests/fixtures/shared/model/emissions/invalid.json +0 -102
  348. package/tests/fixtures/shared/model/emissions/valid-variable-tolerance.json +0 -180
  349. package/tests/fixtures/shared/model/emissions/valid.json +0 -102
  350. package/tests/fixtures/shared/model/impacts/invalid.json +0 -75
  351. package/tests/fixtures/shared/model/impacts/valid.json +0 -75
  352. package/tests/fixtures/shared/model/inputs/valid-no-value.json +0 -84
  353. package/tests/fixtures/shared/model/inputs/valid.json +0 -87
  354. package/tests/fixtures/shared/model/inputs/warning.json +0 -87
  355. package/tests/fixtures/shared/model/products/valid-no-value.json +0 -88
  356. package/tests/fixtures/shared/model/products/valid.json +0 -91
  357. package/tests/fixtures/shared/model/products/warning.json +0 -91
  358. package/tests/fixtures/shared/otherModel/invalid.json +0 -69
  359. package/tests/fixtures/shared/otherModel/valid.json +0 -70
  360. package/tests/fixtures/shared/properties-duplicate-values/invalid.json +0 -61
  361. package/tests/fixtures/shared/properties-duplicate-values/valid.json +0 -57
  362. package/tests/fixtures/shared/properties-same-length/invalid.json +0 -62
  363. package/tests/fixtures/shared/properties-same-length/valid.json +0 -52
  364. package/tests/fixtures/shared/unit-percent/invalid.json +0 -34
  365. package/tests/fixtures/shared/unit-percent/valid.json +0 -60
  366. package/tests/fixtures/shared/unit-percent/warning.json +0 -52
  367. package/tests/fixtures/site/cycles-linked-ia/invalid.json +0 -129
  368. package/tests/fixtures/site/cycles-linked-ia/valid.json +0 -129
  369. package/tests/fixtures/site/valid.json +0 -138
  370. package/tests/fixtures/source/valid.json +0 -19
  371. package/tests/fixtures/transformation/excretaManagement/invalid.json +0 -47
  372. package/tests/fixtures/transformation/excretaManagement/valid.json +0 -59
  373. package/tests/fixtures/transformation/inputs-products/invalid.json +0 -43
  374. package/tests/fixtures/transformation/inputs-products/valid.json +0 -43
  375. package/tests/fixtures/transformation/linked-emission/invalid.json +0 -101
  376. package/tests/fixtures/transformation/linked-emission/valid.json +0 -107
  377. package/tests/fixtures/transformation/previousTransformationId/invalid-no-previous.json +0 -127
  378. package/tests/fixtures/transformation/previousTransformationId/invalid-previous-input.json +0 -100
  379. package/tests/fixtures/transformation/previousTransformationId/invalid-product-input.json +0 -106
  380. package/tests/fixtures/transformation/previousTransformationId/invalid-wrong-order.json +0 -136
  381. package/tests/fixtures/transformation/previousTransformationId/valid.json +0 -171
  382. package/tests/integration/__init__.py +0 -0
  383. package/tests/integration/test_product.py +0 -17
  384. package/tests/test_gee.py +0 -10
  385. package/tests/test_utils.py +0 -36
  386. package/tests/test_validation.py +0 -11
  387. package/tests/utils.py +0 -28
  388. package/tests/validators/__init__.py +0 -0
  389. package/tests/validators/test_aggregated_cycle.py +0 -44
  390. package/tests/validators/test_aggregated_shared.py +0 -63
  391. package/tests/validators/test_animal.py +0 -72
  392. package/tests/validators/test_completeness.py +0 -337
  393. package/tests/validators/test_cycle.py +0 -600
  394. package/tests/validators/test_emission.py +0 -170
  395. package/tests/validators/test_impact_assessment.py +0 -80
  396. package/tests/validators/test_indicator.py +0 -120
  397. package/tests/validators/test_infrastructure.py +0 -26
  398. package/tests/validators/test_input.py +0 -434
  399. package/tests/validators/test_management.py +0 -177
  400. package/tests/validators/test_measurement.py +0 -317
  401. package/tests/validators/test_organisation.py +0 -32
  402. package/tests/validators/test_practice.py +0 -490
  403. package/tests/validators/test_product.py +0 -291
  404. package/tests/validators/test_property.py +0 -143
  405. package/tests/validators/test_shared.py +0 -1139
  406. package/tests/validators/test_site.py +0 -151
  407. package/tests/validators/test_source.py +0 -15
  408. package/tests/validators/test_transformation.py +0 -151
  409. package/tests/validators/test_validators.py +0 -74
  410. package/tsconfig.dist.json +0 -9
  411. package/tsconfig.json +0 -25
@@ -1,263 +0,0 @@
1
- import traceback
2
- from hestia_earth.schema import TermTermType, CycleFunctionalUnit
3
- from hestia_earth.utils.lookup import extract_grouped_data
4
- from hestia_earth.utils.tools import list_sum, flatten, non_empty_list
5
- from hestia_earth.utils.model import filter_list_term_type
6
-
7
- from hestia_earth.validation.log import logger
8
- from hestia_earth.validation.utils import (
9
- _list_sum,
10
- _filter_list_errors,
11
- get_lookup_value,
12
- )
13
- from hestia_earth.validation.distribution import is_enabled as distribution_is_enabled
14
- from .shared import CROP_SITE_TYPE
15
-
16
-
17
- def validate_economicValueShare(products: list):
18
- sum = _list_sum(products, "economicValueShare")
19
- return sum <= 100.5 or {
20
- "level": "error",
21
- "dataPath": ".products",
22
- "message": "economicValueShare should sum to 100 or less across all products",
23
- "params": {"sum": sum},
24
- }
25
-
26
-
27
- def validate_value_empty(products: list):
28
- def validate(values: tuple):
29
- index, product = values
30
- return len(product.get("value", [])) > 0 or {
31
- "level": "warning",
32
- "dataPath": f".products[{index}]",
33
- "message": "may not be 0",
34
- }
35
-
36
- return _filter_list_errors(map(validate, enumerate(products)))
37
-
38
-
39
- def validate_value_0(products: list):
40
- def validate(values: tuple):
41
- index, product = values
42
- value = list_sum(product.get("value", [-1]), -1)
43
- eva = product.get("economicValueShare", 0)
44
- revenue = product.get("revenue", 0)
45
- return value != 0 or _filter_list_errors(
46
- [
47
- eva == 0
48
- or {
49
- "level": "error",
50
- "dataPath": f".products[{index}].value",
51
- "message": "economicValueShare must be 0 for product value 0",
52
- "params": {"value": eva, "term": product.get("term")},
53
- },
54
- revenue == 0
55
- or {
56
- "level": "error",
57
- "dataPath": f".products[{index}].value",
58
- "message": "revenue must be 0 for product value 0",
59
- "params": {"value": revenue, "term": product.get("term")},
60
- },
61
- ]
62
- )
63
-
64
- return _filter_list_errors(flatten(map(validate, enumerate(products))))
65
-
66
-
67
- MAX_PRIMARY_PRODUCTS = 1
68
-
69
-
70
- def validate_primary(products: list):
71
- primary = list(filter(lambda p: p.get("primary", False), products))
72
- return len(primary) <= MAX_PRIMARY_PRODUCTS or {
73
- "level": "error",
74
- "dataPath": ".products",
75
- "message": "only 1 primary product allowed",
76
- }
77
-
78
-
79
- def validate_product_ha_functional_unit_ha(cycle: dict, list_key: str = "products"):
80
- functional_unit = cycle.get("functionalUnit", CycleFunctionalUnit.RELATIVE.value)
81
-
82
- def validate(values: tuple):
83
- index, product = values
84
- term_units = product.get("term", {}).get("units")
85
- value = list_sum(product.get("value", [0]))
86
- return (
87
- term_units != "ha"
88
- or value <= 1
89
- or {
90
- "level": "error",
91
- "dataPath": f".{list_key}[{index}].value",
92
- "message": "must be below or equal to 1 for unit in ha",
93
- "params": {"term": product.get("term", {})},
94
- }
95
- )
96
-
97
- return functional_unit != CycleFunctionalUnit._1_HA.value or _filter_list_errors(
98
- map(validate, enumerate(cycle.get(list_key, [])))
99
- )
100
-
101
-
102
- def _validate_product_yield(country: dict, list_key: str, threshold: float):
103
- from .distribution import (
104
- YIELD_COLUMN,
105
- get_stats_by_group_key,
106
- validate as validate_distribution,
107
- )
108
-
109
- country_id = country.get("@id")
110
-
111
- def validate(values: tuple):
112
- index, product = values
113
-
114
- product_id = product.get("term", {}).get("@id")
115
- product_value = product.get("value", [])
116
-
117
- def _get_mu_sd():
118
- return get_stats_by_group_key(YIELD_COLUMN, country_id, product_id)
119
-
120
- valid, outliers, min, max = validate_distribution(
121
- product_value, threshold, get_mu_sd=_get_mu_sd
122
- )
123
- return valid or {
124
- "level": "warning",
125
- "dataPath": f".{list_key}[{index}].value",
126
- "message": "is outside confidence interval",
127
- "params": {
128
- "term": product.get("term", {}),
129
- "country": country,
130
- "outliers": outliers,
131
- "threshold": threshold,
132
- "min": min,
133
- "max": max,
134
- },
135
- }
136
-
137
- return validate
138
-
139
-
140
- def validate_product_yield(
141
- cycle: dict, site: dict, list_key: str = "products", threshold: float = 0.95
142
- ):
143
- country = site.get("country", {})
144
- products = cycle.get(list_key, [])
145
-
146
- try:
147
- return (
148
- site.get("siteType") not in CROP_SITE_TYPE
149
- or (
150
- _filter_list_errors(
151
- map(
152
- _validate_product_yield(country, list_key, threshold),
153
- enumerate(products),
154
- )
155
- )
156
- )
157
- if distribution_is_enabled()
158
- else True
159
- )
160
- except Exception:
161
- stack = traceback.format_exc()
162
- logger.error(f"Error validating using distribution: '{stack}'")
163
- return True
164
-
165
-
166
- def _excreta_term_ids(term: dict, column: str, group_key: str):
167
- value = get_lookup_value(term, column)
168
- # handle using `|` to allow multiple values
169
- return non_empty_list((extract_grouped_data(value, group_key) or "").split("|"))
170
-
171
-
172
- def _grouped_excreta_term_ids(term: dict, group_keys: list):
173
- grouped_columns = {
174
- "kg": "excretaKgMassTermIds",
175
- "kg N": "excretaKgNTermIds",
176
- "kg VS": "excretaKgVsTermIds",
177
- }
178
- grouped_values = {
179
- units: flatten(
180
- [_excreta_term_ids(term, column, group_key) for group_key in group_keys]
181
- )
182
- for units, column in grouped_columns.items()
183
- }
184
- # include `default` key if no values found
185
- return {
186
- units: grouped_values.get(units, [])
187
- + (
188
- _excreta_term_ids(term, column, "default")
189
- if not grouped_values.get(units)
190
- else []
191
- )
192
- for units, column in grouped_columns.items()
193
- }
194
-
195
-
196
- def validate_excreta_product(cycle: dict, list_key: str = "products"):
197
- animal_products = [
198
- (index, product)
199
- for index, product in enumerate(cycle.get(list_key, []))
200
- if product.get("term", {}).get("termType")
201
- in [
202
- TermTermType.ANIMALPRODUCT.value,
203
- TermTermType.LIVEANIMAL.value,
204
- TermTermType.LIVEAQUATICSPECIES.value,
205
- ]
206
- ]
207
- excreta_products = [
208
- (index, product)
209
- for index, product in enumerate(cycle.get(list_key, []))
210
- if product.get("term", {}).get("termType") in [TermTermType.EXCRETA.value]
211
- ]
212
- systems = filter_list_term_type(cycle.get("practices", []), TermTermType.SYSTEM)
213
- group_keys = [s.get("term", {}).get("@id") for s in systems]
214
- allowed_excreta_per_product = {
215
- product.get("term", {}).get("@id"): _grouped_excreta_term_ids(
216
- product.get("term", {}), group_keys
217
- )
218
- for _i, product in animal_products
219
- }
220
-
221
- def validate_animal(values: tuple):
222
- """
223
- Validate the the animal product has an excreta term
224
- """
225
- index, blank_node = values
226
- term = blank_node.get("term", {})
227
- term_id = term.get("@id")
228
- allowed_ids = flatten(allowed_excreta_per_product.get(term_id, {}).values())
229
- return {
230
- "level": "warning",
231
- "dataPath": f".{list_key}[{index}]",
232
- "message": "should add an excreta product",
233
- "params": {"expected": allowed_ids},
234
- }
235
-
236
- def validate_excreta(values: tuple):
237
- """
238
- Validate that the excreta is allowed.
239
- """
240
- index, blank_node = values
241
- term = blank_node.get("term", {})
242
- term_id = term.get("@id")
243
- allowed_ids = non_empty_list(
244
- flatten(
245
- [v.get(term.get("units")) for v in allowed_excreta_per_product.values()]
246
- )
247
- )
248
- return term_id in allowed_ids or {
249
- "level": "error",
250
- "dataPath": f".{list_key}[{index}].term.@id",
251
- "message": "is not an allowed excreta product",
252
- "params": {"current": term_id, "expected": allowed_ids},
253
- }
254
-
255
- return (
256
- (
257
- _filter_list_errors(map(validate_excreta, excreta_products))
258
- if excreta_products
259
- else _filter_list_errors(map(validate_animal, animal_products))
260
- )
261
- if animal_products
262
- else True
263
- )
@@ -1,266 +0,0 @@
1
- from hestia_earth.utils.api import download_hestia
2
- from hestia_earth.utils.model import find_term_match
3
- from hestia_earth.utils.tools import flatten, non_empty_list, safe_parse_float
4
-
5
- from hestia_earth.validation.utils import (
6
- match_value_type,
7
- term_valueType,
8
- get_lookup_value,
9
- update_error_path,
10
- _filter_list_errors,
11
- _flatten_errors,
12
- )
13
- from .shared import (
14
- value_difference,
15
- is_value_below,
16
- validate_list_value_between_min_max,
17
- validate_list_min_max_lookup,
18
- )
19
-
20
-
21
- PROPERTIES_KEY = "properties"
22
-
23
-
24
- def validate_property_valueType(node: dict, list_key: str):
25
- def is_valid(values: tuple):
26
- index, property = values
27
- term = property.get("term", {})
28
- expected_value_type = term_valueType(term)
29
- value = property.get("value")
30
- return (
31
- value is None
32
- or match_value_type(expected_value_type, value)
33
- or {
34
- "level": "error",
35
- "dataPath": f".{PROPERTIES_KEY}[{index}].value",
36
- "message": "the property value type is incorrect",
37
- "params": {"expected": expected_value_type},
38
- }
39
- )
40
-
41
- def validate(values: tuple):
42
- index, blank_node = values
43
- errors = list(map(is_valid, enumerate(blank_node.get(PROPERTIES_KEY, []))))
44
- return _filter_list_errors(
45
- [
46
- update_error_path(error, list_key, index)
47
- for error in errors
48
- if error is not True
49
- ]
50
- )
51
-
52
- return _filter_list_errors(
53
- flatten(map(validate, enumerate(node.get(list_key, []))))
54
- )
55
-
56
-
57
- def validate_term_type(node: dict, list_key: str):
58
- def is_valid(blank_node: dict):
59
- def check(values: tuple):
60
- index, property = values
61
- term = property.get("term", {})
62
- term_types = get_lookup_value(term, "termTypesAllowed")
63
- expected_term_types = (term_types or "all").split(";")
64
- term_type = blank_node.get("term", {}).get("termType")
65
- return any(
66
- ["all" in expected_term_types, term_type in expected_term_types]
67
- ) or {
68
- "level": "error",
69
- "dataPath": f".{PROPERTIES_KEY}[{index}].term.termType",
70
- "message": "can not be used on this termType",
71
- "params": {"current": term_type, "expected": expected_term_types},
72
- }
73
-
74
- return check
75
-
76
- def validate(values: tuple):
77
- index, blank_node = values
78
- errors = list(
79
- map(is_valid(blank_node), enumerate(blank_node.get(PROPERTIES_KEY, [])))
80
- )
81
- return _filter_list_errors(
82
- [
83
- update_error_path(error, list_key, index)
84
- for error in errors
85
- if error is not True
86
- ]
87
- )
88
-
89
- return _filter_list_errors(
90
- flatten(map(validate, enumerate(node.get(list_key, []))))
91
- )
92
-
93
-
94
- def _property_default_value(term_id: str, property_term_id: str):
95
- # load the term defaultProperties and find the matching property
96
- term = download_hestia(term_id)
97
- if not term:
98
- raise Exception(f"Term not found: {term_id}")
99
- return safe_parse_float(
100
- find_term_match(term.get("defaultProperties", []), property_term_id).get(
101
- "value"
102
- )
103
- )
104
-
105
-
106
- def _property_default_allowed_values(term: dict):
107
- allowed = get_lookup_value(term, "validationAllowedExceptions")
108
- try:
109
- allowed_values = non_empty_list(allowed.split(";")) if allowed else []
110
- return [safe_parse_float(v) for v in allowed_values]
111
- # failure to split by `;` as single value allowed
112
- except AttributeError:
113
- return [safe_parse_float(allowed)]
114
-
115
-
116
- def validate_default_value(node: dict, list_key: str):
117
- threshold = 0.25
118
-
119
- def is_valid(term_id: str):
120
- def validate(values: tuple):
121
- index, prop = values
122
- value = safe_parse_float(prop.get("value"))
123
- prop_term_id = prop.get("term", {}).get("@id")
124
- default_value = _property_default_value(term_id, prop_term_id)
125
- delta = value_difference(value, default_value)
126
- values_allowed = (
127
- _property_default_allowed_values(prop.get("term", {}))
128
- if prop_term_id
129
- else []
130
- )
131
- return (
132
- prop.get("value") is None
133
- or delta < threshold
134
- or value in values_allowed
135
- or {
136
- "level": "warning",
137
- "dataPath": f".{PROPERTIES_KEY}[{index}].value",
138
- "message": "should be within percentage of default value",
139
- "params": {
140
- "current": value,
141
- "default": default_value,
142
- "percentage": delta * 100,
143
- "threshold": threshold,
144
- },
145
- }
146
- )
147
-
148
- return validate
149
-
150
- def validate(values: tuple):
151
- index, blank_node = values
152
- term_id = blank_node.get("term", {}).get("@id")
153
- errors = list(
154
- map(is_valid(term_id), enumerate(blank_node.get(PROPERTIES_KEY, [])))
155
- )
156
- return _filter_list_errors(
157
- [
158
- update_error_path(error, list_key, index)
159
- for error in errors
160
- if error is not True
161
- ]
162
- )
163
-
164
- return _filter_list_errors(
165
- flatten(map(validate, enumerate(node.get(list_key, []))))
166
- )
167
-
168
-
169
- VSC_ID = "volatileSolidsContent"
170
- VSC_MIN = {"kg": 0, "kg Vs": 100, "kg N": 0}
171
- VSC_MAX = {"kg": 100, "kg Vs": 100, "kg N": None}
172
-
173
-
174
- def _volatileSolidsContent_error(min: float = None, max: float = None):
175
- return (
176
- f"must be {max}"
177
- if min == max
178
- else (
179
- f"must be above {min}"
180
- if max is None
181
- else (
182
- f"must be below {max}"
183
- if min is None
184
- else f"must be between {min} and {max}"
185
- )
186
- )
187
- )
188
-
189
-
190
- def validate_volatileSolidsContent(node: dict, list_key: str):
191
- def is_valid(blank_node: dict):
192
- units = blank_node.get("term", {}).get("units")
193
-
194
- def validate(values: tuple):
195
- index, property = values
196
- term_id = property.get("term", {}).get("@id")
197
- value = property.get("value", 0)
198
- min = VSC_MIN.get(units)
199
- max = VSC_MAX.get(units)
200
- return (
201
- term_id != VSC_ID
202
- or all([is_value_below(value, max), is_value_below(min, value)])
203
- or {
204
- "level": "error",
205
- "dataPath": f".{PROPERTIES_KEY}[{index}].value",
206
- "message": _volatileSolidsContent_error(min, max),
207
- }
208
- )
209
-
210
- return validate
211
-
212
- def validate(values: tuple):
213
- index, blank_node = values
214
- errors = flatten(
215
- map(is_valid(blank_node), enumerate(blank_node.get(PROPERTIES_KEY, [])))
216
- )
217
- return _filter_list_errors(
218
- [
219
- update_error_path(error, list_key, index)
220
- for error in errors
221
- if error is not True
222
- ]
223
- )
224
-
225
- return _filter_list_errors(
226
- flatten(map(validate, enumerate(node.get(list_key, []))))
227
- )
228
-
229
-
230
- def validate_value_min_max(node: dict, list_key: str):
231
- def validate(values: tuple):
232
- index, blank_node = values
233
- # handle skip maximum validation for some properties
234
- skip_maximum_properties = (
235
- get_lookup_value(blank_node.get("term"), "skipValidateTermIdsMaximum") or ""
236
- ).split(";")
237
- errors = _flatten_errors(
238
- [
239
- validate_list_value_between_min_max(blank_node, PROPERTIES_KEY),
240
- validate_list_min_max_lookup(
241
- blank_node, PROPERTIES_KEY, skip_max_ids=skip_maximum_properties
242
- ),
243
- ]
244
- )
245
- return _filter_list_errors(
246
- [
247
- update_error_path(error, list_key, index)
248
- for error in errors
249
- if error is not True
250
- ]
251
- )
252
-
253
- return _filter_list_errors(
254
- flatten(map(validate, enumerate(node.get(list_key, []))))
255
- )
256
-
257
-
258
- def validate_all(node: dict, list_key: str):
259
- return _filter_list_errors(
260
- [
261
- validate_default_value(node, list_key),
262
- validate_term_type(node, list_key),
263
- validate_property_valueType(node, list_key),
264
- validate_value_min_max(node, list_key),
265
- ]
266
- )