OpenGeodeWeb-Back 6.14.1rc1__tar.gz → 6.14.2rc1__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 (119) hide show
  1. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/PKG-INFO +5 -3
  2. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/pyproject.toml +1 -1
  3. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/requirements.txt +6 -2
  4. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +5 -3
  5. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +2 -0
  6. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/requires.txt +4 -2
  7. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/app.py +57 -43
  8. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/app_config.py +10 -8
  9. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_functions.py +24 -16
  10. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/__init__.py +25 -20
  11. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_brep.py +46 -17
  12. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +29 -16
  13. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +32 -11
  14. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +32 -11
  15. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_graph.py +28 -7
  16. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +13 -8
  17. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +13 -8
  18. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +43 -19
  19. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +22 -8
  20. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +23 -9
  21. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +23 -9
  22. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +22 -2
  23. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +22 -2
  24. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_mesh.py +7 -3
  25. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_model.py +14 -6
  26. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_object.py +14 -11
  27. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +32 -11
  28. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +32 -11
  29. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +21 -5
  30. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +21 -5
  31. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +21 -5
  32. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +34 -13
  33. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +34 -13
  34. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +27 -10
  35. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +27 -10
  36. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_section.py +46 -19
  37. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +17 -4
  38. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +29 -16
  39. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +18 -7
  40. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +18 -7
  41. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +21 -5
  42. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +22 -8
  43. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +22 -8
  44. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +30 -10
  45. opengeodeweb_back-6.14.2rc1/src/opengeodeweb_back/routes/__init__.py +0 -0
  46. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +154 -156
  47. opengeodeweb_back-6.14.2rc1/src/opengeodeweb_back/routes/create/__init__.py +0 -0
  48. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/blueprint_create.py +5 -10
  49. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +2 -1
  50. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.py +2 -1
  51. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +2 -1
  52. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.py +2 -1
  53. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +2 -1
  54. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +2 -1
  55. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +2 -1
  56. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/export_project.py +2 -1
  57. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +2 -1
  58. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +2 -1
  59. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py +2 -1
  60. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/import_project.py +2 -1
  61. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/kill.py +2 -1
  62. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/missing_files.py +2 -1
  63. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +2 -1
  64. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +2 -1
  65. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +2 -1
  66. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +2 -1
  67. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/ping.py +2 -1
  68. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +2 -1
  69. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +2 -1
  70. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +2 -1
  71. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +2 -1
  72. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/upload_file.py +2 -1
  73. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/validate.py +2 -1
  74. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +2 -1
  75. opengeodeweb_back-6.14.2rc1/src/opengeodeweb_back/test_utils.py +75 -0
  76. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/typed_route.py +37 -19
  77. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/utils_functions.py +101 -109
  78. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/tests/test_create_routes.py +8 -7
  79. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/tests/test_geode_functions.py +16 -23
  80. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/tests/test_routes.py +127 -174
  81. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/tests/test_typed_routes.py +17 -12
  82. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/tests/test_utils_functions.py +63 -53
  83. opengeodeweb_back-6.14.1rc1/src/opengeodeweb_back/test_utils.py +0 -49
  84. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/LICENSE +0 -0
  85. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/README.md +0 -0
  86. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/setup.cfg +0 -0
  87. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  88. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  89. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  90. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/__init__.py +0 -0
  91. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/py.typed +0 -0
  92. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
  93. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +0 -0
  94. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.json +0 -0
  95. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +0 -0
  96. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/__init__.py +0 -0
  97. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  98. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  99. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  100. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  101. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  102. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
  103. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  104. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  105. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  106. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  107. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  108. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +0 -0
  109. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +0 -0
  110. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +0 -0
  111. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +0 -0
  112. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  113. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  114. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  115. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  116. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  117. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  118. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
  119. {opengeodeweb_back-6.14.1rc1 → opengeodeweb_back-6.14.2rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.14.1rc1
3
+ Version: 6.14.2rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -14,6 +14,7 @@ License-File: LICENSE
14
14
  Requires-Dist: asgiref==3.*
15
15
  Requires-Dist: blinker==1.*
16
16
  Requires-Dist: click==8.*
17
+ Requires-Dist: defusedxml==0.7.1
17
18
  Requires-Dist: flask[async]==3.*
18
19
  Requires-Dist: flask-cors==6.0.2
19
20
  Requires-Dist: geode-common==33.26.6
@@ -21,14 +22,15 @@ Requires-Dist: geode-viewables==3.5.2
21
22
  Requires-Dist: itsdangerous==2.*
22
23
  Requires-Dist: jinja2==3.*
23
24
  Requires-Dist: markupsafe==3.*
24
- Requires-Dist: opengeode-core==18.4.0
25
+ Requires-Dist: opengeode-core==18.4.1
25
26
  Requires-Dist: opengeode-geosciences==9.8.1
26
27
  Requires-Dist: opengeode-geosciencesio==5.11.1
27
28
  Requires-Dist: opengeode-inspector==6.12.1
28
29
  Requires-Dist: opengeode-inspector-geosciences==1.2.1
29
30
  Requires-Dist: opengeode-io==7.10.0
31
+ Requires-Dist: types-defusedxml==0.7.0.20260504
30
32
  Requires-Dist: werkzeug==3.1.8
31
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.3.1
33
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.3.2rc1
32
34
  Dynamic: license-file
33
35
 
34
36
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "OpenGeodeWeb-Back"
7
- version = "6.14.1-rc.1"
7
+ version = "6.14.2-rc.1"
8
8
  dynamic = ["dependencies"]
9
9
  authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }]
