@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,170 @@
1
+ import json
2
+
3
+ from tests.utils import fixtures_path
4
+ from hestia_earth.validation.validators.emission import (
5
+ validate_linked_terms,
6
+ validate_method_not_relevant,
7
+ validate_methodTier_not_relevant,
8
+ validate_methodTier_background,
9
+ )
10
+
11
+
12
+ def test_validate_linked_terms_valid():
13
+ # no emissions should be valid
14
+ assert validate_linked_terms({}, "emissions", "inputs", "inputs") is True
15
+
16
+ with open(f"{fixtures_path}/emission/linked-terms/inputs/valid.json") as f:
17
+ data = json.load(f)
18
+ assert validate_linked_terms(data, "emissions", "inputs", "inputs") is True
19
+
20
+ with open(f"{fixtures_path}/emission/linked-terms/transformation/valid.json") as f:
21
+ data = json.load(f)
22
+ assert (
23
+ validate_linked_terms(data, "emissions", "transformation", "transformations")
24
+ is True
25
+ )
26
+
27
+
28
+ def test_validate_linked_terms_invalid():
29
+ with open(f"{fixtures_path}/emission/linked-terms/inputs/invalid.json") as f:
30
+ data = json.load(f)
31
+ assert validate_linked_terms(data, "emissions", "inputs", "inputs", True) == {
32
+ "level": "warning",
33
+ "dataPath": ".emissions[1]",
34
+ "message": "should add the linked inputs to the cycle",
35
+ "params": {
36
+ "term": {
37
+ "@type": "Term",
38
+ "@id": "ch4ToAirEntericFermentation",
39
+ "termType": "emission",
40
+ },
41
+ "expected": [
42
+ {"@id": "seed", "@type": "Term", "name": "Seed", "termType": "seed"}
43
+ ],
44
+ },
45
+ }
46
+
47
+ with open(f"{fixtures_path}/emission/linked-terms/transformation/error.json") as f:
48
+ data = json.load(f)
49
+ assert validate_linked_terms(
50
+ data, "emissions", "transformation", "transformations"
51
+ ) == {
52
+ "level": "error",
53
+ "dataPath": ".emissions[1]",
54
+ "message": "must add the linked transformations to the cycle",
55
+ "params": {
56
+ "term": {
57
+ "@type": "Term",
58
+ "@id": "ch4ToAirEntericFermentation",
59
+ "termType": "emission",
60
+ },
61
+ "expected": {
62
+ "@id": "compostingInVessel",
63
+ "@type": "Term",
64
+ "name": "Composting - In Vessel",
65
+ "termType": "excretaManagement",
66
+ },
67
+ },
68
+ }
69
+
70
+ with open(
71
+ f"{fixtures_path}/emission/linked-terms/transformation/warning.json"
72
+ ) as f:
73
+ data = json.load(f)
74
+ assert validate_linked_terms(
75
+ data, "emissions", "transformation", "transformations"
76
+ ) == {
77
+ "level": "error",
78
+ "dataPath": ".emissions[1]",
79
+ "message": "must add the linked transformations to the cycle",
80
+ "params": {
81
+ "term": {
82
+ "@type": "Term",
83
+ "@id": "ch4ToAirEntericFermentation",
84
+ "termType": "emission",
85
+ },
86
+ "expected": {
87
+ "@id": "compostingInVessel",
88
+ "@type": "Term",
89
+ "name": "Composting - In Vessel",
90
+ "termType": "excretaManagement",
91
+ },
92
+ },
93
+ }
94
+
95
+
96
+ def test_validate_method_not_relevant_valid():
97
+ # no emissions should be valid
98
+ assert validate_method_not_relevant({}, "emissions") is True
99
+
100
+ with open(f"{fixtures_path}/emission/not-relevant/valid.json") as f:
101
+ data = json.load(f)
102
+ assert validate_method_not_relevant(data, "emissions") is True
103
+
104
+
105
+ def test_validate_method_not_relevant_invalid():
106
+ with open(f"{fixtures_path}/emission/not-relevant/invalid.json") as f:
107
+ data = json.load(f)
108
+ assert validate_method_not_relevant(data, "emissions") == {
109
+ "level": "warning",
110
+ "dataPath": ".emissions[1].methodModel.@id",
111
+ "message": "should not use not relevant model",
112
+ "params": {
113
+ "term": {
114
+ "@type": "Term",
115
+ "@id": "ch4ToAirEntericFermentation",
116
+ "termType": "emission",
117
+ },
118
+ "model": {
119
+ "@type": "Term",
120
+ "@id": "emissionNotRelevant",
121
+ "termType": "model",
122
+ },
123
+ },
124
+ }
125
+
126
+
127
+ def test_validate_methodTier_not_relevant_valid():
128
+ # no emissions should be valid
129
+ assert validate_methodTier_not_relevant({}, "emissions") is True
130
+
131
+ with open(f"{fixtures_path}/emission/not-relevant-methodTier/valid.json") as f:
132
+ data = json.load(f)
133
+ assert validate_methodTier_not_relevant(data, "emissions") is True
134
+
135
+
136
+ def test_validate_methodTier_not_relevant_invalid():
137
+ with open(f"{fixtures_path}/emission/not-relevant-methodTier/invalid.json") as f:
138
+ data = json.load(f)
139
+ assert validate_methodTier_not_relevant(data, "emissions") == {
140
+ "level": "warning",
141
+ "dataPath": ".emissions[1].methodTier",
142
+ "message": "should not use not relevant methodTier",
143
+ "params": {
144
+ "term": {
145
+ "@type": "Term",
146
+ "@id": "ch4ToAirEntericFermentation",
147
+ "termType": "emission",
148
+ }
149
+ },
150
+ }
151
+
152
+
153
+ def test_validate_methodTier_background_valid():
154
+ # no emissions should be valid
155
+ assert validate_methodTier_background({}, "emissions") is True
156
+
157
+ with open(f"{fixtures_path}/emission/methodTier-background/valid.json") as f:
158
+ data = json.load(f)
159
+ assert validate_methodTier_background(data, "emissions") is True
160
+
161
+
162
+ def test_validate_methodTier_background_invalid():
163
+ with open(f"{fixtures_path}/emission/methodTier-background/invalid.json") as f:
164
+ data = json.load(f)
165
+ assert validate_methodTier_background(data, "emissions") == {
166
+ "level": "error",
167
+ "dataPath": ".emissions[0].methodTier",
168
+ "message": "should be equal to one of the allowed values",
169
+ "params": {"allowedValues": ["measured", "tier 1", "tier 2", "tier 3"]},
170
+ }
@@ -0,0 +1,80 @@
1
+ from unittest.mock import patch
2
+ import os
3
+ import json
4
+
5
+ from tests.utils import fixtures_path, fake_get_terms
6
+ from hestia_earth.validation.validators.impact_assessment import (
7
+ validate_impact_assessment,
8
+ validate_empty,
9
+ validate_linked_cycle_product,
10
+ validate_linked_cycle_endDate,
11
+ )
12
+
13
+ fixtures_folder = os.path.join(fixtures_path, "impactAssessment")
14
+
15
+
16
+ @patch(
17
+ "hestia_earth.validation.validators.indicator.get_terms",
18
+ return_value=fake_get_terms,
19
+ )
20
+ def test_validate_impact_assessment_valid(*args):
21
+ with open(f"{fixtures_folder}/valid.json") as f:
22
+ node = json.load(f)
23
+ results = validate_impact_assessment(node)
24
+ assert all([r is True for r in results])
25
+
26
+
27
+ def test_validate_empty_valid():
28
+ # with a cycle => valid
29
+ assert validate_empty({"cycle": {"id": "test"}}) is True
30
+ # with emissionsResourceUse => valid
31
+ assert validate_empty({"emissionsResourceUse": [{}]}) is True
32
+ # with impacts => valid
33
+ assert validate_empty({"impacts": [{}]}) is True
34
+ # with endpoints => valid
35
+ assert validate_empty({"endpoints": [{}]}) is True
36
+
37
+
38
+ def test_validate_empty_invalid():
39
+ assert validate_empty({}) == {
40
+ "level": "error",
41
+ "dataPath": "",
42
+ "message": "should not be empty",
43
+ "params": {"type": "ImpactAssessment"},
44
+ }
45
+
46
+
47
+ def test_validate_linked_cycle_product_valid():
48
+ with open(f"{fixtures_folder}/cycle-contains-product/valid.json") as f:
49
+ data = json.load(f)
50
+ assert validate_linked_cycle_product(data, data.get("cycle")) is True
51
+
52
+
53
+ def test_validate_linked_cycle_product_invalid():
54
+ with open(f"{fixtures_folder}/cycle-contains-product/invalid.json") as f:
55
+ data = json.load(f)
56
+ assert validate_linked_cycle_product(data, data.get("cycle")) == {
57
+ "level": "error",
58
+ "dataPath": ".product",
59
+ "message": "should be included in the cycle products",
60
+ "params": {
61
+ "product": {"@type": "Term", "@id": "maizeGrain"},
62
+ "node": {"type": "Cycle", "id": "fake-cycle"},
63
+ },
64
+ }
65
+
66
+
67
+ def test_validate_linked_cycle_endDate_valid():
68
+ with open(f"{fixtures_folder}/cycle-endDate/valid.json") as f:
69
+ data = json.load(f)
70
+ assert validate_linked_cycle_endDate(data, data.get("cycle")) is True
71
+
72
+
73
+ def test_validate_linked_cycle_endDate_invalid():
74
+ with open(f"{fixtures_folder}/cycle-endDate/invalid.json") as f:
75
+ data = json.load(f)
76
+ assert validate_linked_cycle_endDate(data, data.get("cycle")) == {
77
+ "level": "error",
78
+ "dataPath": ".endDate",
79
+ "message": "must be equal to the Cycle endDate",
80
+ }
@@ -0,0 +1,120 @@
1
+ import os
2
+ import json
3
+ from unittest.mock import patch
4
+
5
+ from tests.utils import MODEL_TERM_IDS, fixtures_path, fake_get_terms
6
+ from hestia_earth.validation.validators.indicator import (
7
+ validate_characterisedIndicator_model,
8
+ validate_landTransformation,
9
+ validate_inonising_compounds_waste,
10
+ )
11
+
12
+ class_path = "hestia_earth.validation.validators.indicator"
13
+ fixtures_folder = os.path.join(fixtures_path, "indicator")
14
+
15
+
16
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
17
+ def test_validate_characterisedIndicator_model_valid(*args):
18
+ # no infrastructure should be valid
19
+ assert validate_characterisedIndicator_model({}, "impacts") is True
20
+
21
+ with open(f"{fixtures_folder}/characterisedIndicator-methodModel/valid.json") as f:
22
+ data = json.load(f)
23
+ assert validate_characterisedIndicator_model(data, "impacts") is True
24
+
25
+
26
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
27
+ def test_validate_characterisedIndicator_model_invalid(*args):
28
+ with open(
29
+ f"{fixtures_folder}/characterisedIndicator-methodModel/invalid.json"
30
+ ) as f:
31
+ data = json.load(f)
32
+ assert validate_characterisedIndicator_model(data, "impacts") == {
33
+ "level": "error",
34
+ "dataPath": ".impacts[0].methodModel.@id",
35
+ "message": "is not allowed for this characterisedIndicator",
36
+ "params": {
37
+ "term": {"@type": "Term", "@id": "gwp20"},
38
+ "model": {"@type": "Term", "@id": "ipcc2013"},
39
+ "allowedValues": MODEL_TERM_IDS,
40
+ },
41
+ }
42
+
43
+
44
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
45
+ def test_validate_landTransformation_valid(*args):
46
+ # no infrastructure should be valid
47
+ assert validate_landTransformation({}) is True
48
+
49
+ with open(f"{fixtures_folder}/landTransformation/valid.json") as f:
50
+ data = json.load(f)
51
+ assert (
52
+ validate_landTransformation(
53
+ {"emissionsResourceUse": data["nodes"]}, "emissionsResourceUse"
54
+ )
55
+ is True
56
+ )
57
+
58
+ with open(f"{fixtures_folder}/landTransformation/valid-grouped.json") as f:
59
+ data = json.load(f)
60
+ assert validate_landTransformation(data, "emissionsResourceUse") is True
61
+
62
+
63
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
64
+ def test_validate_landTransformation_invalid(*args):
65
+ with open(f"{fixtures_folder}/landTransformation/invalid.json") as f:
66
+ data = json.load(f)
67
+ assert validate_landTransformation(
68
+ {"emissionsResourceUse": data["nodes"]}, "emissionsResourceUse"
69
+ ) == {
70
+ "level": "error",
71
+ "dataPath": ".emissionsResourceUse[1].value",
72
+ "message": "must be less than or equal to land occupation",
73
+ "params": {"current": 0.2, "max": 0.1},
74
+ }
75
+
76
+ with open(f"{fixtures_folder}/landTransformation/invalid-grouped.json") as f:
77
+ data = json.load(f)
78
+ assert validate_landTransformation(data, "emissionsResourceUse") == [
79
+ {
80
+ "level": "error",
81
+ "dataPath": ".emissionsResourceUse[3].value",
82
+ "message": "must be less than or equal to land occupation",
83
+ "params": {"current": 0.1, "max": 0.01},
84
+ },
85
+ {
86
+ "level": "error",
87
+ "dataPath": ".emissionsResourceUse[6].value",
88
+ "message": "must be less than or equal to land occupation",
89
+ "params": {"current": 2, "max": 1},
90
+ },
91
+ ]
92
+
93
+
94
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
95
+ def test_validate_inonising_compounds_waste_valid(*args):
96
+ # no infrastructure should be valid
97
+ assert validate_inonising_compounds_waste({}) is True
98
+
99
+ with open(f"{fixtures_folder}/ionisingCompounds/valid.json") as f:
100
+ data = json.load(f)
101
+ assert (
102
+ validate_inonising_compounds_waste(
103
+ {"emissionsResourceUse": data["nodes"]}, "emissionsResourceUse"
104
+ )
105
+ is True
106
+ )
107
+
108
+
109
+ @patch(f"{class_path}.get_terms", side_effect=fake_get_terms)
110
+ def test_validate_inonising_compounds_waste_invalid(*args):
111
+ with open(f"{fixtures_folder}/ionisingCompounds/invalid.json") as f:
112
+ data = json.load(f)
113
+ assert validate_inonising_compounds_waste(
114
+ {"emissionsResourceUse": data["nodes"]}, "emissionsResourceUse"
115
+ ) == {
116
+ "level": "error",
117
+ "dataPath": ".emissionsResourceUse[0].key.termType",
118
+ "message": "should be equal to one of the allowed values",
119
+ "params": {"allowedValues": ["waste"]},
120
+ }
@@ -0,0 +1,26 @@
1
+ import json
2
+
3
+ from tests.utils import fixtures_path
4
+ from hestia_earth.validation.validators.infrastructure import validate_lifespan
5
+
6
+
7
+ def test_validate_lifespan_valid():
8
+ # no infrastructure should be valid
9
+ assert validate_lifespan([]) is True
10
+
11
+ with open(f"{fixtures_path}/infrastructure/lifespan/valid.json") as f:
12
+ data = json.load(f)
13
+ assert validate_lifespan(data.get("nodes")) is True
14
+
15
+
16
+ def test_validate_lifespan_invalid():
17
+ with open(f"{fixtures_path}/infrastructure/lifespan/invalid.json") as f:
18
+ data = json.load(f)
19
+ assert validate_lifespan(data.get("nodes")) == {
20
+ "level": "error",
21
+ "dataPath": ".infrastructure[1].defaultLifespan",
22
+ "message": "must equal to endDate - startDate in decimal years",
23
+ "params": {
24
+ "expected": 2.6,
25
+ },
26
+ }