@hestia-earth/data-validation 0.37.7 → 0.37.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +17 -0
  3. package/dist/validations.d.ts +10 -0
  4. package/dist/validations.js +10 -0
  5. package/package.json +4 -3
  6. package/search-results.json +1 -1
  7. package/src/version.ts +1 -1
  8. package/validation.json +639 -0
  9. package/.coveragerc +0 -14
  10. package/.dockerignore +0 -19
  11. package/.eslintignore +0 -17
  12. package/.eslintrc.js +0 -11
  13. package/.flake8 +0 -5
  14. package/.gitlab/issue_templates/new validation.md +0 -82
  15. package/.gitlab-ci.yml +0 -216
  16. package/.readthedocs.yml +0 -24
  17. package/CODEOWNERS +0 -11
  18. package/Dockerfile +0 -13
  19. package/MANIFEST.in +0 -2
  20. package/bin/hestia-validate-data +0 -80
  21. package/build_mocking.py +0 -14
  22. package/commitlint.config.js +0 -1
  23. package/docs/Makefile +0 -20
  24. package/docs/_static/styles.css +0 -4
  25. package/docs/_templates/custom-class-template.rst +0 -34
  26. package/docs/_templates/custom-module-template.rst +0 -66
  27. package/docs/_templates/layout.html +0 -4
  28. package/docs/conf.py +0 -74
  29. package/docs/index.rst +0 -42
  30. package/docs/make.bat +0 -35
  31. package/docs/requirements.txt +0 -13
  32. package/envs/.develop.env +0 -1
  33. package/envs/.master.env +0 -1
  34. package/guide-assets/.gitkeep +0 -0
  35. package/hestia_earth/validation/README.md +0 -5
  36. package/hestia_earth/validation/__init__.py +0 -32
  37. package/hestia_earth/validation/distribution.py +0 -22
  38. package/hestia_earth/validation/gee.py +0 -162
  39. package/hestia_earth/validation/log.py +0 -44
  40. package/hestia_earth/validation/models.py +0 -141
  41. package/hestia_earth/validation/preload_requests.py +0 -61
  42. package/hestia_earth/validation/terms.py +0 -88
  43. package/hestia_earth/validation/utils.py +0 -444
  44. package/hestia_earth/validation/validators/__init__.py +0 -141
  45. package/hestia_earth/validation/validators/aggregated_cycle.py +0 -32
  46. package/hestia_earth/validation/validators/aggregated_shared.py +0 -37
  47. package/hestia_earth/validation/validators/animal.py +0 -88
  48. package/hestia_earth/validation/validators/completeness.py +0 -252
  49. package/hestia_earth/validation/validators/cycle.py +0 -1123
  50. package/hestia_earth/validation/validators/distribution.py +0 -86
  51. package/hestia_earth/validation/validators/emission.py +0 -109
  52. package/hestia_earth/validation/validators/impact_assessment.py +0 -138
  53. package/hestia_earth/validation/validators/indicator.py +0 -154
  54. package/hestia_earth/validation/validators/infrastructure.py +0 -25
  55. package/hestia_earth/validation/validators/input.py +0 -268
  56. package/hestia_earth/validation/validators/management.py +0 -131
  57. package/hestia_earth/validation/validators/measurement.py +0 -368
  58. package/hestia_earth/validation/validators/organisation.py +0 -43
  59. package/hestia_earth/validation/validators/practice.py +0 -590
  60. package/hestia_earth/validation/validators/product.py +0 -263
  61. package/hestia_earth/validation/validators/property.py +0 -266
  62. package/hestia_earth/validation/validators/shared.py +0 -940
  63. package/hestia_earth/validation/validators/site.py +0 -312
  64. package/hestia_earth/validation/validators/source.py +0 -20
  65. package/hestia_earth/validation/validators/transformation.py +0 -250
  66. package/hestia_earth/validation/version.py +0 -1
  67. package/layer/build.sh +0 -34
  68. package/layer/deploy.sh +0 -18
  69. package/release.sh +0 -11
  70. package/requirements-ci.txt +0 -6
  71. package/requirements-test.txt +0 -4
  72. package/requirements.txt +0 -2
  73. package/run-docker-test.sh +0 -7
  74. package/run-docker.sh +0 -9
  75. package/run.py +0 -99
  76. package/scripts/build_docs.py +0 -283
  77. package/scripts/build_validation_list.py +0 -160
  78. package/scripts/guide-create-branch.sh +0 -15
  79. package/scripts/update-package-version.js +0 -28
  80. package/setup.py +0 -35
  81. package/tests/Dockerfile +0 -13
  82. package/tests/__init__.py +0 -3
  83. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-no-impactAssessment.json +0 -64
  84. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/invalid-world.json +0 -69
  85. package/tests/fixtures/aggregated/cycle/inputs-impactAssessment/valid.json +0 -69
  86. package/tests/fixtures/animal/duplicated-input-cycle/invalid.json +0 -98
  87. package/tests/fixtures/animal/duplicated-input-cycle/valid.json +0 -91
  88. package/tests/fixtures/animal/pregnancyRateTotal/invalid.json +0 -49
  89. package/tests/fixtures/animal/pregnancyRateTotal/valid.json +0 -60
  90. package/tests/fixtures/animal/required/invalid.json +0 -59
  91. package/tests/fixtures/animal/required/valid.json +0 -72
  92. package/tests/fixtures/completeness/all-values/warning.json +0 -22
  93. package/tests/fixtures/completeness/animalPopulation/invalid.json +0 -58
  94. package/tests/fixtures/completeness/animalPopulation/valid-animals.json +0 -71
  95. package/tests/fixtures/completeness/animalPopulation/valid-incomplete.json +0 -58
  96. package/tests/fixtures/completeness/animalPopulation/valid-no-liveAnimals.json +0 -37
  97. package/tests/fixtures/completeness/blank-nodes/agri-food processor-invalid.json +0 -52
  98. package/tests/fixtures/completeness/blank-nodes/invalid.json +0 -124
  99. package/tests/fixtures/completeness/blank-nodes/valid.json +0 -128
  100. package/tests/fixtures/completeness/cropland/site.json +0 -16
  101. package/tests/fixtures/completeness/cropland/valid.json +0 -22
  102. package/tests/fixtures/completeness/cropland/warning.json +0 -22
  103. package/tests/fixtures/completeness/freshForage/error-animals.json +0 -63
  104. package/tests/fixtures/completeness/freshForage/error-products.json +0 -65
  105. package/tests/fixtures/completeness/freshForage/valid-animal-inputs.json +0 -63
  106. package/tests/fixtures/completeness/freshForage/valid-animals.json +0 -63
  107. package/tests/fixtures/completeness/freshForage/valid-not-grazing-liveAnimal.json +0 -55
  108. package/tests/fixtures/completeness/freshForage/valid-not-liveAnimal.json +0 -47
  109. package/tests/fixtures/completeness/freshForage/valid-products.json +0 -68
  110. package/tests/fixtures/completeness/ingredient/invalid-agri-food-processor.json +0 -37
  111. package/tests/fixtures/completeness/ingredient/invalid.json +0 -49
  112. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-complete.json +0 -49
  113. package/tests/fixtures/completeness/ingredient/valid-agri-food-processor-incomplete.json +0 -37
  114. package/tests/fixtures/completeness/ingredient/valid.json +0 -49
  115. package/tests/fixtures/completeness/material/error.json +0 -49
  116. package/tests/fixtures/completeness/material/valid-fuel-material.json +0 -60
  117. package/tests/fixtures/completeness/material/valid-incomplete.json +0 -36
  118. package/tests/fixtures/completeness/material/valid-no-fuel.json +0 -36
  119. package/tests/fixtures/completeness/valid.json +0 -22
  120. package/tests/fixtures/cycle/aboveGroundCropResidue/invalid.json +0 -76
  121. package/tests/fixtures/cycle/aboveGroundCropResidue/valid.json +0 -76
  122. package/tests/fixtures/cycle/aggregated-valid.json +0 -102
  123. package/tests/fixtures/cycle/coverCrop/invalid.json +0 -64
  124. package/tests/fixtures/cycle/coverCrop/valid-not-coverCrop.json +0 -54
  125. package/tests/fixtures/cycle/coverCrop/valid.json +0 -64
  126. package/tests/fixtures/cycle/cropResidue/complete/invalid.json +0 -56
  127. package/tests/fixtures/cycle/cropResidue/complete/valid.json +0 -82
  128. package/tests/fixtures/cycle/cropResidue/incomplete/invalid.json +0 -42
  129. package/tests/fixtures/cycle/cropResidue/incomplete/valid.json +0 -56
  130. package/tests/fixtures/cycle/dates/invalid-emissions.json +0 -70
  131. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/invalid.json +0 -63
  132. package/tests/fixtures/cycle/liveAnimal-animalProduct-mapping/valid.json +0 -63
  133. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates-year-only.json +0 -48
  134. package/tests/fixtures/cycle/maximumCycleDuration/invalid-dates.json +0 -48
  135. package/tests/fixtures/cycle/maximumCycleDuration/invalid.json +0 -48
  136. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates-year-only.json +0 -48
  137. package/tests/fixtures/cycle/maximumCycleDuration/valid-dates.json +0 -48
  138. package/tests/fixtures/cycle/maximumCycleDuration/valid.json +0 -48
  139. package/tests/fixtures/cycle/otherSites/cycleDuration/invalid.json +0 -52
  140. package/tests/fixtures/cycle/otherSites/cycleDuration/valid-no-siteDuration.json +0 -40
  141. package/tests/fixtures/cycle/otherSites/cycleDuration/valid.json +0 -52
  142. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/invalid.json +0 -56
  143. package/tests/fixtures/cycle/practices/stockingDensityPermanentPastureAverage/valid.json +0 -65
  144. package/tests/fixtures/cycle/primary-product-as-input/invalid.json +0 -59
  145. package/tests/fixtures/cycle/primary-product-as-input/valid.json +0 -48
  146. package/tests/fixtures/cycle/product-linked-ia/cycle.json +0 -66
  147. package/tests/fixtures/cycle/product-linked-ia/invalid-multiple.json +0 -58
  148. package/tests/fixtures/cycle/product-linked-ia/valid.json +0 -57
  149. package/tests/fixtures/cycle/products/animals/invalid.json +0 -69
  150. package/tests/fixtures/cycle/products/animals/valid.json +0 -58
  151. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/invalid.json +0 -53
  152. package/tests/fixtures/cycle/riceGrainInHuskFlooded-minimumCycleDuration/valid.json +0 -53
  153. package/tests/fixtures/cycle/siteDuration/crop/invalid.json +0 -53
  154. package/tests/fixtures/cycle/siteDuration/crop/valid-different-duration.json +0 -53
  155. package/tests/fixtures/cycle/siteDuration/crop/valid-same-duration.json +0 -53
  156. package/tests/fixtures/cycle/siteDuration/invalid.json +0 -41
  157. package/tests/fixtures/cycle/siteDuration/valid-no-siteDuration.json +0 -40
  158. package/tests/fixtures/cycle/siteDuration/valid-otherSites.json +0 -48
  159. package/tests/fixtures/cycle/siteDuration/valid.json +0 -45
  160. package/tests/fixtures/cycle/substrate/required/invalid.json +0 -50
  161. package/tests/fixtures/cycle/substrate/required/valid.json +0 -60
  162. package/tests/fixtures/cycle/valid.json +0 -343
  163. package/tests/fixtures/emission/linked-terms/inputs/invalid.json +0 -78
  164. package/tests/fixtures/emission/linked-terms/inputs/valid.json +0 -106
  165. package/tests/fixtures/emission/linked-terms/transformation/error.json +0 -104
  166. package/tests/fixtures/emission/linked-terms/transformation/valid.json +0 -107
  167. package/tests/fixtures/emission/linked-terms/transformation/warning.json +0 -76
  168. package/tests/fixtures/emission/methodTier-background/invalid.json +0 -60
  169. package/tests/fixtures/emission/methodTier-background/valid.json +0 -60
  170. package/tests/fixtures/emission/not-relevant/invalid.json +0 -71
  171. package/tests/fixtures/emission/not-relevant/valid.json +0 -95
  172. package/tests/fixtures/emission/not-relevant-methodTier/invalid.json +0 -70
  173. package/tests/fixtures/emission/not-relevant-methodTier/valid.json +0 -95
  174. package/tests/fixtures/impactAssessment/aggregated-valid.json +0 -43
  175. package/tests/fixtures/impactAssessment/cycle-contains-product/invalid.json +0 -34
  176. package/tests/fixtures/impactAssessment/cycle-contains-product/valid.json +0 -34
  177. package/tests/fixtures/impactAssessment/cycle-endDate/invalid.json +0 -26
  178. package/tests/fixtures/impactAssessment/cycle-endDate/valid.json +0 -26
  179. package/tests/fixtures/impactAssessment/valid.json +0 -93
  180. package/tests/fixtures/indicator/characterisedIndicator-methodModel/invalid.json +0 -52
  181. package/tests/fixtures/indicator/characterisedIndicator-methodModel/valid.json +0 -52
  182. package/tests/fixtures/indicator/ionisingCompounds/invalid.json +0 -23
  183. package/tests/fixtures/indicator/ionisingCompounds/valid.json +0 -23
  184. package/tests/fixtures/indicator/landTransformation/invalid-grouped.json +0 -257
  185. package/tests/fixtures/indicator/landTransformation/invalid.json +0 -100
  186. package/tests/fixtures/indicator/landTransformation/valid-grouped-full.json +0 -507
  187. package/tests/fixtures/indicator/landTransformation/valid-grouped.json +0 -507
  188. package/tests/fixtures/indicator/landTransformation/valid.json +0 -100
  189. package/tests/fixtures/infrastructure/lifespan/invalid.json +0 -26
  190. package/tests/fixtures/infrastructure/lifespan/valid.json +0 -45
  191. package/tests/fixtures/input/animalFeed-fate/invalid.json +0 -103
  192. package/tests/fixtures/input/animalFeed-fate/valid.json +0 -90
  193. package/tests/fixtures/input/country/invalid.json +0 -64
  194. package/tests/fixtures/input/country/valid.json +0 -64
  195. package/tests/fixtures/input/distribution/animalHousing.json +0 -103
  196. package/tests/fixtures/input/distribution/complete/invalid.json +0 -177
  197. package/tests/fixtures/input/distribution/complete/valid.json +0 -163
  198. package/tests/fixtures/input/distribution/incomplete/valid.json +0 -139
  199. package/tests/fixtures/input/impactAssessment/invalid.json +0 -99
  200. package/tests/fixtures/input/impactAssessment/valid.json +0 -89
  201. package/tests/fixtures/input/input-as-product/invalid.json +0 -57
  202. package/tests/fixtures/input/input-as-product/valid.json +0 -59
  203. package/tests/fixtures/input/mustIncludeId/invalid.json +0 -13
  204. package/tests/fixtures/input/mustIncludeId/valid-multiple-ids.json +0 -31
  205. package/tests/fixtures/input/mustIncludeId/valid.json +0 -22
  206. package/tests/fixtures/input/saplings/invalid.json +0 -58
  207. package/tests/fixtures/input/saplings/valid-no-saplings.json +0 -58
  208. package/tests/fixtures/input/saplings/valid-not-plantation.json +0 -58
  209. package/tests/fixtures/input/saplings/valid.json +0 -58
  210. package/tests/fixtures/integration/distribution/product-yield-invalid.json +0 -54
  211. package/tests/fixtures/management/cycle-overlap/cycles.json +0 -39
  212. package/tests/fixtures/management/cycle-overlap/invalid.json +0 -26
  213. package/tests/fixtures/management/cycle-overlap/valid.json +0 -26
  214. package/tests/fixtures/management/exists/invalid.json +0 -13
  215. package/tests/fixtures/management/exists/valid.json +0 -25
  216. package/tests/fixtures/management/fallow-dates/invalid.json +0 -24
  217. package/tests/fixtures/management/fallow-dates/valid.json +0 -24
  218. package/tests/fixtures/management/termType/invalid-cropland.json +0 -35
  219. package/tests/fixtures/management/termType/invalid-permanent-pasture.json +0 -25
  220. package/tests/fixtures/management/termType/valid-cropland.json +0 -55
  221. package/tests/fixtures/management/termType/valid-no-management.json +0 -13
  222. package/tests/fixtures/management/termType/valid-permanent-pasture.json +0 -35
  223. package/tests/fixtures/measurement/depths/invalid.json +0 -44
  224. package/tests/fixtures/measurement/depths/valid.json +0 -50
  225. package/tests/fixtures/measurement/models/valid.json +0 -33
  226. package/tests/fixtures/measurement/models/warning-no-value.json +0 -30
  227. package/tests/fixtures/measurement/models/warning.json +0 -33
  228. package/tests/fixtures/measurement/pond-measurements/invalid.json +0 -11
  229. package/tests/fixtures/measurement/pond-measurements/valid.json +0 -23
  230. package/tests/fixtures/measurement/required-depths/error.json +0 -71
  231. package/tests/fixtures/measurement/required-depths/valid.json +0 -126
  232. package/tests/fixtures/measurement/required-depths/warning.json +0 -29
  233. package/tests/fixtures/measurement/soilTexture/missing-texture-value.json +0 -227
  234. package/tests/fixtures/measurement/soilTexture/percent-invalid.json +0 -110
  235. package/tests/fixtures/measurement/soilTexture/percent-missing-value.json +0 -43
  236. package/tests/fixtures/measurement/soilTexture/percent-valid.json +0 -110
  237. package/tests/fixtures/measurement/startDate-endDate-required/invalid.json +0 -32
  238. package/tests/fixtures/measurement/startDate-endDate-required/valid.json +0 -46
  239. package/tests/fixtures/measurement/unique/invalid.json +0 -28
  240. package/tests/fixtures/measurement/unique/valid.json +0 -16
  241. package/tests/fixtures/measurement/value-length/invalid.json +0 -46
  242. package/tests/fixtures/measurement/value-length/valid.json +0 -44
  243. package/tests/fixtures/measurement/water-salinity/invalid.json +0 -33
  244. package/tests/fixtures/measurement/water-salinity/valid-brakish.json +0 -40
  245. package/tests/fixtures/measurement/water-salinity/valid.json +0 -33
  246. package/tests/fixtures/organisation/valid.json +0 -26
  247. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/invalid.json +0 -63
  248. package/tests/fixtures/practice/croppingDuration/riceGrainInHuskFlooded/valid.json +0 -63
  249. package/tests/fixtures/practice/defaultValue/invalid.json +0 -12
  250. package/tests/fixtures/practice/defaultValue/valid.json +0 -15
  251. package/tests/fixtures/practice/excretaManagement/invalid.json +0 -50
  252. package/tests/fixtures/practice/excretaManagement/valid.json +0 -60
  253. package/tests/fixtures/practice/irrigated-complete/invalid.json +0 -47
  254. package/tests/fixtures/practice/irrigated-complete/valid-incomplete.json +0 -47
  255. package/tests/fixtures/practice/irrigated-complete/valid.json +0 -60
  256. package/tests/fixtures/practice/landCover-products/invalid.json +0 -58
  257. package/tests/fixtures/practice/landCover-products/valid-coverCrop.json +0 -69
  258. package/tests/fixtures/practice/landCover-products/valid.json +0 -58
  259. package/tests/fixtures/practice/liveAnimal-system/invalid.json +0 -58
  260. package/tests/fixtures/practice/liveAnimal-system/valid.json +0 -69
  261. package/tests/fixtures/practice/longFallowDuration/invalid.json +0 -20
  262. package/tests/fixtures/practice/longFallowDuration/valid.json +0 -20
  263. package/tests/fixtures/practice/noTillage/invalid.json +0 -23
  264. package/tests/fixtures/practice/noTillage/valid-value-not-100.json +0 -23
  265. package/tests/fixtures/practice/noTillage/valid.json +0 -21
  266. package/tests/fixtures/practice/pastureGrass/key-termType/invalid.json +0 -16
  267. package/tests/fixtures/practice/pastureGrass/key-termType/valid.json +0 -16
  268. package/tests/fixtures/practice/pastureGrass/key-value/invalid-numbers.json +0 -67
  269. package/tests/fixtures/practice/pastureGrass/key-value/invalid.json +0 -67
  270. package/tests/fixtures/practice/pastureGrass/key-value/valid.json +0 -67
  271. package/tests/fixtures/practice/pastureGrass/permanent-pasture/invalid.json +0 -37
  272. package/tests/fixtures/practice/pastureGrass/permanent-pasture/valid.json +0 -47
  273. package/tests/fixtures/practice/primaryPercent/invalid.json +0 -49
  274. package/tests/fixtures/practice/primaryPercent/valid.json +0 -49
  275. package/tests/fixtures/practice/processingOperation/invalid-no-primary.json +0 -48
  276. package/tests/fixtures/practice/processingOperation/invalid.json +0 -49
  277. package/tests/fixtures/practice/processingOperation/valid-cropland.json +0 -37
  278. package/tests/fixtures/practice/processingOperation/valid.json +0 -49
  279. package/tests/fixtures/practice/productivePhasePermanentCrops/invalid.json +0 -48
  280. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-0-value.json +0 -58
  281. package/tests/fixtures/practice/productivePhasePermanentCrops/valid-no-value.json +0 -47
  282. package/tests/fixtures/practice/productivePhasePermanentCrops/valid.json +0 -48
  283. package/tests/fixtures/practice/site-management/invalid.json +0 -75
  284. package/tests/fixtures/practice/site-management/valid.json +0 -75
  285. package/tests/fixtures/practice/tillage-siteType/valid.json +0 -51
  286. package/tests/fixtures/practice/tillage-siteType/warning.json +0 -42
  287. package/tests/fixtures/practice/tillage-values/invalid-fullTillage.json +0 -61
  288. package/tests/fixtures/practice/tillage-values/invalid-noTillage.json +0 -61
  289. package/tests/fixtures/practice/tillage-values/valid.json +0 -61
  290. package/tests/fixtures/practice/waterRegime/rice/invalid.json +0 -59
  291. package/tests/fixtures/practice/waterRegime/rice/valid-0-value.json +0 -59
  292. package/tests/fixtures/practice/waterRegime/rice/valid.json +0 -58
  293. package/tests/fixtures/product/economicValueShare/invalid.json +0 -31
  294. package/tests/fixtures/product/economicValueShare/valid.json +0 -22
  295. package/tests/fixtures/product/excreta/invalid.json +0 -62
  296. package/tests/fixtures/product/excreta/valid.json +0 -62
  297. package/tests/fixtures/product/excreta/warning.json +0 -53
  298. package/tests/fixtures/product/excreta/with-system/invalid.json +0 -79
  299. package/tests/fixtures/product/excreta/with-system/valid.json +0 -88
  300. package/tests/fixtures/product/excreta/with-system/warning.json +0 -70
  301. package/tests/fixtures/product/fu_ha/invalid.json +0 -49
  302. package/tests/fixtures/product/fu_ha/valid.json +0 -49
  303. package/tests/fixtures/product/primary/invalid.json +0 -22
  304. package/tests/fixtures/product/primary/valid.json +0 -22
  305. package/tests/fixtures/product/value/valid.json +0 -26
  306. package/tests/fixtures/product/value/value-0/error.json +0 -40
  307. package/tests/fixtures/product/value/value-empty/warning.json +0 -23
  308. package/tests/fixtures/product/yield/invalid.json +0 -54
  309. package/tests/fixtures/product/yield/no-value.json +0 -75
  310. package/tests/fixtures/product/yield/valid.json +0 -54
  311. package/tests/fixtures/property/default-value/valid-allowed-exception.json +0 -61
  312. package/tests/fixtures/property/default-value/valid.json +0 -61
  313. package/tests/fixtures/property/default-value/warning.json +0 -61
  314. package/tests/fixtures/property/termType/invalid.json +0 -60
  315. package/tests/fixtures/property/termType/valid.json +0 -60
  316. package/tests/fixtures/property/value-min-max/invalid.json +0 -77
  317. package/tests/fixtures/property/value-min-max/valid-skip-maximum.json +0 -57
  318. package/tests/fixtures/property/value-min-max/valid.json +0 -78
  319. package/tests/fixtures/property/valueType/invalid.json +0 -79
  320. package/tests/fixtures/property/valueType/valid.json +0 -79
  321. package/tests/fixtures/property/volatileSolidsContent/invalid.json +0 -99
  322. package/tests/fixtures/property/volatileSolidsContent/valid.json +0 -99
  323. package/tests/fixtures/shared/coordinates/invalid.json +0 -18
  324. package/tests/fixtures/shared/coordinates/valid.json +0 -18
  325. package/tests/fixtures/shared/data-duplicates/valid.json +0 -113
  326. package/tests/fixtures/shared/data-duplicates/warning.json +0 -172
  327. package/tests/fixtures/shared/duplicated-term-units/invalid-animalProduct.json +0 -61
  328. package/tests/fixtures/shared/duplicated-term-units/invalid-organicFertiliser.json +0 -61
  329. package/tests/fixtures/shared/duplicated-term-units/valid.json +0 -49
  330. package/tests/fixtures/shared/list-country-region/invalid.json +0 -54
  331. package/tests/fixtures/shared/list-country-region/valid.json +0 -54
  332. package/tests/fixtures/shared/list-percent-value/invalid.json +0 -49
  333. package/tests/fixtures/shared/list-percent-value/valid.json +0 -52
  334. package/tests/fixtures/shared/list-valueType/invalid.json +0 -49
  335. package/tests/fixtures/shared/list-valueType/valid.json +0 -49
  336. package/tests/fixtures/shared/list-values-sum-100/management/with-properties/valid.json +0 -91
  337. package/tests/fixtures/shared/list-values-sum-100/measurements/missing-soil.json +0 -46
  338. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-high-value.json +0 -63
  339. package/tests/fixtures/shared/list-values-sum-100/measurements/no-depth-valid.json +0 -40
  340. package/tests/fixtures/shared/list-values-sum-100/measurements/with-depth-high-value.json +0 -71
  341. package/tests/fixtures/shared/list-values-sum-100/practices/total-100.json +0 -61
  342. package/tests/fixtures/shared/list-values-sum-100/practices/total-110.json +0 -61
  343. package/tests/fixtures/shared/list-values-sum-100/practices/total-90.json +0 -61
  344. package/tests/fixtures/shared/min-max/value-above.json +0 -31
  345. package/tests/fixtures/shared/min-max/value-below.json +0 -31
  346. package/tests/fixtures/shared/min-max/value-valid.json +0 -45
  347. package/tests/fixtures/shared/model/emissions/invalid.json +0 -102
  348. package/tests/fixtures/shared/model/emissions/valid-variable-tolerance.json +0 -180
  349. package/tests/fixtures/shared/model/emissions/valid.json +0 -102
  350. package/tests/fixtures/shared/model/impacts/invalid.json +0 -75
  351. package/tests/fixtures/shared/model/impacts/valid.json +0 -75
  352. package/tests/fixtures/shared/model/inputs/valid-no-value.json +0 -84
  353. package/tests/fixtures/shared/model/inputs/valid.json +0 -87
  354. package/tests/fixtures/shared/model/inputs/warning.json +0 -87
  355. package/tests/fixtures/shared/model/products/valid-no-value.json +0 -88
  356. package/tests/fixtures/shared/model/products/valid.json +0 -91
  357. package/tests/fixtures/shared/model/products/warning.json +0 -91
  358. package/tests/fixtures/shared/otherModel/invalid.json +0 -69
  359. package/tests/fixtures/shared/otherModel/valid.json +0 -70
  360. package/tests/fixtures/shared/properties-duplicate-values/invalid.json +0 -61
  361. package/tests/fixtures/shared/properties-duplicate-values/valid.json +0 -57
  362. package/tests/fixtures/shared/properties-same-length/invalid.json +0 -62
  363. package/tests/fixtures/shared/properties-same-length/valid.json +0 -52
  364. package/tests/fixtures/shared/unit-percent/invalid.json +0 -34
  365. package/tests/fixtures/shared/unit-percent/valid.json +0 -60
  366. package/tests/fixtures/shared/unit-percent/warning.json +0 -52
  367. package/tests/fixtures/site/cycles-linked-ia/invalid.json +0 -129
  368. package/tests/fixtures/site/cycles-linked-ia/valid.json +0 -129
  369. package/tests/fixtures/site/valid.json +0 -138
  370. package/tests/fixtures/source/valid.json +0 -19
  371. package/tests/fixtures/transformation/excretaManagement/invalid.json +0 -47
  372. package/tests/fixtures/transformation/excretaManagement/valid.json +0 -59
  373. package/tests/fixtures/transformation/inputs-products/invalid.json +0 -43
  374. package/tests/fixtures/transformation/inputs-products/valid.json +0 -43
  375. package/tests/fixtures/transformation/linked-emission/invalid.json +0 -101
  376. package/tests/fixtures/transformation/linked-emission/valid.json +0 -107
  377. package/tests/fixtures/transformation/previousTransformationId/invalid-no-previous.json +0 -127
  378. package/tests/fixtures/transformation/previousTransformationId/invalid-previous-input.json +0 -100
  379. package/tests/fixtures/transformation/previousTransformationId/invalid-product-input.json +0 -106
  380. package/tests/fixtures/transformation/previousTransformationId/invalid-wrong-order.json +0 -136
  381. package/tests/fixtures/transformation/previousTransformationId/valid.json +0 -171
  382. package/tests/integration/__init__.py +0 -0
  383. package/tests/integration/test_product.py +0 -17
  384. package/tests/test_gee.py +0 -10
  385. package/tests/test_utils.py +0 -36
  386. package/tests/test_validation.py +0 -11
  387. package/tests/utils.py +0 -28
  388. package/tests/validators/__init__.py +0 -0
  389. package/tests/validators/test_aggregated_cycle.py +0 -44
  390. package/tests/validators/test_aggregated_shared.py +0 -63
  391. package/tests/validators/test_animal.py +0 -72
  392. package/tests/validators/test_completeness.py +0 -337
  393. package/tests/validators/test_cycle.py +0 -600
  394. package/tests/validators/test_emission.py +0 -170
  395. package/tests/validators/test_impact_assessment.py +0 -80
  396. package/tests/validators/test_indicator.py +0 -120
  397. package/tests/validators/test_infrastructure.py +0 -26
  398. package/tests/validators/test_input.py +0 -434
  399. package/tests/validators/test_management.py +0 -177
  400. package/tests/validators/test_measurement.py +0 -317
  401. package/tests/validators/test_organisation.py +0 -32
  402. package/tests/validators/test_practice.py +0 -490
  403. package/tests/validators/test_product.py +0 -291
  404. package/tests/validators/test_property.py +0 -143
  405. package/tests/validators/test_shared.py +0 -1139
  406. package/tests/validators/test_site.py +0 -151
  407. package/tests/validators/test_source.py +0 -15
  408. package/tests/validators/test_transformation.py +0 -151
  409. package/tests/validators/test_validators.py +0 -74
  410. package/tsconfig.dist.json +0 -9
  411. package/tsconfig.json +0 -25
