spinta 0.2.dev1__tar.gz → 0.2.dev3__tar.gz

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 (703) hide show
  1. {spinta-0.2.dev1 → spinta-0.2.dev3}/PKG-INFO +10 -4
  2. {spinta-0.2.dev1 → spinta-0.2.dev3}/pyproject.toml +12 -4
  3. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/accesslog/__init__.py +34 -10
  4. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/api/__init__.py +48 -4
  5. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/api/schema.py +9 -10
  6. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/auth.py +149 -77
  7. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/__init__.py +243 -37
  8. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/components.py +16 -1
  9. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/constants.py +1 -0
  10. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/validate.py +2 -1
  11. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/write.py +3 -2
  12. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/helpers.py +59 -2
  13. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/encode.py +1 -0
  14. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/read.py +4 -4
  15. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/validate.py +2 -1
  16. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/components.py +3 -1
  17. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/helpers.py +2 -1
  18. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/array/write.py +2 -1
  19. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/file/write.py +2 -1
  20. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/object/write.py +2 -1
  21. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/ufuncs/components.py +4 -4
  22. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/ufuncs/ufuncs.py +10 -14
  23. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/write.py +2 -1
  24. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/changes.py +16 -6
  25. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/encode.py +2 -1
  26. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/init.py +7 -2
  27. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/migrate.py +46 -32
  28. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/model.py +177 -99
  29. spinta-0.2.dev3/spinta/backends/postgresql/commands/migrate/property.py +78 -0
  30. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/datatype.py +146 -56
  31. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/file.py +37 -20
  32. spinta-0.2.dev3/spinta/backends/postgresql/commands/migrate/types/geometry.py +28 -0
  33. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/ref.py +109 -63
  34. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/string.py +34 -22
  35. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/text.py +41 -23
  36. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/read.py +6 -6
  37. spinta-0.2.dev3/spinta/backends/postgresql/commands/redirect.py +59 -0
  38. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/wipe.py +18 -7
  39. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/write.py +171 -5
  40. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/components.py +8 -3
  41. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/exceptions.py +2 -1
  42. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/migrate/actions.py +32 -25
  43. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/migrate/migrate.py +412 -118
  44. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/name.py +2 -24
  45. spinta-0.2.dev3/spinta/backends/postgresql/helpers/redirect.py +37 -0
  46. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/validate.py +2 -1
  47. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array/init.py +1 -0
  48. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array/write.py +6 -7
  49. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/file/write.py +3 -2
  50. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/geometry/encode.py +1 -1
  51. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/geometry/helpers.py +1 -1
  52. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/query/components.py +8 -4
  53. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/query/ufuncs.py +132 -50
  54. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/config.py +1 -1
  55. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/data.py +10 -2
  56. spinta-0.2.dev3/spinta/cli/get.py +34 -0
  57. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/data.py +24 -19
  58. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/backends/postgresql/commands.py +7 -7
  59. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/backends/postgresql/helpers.py +3 -2
  60. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/commands.py +224 -2
  61. spinta-0.2.dev3/spinta/cli/helpers/export/helpers.py +159 -0
  62. spinta-0.2.dev3/spinta/cli/helpers/migrate.py +19 -0
  63. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/read.py +12 -57
  64. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/sync.py +2 -1
  65. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/utils.py +2 -1
  66. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/store.py +1 -1
  67. spinta-0.2.dev3/spinta/cli/helpers/upgrade/components.py +51 -0
  68. spinta-0.2.dev3/spinta/cli/helpers/upgrade/core.py +143 -0
  69. spinta-0.2.dev3/spinta/cli/helpers/upgrade/helpers.py +29 -0
  70. {spinta-0.2.dev1/spinta/cli/helpers/upgrade → spinta-0.2.dev3/spinta/cli/helpers/upgrade/scripts}/clients.py +3 -3
  71. spinta-0.2.dev3/spinta/cli/helpers/upgrade/scripts/deduplicate.py +263 -0
  72. spinta-0.2.dev3/spinta/cli/helpers/upgrade/scripts/redirect.py +107 -0
  73. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/inspect.py +0 -11
  74. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/keymap.py +2 -1
  75. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/main.py +2 -1
  76. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/manifest.py +0 -1
  77. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/migrate.py +9 -7
  78. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/pii.py +1 -1
  79. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/push.py +1 -2
  80. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/server.py +13 -10
  81. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/show.py +1 -1
  82. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/upgrade.py +17 -5
  83. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/__init__.py +179 -13
  84. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/read.py +89 -43
  85. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/write.py +132 -144
  86. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/compat.py +48 -0
  87. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/components.py +44 -58
  88. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/config.py +47 -3
  89. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/core/config.py +9 -3
  90. spinta-0.2.dev3/spinta/core/enums.py +194 -0
  91. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/core/ufuncs.py +23 -4
  92. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/csv/components.py +11 -0
  93. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/json/components.py +11 -0
  94. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/memory/components.py +11 -0
  95. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/soap/commands/read.py +49 -0
  96. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/soap/components.py +16 -0
  97. spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/xml/components.py +11 -0
  98. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/dataframe/commands/read.py +89 -24
  99. spinta-0.2.dev3/spinta/datasets/backends/dataframe/components.py +14 -0
  100. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/dataframe/ufuncs/query/components.py +5 -2
  101. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/dataframe/ufuncs/query/ufuncs.py +56 -6
  102. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/helpers.py +72 -6
  103. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/helpers.py +9 -0
  104. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/components.py +7 -0
  105. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/helpers.py +10 -0
  106. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/ufuncs/query/components.py +8 -0
  107. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/ufuncs/query/ufuncs.py +10 -0
  108. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/components.py +7 -0
  109. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/helpers.py +12 -0
  110. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/ufuncs/query/components.py +8 -0
  111. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/ufuncs/query/ufuncs.py +10 -0
  112. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/components.py +7 -0
  113. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/helpers.py +10 -0
  114. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/ufuncs/query/components.py +8 -0
  115. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/ufuncs/query/ufuncs.py +10 -0
  116. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/components.py +7 -0
  117. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/ufuncs/query/components.py +9 -0
  118. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/ufuncs/query/ufuncs.py +16 -0
  119. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/components.py +7 -0
  120. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/helpers.py +15 -0
  121. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/ufuncs/query/components.py +8 -0
  122. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/ufuncs/query/ufuncs.py +57 -0
  123. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/components.py +7 -0
  124. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/helpers.py +10 -0
  125. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/ufuncs/query/components.py +8 -0
  126. spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/ufuncs/query/ufuncs.py +23 -0
  127. spinta-0.2.dev3/spinta/datasets/backends/sql/commands/cast.py +238 -0
  128. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/column.py +10 -1
  129. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/read.py +9 -11
  130. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/components.py +3 -0
  131. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/components.py +1 -1
  132. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/query/components.py +64 -5
  133. spinta-0.2.dev3/spinta/datasets/backends/sql/ufuncs/query/helpers.py +78 -0
  134. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/query/ufuncs.py +286 -128
  135. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/result/ufuncs.py +0 -13
  136. spinta-0.2.dev3/spinta/datasets/backends/wsdl/commads/read.py +26 -0
  137. spinta-0.2.dev3/spinta/datasets/backends/wsdl/components.py +26 -0
  138. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/commands/link.py +4 -0
  139. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/components.py +9 -4
  140. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/helpers.py +1 -1
  141. spinta-0.2.dev3/spinta/datasets/inspect/commands/manifest.py +57 -0
  142. spinta-0.2.dev1/spinta/datasets/inspect/helpers.py → spinta-0.2.dev3/spinta/datasets/inspect/commands/merge.py +6 -383
  143. spinta-0.2.dev3/spinta/datasets/inspect/components.py +35 -0
  144. spinta-0.2.dev3/spinta/datasets/inspect/helpers.py +355 -0
  145. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/keymaps/components.py +1 -0
  146. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/keymaps/sqlalchemy.py +1 -0
  147. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/keymaps/sync.py +36 -31
  148. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/enum/commands.py +30 -7
  149. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/enum/components.py +17 -1
  150. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/enum/helpers.py +6 -0
  151. spinta-0.2.dev3/spinta/dimensions/enum/ufuncs.py +27 -0
  152. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/exceptions.py +142 -29
  153. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/ascii/commands.py +2 -1
  154. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/ascii/components.py +2 -1
  155. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/csv/commands.py +1 -1
  156. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/helpers.py +4 -3
  157. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/html/commands.py +25 -2
  158. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/json/commands.py +2 -1
  159. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/jsonlines/commands.py +2 -1
  160. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/rdf/commands.py +31 -12
  161. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/xlsx/commands.py +1 -1
  162. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/helpers.py +1 -1
  163. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/auth.py +2 -1
  164. spinta-0.2.dev3/spinta/manifests/commands/migrate.py +17 -0
  165. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/read.py +2 -1
  166. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/components.py +1 -2
  167. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/dict/components.py +1 -1
  168. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/dict/helpers.py +1 -1
  169. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/helpers.py +1 -2
  170. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/auth.py +2 -2
  171. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/read.py +2 -1
  172. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/helpers.py +41 -27
  173. spinta-0.2.dev3/spinta/manifests/open_api/__init__.py +0 -0
  174. spinta-0.2.dev3/spinta/manifests/open_api/commands/__init__.py +0 -0
  175. spinta-0.2.dev3/spinta/manifests/open_api/commands/configure.py +15 -0
  176. spinta-0.2.dev3/spinta/manifests/open_api/commands/load.py +48 -0
  177. spinta-0.2.dev3/spinta/manifests/open_api/components.py +10 -0
  178. spinta-0.2.dev3/spinta/manifests/open_api/helpers.py +112 -0
  179. spinta-0.2.dev3/spinta/manifests/sql/__init__.py +0 -0
  180. spinta-0.2.dev3/spinta/manifests/sql/commands/__init__.py +0 -0
  181. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/sql/helpers.py +6 -4
  182. spinta-0.2.dev3/spinta/manifests/tabular/__init__.py +0 -0
  183. spinta-0.2.dev3/spinta/manifests/tabular/commands/__init__.py +0 -0
  184. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/components.py +37 -0
  185. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/constants.py +7 -2
  186. spinta-0.2.dev3/spinta/manifests/tabular/formats/__init__.py +0 -0
  187. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/helpers.py +438 -242
  188. spinta-0.2.dev3/spinta/manifests/xsd/__init__.py +0 -0
  189. spinta-0.2.dev3/spinta/manifests/xsd/commands/__init__.py +0 -0
  190. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/helpers.py +1 -1
  191. spinta-0.2.dev3/spinta/manifests/xsd2/__init__.py +0 -0
  192. spinta-0.2.dev3/spinta/manifests/xsd2/commands/__init__.py +0 -0
  193. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd2/helpers.py +4 -3
  194. spinta-0.2.dev3/spinta/manifests/yaml/__init__.py +0 -0
  195. spinta-0.2.dev3/spinta/manifests/yaml/commands/__init__.py +0 -0
  196. spinta-0.2.dev3/spinta/methods.py +0 -0
  197. spinta-0.2.dev3/spinta/migrations/schema/__init__.py +0 -0
  198. spinta-0.2.dev3/spinta/naming/__init__.py +0 -0
  199. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/nodes.py +20 -9
  200. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/renderer.py +2 -1
  201. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/spyna.py +6 -1
  202. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/client.py +20 -4
  203. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/datasets.py +0 -8
  204. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/request.py +1 -1
  205. spinta-0.2.dev3/spinta/testing/types/__init__.py +0 -0
  206. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/utils.py +13 -0
  207. spinta-0.2.dev3/spinta/types/__init__.py +0 -0
  208. spinta-0.2.dev3/spinta/types/array/__init__.py +0 -0
  209. spinta-0.2.dev3/spinta/types/array/check.py +54 -0
  210. spinta-0.2.dev3/spinta/types/array/link.py +92 -0
  211. spinta-0.2.dev3/spinta/types/array/resolve.py +10 -0
  212. spinta-0.2.dev3/spinta/types/backref/__init__.py +0 -0
  213. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/datatype.py +27 -0
  214. spinta-0.2.dev3/spinta/types/denorm/__init__.py +0 -0
  215. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/denorm/check.py +1 -6
  216. spinta-0.2.dev3/spinta/types/file/__init__.py +0 -0
  217. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/file/helpers.py +2 -1
  218. spinta-0.2.dev3/spinta/types/geometry/__init__.py +0 -0
  219. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/helpers.py +1 -0
  220. spinta-0.2.dev3/spinta/types/inherit/__init__.py +0 -0
  221. spinta-0.2.dev3/spinta/types/inherit/check.py +16 -0
  222. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/model.py +51 -26
  223. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/namespace.py +8 -4
  224. spinta-0.2.dev3/spinta/types/object/__init__.py +0 -0
  225. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/object/link.py +1 -1
  226. spinta-0.2.dev3/spinta/types/partial/__init__.py +0 -0
  227. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/partial/link.py +8 -2
  228. spinta-0.2.dev3/spinta/types/ref/__init__.py +0 -0
  229. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/ref/link.py +3 -1
  230. spinta-0.2.dev3/spinta/types/ref/resolve.py +10 -0
  231. spinta-0.2.dev3/spinta/types/text/__init__.py +0 -0
  232. spinta-0.2.dev3/spinta/ufuncs/__init__.py +0 -0
  233. spinta-0.2.dev3/spinta/ufuncs/changebase/__init__.py +0 -0
  234. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/common.py +11 -10
  235. spinta-0.2.dev3/spinta/ufuncs/linkbuilder/__init__.py +0 -0
  236. spinta-0.2.dev3/spinta/ufuncs/linkbuilder/components.py +13 -0
  237. spinta-0.2.dev3/spinta/ufuncs/linkbuilder/ufuncs.py +59 -0
  238. spinta-0.2.dev3/spinta/ufuncs/loadbuilder/__init__.py +0 -0
  239. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/loadbuilder/components.py +0 -2
  240. spinta-0.2.dev3/spinta/ufuncs/propertyresolver/__init__.py +0 -0
  241. spinta-0.2.dev3/spinta/ufuncs/propertyresolver/components.py +20 -0
  242. spinta-0.2.dev3/spinta/ufuncs/propertyresolver/ufuncs.py +329 -0
  243. spinta-0.2.dev3/spinta/ufuncs/querybuilder/__init__.py +0 -0
  244. {spinta-0.2.dev1/spinta/ufuncs/basequerybuilder → spinta-0.2.dev3/spinta/ufuncs/querybuilder}/components.py +42 -15
  245. {spinta-0.2.dev1/spinta/ufuncs/basequerybuilder → spinta-0.2.dev3/spinta/ufuncs/querybuilder}/helpers.py +47 -6
  246. spinta-0.2.dev3/spinta/ufuncs/querybuilder/ufuncs.py +537 -0
  247. spinta-0.2.dev3/spinta/ufuncs/requestparamsbuilder/__init__.py +0 -0
  248. spinta-0.2.dev3/spinta/ufuncs/requestparamsbuilder/components.py +18 -0
  249. spinta-0.2.dev3/spinta/ufuncs/requestparamsbuilder/ufuncs.py +169 -0
  250. spinta-0.2.dev3/spinta/ufuncs/resultbuilder/__init__.py +0 -0
  251. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/resultbuilder/components.py +10 -0
  252. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/resultbuilder/helpers.py +17 -9
  253. spinta-0.2.dev3/spinta/ufuncs/resultbuilder/ufuncs.py +58 -0
  254. spinta-0.2.dev3/spinta/ufuncs/summaryenv/__init__.py +0 -0
  255. spinta-0.2.dev3/spinta/units/__init__.py +0 -0
  256. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/urlparams.py +7 -4
  257. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/data.py +4 -3
  258. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/enums.py +6 -3
  259. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/nestedstruct.py +38 -1
  260. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/response.py +13 -1
  261. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/sqlite.py +8 -6
  262. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/url.py +3 -0
  263. spinta-0.2.dev1/spinta/backends/postgresql/commands/migrate/property.py +0 -25
  264. spinta-0.2.dev1/spinta/backends/postgresql/commands/migrate/types/geometry.py +0 -20
  265. spinta-0.2.dev1/spinta/backends/postgresql/ufuncs/result/init.py +0 -12
  266. spinta-0.2.dev1/spinta/cli/helpers/export/helpers.py +0 -106
  267. spinta-0.2.dev1/spinta/cli/helpers/migrate.py +0 -117
  268. spinta-0.2.dev1/spinta/cli/helpers/upgrade/components.py +0 -32
  269. spinta-0.2.dev1/spinta/cli/helpers/upgrade/helpers.py +0 -12
  270. spinta-0.2.dev1/spinta/cli/helpers/upgrade/scripts.py +0 -66
  271. spinta-0.2.dev1/spinta/core/enums.py +0 -41
  272. spinta-0.2.dev1/spinta/datasets/backends/dataframe/components.py +0 -36
  273. spinta-0.2.dev1/spinta/datasets/backends/sql/helpers.py +0 -99
  274. spinta-0.2.dev1/spinta/datasets/backends/sql/ufuncs/result/init.py +0 -12
  275. spinta-0.2.dev1/spinta/dimensions/enum/ufuncs.py +0 -9
  276. spinta-0.2.dev1/spinta/manifests/commands/migrate.py +0 -31
  277. spinta-0.2.dev1/spinta/types/array/check.py +0 -9
  278. spinta-0.2.dev1/spinta/types/array/link.py +0 -26
  279. spinta-0.2.dev1/spinta/ufuncs/basequerybuilder/ufuncs.py +0 -494
  280. spinta-0.2.dev1/spinta/ufuncs/requestparamsbuilder/components.py +0 -14
  281. spinta-0.2.dev1/spinta/ufuncs/requestparamsbuilder/ufuncs.py +0 -77
  282. spinta-0.2.dev1/spinta/ufuncs/resultbuilder/init.py +0 -12
  283. spinta-0.2.dev1/spinta/ufuncs/resultbuilder/ufuncs.py +0 -7
  284. {spinta-0.2.dev1 → spinta-0.2.dev3}/LICENSE +0 -0
  285. {spinta-0.2.dev1 → spinta-0.2.dev3}/README.rst +0 -0
  286. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/__init__.py +0 -0
  287. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/__main__.py +0 -0
  288. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/accesslog/file.py +0 -0
  289. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/accesslog/python.py +0 -0
  290. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/api/inspect.py +0 -0
  291. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/asgi.py +0 -0
  292. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/__init__.py +0 -0
  293. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/__init__.py +0 -0
  294. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/bootstrap.py +0 -0
  295. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/changes.py +0 -0
  296. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/decode.py +0 -0
  297. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/encode.py +0 -0
  298. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/init.py +0 -0
  299. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/load.py +0 -0
  300. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/migrate.py +0 -0
  301. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/read.py +0 -0
  302. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/wait.py +0 -0
  303. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/commands/wipe.py +0 -0
  304. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/fs/components.py +0 -0
  305. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/__init__.py +0 -0
  306. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/__init__.py +0 -0
  307. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/auth.py +0 -0
  308. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/bootstrap.py +0 -0
  309. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/changes.py +0 -0
  310. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/check.py +0 -0
  311. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/encode.py +0 -0
  312. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/init.py +0 -0
  313. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/load.py +0 -0
  314. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/manifest.py +0 -0
  315. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/read.py +0 -0
  316. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/wait.py +0 -0
  317. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/wipe.py +0 -0
  318. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/commands/write.py +0 -0
  319. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/memory/components.py +0 -0
  320. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/__init__.py +0 -0
  321. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/__init__.py +0 -0
  322. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/bootstrap.py +0 -0
  323. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/changes.py +0 -0
  324. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/freeze.py +0 -0
  325. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/init.py +0 -0
  326. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/load.py +1 -1
  327. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/migrate.py +0 -0
  328. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/wait.py +0 -0
  329. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/wipe.py +0 -0
  330. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/commands/write.py +0 -0
  331. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/__init__.py +0 -0
  332. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/array/__init__.py +0 -0
  333. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/file/__init__.py +0 -0
  334. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/types/object/__init__.py +0 -0
  335. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/mongo/ufuncs/__init__.py +0 -0
  336. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/__init__.py +0 -0
  337. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/__init__.py +0 -0
  338. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/bootstrap.py +0 -0
  339. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/changes.py +0 -0
  340. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/init.py +0 -0
  341. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/load.py +0 -0
  342. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/read.py +0 -0
  343. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/wait.py +0 -0
  344. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/commands/wipe.py +0 -0
  345. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/nobackend/components.py +0 -0
  346. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/__init__.py +0 -0
  347. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/__init__.py +0 -0
  348. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/bootstrap.py +0 -0
  349. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/column.py +0 -0
  350. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/freeze.py +0 -0
  351. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/link.py +0 -0
  352. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/load.py +2 -2
  353. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/manifest.py +0 -0
  354. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/__init__.py +0 -0
  355. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/constants.py +0 -0
  356. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/migrate/types/__init__.py +0 -0
  357. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/summary.py +0 -0
  358. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/validate.py +2 -2
  359. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/commands/wait.py +0 -0
  360. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/constants.py +0 -0
  361. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/files.py +0 -0
  362. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/__init__.py +0 -0
  363. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/changes.py +0 -0
  364. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/extractors.py +0 -0
  365. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/manifest.py +0 -0
  366. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/helpers/migrate/__init__.py +0 -0
  367. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/sqlalchemy.py +0 -0
  368. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/__init__.py +0 -0
  369. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array/__init__.py +0 -0
  370. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array/freeze.py +0 -0
  371. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array/wipe.py +0 -0
  372. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array_backref/__init__.py +0 -0
  373. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/array_backref/init.py +0 -0
  374. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/backref/__init__.py +0 -0
  375. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/backref/init.py +0 -0
  376. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/denorm/init.py +0 -0
  377. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/external_ref/init.py +0 -0
  378. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/file/__init__.py +0 -0
  379. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/file/freeze.py +0 -0
  380. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/file/init.py +0 -0
  381. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/file/read.py +0 -0
  382. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/geometry/__init__.py +0 -0
  383. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/geometry/init.py +0 -0
  384. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/geometry/write.py +0 -0
  385. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/object/__init__.py +0 -0
  386. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/object/freeze.py +0 -0
  387. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/object/init.py +0 -0
  388. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/object/read.py +0 -0
  389. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/object/wipe.py +0 -0
  390. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/ref/__init__.py +0 -0
  391. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/ref/freeze.py +0 -0
  392. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/ref/init.py +0 -0
  393. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/ref/validate.py +0 -0
  394. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/text/__init__.py +0 -0
  395. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/types/text/init.py +0 -0
  396. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/__init__.py +0 -0
  397. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/components.py +0 -0
  398. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/query/__init__.py +0 -0
  399. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/result/__init__.py +0 -0
  400. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/result/components.py +0 -0
  401. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/result/ufuncs.py +0 -0
  402. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/postgresql/ufuncs/ufuncs.py +0 -0
  403. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/backends/types/__init__.py +0 -0
  404. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/__init__.py +0 -0
  405. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/auth.py +0 -0
  406. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/__init__.py +0 -0
  407. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/auth.py +0 -0
  408. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/errors.py +0 -0
  409. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/__init__.py +0 -0
  410. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/backends/__init__.py +0 -0
  411. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/backends/postgresql/__init__.py +0 -0
  412. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/backends/postgresql/components.py +0 -0
  413. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/export/components.py +0 -0
  414. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/manifest.py +0 -0
  415. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/__init__.py +0 -0
  416. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/components.py +0 -0
  417. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/delete.py +0 -0
  418. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/error.py +0 -0
  419. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/state.py +0 -0
  420. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/push/write.py +0 -0
  421. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/typer.py +0 -0
  422. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/helpers/upgrade/__init__.py +0 -0
  423. {spinta-0.2.dev1/spinta/core → spinta-0.2.dev3/spinta/cli/helpers/upgrade/scripts}/__init__.py +0 -0
  424. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/init.py +0 -0
  425. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/cli/pull.py +0 -0
  426. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/client.py +0 -0
  427. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/auth.py +0 -0
  428. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/helpers.py +0 -0
  429. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/search.py +0 -0
  430. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/commands/version.py +0 -0
  431. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/config.yml +0 -0
  432. {spinta-0.2.dev1/spinta/datasets → spinta-0.2.dev3/spinta/core}/__init__.py +0 -0
  433. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/core/access.py +0 -0
  434. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/core/context.py +0 -0
  435. {spinta-0.2.dev1/spinta/datasets/backends → spinta-0.2.dev3/spinta/datasets}/__init__.py +0 -0
  436. {spinta-0.2.dev1/spinta/datasets/backends/dataframe → spinta-0.2.dev3/spinta/datasets/backends}/__init__.py +0 -0
  437. {spinta-0.2.dev1/spinta/datasets/backends/dataframe/commands → spinta-0.2.dev3/spinta/datasets/backends/dataframe}/__init__.py +0 -0
  438. {spinta-0.2.dev1/spinta/datasets/backends/dataframe/ufuncs → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends}/__init__.py +0 -0
  439. {spinta-0.2.dev1/spinta/datasets/backends/dataframe/ufuncs/query → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/csv}/__init__.py +0 -0
  440. {spinta-0.2.dev1/spinta/datasets/backends/notimpl → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/json}/__init__.py +0 -0
  441. {spinta-0.2.dev1/spinta/datasets/backends/notimpl/commands → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/memory}/__init__.py +0 -0
  442. {spinta-0.2.dev1/spinta/datasets/backends/sql → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/soap}/__init__.py +0 -0
  443. {spinta-0.2.dev1/spinta/datasets/backends/sql → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/soap}/commands/__init__.py +0 -0
  444. {spinta-0.2.dev1/spinta/datasets/backends/sql/ufuncs → spinta-0.2.dev3/spinta/datasets/backends/dataframe/backends/xml}/__init__.py +0 -0
  445. {spinta-0.2.dev1/spinta/datasets/backends/sql/ufuncs/query → spinta-0.2.dev3/spinta/datasets/backends/dataframe/commands}/__init__.py +0 -0
  446. {spinta-0.2.dev1/spinta/datasets/backends/sql/ufuncs/result → spinta-0.2.dev3/spinta/datasets/backends/dataframe/ufuncs}/__init__.py +0 -0
  447. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/dataframe/ufuncs/components.py +0 -0
  448. {spinta-0.2.dev1/spinta/datasets/backends/sqldump → spinta-0.2.dev3/spinta/datasets/backends/dataframe/ufuncs/query}/__init__.py +0 -0
  449. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/dataframe/ufuncs/ufuncs.py +0 -0
  450. {spinta-0.2.dev1/spinta/datasets/backends/sqldump/commands → spinta-0.2.dev3/spinta/datasets/backends/notimpl}/__init__.py +0 -0
  451. {spinta-0.2.dev1/spinta/datasets/backends/sqldump/ufuncs → spinta-0.2.dev3/spinta/datasets/backends/notimpl/commands}/__init__.py +0 -0
  452. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/notimpl/commands/load.py +0 -0
  453. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/notimpl/commands/wait.py +0 -0
  454. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/notimpl/components.py +0 -0
  455. {spinta-0.2.dev1/spinta/datasets/commands → spinta-0.2.dev3/spinta/datasets/backends/sql}/__init__.py +0 -0
  456. {spinta-0.2.dev1/spinta/datasets/inspect → spinta-0.2.dev3/spinta/datasets/backends/sql/backends}/__init__.py +0 -0
  457. {spinta-0.2.dev1/spinta/datasets/keymaps → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb}/__init__.py +0 -0
  458. {spinta-0.2.dev1/spinta/dimensions → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/ufuncs}/__init__.py +0 -0
  459. {spinta-0.2.dev1/spinta/dimensions/comments → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mariadb/ufuncs/query}/__init__.py +0 -0
  460. {spinta-0.2.dev1/spinta/dimensions/enum → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql}/__init__.py +0 -0
  461. {spinta-0.2.dev1/spinta/dimensions/lang → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/ufuncs}/__init__.py +0 -0
  462. {spinta-0.2.dev1/spinta/dimensions/param → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mssql/ufuncs/query}/__init__.py +0 -0
  463. {spinta-0.2.dev1/spinta/dimensions/prefix → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql}/__init__.py +0 -0
  464. {spinta-0.2.dev1/spinta/dimensions/prefix/commands → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/ufuncs}/__init__.py +0 -0
  465. {spinta-0.2.dev1/spinta/formats → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/mysql/ufuncs/query}/__init__.py +0 -0
  466. {spinta-0.2.dev1/spinta/formats/ascii → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle}/__init__.py +0 -0
  467. /spinta-0.2.dev1/spinta/datasets/commands/inspect.py → /spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/helpers.py +0 -0
  468. {spinta-0.2.dev1/spinta/formats/csv → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/ufuncs}/__init__.py +0 -0
  469. {spinta-0.2.dev1/spinta/formats/html → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/oracle/ufuncs/query}/__init__.py +0 -0
  470. {spinta-0.2.dev1/spinta/formats/json → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql}/__init__.py +0 -0
  471. {spinta-0.2.dev1/spinta/formats/jsonlines → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/ufuncs}/__init__.py +0 -0
  472. {spinta-0.2.dev1/spinta/formats/xlsx → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/postgresql/ufuncs/query}/__init__.py +0 -0
  473. {spinta-0.2.dev1/spinta/hacks → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite}/__init__.py +0 -0
  474. {spinta-0.2.dev1/spinta/manifests → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/ufuncs}/__init__.py +0 -0
  475. {spinta-0.2.dev1/spinta/manifests/backend → spinta-0.2.dev3/spinta/datasets/backends/sql/backends/sqlite/ufuncs/query}/__init__.py +0 -0
  476. {spinta-0.2.dev1/spinta/manifests/backend → spinta-0.2.dev3/spinta/datasets/backends/sql}/commands/__init__.py +0 -0
  477. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/bootstrap.py +0 -0
  478. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/init.py +0 -0
  479. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/load.py +0 -0
  480. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/commands/wait.py +0 -0
  481. /spinta-0.2.dev1/spinta/manifests/commands/__init__.py → /spinta-0.2.dev3/spinta/datasets/backends/sql/helpers.py +0 -0
  482. {spinta-0.2.dev1/spinta/manifests/dict → spinta-0.2.dev3/spinta/datasets/backends/sql/ufuncs}/__init__.py +0 -0
  483. {spinta-0.2.dev1/spinta/manifests/dict/commands → spinta-0.2.dev3/spinta/datasets/backends/sql/ufuncs/query}/__init__.py +0 -0
  484. {spinta-0.2.dev1/spinta/manifests/internal → spinta-0.2.dev3/spinta/datasets/backends/sql/ufuncs/result}/__init__.py +0 -0
  485. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/result/components.py +0 -0
  486. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sql/ufuncs/ufuncs.py +0 -0
  487. {spinta-0.2.dev1/spinta/manifests/internal/commands → spinta-0.2.dev3/spinta/datasets/backends/sqldump}/__init__.py +0 -0
  488. {spinta-0.2.dev1/spinta/manifests/internal_sql → spinta-0.2.dev3/spinta/datasets/backends/sqldump/commands}/__init__.py +0 -0
  489. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/commands/inspect.py +0 -0
  490. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/commands/load.py +0 -0
  491. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/commands/wait.py +0 -0
  492. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/components.py +0 -0
  493. {spinta-0.2.dev1/spinta/manifests/internal_sql/commands → spinta-0.2.dev3/spinta/datasets/backends/sqldump/ufuncs}/__init__.py +0 -0
  494. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/ufuncs/components.py +0 -0
  495. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/backends/sqldump/ufuncs/ufuncs.py +0 -0
  496. {spinta-0.2.dev1/spinta/manifests/memory → spinta-0.2.dev3/spinta/datasets/backends/wsdl}/__init__.py +0 -0
  497. {spinta-0.2.dev1/spinta/manifests/memory/commands → spinta-0.2.dev3/spinta/datasets/backends/wsdl/commads}/__init__.py +0 -0
  498. {spinta-0.2.dev1/spinta/manifests/mermaid → spinta-0.2.dev3/spinta/datasets/commands}/__init__.py +0 -0
  499. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/commands/check.py +0 -0
  500. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/commands/error.py +0 -0
  501. /spinta-0.2.dev1/spinta/manifests/sql/__init__.py → /spinta-0.2.dev3/spinta/datasets/commands/inspect.py +0 -0
  502. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/commands/load.py +0 -0
  503. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/commands/wipe.py +0 -0
  504. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/enums.py +0 -0
  505. {spinta-0.2.dev1/spinta/manifests/sql/commands → spinta-0.2.dev3/spinta/datasets/inspect}/__init__.py +0 -0
  506. {spinta-0.2.dev1/spinta/manifests/tabular → spinta-0.2.dev3/spinta/datasets/inspect/commands}/__init__.py +0 -0
  507. {spinta-0.2.dev1/spinta/manifests/tabular/commands → spinta-0.2.dev3/spinta/datasets/keymaps}/__init__.py +0 -0
  508. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/datasets/utils.py +0 -0
  509. {spinta-0.2.dev1/spinta/manifests/tabular/formats → spinta-0.2.dev3/spinta/dimensions}/__init__.py +0 -0
  510. {spinta-0.2.dev1/spinta/manifests/xsd → spinta-0.2.dev3/spinta/dimensions/comments}/__init__.py +0 -0
  511. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/comments/components.py +0 -0
  512. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/comments/helpers.py +0 -0
  513. {spinta-0.2.dev1/spinta/manifests/xsd/commands → spinta-0.2.dev3/spinta/dimensions/enum}/__init__.py +0 -0
  514. {spinta-0.2.dev1/spinta/manifests/xsd2 → spinta-0.2.dev3/spinta/dimensions/lang}/__init__.py +0 -0
  515. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/lang/components.py +0 -0
  516. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/lang/helpers.py +0 -0
  517. {spinta-0.2.dev1/spinta/manifests/xsd2/commands → spinta-0.2.dev3/spinta/dimensions/param}/__init__.py +0 -0
  518. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/param/components.py +0 -0
  519. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/param/helpers.py +0 -0
  520. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/param/ufuncs.py +0 -0
  521. {spinta-0.2.dev1/spinta/manifests/yaml → spinta-0.2.dev3/spinta/dimensions/prefix}/__init__.py +0 -0
  522. {spinta-0.2.dev1/spinta/manifests/yaml → spinta-0.2.dev3/spinta/dimensions/prefix}/commands/__init__.py +0 -0
  523. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/prefix/commands/load.py +0 -0
  524. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/prefix/components.py +0 -0
  525. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dimensions/prefix/helpers.py +0 -0
  526. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/dispatcher.py +0 -0
  527. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/fetcher.py +0 -0
  528. {spinta-0.2.dev1/spinta/migrations/schema → spinta-0.2.dev3/spinta/formats}/__init__.py +0 -0
  529. {spinta-0.2.dev1/spinta/naming → spinta-0.2.dev3/spinta/formats/ascii}/__init__.py +0 -0
  530. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/ascii/helpers.py +0 -0
  531. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/components.py +0 -0
  532. {spinta-0.2.dev1/spinta/testing/types → spinta-0.2.dev3/spinta/formats/csv}/__init__.py +0 -0
  533. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/csv/components.py +0 -0
  534. {spinta-0.2.dev1/spinta/types → spinta-0.2.dev3/spinta/formats/html}/__init__.py +0 -0
  535. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/html/components.py +0 -0
  536. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/html/helpers.py +0 -0
  537. {spinta-0.2.dev1/spinta/types/array → spinta-0.2.dev3/spinta/formats/json}/__init__.py +0 -0
  538. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/json/components.py +0 -0
  539. {spinta-0.2.dev1/spinta/types/backref → spinta-0.2.dev3/spinta/formats/jsonlines}/__init__.py +0 -0
  540. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/jsonlines/components.py +0 -0
  541. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/rdf/components.py +0 -0
  542. {spinta-0.2.dev1/spinta/types/file → spinta-0.2.dev3/spinta/formats/xlsx}/__init__.py +0 -0
  543. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/formats/xlsx/components.py +0 -0
  544. {spinta-0.2.dev1/spinta/types/geometry → spinta-0.2.dev3/spinta/hacks}/__init__.py +0 -0
  545. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/hacks/spyna.py +0 -0
  546. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/hacks/urlparams.py +0 -0
  547. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/logging_config.py +0 -0
  548. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifest/_ns.yml +0 -0
  549. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifest/_schema/version.yml +0 -0
  550. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifest/_schema.yml +0 -0
  551. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifest/_txn.yml +0 -0
  552. {spinta-0.2.dev1/spinta/types/object → spinta-0.2.dev3/spinta/manifests}/__init__.py +0 -0
  553. {spinta-0.2.dev1/spinta/types/partial → spinta-0.2.dev3/spinta/manifests/backend}/__init__.py +0 -0
  554. {spinta-0.2.dev1/spinta/types/ref → spinta-0.2.dev3/spinta/manifests/backend/commands}/__init__.py +0 -0
  555. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/bootstrap.py +0 -0
  556. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/configure.py +0 -0
  557. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/freeze.py +0 -0
  558. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/load.py +0 -0
  559. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/manifest.py +0 -0
  560. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/migrate.py +0 -0
  561. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/commands/sync.py +0 -0
  562. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/backend/components.py +0 -0
  563. {spinta-0.2.dev1/spinta/types/text → spinta-0.2.dev3/spinta/manifests/commands}/__init__.py +0 -0
  564. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/check.py +0 -0
  565. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/error.py +0 -0
  566. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/init.py +0 -0
  567. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/inspect.py +0 -0
  568. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/link.py +0 -0
  569. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/load.py +0 -0
  570. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/commands/manifest.py +0 -0
  571. {spinta-0.2.dev1/spinta/ufuncs → spinta-0.2.dev3/spinta/manifests/dict}/__init__.py +0 -0
  572. {spinta-0.2.dev1/spinta/ufuncs/basequerybuilder → spinta-0.2.dev3/spinta/manifests/dict/commands}/__init__.py +0 -0
  573. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/dict/commands/configure.py +0 -0
  574. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/dict/commands/load.py +0 -0
  575. {spinta-0.2.dev1/spinta/ufuncs/changebase → spinta-0.2.dev3/spinta/manifests/internal}/__init__.py +0 -0
  576. {spinta-0.2.dev1/spinta/ufuncs/loadbuilder → spinta-0.2.dev3/spinta/manifests/internal/commands}/__init__.py +0 -0
  577. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal/commands/configure.py +0 -0
  578. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal/commands/load.py +0 -0
  579. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal/components.py +0 -0
  580. {spinta-0.2.dev1/spinta/ufuncs/requestparamsbuilder → spinta-0.2.dev3/spinta/manifests/internal_sql}/__init__.py +0 -0
  581. {spinta-0.2.dev1/spinta/ufuncs/resultbuilder → spinta-0.2.dev3/spinta/manifests/internal_sql/commands}/__init__.py +0 -0
  582. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/backend.py +0 -0
  583. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/bootstrap.py +0 -0
  584. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/configure.py +0 -0
  585. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/load.py +0 -0
  586. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/commands/manifest.py +0 -0
  587. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/internal_sql/components.py +0 -0
  588. {spinta-0.2.dev1/spinta/ufuncs/summaryenv → spinta-0.2.dev3/spinta/manifests/memory}/__init__.py +0 -0
  589. {spinta-0.2.dev1/spinta/units → spinta-0.2.dev3/spinta/manifests/memory/commands}/__init__.py +0 -0
  590. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/memory/commands/configure.py +0 -0
  591. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/memory/commands/load.py +0 -0
  592. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/memory/components.py +0 -0
  593. /spinta-0.2.dev1/spinta/methods.py → /spinta-0.2.dev3/spinta/manifests/mermaid/__init__.py +0 -0
  594. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/mermaid/components.py +0 -0
  595. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/mermaid/helpers.py +0 -0
  596. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/rdf/commands/bootstrap.py +0 -0
  597. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/rdf/commands/configure.py +0 -0
  598. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/rdf/commands/load.py +0 -0
  599. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/rdf/components.py +0 -0
  600. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/rdf/helpers.py +0 -0
  601. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/sql/commands/configure.py +0 -0
  602. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/sql/commands/load.py +0 -0
  603. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/sql/components.py +0 -0
  604. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/commands/bootstrap.py +0 -0
  605. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/commands/configure.py +0 -0
  606. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/commands/load.py +0 -0
  607. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/tabular/formats/gsheets.py +0 -0
  608. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/commands/configure.py +0 -0
  609. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/commands/load.py +0 -0
  610. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/compare_xsd_to_dsa.py +0 -0
  611. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/components.py +0 -0
  612. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/download_xsd_rc.py +0 -0
  613. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd/tryout.py +0 -0
  614. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd2/commands/configure.py +0 -0
  615. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd2/commands/load.py +0 -0
  616. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/xsd2/components.py +0 -0
  617. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/bootstrap.py +0 -0
  618. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/configure.py +0 -0
  619. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/freeze.py +0 -0
  620. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/load.py +0 -0
  621. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/manifest.py +0 -0
  622. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/migrate.py +0 -0
  623. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/commands/sync.py +0 -0
  624. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/components.py +0 -0
  625. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/manifests/yaml/helpers.py +0 -0
  626. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/middlewares.py +0 -0
  627. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/migrations/__init__.py +0 -0
  628. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/migrations/schema/alembic.py +0 -0
  629. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/naming/components.py +0 -0
  630. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/naming/helpers.py +0 -0
  631. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/naming/ufuncts.py +0 -0
  632. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/templates/base.html +0 -0
  633. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/templates/data.html +0 -0
  634. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/templates/error.html +0 -0
  635. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/templates/form.html +0 -0
  636. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/__init__.py +0 -0
  637. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/cli.py +0 -0
  638. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/config.py +0 -0
  639. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/context.py +0 -0
  640. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/csv.py +0 -0
  641. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/data.py +0 -0
  642. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/dtypes.py +0 -0
  643. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/manifest.py +0 -0
  644. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/push.py +0 -0
  645. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/pytest.py +0 -0
  646. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/tabular.py +0 -0
  647. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/types/geometry.py +0 -0
  648. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/testing/ufuncs.py +0 -0
  649. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/backref/link.py +0 -0
  650. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/command.py +0 -0
  651. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/config.py +0 -0
  652. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/denorm/link.py +0 -0
  653. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/file/components.py +0 -0
  654. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/file/decode.py +0 -0
  655. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/geometry/components.py +0 -0
  656. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/geometry/constants.py +0 -0
  657. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/geometry/helpers.py +0 -0
  658. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/geometry/load.py +0 -0
  659. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/object/check.py +0 -0
  660. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/ref/check.py +0 -0
  661. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/store.py +0 -0
  662. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/text/check.py +0 -0
  663. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/text/components.py +0 -0
  664. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/text/helpers.py +0 -0
  665. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/types/text/load.py +0 -0
  666. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/typing.py +0 -0
  667. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/binds.py +0 -0
  668. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/changebase/components.py +0 -0
  669. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/changebase/helpers.py +0 -0
  670. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/changebase/ufuncs.py +0 -0
  671. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/components.py +0 -0
  672. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/helpers.py +0 -0
  673. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/loadbuilder/helpers.py +0 -0
  674. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/loadbuilder/ufuncs.py +0 -0
  675. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/requestparamsbuilder/helpers.py +0 -0
  676. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/summaryenv/components.py +0 -0
  677. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/ufuncs/summaryenv/ufuncs.py +0 -0
  678. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/units/components.py +0 -0
  679. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/units/helpers.py +0 -0
  680. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/__init__.py +0 -0
  681. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/aiotools.py +0 -0
  682. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/changes.py +0 -0
  683. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/config.py +0 -0
  684. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/encoding.py +0 -0
  685. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/errors.py +0 -0
  686. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/functools.py +0 -0
  687. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/idgen.py +0 -0
  688. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/imports.py +0 -0
  689. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/itertools.py +0 -0
  690. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/json.py +0 -0
  691. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/naming.py +0 -0
  692. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/nin.py +0 -0
  693. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/passwords.py +0 -0
  694. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/path.py +0 -0
  695. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/refs.py +0 -0
  696. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/schema.py +0 -0
  697. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/scopes.py +0 -0
  698. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/sqlalchemy.py +0 -0
  699. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/starlette.py +0 -0
  700. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/streams.py +0 -0
  701. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/tree.py +0 -0
  702. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/types.py +0 -0
  703. {spinta-0.2.dev1 → spinta-0.2.dev3}/spinta/utils/units.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spinta
