diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 005f3fa3c6..ec594f152b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,7 +12,7 @@ jobs: vmImage: ubuntu-16.04 -- template: ci/azure/posix.yml +- template: ci/azure/posix_no_39.yml parameters: name: Test_bare_macOS vmImage: macOS-10.14 diff --git a/ci/azure/posix_no_39.yml b/ci/azure/posix_no_39.yml new file mode 100644 index 0000000000..16966cebef --- /dev/null +++ b/ci/azure/posix_no_39.yml @@ -0,0 +1,39 @@ +parameters: + name: '' + vmImage: '' + +jobs: +- job: ${{ parameters.name }} + pool: + vmImage: ${{ parameters.vmImage }} + strategy: + matrix: + Python36: + python.version: '3.6' + Python37: + python.version: '3.7' + Python38: + python.version: '3.8' + + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: '$(python.version)' + + - script: | + pip install pytest pytest-cov pytest-mock requests-mock pytest-timeout pytest-azurepipelines pytest-rerunfailures pytest-remotedata + pip install -e . + pytest pvlib --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html + displayName: 'Test with pytest' + + - task: PublishTestResults@2 + condition: succeededOrFailed() + inputs: + testResultsFiles: '**/test-*.xml' + testRunTitle: 'Publish test results for Python $(python.version)' + + - task: PublishCodeCoverageResults@1 + inputs: + codeCoverageTool: Cobertura + summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml' + reportDirectory: '$(System.DefaultWorkingDirectory)/**/htmlcov' diff --git a/ci/requirements-py36-min.yml b/ci/requirements-py36-min.yml index 84adcb360d..efcb166e68 100644 --- a/ci/requirements-py36-min.yml +++ b/ci/requirements-py36-min.yml @@ -5,6 +5,7 @@ dependencies: - coveralls - nose - pip + - pytables # tables when using pip+PyPI - pytest - pytest-cov - pytest-mock @@ -20,3 +21,4 @@ dependencies: - pytest-rerunfailures # conda version is >3.6 - pytest-remotedata # conda package is 0.3.0, needs > 0.3.1 - requests-mock + - numexpr==2.6.2 # needed for tables, but newest version is not compatible with numpy 1.12 \ No newline at end of file diff --git a/ci/requirements-py36.yml b/ci/requirements-py36.yml index c49455119f..9cef821b3b 100644 --- a/ci/requirements-py36.yml +++ b/ci/requirements-py36.yml @@ -3,6 +3,7 @@ channels: - defaults - conda-forge dependencies: + - blosc=1.14.3 # newest version breaks tables (pytables) on windows - coveralls - cython - ephem diff --git a/ci/requirements-py37.yml b/ci/requirements-py37.yml index 3203b004d1..598f2dcdf7 100644 --- a/ci/requirements-py37.yml +++ b/ci/requirements-py37.yml @@ -3,6 +3,7 @@ channels: - defaults - conda-forge dependencies: + - blosc=1.14.3 # newest version breaks tables (pytables) on windows - coveralls - cython - ephem diff --git a/docs/sphinx/source/whatsnew/v0.9.0.rst b/docs/sphinx/source/whatsnew/v0.9.0.rst index ed804160ac..f8d52e7e30 100644 --- a/docs/sphinx/source/whatsnew/v0.9.0.rst +++ b/docs/sphinx/source/whatsnew/v0.9.0.rst @@ -229,7 +229,8 @@ Documentation Requirements ~~~~~~~~~~~~ -* ``dataclasses`` is required for python 3.6 +* ``dataclasses`` is required for python 3.6 (:pull:`1076`) +* ``tables`` is now required instead of optional (:issue:`1286`, :pull:`1287`) Contributors ~~~~~~~~~~~~ diff --git a/pvlib/clearsky.py b/pvlib/clearsky.py index 9d635d0bf8..0368912c81 100644 --- a/pvlib/clearsky.py +++ b/pvlib/clearsky.py @@ -11,6 +11,7 @@ import pandas as pd from scipy.optimize import minimize_scalar from scipy.linalg import hankel +import tables from pvlib import atmosphere, tools @@ -186,13 +187,6 @@ def lookup_linke_turbidity(time, latitude, longitude, filepath=None, # 1st row: 89.9583 S, 2nd row: 89.875 S # 1st column: 179.9583 W, 2nd column: 179.875 W - try: - import tables - except ImportError: - raise ImportError('The Linke turbidity lookup table requires tables. ' - 'You can still use clearsky.ineichen if you ' - 'supply your own turbidities.') - if filepath is None: pvlib_path = os.path.dirname(os.path.abspath(__file__)) filepath = os.path.join(pvlib_path, 'data', 'LinkeTurbidities.h5') diff --git a/pvlib/tests/conftest.py b/pvlib/tests/conftest.py index a3cba1e7b8..b3e9fcd5a1 100644 --- a/pvlib/tests/conftest.py +++ b/pvlib/tests/conftest.py @@ -105,15 +105,6 @@ def assert_frame_equal(left, right, **kwargs): not has_statsmodels, reason='requires statsmodels') -try: - import tables - has_tables = True -except ImportError: - has_tables = False - -requires_tables = pytest.mark.skipif(not has_tables, reason='requires tables') - - try: import ephem has_ephem = True diff --git a/pvlib/tests/test_clearsky.py b/pvlib/tests/test_clearsky.py index 1e7d89d82d..15fc74e383 100644 --- a/pvlib/tests/test_clearsky.py +++ b/pvlib/tests/test_clearsky.py @@ -16,7 +16,7 @@ from pvlib import atmosphere from pvlib import irradiance -from .conftest import requires_tables, DATA_DIR +from .conftest import DATA_DIR def test_ineichen_series(): @@ -189,7 +189,6 @@ def test_ineichen_altitude(): assert_frame_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity(): times = pd.date_range(start='2014-06-24', end='2014-06-25', freq='12h', tz='America/Phoenix') @@ -202,7 +201,6 @@ def test_lookup_linke_turbidity(): assert_series_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity_leapyear(): times = pd.date_range(start='2016-06-24', end='2016-06-25', freq='12h', tz='America/Phoenix') @@ -215,7 +213,6 @@ def test_lookup_linke_turbidity_leapyear(): assert_series_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity_nointerp(): times = pd.date_range(start='2014-06-24', end='2014-06-25', freq='12h', tz='America/Phoenix') @@ -226,7 +223,6 @@ def test_lookup_linke_turbidity_nointerp(): assert_series_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity_months(): times = pd.date_range(start='2014-04-01', end='2014-07-01', freq='1M', tz='America/Phoenix') @@ -237,7 +233,6 @@ def test_lookup_linke_turbidity_months(): assert_series_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity_months_leapyear(): times = pd.date_range(start='2016-04-01', end='2016-07-01', freq='1M', tz='America/Phoenix') @@ -248,7 +243,6 @@ def test_lookup_linke_turbidity_months_leapyear(): assert_series_equal(expected, out) -@requires_tables def test_lookup_linke_turbidity_nointerp_months(): times = pd.date_range(start='2014-04-10', end='2014-07-10', freq='1M', tz='America/Phoenix') @@ -480,7 +474,6 @@ def test_simplified_solis_nans_series(): assert_frame_equal(expected, out) -@requires_tables def test_linke_turbidity_corners(): """Test Linke turbidity corners out of bounds.""" months = pd.DatetimeIndex('%d/1/2016' % (m + 1) for m in range(12)) diff --git a/pvlib/tests/test_location.py b/pvlib/tests/test_location.py index 20a849a667..a4b69e5cb2 100644 --- a/pvlib/tests/test_location.py +++ b/pvlib/tests/test_location.py @@ -15,7 +15,7 @@ from pvlib.location import Location from pvlib.solarposition import declination_spencer71 from pvlib.solarposition import equation_of_time_spencer71 -from .conftest import requires_ephem, requires_tables +from .conftest import requires_ephem def test_location_required(): @@ -77,7 +77,6 @@ def times(): freq='3H') -@requires_tables def test_get_clearsky(mocker, times): tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson') m = mocker.spy(pvlib.clearsky, 'ineichen') diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index 86b7411d0f..b42acfa54e 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -13,7 +13,7 @@ from .conftest import assert_series_equal, assert_frame_equal import pytest -from .conftest import fail_on_pvlib_version, requires_tables +from .conftest import fail_on_pvlib_version @pytest.fixture(scope='function') @@ -1788,7 +1788,6 @@ def test_ModelChain_attributes_deprecated_10(sapm_dc_snl_ac_system, location): mc.aoi = 5 -@requires_tables def test_basic_chain_alt_az(sam_data, cec_inverter_parameters, sapm_temperature_cs5p_220m): times = pd.date_range(start='20160101 1200-0700', @@ -1810,7 +1809,6 @@ def test_basic_chain_alt_az(sam_data, cec_inverter_parameters, assert_series_equal(ac, expected) -@requires_tables def test_basic_chain_altitude_pressure(sam_data, cec_inverter_parameters, sapm_temperature_cs5p_220m): times = pd.date_range(start='20160101 1200-0700', @@ -1861,7 +1859,6 @@ def test_complete_irradiance_clean_run(sapm_dc_snl_ac_system, location): pd.Series([9, 5], index=times, name='ghi')) -@requires_tables def test_complete_irradiance(sapm_dc_snl_ac_system, location): """Check calculations""" mc = ModelChain(sapm_dc_snl_ac_system, location) @@ -1890,7 +1887,6 @@ def test_complete_irradiance(sapm_dc_snl_ac_system, location): @pytest.mark.filterwarnings("ignore:This function is not safe at the moment") @pytest.mark.parametrize("input_type", [tuple, list]) -@requires_tables def test_complete_irradiance_arrays( sapm_dc_snl_ac_system_same_arrays, location, input_type): """ModelChain.complete_irradiance can accept a tuple of weather diff --git a/setup.py b/setup.py index 216dc34a28..6dd1242744 100755 --- a/setup.py +++ b/setup.py @@ -42,7 +42,8 @@ 'pandas >= 0.22.0', 'pytz', 'requests', - 'scipy >= 1.2.0'] + 'scipy >= 1.2.0', + 'tables'] # include dataclasses as a dependency only on python 3.6 if sys.version_info.major == 3 and sys.version_info.minor == 6: @@ -53,7 +54,7 @@ 'pytest-remotedata'] EXTRAS_REQUIRE = { 'optional': ['cython', 'ephem', 'netcdf4', 'nrel-pysam', 'numba', - 'pvfactors', 'siphon', 'statsmodels', 'tables', + 'pvfactors', 'siphon', 'statsmodels', 'cftime >= 1.1.1'], 'doc': ['ipython', 'matplotlib', 'sphinx == 3.1.2', 'sphinx_rtd_theme==0.5.0', 'sphinx-gallery', 'docutils == 0.15.2',