diff --git a/.github/workflows/new_pypi_release.yml b/.github/workflows/new_pypi_release.yml new file mode 100644 index 0000000..bfb477a --- /dev/null +++ b/.github/workflows/new_pypi_release.yml @@ -0,0 +1,56 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Release to Pypi + +# Run on a published release and push to Pypi +on: + release: + types: [published] + +jobs: + + build_dist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-python@v2 + name: Install Python + with: + python-version: '3.8' + + - name: Install dependencies + run: | + python3 -m pip install --upgrade pip wheel + python3 -m pip install -r requirements.txt + + - name: Build dist + run: python setup.py sdist --formats=gztar + + - name: Build wheel + run: python3 setup.py bdist_wheel + + - uses: actions/upload-artifact@v2 + with: + path: dist/*.tar.gz + + upload_pypi: + needs: [build_dist] + runs-on: ubuntu-latest + # upload to PyPI on every tag starting with 'v' + # if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') + # alternatively, to publish when a GitHub Release is created, use the following rule: + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - uses: actions/download-artifact@v2 + with: + name: artifact + path: dist + + - uses: pypa/gh-action-pypi-publish@master + with: + user: __token__ + password: ${{ secrets.pypi_password }} + # To test: repository_url: https://test.pypi.org/legacy/ \ No newline at end of file diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml new file mode 100644 index 0000000..970c3db --- /dev/null +++ b/.github/workflows/unittest.yml @@ -0,0 +1,70 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Unittest, flake8 + +# Run action on pull requests +on: + pull_request: + branches: [ main ] + +jobs: + + flake8: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + + - name: Install dependencies + run: | + python3 -m pip install --upgrade pip + python3 -m pip install flake8 + + - name: Lint with flake8 + run: | + flake8 weather_forecast_retrieval + + unittest: + needs: flake8 + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + python-version: [3.6, 3.7, 3.8, 3.9] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install eccodes + run: | + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt-get install -y libeccodes-tools + elif [ "$RUNNER_OS" == "macOS" ]; then + brew install eccodes + else + echo "$RUNNER_OS not supported" + exit 1 + fi + shell: bash + + - name: Install dependencies + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -r requirements.txt + python3 -m pip install .[tests] + + - name: Run unittests + env: + WFR_SKIP_EXTERNAL_REQUEST_TEST: please_skip + WFR_SKIP_ON_GITHUB_ACTIONS: also_skip + run: python3 -m unittest -v \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 28cdc14..0000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Config file for automatic testing at travis-ci.org -# This file will be regenerated if you run travis_pypi_setup.py - -language: python -python: - - 3.6 - -# command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors -install: pip install flake8 - -# command to run tests, e.g. python setup.py test -script: - - make lint - # This won't work because all the dependancies, need the docker image - # - make coverage - diff --git a/requirements.txt b/requirements.txt index 96b997f..4211802 100755 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ cfgrib>=0.9.7.1 beautifulsoup4 pandas numpy +setuptools_scm<4.2 \ No newline at end of file diff --git a/setup.py b/setup.py index 96832c2..c3f49c5 100644 --- a/setup.py +++ b/setup.py @@ -1,31 +1,13 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""The setup script.""" - -# # from setuptools import setup, find_packages from setuptools import setup with open('README.md') as readme_file: readme = readme_file.read() -# with open('HISTORY.rst') as history_file: -# history = history_file.read() - with open('requirements.txt') as req_file: requirements = req_file.read() -# setup_requirements = [ -# # TODO(scotthavens): put setup requirements (distutils extensions, etc.) here -# ] - -# test_requirements = [ -# # TODO: put package test requirements here -# ] - setup( name='weather_forecast_retrieval', - version='0.6.14', description="Weather forecast retrieval gathers relevant gridded weather " "forecasts to ingest into physically based models for water " "supply forecasts", @@ -50,10 +32,24 @@ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Natural Language :: English', + 'License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', ], test_suite='tests', + extras_require={ + 'tests': [ + 'mock', + ], + }, + use_scm_version={ + 'local_scheme': 'node-and-date', + }, + setup_requires=[ + 'setuptools_scm' + ], scripts=[ 'scripts/run_hrrr_retrieval', 'scripts/run_hrrr_retrieval_dates', diff --git a/tests/data/hrrr/test_config_file.py b/tests/data/hrrr/test_config_file.py index b135b8b..d0dc206 100644 --- a/tests/data/hrrr/test_config_file.py +++ b/tests/data/hrrr/test_config_file.py @@ -2,6 +2,7 @@ import unittest import pandas as pd + import tests.helpers from weather_forecast_retrieval.data.hrrr.config_file import ConfigFile diff --git a/tests/data/hrrr/test_file_loader.py b/tests/data/hrrr/test_file_loader.py index 4f6cff4..c0453ab 100755 --- a/tests/data/hrrr/test_file_loader.py +++ b/tests/data/hrrr/test_file_loader.py @@ -2,8 +2,9 @@ import unittest import mock -import tests.helpers import xarray + +import tests.helpers from tests.RME import RMETestCase from weather_forecast_retrieval.data.hrrr.file_loader import FileLoader from weather_forecast_retrieval.data.hrrr.grib_file import GribFile diff --git a/tests/data/hrrr/test_http_retrieval.py b/tests/data/hrrr/test_http_retrieval.py index 33d0a40..2c9da9f 100644 --- a/tests/data/hrrr/test_http_retrieval.py +++ b/tests/data/hrrr/test_http_retrieval.py @@ -3,8 +3,8 @@ import pandas as pd -from tests.RME import RMETestCase from tests.helpers import skip_external_http_request +from tests.RME import RMETestCase from weather_forecast_retrieval.data.hrrr import HttpRetrieval diff --git a/tests/helpers.py b/tests/helpers.py index abfa20d..47c0921 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -9,3 +9,7 @@ def skip_external_http_request(): return 'WFR_SKIP_EXTERNAL_REQUEST_TEST' in os.environ + + +def skip_on_github_actions(): + return 'WFR_SKIP_ON_GITHUB_ACTIONS' in os.environ diff --git a/tests/test_grib2nc.py b/tests/test_grib2nc.py index 7a3801c..6084fda 100644 --- a/tests/test_grib2nc.py +++ b/tests/test_grib2nc.py @@ -1,5 +1,7 @@ import os +import unittest +from tests.helpers import skip_on_github_actions from tests.RME import RMETestCase from weather_forecast_retrieval.grib2nc import grib2nc @@ -7,6 +9,9 @@ class TestGrib2nc(RMETestCase): """Tests for `weather_forecast_retrieval` package.""" + @unittest.skipIf( + skip_on_github_actions(), 'On Github Actions, skipping' + ) def testGrib2nc(self): """ Convert test data to netcdf diff --git a/tests/test_hrrr_archive.py b/tests/test_hrrr_archive.py index f03ae66..4e9dc50 100644 --- a/tests/test_hrrr_archive.py +++ b/tests/test_hrrr_archive.py @@ -7,8 +7,8 @@ import numpy as np import pandas as pd -from tests.RME import RMETestCase from tests.helpers import skip_external_http_request +from tests.RME import RMETestCase from weather_forecast_retrieval import hrrr_archive diff --git a/tests/test_hrrr_preprocessor.py b/tests/test_hrrr_preprocessor.py index 3c66c64..666087f 100644 --- a/tests/test_hrrr_preprocessor.py +++ b/tests/test_hrrr_preprocessor.py @@ -1,10 +1,16 @@ +import unittest + import pandas as pd +from tests.helpers import skip_on_github_actions from tests.RME import RMETestCase from weather_forecast_retrieval.data.hrrr import FileLoader from weather_forecast_retrieval.hrrr_preprocessor import HRRRPreprocessor +@unittest.skipIf( + skip_on_github_actions(), 'On Github Actions, skipping' +) class TestHRRRPreprocessor(RMETestCase): """ Test cropping HRRR files @@ -16,9 +22,9 @@ class TestHRRRPreprocessor(RMETestCase): start_date = '2018-07-22 01:00' end_date = '2018-07-22 02:00' output_files = [ - 'hrrr.20180722/hrrr.t01z.wrfsfcf01.grib2', - 'hrrr.20180722/hrrr.t02z.wrfsfcf01.grib2', - ] + 'hrrr.20180722/hrrr.t01z.wrfsfcf01.grib2', + 'hrrr.20180722/hrrr.t02z.wrfsfcf01.grib2', + ] def setUp(self): super().setUp() diff --git a/weather_forecast_retrieval/__init__.py b/weather_forecast_retrieval/__init__.py index 729c36c..e890949 100644 --- a/weather_forecast_retrieval/__init__.py +++ b/weather_forecast_retrieval/__init__.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- +from pkg_resources import DistributionNotFound, get_distribution -"""Top-level package for Weather Forecast Retrieval.""" - -__author__ = """Scott Havens""" -__email__ = 'scott.havens@ars.usda.gov' -__version__ = '0.6.14' +try: + __version__ = get_distribution(__name__).version +except DistributionNotFound: + __version__ = 'unknown' diff --git a/weather_forecast_retrieval/hrrr_archive.py b/weather_forecast_retrieval/hrrr_archive.py index c50999b..2ccd75c 100755 --- a/weather_forecast_retrieval/hrrr_archive.py +++ b/weather_forecast_retrieval/hrrr_archive.py @@ -92,6 +92,7 @@ def download_url(fname, OUTDIR, logger, file_day, model='hrrr', field='sfc'): check_this = requests.head(URL) file_size = int(check_this.headers['content-length']) + success = False try: if file_size > 10000: logger.info("Downloading: {}".format(URL))