10
10
  description = "OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem"
@@ -10,6 +10,8 @@ blinker==1.*
10
10
  # via flask
11
11
  click==8.*
12
12
  # via flask
13
+ defusedxml==0.7.1
14
+ # via -r requirements.in
13
15
  flask[async]==3.*
14
16
  # via
15
17
  # -r requirements.in
@@ -31,7 +33,7 @@ markupsafe==3.*
31
33
  # flask
32
34
  # jinja2
33
35
  # werkzeug
34
- opengeode-core==18.4.0
36
+ opengeode-core==18.4.1
35
37
  # via
36
38
  # -r requirements.in
37
39
  # geode-common
@@ -60,10 +62,12 @@ opengeode-io==7.10.0
60
62
  # -r requirements.in
61
63
  # geode-viewables
62
64
  # opengeode-geosciencesio
65
+ types-defusedxml==0.7.0.20260504
66
+ # via -r requirements.in
63
67
  werkzeug==3.1.8
64
68
  # via
65
69
  # -r requirements.in
66
70
  # flask
67
71
  # flask-cors
68
72
 
69
- opengeodeweb-microservice==1.*,>=1.3.1
73
+ opengeodeweb-microservice==1.*,>=1.3.2rc1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.14.1rc1
3
+ Version: 6.14.2rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -14,6 +14,7 @@ License-File: LICENSE
14
14
  Requires-Dist: asgiref==3.*
15
15
  Requires-Dist: blinker==1.*
16
16
  Requires-Dist: click==8.*
17
+ Requires-Dist: defusedxml==0.7.1
17
18
  Requires-Dist: flask[async]==3.*
18
19
  Requires-Dist: flask-cors==6.0.2
19
20
  Requires-Dist: geode-common==33.26.6
@@ -21,14 +22,15 @@ Requires-Dist: geode-viewables==3.5.2
21
22
  Requires-Dist: itsdangerous==2.*
22
23
  Requires-Dist: jinja2==3.*
23
24
  Requires-Dist: markupsafe==3.*
24
- Requires-Dist: opengeode-core==18.4.0
25
+ Requires-Dist: opengeode-core==18.4.1
25
26
  Requires-Dist: opengeode-geosciences==9.8.1
26
27
  Requires-Dist: opengeode-geosciencesio==5.11.1
27
28
  Requires-Dist: opengeode-inspector==6.12.1
28
29
  Requires-Dist: opengeode-inspector-geosciences==1.2.1
29
30
  Requires-Dist: opengeode-io==7.10.0
31
+ Requires-Dist: types-defusedxml==0.7.0.20260504
30
32
  Requires-Dist: werkzeug==3.1.8
31
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.3.1
33
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.3.2rc1
32
34
  Dynamic: license-file