3
- Version: 0.2.dev1
3
+ Version: 0.2.dev3
4
4
  Summary: A platform for describing, extracting, transforming, loading and serving open data.
5
5
  Home-page: https://github.com/atviriduomenys/spinta
6
6
  License: MIT
@@ -20,22 +20,27 @@ Classifier: Programming Language :: Python :: 3.9
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Topic :: Database
24
25
  Classifier: Topic :: Database :: Database Engines/Servers
25
26
  Classifier: Topic :: Database :: Front-Ends
27
+ Provides-Extra: all
28
+ Provides-Extra: http
29
+ Provides-Extra: migrations
26
30
  Requires-Dist: GeoAlchemy2
27
31
  Requires-Dist: Shapely
28
32
  Requires-Dist: XlsxWriter
29
33
  Requires-Dist: aiofiles
30
34
  Requires-Dist: aiohttp
31
- Requires-Dist: alembic (>=1.11.0,<1.12.0)
35
+ Requires-Dist: alembic (>=1.11.0,<1.12.0) ; extra == "migrations" or extra == "all"
32
36
  Requires-Dist: asyncpg
33
37
  Requires-Dist: authlib (>=0.11,<0.12)
38
+ Requires-Dist: cachetools
34
39
  Requires-Dist: click
35
40
  Requires-Dist: dask[dataframe]
