diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 660fa0cf..f2329ba6 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -9,15 +9,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Python Semantic Release + uses: python-semantic-release/python-semantic-release@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} - name: Build run: | + cat pyproject.toml python3 -m pip install --upgrade build python3 -m build - # - name: Python Semantic Release - # uses: python-semantic-release/python-semantic-release@master - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - name: Upload run: | python3 -m pip install twine diff --git a/.gitignore b/.gitignore index 85b83c49..fe6aeb3e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .pytest_cache -dist \ No newline at end of file +dist +venv +__pycache__ diff --git a/pyproject.toml b/pyproject.toml index 271ede9c..7bf00dfd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,9 +5,10 @@ build-backend = "setuptools.build_meta" [project] name = "OpenGeodeWeb-Back" -version = "0.0.16" +version = "1.1.0-rc.1" +dynamic = ["dependencies"] authors = [ - { name="Geode-solutions", email="contact@geode-solutions.com" }, + { name="Geode-solutions", email="team-web@geode-solutions.com" }, ] description = "OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem" readme = "README.md" @@ -17,33 +18,25 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] -dependencies = [ - "geode-viewables>=2.0.3", - "opengeode-core>=14.4.1", - "opengeode-geosciences>=7.1.1", - "opengeode-geosciencesio>=4.1.6", - "opengeode-inspector>=3.0.7", - "opengeode-io>=6.0.10", -] [project.urls] "Homepage" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back" "Bug Tracker" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back/issues" -[tool.setuptools.packages.find] -where = ["src"] -namespaces = false - [tool.setuptools.dynamic] dependencies = {file = ["requirements.txt"]} [tool.semantic_release] -version_variable = "pyproject.toml:version" +version_toml = [ + "pyproject.toml:project.version", +] + +[tool.semantic_release.remote.token] +env = "GH_TOKEN" [tool.semantic_release.branches.master] match = "master" [tool.semantic_release.branches.next] match = "next" -prerelease_tag = "rc" prerelease = true diff --git a/requirements.txt b/requirements.txt index 2d734868..9a5b4577 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,34 +2,33 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --resolver=backtracking requirements.in +# pip-compile requirements.in # -geode-common==26.1.5 +geode-common==26.3.0 # via geode-viewables -geode-viewables==2.0.3 +geode-viewables==2.1.0 # via -r requirements.in -opengeode-core==14.4.5 +opengeode-core==14.8.0 # via # -r requirements.in - # geode-common # geode-viewables # opengeode-geosciences # opengeode-geosciencesio # opengeode-inspector # opengeode-io -opengeode-geosciences==7.1.4 +opengeode-geosciences==7.2.0 # via # -r requirements.in # geode-viewables # opengeode-geosciencesio # opengeode-inspector -opengeode-geosciencesio==4.2.1 +opengeode-geosciencesio==4.5.0 # via # -r requirements.in # opengeode-inspector -opengeode-inspector==3.0.8 +opengeode-inspector==3.1.0 # via -r requirements.in -opengeode-io==6.0.10 +opengeode-io==6.2.0 # via # -r requirements.in # geode-viewables diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index fa88c427..7883ca52 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -16,34 +16,131 @@ from .geode_objects import objects_list -def list_all_input_extensions(crs=False): +def get_input(geode_object: str): + return objects_list()[geode_object]["input"] + + +def get_output(geode_object: str): + return objects_list()[geode_object]["output"] + + +def load(geode_object: str, file_absolute_path: str): + return objects_list()[geode_object]["load"](file_absolute_path) + + +def save(geode_object: str, data, folder_absolute_path: str, filename: str): + return objects_list()[geode_object]["save"]( + data, os.path.join(folder_absolute_path, filename) + ) + + +def get_builder(geode_object: str, data): + return objects_list()[geode_object]["builder"](data) + + +def assign_crs(geode_object: str, data, crs_name: str, info): + builder = get_builder(geode_object, data) + objects_list()[geode_object]["crs"]["assign"](data, builder, crs_name, info) + + +def convert_crs(geode_object: str, data, crs_name: str, info): + builder = get_builder(geode_object, data) + objects_list()[geode_object]["crs"]["convert"](data, builder, crs_name, info) + + +def create_coordinate_system( + geode_object: str, + data, + name: str, + input_coordiante_system, + output_coordiante_system, +): + builder = get_builder(geode_object, data) + objects_list()[geode_object]["crs"]["create"]( + data, builder, name, input_coordiante_system, output_coordiante_system + ) + + +def is_model(geode_object: str): + return objects_list()[geode_object]["is_model"] + + +def is_3D(geode_object: str): + return objects_list()[geode_object]["is_3D"] + + +def is_viewable(geode_object: str): + return objects_list()[geode_object]["is_viewable"] + + +def save_viewable(geode_object: str, data, folder_absolute_path: str, id: str): + return objects_list()[geode_object]["save_viewable"]( + data, os.path.join(folder_absolute_path, id) + ) + + +def get_inspector(geode_object: str, data): + return objects_list()[geode_object]["inspector"](data) + + +def get_geode_object_input_extensions(geode_object: str): + inputs_list = [] + geode_object_inputs = get_input(geode_object) + + for input in geode_object_inputs: + list_creators = input.list_creators() + inputs_list = inputs_list + list_creators + inputs_list = list(set(inputs_list)) + inputs_list.sort() + return inputs_list + + +def get_geode_object_output_extensions(geode_object: str): + output_list = [] + geode_object_outputs = get_output(geode_object) + + for output in geode_object_outputs: + list_creators = output.list_creators() + output_list = output_list + list_creators + output_list = list(set(output_list)) + output_list.sort() + return output_list + + +def list_input_extensions( + keys: list = [], +): """ Purpose: Function that returns a list of all input extensions Args: - crs -- Tells the function if we want the geode_objects that have a crs + keys -- Tells the function if we want the geode_objects that have a crs + geode_object -- The name of the geode_object Returns: An ordered list of input file extensions """ - List = [] - geode_object_dict = objects_list() + extensions_list = [] - for geode_object in geode_object_dict.values(): - values = geode_object["input"] + for geode_object, value in objects_list().items(): + if keys: + for key in keys: + if key in geode_object: + if type(geode_object[key]) == bool and geode_object[key] == True: + continue + else: + continue + else: + continue - # if crs == True: - # if "crs" not in geode_object: - # continue - for value in values: - list_creators = value.list_creators() - for creator in list_creators: - if creator not in List: - List.append(creator) - List.sort() - return List + geode_object_list_inputs = get_geode_object_input_extensions(geode_object) + extensions_list = extensions_list + geode_object_list_inputs + extensions_list = list(set(extensions_list)) + extensions_list.sort() + return extensions_list -def list_objects(extension: str, is_viewable: bool = True): + +def list_geode_objects(extension: str, keys: list = []): """ Purpose: Function that returns a list of objects that can handle a file, given his extension @@ -52,40 +149,16 @@ def list_objects(extension: str, is_viewable: bool = True): Returns: An ordered list of object's names """ - return_list = [] - geode_object_dict = objects_list() - - for object_, values in geode_object_dict.items(): - # if values["is_viewable"] == is_viewable: - list_values = values["input"] - for value in list_values: - if value.has_creator(extension): - if object_ not in return_list: - return_list.append(object_) - return_list.sort() - return return_list - - -def list_output_file_extensions(object: str): - """ - Purpose: - Function that returns a list of output file extensions that can be handled by an object - Args: - object -- The name of the object - Returns: - An ordered list of file extensions - """ - List = [] - geode_object_dict = objects_list() + geode_objects_list = [] - values = geode_object_dict[object]["output"] - for value in values: - list_creators = value.list_creators() - for creator in list_creators: - if creator not in List: - List.append(creator) - List.sort() - return List + for geode_object, value in objects_list().items(): + geode_object_inputs = get_geode_object_input(geode_object) + for input in geode_object_inputs: + if input.has_creator(extension): + if geode_object not in geode_objects_list: + geode_objects_list.append(geode_object) + geode_objects_list.sort() + return geode_objects_list def get_versions(list_packages: list): @@ -157,41 +230,12 @@ def func_wrapper(): return t -def is_model(geode_object): - return objects_list()[geode_object]["is_model"] - - -def is_3D(geode_object): - return objects_list()[geode_object]["is_3D"] - - -def get_builder(geode_object, data): - return objects_list()[geode_object]["builder"](data) - - -def get_inspector(geode_object, data): - return objects_list()[geode_object]["inspector"](data) - - -def load(geode_object, file_absolute_path): - return objects_list()[geode_object]["load"](file_absolute_path) - - -def save(data, geode_object, folder_absolute_path, filename): - objects_list()[geode_object]["save"]( - data, os.path.join(folder_absolute_path, filename) - ) - - -def save_viewable(data, geode_object, folder_absolute_path, id): - return objects_list()[geode_object]["save_viewable"]( - data, os.path.join(folder_absolute_path, id) - ) +def get_extension_from_filename(filename): + return os.path.splitext(filename)[1][1:] def get_form_variables(form, variables_array): variables_dict = {} - for variable in variables_array: if form.get(variable) is None: flask.abort(400, f"No {variable} sent") @@ -200,14 +244,14 @@ def get_form_variables(form, variables_array): return variables_dict -def get_geographic_coordinate_systems(geode_object): +def get_geographic_coordinate_systems(geode_object: str): if is_3D(geode_object): return og_gs.GeographicCoordinateSystem3D.geographic_coordinate_systems() else: return og_gs.GeographicCoordinateSystem2D.geographic_coordinate_systems() -def get_geographic_coordinate_systems_info(geode_object, crs): +def get_geographic_coordinate_systems_info(geode_object: str, crs): if is_3D(geode_object): return og_gs.GeographicCoordinateSystemInfo3D( crs["authority"], crs["code"], crs["name"] @@ -218,7 +262,7 @@ def get_geographic_coordinate_systems_info(geode_object, crs): ) -def get_coordinate_system(geode_object, coordinate_system): +def get_coordinate_system(geode_object: str, coordinate_system): return og.CoordinateSystem2D( [ og.Vector2D( @@ -242,24 +286,18 @@ def get_coordinate_system(geode_object, coordinate_system): ) -def assign_geographic_coordinate_system_info(geode_object, data, input_crs): - builder = get_builder(geode_object, data) +def assign_geographic_coordinate_system_info(geode_object: str, data, input_crs): info = get_geographic_coordinate_systems_info(geode_object, input_crs) - objects_list()[geode_object]["crs"]["assign"]( - data, builder, input_crs["name"], info - ) + assign_crs(geode_object, data, input_crs["name"], info) -def convert_geographic_coordinate_system_info(geode_object, data, output_crs): - builder = get_builder(geode_object, data) +def convert_geographic_coordinate_system_info(geode_object: str, data, output_crs): info = get_geographic_coordinate_systems_info(geode_object, output_crs) - objects_list()[geode_object]["crs"]["convert"]( - data, builder, output_crs["name"], info - ) + convert_crs(geode_object, data, output_crs["name"], info) def create_coordinate_system( - geode_object, data, name, input_coordinate_points, output_coordinate_points + geode_object: str, data, name, input_coordinate_points, output_coordinate_points ): builder = get_builder(geode_object, data) @@ -269,6 +307,6 @@ def create_coordinate_system( output_coordiante_system = get_coordinate_system( geode_object, output_coordinate_points ) - objects_list()[geode_object]["crs"]["create"]( - data, builder, name, input_coordiante_system, output_coordiante_system + create_crs( + geode_object, data, name, input_coordiante_system, output_coordiante_system ) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..5871ed8e --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1 @@ +import pytest diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py new file mode 100644 index 00000000..5be700b9 --- /dev/null +++ b/tests/test_geode_functions.py @@ -0,0 +1,6 @@ +from .src import geode_functions + + +def test_is_model(): + response = geode_functions.is_model("BRep") + assert response == True