cornflow 2.0.0a21__tar.gz → 2.0.0rc2__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 (200) hide show
  1. {cornflow-2.0.0a21/cornflow.egg-info → cornflow-2.0.0rc2}/PKG-INFO +26 -26
  2. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/app.py +264 -219
  3. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/migrations.py +13 -20
  4. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/roles.py +1 -1
  5. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/service.py +71 -40
  6. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/access.py +14 -3
  7. cornflow-2.0.0rc2/cornflow/commands/auxiliar.py +109 -0
  8. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/dag.py +7 -7
  9. cornflow-2.0.0rc2/cornflow/commands/permissions.py +309 -0
  10. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/roles.py +15 -14
  11. cornflow-2.0.0rc2/cornflow/commands/views.py +217 -0
  12. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/config.py +17 -5
  13. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/__init__.py +27 -0
  14. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/case.py +37 -21
  15. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/dag.py +5 -5
  16. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/data_check.py +6 -7
  17. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/example_data.py +4 -2
  18. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/execution.py +76 -246
  19. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/health.py +12 -23
  20. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/instance.py +3 -3
  21. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/login.py +9 -2
  22. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/meta_resource.py +25 -4
  23. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/permission.py +1 -2
  24. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/schemas.py +3 -3
  25. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/signup.py +17 -11
  26. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/user_role.py +12 -2
  27. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/999b98e24225.py +1 -1
  28. cornflow-2.0.0rc2/cornflow/migrations/versions/cef1df240b27_.py +34 -0
  29. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/__init__.py +2 -1
  30. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/base_data_model.py +3 -4
  31. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/dag.py +9 -11
  32. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/dag_permissions.py +3 -3
  33. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/execution.py +1 -0
  34. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/permissions.py +1 -0
  35. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/user.py +1 -1
  36. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/execution.py +21 -1
  37. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/health.py +1 -0
  38. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/authentication/auth.py +16 -8
  39. cornflow-2.0.0rc2/cornflow/shared/authentication/decorators.py +72 -0
  40. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/const.py +42 -5
  41. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/exceptions.py +0 -1
  42. cornflow-2.0.0rc2/cornflow/tests/base_test_execution.py +798 -0
  43. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/const.py +1 -0
  44. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/integration/test_commands.py +2 -2
  45. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_apiview.py +7 -1
  46. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_cases.py +1 -1
  47. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_cli.py +6 -3
  48. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_commands.py +4 -3
  49. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_dags.py +3 -3
  50. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_example_data.py +1 -1
  51. cornflow-2.0.0rc2/cornflow/tests/unit/test_executions.py +124 -0
  52. cornflow-2.0.0rc2/cornflow/tests/unit/test_external_role_creation.py +785 -0
  53. cornflow-2.0.0rc2/cornflow/tests/unit/test_get_resources.py +103 -0
  54. cornflow-2.0.0rc2/cornflow/tests/unit/test_health.py +118 -0
  55. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_instances.py +3 -2
  56. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_main_alarms.py +1 -1
  57. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_roles.py +19 -13
  58. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_schema_from_models.py +1 -1
  59. cornflow-2.0.0rc2/cornflow/tests/unit/test_sign_up.py +297 -0
  60. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/tools.py +6 -6
  61. {cornflow-2.0.0a21 → cornflow-2.0.0rc2/cornflow.egg-info}/PKG-INFO +26 -26
  62. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow.egg-info/SOURCES.txt +5 -3
  63. cornflow-2.0.0rc2/cornflow.egg-info/requires.txt +36 -0
  64. cornflow-2.0.0rc2/requirements.txt +32 -0
  65. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/setup.py +2 -2
  66. cornflow-2.0.0a21/cornflow/commands/permissions.py +0 -209
  67. cornflow-2.0.0a21/cornflow/commands/views.py +0 -70
  68. cornflow-2.0.0a21/cornflow/orchestrator_constants.py +0 -12
  69. cornflow-2.0.0a21/cornflow/shared/airflow.py +0 -157
  70. cornflow-2.0.0a21/cornflow/shared/authentication/decorators.py +0 -42
  71. cornflow-2.0.0a21/cornflow/shared/databricks.py +0 -133
  72. cornflow-2.0.0a21/cornflow/tests/unit/test_executions.py +0 -905
  73. cornflow-2.0.0a21/cornflow/tests/unit/test_health.py +0 -34
  74. cornflow-2.0.0a21/cornflow/tests/unit/test_sign_up.py +0 -122
  75. cornflow-2.0.0a21/cornflow.egg-info/requires.txt +0 -36
  76. cornflow-2.0.0a21/requirements.txt +0 -32
  77. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/MANIFEST.in +0 -0
  78. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/README.rst +0 -0
  79. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/__init__.py +0 -0
  80. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/airflow_local_settings.py +0 -0
  81. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/plugins/XCom/__init__.py +0 -0
  82. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/plugins/XCom/gce_xcom_backend.py +0 -0
  83. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/plugins/__init__.py +0 -0
  84. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/airflow_config/webserver_ldap.py +0 -0
  85. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/__init__.py +0 -0
  86. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/__init__.py +0 -0
  87. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/actions.py +0 -0
  88. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/arguments.py +0 -0
  89. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/config.py +0 -0
  90. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/permissions.py +0 -0
  91. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/schemas.py +0 -0
  92. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/__init__.py +0 -0
  93. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/api_generator.py +0 -0
  94. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/endpoint_tools.py +0 -0
  95. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/models_tools.py +0 -0
  96. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/schema_generator.py +0 -0
  97. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/schemas_tools.py +0 -0
  98. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/tools/tools.py +0 -0
  99. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/users.py +0 -0
  100. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/utils.py +0 -0
  101. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/cli/views.py +0 -0
  102. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/__init__.py +0 -0
  103. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/actions.py +0 -0
  104. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/cleanup.py +0 -0
  105. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/schemas.py +0 -0
  106. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/commands/users.py +0 -0
  107. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/action.py +0 -0
  108. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/alarms.py +0 -0
  109. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/apiview.py +0 -0
  110. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/licenses.py +0 -0
  111. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/main_alarms.py +0 -0
  112. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/roles.py +0 -0
  113. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/tables.py +0 -0
  114. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/token.py +0 -0
  115. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/endpoints/user.py +0 -0
  116. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/gunicorn.py +0 -0
  117. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/README +0 -0
  118. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/alembic.ini +0 -0
  119. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/env.py +0 -0
  120. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/script.py.mako +0 -0
  121. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/00757b557b02_.py +0 -0
  122. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/1af47a419bbd_.py +0 -0
  123. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/4aac5e0c6e66_.py +0 -0
  124. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/7c3ea5ab5501_.py +0 -0
  125. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/991b98e24225_.py +0 -0
  126. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/a472b5ad50b7_.py +0 -0
  127. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/c2db9409cb5f_.py +0 -0
  128. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/c8a6c762e818_.py +0 -0
  129. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/ca449af8034c_.py +0 -0
  130. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/d0e0700dcd8e_.py +0 -0
  131. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/d1b5be1f0549_.py +0 -0
  132. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/e1a50dae1ac9_.py +0 -0
  133. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/e937a5234ce4_.py +0 -0
  134. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/ebdd955fcc5e_.py +0 -0
  135. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/migrations/versions/f3bee20314a2_.py +0 -0
  136. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/action.py +0 -0
  137. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/alarms.py +0 -0
  138. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/case.py +0 -0
  139. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/instance.py +0 -0
  140. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/main_alarms.py +0 -0
  141. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/meta_models.py +0 -0
  142. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/role.py +0 -0
  143. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/user_role.py +0 -0
  144. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/models/view.py +0 -0
  145. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/__init__.py +0 -0
  146. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/action.py +0 -0
  147. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/alarms.py +0 -0
  148. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/case.py +0 -0
  149. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/common.py +0 -0
  150. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/dag.py +0 -0
  151. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/example_data.py +0 -0
  152. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/instance.py +0 -0
  153. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/main_alarms.py +0 -0
  154. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/model_json.py +0 -0
  155. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/patch.py +0 -0
  156. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/permissions.py +0 -0
  157. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/query.py +0 -0
  158. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/role.py +0 -0
  159. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/schemas.py +0 -0
  160. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/solution_log.py +0 -0
  161. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/tables.py +0 -0
  162. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/user.py +0 -0
  163. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/user_role.py +0 -0
  164. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/schemas/view.py +0 -0
  165. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/__init__.py +0 -0
  166. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/authentication/__init__.py +0 -0
  167. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/authentication/ldap.py +0 -0
  168. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/compress.py +0 -0
  169. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/email.py +0 -0
  170. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/licenses.py +0 -0
  171. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/log_config.py +0 -0
  172. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/query_tools.py +0 -0
  173. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/utils.py +0 -0
  174. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/utils_tables.py +0 -0
  175. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/shared/validators.py +0 -0
  176. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/__init__.py +0 -0
  177. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/custom_liveServer.py +0 -0
  178. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/custom_test_case.py +0 -0
  179. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/integration/__init__.py +0 -0
  180. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/integration/test_cornflowclient.py +0 -0
  181. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/ldap/__init__.py +0 -0
  182. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/ldap/test_ldap_authentication.py +0 -0
  183. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/__init__.py +0 -0
  184. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_actions.py +0 -0
  185. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_alarms.py +0 -0
  186. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_application.py +0 -0
  187. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_data_checks.py +0 -0
  188. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_generate_from_schema.py +0 -0
  189. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_instances_file.py +0 -0
  190. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_licenses.py +0 -0
  191. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_log_in.py +0 -0
  192. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_permissions.py +0 -0
  193. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_schemas.py +0 -0
  194. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_tables.py +0 -0
  195. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_token.py +0 -0
  196. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow/tests/unit/test_users.py +0 -0
  197. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow.egg-info/dependency_links.txt +0 -0
  198. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow.egg-info/entry_points.txt +0 -0
  199. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/cornflow.egg-info/top_level.txt +0 -0
  200. {cornflow-2.0.0a21 → cornflow-2.0.0rc2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cornflow
3
- Version: 2.0.0a21
3
+ Version: 2.0.0rc2
4
4
  Summary: cornflow is an open source multi-solver optimization server with a REST API built using flask.
5
5
  Home-page: https://github.com/baobabsoluciones/cornflow
6
6
  Author: baobab soluciones
@@ -9,39 +9,39 @@ Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: OSI Approved :: Apache Software License
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
- Requires-Python: >=3.9
12
+ Requires-Python: >=3.10
13
13
  Requires-Dist: alembic==1.9.2
14
- Requires-Dist: apispec<=6.3.0
14
+ Requires-Dist: apispec==6.3.0
15
15
  Requires-Dist: cachetools==5.3.3
16
- Requires-Dist: click<=8.1.7
17
- Requires-Dist: cornflow-client==2.0.0a21
18
- Requires-Dist: cryptography<=44.0.1
19
- Requires-Dist: databricks-sdk==0.29.0
20
- Requires-Dist: disposable-email-domains>=0.0.86
16
+ Requires-Dist: click==8.1.7
17
+ Requires-Dist: cornflow-client==2.0.0rc2
18
+ Requires-Dist: cryptography==46.0.5
19
+ Requires-Dist: disposable-email-domains==0.0.162
21
20
  Requires-Dist: Flask==2.3.2
22
- Requires-Dist: flask-apispec<=0.11.4
23
- Requires-Dist: Flask-Bcrypt<=1.0.1
24
- Requires-Dist: Flask-Compress<=1.14
25
- Requires-Dist: flask-cors>=4.0.2
26
- Requires-Dist: flask-inflate<=0.3
27
- Requires-Dist: Flask-Migrate<=4.0.5
28
- Requires-Dist: Flask-RESTful<=0.3.10
21
+ Requires-Dist: flask-apispec==0.11.4
22
+ Requires-Dist: Flask-Bcrypt==1.0.1
23
+ Requires-Dist: Flask-Compress==1.14
24
+ Requires-Dist: flask-cors==6.0.0
25
+ Requires-Dist: flask-inflate==0.3
26
+ Requires-Dist: Flask-Migrate==4.0.5
27
+ Requires-Dist: Flask-RESTful==0.3.10
29
28
  Requires-Dist: Flask-SQLAlchemy==2.5.1
30
29
  Requires-Dist: gevent==23.9.1
31
- Requires-Dist: greenlet<=2.0.2; python_version < "3.11"
30
+ Requires-Dist: greenlet==2.0.2; python_version < "3.11"
32
31
  Requires-Dist: greenlet==3.0.3; python_version >= "3.11"
33
- Requires-Dist: gunicorn<=23.0.0
34
- Requires-Dist: jsonpatch<=1.33
35
- Requires-Dist: ldap3<=2.9.1
36
- Requires-Dist: marshmallow<=3.20.2
37
- Requires-Dist: PuLP<=2.9.0
38
- Requires-Dist: psycopg2<=2.9.9
39
- Requires-Dist: PyJWT<=2.8.0
40
- Requires-Dist: pytups>=0.86.2
41
- Requires-Dist: requests<=2.32.3
32
+ Requires-Dist: gunicorn==23.0.0
33
+ Requires-Dist: jsonpatch==1.33
34
+ Requires-Dist: ldap3==2.9.1
35
+ Requires-Dist: marshmallow==3.26.2
36
+ Requires-Dist: PuLP==2.9.0
37
+ Requires-Dist: psycopg2==2.9.9
38
+ Requires-Dist: PyJWT==2.12.0
39
+ Requires-Dist: pytups==0.86.2
40
+ Requires-Dist: requests==2.32.4
42
41
  Requires-Dist: SQLAlchemy==1.3.21
43
- Requires-Dist: webargs<=8.3.0
42
+ Requires-Dist: webargs==8.3.0
44
43
  Requires-Dist: Werkzeug==3.0.6
44
+ Requires-Dist: setuptools==78.1.1
45
45
  Dynamic: author
46
46
  Dynamic: author-email
47
47
  Dynamic: classifier
@@ -1,219 +1,264 @@
1
- """
2
- Main file with the creation of the app logic
3
- """
4
-
5
- # Full imports
6
- import os
7
- import click
8
-
9
- # Partial imports
10
- from flask import Flask
11
- from flask.cli import with_appcontext
12
- from flask_apispec.extension import FlaskApiSpec
13
- from flask_cors import CORS
14
- from flask_migrate import Migrate
15
- from flask_restful import Api
16
- from logging.config import dictConfig
17
- from werkzeug.middleware.dispatcher import DispatcherMiddleware
18
- from werkzeug.exceptions import NotFound
19
-
20
- # Module imports
21
- from cornflow.commands import (
22
- create_service_user_command,
23
- create_admin_user_command,
24
- create_planner_user_command,
25
- register_roles_command,
26
- register_actions_command,
27
- register_views_command,
28
- register_base_permissions_command,
29
- access_init_command,
30
- register_deployed_dags_command,
31
- register_dag_permissions_command,
32
- )
33
- from cornflow.config import app_config
34
- from cornflow.endpoints import resources, alarms_resources
35
- from cornflow.endpoints.login import LoginEndpoint, LoginOpenAuthEndpoint
36
- from cornflow.endpoints.signup import SignUpEndpoint
37
- from cornflow.shared import db, bcrypt
38
- from cornflow.shared.compress import init_compress
39
- from cornflow.shared.const import AUTH_DB, AUTH_LDAP, AUTH_OID
40
- from cornflow.shared.exceptions import initialize_errorhandlers, ConfigurationError
41
- from cornflow.shared.log_config import log_config
42
-
43
-
44
- def create_app(env_name="development", dataconn=None):
45
- """
46
-
47
- :param str env_name: 'testing' or 'development' or 'production'
48
- :param str dataconn: string to connect to the database
49
- :return: the application that is going to be running :class:`Flask`
50
- :rtype: :class:`Flask`
51
- """
52
- dictConfig(log_config(app_config[env_name].LOG_LEVEL))
53
-
54
- # Note: Explicit CSRF protection is not configured as the application uses
55
- # JWT for authentication via headers, mitigating standard CSRF vulnerabilities.
56
- app = Flask(__name__)
57
- app.json.sort_keys = False
58
- app.logger.setLevel(app_config[env_name].LOG_LEVEL)
59
-
60
- app.config.from_object(app_config[env_name])
61
- # initialization for init_cornflow_service.py
62
- if dataconn is not None:
63
- app.config["SQLALCHEMY_DATABASE_URI"] = dataconn
64
- CORS(app)
65
- bcrypt.init_app(app)
66
- db.init_app(app)
67
- Migrate(app=app, db=db)
68
-
69
- if "sqlite" in app.config["SQLALCHEMY_DATABASE_URI"]:
70
-
71
- def _fk_pragma_on_connect(dbapi_con, _con_record):
72
- dbapi_con.execute("pragma foreign_keys=ON")
73
-
74
- with app.app_context():
75
- from sqlalchemy import event
76
-
77
- event.listen(db.engine, "connect", _fk_pragma_on_connect)
78
-
79
- api = Api(app)
80
- for res in resources:
81
- api.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"])
82
- if app.config["ALARMS_ENDPOINTS"]:
83
- for res in alarms_resources:
84
- api.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"])
85
-
86
- docs = FlaskApiSpec(app)
87
- for res in resources:
88
- docs.register(target=res["resource"], endpoint=res["endpoint"])
89
- if app.config["ALARMS_ENDPOINTS"]:
90
- for res in alarms_resources:
91
- docs.register(target=res["resource"], endpoint=res["endpoint"])
92
-
93
- # Resource for the log-in
94
- auth_type = app.config["AUTH_TYPE"]
95
-
96
- if auth_type == AUTH_DB:
97
- signup_activated = int(app.config["SIGNUP_ACTIVATED"])
98
- if signup_activated == 1:
99
- api.add_resource(SignUpEndpoint, "/signup/", endpoint="signup")
100
- api.add_resource(LoginEndpoint, "/login/", endpoint="login")
101
- elif auth_type == AUTH_LDAP:
102
- api.add_resource(LoginEndpoint, "/login/", endpoint="login")
103
- elif auth_type == AUTH_OID:
104
- api.add_resource(LoginOpenAuthEndpoint, "/login/", endpoint="login")
105
- else:
106
- raise ConfigurationError(
107
- error="Invalid authentication type",
108
- log_txt="Error while configuring authentication. The authentication type is not valid.",
109
- )
110
-
111
- initialize_errorhandlers(app)
112
- init_compress(app)
113
-
114
- app.cli.add_command(create_service_user)
115
- app.cli.add_command(create_admin_user)
116
- app.cli.add_command(register_roles)
117
- app.cli.add_command(create_base_user)
118
- app.cli.add_command(register_actions)
119
- app.cli.add_command(register_views)
120
- app.cli.add_command(register_base_assignations)
121
- app.cli.add_command(access_init)
122
- app.cli.add_command(register_deployed_dags)
123
- app.cli.add_command(register_dag_permissions)
124
-
125
- if app.config["APPLICATION_ROOT"] != "/" and app.config["EXTERNAL_APP"] == 0:
126
- app.wsgi_app = DispatcherMiddleware(
127
- NotFound(), {app.config["APPLICATION_ROOT"]: app.wsgi_app}
128
- )
129
-
130
- return app
131
-
132
-
133
- @click.command("create_service_user")
134
- @click.option("-u", "--username", required=True, type=str)
135
- @click.option("-e", "--email", required=True, type=str)
136
- @click.option("-p", "--password", required=True, type=str)
137
- @click.option("-v", "--verbose", is_flag=True, default=False)
138
- @with_appcontext
139
- def create_service_user(username, email, password, verbose):
140
- create_service_user_command(username, email, password, verbose)
141
-
142
-
143
- @click.command("create_admin_user")
144
- @click.option("-u", "--username", required=True, type=str)
145
- @click.option("-e", "--email", required=True, type=str)
146
- @click.option("-p", "--password", required=True, type=str)
147
- @click.option("-v", "--verbose", is_flag=True, default=False)
148
- @with_appcontext
149
- def create_admin_user(username, email, password, verbose):
150
- create_admin_user_command(username, email, password, verbose)
151
-
152
-
153
- @click.command("create_base_user")
154
- @click.option("-u", "--username", required=True, type=str)
155
- @click.option("-e", "--email", required=True, type=str)
156
- @click.option("-p", "--password", required=True, type=str)
157
- @click.option("-v", "--verbose", is_flag=True, default=False)
158
- @with_appcontext
159
- def create_base_user(username, email, password, verbose):
160
- create_planner_user_command(username, email, password, verbose)
161
-
162
-
163
- @click.command("register_roles")
164
- @click.option("-v", "--verbose", is_flag=True, default=False)
165
- @with_appcontext
166
- def register_roles(verbose):
167
- register_roles_command(verbose)
168
-
169
-
170
- @click.command("register_actions")
171
- @click.option("-v", "--verbose", is_flag=True, default=False)
172
- @with_appcontext
173
- def register_actions(verbose):
174
- register_actions_command(verbose)
175
-
176
-
177
- @click.command("register_views")
178
- @click.option("-v", "--verbose", is_flag=True, default=False)
179
- @with_appcontext
180
- def register_views(verbose):
181
- register_views_command(verbose=verbose)
182
-
183
-
184
- @click.command("register_base_assignations")
185
- @click.option("-v", "--verbose", is_flag=True, default=False)
186
- @with_appcontext
187
- def register_base_assignations(verbose):
188
- register_base_permissions_command(verbose=verbose)
189
-
190
-
191
- @click.command("access_init")
192
- @click.option("-v", "--verbose", is_flag=True, default=False)
193
- @with_appcontext
194
- def access_init(verbose):
195
- access_init_command(verbose=verbose)
196
-
197
-
198
- @click.command("register_deployed_dags")
199
- @click.option("-r", "--url", type=str)
200
- @click.option("-u", "--username", type=str)
201
- @click.option("-p", "--password", type=str)
202
- @click.option("-v", "--verbose", is_flag=True, default=False)
203
- @with_appcontext
204
- def register_deployed_dags(url, username, password, verbose):
205
- register_deployed_dags_command(url, username, password, verbose)
206
-
207
-
208
- @click.command("register_dag_permissions")
209
- @click.option("-o", "--open_deployment", default=0, type=int)
210
- @click.option("-v", "--verbose", is_flag=True, default=False)
211
- @with_appcontext
212
- def register_dag_permissions(open_deployment, verbose):
213
- register_dag_permissions_command(open_deployment=open_deployment, verbose=verbose)
214
-
215
-
216
- if __name__ == "__main__":
217
- environment_name = os.getenv("FLASK_ENV", "development")
218
- flask_app = create_app(environment_name)
219
- flask_app.run()
1
+ """
2
+ Main file with the creation of the app logic
3
+ """
4
+
5
+ # Full imports
6
+ import os
7
+ from logging.config import dictConfig
8
+
9
+ import click
10
+
11
+ # Partial imports
12
+ from flask import Flask, Blueprint
13
+ from flask.cli import with_appcontext
14
+ from flask_apispec.extension import FlaskApiSpec
15
+ from flask_cors import CORS
16
+ from flask_migrate import Migrate
17
+ from flask_restful import Api
18
+ from werkzeug.exceptions import NotFound
19
+ from werkzeug.middleware.dispatcher import DispatcherMiddleware
20
+
21
+ # Module imports
22
+ from cornflow.commands import (
23
+ create_service_user_command,
24
+ create_admin_user_command,
25
+ create_planner_user_command,
26
+ register_roles_command,
27
+ register_actions_command,
28
+ register_views_command,
29
+ register_base_permissions_command,
30
+ access_init_command,
31
+ register_deployed_dags_command,
32
+ register_dag_permissions_command,
33
+ )
34
+ from cornflow.config import app_config
35
+ from cornflow.endpoints import resources, alarms_resources
36
+ from cornflow.endpoints.login import LoginEndpoint, LoginOpenAuthEndpoint
37
+ from cornflow.endpoints.signup import SignUpEndpoint
38
+ from cornflow.shared import db, bcrypt
39
+ from cornflow.shared.compress import init_compress
40
+ from cornflow.shared.const import (
41
+ AUTH_DB,
42
+ AUTH_LDAP,
43
+ AUTH_OID,
44
+ CONDITIONAL_ENDPOINTS,
45
+ SIGNUP_WITH_AUTH,
46
+ SIGNUP_WITH_NO_AUTH,
47
+ )
48
+ from cornflow.shared.exceptions import initialize_errorhandlers, ConfigurationError
49
+ from cornflow.shared.log_config import log_config
50
+
51
+
52
+ def create_app(env_name="development", dataconn=None):
53
+ """
54
+
55
+ :param str env_name: 'testing' or 'development' or 'production'
56
+ :param str dataconn: string to connect to the database
57
+ :return: the application that is going to be running :class:`Flask`
58
+ :rtype: :class:`Flask`
59
+ """
60
+ dictConfig(log_config(app_config[env_name].LOG_LEVEL))
61
+
62
+ # Note: Explicit CSRF protection is not configured as the application uses
63
+ # JWT for authentication via headers, mitigating standard CSRF vulnerabilities.
64
+ app = Flask(__name__)
65
+ app.json.sort_keys = False
66
+ app.logger.setLevel(app_config[env_name].LOG_LEVEL)
67
+
68
+ app.config.from_object(app_config[env_name])
69
+ # initialization for init_cornflow_service.py
70
+ if dataconn is not None:
71
+ app.config["SQLALCHEMY_DATABASE_URI"] = dataconn
72
+ CORS(app)
73
+ bcrypt.init_app(app)
74
+ db.init_app(app)
75
+ Migrate(app=app, db=db)
76
+
77
+ if "sqlite" in app.config["SQLALCHEMY_DATABASE_URI"]:
78
+
79
+ def _fk_pragma_on_connect(dbapi_con, _con_record):
80
+ dbapi_con.execute("pragma foreign_keys=ON")
81
+
82
+ with app.app_context():
83
+ from sqlalchemy import event
84
+
85
+ event.listen(db.engine, "connect", _fk_pragma_on_connect)
86
+
87
+ # Rutas del Core bajo /cornflow/ via Blueprint (URLs canónicas)
88
+ cornflow_bp = Blueprint("cornflow", __name__, url_prefix="/cornflow")
89
+ api = Api(cornflow_bp)
90
+ for res in resources:
91
+ api.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"])
92
+ if app.config["ALARMS_ENDPOINTS"]:
93
+ for res in alarms_resources:
94
+ api.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"])
95
+
96
+ # Resource for the log-in
97
+ auth_type = app.config["AUTH_TYPE"]
98
+
99
+ if auth_type == AUTH_DB:
100
+ signup_activated = int(app.config["SIGNUP_ACTIVATED"])
101
+ if signup_activated in [SIGNUP_WITH_AUTH, SIGNUP_WITH_NO_AUTH]:
102
+ api.add_resource(
103
+ SignUpEndpoint, CONDITIONAL_ENDPOINTS["signup"], endpoint="signup"
104
+ )
105
+ api.add_resource(
106
+ LoginEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login"
107
+ )
108
+ elif auth_type == AUTH_LDAP:
109
+ api.add_resource(
110
+ LoginEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login"
111
+ )
112
+ elif auth_type == AUTH_OID:
113
+ api.add_resource(
114
+ LoginOpenAuthEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login"
115
+ )
116
+ else:
117
+ raise ConfigurationError(
118
+ error="Invalid authentication type",
119
+ log_txt="Error while configuring authentication. The authentication type is not valid.",
120
+ )
121
+
122
+ app.register_blueprint(cornflow_bp)
123
+
124
+ # Alias de compatibilidad: mismas rutas sin prefijo (URLs legacy)
125
+ api_compat = Api(app)
126
+ for res in resources:
127
+ api_compat.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"] + "_compat")
128
+ if app.config["ALARMS_ENDPOINTS"]:
129
+ for res in alarms_resources:
130
+ api_compat.add_resource(res["resource"], res["urls"], endpoint=res["endpoint"] + "_compat")
131
+ if auth_type == AUTH_DB:
132
+ _signup_activated = int(app.config["SIGNUP_ACTIVATED"])
133
+ if _signup_activated in [SIGNUP_WITH_AUTH, SIGNUP_WITH_NO_AUTH]:
134
+ api_compat.add_resource(SignUpEndpoint, CONDITIONAL_ENDPOINTS["signup"], endpoint="signup_compat")
135
+ api_compat.add_resource(LoginEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login_compat")
136
+ elif auth_type == AUTH_LDAP:
137
+ api_compat.add_resource(LoginEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login_compat")
138
+ elif auth_type == AUTH_OID:
139
+ api_compat.add_resource(LoginOpenAuthEndpoint, CONDITIONAL_ENDPOINTS["login"], endpoint="login_compat")
140
+
141
+ docs = FlaskApiSpec(app)
142
+ for res in resources:
143
+ docs.register(target=res["resource"], endpoint=res["endpoint"], blueprint="cornflow")
144
+ if app.config["ALARMS_ENDPOINTS"]:
145
+ for res in alarms_resources:
146
+ docs.register(target=res["resource"], endpoint=res["endpoint"], blueprint="cornflow")
147
+
148
+ initialize_errorhandlers(app)
149
+ init_compress(app)
150
+
151
+ app.cli.add_command(create_service_user)
152
+ app.cli.add_command(create_admin_user)
153
+ app.cli.add_command(register_roles)
154
+ app.cli.add_command(create_base_user)
155
+ app.cli.add_command(register_actions)
156
+ app.cli.add_command(register_views)
157
+ app.cli.add_command(register_base_assignations)
158
+ app.cli.add_command(access_init)
159
+ app.cli.add_command(register_deployed_dags)
160
+ app.cli.add_command(register_dag_permissions)
161
+
162
+ if int(app.config["EXTERNAL_APP"]) == 1:
163
+ # Legacy mode: DispatcherMiddleware mounts cornflow under APPLICATION_ROOT.
164
+ # The external app is responsible for combining both apps via wsgi.py.
165
+ if app.config["APPLICATION_ROOT"] != "/":
166
+ app.wsgi_app = DispatcherMiddleware(
167
+ NotFound(), {app.config["APPLICATION_ROOT"]: app.wsgi_app}
168
+ )
169
+ else:
170
+ # Plugin mode: autodiscover and mount plugins registered under cornflow.plugins.
171
+ from importlib.metadata import entry_points
172
+ for ep in entry_points(group="cornflow.plugins"):
173
+ ep.load()().init_app(app)
174
+
175
+ return app
176
+
177
+
178
+ @click.command("create_service_user")
179
+ @click.option("-u", "--username", required=True, type=str)
180
+ @click.option("-e", "--email", required=True, type=str)
181
+ @click.option("-p", "--password", required=True, type=str)
182
+ @click.option("-v", "--verbose", is_flag=True, default=False)
183
+ @with_appcontext
184
+ def create_service_user(username, email, password, verbose):
185
+ create_service_user_command(username, email, password, verbose)
186
+
187
+
188
+ @click.command("create_admin_user")
189
+ @click.option("-u", "--username", required=True, type=str)
190
+ @click.option("-e", "--email", required=True, type=str)
191
+ @click.option("-p", "--password", required=True, type=str)
192
+ @click.option("-v", "--verbose", is_flag=True, default=False)
193
+ @with_appcontext
194
+ def create_admin_user(username, email, password, verbose):
195
+ create_admin_user_command(username, email, password, verbose)
196
+
197
+
198
+ @click.command("create_base_user")
199
+ @click.option("-u", "--username", required=True, type=str)
200
+ @click.option("-e", "--email", required=True, type=str)
201
+ @click.option("-p", "--password", required=True, type=str)
202
+ @click.option("-v", "--verbose", is_flag=True, default=False)
203
+ @with_appcontext
204
+ def create_base_user(username, email, password, verbose):
205
+ create_planner_user_command(username, email, password, verbose)
206
+
207
+
208
+ @click.command("register_roles")
209
+ @click.option("-v", "--verbose", is_flag=True, default=False)
210
+ @with_appcontext
211
+ def register_roles(verbose):
212
+ register_roles_command(verbose=verbose)
213
+
214
+
215
+ @click.command("register_actions")
216
+ @click.option("-v", "--verbose", is_flag=True, default=False)
217
+ @with_appcontext
218
+ def register_actions(verbose):
219
+ register_actions_command(verbose)
220
+
221
+
222
+ @click.command("register_views")
223
+ @click.option("-v", "--verbose", is_flag=True, default=False)
224
+ @with_appcontext
225
+ def register_views(verbose):
226
+ register_views_command(verbose=verbose)
227
+
228
+
229
+ @click.command("register_base_assignations")
230
+ @click.option("-v", "--verbose", is_flag=True, default=False)
231
+ @with_appcontext
232
+ def register_base_assignations(verbose):
233
+ register_base_permissions_command(verbose=verbose)
234
+
235
+
236
+ @click.command("access_init")
237
+ @click.option("-v", "--verbose", is_flag=True, default=False)
238
+ @with_appcontext
239
+ def access_init(verbose):
240
+ access_init_command(verbose=verbose)
241
+
242
+
243
+ @click.command("register_deployed_dags")
244
+ @click.option("-r", "--url", type=str)
245
+ @click.option("-u", "--username", type=str)
246
+ @click.option("-p", "--password", type=str)
247
+ @click.option("-v", "--verbose", is_flag=True, default=False)
248
+ @with_appcontext
249
+ def register_deployed_dags(url, username, password, verbose):
250
+ register_deployed_dags_command(url, username, password, verbose)
251
+
252
+
253
+ @click.command("register_dag_permissions")
254
+ @click.option("-o", "--open_deployment", default=0, type=int)
255
+ @click.option("-v", "--verbose", is_flag=True, default=False)
256
+ @with_appcontext
257
+ def register_dag_permissions(open_deployment, verbose):
258
+ register_dag_permissions_command(open_deployment=open_deployment, verbose=verbose)
259
+
260
+
261
+ if __name__ == "__main__":
262
+ environment_name = os.getenv("FLASK_ENV", "development")
263
+ flask_app = create_app(environment_name)
264
+ flask_app.run()
@@ -2,8 +2,8 @@ import os.path
2
2
 
3
3
 
4
4
  import click
5
+ import cornflow
5
6
  from cornflow.shared import db
6
- from cornflow.shared.const import MIGRATIONS_DEFAULT_PATH
7
7
  from flask_migrate import Migrate, migrate, upgrade, downgrade, init
8
8
 
9
9
  from .utils import get_app
@@ -22,10 +22,7 @@ def migrations():
22
22
  def migrate_migrations():
23
23
  app = get_app()
24
24
  external = int(os.getenv("EXTERNAL_APP", 0))
25
- if external == 0:
26
- path = MIGRATIONS_DEFAULT_PATH
27
- else:
28
- path = f"./{os.getenv('EXTERNAL_APP_MODULE', 'external_app')}/migrations"
25
+ path = _get_migrations_path()
29
26
 
30
27
  with app.app_context():
31
28
  Migrate(app=app, db=db, directory=path)
@@ -38,11 +35,7 @@ def migrate_migrations():
38
35
  )
39
36
  def upgrade_migrations(revision="head"):
40
37
  app = get_app()
41
- external = int(os.getenv("EXTERNAL_APP", 0))
42
- if external == 0:
43
- path = MIGRATIONS_DEFAULT_PATH
44
- else:
45
- path = f"./{os.getenv('EXTERNAL_APP_MODULE', 'external_app')}/migrations"
38
+ path = _get_migrations_path()
46
39
 
47
40
  with app.app_context():
48
41
  Migrate(app=app, db=db, directory=path)
@@ -55,11 +48,7 @@ def upgrade_migrations(revision="head"):
55
48
  )
56
49
  def downgrade_migrations(revision="-1"):
57
50
  app = get_app()
58
- external = int(os.getenv("EXTERNAL_APP", 0))
59
- if external == 0:
60
- path = MIGRATIONS_DEFAULT_PATH
61
- else:
62
- path = f"./{os.getenv('EXTERNAL_APP_MODULE', 'external_app')}/migrations"
51
+ path = _get_migrations_path()
63
52
 
64
53
  with app.app_context():
65
54
  Migrate(app=app, db=db, directory=path)
@@ -72,12 +61,16 @@ def downgrade_migrations(revision="-1"):
72
61
  )
73
62
  def init_migrations():
74
63
  app = get_app()
75
- external = int(os.getenv("EXTERNAL_APP", 0))
76
- if external == 0:
77
- path = MIGRATIONS_DEFAULT_PATH
78
- else:
79
- path = f"./{os.getenv('EXTERNAL_APP_MODULE', 'external_app')}/migrations"
64
+ path = _get_migrations_path()
80
65
 
81
66
  with app.app_context():
82
67
  Migrate(app=app, db=db, directory=path)
83
68
  init()
69
+
70
+
71
+ def _get_migrations_path():
72
+ external = int(os.getenv("EXTERNAL_APP", 0))
73
+ if external == 0:
74
+ return os.path.join(os.path.dirname(cornflow.__file__), "migrations")
75
+ else:
76
+ return f"./{os.getenv('EXTERNAL_APP_MODULE', 'external_app')}/migrations"
@@ -18,4 +18,4 @@ def roles():
18
18
  def init(verbose):
19
19
  app = get_app()
20
20
  with app.app_context():
21
- register_roles_command(verbose)
21
+ register_roles_command(verbose=verbose)