36
41
  Requires-Dist: docutils (>=0.21.2,<0.22.0)
37
42
  Requires-Dist: fsspec
38
- Requires-Dist: gunicorn
43
+ Requires-Dist: gunicorn ; extra == "http" or extra == "all"
39
44
  Requires-Dist: jinja2
40
45
  Requires-Dist: jsonpatch
41
46
  Requires-Dist: lark-parser
@@ -68,9 +73,10 @@ Requires-Dist: tqdm
68
73
  Requires-Dist: typer[all]
69
74
  Requires-Dist: ujson
70
75
  Requires-Dist: unidecode
71
- Requires-Dist: uvicorn
76
+ Requires-Dist: uvicorn ; extra == "http" or extra == "all"
72
77
  Requires-Dist: xlrd
73
78
  Requires-Dist: xmltodict
79
+ Requires-Dist: zeep (>=4.3.1,<5.0.0)
74
80
  Project-URL: Bug Tracker, https://github.com/atviriduomenys/spinta/issues
75
81
  Project-URL: Documentation, https://spinta.readthedocs.io/
76
82
  Project-URL: Repository, https://github.com/atviriduomenys/spinta
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "spinta"
3
- version = "0.2.dev1"
3
+ version = "0.2.dev3"
4
4
  description = "A platform for describing, extracting, transforming, loading and serving open data."
