From d8a9b557ebc4f04df1efcc3422164e6c5ab92583 Mon Sep 17 00:00:00 2001 From: Pedro Camargo Date: Tue, 17 Mar 2020 14:15:00 +1000 Subject: [PATCH] Importing structure for building (#111) * Importing structure for building * cleans tests * Windows testing (#113) test updating and new workflows for Windows testing and build * changes for comments * changes for comments --- .github/workflows/build_linux.yml | 2 +- .github/workflows/build_mac.yml | 2 +- .github/workflows/build_windows.yml | 10 ++-- .github/workflows/build_windows32.yml | 42 ++++++++++++++++ .github/workflows/documentation.yml | 2 +- .github/workflows/documentationDev.yml | 2 +- .github/workflows/linting.yml | 2 +- .github/workflows/test_build_linux.yml | 4 +- .github/workflows/test_build_mac.yml | 4 +- .github/workflows/test_build_windows.yml | 12 ++--- .github/workflows/test_build_windows32.yml | 35 ++++++++++++++ .github/workflows/test_windows.yml | 41 ++++++++++++++++ .github/workflows/upload_tar.yml | 2 +- .gitignore | 6 ++- README.rst | 6 ++- aequilibrae/paths/__init__.py | 9 +++- aequilibrae/paths/all_or_nothing.py | 8 +++- aequilibrae/paths/linear_approximation.py | 14 ++++-- aequilibrae/paths/network_skimming.py | 8 +++- .../paths/results/assignment_results.py | 8 +++- aequilibrae/paths/results/path_results.py | 7 ++- aequilibrae/paths/vdf.py | 7 ++- .../matrix/test_aequilibraEData.py | 1 - .../matrix/test_aequilibraeMatrix.py | 48 +++++++++++++------ tests/aequilibrae/project/test_network.py | 16 ++----- .../aequilibrae/project/test_place_getter.py | 4 +- tests/aequilibrae/transit/test_GTFS.py | 8 +++- .../aequilibrae/transit/test_create_gtfsdb.py | 6 +++ tests/setup_windows_spatialite.py | 26 ++++++++++ tests/temp_data/__init__.py | 0 30 files changed, 275 insertions(+), 67 deletions(-) create mode 100644 .github/workflows/build_windows32.yml create mode 100644 .github/workflows/test_build_windows32.yml create mode 100644 .github/workflows/test_windows.yml create mode 100644 tests/setup_windows_spatialite.py create mode 100644 tests/temp_data/__init__.py diff --git a/.github/workflows/build_linux.yml b/.github/workflows/build_linux.yml index 6310d2831..ae66c903a 100644 --- a/.github/workflows/build_linux.yml +++ b/.github/workflows/build_linux.yml @@ -8,7 +8,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python 3.7 uses: actions/setup-python@v1 with: diff --git a/.github/workflows/build_mac.yml b/.github/workflows/build_mac.yml index 2a19cc55d..6cef9c4ef 100644 --- a/.github/workflows/build_mac.yml +++ b/.github/workflows/build_mac.yml @@ -12,7 +12,7 @@ jobs: matrix: python-version: [ '3.6', '3.7', '3.8' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set Python environment uses: actions/setup-python@v1 with: diff --git a/.github/workflows/build_windows.yml b/.github/workflows/build_windows.yml index 4b9c50bcf..da331887b 100644 --- a/.github/workflows/build_windows.yml +++ b/.github/workflows/build_windows.yml @@ -11,19 +11,19 @@ jobs: matrix: python-version: [ '3.6', '3.7', '3.8' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set Python environment uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} architecture: x64 + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine - pip install numpy cython pyaml pyqt5 pyshp scipy - choco install visualstudio2019community - choco install -y microsoft-build-tools visualcppbuildtools --version 14.0.25420.1 + pip install setuptools + pip install -r requirements.txt + pip install wheel twine - name: Compile library run: | diff --git a/.github/workflows/build_windows32.yml b/.github/workflows/build_windows32.yml new file mode 100644 index 000000000..a8aeea1ef --- /dev/null +++ b/.github/workflows/build_windows32.yml @@ -0,0 +1,42 @@ +name: Upload Windows Python Package + +on: + release: + types: [prereleased, published] + +jobs: + deploy: + runs-on: windows-latest + strategy: + matrix: + python-version: [ '3.6', '3.7', '3.8' ] + steps: + - uses: actions/checkout@v2 + - name: Set Python environment + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + architecture: x86 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools + pip install -r requirements.txt + pip install wheel twine + + - name: Compile library + run: | + cd aequilibrae/paths + python setup_Assignment.py build_ext --inplace + cd .. + cd .. + + - name: Build + run: python setup.py sdist bdist_wheel + + - name: Publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: twine upload dist/*.whl diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 52b97400e..4e174bc60 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -10,7 +10,7 @@ jobs: strategy: max-parallel: 4 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python 3.7 uses: actions/setup-python@v1 with: diff --git a/.github/workflows/documentationDev.yml b/.github/workflows/documentationDev.yml index fe6dd4ef3..ce4194803 100644 --- a/.github/workflows/documentationDev.yml +++ b/.github/workflows/documentationDev.yml @@ -11,7 +11,7 @@ jobs: strategy: max-parallel: 4 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python 3.7 uses: actions/setup-python@v1 with: diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index f3522190e..6a96a08f9 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -13,7 +13,7 @@ jobs: matrix: python-version: [3.6, 3.7, 3.8] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: diff --git a/.github/workflows/test_build_linux.yml b/.github/workflows/test_build_linux.yml index 8da04085c..d8b004690 100644 --- a/.github/workflows/test_build_linux.yml +++ b/.github/workflows/test_build_linux.yml @@ -1,4 +1,4 @@ -name: Upload Linux Python Package +name: Test building Linux Package on: [pull_request] @@ -6,7 +6,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python 3.7 uses: actions/setup-python@v1 with: diff --git a/.github/workflows/test_build_mac.yml b/.github/workflows/test_build_mac.yml index f8ad9d6c5..4d5e235d9 100644 --- a/.github/workflows/test_build_mac.yml +++ b/.github/workflows/test_build_mac.yml @@ -1,4 +1,4 @@ -name: Upload MacOS Python Package +name: Test building MacOS Package on: [pull_request] @@ -10,7 +10,7 @@ jobs: matrix: python-version: [ '3.6', '3.7', '3.8' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set Python environment uses: actions/setup-python@v1 with: diff --git a/.github/workflows/test_build_windows.yml b/.github/workflows/test_build_windows.yml index 073736736..af957399e 100644 --- a/.github/workflows/test_build_windows.yml +++ b/.github/workflows/test_build_windows.yml @@ -1,4 +1,4 @@ -name: Upload Windows Python Package +name: Test building Windows Package on: [pull_request] @@ -9,19 +9,19 @@ jobs: matrix: python-version: [ '3.6', '3.7', '3.8' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set Python environment uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} architecture: x64 + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine - pip install numpy cython pyaml pyqt5 pyshp scipy - choco install visualstudio2019community - choco install -y microsoft-build-tools visualcppbuildtools --version 14.0.25420.1 + pip install setuptools + pip install -r requirements.txt + pip install wheel - name: Compile library run: | diff --git a/.github/workflows/test_build_windows32.yml b/.github/workflows/test_build_windows32.yml new file mode 100644 index 000000000..7128d7c6d --- /dev/null +++ b/.github/workflows/test_build_windows32.yml @@ -0,0 +1,35 @@ +name: Test building Windows 32 bits Package + +on: [pull_request] + +jobs: + deploy: + runs-on: windows-latest + strategy: + matrix: + python-version: [ '3.6', '3.7', '3.8' ] + steps: + - uses: actions/checkout@v2 + - name: Set Python environment + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + architecture: x86 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools + pip install -r requirements.txt + pip install wheel + + + - name: Compile library + run: | + cd aequilibrae/paths + python setup_Assignment.py build_ext --inplace + cd .. + cd .. + + - name: Build + run: python setup.py sdist bdist_wheel \ No newline at end of file diff --git a/.github/workflows/test_windows.yml b/.github/workflows/test_windows.yml new file mode 100644 index 000000000..62febb0fd --- /dev/null +++ b/.github/workflows/test_windows.yml @@ -0,0 +1,41 @@ +name: Tests on Windows + +on: [pull_request] + +jobs: + testing: + runs-on: windows-latest + strategy: + matrix: + python-version: [ '3.6', '3.7', '3.8' ] + steps: + - uses: actions/checkout@v2 + - name: Set Python environment + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools + pip install -r requirements.txt + pip install pytest + + - name: Download spatialite + run: | + cd tests + python setup_windows_spatialite.py + cd .. + + - name: Compile library + run: | + cd aequilibrae/paths + python setup_Assignment.py build_ext --inplace + cd .. + cd .. + + - name: Runs test + run: | + python -m pytest \ No newline at end of file diff --git a/.github/workflows/upload_tar.yml b/.github/workflows/upload_tar.yml index 33d3215fa..730561df1 100644 --- a/.github/workflows/upload_tar.yml +++ b/.github/workflows/upload_tar.yml @@ -11,7 +11,7 @@ jobs: matrix: python-version: [ '3.7' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set Python environment uses: actions/setup-python@v1 with: diff --git a/.gitignore b/.gitignore index 47a58fb80..e48960485 100644 --- a/.gitignore +++ b/.gitignore @@ -65,5 +65,9 @@ docs/source/_generated/* #Virtual environment +.venv/ -.venv/ \ No newline at end of file +# Test files +tests/*.aem +tests/*.csv +tests/*.omx diff --git a/README.rst b/README.rst index ee0b94858..86e0d7c89 100644 --- a/README.rst +++ b/README.rst @@ -14,7 +14,11 @@ AequilibraE .. image:: https://github.com/AequilibraE/aequilibrae/workflows/Tests%20Python%203.7/badge.svg :target: https://github.com/AequilibraE/aequilibrae/workflows/Tests%20Python%203.7/badge.svg - :alt: Unit tests + :alt: Linux Unit tests + +.. image:: https://github.com/AequilibraE/aequilibrae/workflows/Tests%20on%20Windows/badge.svg + :target: https://github.com/AequilibraE/aequilibrae/workflows/Tests%20on%20Windows/badge.svg + :alt: Windows Unit tests .. image:: https://codecov.io/gh/AequilibraE/aequilibrae/branch/master/graph/badge.svg :target: https://codecov.io/gh/AequilibraE/aequilibrae diff --git a/aequilibrae/paths/__init__.py b/aequilibrae/paths/__init__.py index 16a1e1724..08e315291 100644 --- a/aequilibrae/paths/__init__.py +++ b/aequilibrae/paths/__init__.py @@ -1,5 +1,3 @@ -from aequilibrae.paths.AoN import one_to_all, skimming_single_origin, path_computation, VERSION_COMPILED, \ - update_path_trace from aequilibrae.paths.results import * from aequilibrae.paths.multi_threaded_aon import MultiThreadedAoN from aequilibrae.paths.multi_threaded_skimming import MultiThreadedNetworkSkimming @@ -10,3 +8,10 @@ from aequilibrae.paths.vdf import VDF from aequilibrae.paths.graph import Graph from .__version__ import binary_version, release_name, minor_version, release_version +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import one_to_all, skimming_single_origin, path_computation, VERSION_COMPILED, \ + update_path_trace +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') diff --git a/aequilibrae/paths/all_or_nothing.py b/aequilibrae/paths/all_or_nothing.py index bd8d7aad1..2cf01c805 100644 --- a/aequilibrae/paths/all_or_nothing.py +++ b/aequilibrae/paths/all_or_nothing.py @@ -1,13 +1,17 @@ import importlib.util as iutil import threading from multiprocessing.dummy import Pool as ThreadPool - import numpy as np -from .AoN import one_to_all from .multi_threaded_aon import MultiThreadedAoN from ..utils import WorkerThread from aequilibrae.matrix import AequilibraeMatrix +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import one_to_all +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') spec = iutil.find_spec("PyQt5") pyqt = spec is not None diff --git a/aequilibrae/paths/linear_approximation.py b/aequilibrae/paths/linear_approximation.py index f6d522d27..cd68033ea 100644 --- a/aequilibrae/paths/linear_approximation.py +++ b/aequilibrae/paths/linear_approximation.py @@ -6,16 +6,24 @@ from aequilibrae.paths.traffic_class import TrafficClass from aequilibrae.paths.results import AssignmentResults from aequilibrae.paths.all_or_nothing import allOrNothing -from aequilibrae.paths.AoN import linear_combination, linear_combination_skims -from aequilibrae.paths.AoN import triple_linear_combination, triple_linear_combination_skims -from aequilibrae.paths.AoN import copy_one_dimension, copy_two_dimensions, copy_three_dimensions from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import linear_combination, linear_combination_skims + from aequilibrae.paths.AoN import triple_linear_combination, triple_linear_combination_skims + from aequilibrae.paths.AoN import copy_one_dimension, copy_two_dimensions, copy_three_dimensions +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') + import scipy + if int(scipy.__version__.split('.')[1]) >= 3: from scipy.optimize import root_scalar + recent_scipy = True else: from scipy.optimize import root as root_scalar + recent_scipy = False logger.warn(f"Using older version of Scipy. For better performance, use Scipy >= 1.4") diff --git a/aequilibrae/paths/network_skimming.py b/aequilibrae/paths/network_skimming.py index 8c86fb8b9..598bbb2cc 100644 --- a/aequilibrae/paths/network_skimming.py +++ b/aequilibrae/paths/network_skimming.py @@ -1,11 +1,15 @@ import sys import threading from multiprocessing.dummy import Pool as ThreadPool - -from .AoN import skimming_single_origin from .multi_threaded_skimming import MultiThreadedNetworkSkimming from ..utils import WorkerThread import importlib.util as iutil +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import skimming_single_origin +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') spec = iutil.find_spec("PyQt5") pyqt = spec is not None diff --git a/aequilibrae/paths/results/assignment_results.py b/aequilibrae/paths/results/assignment_results.py index 56047b613..2cf7679fe 100644 --- a/aequilibrae/paths/results/assignment_results.py +++ b/aequilibrae/paths/results/assignment_results.py @@ -3,8 +3,13 @@ import warnings from aequilibrae.matrix import AequilibraeMatrix, AequilibraeData from aequilibrae.paths.graph import Graph -from aequilibrae.paths.AoN import sum_axis1 from aequilibrae.parameters import Parameters +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import sum_axis1 +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') """ TO-DO: @@ -18,6 +23,7 @@ class AssignmentResults: """ Assignment result holder for a single :obj:`TrafficClass` with multiple user classes """ + def __init__(self): self.link_loads = None # type: np.array # The actual results for assignment self.total_link_loads = None # type: np.array # The result of the assignment for all user classes summed diff --git a/aequilibrae/paths/results/path_results.py b/aequilibrae/paths/results/path_results.py index d8b7392a6..5938d5f02 100644 --- a/aequilibrae/paths/results/path_results.py +++ b/aequilibrae/paths/results/path_results.py @@ -1,6 +1,11 @@ import numpy as np from aequilibrae.paths.graph import Graph -from aequilibrae.paths.AoN import update_path_trace, path_computation +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import update_path_trace, path_computation +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') class PathResults: diff --git a/aequilibrae/paths/vdf.py b/aequilibrae/paths/vdf.py index 73063c7f7..387dccae7 100644 --- a/aequilibrae/paths/vdf.py +++ b/aequilibrae/paths/vdf.py @@ -1,4 +1,9 @@ -from aequilibrae.paths.AoN import bpr, delta_bpr +from aequilibrae import logger + +try: + from aequilibrae.paths.AoN import bpr, delta_bpr +except ImportError as ie: + logger.warn(f'Could not import procedures from the binary. {ie.args}') all_vdf_functions = ['bpr'] diff --git a/tests/aequilibrae/matrix/test_aequilibraEData.py b/tests/aequilibrae/matrix/test_aequilibraEData.py index 518d69ba9..f363f6c47 100644 --- a/tests/aequilibrae/matrix/test_aequilibraEData.py +++ b/tests/aequilibrae/matrix/test_aequilibraEData.py @@ -1,7 +1,6 @@ import os import tempfile from unittest import TestCase - import numpy as np from aequilibrae.matrix import AequilibraeData diff --git a/tests/aequilibrae/matrix/test_aequilibraeMatrix.py b/tests/aequilibrae/matrix/test_aequilibraeMatrix.py index 366bc7c17..e88b8b402 100644 --- a/tests/aequilibrae/matrix/test_aequilibraeMatrix.py +++ b/tests/aequilibrae/matrix/test_aequilibraeMatrix.py @@ -3,27 +3,29 @@ import random import openmatrix as omx from unittest import TestCase - +from os.path import dirname, join import numpy as np - +import uuid from aequilibrae.matrix import AequilibraeMatrix from ...data import omx_example, no_index_omx, siouxfalls_skims zones = 50 -name_test = AequilibraeMatrix().random_name() -copy_matrix_name = AequilibraeMatrix().random_name() -csv_export_name = copy_matrix_name + ".csv" -omx_export_name = copy_matrix_name + ".omx" class TestAequilibraeMatrix(TestCase): matrix = None def setUp(self) -> None: + temp_folder = dirname(dirname(dirname(os.path.abspath(__file__)))) + self.name_test = temp_folder + f"/Aequilibrae_matrix_{uuid.uuid4()}.aem" + self.copy_matrix_name = temp_folder + f"/Aequilibrae_matrix_{uuid.uuid4()}.aem" + self.csv_export_name = temp_folder + f"/Aequilibrae_matrix_{uuid.uuid4()}.csv" + self.omx_export_name = temp_folder + f"/Aequilibrae_matrix_{uuid.uuid4()}.omx" + if self.matrix is not None: return args = { - "file_name": name_test, + "file_name": self.name_test, "zones": zones, "matrix_names": ["mat", "seed", "dist"], "index_names": ["my indices"], @@ -43,8 +45,11 @@ def setUp(self) -> None: def tearDown(self) -> None: try: - os.remove(name_test) if os.path.exists(name_test) else None - self.matrix = None + del self.matrix + os.remove(self.name_test) if os.path.exists(self.name_test) else None + os.remove(self.csv_export_name) if os.path.exists(self.csv_export_name) else None + os.remove(self.copy_matrix_name) if os.path.exists(self.copy_matrix_name) else None + os.remove(self.omx_export_name) if os.path.exists(self.omx_export_name) else None except Exception as e: print(f'Could not delete. {e.args}') @@ -55,7 +60,8 @@ def test_load(self): self.new_matrix.load(no_index_omx) self.new_matrix = AequilibraeMatrix() - self.new_matrix.load(name_test) + self.new_matrix.load(self.name_test) + del self.new_matrix def test_computational_view(self): self.new_matrix.computational_view(["mat", "seed"]) @@ -72,6 +78,7 @@ def test_computational_view(self): self.new_matrix.setDescription( "Generated at " + datetime.datetime.now().strftime("%I:%M%p on %B %d, %Y") ) + del self.new_matrix def test_computational_view_with_omx(self): self.new_matrix = AequilibraeMatrix() @@ -95,23 +102,26 @@ def test_computational_view_with_omx(self): self.assertEqual(m1, total_m1) omx_file.close() + del omx_file def test_copy(self): # test in-memory matrix_procedures copy - matrix_copy = self.new_matrix.copy(copy_matrix_name, cores=["mat"]) + matrix_copy = self.new_matrix.copy(self.copy_matrix_name, cores=["mat"]) if not np.array_equal(matrix_copy.mat, self.new_matrix.mat): self.fail("Matrix copy was not perfect") matrix_copy.close() + del matrix_copy def test_export_to_csv(self): - self.new_matrix.export(csv_export_name) + self.new_matrix.export(self.csv_export_name) + del self.new_matrix def test_export_to_omx(self): - self.new_matrix.export(omx_export_name) + self.new_matrix.export(self.omx_export_name) - omxfile = omx.open_file(omx_export_name, "r") + omxfile = omx.open_file(self.omx_export_name, "r") # Check if matrices values are compatible for m in self.new_matrix.names: @@ -121,6 +131,7 @@ def test_export_to_omx(self): self.assertEqual( sm, sm2, "Matrix {} was exported with the wrong value".format(m) ) + del omxfile def test_nan_to_num(self): m = self.new_matrix.mat.sum() - self.new_matrix.mat[1, 1] @@ -132,6 +143,7 @@ def test_nan_to_num(self): if abs(m - self.new_matrix.mat.sum()) > 0.000000000001: self.fail("Total for mat matrix not maintained") + del self.new_matrix def test_copy_from_omx(self): temp_file = AequilibraeMatrix().random_name() @@ -150,6 +162,8 @@ def test_copy_from_omx(self): if np.any(a.index[:] != np.array(list(omxfile.mapping("taz").keys()))): self.fail("Index was not created properly") a.close() + del a + del omxfile def test_copy_from_omx_long_name(self): @@ -158,6 +172,7 @@ def test_copy_from_omx_long_name(self): with self.assertRaises(ValueError): a.create_from_omx(temp_file, omx_example, robust=False) + del a def test_copy_omx_wrong_content(self): # Check if we get a result if we try to copy non-existing cores @@ -169,6 +184,7 @@ def test_copy_omx_wrong_content(self): with self.assertRaises(ValueError): a.create_from_omx(temp_file, omx_example, mappings=["wrong index"]) + del a def test_get_matrix(self): self.test_load() @@ -182,5 +198,7 @@ def test_get_matrix(self): self.assertEqual(q.shape[0], 24) a = AequilibraeMatrix() - a.load(name_test) + a.load(self.name_test) print(np.array_equal(a.get_matrix("seed"), a.matrix["seed"])) + + del a diff --git a/tests/aequilibrae/project/test_network.py b/tests/aequilibrae/project/test_network.py index 0092d0dce..71d5ed29e 100644 --- a/tests/aequilibrae/project/test_network.py +++ b/tests/aequilibrae/project/test_network.py @@ -7,8 +7,10 @@ from aequilibrae.project import Project from aequilibrae.project.network.network import Network from aequilibrae.parameters import Parameters +from os.path import join, dirname from warnings import warn from random import random +from aequilibrae.project.spatialite_connection import spatialite_connection class TestNetwork(TestCase): @@ -19,19 +21,7 @@ def setUp(self) -> None: self.source = self.file self.file2 = os.path.join(gettempdir(), "aequilibrae_project_test2.sqlite") self.conn = sqlite3.connect(self.file2) - self.conn.enable_load_extension(True) - plat = platform.platform() - pth = os.getcwd() - if "WINDOWS" in plat.upper(): - par = Parameters() - spatialite_path = par.parameters["system"]["spatialite_path"] - if os.path.isfile(os.path.join(spatialite_path, "mod_spatialite.dll")): - os.chdir(spatialite_path) - try: - self.conn.load_extension("mod_spatialite") - except Exception as e: - warn(f"AequilibraE might not work as intended without spatialite. {e.args}") - os.chdir(pth) + self.conn = spatialite_connection(self.conn) self.network = Network(self) def tearDown(self) -> None: diff --git a/tests/aequilibrae/project/test_place_getter.py b/tests/aequilibrae/project/test_place_getter.py index 928962e50..058c457e4 100644 --- a/tests/aequilibrae/project/test_place_getter.py +++ b/tests/aequilibrae/project/test_place_getter.py @@ -13,8 +13,8 @@ def test_placegetter(self): if random() < thresh: place, report = placegetter("China") place = [round(x, 1) for x in place] - if place != [73.5, 8.8, 134.8, 53.6]: - self.fail("Returned the wrong boundingbox for china") + if place != [73.5, 4.0, 134.8, 53.6]: + self.fail("Returned the wrong boundingbox for China") place, report = placegetter("Just a random place with no bear in reality") if place is not None: diff --git a/tests/aequilibrae/transit/test_GTFS.py b/tests/aequilibrae/transit/test_GTFS.py index c3bab9c05..d9bd93689 100644 --- a/tests/aequilibrae/transit/test_GTFS.py +++ b/tests/aequilibrae/transit/test_GTFS.py @@ -1,4 +1,6 @@ from unittest import TestCase +import os +from os.path import dirname, join from aequilibrae.transit.gtfs import GTFS @@ -7,7 +9,11 @@ class TestGTFS(TestCase): - def setUp(self): + def setUp(self) -> None: + spatialite_folder = dirname(dirname(dirname(dirname(os.path.abspath(__file__))))) + spatialite_folder = join(spatialite_folder, 'aequilibrae/project') + os.environ['PATH'] = f'{spatialite_folder};' + os.environ['PATH'] + self.gtfs = GTFS() self.gtfs.source_folder = gtfs_folder diff --git a/tests/aequilibrae/transit/test_create_gtfsdb.py b/tests/aequilibrae/transit/test_create_gtfsdb.py index da03a4a69..6f197726d 100644 --- a/tests/aequilibrae/transit/test_create_gtfsdb.py +++ b/tests/aequilibrae/transit/test_create_gtfsdb.py @@ -1,5 +1,6 @@ from unittest import TestCase import os +from os.path import dirname, join from aequilibrae.transit.gtfs import create_gtfsdb from ...data import gtfs_folder from ...data import gtfs_zip @@ -7,6 +8,11 @@ class TestCreate_gtfsdb(TestCase): + def setUp(self) -> None: + spatialite_folder = dirname(dirname(dirname(dirname(os.path.abspath(__file__))))) + spatialite_folder = join(spatialite_folder, 'aequilibrae/project') + os.environ['PATH'] = f'{spatialite_folder};' + os.environ['PATH'] + def tearDown(self) -> None: if os.path.isfile(gtfs_db_output): os.unlink(gtfs_db_output) diff --git a/tests/setup_windows_spatialite.py b/tests/setup_windows_spatialite.py new file mode 100644 index 000000000..2b5bbe313 --- /dev/null +++ b/tests/setup_windows_spatialite.py @@ -0,0 +1,26 @@ +import urllib.request +import zipfile +import os +import yaml +from os.path import join, dirname + +pth = 'https://github.com/AequilibraE/aequilibrae/releases/download/V0.6.0.post1/mod_spatialite-NG-win-amd64.zip' + + +outfolder = dirname(os.path.abspath(__file__)) + +dest_path = join(outfolder, "mod_spatialite-NG-win-amd64.zip") +urllib.request.urlretrieve(pth, dest_path) + +fldr = join(outfolder, 'temp_data') +zipfile.ZipFile(dest_path).extractall(fldr) + +file = join(dirname(outfolder), "aequilibrae/parameters.yml") +print(file) +with open(file, "r") as yml: + parameters = yaml.load(yml, Loader=yaml.SafeLoader) + +parameters['system']['spatialite_path'] = fldr + +with open(file, "w") as stream: + yaml.dump(parameters, stream, default_flow_style=False) diff --git a/tests/temp_data/__init__.py b/tests/temp_data/__init__.py new file mode 100644 index 000000000..e69de29bb