33
35
 
34
36
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -51,7 +51,9 @@ src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py
51
51
  src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py
52
52
  src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py
53
53
  src/opengeodeweb_back/geode_objects/geode_vertex_set.py
54
+ src/opengeodeweb_back/routes/__init__.py
54
55
  src/opengeodeweb_back/routes/blueprint_routes.py
56
+ src/opengeodeweb_back/routes/create/__init__.py
55
57
  src/opengeodeweb_back/routes/create/blueprint_create.py
56
58
  src/opengeodeweb_back/routes/create/schemas/__init__.py
57
59
  src/opengeodeweb_back/routes/create/schemas/edged_curve.json
@@ -1,6 +1,7 @@
1
1
  asgiref==3.*
2
2
  blinker==1.*
3
3
  click==8.*
4
+ defusedxml==0.7.1
4
5
  flask[async]==3.*
5
6
  flask-cors==6.0.2
6
7
  geode-common==33.26.6
@@ -8,11 +9,12 @@ geode-viewables==3.5.2
8
9
  itsdangerous==2.*
9
10
  jinja2==3.*
10
11
  markupsafe==3.*
11
- opengeode-core==18.4.0
12
+ opengeode-core==18.4.1
12
13
  opengeode-geosciences==9.8.1
13
14
  opengeode-geosciencesio==5.11.1
14
15
  opengeode-inspector==6.12.1
15
16
  opengeode-inspector-geosciences==1.2.1
16
17
  opengeode-io==7.10.0
18
+ types-defusedxml==0.7.0.20260504
17
19
  werkzeug==3.1.8
18
- opengeodeweb-microservice==1.*,>=1.3.1
20
+ opengeodeweb-microservice==1.*,>=1.3.2rc1
@@ -1,75 +1,82 @@
1
1
  """Packages"""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import argparse
4
- import os
5
- from threading import Timer
6
- from typing import Any
6
+ import json
7
+ import logging
8
+ import queue
9
+ from pathlib import Path
10
+ from typing import TYPE_CHECKING, Any
11
+
7
12
  import flask
8
- import flask_cors # type: ignore
13
+ import flask_cors # type: ignore[import-untyped]
9
14
  from flask import Flask, Response
10
15
  from flask_cors import cross_origin
16
+ from opengeodeweb_microservice.database import connection
11
17
  from werkzeug.exceptions import HTTPException
12
- from opengeodeweb_back import utils_functions, app_config
18
+
19
+ from opengeodeweb_back import app_config, utils_functions
13
20
  from opengeodeweb_back.routes import blueprint_routes
14
21
  from opengeodeweb_back.routes.create import blueprint_create
15
- from opengeodeweb_microservice.database import connection
16
22
 
17
- import queue
18
- import threading
19
- import json
20
- from typing import Any, Dict, Generator, Tuple
23
+ if TYPE_CHECKING:
24
+ from collections.abc import Generator
21
25
 
26
+ logger = logging.getLogger(__name__)
22
27
 
23
- def create_app(name: str) -> flask.Flask:
24
- app = flask.Flask(name)
25
28
 
29
+ def _register_request_hooks(app: flask.Flask) -> None:
26
30
  @app.before_request
27
31
  def before_request() -> flask.Response | None:
28
32
  if flask.request.method == "OPTIONS":
29
33
  response = flask.make_response()
30
- response.headers["Access-Control-Allow-Methods"] = (
31
- "GET,POST,PUT,DELETE,OPTIONS"
32
- )
34
+ response.headers["Access-Control-Allow-Methods"] = "GET,POST,PUT,DELETE,OPTIONS"
33
35
  return response
34
36
  utils_functions.before_request(flask.current_app)
35
37
  return None
36
38
 
39
+ @app.teardown_request
40
+ def teardown_request(exception: BaseException | None) -> None:
41
+ utils_functions.teardown_request(flask.current_app, exception)
42
+
43
+
44
+ def _register_event_stream(app: flask.Flask) -> None:
37
45
  def wants_event_stream() -> bool:
38
46
  accept = flask.request.headers.get("Accept", "")
39
47
  return "text/event-stream" in accept
40
48
 
