@hestia-earth/data-validation 0.37.7

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 (410) hide show
  1. package/.coveragerc +14 -0
  2. package/.dockerignore +19 -0
  3. package/.eslintignore +17 -0
  4. package/.eslintrc.js +11 -0
  5. package/.flake8 +5 -0
  6. package/.gitlab/issue_templates/new validation.md +82 -0
  7. package/.gitlab-ci.yml +216 -0
  8. package/.readthedocs.yml +24 -0
  9. package/CODEOWNERS +11 -0
  10. package/Dockerfile +13 -0
  11. package/LICENSE +21 -0
  12. package/MANIFEST.in +2 -0
  13. package/bin/hestia-validate-data +80 -0
  14. package/build_mocking.py +14 -0
  15. package/commitlint.config.js +1 -0
  16. package/docs/Makefile +20 -0
  17. package/docs/_static/styles.css +4 -0
  18. package/docs/_templates/custom-class-template.rst +34 -0
  19. package/docs/_templates/custom-module-template.rst +66 -0
  20. package/docs/_templates/layout.html +4 -0
  21. package/docs/conf.py +74 -0
  22. package/docs/index.rst +42 -0
  23. package/docs/make.bat +35 -0
  24. package/docs/requirements.txt +13 -0
  25. package/envs/.develop.env +1 -0
  26. package/envs/.master.env +1 -0
  27. package/guide-assets/.gitkeep +0 -0
  28. package/hestia_earth/validation/README.md +5 -0
  29. package/hestia_earth/validation/__init__.py +32 -0
  30. package/hestia_earth/validation/distribution.py +22 -0
  31. package/hestia_earth/validation/gee.py +162 -0
  32. package/hestia_earth/validation/log.py +44 -0
  33. package/hestia_earth/validation/models.py +141 -0
  34. package/hestia_earth/validation/preload_requests.py +61 -0
  35. package/hestia_earth/validation/terms.py +88 -0
  36. package/hestia_earth/validation/utils.py +444 -0
  37. package/hestia_earth/validation/validators/__init__.py +141 -0
  38. package/hestia_earth/validation/validators/aggregated_cycle.py +32 -0
  39. package/hestia_earth/validation/validators/aggregated_shared.py +37 -0
  40. package/hestia_earth/validation/validators/animal.py +88 -0
  41. package/hestia_earth/validation/validators/completeness.py +252 -0
  42. package/hestia_earth/validation/validators/cycle.py +1123 -0
  43. package/hestia_earth/validation/validators/distribution.py +86 -0
  44. package/hestia_earth/validation/validators/emission.py +109 -0
  45. package/hestia_earth/validation/validators/impact_assessment.py +138 -0
  46. package/hestia_earth/validation/validators/indicator.py +154 -0
  47. package/hestia_earth/validation/validators/infrastructure.py +25 -0
  48. package/hestia_earth/validation/validators/input.py +268 -0
  49. package/hestia_earth/validation/validators/management.py +131 -0
  50. package/hestia_earth/validation/validators/measurement.py +368 -0
  51. package/hestia_earth/validation/validators/organisation.py +43 -0
  52. package/hestia_earth/validation/validators/practice.py +590 -0
  53. package/hestia_earth/validation/validators/product.py +263 -0
  54. package/hestia_earth/validation/validators/property.py +266 -0
  55. package/hestia_earth/validation/validators/shared.py +940 -0
  56. package/hestia_earth/validation/validators/site.py +312 -0
  57. package/hestia_earth/validation/validators/source.py +20 -0
  58. package/hestia_earth/validation/validators/transformation.py +250 -0
  59. package/hestia_earth/validation/version.py +1 -0
  60. package/layer/build.sh +34 -0
  61. package/layer/deploy.sh +18 -0
  62. package/package.json +59 -0
  63. package/release.sh +11 -0
  64. package/requirements-ci.txt +6 -0
  65. package/requirements-test.txt +4 -0
  66. package/requirements.txt +2 -0
  67. package/run-docker-test.sh +7 -0
  68. package/run-docker.sh +9 -0
  69. package/run.py +99 -0
  70. package/scripts/build_docs.py +283 -0
  71. package/scripts/build_validation_list.py +160 -0
  72. package/scripts/guide-create-branch.sh +15 -0
  73. package/scripts/update-package-version.js +28 -0
  74. package/search-results.json +384 -0
  75. package/setup.cfg +2 -0
  76. package/setup.py +35 -0
  77. package/src/index.ts +1 -0
  78. package/src/validations.ts +22 -0
  79. package/src/version.ts +1 -0
  80. package/tests/Dockerfile +13 -0
  81. package/tests/__init__.py +3 -0
  82. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-no-impactAssessment.json +64 -0
  83. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-world.json +69 -0
  84. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/valid.json +69 -0
  85. package/tests/fixtures/animal/duplicated-input-cycle/invalid.json +98 -0
  86. package/tests/fixtures/animal/duplicated-input-cycle/valid.json +91 -0
  87. package/tests/fixtures/animal/pregnancyRateTotal/invalid.json +49 -0
  88. package/tests/fixtures/animal/pregnancyRateTotal/valid.json +60 -0
  89. package/tests/fixtures/animal/required/invalid.json +59 -0
  90. package/tests/fixtures/animal/required/valid.json +72 -0
  91. package/tests/fixtures/completeness/all-values/warning.json +22 -0
  92. package/tests/fixtures/completeness/animalPopulation/invalid.json +58 -0
  93. package/tests/fixtures/completeness/animalPopulation/valid-animals.json +71 -0
  94. package/tests/fixtures/completeness/animalPopulation/valid-incomplete.json +58 -0
  95. package/tests/fixtures/completeness/animalPopulation/valid-no-liveAnimals.json +37 -0
  96. package/tests/fixtures/completeness/blank-nodes/agri-food processor-invalid.json +52 -0
  97. package/tests/fixtures/completeness/blank-nodes/invalid.json +124 -0
  98. package/tests/fixtures/completeness/blank-nodes/valid.json +128 -0
  99. package/tests/fixtures/completeness/cropland/site.json +16 -0
  100. package/tests/fixtures/completeness/cropland/valid.json +22 -0
  101. package/tests/fixtures/completeness/cropland/warning.json +22 -0
  102. package/tests/fixtures/completeness/freshForage/error-animals.json +63 -0
  103. package/tests/fixtures/completeness/freshForage/error-products.json +65 -0
  104. package/tests/fixtures/completeness/freshForage/valid-animal-inputs.json +63 -0
  105. package/tests/fixtures/completeness/freshForage/valid-animals.json +63 -0
  106. package/tests/fixtures/completeness/freshForage/valid-not-grazing-liveAnimal.json +55 -0
  107. package/tests/fixtures/completeness/freshForage/valid-not-liveAnimal.json +47 -0
  108. package/tests/fixtures/completeness/freshForage/valid-products.json +68 -0
  109. package/tests/fixtures/completeness/ingredient/invalid-agri-food-processor.json +37 -0
  110. package/tests/fixtures/completeness/ingredient/invalid.json +49 -0
  111. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-complete.json +49 -0
  112. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-incomplete.json +37 -0
  113. package/tests/fixtures/completeness/ingredient/valid.json +49 -0
  114. package/tests/fixtures/completeness/material/error.json +49 -0
  115. package/tests/fixtures/completeness/material/valid-fuel-material.json +60 -0
  116. package/tests/fixtures/completeness/material/valid-incomplete.json +36 -0
  117. package/tests/fixtures/completeness/material/valid-no-fuel.json +36 -0
  118. package/tests/fixtures/completeness/valid.json +22 -0
  119. package/tests/fixtures/cycle/aboveGroundCropResidue/invalid.json +76 -0
  120. package/tests/fixtures/cycle/aboveGroundCropResidue/valid.json +76 -0
  121. package/tests/fixtures/cycle/aggregated-valid.json +102 -0
  122. package/tests/fixtures/cycle/coverCrop/invalid.json +64 -0
  123. package/tests/fixtures/cycle/coverCrop/valid-not-coverCrop.json +54 -0
  124. package/tests/fixtures/cycle/coverCrop/valid.json +64 -0
  125. package/tests/fixtures/cycle/cropResidue/complete/invalid.json +56 -0
  126. package/tests/fixtures/cycle/cropResidue/complete/valid.json +82 -0
  127. package/tests/fixtures/cycle/cropResidue/incomplete/invalid.json +42 -0
  128. package/tests/fixtures/cycle/cropResidue/incomplete/valid.json +56 -0
  129. package/tests/fixtures/cycle/dates/invalid-emissions.json +70 -0
  130. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/invalid.json +63 -0
  131. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/valid.json +63 -0
  132. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates-year-only.json +48 -0
  133. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates.json +48 -0
  134. package/tests/fixtures/cycle/maximumCycleDuration/invalid.json +48 -0
  135. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates-year-only.json +48 -0
  136. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates.json +48 -0
  137. package/tests/fixtures/cycle/maximumCycleDuration/valid.json +48 -0
  138. package/tests/fixtures/cycle/otherSites/cycleDuration/invalid.json +52 -0
  139. package/tests/fixtures/cycle/otherSites/cycleDuration/valid-no-siteDuration.json +40 -0
  140. package/tests/fixtures/cycle/otherSites/cycleDuration/valid.json +52 -0
  141. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/invalid.json +56 -0
  142. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/valid.json +65 -0
  143. package/tests/fixtures/cycle/primary-product-as-input/invalid.json +59 -0
  144. package/tests/fixtures/cycle/primary-product-as-input/valid.json +48 -0
  145. package/tests/fixtures/cycle/product-linked-ia/cycle.json +66 -0
  146. package/tests/fixtures/cycle/product-linked-ia/invalid-multiple.json +58 -0
  147. package/tests/fixtures/cycle/product-linked-ia/valid.json +57 -0
  148. package/tests/fixtures/cycle/products/animals/invalid.json +69 -0
  149. package/tests/fixtures/cycle/products/animals/valid.json +58 -0
  150. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/invalid.json +53 -0
  151. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/valid.json +53 -0
  152. package/tests/fixtures/cycle/siteDuration/crop/invalid.json +53 -0
  153. package/tests/fixtures/cycle/siteDuration/crop/valid-different-duration.json +53 -0
  154. package/tests/fixtures/cycle/siteDuration/crop/valid-same-duration.json +53 -0
  155. package/tests/fixtures/cycle/siteDuration/invalid.json +41 -0
  156. package/tests/fixtures/cycle/siteDuration/valid-no-siteDuration.json +40 -0
  157. package/tests/fixtures/cycle/siteDuration/valid-otherSites.json +48 -0
  158. package/tests/fixtures/cycle/siteDuration/valid.json +45 -0
  159. package/tests/fixtures/cycle/substrate/required/invalid.json +50 -0
  160. package/tests/fixtures/cycle/substrate/required/valid.json +60 -0
  161. package/tests/fixtures/cycle/valid.json +343 -0
  162. package/tests/fixtures/emission/linked-terms/inputs/invalid.json +78 -0
  163. package/tests/fixtures/emission/linked-terms/inputs/valid.json +106 -0
  164. package/tests/fixtures/emission/linked-terms/transformation/error.json +104 -0
  165. package/tests/fixtures/emission/linked-terms/transformation/valid.json +107 -0
  166. package/tests/fixtures/emission/linked-terms/transformation/warning.json +76 -0
  167. package/tests/fixtures/emission/methodTier-background/invalid.json +60 -0
  168. package/tests/fixtures/emission/methodTier-background/valid.json +60 -0
  169. package/tests/fixtures/emission/not-relevant/invalid.json +71 -0
  170. package/tests/fixtures/emission/not-relevant/valid.json +95 -0
  171. package/tests/fixtures/emission/not-relevant-methodTier/invalid.json +70 -0
  172. package/tests/fixtures/emission/not-relevant-methodTier/valid.json +95 -0
  173. package/tests/fixtures/impactAssessment/aggregated-valid.json +43 -0
  174. package/tests/fixtures/impactAssessment/cycle-contains-product/invalid.json +34 -0
  175. package/tests/fixtures/impactAssessment/cycle-contains-product/valid.json +34 -0
  176. package/tests/fixtures/impactAssessment/cycle-endDate/invalid.json +26 -0
  177. package/tests/fixtures/impactAssessment/cycle-endDate/valid.json +26 -0
  178. package/tests/fixtures/impactAssessment/valid.json +93 -0
  179. package/tests/fixtures/indicator/characterisedIndicator-methodModel/invalid.json +52 -0
  180. package/tests/fixtures/indicator/characterisedIndicator-methodModel/valid.json +52 -0
  181. package/tests/fixtures/indicator/ionisingCompounds/invalid.json +23 -0
  182. package/tests/fixtures/indicator/ionisingCompounds/valid.json +23 -0
  183. package/tests/fixtures/indicator/landTransformation/invalid-grouped.json +257 -0
  184. package/tests/fixtures/indicator/landTransformation/invalid.json +100 -0
  185. package/tests/fixtures/indicator/landTransformation/valid-grouped-full.json +507 -0
  186. package/tests/fixtures/indicator/landTransformation/valid-grouped.json +507 -0
  187. package/tests/fixtures/indicator/landTransformation/valid.json +100 -0
  188. package/tests/fixtures/infrastructure/lifespan/invalid.json +26 -0
  189. package/tests/fixtures/infrastructure/lifespan/valid.json +45 -0
  190. package/tests/fixtures/input/animalFeed-fate/invalid.json +103 -0
  191. package/tests/fixtures/input/animalFeed-fate/valid.json +90 -0
  192. package/tests/fixtures/input/country/invalid.json +64 -0
  193. package/tests/fixtures/input/country/valid.json +64 -0
  194. package/tests/fixtures/input/distribution/animalHousing.json +103 -0
  195. package/tests/fixtures/input/distribution/complete/invalid.json +177 -0
  196. package/tests/fixtures/input/distribution/complete/valid.json +163 -0
  197. package/tests/fixtures/input/distribution/incomplete/valid.json +139 -0
  198. package/tests/fixtures/input/impactAssessment/invalid.json +99 -0
  199. package/tests/fixtures/input/impactAssessment/valid.json +89 -0
  200. package/tests/fixtures/input/input-as-product/invalid.json +57 -0
  201. package/tests/fixtures/input/input-as-product/valid.json +59 -0
  202. package/tests/fixtures/input/mustIncludeId/invalid.json +13 -0
  203. package/tests/fixtures/input/mustIncludeId/valid-multiple-ids.json +31 -0
  204. package/tests/fixtures/input/mustIncludeId/valid.json +22 -0
  205. package/tests/fixtures/input/saplings/invalid.json +58 -0
  206. package/tests/fixtures/input/saplings/valid-no-saplings.json +58 -0
  207. package/tests/fixtures/input/saplings/valid-not-plantation.json +58 -0
  208. package/tests/fixtures/input/saplings/valid.json +58 -0
  209. package/tests/fixtures/integration/distribution/product-yield-invalid.json +54 -0
  210. package/tests/fixtures/management/cycle-overlap/cycles.json +39 -0
  211. package/tests/fixtures/management/cycle-overlap/invalid.json +26 -0
  212. package/tests/fixtures/management/cycle-overlap/valid.json +26 -0
  213. package/tests/fixtures/management/exists/invalid.json +13 -0
  214. package/tests/fixtures/management/exists/valid.json +25 -0
  215. package/tests/fixtures/management/fallow-dates/invalid.json +24 -0
  216. package/tests/fixtures/management/fallow-dates/valid.json +24 -0
  217. package/tests/fixtures/management/termType/invalid-cropland.json +35 -0
  218. package/tests/fixtures/management/termType/invalid-permanent-pasture.json +25 -0
  219. package/tests/fixtures/management/termType/valid-cropland.json +55 -0
  220. package/tests/fixtures/management/termType/valid-no-management.json +13 -0
  221. package/tests/fixtures/management/termType/valid-permanent-pasture.json +35 -0
  222. package/tests/fixtures/measurement/depths/invalid.json +44 -0
  223. package/tests/fixtures/measurement/depths/valid.json +50 -0
  224. package/tests/fixtures/measurement/models/valid.json +33 -0
  225. package/tests/fixtures/measurement/models/warning-no-value.json +30 -0
  226. package/tests/fixtures/measurement/models/warning.json +33 -0
  227. package/tests/fixtures/measurement/pond-measurements/invalid.json +11 -0
  228. package/tests/fixtures/measurement/pond-measurements/valid.json +23 -0
  229. package/tests/fixtures/measurement/required-depths/error.json +71 -0
  230. package/tests/fixtures/measurement/required-depths/valid.json +126 -0
  231. package/tests/fixtures/measurement/required-depths/warning.json +29 -0
  232. package/tests/fixtures/measurement/soilTexture/missing-texture-value.json +227 -0
  233. package/tests/fixtures/measurement/soilTexture/percent-invalid.json +110 -0
  234. package/tests/fixtures/measurement/soilTexture/percent-missing-value.json +43 -0
  235. package/tests/fixtures/measurement/soilTexture/percent-valid.json +110 -0
  236. package/tests/fixtures/measurement/startDate-endDate-required/invalid.json +32 -0
  237. package/tests/fixtures/measurement/startDate-endDate-required/valid.json +46 -0
  238. package/tests/fixtures/measurement/unique/invalid.json +28 -0
  239. package/tests/fixtures/measurement/unique/valid.json +16 -0
  240. package/tests/fixtures/measurement/value-length/invalid.json +46 -0
  241. package/tests/fixtures/measurement/value-length/valid.json +44 -0
  242. package/tests/fixtures/measurement/water-salinity/invalid.json +33 -0
  243. package/tests/fixtures/measurement/water-salinity/valid-brakish.json +40 -0
  244. package/tests/fixtures/measurement/water-salinity/valid.json +33 -0
  245. package/tests/fixtures/organisation/valid.json +26 -0
  246. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/invalid.json +63 -0
  247. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/valid.json +63 -0
  248. package/tests/fixtures/practice/defaultValue/invalid.json +12 -0
  249. package/tests/fixtures/practice/defaultValue/valid.json +15 -0
  250. package/tests/fixtures/practice/excretaManagement/invalid.json +50 -0
  251. package/tests/fixtures/practice/excretaManagement/valid.json +60 -0
  252. package/tests/fixtures/practice/irrigated-complete/invalid.json +47 -0
  253. package/tests/fixtures/practice/irrigated-complete/valid-incomplete.json +47 -0
  254. package/tests/fixtures/practice/irrigated-complete/valid.json +60 -0
  255. package/tests/fixtures/practice/landCover-products/invalid.json +58 -0
  256. package/tests/fixtures/practice/landCover-products/valid-coverCrop.json +69 -0
  257. package/tests/fixtures/practice/landCover-products/valid.json +58 -0
  258. package/tests/fixtures/practice/liveAnimal-system/invalid.json +58 -0
  259. package/tests/fixtures/practice/liveAnimal-system/valid.json +69 -0
  260. package/tests/fixtures/practice/longFallowDuration/invalid.json +20 -0
  261. package/tests/fixtures/practice/longFallowDuration/valid.json +20 -0
  262. package/tests/fixtures/practice/noTillage/invalid.json +23 -0
  263. package/tests/fixtures/practice/noTillage/valid-value-not-100.json +23 -0
  264. package/tests/fixtures/practice/noTillage/valid.json +21 -0
  265. package/tests/fixtures/practice/pastureGrass/key-termType/invalid.json +16 -0
  266. package/tests/fixtures/practice/pastureGrass/key-termType/valid.json +16 -0
  267. package/tests/fixtures/practice/pastureGrass/key-value/invalid-numbers.json +67 -0
  268. package/tests/fixtures/practice/pastureGrass/key-value/invalid.json +67 -0
  269. package/tests/fixtures/practice/pastureGrass/key-value/valid.json +67 -0
  270. package/tests/fixtures/practice/pastureGrass/permanent-pasture/invalid.json +37 -0
  271. package/tests/fixtures/practice/pastureGrass/permanent-pasture/valid.json +47 -0
  272. package/tests/fixtures/practice/primaryPercent/invalid.json +49 -0
  273. package/tests/fixtures/practice/primaryPercent/valid.json +49 -0
  274. package/tests/fixtures/practice/processingOperation/invalid-no-primary.json +48 -0
  275. package/tests/fixtures/practice/processingOperation/invalid.json +49 -0
  276. package/tests/fixtures/practice/processingOperation/valid-cropland.json +37 -0
  277. package/tests/fixtures/practice/processingOperation/valid.json +49 -0
  278. package/tests/fixtures/practice/productivePhasePermanentCrops/invalid.json +48 -0
  279. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-0-value.json +58 -0
  280. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-no-value.json +47 -0
  281. package/tests/fixtures/practice/productivePhasePermanentCrops/valid.json +48 -0
  282. package/tests/fixtures/practice/site-management/invalid.json +75 -0
  283. package/tests/fixtures/practice/site-management/valid.json +75 -0
  284. package/tests/fixtures/practice/tillage-siteType/valid.json +51 -0
  285. package/tests/fixtures/practice/tillage-siteType/warning.json +42 -0
  286. package/tests/fixtures/practice/tillage-values/invalid-fullTillage.json +61 -0
  287. package/tests/fixtures/practice/tillage-values/invalid-noTillage.json +61 -0
  288. package/tests/fixtures/practice/tillage-values/valid.json +61 -0
  289. package/tests/fixtures/practice/waterRegime/rice/invalid.json +59 -0
  290. package/tests/fixtures/practice/waterRegime/rice/valid-0-value.json +59 -0
  291. package/tests/fixtures/practice/waterRegime/rice/valid.json +58 -0
  292. package/tests/fixtures/product/economicValueShare/invalid.json +31 -0
  293. package/tests/fixtures/product/economicValueShare/valid.json +22 -0
  294. package/tests/fixtures/product/excreta/invalid.json +62 -0
  295. package/tests/fixtures/product/excreta/valid.json +62 -0
  296. package/tests/fixtures/product/excreta/warning.json +53 -0
  297. package/tests/fixtures/product/excreta/with-system/invalid.json +79 -0
  298. package/tests/fixtures/product/excreta/with-system/valid.json +88 -0
  299. package/tests/fixtures/product/excreta/with-system/warning.json +70 -0
  300. package/tests/fixtures/product/fu_ha/invalid.json +49 -0
  301. package/tests/fixtures/product/fu_ha/valid.json +49 -0
  302. package/tests/fixtures/product/primary/invalid.json +22 -0
  303. package/tests/fixtures/product/primary/valid.json +22 -0
  304. package/tests/fixtures/product/value/valid.json +26 -0
  305. package/tests/fixtures/product/value/value-0/error.json +40 -0
  306. package/tests/fixtures/product/value/value-empty/warning.json +23 -0
  307. package/tests/fixtures/product/yield/invalid.json +54 -0
  308. package/tests/fixtures/product/yield/no-value.json +75 -0
  309. package/tests/fixtures/product/yield/valid.json +54 -0
  310. package/tests/fixtures/property/default-value/valid-allowed-exception.json +61 -0
  311. package/tests/fixtures/property/default-value/valid.json +61 -0
  312. package/tests/fixtures/property/default-value/warning.json +61 -0
  313. package/tests/fixtures/property/termType/invalid.json +60 -0
  314. package/tests/fixtures/property/termType/valid.json +60 -0
  315. package/tests/fixtures/property/value-min-max/invalid.json +77 -0
  316. package/tests/fixtures/property/value-min-max/valid-skip-maximum.json +57 -0
  317. package/tests/fixtures/property/value-min-max/valid.json +78 -0
  318. package/tests/fixtures/property/valueType/invalid.json +79 -0
  319. package/tests/fixtures/property/valueType/valid.json +79 -0
  320. package/tests/fixtures/property/volatileSolidsContent/invalid.json +99 -0
  321. package/tests/fixtures/property/volatileSolidsContent/valid.json +99 -0
  322. package/tests/fixtures/shared/coordinates/invalid.json +18 -0
  323. package/tests/fixtures/shared/coordinates/valid.json +18 -0
  324. package/tests/fixtures/shared/data-duplicates/valid.json +113 -0
  325. package/tests/fixtures/shared/data-duplicates/warning.json +172 -0
  326. package/tests/fixtures/shared/duplicated-term-units/invalid-animalProduct.json +61 -0
  327. package/tests/fixtures/shared/duplicated-term-units/invalid-organicFertiliser.json +61 -0
  328. package/tests/fixtures/shared/duplicated-term-units/valid.json +49 -0
  329. package/tests/fixtures/shared/list-country-region/invalid.json +54 -0
  330. package/tests/fixtures/shared/list-country-region/valid.json +54 -0
  331. package/tests/fixtures/shared/list-percent-value/invalid.json +49 -0
  332. package/tests/fixtures/shared/list-percent-value/valid.json +52 -0
  333. package/tests/fixtures/shared/list-valueType/invalid.json +49 -0
  334. package/tests/fixtures/shared/list-valueType/valid.json +49 -0
  335. package/tests/fixtures/shared/list-values-sum-100/management/with-properties/valid.json +91 -0
  336. package/tests/fixtures/shared/list-values-sum-100/measurements/missing-soil.json +46 -0
  337. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-high-value.json +63 -0
  338. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-valid.json +40 -0
  339. package/tests/fixtures/shared/list-values-sum-100/measurements/with-depth-high-value.json +71 -0
  340. package/tests/fixtures/shared/list-values-sum-100/practices/total-100.json +61 -0
  341. package/tests/fixtures/shared/list-values-sum-100/practices/total-110.json +61 -0
  342. package/tests/fixtures/shared/list-values-sum-100/practices/total-90.json +61 -0
  343. package/tests/fixtures/shared/min-max/value-above.json +31 -0
  344. package/tests/fixtures/shared/min-max/value-below.json +31 -0
  345. package/tests/fixtures/shared/min-max/value-valid.json +45 -0
  346. package/tests/fixtures/shared/model/emissions/invalid.json +102 -0
  347. package/tests/fixtures/shared/model/emissions/valid-variable-tolerance.json +180 -0
  348. package/tests/fixtures/shared/model/emissions/valid.json +102 -0
  349. package/tests/fixtures/shared/model/impacts/invalid.json +75 -0
  350. package/tests/fixtures/shared/model/impacts/valid.json +75 -0
  351. package/tests/fixtures/shared/model/inputs/valid-no-value.json +84 -0
  352. package/tests/fixtures/shared/model/inputs/valid.json +87 -0
  353. package/tests/fixtures/shared/model/inputs/warning.json +87 -0
  354. package/tests/fixtures/shared/model/products/valid-no-value.json +88 -0
  355. package/tests/fixtures/shared/model/products/valid.json +91 -0
  356. package/tests/fixtures/shared/model/products/warning.json +91 -0
  357. package/tests/fixtures/shared/otherModel/invalid.json +69 -0
  358. package/tests/fixtures/shared/otherModel/valid.json +70 -0
  359. package/tests/fixtures/shared/properties-duplicate-values/invalid.json +61 -0
  360. package/tests/fixtures/shared/properties-duplicate-values/valid.json +57 -0
  361. package/tests/fixtures/shared/properties-same-length/invalid.json +62 -0
  362. package/tests/fixtures/shared/properties-same-length/valid.json +52 -0
  363. package/tests/fixtures/shared/unit-percent/invalid.json +34 -0
  364. package/tests/fixtures/shared/unit-percent/valid.json +60 -0
  365. package/tests/fixtures/shared/unit-percent/warning.json +52 -0
  366. package/tests/fixtures/site/cycles-linked-ia/invalid.json +129 -0
  367. package/tests/fixtures/site/cycles-linked-ia/valid.json +129 -0
  368. package/tests/fixtures/site/valid.json +138 -0
  369. package/tests/fixtures/source/valid.json +19 -0
  370. package/tests/fixtures/transformation/excretaManagement/invalid.json +47 -0
  371. package/tests/fixtures/transformation/excretaManagement/valid.json +59 -0
  372. package/tests/fixtures/transformation/inputs-products/invalid.json +43 -0
  373. package/tests/fixtures/transformation/inputs-products/valid.json +43 -0
  374. package/tests/fixtures/transformation/linked-emission/invalid.json +101 -0
  375. package/tests/fixtures/transformation/linked-emission/valid.json +107 -0
  376. package/tests/fixtures/transformation/previousTransformationId/invalid-no-previous.json +127 -0
  377. package/tests/fixtures/transformation/previousTransformationId/invalid-previous-input.json +100 -0
  378. package/tests/fixtures/transformation/previousTransformationId/invalid-product-input.json +106 -0
  379. package/tests/fixtures/transformation/previousTransformationId/invalid-wrong-order.json +136 -0
  380. package/tests/fixtures/transformation/previousTransformationId/valid.json +171 -0
  381. package/tests/integration/__init__.py +0 -0
  382. package/tests/integration/test_product.py +17 -0
  383. package/tests/test_gee.py +10 -0
  384. package/tests/test_utils.py +36 -0
  385. package/tests/test_validation.py +11 -0
  386. package/tests/utils.py +28 -0
  387. package/tests/validators/__init__.py +0 -0
  388. package/tests/validators/test_aggregated_cycle.py +44 -0
  389. package/tests/validators/test_aggregated_shared.py +63 -0
  390. package/tests/validators/test_animal.py +72 -0
  391. package/tests/validators/test_completeness.py +337 -0
  392. package/tests/validators/test_cycle.py +600 -0
  393. package/tests/validators/test_emission.py +170 -0
  394. package/tests/validators/test_impact_assessment.py +80 -0
  395. package/tests/validators/test_indicator.py +120 -0
  396. package/tests/validators/test_infrastructure.py +26 -0
  397. package/tests/validators/test_input.py +434 -0
  398. package/tests/validators/test_management.py +177 -0
  399. package/tests/validators/test_measurement.py +317 -0
  400. package/tests/validators/test_organisation.py +32 -0
  401. package/tests/validators/test_practice.py +490 -0
  402. package/tests/validators/test_product.py +291 -0
  403. package/tests/validators/test_property.py +143 -0
  404. package/tests/validators/test_shared.py +1139 -0
  405. package/tests/validators/test_site.py +151 -0
  406. package/tests/validators/test_source.py +15 -0
  407. package/tests/validators/test_transformation.py +151 -0
  408. package/tests/validators/test_validators.py +74 -0
  409. package/tsconfig.dist.json +9 -0
  410. package/tsconfig.json +25 -0
