@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,151 @@
1
+ from unittest.mock import patch
2
+ import os
3
+ import json
4
+ from hestia_earth.schema import SiteSiteType
5
+
6
+ from tests.utils import fixtures_path
7
+ from hestia_earth.validation.utils import _group_nodes
8
+ from hestia_earth.validation.validators.site import (
9
+ validate_site,
10
+ validate_site_dates,
11
+ validate_site_coordinates,
12
+ validate_siteType,
13
+ validate_cycle_dates,
14
+ validate_cycles_linked_ia,
15
+ )
16
+
17
+ fixtures_folder = os.path.join(fixtures_path, "site")
18
+ class_path = "hestia_earth.validation.validators.site"
19
+
20
+
21
+ @patch(f"{class_path}.validate_boundary_area", return_value=True)
22
+ @patch(f"{class_path}.validate_region_size", return_value=True)
23
+ @patch(f"{class_path}.validate_coordinates", return_value=True)
24
+ def test_validate_site_valid(*args):
25
+ with open(f"{fixtures_folder}/valid.json") as f:
26
+ node = json.load(f)
27
+ results = validate_site(node)
28
+ assert all([r is True for r in results])
29
+
30
+
31
+ def test_validate_site_dates_valid():
32
+ site = {"startDate": "2020-01-01", "endDate": "2020-01-02"}
33
+ assert validate_site_dates(site) is True
34
+
35
+
36
+ def test_validate_site_dates_invalid():
37
+ site = {"startDate": "2020-01-02", "endDate": "2020-01-01"}
38
+ assert validate_site_dates(site) == {
39
+ "level": "error",
40
+ "dataPath": ".endDate",
41
+ "message": "must be greater than startDate",
42
+ }
43
+
44
+
45
+ @patch(f"{class_path}.need_validate_coordinates", return_value=True)
46
+ def test_validate_site_coordinates(*args):
47
+ site = {"siteType": SiteSiteType.CROPLAND.value}
48
+ assert validate_site_coordinates(site)
49
+
50
+ site["siteType"] = SiteSiteType.SEA_OR_OCEAN.value
51
+ assert not validate_site_coordinates(site)
52
+
53
+
54
+ @patch(f"{class_path}.get_cached_data", return_value=25)
55
+ def test_validate_siteType_valid(*args):
56
+ site = {
57
+ "siteType": SiteSiteType.FOREST.value,
58
+ "latitude": 44.18753,
59
+ "longitude": -0.62521,
60
+ }
61
+ assert validate_siteType(site) is True
62
+
63
+ site = {
64
+ "siteType": SiteSiteType.CROPLAND.value,
65
+ "latitude": 44.5096,
66
+ "longitude": 0.40749,
67
+ }
68
+ assert validate_siteType(site) is True
69
+
70
+
71
+ @patch(f"{class_path}.get_cached_data", return_value=30)
72
+ def test_validate_siteType_invalid(*args):
73
+ site = {
74
+ "siteType": SiteSiteType.CROPLAND.value,
75
+ "latitude": 44.18753,
76
+ "longitude": -0.62521,
77
+ }
78
+ assert validate_siteType(site) == {
79
+ "level": "warning",
80
+ "dataPath": ".siteType",
81
+ "message": "The coordinates you have provided are not in a known cropland "
82
+ "area according to the MODIS Land Cover classification (MCD12Q1.006, LCCS2, bands 25, 35, 36).",
83
+ }
84
+
85
+ site = {
86
+ "siteType": SiteSiteType.FOREST.value,
87
+ "latitude": 44.5096,
88
+ "longitude": 0.40749,
89
+ }
90
+ assert validate_siteType(site) == {
91
+ "level": "warning",
92
+ "dataPath": ".siteType",
93
+ "message": "The coordinates you have provided are not in a known forest "
94
+ "area according to the MODIS Land Cover classification (MCD12Q1.006, LCCS2, bands 10, 20, 25).",
95
+ }
96
+
97
+
98
+ def test_validate_cycle_dates_valid():
99
+ cycles = [{"endDate": "2020"}, {"endDate": "2021"}]
100
+ assert validate_cycle_dates(cycles) is True
101
+
102
+ cycles = [
103
+ {"startDate": "2020-01-01", "endDate": "2020-06-30"},
104
+ {"startDate": "2020-07-01", "endDate": "2020-12-31"},
105
+ ]
106
+ assert validate_cycle_dates(cycles) is True
107
+
108
+
109
+ def test_validate_cycle_dates_invalid():
110
+ cycles = [
111
+ {"id": "cycle1", "endDate": "2020"},
112
+ {"id": "cycle2", "endDate": "2020"},
113
+ {"id": "cycle3", "endDate": "2021"},
114
+ ]
115
+ assert validate_cycle_dates(cycles) == {
116
+ "level": "error",
117
+ "dataPath": "",
118
+ "message": "multiple cycles on the same site cannot overlap",
119
+ "params": {"ids": ["cycle1", "cycle2"]},
120
+ }
121
+
122
+ cycles = [
123
+ {"id": "cycle1", "startDate": "2020-01-01", "endDate": "2020-07-02"},
124
+ {"id": "cycle2", "startDate": "2020-07-01", "endDate": "2020-12-31"},
125
+ {"id": "cycle3", "startDate": "2021-01-01", "endDate": "2021-12-31"},
126
+ ]
127
+ assert validate_cycle_dates(cycles) == {
128
+ "level": "error",
129
+ "dataPath": "",
130
+ "message": "multiple cycles on the same site cannot overlap",
131
+ "params": {"ids": ["cycle1", "cycle2"]},
132
+ }
133
+
134
+
135
+ def test_validate_cycles_linked_ia_valid():
136
+ with open(f"{fixtures_folder}/cycles-linked-ia/valid.json") as f:
137
+ nodes = json.load(f).get("nodes")
138
+ cycles = [c for c in nodes if c.get("type") == "Cycle"]
139
+ assert validate_cycles_linked_ia(cycles, _group_nodes(nodes)) is True
140
+
141
+
142
+ def test_validate_cycles_linked_ia_invalid():
143
+ with open(f"{fixtures_folder}/cycles-linked-ia/invalid.json") as f:
144
+ nodes = json.load(f).get("nodes")
145
+ cycles = [c for c in nodes if c.get("type") == "Cycle"]
146
+ assert validate_cycles_linked_ia(cycles, _group_nodes(nodes)) == {
147
+ "level": "error",
148
+ "dataPath": "",
149
+ "message": "cycles linked together cannot be added to the same site",
150
+ "params": {"ids": ["2"]},
151
+ }
@@ -0,0 +1,15 @@
1
+ import os
2
+ import json
3
+
4
+ from tests.utils import fixtures_path
5
+ from hestia_earth.validation.validators.source import validate_source
6
+
7
+ fixtures_folder = os.path.join(fixtures_path, "source")
8
+ class_path = "hestia_earth.validation.validators.source"
9
+
10
+
11
+ def test_validate_valid():
12
+ with open(f"{fixtures_path}/source/valid.json") as f:
13
+ node = json.load(f)
14
+ results = validate_source(node)
15
+ assert all([r is True for r in results])
@@ -0,0 +1,151 @@
1
+ import json
2
+ from unittest.mock import patch
3
+
4
+ from tests.utils import fixtures_path
5
+ from hestia_earth.validation.validators.transformation import (
6
+ validate_previous_transformation,
7
+ validate_transformation_excretaManagement,
8
+ validate_linked_emission,
9
+ validate_excreta_inputs_products,
10
+ )
11
+
12
+ class_path = "hestia_earth.validation.validators.transformation"
13
+ fixtures_folder = f"{fixtures_path}/transformation"
14
+
15
+
16
+ def test_validate_previous_transformation_valid():
17
+ # no transformations should be valid
18
+ assert validate_previous_transformation({}, "transformations") is True
19
+
20
+ with open(f"{fixtures_folder}/previousTransformationId/valid.json") as f:
21
+ cycle = json.load(f)
22
+ assert validate_previous_transformation(cycle) is True
23
+
24
+
25
+ def test_validate_previous_transformation_invalid():
26
+ with open(
27
+ f"{fixtures_folder}/previousTransformationId/invalid-wrong-order.json"
28
+ ) as f:
29
+ cycle = json.load(f)
30
+ assert validate_previous_transformation(cycle) == {
31
+ "level": "error",
32
+ "dataPath": ".transformations[1].previousTransformationId",
33
+ "message": "must point to a previous transformation in the list",
34
+ }
35
+
36
+ with open(
37
+ f"{fixtures_folder}/previousTransformationId/invalid-no-previous.json"
38
+ ) as f:
39
+ cycle = json.load(f)
40
+ assert validate_previous_transformation(cycle) == {
41
+ "level": "error",
42
+ "dataPath": ".transformations[1].previousTransformationId",
43
+ "message": "must point to a previous transformation in the list",
44
+ }
45
+
46
+ with open(
47
+ f"{fixtures_folder}/previousTransformationId/invalid-product-input.json"
48
+ ) as f:
49
+ cycle = json.load(f)
50
+ assert validate_previous_transformation(cycle) == {
51
+ "level": "error",
52
+ "dataPath": ".transformations[1].inputs[0].value",
53
+ "message": "must be equal to previous product multiplied by the share",
54
+ }
55
+
56
+ with open(
57
+ f"{fixtures_folder}/previousTransformationId/invalid-previous-input.json"
58
+ ) as f:
59
+ cycle = json.load(f)
60
+ assert validate_previous_transformation(cycle) == [
61
+ {
62
+ "level": "error",
63
+ "dataPath": ".transformations[0]",
64
+ "message": "at least one Input must be a Product of the Cycle",
65
+ },
66
+ {
67
+ "level": "error",
68
+ "dataPath": ".transformations[1]",
69
+ "message": "at least one Input must be a Product of the previous Transformation",
70
+ },
71
+ ]
72
+
73
+
74
+ def test_validate_transformation_excretaManagement_valid():
75
+ # no transformations should be valid
76
+ assert validate_transformation_excretaManagement({}, "transformations")
77
+
78
+ with open(f"{fixtures_folder}/excretaManagement/valid.json") as f:
79
+ cycle = json.load(f)
80
+ assert validate_transformation_excretaManagement(cycle) is True
81
+
82
+
83
+ def test_validate_transformation_excretaManagement_invalid():
84
+ with open(f"{fixtures_folder}/excretaManagement/invalid.json") as f:
85
+ cycle = json.load(f)
86
+ assert validate_transformation_excretaManagement(cycle) == {
87
+ "level": "error",
88
+ "dataPath": ".transformations[0].practices",
89
+ "message": "an excreta input is required when using an excretaManagement practice",
90
+ }
91
+
92
+
93
+ def test_validate_linked_emission_valid():
94
+ # no emissions should be valid
95
+ assert validate_linked_emission({}, "transformations") is True
96
+
97
+ with open(f"{fixtures_folder}/linked-emission/valid.json") as f:
98
+ data = json.load(f)
99
+ assert validate_linked_emission(data, "transformations") is True
100
+
101
+
102
+ def test_validate_linked_emission_invalid():
103
+ with open(f"{fixtures_folder}/linked-emission/invalid.json") as f:
104
+ data = json.load(f)
105
+ assert validate_linked_emission(data, "transformations") == {
106
+ "level": "warning",
107
+ "dataPath": ".transformations[0].emissions[0]",
108
+ "message": "should be linked to an emission in the Cycle",
109
+ "params": {
110
+ "term": {
111
+ "@type": "Term",
112
+ "@id": "ch4ToAirEntericFermentation",
113
+ "termType": "emission",
114
+ }
115
+ },
116
+ }
117
+
118
+
119
+ def test_validate_excreta_inputs_products_valid():
120
+ # no transformations should be valid
121
+ assert validate_excreta_inputs_products([]) is True
122
+
123
+ with open(f"{fixtures_folder}/inputs-products/valid.json") as f:
124
+ data = json.load(f)
125
+ assert validate_excreta_inputs_products(data) is True
126
+
127
+
128
+ def fake_download_excreta(term_id: str, *args):
129
+ return {
130
+ "processedExcretaKgVs": {},
131
+ "excretaBeefCattleExceptFeedlotFedKgMass": {"subClassOf": [{}]},
132
+ }[term_id]
133
+
134
+
135
+ @patch(f"{class_path}.download_hestia", side_effect=fake_download_excreta)
136
+ def test_validate_excreta_inputs_products_invalid(*args):
137
+ with open(f"{fixtures_folder}/inputs-products/invalid.json") as f:
138
+ data = json.load(f)
139
+ assert validate_excreta_inputs_products(data) == {
140
+ "level": "error",
141
+ "dataPath": ".transformations[0].products[1]",
142
+ "message": "must be included as an Input",
143
+ "params": {
144
+ "term": {
145
+ "@type": "Term",
146
+ "@id": "excretaBeefCattleExceptFeedlotFedKgMass",
147
+ "termType": "excreta",
148
+ },
149
+ "expected": ["excretaDairyCattle"],
150
+ },
151
+ }
@@ -0,0 +1,74 @@
1
+ from unittest.mock import patch
2
+ import json
3
+ from hestia_earth.schema import NodeType
4
+
5
+ from tests.utils import fixtures_path
6
+ from hestia_earth.validation.validators import validate_node, _should_run
7
+
8
+ class_path = "hestia_earth.validation.validators"
9
+
10
+
11
+ def test_should_run():
12
+ ntype = NodeType.CYCLE.value
13
+ node = {"@type": ntype, "@id": "cycle"}
14
+ assert not _should_run(ntype, node)
15
+
16
+ node = {"@type": ntype, "@id": "cycle", "name": "Cycle 1"}
17
+ assert not _should_run(ntype, node)
18
+
19
+ node = {"@type": ntype, "@id": "cycle", "name": "Cycle 1", "endDate": "2020-01-01"}
20
+ assert _should_run(ntype, node) is True
21
+
22
+
23
+ @patch(f"{class_path}.validate_site")
24
+ def test_validate_node_type_validation(mock_validate_site):
25
+ node = {
26
+ "type": NodeType.SITE.value,
27
+ "id": "id",
28
+ "siteType": "cropland",
29
+ "country": {"@id": "GADM-GBR"},
30
+ }
31
+ validate_node()(node)
32
+ mock_validate_site.assert_called_once()
33
+
34
+ # no validation on existing nodes
35
+ mock_validate_site.reset_mock()
36
+ node = {"@type": NodeType.SITE.value}
37
+ validate_node()(node)
38
+ mock_validate_site.assert_not_called()
39
+
40
+
41
+ def test_validate_node_no_validation():
42
+ # no validation on uploaded Actor
43
+ node = {"type": NodeType.ACTOR.value}
44
+ assert validate_node([])(node) == []
45
+
46
+
47
+ @patch(f"{class_path}.validate_cycle")
48
+ @patch(f"{class_path}.validate_impact_assessment")
49
+ @patch(f"{class_path}.validate_site")
50
+ def test_validate_nested(
51
+ mock_validate_site, mock_validate_impact_assessment, mock_validate_cycle
52
+ ):
53
+ with open(f"{fixtures_path}/impactAssessment/valid.json") as f:
54
+ node = json.load(f)
55
+ assert validate_node()(node) == []
56
+ assert mock_validate_cycle.call_count == 1
57
+ assert mock_validate_impact_assessment.call_count == 1
58
+ assert mock_validate_site.call_count == 2
59
+
60
+
61
+ @patch(f"{class_path}.validate_cycle")
62
+ @patch(f"{class_path}.validate_impact_assessment")
63
+ @patch(f"{class_path}.validate_site")
64
+ def test_validate_nested_aggregated(
65
+ mock_validate_site, mock_validate_impact_assessment, mock_validate_cycle
66
+ ):
67
+ with open(f"{fixtures_path}/impactAssessment/valid.json") as f:
68
+ node = json.load(f)
69
+
70
+ node["aggregated"] = True
71
+ assert validate_node()(node) == []
72
+ assert mock_validate_cycle.call_count == 0
73
+ assert mock_validate_impact_assessment.call_count == 1
74
+ assert mock_validate_site.call_count == 0
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "sourceMap": false
6
+ },
7
+ "include": ["./src/index.ts"],
8
+ "exclude": ["./src/**/*.spec.ts"]
9
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "module": "commonjs",
5
+ "stripInternal": true,
6
+ "emitDecoratorMetadata": true,
7
+ "experimentalDecorators": true,
8
+ "removeComments": false,
9
+ "noImplicitAny": false,
10
+ "skipLibCheck": true,
11
+ "lib": ["es2019"],
12
+ "baseUrl": ".",
13
+ "rootDir": "./src",
14
+ "outDir": "./dist",
15
+ "sourceMap": true,
16
+ "declaration": true,
17
+ "downlevelIteration": true,
18
+ "resolveJsonModule": true
19
+ },
20
+ "include": ["src/**/*.ts"],
21
+ "exclude": ["node_modules"],
22
+ "atom": {
23
+ "rewriteTsconfig": false
24
+ }
25
+ }