5
5
  authors = ["Mantas Zimnickas <sirexas@gmail.com>"]
6
6
  license = "MIT"
@@ -67,11 +67,11 @@ click = "*"
67
67
  typer = { version = "*", extras = ["all"] }
68
68
 
69
69
  # API server dependencies
70
- gunicorn = "*"
71
- uvicorn = "*"
70
+ gunicorn = { version = "*", optional = true }
71
+ uvicorn = { version = "*", optional = true }
72
72
 
73
73
  # PostgreSQL backend dependencies
74
- alembic = "~1.11.0"
74
+ alembic = { version = "~1.11.0", optional = true }
75
75
  asyncpg = "*"
76
76
  psycopg2-binary = "*"
77
77
  # FIXME: https://github.com/python-poetry/poetry/issues/4402
@@ -106,7 +106,14 @@ tabulate = "*"
106
106
  pyproj = "*"
107
107
  xmltodict = "*"
108
108
  sqlean-py = "*"
109
+ cachetools = "*"
109
110
  docutils = "^0.21.2"
111
+ zeep = "^4.3.1"
112
+
113
+ [tool.poetry.extras]
114
+ http = ["gunicorn", "uvicorn"]
115
+ migrations = ["alembic"]
116
+ all = ["gunicorn", "uvicorn", "alembic"]
110
117
 