41
49
  _event_queue: queue.Queue[tuple[str, dict[str, Any]]] = queue.Queue()
42
- _lock = threading.Lock()
43
50
 
44
51
  def publish_event(event: str, data: dict[str, Any]) -> None:
45
52
  _event_queue.put((event, data))
46
53
 
47
- def stream_events() -> Generator[str, None, None]:
54
+ def stream_events() -> Generator[str]:
48
55
  while True:
49
56
  event, data = _event_queue.get()
50
57
  yield f"event: {event}\ndata: {json.dumps(data)}\n\n"
51
58
 
52
59
  @app.after_request
53
60
  def after_request(response: flask.Response) -> flask.Response:
54
- endpoint = (
55
- flask.request.endpoint.replace(".", "/") if flask.request.endpoint else None
56
- )
57
- if endpoint == "events" or endpoint == None:
61
+ endpoint = flask.request.endpoint.replace(".", "/") if flask.request.endpoint else None
62
+ if endpoint in {"events", None}:
58
63
  return response
59
64
 
60
65
  if wants_event_stream():
61
66
  payload: dict[str, Any]
62
67
  try:
63
68
  payload = response.get_json()
64
- except Exception:
69
+ except ValueError:
65
70
  payload = {"status": response.status_code}
66
71
  publish_event(endpoint, payload)
67
72
  return response
68
73
 
69
- @app.teardown_request
70
- def teardown_request(exception: BaseException | None) -> None:
71
- utils_functions.teardown_request(flask.current_app, exception)
74
+ @app.route("/events")
75
+ def events() -> flask.Response:
76
+ return flask.Response(stream_events(), mimetype="text/event-stream")
72
77
 
78
+
79
+ def _register_error_handlers(app: flask.Flask) -> None:
73
80
  @app.errorhandler(HTTPException)
74
81
  def errorhandler(exception: HTTPException) -> tuple[dict[str, Any], int] | Response:
75
82
  return utils_functions.handle_exception(exception)
@@ -78,16 +85,14 @@ def create_app(name: str) -> flask.Flask:
78
85
  def handle_generic_exception(exception: Exception) -> Response:
79
86
  return utils_functions.handle_unexpected_exception(exception)
80
87
 
81
- @app.route("/events")
82
- def events() -> flask.Response:
83
- return flask.Response(stream_events(), mimetype="text/event-stream")
84
88
 
89
+ def _register_base_routes(app: flask.Flask) -> None:
85
90
  @app.route(
86
91
  "/error",
87
92
  methods=["POST"],
88
93
  )
89
94
  def return_error() -> Response:
90
- flask.abort(500, f"Test")
95
+ flask.abort(500, "Test")
91
96
  return flask.make_response({}, 500)
92
97
 