@@ -1,312 +0,0 @@
1
- """
2
- Site validation
3
-
4
- Here is the list of validations running on a [Site](/schema/Site).
5
- """
6
-
7
- import os
8
- import json
9
- import re
10
- from hestia_earth.schema import NodeType, SiteSiteType, TermTermType
11
- from hestia_earth.utils.tools import flatten, safe_parse_date, non_empty_list
12
-
13
- from hestia_earth.validation.gee import get_cached_data
14
- from hestia_earth.validation.utils import find_linked_node, find_related_nodes
15
- from .shared import (
16
- validate_dates,
17
- validate_list_dates,
18
- validate_list_dates_format,
19
- validate_list_min_below_max,
20
- validate_list_min_max_lookup,
21
- validate_list_dates_after,
22
- validate_country_region,
23
- validate_coordinates,
24
- need_validate_coordinates,
25
- validate_area,
26
- need_validate_area,
27
- validate_list_term_percent,
28
- validate_linked_source_privacy,
29
- validate_list_date_lt_today,
30
- validate_date_lt_today,
31
- validate_boundary_area,
32
- validate_region_size,
33
- need_validate_region_size,
34
- validate_private_has_source,
35
- validate_list_value_between_min_max,
36
- validate_list_sum_100_percent,
37
- validate_list_percent_requires_value,
38
- validate_list_valueType,
39
- )
40
- from .infrastructure import validate_lifespan
41
- from .measurement import (
42
- validate_soilTexture,
43
- validate_depths,
44
- validate_required_depths,
45
- validate_term_unique,
46
- validate_require_startDate_endDate,
47
- validate_with_models,
48
- validate_value_length,
49
- validate_water_measurements,
50
- validate_water_salinity,
51
- )
52
- from .property import validate_all as validate_properties
53
- from .management import validate_fallow_dates, validate_cycles_overlap
54
-
55
- _VALIDATE_SITE_LINKED_NODES = os.getenv("VALIDATE_SITE_LINKED_NODES", "true") == "true"
56
-
57
-
58
- INLAND_TYPES = [
59
- SiteSiteType.CROPLAND.value,
60
- SiteSiteType.PERMANENT_PASTURE.value,
61
- SiteSiteType.RIVER_OR_STREAM.value,
62
- SiteSiteType.LAKE.value,
63
- SiteSiteType.ANIMAL_HOUSING.value,
64
- SiteSiteType.AGRI_FOOD_PROCESSOR.value,
65
- SiteSiteType.FOOD_RETAILER.value,
66
- SiteSiteType.FOREST.value,
67
- SiteSiteType.OTHER_NATURAL_VEGETATION.value,
68
- ]
69
-
70
- SITE_TYPES_VALID_VALUES = {
71
- SiteSiteType.CROPLAND.value: [25, 35, 36],
72
- SiteSiteType.FOREST.value: [10, 20, 25],
73
- }
74
- MEASUREMENT_REQUIRES_VALUE_TERM_TYPES = [
75
- TermTermType.SOILTEXTURE,
76
- TermTermType.SOILTYPE,
77
- TermTermType.USDASOILTYPE,
78
- ]
79
-
80
-
81
- def validate_site_dates(site: dict):
82
- return validate_dates(site) or {
83
- "level": "error",
84
- "dataPath": ".endDate",
85
- "message": "must be greater than startDate",
86
- }
87
-
88
-
89
- def validate_site_coordinates(site: dict):
90
- return need_validate_coordinates(site) and site.get("siteType") in INLAND_TYPES
91
-
92
-
93
- def validate_siteType(site: dict):
94
- site_type = site.get("siteType")
95
- values = SITE_TYPES_VALID_VALUES.get(site_type, [])
96
- values_str = ", ".join(map(lambda v: str(v), values))
97
-
98
- def validate():
99
- value = get_cached_data(site, "siteType", 2019)
100
- return value in values
101
-
102
- return (
103
- len(values) == 0
104
- or validate()
105
- or {
106
- "level": "warning",
107
- "dataPath": ".siteType",
108
- "message": " ".join(
109
- [
110
- "The coordinates you have provided are not in a known",
111
- site_type,
112
- f"area according to the MODIS Land Cover classification (MCD12Q1.006, LCCS2, bands {values_str}).",
113
- ]
114
- ),
115
- }
116
- )
117
-
118
-
119
- def _parse_cycle_date(date: str, is_end_date: bool = False):
120
- value = (
121
- date
122
- if len(date) == 10
123
- else (
124
- f"{date}-01"
125
- if len(date) == 7
126
- else (f"{date}-12-31" if is_end_date else f"{date}-01-01")
127
- )
128
- )
129
- return safe_parse_date(value)
130
-
131
-
132
- def validate_cycle_dates(cycles: list):
133
- # compute list of all days existing between start and end date of the cycles
134
- values = [
135
- (
136
- cycle,
137
- (
138
- _parse_cycle_date(cycle.get("startDate"))
139
- if cycle.get("startDate")
140
- else None
141
- ),
142
- _parse_cycle_date(cycle.get("endDate"), is_end_date=True),
143
- )
144
- for cycle in cycles
145
- ]
146
-
147
- day = 60 * 60 * 24 # 1 day step range
148
- days = flatten(
149
- (
150
- list(
151
- range(int(start_date.timestamp()), int(end_date.timestamp()) + day, day)
152
- )
153
- if start_date
154
- else [int(end_date.timestamp())]
155
- )
156
- for _cycle, start_date, end_date in values
157
- )
158
-
159
- seen = set()
160
- duplicated_dates = [x for x in days if x in seen or seen.add(x)]
161
- duplicated_cycles = [
162
- cycle
163
- for cycle, start_date, end_date in values
164
- if any(
165
- [
166
- (
167
- int(start_date.timestamp()) <= date <= int(end_date.timestamp())
168
- if start_date
169
- else date == int(end_date.timestamp())
170
- )
171
- for date in duplicated_dates
172
- ]
173
- )
174
- ]
175
-
176
- return not len(duplicated_dates) or {
177
- "level": "error",
178
- "dataPath": "",
179
- "message": "multiple cycles on the same site cannot overlap",
180
- "params": {"ids": [c.get("@id", c.get("id")) for c in duplicated_cycles]},
181
- }
182
-
183
-
184
- def _extract_linked_data(cycle: dict, node_map: dict = {}):
185
- cycle_str = json.dumps(cycle)
186
- match = re.search(r'"impactAssessment":[\s]{([^}]*)}', cycle_str)
187
- nodes = [json.loads("{" + v + "}") for v in match.groups()] if match else []
188
- linked_impact_asessments = non_empty_list(
189
- [
190
- find_linked_node(
191
- node_map,
192
- {
193
- "type": NodeType.IMPACTASSESSMENT.value,
194
- "id": n.get("@id", n.get("id")),
195
- },
196
- )
197
- for n in nodes
198
- ]
199
- )
200
- linked_cycles = [n.get("cycle", {}) for n in linked_impact_asessments]
201
- linked_cycle_ids = set([n.get("@id", n.get("id")) for n in linked_cycles])
202
- return (cycle.get("@id", cycle.get("id")), linked_cycle_ids)
203
-
204
-
205
- def validate_cycles_linked_ia(cycles: list, node_map: dict = {}):
206
- linked_data = [_extract_linked_data(cycle, node_map) for cycle in cycles]
207
-
208
- cycle_ids = set([n.get("@id", n.get("id")) for n in cycles])
209
- incorrect_cycle_ids = set(
210
- flatten(
211
- [
212
- [cycle_id] + list(linked_cycle_ids.intersection(cycle_ids))
213
- for cycle_id, linked_cycle_ids in linked_data
214
- if linked_cycle_ids.intersection(cycle_ids)
215
- ]
216
- )
217
- )
218
-
219
- return not incorrect_cycle_ids or {
220
- "level": "error",
221
- "dataPath": "",
222
- "message": "cycles linked together cannot be added to the same site",
223
- "params": {"ids": list(incorrect_cycle_ids)},
224
- }
225
-
226
-
227
- def validate_site(site: dict, node_map: dict = {}):
228
- is_aggregated = site.get("aggregated", False)
229
- cycles = find_related_nodes(
230
- node_map, site, related_key="site", related_type=NodeType.CYCLE
231
- ) + find_related_nodes(
232
- node_map, site, related_key="otherSites", related_type=NodeType.CYCLE
233
- )
234
- return [
235
- validate_site_dates(site),
236
- validate_date_lt_today(site, "startDate"),
237
- validate_date_lt_today(site, "endDate"),
238
- validate_linked_source_privacy(site, "defaultSource", node_map),
239
- validate_private_has_source(site, "defaultSource"),
240
- validate_siteType(site) if need_validate_coordinates(site) else True,
241
- validate_country_region(site),
242
- validate_coordinates(site) if validate_site_coordinates(site) else True,
243
- validate_area(site) if need_validate_area(site) else True,
244
- validate_boundary_area(site),
245
- validate_region_size(site) if need_validate_region_size(site) else True,
246
- validate_cycle_dates(cycles) if cycles and not is_aggregated else True,
247
- not _VALIDATE_SITE_LINKED_NODES
248
- or (validate_cycles_linked_ia(cycles, node_map) if cycles else True),
249
- ] + flatten(
250
- (
251
- [
252
- validate_list_dates(site, "infrastructure"),
253
- validate_list_dates_format(site, "infrastructure"),
254
- validate_list_date_lt_today(
255
- site, "infrastructure", ["startDate", "endDate"]
256
- ),
257
- validate_lifespan(site.get("infrastructure")),
258
- ]
259
- if "infrastructure" in site
260
- else []
261
- )
262
- + (
263
- [
264
- validate_list_dates(site, "measurements"),
265
- validate_list_dates_after(
266
- site, "startDate", "measurements", ["startDate", "endDate", "dates"]
267
- ),
268
- validate_list_dates_format(site, "measurements"),
269
- validate_list_date_lt_today(
270
- site, "measurements", ["startDate", "endDate"]
271
- ),
272
- validate_list_min_below_max(site, "measurements"),
273
- validate_list_value_between_min_max(site, "measurements"),
274
- validate_list_min_max_lookup(site, "measurements", "value"),
275
- validate_list_min_max_lookup(site, "measurements", "min"),
276
- validate_list_min_max_lookup(site, "measurements", "max"),
277
- validate_list_term_percent(site, "measurements"),
278
- validate_list_sum_100_percent(site, "measurements"),
279
- validate_list_percent_requires_value(
280
- site, "measurements", MEASUREMENT_REQUIRES_VALUE_TERM_TYPES
281
- ),
282
- validate_list_valueType(site, "measurements"),
283
- validate_soilTexture(site.get("measurements")),
284
- validate_depths(site.get("measurements")),
285
- validate_required_depths(site, "measurements"),
286
- validate_term_unique(site.get("measurements")),
287
- validate_properties(site, "measurements"),
288
- validate_require_startDate_endDate(site, "measurements"),
289
- validate_with_models(site, "measurements"),
290
- validate_value_length(site, "measurements"),
291
- validate_water_measurements(site, "measurements"),
292
- validate_water_salinity(site, "measurements"),
293
- ]
294
- if len(site.get("measurements", [])) > 0
295
- else []
296
- )
297
- + (
298
- [
299
- validate_list_sum_100_percent(site, "management"),
300
- validate_list_valueType(site, "management"),
301
- validate_properties(site, "management"),
302
- validate_fallow_dates(site, "management"),
303
- (
304
- validate_cycles_overlap(site, cycles, "management")
305
- if cycles and not is_aggregated
306
- else True
307
- ),
308
- ]
309
- if len(site.get("management", [])) > 0
310
- else []
311
- )
312
- )
@@ -1,20 +0,0 @@
1
- from .shared import validate_date_lt_today
2
-
3
-
4
- def validate_source(source: dict, node_map: dict = {}):
5
- """
6
- Validates a single `Source`.
7
-
8
- Parameters
9
- ----------
10
- organisation : dict
11
- The `Source` to validate.
12
- node_map : dict
13
- The list of all nodes to do cross-validation, grouped by `type` and `id`.
14
-
15
- Returns
16
- -------
17
- List
18
- The list of errors for the `Source`, which can be empty if no errors detected.
19
- """
20
- return [validate_date_lt_today(source, "bibliography.year")]
@@ -1,250 +0,0 @@
1
- from hestia_earth.schema import TermTermType
2
- from hestia_earth.utils.api import download_hestia
3
- from hestia_earth.utils.model import find_term_match, filter_list_term_type
4
- from hestia_earth.utils.tools import flatten, list_sum
5
-
6
- from hestia_earth.validation.utils import (
7
- _filter_list_errors,
8
- update_error_path,
9
- term_id_prefix,
10
- )
11
- from hestia_earth.validation.validators.shared import is_value_different
12
- from .practice import validate_excretaManagement
13
-
14
-
15
- def _previous_transformation(
16
- cycle: dict, list_key: str, transformation: dict, index: int
17
- ):
18
- tr_id = transformation.get("previousTransformationId")
19
- transformations = cycle.get(list_key, [])
20
- # previous transformation must be before the current transformation index
21
- return next(
22
- (
23
- transformations[i]
24
- for i in reversed(range(0, min(index, len(transformations))))
25
- if transformations[i].get("transformationId") == tr_id and i < index
26
- ),
27
- None,
28
- )
29
-
30
-
31
- def _validate_previous_term(
32
- cycle: dict, list_key: str, transformation: dict, index: int
33
- ):
34
- previous_transformation = _previous_transformation(
35
- cycle, list_key, transformation, index
36
- )
37
- tr_id = transformation.get("previousTransformationId")
38
- return (
39
- not tr_id
40
- or previous_transformation is not None
41
- or {
42
- "level": "error",
43
- "dataPath": f".{list_key}[{index}].previousTransformationId",
44
- "message": "must point to a previous transformation in the list",
45
- }
46
- )
47
-
48
-
49
- def _cycle_has_product(cycle: dict, input: dict):
50
- term_id = input.get("term", {}).get("@id")
51
- return find_term_match(cycle.get("products", []), term_id, None) is not None
52
-
53
-
54
- def _validate_previous_input(
55
- cycle: dict, list_key: str, transformation: dict, index: int
56
- ):
57
- has_previous_transformation = (
58
- transformation.get("previousTransformationId") is not None
59
- )
60
- inputs = transformation.get("inputs", [])
61
-
62
- def validate_in_cycle():
63
- return (
64
- any([len(cycle.get("products", [])) == 0, len(inputs) == 0])
65
- or any([_cycle_has_product(cycle, i) for i in inputs])
66
- or {
67
- "level": "error",
68
- "dataPath": f".{list_key}[{index}]",
69
- "message": "at least one Input must be a Product of the Cycle",
70
- }
71
- )
72
-
73
- def validate_in_previous_transformation():
74
- previous_transformation = _previous_transformation(
75
- cycle, list_key, transformation, index
76
- )
77
- return (
78
- not previous_transformation
79
- or any(
80
- [
81
- len(previous_transformation.get("products", [])) == 0,
82
- len(inputs) == 0,
83
- ]
84
- )
85
- or any([_cycle_has_product(previous_transformation, i) for i in inputs])
86
- or {
87
- "level": "error",
88
- "dataPath": f".{list_key}[{index}]",
89
- "message": "at least one Input must be a Product of the previous Transformation",
90
- }
91
- )
92
-
93
- return (
94
- validate_in_previous_transformation()
95
- if has_previous_transformation
96
- else validate_in_cycle()
97
- )
98
-
99
-
100
- def _validate_previous_product_value(
101
- cycle: dict, list_key: str, transformation: dict, index: int
102
- ):
103
- share = transformation.get("transformedShare")
104
- inputs = transformation.get("inputs", [])
105
- previous_transformation = _previous_transformation(
106
- cycle, list_key, transformation, index
107
- )
108
- products = (previous_transformation or cycle).get("products", [])
109
-
110
- def validate_input(input_index: int):
111
- input = list_sum(inputs[input_index].get("value", []), None)
112
- term_id = inputs[input_index].get("term", {}).get("@id")
113
- product = list_sum(find_term_match(products, term_id).get("value", []), None)
114
- return (
115
- any([not input, not product])
116
- or not is_value_different(input, product * share / 100, 0.01)
117
- or {
118
- "level": "error",
119
- "dataPath": f".transformations[{index}].inputs[{input_index}].value",
120
- "message": "must be equal to previous product multiplied by the share",
121
- }
122
- )
123
-
124
- return any([len(products) == 0, share is None]) or _filter_list_errors(
125
- flatten(map(validate_input, range(len(inputs))))
126
- )
127
-
128
-
129
- def validate_previous_transformation(cycle: dict, list_key: str = "transformations"):
130
- def validate(values: tuple):
131
- index, transformation = values
132
- return _filter_list_errors(
133
- map(
134
- lambda func: func(cycle, list_key, transformation, index),
135
- [
136
- _validate_previous_term,
137
- _validate_previous_input,
138
- _validate_previous_product_value,
139
- ],
140
- )
141
- )
142
-
143
- return _filter_list_errors(map(validate, enumerate(cycle.get(list_key, []))))
144
-
145
-
146
- def validate_transformation_excretaManagement(
147
- cycle: dict, list_key: str = "transformations"
148
- ):
149
- def validate(values: tuple):
150
- index, transformation = values
151
- practices = transformation.get("practices", []) + [
152
- {"term": transformation.get("term")}
153
- ]
154
- error = validate_excretaManagement(transformation, practices)
155
- return error is True or update_error_path(error, list_key, index)
156
-
157
- return _filter_list_errors(map(validate, enumerate(cycle.get(list_key, []))))
158
-
159
-
160
- def validate_linked_emission(cycle: dict, list_key: str = "transformations"):
161
- emissions = cycle.get("emissions", [])
162
-
163
- def validate_emission(transformation_index: int, transformation: dict):
164
- def validate(values: tuple):
165
- index, emission = values
166
- term_id = emission.get("term", {}).get("@id")
167
- same_emissions = list(
168
- filter(lambda e: e.get("term", {}).get("@id") == term_id, emissions)
169
- )
170
- linked_emission = next(
171
- (
172
- e
173
- for e in same_emissions
174
- if all(
175
- [
176
- e.get("transformation", {}).get("@id")
177
- == transformation.get("term", {}).get("@id")
178
- ]
179
- )
180
- ),
181
- None,
182
- )
183
- return (
184
- len(same_emissions) == 0
185
- or linked_emission is not None
186
- or {
187
- "level": "warning",
188
- "dataPath": f".{list_key}[{transformation_index}].emissions[{index}]",
189
- "message": "should be linked to an emission in the Cycle",
190
- "params": {"term": emission.get("term", {})},
191
- }
192
- )
193
-
194
- return validate
195
-
196
- def validate(values: tuple):
197
- index, transformation = values
198
- return _filter_list_errors(
199
- map(
200
- validate_emission(index, transformation),
201
- enumerate(transformation.get("emissions", [])),
202
- )
203
- )
204
-
205
- return len(emissions) == 0 or _filter_list_errors(
206
- flatten(map(validate, enumerate(cycle.get(list_key, []))))
207
- )
208
-
209
-
210
- def _is_generic_excreta(term_id: str):
211
- return len((download_hestia(term_id) or {}).get("subClassOf", [])) == 0
212
-
213
-
214
- def validate_excreta_inputs_products(transformations: list):
215
- def validate_product(transformation_index: int, input_prefix_ids: list):
216
- def validate(values: tuple):
217
- index, product = values
218
- term = product.get("term", {})
219
- term_id = term.get("@id", "")
220
- is_excreta = term.get("termType", "") == TermTermType.EXCRETA.value
221
- return (
222
- not is_excreta
223
- or _is_generic_excreta(term_id)
224
- or term_id_prefix(term_id) in input_prefix_ids
225
- or {
226
- "level": "error",
227
- "dataPath": f".transformations[{transformation_index}].products[{index}]",
228
- "message": "must be included as an Input",
229
- "params": {"term": term, "expected": input_prefix_ids},
230
- }
231
- )
232
-
233
- return validate
234
-
235
- def validate(values: tuple):
236
- index, transformation = values
237
- excreta_inputs = filter_list_term_type(
238
- transformation.get("inputs", []), TermTermType.EXCRETA
239
- )
240
- input_prefix_ids = list(
241
- set([term_id_prefix(v.get("term", {}).get("@id")) for v in excreta_inputs])
242
- )
243
- return len(input_prefix_ids) == 0 or _filter_list_errors(
244
- map(
245
- validate_product(index, input_prefix_ids),
246
- enumerate(transformation.get("products", [])),
247
- )
248
- )
249
-
250
- return _filter_list_errors(flatten(map(validate, enumerate(transformations))))
@@ -1 +0,0 @@
1
- VERSION = "0.37.7"
package/layer/build.sh DELETED
@@ -1,34 +0,0 @@
1
- #!/bin/sh
2
-
3
- # exit when any command fails
4
- set -e
5
-
6
- export PKG_DIR="python"
7
-
8
- LIBRARY="validation"
9
- PKG_PATH="./layer/$PKG_DIR/lib/python3.12/site-packages/"
10
-
11
- rm -rf "./layer/${PKG_DIR}" && mkdir -p "./layer/${PKG_DIR}"
12
-
13
- PACKAGE_PATH="package.json"
14
- PACKAGE_VERSION=$(cat $PACKAGE_PATH \
15
- | grep version \
16
- | head -1 \
17
- | awk -F: '{ print $2 }' \
18
- | sed 's/[",]//g' \
19
- | tr -d '[[:space:]]')
20
-
21
- # create requirements.txt
22
- cp requirements.txt layer/requirements.txt
23
-
24
- # remove packages included in layers
25
- sed -i '/hestia-earth-utils.*/d' layer/requirements.txt || sed -i '' '/hestia-earth-utils.*/d' layer/requirements.txt
26
-
27
- docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-python3.12 pip install -r layer/requirements.txt -t $PKG_PATH
28
-
29
- # copy the current library
30
- cp -R "./hestia_earth/${LIBRARY}/" "${PKG_PATH}hestia_earth/${LIBRARY}"
31
-
32
- # Removing nonessential files
33
- find ${PKG_PATH} -type f -name '*.md' -delete
34
- rm -rf ${PKG_PATH}*.dist-info
package/layer/deploy.sh DELETED
@@ -1,18 +0,0 @@
1
- #!/bin/bash
2
-
3
- # exit when any command fails
4
- set -e
5
-
6
- STAGE=${1:-"dev"}
7
-
8
- cd ./layer/
9
-
10
- rm -rf layer.zip
11
- zip -r layer.zip python
12
-
13
- aws lambda publish-layer-version \
14
- --region $AWS_REGION \
15
- --layer-name "hestia-$STAGE-python312-data-validation" \
16
- --description "Data Validation running on python 3.12" \
17
- --zip-file "fileb://layer.zip" \
18
- --compatible-runtimes python3.12
package/release.sh DELETED
@@ -1,11 +0,0 @@
1
- #!/bin/sh
2
-
3
- FROM_BRANCH="develop"
4
- TO_BRANCH="master"
5
-
6
- git checkout $TO_BRANCH
7
- git merge $FROM_BRANCH
8
- npm run release
9
- git checkout $FROM_BRANCH
10
- git merge $TO_BRANCH
11
- git push
@@ -1,6 +0,0 @@
1
- -r requirements.txt
2
- boto3
3
- botocore
4
- hestia-earth-models>=0.75.1
5
- hestia-earth-earth-engine>=0.6.0
6
- hestia-earth-distribution>=0.3.1
@@ -1,4 +0,0 @@
1
- -r requirements-ci.txt
2
- pytest-cov
3
- pytest-xdist
4
- coverage
package/requirements.txt DELETED
@@ -1,2 +0,0 @@
1
- hestia-earth-schema>=35.0.1
2
- hestia-earth-utils>=0.16.9
@@ -1,7 +0,0 @@
1
- #!/bin/sh
2
- docker build -t hestia-data-validation:test -f tests/Dockerfile .
3
-
4
- docker run --rm \
5
- --env-file .env \
6
- -v ${PWD}:/app \
7
- hestia-data-validation:test "$@"
package/run-docker.sh DELETED
@@ -1,9 +0,0 @@
1
- #!/bin/sh
2
-
3
- docker build --progress=plain -t hestia-data-validation:latest .
4
-
5
- docker run --rm \
6
- --name hestia-data-validation \
7
- -v ${PWD}:/app \
8
- -v ${PWD}/samples:/app/samples \
9
- hestia-data-validation:latest python run.py "$@"