111
118
 
112
119
  [tool.poetry.group.dev.dependencies]
@@ -120,6 +127,7 @@ pytest-mock = "*"
120
127
  responses = "*"
121
128
  snoop = "*"
122
129
  python-dotenv = "*"
130
+ docutils = "*"
123
131
 
124
132
  # Starlette
125
133
  httpx = "*"
@@ -25,13 +25,14 @@ class AccessLog:
25
25
  reason: str = None
26
26
  url: str = None
27
27
  buffer_size: int = 100
28
- format: str = None # response format
29
- content_type: str = None # request content-type header
30
- agent: str = None # request user-agent header
31
- txn: str = None # request transaction id
32
- start: float = None # request start time in secodns
33
- memory: int = None # memory used in bytes at the start of request
34
- scopes: List[str] = None # list of scopes
28
+ format: str = None # response format
29
+ content_type: str = None # request content-type header
30
+ agent: str = None # request user-agent header
31
+ txn: str = None # request transaction id
32
+ start: float = None # request start time in seconds
33
+ memory: int = None # memory used in bytes at the start of request
34
+ scopes: List[str] = None # list of scopes
35
+ token: str = None # token used for request
35
36
 
36
37
  def __enter__(self):
37
38
  return self
@@ -75,7 +76,7 @@ class AccessLog:
75
76
  'format': self.format,