@@ -0,0 +1,291 @@
1
+ from unittest.mock import patch
2
+ import json
3
+ import os
4
+
5
+ from tests.utils import fixtures_path
6
+ from hestia_earth.validation.validators.product import (
7
+ validate_economicValueShare,
8
+ validate_value_empty,
9
+ validate_value_0,
10
+ validate_primary,
11
+ validate_product_ha_functional_unit_ha,
12
+ validate_product_yield,
13
+ validate_excreta_product,
14
+ )
15
+
16
+
17
+ class_path = "hestia_earth.validation.validators.product"
18
+ distribution_class_path = "hestia_earth.validation.validators.distribution"
19
+ fixtures_folder = os.path.join(fixtures_path, "product")
20
+
21
+
22
+ def test_validate_economicValueShare_valid():
23
+ # no products should be valid
24
+ assert validate_economicValueShare([]) is True
25
+
26
+ with open(f"{fixtures_folder}/economicValueShare/valid.json") as f:
27
+ data = json.load(f)
28
+ assert validate_economicValueShare(data.get("nodes")) is True
29
+
30
+
31
+ def test_validate_economicValueShare_invalid():
32
+ with open(f"{fixtures_folder}/economicValueShare/invalid.json") as f:
33
+ data = json.load(f)
34
+ assert validate_economicValueShare(data.get("nodes")) == {
35
+ "level": "error",
36
+ "dataPath": ".products",
37
+ "message": "economicValueShare should sum to 100 or less across all products",
38
+ "params": {"sum": 110},
39
+ }
40
+
41
+
42
+ def test_validate_value_empty_valid():
43
+ # no products should be valid
44
+ assert validate_value_empty([]) is True
45
+
46
+ with open(f"{fixtures_folder}/value/valid.json") as f:
47
+ data = json.load(f)
48
+ assert validate_value_empty(data.get("nodes")) is True
49
+
50
+
51
+ def test_validate_value_empty_warning():
52
+ with open(f"{fixtures_folder}/value/value-empty/warning.json") as f:
53
+ data = json.load(f)
54
+ assert validate_value_empty(data.get("nodes")) == {
55
+ "level": "warning",
56
+ "dataPath": ".products[1]",
57
+ "message": "may not be 0",
58
+ }
59
+
60
+
61
+ def test_validate_value_0_valid():
62
+ # no products should be valid
63
+ assert validate_value_0([]) is True
64
+
65
+ with open(f"{fixtures_folder}/value/valid.json") as f:
66
+ data = json.load(f)
67
+ assert validate_value_0(data.get("nodes")) is True
68
+
69
+
70
+ def test_validate_value_0_error():
71
+ with open(f"{fixtures_folder}/value/value-0/error.json") as f:
72
+ data = json.load(f)
73
+ assert validate_value_0(data.get("nodes")) == [
74
+ {
75
+ "level": "error",
76
+ "dataPath": ".products[1].value",
77
+ "message": "economicValueShare must be 0 for product value 0",
78
+ "params": {
79
+ "value": 100,
80
+ "term": {
81
+ "@type": "Term",
82
+ "name": "Generic Crop, seed",
83
+ "@id": "genericCropSeed",
84
+ },
85
+ },
86
+ },
87
+ {
88
+ "level": "error",
89
+ "dataPath": ".products[1].value",
90
+ "message": "revenue must be 0 for product value 0",
91
+ "params": {
92
+ "value": 100,
93
+ "term": {
94
+ "@type": "Term",
95
+ "name": "Generic Crop, seed",
96
+ "@id": "genericCropSeed",
97
+ },
98
+ },
99
+ },
100
+ ]
101
+
102
+
103
+ def test_validate_primary_valid():
104
+ # no products should be valid
105
+ assert validate_primary([]) is True
106
+
107
+ with open(f"{fixtures_folder}/primary/valid.json") as f:
108
+ data = json.load(f)
109
+ assert validate_primary(data.get("nodes")) is True
110
+
111
+
112
+ def test_validate_primary_error():
113
+ with open(f"{fixtures_folder}/primary/invalid.json") as f:
114
+ data = json.load(f)
115
+ assert validate_primary(data.get("nodes")) == {
116
+ "level": "error",
117
+ "dataPath": ".products",
118
+ "message": "only 1 primary product allowed",
119
+ }
120
+
121
+
122
+ def test_validate_product_ha_functional_unit_ha_valid():
123
+ # no products should be valid
124
+ assert validate_product_ha_functional_unit_ha({"products": []}, "products") is True
125
+
126
+ with open(f"{fixtures_folder}/fu_ha/valid.json") as f:
127
+ cycle = json.load(f)
128
+ assert validate_product_ha_functional_unit_ha(cycle, "products") is True
129
+
130
+
131
+ def test_validate_product_ha_functional_unit_ha_error():
132
+ with open(f"{fixtures_folder}/fu_ha/invalid.json") as f:
133
+ cycle = json.load(f)
134
+ assert validate_product_ha_functional_unit_ha(cycle, "products") == {
135
+ "level": "error",
136
+ "dataPath": ".products[0].value",
137
+ "message": "must be below or equal to 1 for unit in ha",
138
+ "params": {"term": {"@type": "Term", "@id": "adzukiBeanVines", "units": "ha"}},
139
+ }
140
+
141
+
142
+ MU = 8000
143
+ SD = 1000
144
+
145
+
146
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(MU, SD))
147
+ def test_validate_product_yield_valid(*args):
148
+ # no products should be valid
149
+ assert validate_product_yield({"products": []}, {}, "products") is True
150
+
151
+ # no value on products should be valid
152
+ with open(f"{fixtures_folder}/yield/no-value.json") as f:
153
+ cycle = json.load(f)
154
+ assert validate_product_yield(cycle, cycle.get("site")) is True
155
+
156
+
157
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(MU, SD))
158
+ def test_validate_product_yield_valid_with_posterior(*args):
159
+ with open(f"{fixtures_folder}/yield/valid.json") as f:
160
+ cycle = json.load(f)
161
+ assert validate_product_yield(cycle, cycle.get("site")) is True
162
+
163
+
164
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(MU, SD))
165
+ def test_validate_product_yield_invalid_with_posterior(*args):
166
+ with open(f"{fixtures_folder}/yield/invalid.json") as f:
167
+ cycle = json.load(f)
168
+ assert validate_product_yield(cycle, cycle.get("site")) == {
169
+ "level": "warning",
170
+ "dataPath": ".products[0].value",
171
+ "message": "is outside confidence interval",
172
+ "params": {
173
+ "term": {"@type": "Term", "termType": "crop", "@id": "wheatGrain"},
174
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
175
+ "outliers": [1000],
176
+ "threshold": 0.95,
177
+ "min": 6040,
178
+ "max": 9960,
179
+ },
180
+ }
181
+
182
+
183
+ @patch(f"{distribution_class_path}.get_prior_yield", return_value=(MU, SD))
184
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(None, None))
185
+ def test_validate_product_yield_valid_with_prior_no_posterior(*args):
186
+ with open(f"{fixtures_folder}/yield/valid.json") as f:
187
+ cycle = json.load(f)
188
+ assert validate_product_yield(cycle, cycle.get("site")) is True
189
+
190
+
191
+ @patch(f"{distribution_class_path}.get_prior_yield", return_value=(MU, SD))
192
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(None, None))
193
+ def test_validate_product_yield_invalid_with_prior_no_posterior(*args):
194
+ with open(f"{fixtures_folder}/yield/invalid.json") as f:
195
+ cycle = json.load(f)
196
+ assert validate_product_yield(cycle, cycle.get("site")) == {
197
+ "level": "warning",
198
+ "dataPath": ".products[0].value",
199
+ "message": "is outside confidence interval",
200
+ "params": {
201
+ "term": {"@type": "Term", "termType": "crop", "@id": "wheatGrain"},
202
+ "country": {"@type": "Term", "@id": "GADM-GBR"},
203
+ "outliers": [1000],
204
+ "threshold": 0.95,
205
+ "min": 6040,
206
+ "max": 9960,
207
+ },
208
+ }
209
+
210
+
211
+ @patch(f"{distribution_class_path}.get_prior_yield", return_value=(None, None))
212
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=(None, None))
213
+ def test_validate_product_yield_valid_no_prior_no_posterior(*args):
214
+ with open(f"{fixtures_folder}/yield/valid.json") as f:
215
+ cycle = json.load(f)
216
+ assert validate_product_yield(cycle, cycle.get("site")) is True
217
+
218
+
219
+ @patch(f"{distribution_class_path}.get_post_yield", return_value=Exception)
220
+ def test_validate_product_yield_handle_exception(*args):
221
+ with open(f"{fixtures_folder}/yield/invalid.json") as f:
222
+ cycle = json.load(f)
223
+ assert validate_product_yield(cycle, cycle.get("site")) is True
224
+
225
+
226
+ def test_validate_excreta_product_valid():
227
+ # no products should be valid
228
+ assert validate_excreta_product({}, "products") is True
229
+
230
+ with open(f"{fixtures_folder}/excreta/valid.json") as f:
231
+ data = json.load(f)
232
+ assert validate_excreta_product(data) is True
233
+
234
+ with open(f"{fixtures_folder}/excreta/with-system/valid.json") as f:
235
+ data = json.load(f)
236
+ assert validate_excreta_product(data) is True
237
+
238
+
239
+ def test_validate_excreta_product_invalid():
240
+ with open(f"{fixtures_folder}/excreta/invalid.json") as f:
241
+ data = json.load(f)
242
+ assert validate_excreta_product(data) == {
243
+ "level": "error",
244
+ "dataPath": ".products[1].term.@id",
245
+ "message": "is not an allowed excreta product",
246
+ "params": {"current": "excretaCamelsKgN", "expected": ["excretaPoultryKgN"]},
247
+ }
248
+
249
+ with open(f"{fixtures_folder}/excreta/with-system/invalid.json") as f:
250
+ data = json.load(f)
251
+ assert validate_excreta_product(data) == {
252
+ "level": "error",
253
+ "dataPath": ".products[1].term.@id",
254
+ "message": "is not an allowed excreta product",
255
+ "params": {
256
+ "current": "excretaBeefCattleExceptFeedlotFedKgN",
257
+ "expected": ["excretaBeefCattleFeedlotFedKgN"],
258
+ },
259
+ }
260
+
261
+
262
+ def test_validate_excreta_product_warning():
263
+ with open(f"{fixtures_folder}/excreta/warning.json") as f:
264
+ data = json.load(f)
265
+ assert validate_excreta_product(data) == {
266
+ "level": "warning",
267
+ "dataPath": ".products[0]",
268
+ "message": "should add an excreta product",
269
+ "params": {
270
+ "expected": [
271
+ "excretaPoultryKgMass",
272
+ "excretaPoultryKgN",
273
+ "excretaPoultryKgVs",
274
+ ]
275
+ },
276
+ }
277
+
278
+ with open(f"{fixtures_folder}/excreta/with-system/warning.json") as f:
279
+ data = json.load(f)
280
+ assert validate_excreta_product(data) == {
281
+ "level": "warning",
282
+ "dataPath": ".products[0]",
283
+ "message": "should add an excreta product",
284
+ "params": {
285
+ "expected": [
286
+ "excretaBeefCattleFeedlotFedKgMass",
287
+ "excretaBeefCattleFeedlotFedKgN",
288
+ "excretaBeefCattleFeedlotFedKgVs",
289
+ ]
290
+ },
291
+ }
@@ -0,0 +1,143 @@
1
+ import os
2
+ import json
3
+
4
+ from tests.utils import fixtures_path
5
+ from hestia_earth.validation.validators.property import (
6
+ validate_property_valueType,
7
+ validate_term_type,
8
+ validate_default_value,
9
+ validate_volatileSolidsContent,
10
+ validate_value_min_max,
11
+ )
12
+
13
+ fixtures_folder = os.path.join(fixtures_path, "property")
14
+
15
+
16
+ def test_validate_property_valueType_valid():
17
+ # no properties should be valid
18
+ assert validate_property_valueType({}, "products") is True
19
+
20
+ with open(f"{fixtures_folder}/valueType/valid.json") as f:
21
+ data = json.load(f)
22
+ assert validate_property_valueType(data, "products") is True
23
+
24
+
25
+ def test_validate_property_valueType_invalid():
26
+ with open(f"{fixtures_folder}/valueType/invalid.json") as f:
27
+ data = json.load(f)
28
+ assert validate_property_valueType(data, "products") == [
29
+ {
30
+ "level": "error",
31
+ "dataPath": ".products[1].properties[0].value",
32
+ "message": "the property value type is incorrect",
33
+ "params": {"expected": "number"},
34
+ },
35
+ {
36
+ "level": "error",
37
+ "dataPath": ".products[1].properties[1].value",
38
+ "message": "the property value type is incorrect",
39
+ "params": {"expected": "boolean"},
40
+ },
41
+ ]
42
+
43
+
44
+ def test_validate_term_type_valid():
45
+ # no properties should be valid
46
+ assert validate_term_type({}, "products") is True
47
+
48
+ with open(f"{fixtures_folder}/termType/valid.json") as f:
49
+ data = json.load(f)
50
+ assert validate_term_type(data, "products") is True
51
+
52
+
53
+ def test_validate_term_type_invalid():
54
+ with open(f"{fixtures_folder}/termType/invalid.json") as f:
55
+ data = json.load(f)
56
+ assert validate_term_type(data, "products") == {
57
+ "level": "error",
58
+ "dataPath": ".products[0].properties[0].term.termType",
59
+ "message": "can not be used on this termType",
60
+ "params": {"current": "crop", "expected": ["liveAnimal", "liveAquaticSpecies"]},
61
+ }
62
+
63
+
64
+ def test_validate_default_value_valid():
65
+ with open(f"{fixtures_folder}/default-value/valid.json") as f:
66
+ node = json.load(f)
67
+ assert validate_default_value(node, "inputs") is True
68
+
69
+ with open(f"{fixtures_folder}/default-value/valid-allowed-exception.json") as f:
70
+ node = json.load(f)
71
+ assert validate_default_value(node, "inputs") is True
72
+
73
+
74
+ def test_validate_default_value_warning():
75
+ with open(f"{fixtures_folder}/default-value/warning.json") as f:
76
+ node = json.load(f)
77
+ assert validate_default_value(node, "inputs") == {
78
+ "level": "warning",
79
+ "dataPath": ".inputs[0].properties[0].value",
80
+ "message": "should be within percentage of default value",
81
+ "params": {
82
+ "current": 67.0,
83
+ "default": 52.87673036,
84
+ "percentage": 26.71,
85
+ "threshold": 0.25,
86
+ },
87
+ }
88
+
89
+
90
+ def test_validate_volatileSolidsContent_valid():
91
+ with open(f"{fixtures_folder}/volatileSolidsContent/valid.json") as f:
92
+ node = json.load(f)
93
+ assert validate_volatileSolidsContent(node, "inputs") is True
94
+
95
+
96
+ def test_validate_volatileSolidsContent_error():
97
+ with open(f"{fixtures_folder}/volatileSolidsContent/invalid.json") as f:
98
+ node = json.load(f)
99
+ assert validate_volatileSolidsContent(node, "inputs") == [
100
+ {
101
+ "level": "error",
102
+ "dataPath": ".inputs[0].properties[0].value",
103
+ "message": "must be between 0 and 100",
104
+ },
105
+ {
106
+ "level": "error",
107
+ "dataPath": ".inputs[1].properties[0].value",
108
+ "message": "must be above 0",
109
+ },
110
+ {
111
+ "level": "error",
112
+ "dataPath": ".inputs[2].properties[0].value",
113
+ "message": "must be 100",
114
+ },
115
+ ]
116
+
117
+
118
+ def test_validate_value_min_max_valid():
119
+ with open(f"{fixtures_folder}/value-min-max/valid.json") as f:
120
+ node = json.load(f)
121
+ assert validate_value_min_max(node, "inputs") is True
122
+
123
+ with open(f"{fixtures_folder}/value-min-max/valid-skip-maximum.json") as f:
124
+ node = json.load(f)
125
+ assert validate_value_min_max(node, "inputs") is True
126
+
127
+
128
+ def test_validate_value_min_max_invalid():
129
+ with open(f"{fixtures_folder}/value-min-max/invalid.json") as f:
130
+ node = json.load(f)
131
+ assert validate_value_min_max(node, "inputs") == [
132
+ {
133
+ "level": "error",
134
+ "dataPath": ".inputs[0].properties[0].value",
135
+ "message": "must be between min and max",
136
+ "params": {"min": 20, "max": 80},
137
+ },
138
+ {
139
+ "level": "error",
140
+ "dataPath": ".inputs[1].properties[0].value",
141
+ "message": "should be below 100.0",
142
+ },
143
+ ]