diff --git a/.codecov.yml b/.codecov.yml index 48df15e95e..f6cd26008d 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -22,6 +22,6 @@ coverage: tests: target: 95% paths: - - "pvlib/test/.*" + - "pvlib/tests/.*" comment: off diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a626e1c11b..2ad18ae1b8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -155,7 +155,7 @@ jobs: - script: | pip install pytest pytest-cov pytest-mock pytest-timeout pytest-azurepipelines pip install -e . - pytest pvlib/test --junitxml=junit/test-results.xml --cov=pvlib --cov-report=xml --cov-report=html + pytest pvlib --junitxml=junit/test-results.xml --cov=pvlib --cov-report=xml --cov-report=html displayName: 'Test with pytest' - task: PublishTestResults@2 diff --git a/docs/sphinx/source/whatsnew/v0.7.1.rst b/docs/sphinx/source/whatsnew/v0.7.1.rst index 85059e376c..ac88a28f2e 100644 --- a/docs/sphinx/source/whatsnew/v0.7.1.rst +++ b/docs/sphinx/source/whatsnew/v0.7.1.rst @@ -26,6 +26,9 @@ Testing ~~~~~~~ * Added single-year PSM3 API test for `iotools.get_psm3`. * Added tests for `iotools.parse_psm3` and `iotools.read_psm3`. +* Change `pvlib/test` folder to `pvlib/tests` and reorganize tests into + subfolders, *e.g.*: created `pvlib/tests/iotools` (:pull:`859`) +* replace `os.path` with `pathlib` and stringify path objects for Python<=3.5 Documentation ~~~~~~~~~~~~~ diff --git a/pvlib/iotools/crn.py b/pvlib/iotools/crn.py index cb08fb6df2..69988faad6 100644 --- a/pvlib/iotools/crn.py +++ b/pvlib/iotools/crn.py @@ -46,7 +46,7 @@ def read_crn(filename): Parameters ---------- - filename: str + filename: str, path object, or file-like filepath or url to read for the fixed-width file. Returns diff --git a/pvlib/iotools/epw.py b/pvlib/iotools/epw.py index dc6bfa40f7..82a7fd7305 100644 --- a/pvlib/iotools/epw.py +++ b/pvlib/iotools/epw.py @@ -217,7 +217,7 @@ def read_epw(filename, coerce_year=None): `_ ''' - if filename.startswith('http'): + if str(filename).startswith('http'): # Attempts to download online EPW file # See comments above for possible online sources request = Request(filename, headers={'User-Agent': ( @@ -228,7 +228,7 @@ def read_epw(filename, coerce_year=None): csvdata = io.StringIO(response.read().decode(errors='ignore')) else: # Assume it's accessible via the file system - csvdata = open(filename, 'r') + csvdata = open(str(filename), 'r') try: data, meta = parse_epw(csvdata, coerce_year) finally: diff --git a/pvlib/iotools/midc.py b/pvlib/iotools/midc.py index 0cd9a26bfc..0b763a9607 100644 --- a/pvlib/iotools/midc.py +++ b/pvlib/iotools/midc.py @@ -249,12 +249,12 @@ def read_midc_raw_data_from_nrel(site, start, end, variable_map={}, args = {'site': site, 'begin': start.strftime('%Y%m%d'), 'end': end.strftime('%Y%m%d')} - endpoint = 'https://midcdmz.nrel.gov/apps/data_api.pl?' - url = endpoint + '&'.join(['{}={}'.format(k, v) for k, v in args.items()]) + url = 'https://midcdmz.nrel.gov/apps/data_api.pl' + # NOTE: just use requests.get(url, params=args) to build querystring # number of header columns and data columns do not always match, # so first parse the header to determine the number of data columns # to parse - csv_request = requests.get(url, timeout=timeout) + csv_request = requests.get(url, timeout=timeout, params=args) csv_request.raise_for_status() raw_csv = io.StringIO(csv_request.text) first_row = pd.read_csv(raw_csv, nrows=0) diff --git a/pvlib/iotools/psm3.py b/pvlib/iotools/psm3.py index 898e56ec28..7e0083d418 100644 --- a/pvlib/iotools/psm3.py +++ b/pvlib/iotools/psm3.py @@ -295,6 +295,6 @@ def read_psm3(filename): .. [2] `Standard Time Series Data File Format `_ """ - with open(filename, 'r') as fbuf: + with open(str(filename), 'r') as fbuf: content = parse_psm3(fbuf) return content diff --git a/pvlib/iotools/solrad.py b/pvlib/iotools/solrad.py index 1528697ab2..ef524221a5 100644 --- a/pvlib/iotools/solrad.py +++ b/pvlib/iotools/solrad.py @@ -81,7 +81,7 @@ def read_solrad(filename): Program. Bull. Amer. Meteor. Soc., 77, 2857-2864. :doi:`10.1175/1520-0477(1996)077<2857:TNISIS>2.0.CO;2` """ - if 'msn' in filename: + if 'msn' in str(filename): names = MADISON_HEADERS widths = MADISON_WIDTHS dtypes = MADISON_DTYPES diff --git a/pvlib/iotools/surfrad.py b/pvlib/iotools/surfrad.py index 06f99cbd4f..eb8455e2b1 100644 --- a/pvlib/iotools/surfrad.py +++ b/pvlib/iotools/surfrad.py @@ -122,12 +122,12 @@ def read_surfrad(filename, map_variables=True): .. [2] NOAA SURFRAD Data Archive `SURFRAD Archive `_ """ - if filename.startswith('ftp'): + if str(filename).startswith('ftp'): req = Request(filename) response = urlopen(req) file_buffer = io.StringIO(response.read().decode(errors='ignore')) else: - file_buffer = open(filename, 'r') + file_buffer = open(str(filename), 'r') # Read and parse the first two lines to build the metadata dict. station = file_buffer.readline() diff --git a/pvlib/iotools/tmy.py b/pvlib/iotools/tmy.py index bb9b74f250..52a8f48b8e 100644 --- a/pvlib/iotools/tmy.py +++ b/pvlib/iotools/tmy.py @@ -160,7 +160,7 @@ def read_tmy3(filename=None, coerce_year=None, recolumn=True): head = ['USAF', 'Name', 'State', 'TZ', 'latitude', 'longitude', 'altitude'] - if filename.startswith('http'): + if str(filename).startswith('http'): request = Request(filename, headers={'User-Agent': ( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 ' @@ -169,7 +169,7 @@ def read_tmy3(filename=None, coerce_year=None, recolumn=True): csvdata = io.StringIO(response.read().decode(errors='ignore')) else: # assume it's accessible via the file system - csvdata = open(filename, 'r') + csvdata = open(str(filename), 'r') # read in file metadata, advance buffer to second line firstline = csvdata.readline() @@ -409,7 +409,7 @@ def read_tmy2(filename): columns = 'year,month,day,hour,ETR,ETRN,GHI,GHISource,GHIUncertainty,DNI,DNISource,DNIUncertainty,DHI,DHISource,DHIUncertainty,GHillum,GHillumSource,GHillumUncertainty,DNillum,DNillumSource,DNillumUncertainty,DHillum,DHillumSource,DHillumUncertainty,Zenithlum,ZenithlumSource,ZenithlumUncertainty,TotCld,TotCldSource,TotCldUncertainty,OpqCld,OpqCldSource,OpqCldUncertainty,DryBulb,DryBulbSource,DryBulbUncertainty,DewPoint,DewPointSource,DewPointUncertainty,RHum,RHumSource,RHumUncertainty,Pressure,PressureSource,PressureUncertainty,Wdir,WdirSource,WdirUncertainty,Wspd,WspdSource,WspdUncertainty,Hvis,HvisSource,HvisUncertainty,CeilHgt,CeilHgtSource,CeilHgtUncertainty,PresentWeather,Pwat,PwatSource,PwatUncertainty,AOD,AODSource,AODUncertainty,SnowDepth,SnowDepthSource,SnowDepthUncertainty,LastSnowfall,LastSnowfallSource,LastSnowfallUncertaint' # noqa: E501 hdr_columns = 'WBAN,City,State,TZ,latitude,longitude,altitude' - tmy2, tmy2_meta = _read_tmy2(string, columns, hdr_columns, filename) + tmy2, tmy2_meta = _read_tmy2(string, columns, hdr_columns, str(filename)) return tmy2, tmy2_meta diff --git a/pvlib/test/conftest.py b/pvlib/tests/conftest.py similarity index 98% rename from pvlib/test/conftest.py rename to pvlib/tests/conftest.py index 9c838249a9..b803d04c81 100644 --- a/pvlib/test/conftest.py +++ b/pvlib/tests/conftest.py @@ -1,5 +1,4 @@ -import inspect -import os +from pathlib import Path import platform import numpy as np @@ -36,9 +35,8 @@ def inner(): # commonly used directories in the tests -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -data_dir = os.path.join(test_dir, os.pardir, 'data') +TEST_DIR = Path(__file__).parent +DATA_DIR = TEST_DIR.parent / 'data' platform_is_windows = platform.system() == 'Windows' diff --git a/pvlib/test/test_crn.py b/pvlib/tests/iotools/test_crn.py similarity index 89% rename from pvlib/test/test_crn.py rename to pvlib/tests/iotools/test_crn.py index 9cccf3568a..d661acb1ce 100644 --- a/pvlib/test/test_crn.py +++ b/pvlib/tests/iotools/test_crn.py @@ -1,21 +1,18 @@ -import inspect -import os - import pandas as pd from pandas.util.testing import assert_frame_equal import numpy as np from numpy import dtype, nan - +import pytest from pvlib.iotools import crn +from conftest import DATA_DIR -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -testfile = os.path.join(test_dir, - '../data/CRNS0101-05-2019-AZ_Tucson_11_W.txt') +@pytest.fixture +def testfile(): + return DATA_DIR / 'CRNS0101-05-2019-AZ_Tucson_11_W.txt' -def test_read_crn(): +def test_read_crn(testfile): columns = [ 'WBANNO', 'UTC_DATE', 'UTC_TIME', 'LST_DATE', 'LST_TIME', 'CRX_VN', 'longitude', 'latitude', 'temp_air', 'PRECIPITATION', 'ghi', diff --git a/pvlib/test/test_ecmwf_macc.py b/pvlib/tests/iotools/test_ecmwf_macc.py similarity index 91% rename from pvlib/test/test_ecmwf_macc.py rename to pvlib/tests/iotools/test_ecmwf_macc.py index 8823b789e5..666941a0f1 100644 --- a/pvlib/test/test_ecmwf_macc.py +++ b/pvlib/tests/iotools/test_ecmwf_macc.py @@ -5,12 +5,10 @@ import os import datetime import numpy as np -from conftest import requires_netCDF4 +import pytest +from conftest import requires_netCDF4, DATA_DIR from pvlib.iotools import ecmwf_macc -DIRNAME = os.path.dirname(__file__) -PROJNAME = os.path.dirname(DIRNAME) -DATADIR = os.path.join(PROJNAME, 'data') TESTDATA = 'aod550_tcwv_20121101_test.nc' # for creating test data @@ -21,19 +19,24 @@ LAT_BND = (90, -90) +@pytest.fixture +def expected_test_data(): + return DATA_DIR / TESTDATA + + @requires_netCDF4 -def test_get_nearest_indices(): +def test_get_nearest_indices(expected_test_data): """Test getting indices given latitude, longitude from ECMWF_MACC data.""" - data = ecmwf_macc.ECMWF_MACC(os.path.join(DATADIR, TESTDATA)) + data = ecmwf_macc.ECMWF_MACC(expected_test_data) ilat, ilon = data.get_nearest_indices(38, -122) assert ilat == 17 assert ilon == 79 @requires_netCDF4 -def test_interp_data(): +def test_interp_data(expected_test_data): """Test interpolating UTC time from ECMWF_MACC data.""" - data = ecmwf_macc.ECMWF_MACC(os.path.join(DATADIR, TESTDATA)) + data = ecmwf_macc.ECMWF_MACC(expected_test_data) test9am = data.interp_data( 38, -122, datetime.datetime(2012, 11, 1, 9, 0, 0), 'aod550') assert np.isclose(test9am, data.data.variables['aod550'][2, 17, 79]) @@ -47,10 +50,10 @@ def test_interp_data(): @requires_netCDF4 -def test_read_ecmwf_macc(): +def test_read_ecmwf_macc(expected_test_data): """Test reading ECMWF_MACC data from netCDF4 file.""" data = ecmwf_macc.read_ecmwf_macc( - os.path.join(DATADIR, TESTDATA), 38, -122) + expected_test_data, 38, -122) expected_times = [ 1351738800, 1351749600, 1351760400, 1351771200, 1351782000, 1351792800, 1351803600, 1351814400] @@ -67,7 +70,7 @@ def test_read_ecmwf_macc(): datetimes = (datetime.datetime(2012, 11, 1, 9, 0, 0), datetime.datetime(2012, 11, 1, 12, 0, 0)) data_9am_12pm = ecmwf_macc.read_ecmwf_macc( - os.path.join(DATADIR, TESTDATA), 38, -122, datetimes) + expected_test_data, 38, -122, datetimes) assert np.allclose(data_9am_12pm.aod550.values, expected_aod[2:4]) assert np.allclose(data_9am_12pm.tcwv.values, expected_tcwv[2:4]) diff --git a/pvlib/test/test_epw.py b/pvlib/tests/iotools/test_epw.py similarity index 81% rename from pvlib/test/test_epw.py rename to pvlib/tests/iotools/test_epw.py index 92119bcfd0..50d99acf9b 100644 --- a/pvlib/test/test_epw.py +++ b/pvlib/tests/iotools/test_epw.py @@ -1,11 +1,9 @@ -import os - from pandas.util.testing import network from pvlib.iotools import epw -from conftest import data_dir +from conftest import DATA_DIR -epw_testfile = os.path.join(data_dir, 'NLD_Amsterdam062400_IWEC.epw') +epw_testfile = DATA_DIR / 'NLD_Amsterdam062400_IWEC.epw' def test_read_epw(): diff --git a/pvlib/test/test_midc.py b/pvlib/tests/iotools/test_midc.py similarity index 74% rename from pvlib/test/test_midc.py rename to pvlib/tests/iotools/test_midc.py index 07552ed936..9c0dec9145 100644 --- a/pvlib/test/test_midc.py +++ b/pvlib/tests/iotools/test_midc.py @@ -1,12 +1,10 @@ -import inspect -import os - import pandas as pd from pandas.util.testing import network import pytest import pytz from pvlib.iotools import midc +from conftest import DATA_DIR @pytest.fixture @@ -20,18 +18,18 @@ def test_mapping(): } -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -midc_testfile = os.path.join(test_dir, '../data/midc_20181014.txt') -midc_raw_testfile = os.path.join(test_dir, '../data/midc_raw_20181018.txt') -midc_raw_short_header_testfile = os.path.join( - test_dir, '../data/midc_raw_short_header_20191115.txt') -midc_network_testfile = ('https://midcdmz.nrel.gov/apps/data_api.pl' - '?site=UAT&begin=20181018&end=20181019') +MIDC_TESTFILE = DATA_DIR / 'midc_20181014.txt' +MIDC_RAW_TESTFILE = DATA_DIR / 'midc_raw_20181018.txt' +MIDC_RAW_SHORT_HEADER_TESTFILE = ( + DATA_DIR / 'midc_raw_short_header_20191115.txt') + +# TODO: not used, remove? +# midc_network_testfile = ('https://midcdmz.nrel.gov/apps/data_api.pl' +# '?site=UAT&begin=20181018&end=20181019') def test_midc_format_index(): - data = pd.read_csv(midc_testfile) + data = pd.read_csv(MIDC_TESTFILE) data = midc.format_index(data) start = pd.Timestamp("20181014 00:00") start = start.tz_localize("MST") @@ -43,14 +41,14 @@ def test_midc_format_index(): def test_midc_format_index_tz_conversion(): - data = pd.read_csv(midc_testfile) + data = pd.read_csv(MIDC_TESTFILE) data = data.rename(columns={'MST': 'PST'}) data = midc.format_index(data) assert data.index[0].tz == pytz.timezone('Etc/GMT+8') def test_midc_format_index_raw(): - data = pd.read_csv(midc_raw_testfile) + data = pd.read_csv(MIDC_RAW_TESTFILE) data = midc.format_index_raw(data) start = pd.Timestamp('20181018 00:00') start = start.tz_localize('MST') @@ -61,7 +59,7 @@ def test_midc_format_index_raw(): def test_read_midc_var_mapping_as_arg(test_mapping): - data = midc.read_midc(midc_testfile, variable_map=test_mapping) + data = midc.read_midc(MIDC_TESTFILE, variable_map=test_mapping) assert 'ghi' in data.columns assert 'temp_air' in data.columns @@ -79,7 +77,7 @@ def test_read_midc_raw_data_from_nrel(): def test_read_midc_header_length_mismatch(mocker): mock_data = mocker.MagicMock() - with open(midc_raw_short_header_testfile, 'r') as f: + with MIDC_RAW_SHORT_HEADER_TESTFILE.open() as f: mock_data.text = f.read() mocker.patch('pvlib.iotools.midc.requests.get', return_value=mock_data) diff --git a/pvlib/test/test_psm3.py b/pvlib/tests/iotools/test_psm3.py similarity index 91% rename from pvlib/test/test_psm3.py rename to pvlib/tests/iotools/test_psm3.py index 0a672534e4..7ea58acaa0 100644 --- a/pvlib/test/test_psm3.py +++ b/pvlib/tests/iotools/test_psm3.py @@ -2,21 +2,17 @@ test iotools for PSM3 """ -import os from pvlib.iotools import psm3 -from conftest import needs_pandas_0_22 +from conftest import needs_pandas_0_22, DATA_DIR import numpy as np import pandas as pd import pytest from requests import HTTPError from io import StringIO -BASEDIR = os.path.abspath(os.path.dirname(__file__)) -PROJDIR = os.path.dirname(BASEDIR) -DATADIR = os.path.join(PROJDIR, 'data') -TMY_TEST_DATA = os.path.join(DATADIR, 'test_psm3_tmy-2017.csv') -YEAR_TEST_DATA = os.path.join(DATADIR, 'test_psm3_2017.csv') -MANUAL_TEST_DATA = os.path.join(DATADIR, 'test_read_psm3.csv') +TMY_TEST_DATA = DATA_DIR / 'test_psm3_tmy-2017.csv' +YEAR_TEST_DATA = DATA_DIR / 'test_psm3_2017.csv' +MANUAL_TEST_DATA = DATA_DIR / 'test_read_psm3.csv' LATITUDE, LONGITUDE = 40.5137, -108.5449 HEADER_FIELDS = [ 'Source', 'Location ID', 'City', 'State', 'Country', 'Latitude', @@ -100,7 +96,7 @@ def test_get_psm3_singleyear(): @pytest.fixture def io_input(request): """file-like object for parse_psm3""" - with open(MANUAL_TEST_DATA, 'r') as f: + with MANUAL_TEST_DATA.open() as f: data = f.read() obj = StringIO(data) return obj diff --git a/pvlib/test/test_pvgis.py b/pvlib/tests/iotools/test_pvgis.py similarity index 94% rename from pvlib/test/test_pvgis.py rename to pvlib/tests/iotools/test_pvgis.py index dbf357693c..5227c45841 100644 --- a/pvlib/test/test_pvgis.py +++ b/pvlib/tests/iotools/test_pvgis.py @@ -2,26 +2,22 @@ test the pvgis IO tools """ import json -from pathlib import Path import numpy as np import pandas as pd import pytest import requests from pvlib.iotools import get_pvgis_tmy - -TESTS = Path(__file__).parent -PROJECT = TESTS.parent -DATA = PROJECT / 'data' +from conftest import DATA_DIR @pytest.fixture def expected(): - return pd.read_csv(DATA / 'pvgis_tmy_test.dat', index_col='time(UTC)') + return pd.read_csv(DATA_DIR / 'pvgis_tmy_test.dat', index_col='time(UTC)') @pytest.fixture def userhorizon_expected(): - return pd.read_json(DATA / 'tmy_45.000_8.000_userhorizon.json') + return pd.read_json(DATA_DIR / 'tmy_45.000_8.000_userhorizon.json') @pytest.fixture @@ -60,7 +56,7 @@ def epw_meta(): @pytest.fixture def meta_expected(): - with (DATA / 'pvgis_tmy_meta.json').open() as f: + with (DATA_DIR / 'pvgis_tmy_meta.json').open() as f: return json.load(f) diff --git a/pvlib/test/test_solrad.py b/pvlib/tests/iotools/test_solrad.py similarity index 97% rename from pvlib/test/test_solrad.py rename to pvlib/tests/iotools/test_solrad.py index 7b1d02b1e6..4bc6223a18 100644 --- a/pvlib/test/test_solrad.py +++ b/pvlib/tests/iotools/test_solrad.py @@ -1,5 +1,3 @@ -import os - import pandas as pd from pandas.util.testing import assert_frame_equal import numpy as np @@ -8,11 +6,11 @@ import pytest from pvlib.iotools import solrad -from conftest import data_dir +from conftest import DATA_DIR -testfile = os.path.join(data_dir, 'abq19056.dat') -testfile_mad = os.path.join(data_dir, 'msn19056.dat') +testfile = DATA_DIR / 'abq19056.dat' +testfile_mad = DATA_DIR / 'msn19056.dat' columns = [ diff --git a/pvlib/test/test_srml.py b/pvlib/tests/iotools/test_srml.py similarity index 93% rename from pvlib/test/test_srml.py rename to pvlib/tests/iotools/test_srml.py index 9924701609..06ff79cdd3 100644 --- a/pvlib/test/test_srml.py +++ b/pvlib/tests/iotools/test_srml.py @@ -1,17 +1,12 @@ -import inspect -import os - from numpy import isnan import pandas as pd from pandas.util.testing import network import pytest from pvlib.iotools import srml +from conftest import DATA_DIR - -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -srml_testfile = os.path.join(test_dir, '../data/SRML-day-EUPO1801.txt') +srml_testfile = DATA_DIR / 'SRML-day-EUPO1801.txt' def test_read_srml(): diff --git a/pvlib/test/test_surfrad.py b/pvlib/tests/iotools/test_surfrad.py similarity index 91% rename from pvlib/test/test_surfrad.py rename to pvlib/tests/iotools/test_surfrad.py index 29bede3ff9..8e67a639d0 100644 --- a/pvlib/test/test_surfrad.py +++ b/pvlib/tests/iotools/test_surfrad.py @@ -1,14 +1,10 @@ -import inspect -import os - import pandas as pd from pandas.util.testing import network from pvlib.iotools import surfrad +from conftest import DATA_DIR -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -testfile = os.path.join(test_dir, '../data/surfrad-slv16001.dat') +testfile = DATA_DIR / 'surfrad-slv16001.dat' network_testfile = ('ftp://aftp.cmdl.noaa.gov/data/radiation/surfrad/' 'Alamosa_CO/2016/slv16001.dat') diff --git a/pvlib/test/test_tmy.py b/pvlib/tests/iotools/test_tmy.py similarity index 54% rename from pvlib/test/test_tmy.py rename to pvlib/tests/iotools/test_tmy.py index c910bc9c93..a5da1a89a2 100644 --- a/pvlib/test/test_tmy.py +++ b/pvlib/tests/iotools/test_tmy.py @@ -1,18 +1,14 @@ -import inspect -import os - from pandas.util.testing import network from pvlib.iotools import tmy +from conftest import DATA_DIR -test_dir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -tmy3_testfile = os.path.join(test_dir, '../data/703165TY.csv') -tmy2_testfile = os.path.join(test_dir, '../data/12839.tm2') +TMY3_TESTFILE = DATA_DIR / '703165TY.csv' +TMY2_TESTFILE = DATA_DIR / '12839.tm2' def test_read_tmy3(): - tmy.read_tmy3(tmy3_testfile) + tmy.read_tmy3(TMY3_TESTFILE) @network @@ -22,26 +18,26 @@ def test_read_tmy3_remote(): def test_read_tmy3_recolumn(): - data, meta = tmy.read_tmy3(tmy3_testfile) + data, meta = tmy.read_tmy3(TMY3_TESTFILE) assert 'GHISource' in data.columns def test_read_tmy3_norecolumn(): - data, meta = tmy.read_tmy3(tmy3_testfile, recolumn=False) + data, meta = tmy.read_tmy3(TMY3_TESTFILE, recolumn=False) assert 'GHI source' in data.columns def test_read_tmy3_coerce_year(): coerce_year = 1987 - data, meta = tmy.read_tmy3(tmy3_testfile, coerce_year=coerce_year) + data, meta = tmy.read_tmy3(TMY3_TESTFILE, coerce_year=coerce_year) assert (data.index.year == 1987).all() def test_read_tmy3_no_coerce_year(): coerce_year = None - data, meta = tmy.read_tmy3(tmy3_testfile, coerce_year=coerce_year) + data, meta = tmy.read_tmy3(TMY3_TESTFILE, coerce_year=coerce_year) assert 1997 and 1999 in data.index.year def test_read_tmy2(): - tmy.read_tmy2(tmy2_testfile) + tmy.read_tmy2(TMY2_TESTFILE) diff --git a/pvlib/test/test_atmosphere.py b/pvlib/tests/test_atmosphere.py similarity index 100% rename from pvlib/test/test_atmosphere.py rename to pvlib/tests/test_atmosphere.py diff --git a/pvlib/test/test_bifacial.py b/pvlib/tests/test_bifacial.py similarity index 100% rename from pvlib/test/test_bifacial.py rename to pvlib/tests/test_bifacial.py diff --git a/pvlib/test/test_clearsky.py b/pvlib/tests/test_clearsky.py similarity index 97% rename from pvlib/test/test_clearsky.py rename to pvlib/tests/test_clearsky.py index 44d2e586a7..5774e343a0 100644 --- a/pvlib/test/test_clearsky.py +++ b/pvlib/tests/test_clearsky.py @@ -1,5 +1,3 @@ -import inspect -import os from collections import OrderedDict import numpy as np @@ -17,7 +15,7 @@ from pvlib import atmosphere from pvlib import irradiance -from conftest import requires_scipy, requires_tables +from conftest import requires_scipy, requires_tables, DATA_DIR def test_ineichen_series(): @@ -528,13 +526,12 @@ def test_degrees_to_index_1(): @pytest.fixture def detect_clearsky_data(): - test_dir = os.path.dirname(os.path.abspath( - inspect.getfile(inspect.currentframe()))) - file = os.path.join(test_dir, '..', 'data', 'detect_clearsky_data.csv') - expected = pd.read_csv(file, index_col=0, parse_dates=True, comment='#') + data_file = DATA_DIR / 'detect_clearsky_data.csv' + expected = pd.read_csv( + data_file, index_col=0, parse_dates=True, comment='#') expected = expected.tz_localize('UTC').tz_convert('Etc/GMT+7') metadata = {} - with open(file) as f: + with data_file.open() as f: for line in f: if line.startswith('#'): key, value = line.strip('# \n').split(':') @@ -658,9 +655,7 @@ def test_bird(): etr, b_a, alb ) Eb, Ebh, Gh, Dh = (irrads[_] for _ in field_names) - clearsky_path = os.path.dirname(os.path.abspath(__file__)) - pvlib_path = os.path.dirname(clearsky_path) - data_path = os.path.join(pvlib_path, 'data', 'BIRD_08_16_2012.csv') + data_path = DATA_DIR / 'BIRD_08_16_2012.csv' testdata = pd.read_csv(data_path, usecols=range(1, 26), header=1).dropna() testdata.index = times[1:48] assert np.allclose(testdata['DEC'], np.rad2deg(declination[1:48])) @@ -694,9 +689,7 @@ def test_bird(): zenith, airmass, aod_380nm, aod_500nm, h2o_cm, dni_extra=etr ) Eb2, Ebh2, Gh2, Dh2 = (irrads2[_] for _ in field_names) - clearsky_path = os.path.dirname(os.path.abspath(__file__)) - pvlib_path = os.path.dirname(clearsky_path) - data_path = os.path.join(pvlib_path, 'data', 'BIRD_08_16_2012_patm.csv') + data_path = DATA_DIR / 'BIRD_08_16_2012_patm.csv' testdata2 = pd.read_csv(data_path, usecols=range(1, 26), header=1).dropna() testdata2.index = times[1:48] direct_beam2 = pd.Series(np.where(dawn, Eb2, 0.), index=times).fillna(0.) diff --git a/pvlib/test/test_conftest.py b/pvlib/tests/test_conftest.py similarity index 100% rename from pvlib/test/test_conftest.py rename to pvlib/tests/test_conftest.py diff --git a/pvlib/test/test_forecast.py b/pvlib/tests/test_forecast.py similarity index 100% rename from pvlib/test/test_forecast.py rename to pvlib/tests/test_forecast.py diff --git a/pvlib/test/test_iam.py b/pvlib/tests/test_iam.py similarity index 100% rename from pvlib/test/test_iam.py rename to pvlib/tests/test_iam.py diff --git a/pvlib/test/test_irradiance.py b/pvlib/tests/test_irradiance.py similarity index 100% rename from pvlib/test/test_irradiance.py rename to pvlib/tests/test_irradiance.py diff --git a/pvlib/test/test_ivtools.py b/pvlib/tests/test_ivtools.py similarity index 99% rename from pvlib/test/test_ivtools.py rename to pvlib/tests/test_ivtools.py index 6f9fdd6fec..0f71991d70 100644 --- a/pvlib/test/test_ivtools.py +++ b/pvlib/tests/test_ivtools.py @@ -10,7 +10,7 @@ import pytest from pvlib import pvsystem from pvlib import ivtools -from pvlib.test.conftest import requires_scipy, requires_pysam +from conftest import requires_scipy, requires_pysam @pytest.fixture diff --git a/pvlib/test/test_location.py b/pvlib/tests/test_location.py similarity index 98% rename from pvlib/test/test_location.py rename to pvlib/tests/test_location.py index d9503aefd8..2deec4c8da 100644 --- a/pvlib/test/test_location.py +++ b/pvlib/tests/test_location.py @@ -211,9 +211,9 @@ def test_get_clearsky_valueerror(times): def test_from_tmy_3(): - from test_tmy import tmy3_testfile + from test_tmy import TMY3_TESTFILE from pvlib.iotools import read_tmy3 - data, meta = read_tmy3(tmy3_testfile) + data, meta = read_tmy3(TMY3_TESTFILE) loc = Location.from_tmy(meta, data) assert loc.name is not None assert loc.altitude != 0 @@ -222,9 +222,9 @@ def test_from_tmy_3(): def test_from_tmy_2(): - from test_tmy import tmy2_testfile + from test_tmy import TMY2_TESTFILE from pvlib.iotools import read_tmy2 - data, meta = read_tmy2(tmy2_testfile) + data, meta = read_tmy2(TMY2_TESTFILE) loc = Location.from_tmy(meta, data) assert loc.name is not None assert loc.altitude != 0 diff --git a/pvlib/test/test_modelchain.py b/pvlib/tests/test_modelchain.py similarity index 100% rename from pvlib/test/test_modelchain.py rename to pvlib/tests/test_modelchain.py diff --git a/pvlib/test/test_numerical_precision.py b/pvlib/tests/test_numerical_precision.py similarity index 96% rename from pvlib/test/test_numerical_precision.py rename to pvlib/tests/test_numerical_precision.py index ab84b3431a..bd36292982 100644 --- a/pvlib/test/test_numerical_precision.py +++ b/pvlib/tests/test_numerical_precision.py @@ -17,19 +17,17 @@ """ import logging -import os import numpy as np import pandas as pd from pvlib import pvsystem from pvlib.singlediode import bishop88, estimate_voc +from conftest import DATA_DIR logging.basicConfig() LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) TEST_DATA = 'bishop88_numerical_precision.csv' -TEST_PATH = os.path.dirname(os.path.abspath(__file__)) -PVLIB_PATH = os.path.dirname(TEST_PATH) -DATA_PATH = os.path.join(PVLIB_PATH, 'data', TEST_DATA) +DATA_PATH = DATA_DIR / TEST_DATA POA = 888 TCELL = 55 # module parameters from CEC module SunPower SPR-E20-327 diff --git a/pvlib/test/test_pvsystem.py b/pvlib/tests/test_pvsystem.py similarity index 99% rename from pvlib/test/test_pvsystem.py rename to pvlib/tests/test_pvsystem.py index ecf68cd97a..97a60e4c19 100644 --- a/pvlib/test/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -1,5 +1,3 @@ -import inspect -import os from collections import OrderedDict import numpy as np @@ -17,13 +15,13 @@ from pvlib import temperature from pvlib._deprecation import pvlibDeprecationWarning -from conftest import needs_numpy_1_10, requires_scipy, fail_on_pvlib_version +from conftest import ( + needs_numpy_1_10, requires_scipy, fail_on_pvlib_version, DATA_DIR) def test_systemdef_tmy3(): from pvlib.iotools import tmy - pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvsystem))) - tmy3_testfile = os.path.join(pvlib_abspath, 'data', '703165TY.csv') + tmy3_testfile = DATA_DIR / '703165TY.csv' tmy3_data, tmy3_metadata = tmy.read_tmy3(tmy3_testfile) expected = {'tz': -9.0, 'albedo': 0.1, @@ -40,8 +38,7 @@ def test_systemdef_tmy3(): def test_systemdef_tmy2(): from pvlib.iotools import tmy - pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvsystem))) - tmy2_testfile = os.path.join(pvlib_abspath, 'data', '12839.tm2') + tmy2_testfile = DATA_DIR / '12839.tm2' tmy2_data, tmy2_metadata = tmy.read_tmy2(tmy2_testfile) expected = {'tz': -5, diff --git a/pvlib/test/test_scaling.py b/pvlib/tests/test_scaling.py similarity index 100% rename from pvlib/test/test_scaling.py rename to pvlib/tests/test_scaling.py diff --git a/pvlib/test/test_singlediode.py b/pvlib/tests/test_singlediode.py similarity index 100% rename from pvlib/test/test_singlediode.py rename to pvlib/tests/test_singlediode.py diff --git a/pvlib/test/test_solarposition.py b/pvlib/tests/test_solarposition.py similarity index 100% rename from pvlib/test/test_solarposition.py rename to pvlib/tests/test_solarposition.py diff --git a/pvlib/test/test_spa.py b/pvlib/tests/test_spa.py similarity index 100% rename from pvlib/test/test_spa.py rename to pvlib/tests/test_spa.py diff --git a/pvlib/test/test_temperature.py b/pvlib/tests/test_temperature.py similarity index 100% rename from pvlib/test/test_temperature.py rename to pvlib/tests/test_temperature.py diff --git a/pvlib/test/test_tools.py b/pvlib/tests/test_tools.py similarity index 100% rename from pvlib/test/test_tools.py rename to pvlib/tests/test_tools.py diff --git a/pvlib/test/test_tracking.py b/pvlib/tests/test_tracking.py similarity index 100% rename from pvlib/test/test_tracking.py rename to pvlib/tests/test_tracking.py