76
77
  'url': self.url,
77
78
  'client': self.client,
78
- 'scope': self.scopes,
79
+ 'token': self.token,
79
80
  'reason': reason or self.reason,
80
81
  'agent': self.agent,
81
82
  }
@@ -100,6 +101,27 @@ class AccessLog:
100
101
 
101
102
  self.log(message)
102
103
 
104
+ def auth(
105
+ self,
106
+ *,
107
+ reason: str = None,
108
+ ):
109
+ message = {
110
+ 'time': datetime.datetime.now(datetime.timezone.utc).isoformat(),
111
+ 'type': 'auth',
112
+ 'client': self.client,
113
+ 'token': self.token,
114
+ 'scope': self.scopes,
115
+ 'reason': reason or self.reason,
116
+ 'method': self.method,
117
+ 'rctype': self.content_type,
118
+ 'format': self.format,
119
+ 'url': self.url,
120
+ 'agent': self.agent,
121
+ }
122
+ message = {k: v for k, v in message.items() if v is not None}
123
+ self.log(message)
124
+
103
125
  def _get_time(self) -> float:
104
126
  "Get current time in seconds"
105
127
  return time.monotonic()
@@ -124,8 +146,10 @@ def load(context: Context, accesslog: AccessLog, token: Token): # noqa
124
146
 
125
147
  client_id = token.get_client_id()
126
148
  config = context.get('config')
127
- if config.scope_log and client_id != get_default_auth_client_id(context):
128
- accesslog.scopes = token.get_scope()
149
+ if client_id != get_default_auth_client_id(context):
150
+ if config.scope_log:
151
+ accesslog.scopes = token.get_scope()
152
+ accesslog.token = token.get_jti()
129
153
 
130
154
 
131
155
  @overload
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import uuid
2
3
  from typing import Type
3
4
 
@@ -18,13 +19,14 @@ from starlette.middleware import Middleware
18
19
 
19
20
  from spinta import components, commands
20
21
  from spinta.auth import AuthorizationServer, check_scope, query_client, get_clients_list, \
21
- client_exists, create_client_file, delete_client_file, update_client_file, get_clients_path, Scopes
22
+ client_exists, create_client_file, delete_client_file, update_client_file, get_clients_path, Scopes, Token, \
23
+ authenticate_token
22
24
  from spinta.auth import ResourceProtector
23
25
  from spinta.auth import BearerTokenValidator
24
26
  from spinta.auth import get_auth_request
25
27
  from spinta.auth import get_auth_token
26
28
  from spinta.commands import prepare, get_version
27
- from spinta.components import Context
29
+ from spinta.components import Context, UrlParams
28
30
  from spinta.exceptions import BaseError, MultipleErrors, error_response, InsufficientPermission, \
29
31
  UnknownPropertyInRequest, InsufficientPermissionForUpdate, EmptyPassword
30
32
  from spinta.middlewares import ContextMiddleware
@@ -60,18 +62,60 @@ async def version(request: Request):
60
62
 
61
63
 
62
64
  async def auth_token(request: Request):
63
- auth_server = request.state.context.get('auth.server')
65
+ context = request.state.context
66
+ auth_server = context.get('auth.server')
64
67
  if auth_server.enabled():
