diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 0000000..446ccfe --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,25 @@ +build: false + +environment: + matrix: + - PYTHON: "C:\\Miniconda36-x64" + PY: 3.7 + +install: + # Install and configure miniconda. + - "set PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + - conda config --set always_yes yes --set changeps1 no --set show_channel_urls true + - conda update conda --quiet + - conda install pycryptosat --quiet + - conda config --add channels conda-forge --force + - conda config --set sat_solver pycryptosat + - conda config --set channel_priority strict + - conda config --set safety_checks disabled + + # Create the test env. + - conda create --name TEST python=%PY% --file requirements.txt --file requirements-dev.txt + - activate TEST + +test_script: + - pip install -e . --no-deps --force-reinstall + - pytest -n 2 -rxs tests diff --git a/.travis.yml b/.travis.yml index c1aa5b5..d812f1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,38 +2,81 @@ language: python sudo: false +env: + global: + - secure: "ZN/NaiMNwlLUbxD4P+ha8SDfv1hfaJl9Dm838Z27cGPrOOFYC66sC1zLYnlWn1qeutyKZcML+EJ8m+aARe7ONQ97Noshm0i2ldtTAthpIoCOmIWja+9TvWQ5L3if3FUt9OsiHunkOZUM0IUILYryEgCrisUtO2WzcPs2XMO+c8M=" + matrix: fast_finish: true include: - - python: 2.7 - env: TEST_TARGET=default - - python: 3.5 - env: TEST_TARGET=default - - python: 3.6 - env: TEST_TARGET=default - - python: 3.6 - env: TEST_TARGET=coding_standards + - name: "python-3.7" + env: PY=3.7 + - name: "python-3.6" + env: PY=3.6 + - name: "python-2.7" + env: PY=2.7 + - name: "coding_standards" + env: PY=3.7 + - name: "docs" + env: PY=3.7 + allow_failures: + - name: "coding_standards" + env: PY=3.7 before_install: - - wget http://bit.ly/miniconda -O miniconda.sh - - bash miniconda.sh -b -p $HOME/miniconda - - export PATH="$HOME/miniconda/bin:$PATH" - - conda config --set always_yes yes --set changeps1 no --set show_channel_urls true - - conda update conda - - conda config --add channels conda-forge --force - - conda create --name TEST python=$TRAVIS_PYTHON_VERSION --file requirements.txt --file requirements-dev.txt - - source activate TEST + # Install miniconda and create TEST env. + - | + wget http://bit.ly/miniconda -O miniconda.sh + bash miniconda.sh -b -p $HOME/miniconda + export PATH="$HOME/miniconda/bin:$PATH" + conda config --set always_yes yes --set changeps1 no --set show_channel_urls true + conda update conda --quiet + conda install pycryptosat --quiet + conda config --add channels conda-forge --force + conda config --set sat_solver pycryptosat + conda config --set channel_priority strict + conda config --set safety_checks disabled + conda create --name TEST python=$PY --file requirements.txt --file requirements-dev.txt + source activate TEST install: - # Test source distribution. - - python setup.py sdist && version=$(python setup.py --version) && pushd dist && pip install UTide-${version}.tar.gz && popd + - python setup.py sdist && version=$(python setup.py --version) && pushd dist && pip install --no-deps --force-reinstall UTide-${version}.tar.gz && popd script: - - if [[ $TEST_TARGET == 'default' ]]; then - py.test -vv ; - fi + - if [[ $TRAVIS_JOB_NAME == python-* ]]; then + cp -r tests/ /tmp ; + pushd /tmp && pytest -n 2 -rxs --cov=utide tests && popd ; + fi - - if [[ $TEST_TARGET == 'coding_standards' ]]; then - pycodestyle --ignore=E741,E226,W504 --max-line-length=100 tests ; - pycodestyle --ignore=E741,E226,W504 --max-line-length=100 utide ; + - if [[ $TRAVIS_JOB_NAME == 'coding_standards' ]]; then + pytest --flake8 -m flake8 ; + fi + + - | + if [[ $TRAVIS_JOB_NAME == 'docs' ]]; then + set -e + conda install doctr + pushd docs + make clean html linkcheck + popd + if [[ -z "$TRAVIS_TAG" ]]; then + python -m doctr deploy --build-tags --key-path github_deploy_key_wesleybowman_utide.enc --built-docs docs/_build/html dev + else + python -m doctr deploy --build-tags --key-path github_deploy_key_wesleybowman_utide.enc --built-docs docs/_build/html "version-$TRAVIS_TAG" + python -m doctr deploy --build-tags --key-path github_deploy_key_wesleybowman_utide.enc --built-docs docs/_build/html . fi + fi + +deploy: + skip_cleanup: true + provider: pypi + user: ocefpaf + password: + secure: "n7V/06zaWzAHiAx2YLh6n+glbRKHEdHntw8oOJXQJKQaiDzJR+Be2FANZ4rSof4kkDVUwwqTNzAuVn43BJBt4WdKdh3PWZwhfm4+/lzN1lpwyhK+P/5IUxSynov2JcqzvJtmrGCELEqrULBvrbBbcf9f93NPUr6Id5iA0shKv4w=" + distributions: sdist bdist_wheel + upload_docs: no + on: + repo: wesleybowman/UTide + tags: true + all_branches: master + condition: '$TRAVIS_JOB_NAME == "python-3.7"' \ No newline at end of file diff --git a/README.rst b/README.rst index 05c3f83..f3533ad 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ UTide ===== -|travis| |license| |conda| |downloads| |anaconda_cloud| +|travis| |license| |conda| |downloads| |anaconda_cloud| |appveyor| .. |travis| image:: https://travis-ci.org/wesleybowman/UTide.svg?branch=master :target: https://travis-ci.org/wesleybowman/UTide @@ -17,6 +17,10 @@ UTide .. |anaconda_cloud| image:: https://anaconda.org/conda-forge/utide/badges/version.svg :target: https://anaconda.org/conda-forge/utide +.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/4o163ma4ehhr3q48/branch/master?svg=true + :target: https://ci.appveyor.com/project/wesleybowman/utide/branch/master + + Python re-implementation of the Matlab package UTide. Still in heavy development--everything is subject to change! diff --git a/doc/Makefile b/docs/Makefile similarity index 100% rename from doc/Makefile rename to docs/Makefile diff --git a/doc/_static/.gitkeep b/docs/_static/.gitkeep similarity index 100% rename from doc/_static/.gitkeep rename to docs/_static/.gitkeep diff --git a/doc/_templates/.gitkeep b/docs/_templates/.gitkeep similarity index 100% rename from doc/_templates/.gitkeep rename to docs/_templates/.gitkeep diff --git a/doc/conf.py b/docs/conf.py similarity index 100% rename from doc/conf.py rename to docs/conf.py diff --git a/doc/index.rst b/docs/index.rst similarity index 100% rename from doc/index.rst rename to docs/index.rst diff --git a/doc/internals/index.rst b/docs/internals/index.rst similarity index 100% rename from doc/internals/index.rst rename to docs/internals/index.rst diff --git a/doc/internals/periodogram.rst b/docs/internals/periodogram.rst similarity index 100% rename from doc/internals/periodogram.rst rename to docs/internals/periodogram.rst diff --git a/doc/internals/robustfit.rst b/docs/internals/robustfit.rst similarity index 100% rename from doc/internals/robustfit.rst rename to docs/internals/robustfit.rst diff --git a/doc/strategy.rst b/docs/strategy.rst similarity index 100% rename from doc/strategy.rst rename to docs/strategy.rst diff --git a/doc/usage.rst b/docs/usage.rst similarity index 100% rename from doc/usage.rst rename to docs/usage.rst diff --git a/github_deploy_key_wesleybowman_utide.enc b/github_deploy_key_wesleybowman_utide.enc new file mode 100644 index 0000000..297d776 --- /dev/null +++ b/github_deploy_key_wesleybowman_utide.enc @@ -0,0 +1 @@ +gAAAAABctHINHbJo74bSpj4MSjKOYz5AwU0qWjTJmoQ2Yw73TSVvFql3h7ERrxxmo3Sbw96YlBR00KXDSPeKnCen0QX8vdBE-fR_tEqgCElBklDTD4L1AYW6CM8Nl7ZyING8DQ0HMsSjSyGLzsmUQU96w5rWe04F6oALY3OJDc7V6I5ll1x_HC0bVq2kTQfwju9_dUiU2zdIJSnRLjwsXgmmzMFqkf-ZLj7-ol_6wi6VQ_eEssEee4SvvQZ0lVfq7iG8-_hxHL6eD3roecy69P8VlN1hwDSy58dWh_U-Ye587wv_UasXAfPeKN6ImOJHJfxcSaGKXwbYiIw75lQbpNDsR5Jm9g5OrX60skQcoitBVT7_9QgCjNtMYkCBPEK8v4_R_xoX0MnXMnjdu1saAV7s3ZkYfVNdMA_8MCWxtW1_g3kTKpQGekInLSArIwr9WEN4GwO9dcLHr0J0Y21aib3yAS6MJrfLowQBg9YlNm0Jt7SfY5np7Kha_Wn_I_vGgMdc8dh0e5K8lkWPbuCi9ts_bM2YdTwvozN2obrKMYM5UjcyidcOeUq3ZDHSYvquXfttxq7neShfkuUDXcJzy5I8AQQdl-NB4wX6bT9RHQLpc6RUveJd1gYcGy65ZO_E7QMr7Lj5En7t6lNu1Zr_1vA9buoNi_nA0g8ytAtyUcZRpJwIZQXELxqYGf6pnO3kWx_c7X7n65CUta_KiQb_716KF54c5ZWVp4cILCw06PIosyTSOmag5XDDK8q4SWKa8F4eqx3tyrVsHVZp27G4iK3FqXNm2_dZd1OQfdO9jhyKaPGZDfSpAwQn6iWhz46zMIpqQpyGq0xJqKwAIJkTwvrNk5JbiyvuZqcjVO4mb8iEjDz-fKcdXAsfSOJ_oQJf04GpFPFKLOuv3HOz7iBzknmo1f5tsuY3BOlUgDymAA6UypibwaksYvt3LKIVPPFAeEva1uleRF85pFGATZdV1jZYpJ51dP8pcn9WG1ZLaydlSm_yDoBKB5IJg80NuKrAY9AXAw6Le-rel0JVzx6957y78iQAbwe-CMQQfIoe0tu1wm9wt9FBWoAsC4QPSc9ov3ASIS8eSvngmQEp-x4hMPRXQCNp01bTHYVYdJcc-yLvbpDqfjKLl270fubLuBi4zUfA8v67KdmUv3h2XKGz1XfWia617UCJKFE4TatEXgEjHG2gZvCSFChweji5FWV-T1Cra4IkV_aYnVMbjRHtWGwxWiPTefk0xQZPpry7Ogb9oeyPdTGtO3cCkaILruN81wFJl-txCxhnVXIoetwGcpJJBdX0vLvSZispwj7j1a11eaM2RYjMBCaj8D3RXntD3jLOxDncp488Fs1tOYPPNXSzGhox5XJ7VSfsTr5UiSjsJ5mT8Kf4VAkCVj9OD3iyDjmVZxV82FhRVOI6-IGGMMIKC7nKKjI6eaEimm_HAabs2B7Ty4mlZK2beksimLvHVX5YdGrkQbmrNPN-8im1nVY5wzWYXCdMV2bJSEgZjlQ9xblOHKSkkLQUIzH7WHhxyHveqCzMdp139ESYz2AaqZjMSfAapNdAP-NY596dzrWa8qXaCBWLb0TU5KOq2urpaFofQOkbf1unmYThzhk9_k0_YVDIkLTHj7WLSGt7V0saADDLhxSWUhkHey8EMRTheld_jrB6CCIPkw4H3ind9r5Ap3LYNNiIyGB6U-mfoUcvz-rt3Z1xezmx8gqO21CSUgS4E074-b-EULXJ74E-B8YAZShjXukZOytJOz2l8iP-GMvSR7VoJWAFohgJdxkl3PzdN370SPmSPwF0tKzf6LmkkvuqfkohJpuff6JPxdkXa_EGWQMtYeSI9rwGy25SC4j3Bnu6d5JCLlzVmk8ztKVBQbtB54ljZ-X5YUNZYyeFQhUjhwa8Zeiw8C0qoIpoENjNLCpdmdp7nr5UMZOXzeFbJCqN1KcaIPyzerfHANM7aH65ftSAhBGegtDYW7EUA2beAGjtlOrq1FSZqbbYxgR5VTEnnnciovT7JBuc2tkaDI4o2TANbcOFhQkQthIlNsKF6YAuY2g4bSKF_CcICWohDYWXOrAd-TnFknN71YbQuyO-due1OjT04ZQptZGHlKyKKx4EvEG4AGsWPyT-2OlAZQ_7pNyIVfTo1QXTuFFcHAlmo0Y24z5iQuDAZmajrwLcv1vqHSJ3xE2-GFwGao0NnvoMC7Y0dEzUWVGhzjkPn5aU2x8T-9V-OUfIWIDZSaL6T39Tdh-yPfF3uND-qibt78f0jVtYfSmwR16QN0ItYLc1e1vbXh7blXk_kSA1a-ZJdzbuf32OiuGunvo2InJDr02K5_7a3sY-wgLTa2Z-zBTKJWLNoogHo09L5jxVZ34tHt_fCe0d54mnWtNi3pQ32_nnHW5otU6MhWoNZ53vqkwZNm9GN4hIOGrWrTm1LOn2dEXlOz96GIKj5NaxP2qQqQeMV1PTiqwmAuyKrjlfcaoWDbe9wVa1JCvUJtJUNYbDyCgvals_PvYsJ_jQP-IDpS5JX1GJwvoQ19k_UFsNsRNZ1ZOckgOuBDQgu3KaftZ9ZdV0Xq2eTNfUFsLFQJ0vxN9JIB6LG5fBZ9ozQaCSLXRPWoXciV8ZVjFAww6HpsPKHWK-sPVt-L8cjDX0dWKl7hVrETbKg21TgZkSzAWi9Btfbrx453EnFPAET5xLUQaylTXqSEbb0mQVeiI1gprYuk_RAxdzb0RXQZmNYbvRqTk4Hn5EmosDdXA0ZQuuDKxIkSm5jdOTWk2Rem8syAgQBvZ1rYN43WQOGr4O0Gl5Ohlo-t59BcKUyuRwsZ36Ny5CzQykSMfDRcGOnMz7W9jzELDGWv8ZaWX-WvlBd0XyCodDtGpSgnnt6_g9AONSIbDpwSSmwa4jAlOGwqlAReJ3jAHb8RnB55vWuwul9maQ7toKKkeqwkUYsUtjQ1D1UGkEBVkPLc2bAnCfVEVC1p3UOXsh0VXViLPUt3IwJR9JMCSJPYgEDXxCLjFSw_yealup_dkrbjWD1U6oc8HAKWLuJTiuj6gFtacoM2GtcEOqs1UDlRJfd5-neXM_hBx3zF5N-3rffZ0fKX-3LaMT7bh0ddbSUR12oaWnULalmzIjABS1cHazpSmXZvxtzXcYQ0cTULajpMyXgy8QV2sGZ4BTAQCjz8xmylPt7Pspd6Q78dx6kDtSb15YGZRyv_d6W0DmwXWLhsA3KEguAFEv78BkAGhUANB-ZR6CPznWBVBPhB_hjvflb3HHI3hc4LTFAfQZBHIC_GFeFA1K8XTSDDP4_sWmTy5wtOMN9ZfgsgFgH4r4SdVlkV5mtdFEcajAI5DEbyh243vmxXdio9s9EV14YUVC2gxSpGuG2pd1R34r2j4x_SOOSL7zSdvuZWQC6E9A3w-w9VXrq1eRP9Nk6XQneGIn5IYc3JP1pIyKd6sSkRDv0MIrNRqBglKQ-tN1NV6qatz-X_pDLYmcA-ovUMNsosd7VCPPO6LDfVTMiSISjf5IDqTfe8VrnqyjsMWvwPF2zwig3ThDck9I48UrNI8aRzXyLgy2voaSk98QCCipiN-3FgkjAa7L3eYzXFkBTt1wW8SRIYiPJT7NI-WSYO5eANBQJASxf4YD7BX7LxUvv2PMKYQ8YaOV537WsqKSEgCpZV11o26mXJsxSeQ-LJ5keo58Z0dFpFSLJSmNd-disk4gZPjJvc7eKfz6dHPapChJ7AfaBo3qPzxDvQxBYv4n_AOBKOb1X8SjEI7bypWpcLHnaxBCMklGmqJB0DalnZ9KdEgee2e9pWvQq7ubcqyQy4ZsFUIr6VEiXQ26z95HXRf740Qjfir4uDLaXF28N_XVyaIDOu-YOVldDG5Azc_n-6aFuV2OCcGh26tm_ZEwQ41f8O1T25gtQ71XOL4AtJksYWn8C6CLLWXvYWYnyGyK0dyvmFGbgSMOqx7nxHTJyiLthOebWgnTZCZubWAnM27iz0dNGC9zoJfrVw9bTIZUCPyF5f7dqnhwVaAYwkpSxYNqtI9XYN9hjkd5nAd_BT7o8iC6Q33ccM4gTjHSOHVVOG-ADvONJ3DBkG0VGNgTZ0J7VWISxhIS5-mD4PD5VI7Nyptu6ru9PWOCPa3X2fy7E1_JBNvcWMGMm3OD5KjlwBO629tktB2q4YU3DC5yAnBnlNzcpUgahQh8Vm8ptUEp1Du6aRxFYZjF_ZvWBhxWy4eXDMxg3BUj6V5h9V4TATVqMzdmlNp4t65eDHgxRUTWQe67R-cW9IcKtd_X47HrNlqfxCwixn9xC4XronjGhzURj1EUU6BNI5bu1Fow1TsZjD_mPNbSGvgWYZeAH8VbAbGz6baTA79x46DGDR0PXElvw1LcOxyTOA72TTeLvVlkRLY82LbJL9Tl8X_HAIbZHB1x9dDl-MhV3VwNSsgE4o3r14H-3gvSvOfCBBmXCqvkAGJQUlQTYg== \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt index 9a8de09..234c386 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,14 @@ +flake8 +flake8-builtins +flake8-comprehensions +flake8-mutable +flake8-print matplotlib pandas pycodestyle pytest pytest-cov +pytest-flake8 +pytest-xdist +sphinx +twine diff --git a/setup.cfg b/setup.cfg index 85d3584..69511cc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,3 +9,15 @@ versionfile_source = utide/_version.py versionfile_build = utide/_version.py tag_prefix = v parentdir_prefix = + +[tool:pytest] +flake8-max-line-length = 105 +flake8-ignore = + E741,E226,W504 + docs/* ALL + versioneer.py ALL + utide/_version.py ALL + +[metadata] +description-file = README.rst +license_file = LICENSE.txt \ No newline at end of file diff --git a/setup.py b/setup.py index fb0271a..bf19270 100644 --- a/setup.py +++ b/setup.py @@ -11,8 +11,6 @@ def read(*parts): return open(os.path.join(rootpath, *parts), 'r').read() -long_description = '{}\n{}'.format(read('README.rst'), read('LICENSE.txt')) - with open('requirements.txt') as f: require = f.readlines() install_requires = [r.strip() for r in require] @@ -20,7 +18,7 @@ def read(*parts): setup(name='UTide', version=versioneer.get_version(), license='MIT', - long_description=long_description, + long_description=read('README.rst'), classifiers=['Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Intended Audience :: Science/Research', diff --git a/tests/test_uv.py b/tests/test_uv.py index 5acb0ec..c261914 100644 --- a/tests/test_uv.py +++ b/tests/test_uv.py @@ -15,8 +15,7 @@ from utide.utilities import Bunch -@pytest.fixture -def fake_tide(t, M2amp, M2phase): +def _fake_tide(t, M2amp, M2phase): """ Generate a minimally realistic-looking fake semidiurnal tide. @@ -36,14 +35,14 @@ def make_data(): np.random.seed(1234) t = date_range(start='2016-03-29', periods=N, freq='H') # Signal + some noise. - u = fake_tide(np.arange(N), M2amp=2, M2phase=0) + np.random.randn(N) - v = fake_tide(np.arange(N), M2amp=1, M2phase=np.pi) + np.random.randn(N) + u = _fake_tide(np.arange(N), M2amp=2, M2phase=0) + np.random.randn(N) + v = _fake_tide(np.arange(N), M2amp=1, M2phase=np.pi) + np.random.randn(N) time = date2num(t.to_pydatetime()) return time, u, v -def test_solve(): - time, u, v = make_data() +def test_solve(make_data): + time, u, v = make_data coef = solve(time, u, v, lat=-42.5, nodal=False, diff --git a/utide/periodogram.py b/utide/periodogram.py index ff0b714..7622ea7 100644 --- a/utide/periodogram.py +++ b/utide/periodogram.py @@ -332,7 +332,7 @@ def band_psd(t, e, cfrq, equi=True, frqosamp=1): t = t[:-1] nt -= 1 - hn = signal.hanning(nt, sym=False) + hn = signal.windows.hann(nt, sym=False) # on real component if equi: # If even sampling, FFT.