93
98
  @app.route(
@@ -104,6 +109,13 @@ def create_app(name: str) -> flask.Flask:
104
109
  def root() -> Response:
105
110
  return flask.make_response({}, 200)
106
111
 
112
+
113
+ def create_app(name: str) -> flask.Flask:
114
+ app = flask.Flask(name)
115
+ _register_request_hooks(app)
116
+ _register_event_stream(app)
117
+ _register_error_handlers(app)
118
+ _register_base_routes(app)
107
119
  return app
108
120
 
109
121
 
@@ -127,8 +139,9 @@ def run_server(app: Flask) -> None:
127
139
  pre_args, _ = pre_parser.parse_known_args()
128
140
 
129
141
  if pre_args.project_folder_path is None:
130
- raise ValueError("project_folder_path must be provided")
131
- project_folder_path = os.path.abspath(pre_args.project_folder_path)
142
+ msg = "project_folder_path must be provided"
143
+ raise ValueError(msg)
144
+ project_folder_path = str(Path(pre_args.project_folder_path).resolve())
132
145
 
133
146
  if pre_args.debug:
134
147
  app.config.from_object(app_config.DevConfig(project_folder_path))
@@ -138,9 +151,7 @@ def run_server(app: Flask) -> None:
138
151
  parser = argparse.ArgumentParser(
139
152
  prog="OpenGeodeWeb-Back", description="Backend server for OpenGeodeWeb"
140
153
  )
141
- parser.add_argument(
142
- "--host", default=app.config.get("HOST"), type=str, help="Host to run on"
143
- )
154
+ parser.add_argument("--host", default=app.config.get("HOST"), type=str, help="Host to run on")
144
155
  parser.add_argument(
145
156
  "-p",
146
157
  "--port",
@@ -192,9 +203,13 @@ def run_server(app: Flask) -> None:
192
203
  )
193
204
  args = parser.parse_args()
194
205
 
195
- args.project_folder_path = os.path.abspath(args.project_folder_path)
206
+ args.project_folder_path = str(Path(args.project_folder_path).resolve())
196
207
 
197
- print(f"{args=}", flush=True)
208
+ logging.basicConfig(
209
+ level=logging.DEBUG if args.debug else logging.INFO,
210
+ format="%(asctime)s %(levelname)s %(name)s: %(message)s",
211
+ )
212
+ logger.info("Arguments: %s", args)
198
213
 
199
214
  app.config.update(
200
215
  HOST=args.host,
@@ -209,16 +224,15 @@ def run_server(app: Flask) -> None:
209
224
 
210
225
  db_filename = app.config.get("DATABASE_FILENAME")
211
226
  if not isinstance(db_filename, str):
212
- raise TypeError(
213
- f"DATABASE_FILENAME config must be a string, got {db_filename!r}"
214
- )
215
- db_path = os.path.join(str(app.config.get("DATA_FOLDER_PATH")), db_filename)
216
- os.makedirs(os.path.dirname(db_path), exist_ok=True)
227
+ msg = f"DATABASE_FILENAME config must be a string, got {db_filename!r}"
228
+ raise TypeError(msg)
229
+ db_path = Path(str(app.config.get("DATA_FOLDER_PATH"))) / db_filename
230
+ db_path.parent.mkdir(parents=True, exist_ok=True)
217
231
  app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
218
232
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
219
233
 
220
234
  connection.init_database(db_path)
221
- print(f"Database initialized at: {db_path}", flush=True)
235
+ logger.info("Database initialized at: %s", db_path)
222
236
 
223
237
  flask_cors.CORS(app, origins=args.allowed_origins)
224
238
  app.run(
@@ -233,7 +247,7 @@ def run_opengeodeweb_back() -> None:
233
247
  app = create_app(__name__)
234
248
  register_ogw_back_blueprints(app)
235
249
  run_server(app)
236
- print("Server stopped", flush=True)
250
+ logger.info("Server stopped")
237
251
 
238
252
 
239
253
  # ''' Main '''
@@ -1,15 +1,17 @@
1
1
  # Standard library imports
2
- import os
3
2
  import time
3
+ from pathlib import Path
4
4
 
5
5
  # Third party imports
6
+ from flask.helpers import get_debug_flag
7
+
6
8
  # Local application imports
7
9
 
8
- base_dir = os.path.dirname(os.path.abspath(__file__))
10
+ base_dir = Path(__file__).resolve().parent
9
11
 
10
12
 
11
- class Config(object):
12
- FLASK_DEBUG = os.environ.get("FLASK_DEBUG", default=False)
13
+ class Config:
14
+ FLASK_DEBUG = get_debug_flag()
13
15
  HOST = "localhost"
14
16
  PORT = "5000"
15
17
  CORS_HEADERS = "Content-Type"
@@ -18,11 +20,11 @@ class Config(object):
18
20
  LAST_PING_TIME = time.time()
19
21
  DATABASE_FILENAME = "project.db"
20
22
 
21
- def __init__(self, project_folder_path: str):
23
+ def __init__(self, project_folder_path: str) -> None:
22
24
  self.PROJECT_FOLDER_PATH = project_folder_path
23
- self.DATA_FOLDER_PATH = os.path.join(project_folder_path, "data")
24
- self.EXTENSIONS_FOLDER_PATH = os.path.join(project_folder_path, "extensions")
25
- self.UPLOAD_FOLDER_PATH = os.path.join(project_folder_path, "uploads")
25
+ self.DATA_FOLDER_PATH = str(Path(project_folder_path) / "data")
26
+ self.EXTENSIONS_FOLDER_PATH = str(Path(project_folder_path) / "extensions")
27
+ self.UPLOAD_FOLDER_PATH = str(Path(project_folder_path) / "uploads")
26
28
 
27
29
 
28
30
  class ProdConfig(Config):
@@ -1,9 +1,13 @@
1
+ from __future__ import annotations
2
+
1
3
  # Standard library imports
2
- import os
4
+ import logging
5
+ from pathlib import Path
6
+ from typing import TYPE_CHECKING
3
7
 
4
8
  # Third party imports
5
- import werkzeug
6
9
  import flask
10
+ import werkzeug
7
11
  from opengeodeweb_microservice.database.data import Data
8
12
  from opengeodeweb_microservice.database.data_types import (
9
13
  GeodeObjectType,
@@ -12,15 +16,20 @@ from opengeodeweb_microservice.database.data_types import (
12
16
 
13
17
  # Local application imports
14
18
  from .geode_objects import geode_objects
15
- from .geode_objects.geode_object import GeodeObject
19
+
20
+ if TYPE_CHECKING:
21
+ from .geode_objects.geode_object import GeodeObject
22
+
23
+
24
+ logger = logging.getLogger(__name__)
16
25
 
17
26
 
18
27
  def data_file_path(data_id: str, filename: str | None = None) -> str:
19
28
  data_folder_path = flask.current_app.config["DATA_FOLDER_PATH"]
20
- data_path = os.path.join(data_folder_path, data_id)
29
+ data_path = Path(data_folder_path) / data_id
21
30
  if filename is not None:
22
- return os.path.join(data_path, filename)
23
- return data_path
31
+ return str(data_path / filename)
32
+ return str(data_path)
24
33
 
25
34
 
26
35
  def geode_object_from_string(value: str) -> type[GeodeObject]:
@@ -33,8 +42,11 @@ def load_geode_object(data_id: str) -> GeodeObject:
33
42
  flask.abort(404, f"Data with id {data_id} not found")
34
43
 
35
44
  file_absolute_path = data_file_path(data_id, data.native_file)
36
- print("Loading file: ", file_absolute_path)
37
- print("File exists: ", os.path.exists(file_absolute_path))
45
+ logger.debug(
46
+ "Loading file: %s (exists: %s)",
47
+ file_absolute_path,
48
+ Path(file_absolute_path).exists(),
49
+ )
38
50
  return geode_object_from_string(data.geode_object).load(file_absolute_path)
39
51
 
40
52
 
@@ -48,7 +60,7 @@ def get_data_info(data_id: str) -> Data:
48
60
  def upload_file_path(filename: str) -> str:
49
61
  upload_folder = flask.current_app.config["UPLOAD_FOLDER_PATH"]
50
62
  secure_filename = werkzeug.utils.secure_filename(filename)
51
- return os.path.abspath(os.path.join(upload_folder, secure_filename))
63
+ return str((Path(upload_folder) / secure_filename).resolve())
52
64
 
53
65
 
54
66
  def geode_object_output_extensions(
@@ -56,20 +68,16 @@ def geode_object_output_extensions(
56
68
  ) -> dict[GeodeObjectType, dict[str, bool]]:
57
69
  results: dict[GeodeObjectType, dict[str, bool]] = {}
58
70
  for mixin_geode_object in geode_objects[geode_object.geode_object_type()].__mro__:
59
- output_extensions_method = getattr(
60
- mixin_geode_object, "output_extensions", None
61
- )
71
+ output_extensions_method = getattr(mixin_geode_object, "output_extensions", None)
62
72
  if output_extensions_method is None:
63
73
  continue
64
74
  output_extensions = output_extensions_method.__func__(mixin_geode_object)
65
75
  if output_extensions is None:
66
76
  continue
67
77
  object_output_extensions: dict[str, bool] = {}
68
- is_saveable_method = getattr(mixin_geode_object, "is_saveable")
78
+ is_saveable_method = mixin_geode_object.is_saveable # type: ignore[attr-defined]
69
79
  for output_extension in output_extensions:
70
- bool_is_saveable = is_saveable_method(
71
- geode_object, f"test.{output_extension}"
72
- )
80
+ bool_is_saveable = is_saveable_method(geode_object, f"test.{output_extension}")
73
81
  object_output_extensions[output_extension] = bool_is_saveable
74
82
  if hasattr(mixin_geode_object, "geode_object_type"):
75
83
  results[mixin_geode_object.geode_object_type()] = object_output_extensions
@@ -1,37 +1,42 @@
1
1
  # Standard library imports
2
2
  from __future__ import annotations
3
3
 
4
- # Third party imports
5
- from opengeodeweb_microservice.database.data_types import GeodeObjectType
4
+ from typing import TYPE_CHECKING
6
5
 
7
- # Local application imports
8
- from .geode_object import GeodeObject
6
+ # Third party imports
9
7
  from .geode_brep import GeodeBRep
10
- from .geode_vertex_set import GeodeVertexSet
8
+ from .geode_cross_section import GeodeCrossSection
9
+ from .geode_edged_curve2d import GeodeEdgedCurve2D
10
+ from .geode_edged_curve3d import GeodeEdgedCurve3D
11
11
  from .geode_graph import GeodeGraph
12
+ from .geode_horizon_stack3d import GeodeHorizonStack3D
13
+ from .geode_hybrid_solid3d import GeodeHybridSolid3D
14
+ from .geode_implicit_cross_section import GeodeImplicitCrossSection
15
+ from .geode_implicit_structural_model import GeodeImplicitStructuralModel
16
+ from .geode_light_regular_grid2d import GeodeLightRegularGrid2D
17
+ from .geode_light_regular_grid3d import GeodeLightRegularGrid3D
18
+
19
+ # Local application imports
12
20
  from .geode_point_set2d import GeodePointSet2D
13
21
  from .geode_point_set3d import GeodePointSet3D
14
- from .geode_edged_curve2d import GeodeEdgedCurve2D
15
- from .geode_edged_curve3d import GeodeEdgedCurve3D
16
- from .geode_raster_image2d import GeodeRasterImage2D
17
- from .geode_raster_image3d import GeodeRasterImage3D
18
22
  from .geode_polygonal_surface2d import GeodePolygonalSurface2D
19
23
  from .geode_polygonal_surface3d import GeodePolygonalSurface3D
20
- from .geode_triangulated_surface2d import GeodeTriangulatedSurface2D
21
- from .geode_triangulated_surface3d import GeodeTriangulatedSurface3D
22
- from .geode_regular_grid2d import GeodeRegularGrid2D
23
24
  from .geode_polyhedral_solid3d import GeodePolyhedralSolid3D
24
- from .geode_tetrahedral_solid3d import GeodeTetrahedralSolid3D
25
- from .geode_hybrid_solid3d import GeodeHybridSolid3D
25
+ from .geode_raster_image2d import GeodeRasterImage2D
26
+ from .geode_raster_image3d import GeodeRasterImage3D
27
+ from .geode_regular_grid2d import GeodeRegularGrid2D
26
28
  from .geode_regular_grid3d import GeodeRegularGrid3D
27
- from .geode_light_regular_grid2d import GeodeLightRegularGrid2D
28
- from .geode_light_regular_grid3d import GeodeLightRegularGrid3D
29
29
  from .geode_section import GeodeSection
30
30
  from .geode_structural_model import GeodeStructuralModel
31
- from .geode_cross_section import GeodeCrossSection
32
- from .geode_implicit_structural_model import GeodeImplicitStructuralModel
33
- from .geode_implicit_cross_section import GeodeImplicitCrossSection
34
- from .geode_horizon_stack3d import GeodeHorizonStack3D
31
+ from .geode_tetrahedral_solid3d import GeodeTetrahedralSolid3D
32
+ from .geode_triangulated_surface2d import GeodeTriangulatedSurface2D
33
+ from .geode_triangulated_surface3d import GeodeTriangulatedSurface3D
34
+ from .geode_vertex_set import GeodeVertexSet
35
+
36
+ if TYPE_CHECKING:
37
+ from opengeodeweb_microservice.database.data_types import GeodeObjectType
38
+
39
+ from .geode_object import GeodeObject
35
40
 
36
41
  geode_objects: dict[GeodeObjectType, type[GeodeObject]] = {
37
42
  "VertexSet": GeodeVertexSet,