65
- return auth_server.create_token_response({
68
+ resp: JSONResponse = auth_server.create_token_response({
66
69
  'method': request.method,
67
70
  'url': str(request.url.replace(query='')),
68
71
  'body': dict(await request.form()),
69
72
  'headers': request.headers,
70
73
  })
74
+
75
+ payload = json.loads(resp.body.decode("utf-8"))
76
+ _auth_accesslog(
77
+ context,
78
+ request,
79
+ payload,
80
+ 'json'
81
+ )
82
+
83
+ return resp
71
84
  else:
72
85
  raise NoAuthServer()
73
86
 
74
87
 
88
+ def _auth_accesslog(
89
+ context: Context,
90
+ request: Request,
91
+ payload: dict,
92
+ output_format: str
93
+ ):
94
+ access_token = payload.get('access_token')
95
+ if not access_token:
96
+ return
97
+
98
+ token = payload['access_token']
99
+ type_ = payload['token_type']
100
+
101
+ resource_protector = context.get('auth.resource_protector')
102
+ token = authenticate_token(
103
+ resource_protector,
104
+ token=token,
105
+ type_=type_
106
+ )
107
+ params = UrlParams()
108
+ params.format = output_format
109
+ context.attach('accesslog', create_accesslog, context, loaders=(
110
+ context.get('store'),
111
+ request,
112
+ token,
113
+ params
114
+ ))
115
+ accesslog = context.get('accesslog')
116
+ accesslog.auth()
117
+
118
+
75
119
  def _auth_client_context(request: Request) -> Context:
76
120
  context: Context = request.state.context
77
121
  context.set('auth.request', get_auth_request({
@@ -2,13 +2,14 @@ import os
2
2
  import tempfile
3
3
  from uuid import UUID
4
4
 
5
+ from starlette.requests import Request
6
+ from starlette.responses import JSONResponse
7
+
5
8
  from spinta import commands
6
9
  from spinta.auth import check_scope, Scopes
10
+ from spinta.cli.helpers.migrate import MigrationConfig
7
11
  from spinta.cli.helpers.store import prepare_manifest
8
- from spinta.cli.helpers.migrate import MigrateRename, MigrateMeta
9
12
  from spinta.components import Context, UrlParams, Store, Model, Config, Property
10
- from starlette.requests import Request
11
-
12
13
  from spinta.core.context import configure_context, create_context
13
14
  from spinta.datasets.commands.check import check_dataset_name
14
15
  from spinta.datasets.inspect.helpers import zipitems
@@ -19,7 +20,6 @@ from spinta.manifests.components import ManifestPath, Manifest
19
20
  from spinta.manifests.tabular.helpers import datasets_to_tabular
20
21
  from spinta.utils.schema import NA
21
22
  from spinta.utils.types import is_str_uuid
22
- from starlette.responses import JSONResponse
23
23
 
24
24
 
25
25
  def _clean_up_file(file_path: str):
@@ -184,16 +184,15 @@ async def schema_api(context: Context, request: Request, params: UrlParams):
184
184
  validate_manifest(context, target_manifest, dataset_name)
185
185
 
186
186
  rename_data = create_migrate_rename_mapping(context, target_context, manifest, target_manifest, dataset_name)
187
- migrate_meta = MigrateMeta(
187
+ migration_config = MigrationConfig(
188
188
  plan=False,
189
189
  autocommit=False,
190
- rename=MigrateRename(
191
- rename_src=rename_data
192
- ),
190
+ rename_src=rename_data,
193
191
  datasets=[dataset_name],
194
- migration_extension=(lambda: commands.update_manifest_dataset_schema(context, manifest, target_manifest))
192
+ migration_extension=(lambda: commands.update_manifest_dataset_schema(context, manifest, target_manifest)),
193
+ raise_error=True,
195
194
  )
196
- commands.migrate(context, target_manifest, migrate_meta)
195
+ commands.migrate(context, target_manifest, migration_config)
197
196
  backend = manifest.backend
198
197
  commands.reload_backend_metadata(context, manifest, backend)
199
198
  reset_affected_objects(context, manifest, dataset_name)
@@ -1,48 +1,47 @@
1
1
  from __future__ import annotations
2
2
 
3
- import os
4
- from functools import lru_cache
5
-
6
- from multipledispatch import dispatch
7
- from typing import Set
8
- from typing import Type
9
- from typing import Union, List, Tuple
10
-
3
+ import base64
11
4
  import datetime
12
5
  import enum
13
6
  import json
14
7
  import logging
15
- import time
8
+ import os
16
9
  import pathlib
17
- import base64
10
+ import time
11
+ import uuid
12
+ from threading import Lock
13
+ from typing import Set
14
+ from typing import Type
15
+ from typing import Union, List, Tuple
18
16
 
19
17
  import ruamel.yaml
20
-
21
- from starlette.responses import JSONResponse
22
- from starlette.exceptions import HTTPException
23
- from cryptography.hazmat.backends import default_backend
24
- from cryptography.hazmat.primitives.asymmetric import rsa
25
-
26
18
  from authlib.jose import jwk
27
19
  from authlib.jose import jwt
28
20
  from authlib.jose.errors import JoseError
21
+ from authlib.oauth2 import OAuth2Error
29
22
  from authlib.oauth2 import OAuth2Request
30
23
  from authlib.oauth2 import rfc6749
31
24
  from authlib.oauth2 import rfc6750
32
25
  from authlib.oauth2.rfc6749 import grants
26
+ from authlib.oauth2.rfc6749.errors import InvalidClientError, UnsupportedTokenTypeError
33
27
  from authlib.oauth2.rfc6750.errors import InsufficientScopeError
34
- from authlib.oauth2.rfc6749.errors import InvalidClientError
35
- from authlib.oauth2 import OAuth2Error
28
+ from cachetools import cached, LRUCache
29
+ from cachetools.keys import hashkey
30
+ from cryptography.hazmat.backends import default_backend
31
+ from cryptography.hazmat.primitives.asymmetric import rsa
32
+ from multipledispatch import dispatch
33
+ from starlette.exceptions import HTTPException
34
+ from starlette.responses import JSONResponse
36
35
 
37
36
  from spinta.components import Config
37
+ from spinta.components import Context, Namespace, Model, Property
38
38
  from spinta.components import ScopeFormatterFunc
39
- from spinta.core.enums import Access
40
- from spinta.components import Context, Action, Namespace, Model, Property
39
+ from spinta.core.enums import Access, Action
40
+ from spinta.exceptions import AuthorizedClientsOnly
41
+ from spinta.exceptions import BasicAuthRequired
41
42
  from spinta.exceptions import InvalidToken, NoTokenValidationKey, ClientWithNameAlreadyExists, ClientAlreadyExists, \
42
43
  ClientsKeymapNotFound, ClientsIdFolderNotFound, InvalidClientsKeymapStructure, InvalidScopes, \
43
44
  InvalidClientFileFormat
44
- from spinta.exceptions import AuthorizedClientsOnly
45
- from spinta.exceptions import BasicAuthRequired
46
45
  from spinta.utils import passwords
47
46
  from spinta.utils.config import get_clients_path, get_keymap_path, get_id_path, get_helpers_path
48
47
  from spinta.utils.scopes import name_to_scope
@@ -56,6 +55,16 @@ yml.indent(mapping=2, sequence=4, offset=2)
56
55
  yml.width = 80
57
56
  yml.explicit_start = False
58
57
 
58
+ # Cache limits
59
+ CLIENT_FILE_CACHE_SIZE_LIMIT = 1000
60
+ KEYMAP_CACHE_SIZE_LIMIT = 1
61
+ DEFAULT_CLIENT_ID_CACHE_SIZE_LIMIT = 1
62
+
63
+
64
+ class KeyType(enum.Enum):
65
+ public = 'public'
66
+ private = 'private'
67
+
59
68
 
60
69
  class Scopes(enum.Enum):
61
70
  """
@@ -189,7 +198,7 @@ class Client(rfc6749.ClientMixin):
189
198
  if unknown_scopes:
190
199
  log.warning(f"requested unknown scopes: %s", ', '.join(sorted(unknown_scopes)))
191
200
  unknown_scopes = ', '.join(sorted(unknown_scopes))
192
- raise InvalidScopes(scopes = unknown_scopes)
201
+ raise InvalidScopes(scopes=unknown_scopes)
193
202
  else:
194
203
  return True
195
204
 
@@ -241,6 +250,9 @@ class Token(rfc6749.TokenMixin):
241
250
  def get_aud(self): # Client.
242
251
  return self._token.get('aud', '')
243
252
 
253
+ def get_jti(self):
254
+ return self._token.get('jti', '')
255
+
244
256
  def get_client_id(self):
245
257
  return self.get_aud()
246
258
 
@@ -259,10 +271,21 @@ class AdminToken(rfc6749.TokenMixin):
259
271
  def get_aud(self): # Client.
260
272
  return 'admin'
261
273
 
274
+ def get_jti(self):
275
+ return 'admin'
276
+
262
277
  def get_client_id(self):
263
278
  return self.get_aud()
264
279
 
265
280
 
281
+ def authenticate_token(protector: ResourceProtector, token: str, type_: str) -> Token:
282
+ type_ = type_.lower()
283
+ if type_ not in protector.TOKEN_VALIDATORS:
284
+ raise UnsupportedTokenTypeError()
285
+
286
+ return protector.TOKEN_VALIDATORS[type_].authenticate_token(token)
287
+
288
+
266
289
  def get_auth_token(context: Context) -> Token:
267
290
  scope = None # Scopes will be validated later using Token.check_scope
268
291
  request: OAuth2Request = context.get('auth.request')
@@ -333,11 +356,6 @@ def create_key_pair():
333
356
  return rsa.generate_private_key(public_exponent=65537, key_size=2048, backend=default_backend())
334
357
 
335
358
 
336
- class KeyType(enum.Enum):
337
- public = 'public'
338
- private = 'private'
339
-
340
-
341
359
  def load_key(context: Context, key_type: KeyType, *, required: bool = True):
342
360
  key = None
343
361
  config = context.get('config')
@@ -397,6 +415,7 @@ def create_access_token(
397
415
  iat = int(time.time())
398
416
  exp = iat + expires_in
399
417
  scopes = ' '.join(sorted(scopes)) if scopes else ''
418
+ jti = str(uuid.uuid4())
400
419
  payload = {
401
420
  'iss': config.server_url,
402
421
  'sub': client,
@@ -404,39 +423,11 @@ def create_access_token(
404
423
  'iat': iat,
405
424
  'exp': exp,
406
425
  'scope': scopes,
426
+ 'jti': jti
407
427
  }
408
428
  return jwt.encode(header, payload, private_key).decode('ascii')
409
429
 
410
430
 
411
- def query_client(path: pathlib.Path, client: str, is_name: bool = False) -> Client:
412
- if is_name:
413
- keymap_path = get_keymap_path(path)
414
- validate_keymap_path(keymap_path)
415
-
416
- data = _load_keymap_data(keymap_path)
417
- if not client_name_exists(data, client):
418
- raise (InvalidClientError(description='Invalid client name'))
419
- client = data[client]
420
- client_file = get_client_file_path(path, client)
421
-
422
- id_path = get_id_path(path)
423
- validate_id_path(id_path)
424
-
425
- try:
426
- data = yaml.load(client_file)
427
- except FileNotFoundError:
428
- raise (InvalidClientError(description='Invalid client id or secret'))
429
- if not isinstance(data, dict):
430
- raise InvalidClientFileFormat(client_file=client_file.name, client_file_type=type(data))
431
- if not isinstance(data['scopes'], list):
432
- raise Exception(f'Client {client_file} scopes must be list of scopes.')
433
- client_id = data["client_id"]
434
- client_name = data["client_name"] if ("client_name" in data.keys() and data["client_name"]) else None
435
- client = Client(id_=client_id, name_=client_name, secret_hash=data['client_secret_hash'],
436
- scopes=data['scopes'])
437
- return client
438
-
439
-
440
431
  def get_client_file_path(
441
432
  path: pathlib.Path,
442
433
  client: str
@@ -623,18 +614,6 @@ def client_exists(path: pathlib.Path, client: str) -> bool:
623
614
  return False
624
615
 
625
616
 
626
- def _load_keymap_data(keymap_path: pathlib.Path) -> dict:
627
- keymap = yaml.load(keymap_path)
628
- # This could mean keymap is empty, or keymap has bad yml structure
629
- if keymap is None:
630
- if os.stat(keymap_path).st_size == 0:
631
- return {}
632
- raise InvalidClientsKeymapStructure()
633
- if not isinstance(keymap, dict):
634
- raise InvalidClientsKeymapStructure()
635
- return keymap
636
-
637
-
638
617
  @dispatch(pathlib.Path, str)
639
618
  def client_name_exists(path: pathlib.Path, client_name: str) -> bool:
640
619
  keymap_path = get_keymap_path(path)
@@ -747,7 +726,7 @@ def update_client_file(
747
726
  new_scopes = scopes if scopes is not None else client.scopes
748
727
 
749
728
  client_path = get_client_file_path(path, client_id)
750
- keymap = _load_keymap_data(keymap_path)
729
+ keymap = _load_keymap_data(keymap_path)
751
730
  if new_name != client.name:
752
731
  if client_name_exists(keymap, new_name):
753
732
  raise ClientWithNameAlreadyExists(client_name=new_name)
@@ -798,13 +777,6 @@ def validate_id_path(id_path: pathlib.Path):
798
777
  raise ClientsIdFolderNotFound()
799
778
 
800
779
 
801
- # Get default auth client id using cache
802
- @lru_cache
803
- def get_default_auth_client_id(context: Context) -> str:
804
- config: Config = context.get('config')
805
- return get_client_id_from_name(get_clients_path(config.config_path), config.default_auth_client)
806
-
807
-
808
780
  def ensure_client_folders_exist(clients_path: pathlib.Path):
809
781
  # Ensure clients folder exist
810
782
  clients_path.mkdir(parents=True, exist_ok=True)
@@ -820,3 +792,103 @@ def ensure_client_folders_exist(clients_path: pathlib.Path):
820
792
  # Ensure clients/id directory
821
793
  id_path = get_id_path(clients_path)
822
794
  id_path.mkdir(parents=True, exist_ok=True)
795
+
796
+
797
+ def _keymap_file_cache_key(path: pathlib.Path, *args, **kwargs):
798
+ """
799
+ Creates keymap file cache key using
800
+ keymap path and keymap file update time.
801
+ """
802
+ key = hashkey(path, *args, **kwargs)
803
+ time_ = os.path.getmtime(path)
804
+ key += tuple([time_])
805
+ return key
806
+
807
+
808
+ def _default_client_id_cache_key(context: Context, *args, **kwargs):
809
+ """
810
+ Creates default client id cache key using
811
+ client folder path, default client name and keymap update time.
812
+ """
813
+ key = hashkey(*args, **kwargs)
814
+ config: Config = context.get('config')
815
+ path = get_clients_path(config.config_path)
816
+ client = config.default_auth_client
817
+ keymap_path = get_keymap_path(path)
818
+ validate_keymap_path(keymap_path)
819
+ time_ = os.path.getmtime(keymap_path)
820
+ key += tuple([path, client, time_])
821
+ return key
822
+
823
+
824
+ def _client_file_cache_key(path: pathlib.Path, client: str, *args, is_name: bool = False, **kwargs):
825
+ """
826
+ Creates client file cache key using
827
+ client folder path, client id and client file update time.
828
+ """
829
+ id_path = get_id_path(path)
830
+ validate_id_path(id_path)
831
+
832
+ key = hashkey(path, client, *args, **kwargs)
833
+ if is_name:
834
+ client_id = get_client_id_from_name(path, client)
835
+ if client_id is None:
836
+ raise (InvalidClientError(description='Invalid client name'))
837
+
838
+ client = client_id
839
+
840
+ client_file = get_client_file_path(path, client)
841
+ if not client_file.exists():
842
+ raise (InvalidClientError(description='Invalid client id or secret'))
843
+
844
+ time_ = os.path.getmtime(client_file)
845
+ key += tuple([time_])
846
+ return key
847
+
848
+
849
+ @cached(LRUCache(KEYMAP_CACHE_SIZE_LIMIT), key=_keymap_file_cache_key)
850
+ def _load_keymap_data(keymap_path: pathlib.Path) -> dict:
851
+ keymap = yaml.load(keymap_path)
852
+ # This could mean keymap is empty, or keymap has bad yml structure
853
+ if keymap is None:
854
+ if os.stat(keymap_path).st_size == 0:
855
+ return {}
856
+ raise InvalidClientsKeymapStructure()
857
+ if not isinstance(keymap, dict):
858
+ raise InvalidClientsKeymapStructure()
859
+ return keymap
860
+
861
+
862
+ @cached(LRUCache(DEFAULT_CLIENT_ID_CACHE_SIZE_LIMIT), key=_default_client_id_cache_key)
863
+ def get_default_auth_client_id(context: Context) -> str:
864
+ config: Config = context.get('config')
865
+ return get_client_id_from_name(get_clients_path(config.config_path), config.default_auth_client)
866
+
867
+
868
+ @cached(LRUCache(CLIENT_FILE_CACHE_SIZE_LIMIT), key=_client_file_cache_key, lock=Lock())
869
+ def query_client(path: pathlib.Path, client: str, is_name: bool = False) -> Client:
870
+ if is_name:
871
+ client_id = get_client_id_from_name(path, client)
872
+ if client_id is None:
873
+ raise (InvalidClientError(description='Invalid client name'))
874
+
875
+ client = client_id
876
+ client_file = get_client_file_path(path, client)
877
+
878
+ id_path = get_id_path(path)
879
+ validate_id_path(id_path)
880
+
881
+ try:
882
+ data = yaml.load(client_file)
883
+ except FileNotFoundError:
884
+ raise (InvalidClientError(description='Invalid client id or secret'))
885
+ if not isinstance(data, dict):
886
+ raise InvalidClientFileFormat(client_file=client_file.name, client_file_type=type(data))
887
+ if not isinstance(data['scopes'], list):
888
+ raise Exception(f'Client {client_file} scopes must be list of scopes.')
889
+ client_id = data["client_id"]
890
+ client_name = data["client_name"] if ("client_name" in data.keys() and data["client_name"]) else None
891
+ client = Client(id_=client_id, name_=client_name, secret_hash=data['client_secret_hash'],
892
+ scopes=data['scopes'])
893
+ return client
894
+