From 454b2e1a152620c2094bb8408037479ace533b52 Mon Sep 17 00:00:00 2001 From: brey Date: Thu, 17 Feb 2022 11:31:32 +0100 Subject: [PATCH] Work on binder Fix also cartopy features link Make sure itkwidgets work Force Jupyterlab2 Fix Tutorial Notebooks Make sure mayavi works --- Tutorial/BOUNDARY.ipynb | 80 ++++++++++++++++---------------- Tutorial/GLOBAL.ipynb | 100 ++++++++++++++++++++-------------------- Tutorial/GSS.ipynb | 45 +++++++++++------- binder/apt.txt | 1 + binder/environment.yml | 9 ++-- binder/postBuild | 12 +++-- binder/start | 11 +++++ setup.py | 3 +- 8 files changed, 145 insertions(+), 116 deletions(-) create mode 100644 binder/start diff --git a/Tutorial/BOUNDARY.ipynb b/Tutorial/BOUNDARY.ipynb index 7479119e..ebd17397 100644 --- a/Tutorial/BOUNDARY.ipynb +++ b/Tutorial/BOUNDARY.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "f0982aea", + "id": "8f52acbc", "metadata": {}, "source": [ "# The Boundary module" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "94e3d0bc", + "id": "cab59e78", "metadata": {}, "source": [ "This module handles mesh boundary extraction from coastlines or user provided shapefiles. It underpins the [MESH](MESH.ipynb) module.\n", @@ -24,7 +24,7 @@ { "cell_type": "code", "execution_count": null, - "id": "facd7989", + "id": "f6a3107a", "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36ebbaea", + "id": "1d773816", "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4ca41804", + "id": "2eb10c37", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "1fde6b9b", + "id": "e8b9a2e7", "metadata": {}, "source": [ "### Graphics" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0af0bb8a", + "id": "aa50be39", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ee5fde0", + "id": "2dd5b8cb", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4edaaa7e", + "id": "a74cc6b0", "metadata": {}, "outputs": [], "source": [ @@ -96,7 +96,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6c973e02", + "id": "267e7285", "metadata": {}, "outputs": [], "source": [ @@ -107,7 +107,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b8315cc8", + "id": "7990b431", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +118,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5bdcfc52", + "id": "631b9c7a", "metadata": {}, "outputs": [], "source": [ @@ -129,7 +129,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0a78ff6c", + "id": "6656b7a2", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b41affaf", + "id": "9e882621", "metadata": {}, "outputs": [], "source": [ @@ -151,7 +151,7 @@ }, { "cell_type": "markdown", - "id": "86be9259", + "id": "76592c87", "metadata": {}, "source": [ "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python." @@ -160,7 +160,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0e0d559e", + "id": "21fb8e63", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "ea781840", + "id": "b1ffb7fd", "metadata": {}, "source": [ "## Coastlines" @@ -181,7 +181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23dd6419", + "id": "9cad8061", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "3f95b851", + "id": "d57eb9bd", "metadata": {}, "source": [ "Without loss of generality we are using the `GHSS` intermediate resolution dataset" @@ -201,7 +201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ece63c4", + "id": "50f7ecad", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +212,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6f1c3b92", + "id": "b02f1607", "metadata": {}, "outputs": [], "source": [ @@ -221,7 +221,7 @@ }, { "cell_type": "markdown", - "id": "644e114f", + "id": "c3be0a46", "metadata": {}, "source": [ "## Case 1\n", @@ -232,7 +232,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4f7ebce5", + "id": "85ee16f9", "metadata": {}, "outputs": [], "source": [ @@ -247,7 +247,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f5495489", + "id": "762fcf20", "metadata": {}, "outputs": [], "source": [ @@ -257,7 +257,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6e52c851", + "id": "abe492b3", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fb617ac3", + "id": "349eac1a", "metadata": {}, "outputs": [], "source": [ @@ -277,7 +277,7 @@ }, { "cell_type": "markdown", - "id": "07064f4c", + "id": "f849c6ca", "metadata": {}, "source": [ "## Case 2\n", @@ -288,7 +288,7 @@ { "cell_type": "code", "execution_count": null, - "id": "41e7140c", + "id": "2d7a2239", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +298,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e2e87dc", + "id": "4f60b44e", "metadata": {}, "outputs": [], "source": [ @@ -307,7 +307,7 @@ }, { "cell_type": "markdown", - "id": "f95981e2", + "id": "a538cd90", "metadata": {}, "source": [ "*Note* that the global mesh is computed in a stereographic projection at lat=-90." @@ -315,7 +315,7 @@ }, { "cell_type": "markdown", - "id": "904bb7be", + "id": "42848ce0", "metadata": {}, "source": [ "## Case 3\n", @@ -326,17 +326,17 @@ { "cell_type": "code", "execution_count": null, - "id": "ee554947", + "id": "08449b0c", "metadata": {}, "outputs": [], "source": [ - "boundary='/Users/brey/GitHub/pyPoseidon-dev/tests/data/bl.zip'" + "boundary='./data/bl/bl.shp'" ] }, { "cell_type": "code", "execution_count": null, - "id": "ce14fecf", + "id": "9dd0979a", "metadata": {}, "outputs": [], "source": [ @@ -346,7 +346,7 @@ { "cell_type": "code", "execution_count": null, - "id": "da73d724", + "id": "e5ce95ed", "metadata": {}, "outputs": [], "source": [ @@ -356,7 +356,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e51b16d9", + "id": "86037055", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "7ae445a9", + "id": "a87c94ec", "metadata": {}, "source": [ "## Case 4 \n", @@ -376,7 +376,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f6ef5a33", + "id": "2430f8c7", "metadata": {}, "outputs": [], "source": [ @@ -386,7 +386,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7f6f1b97", + "id": "d30fbaed", "metadata": {}, "outputs": [], "source": [ @@ -396,7 +396,7 @@ { "cell_type": "code", "execution_count": null, - "id": "86158576", + "id": "2218e8a4", "metadata": {}, "outputs": [], "source": [ diff --git a/Tutorial/GLOBAL.ipynb b/Tutorial/GLOBAL.ipynb index 73e311b3..51bead44 100644 --- a/Tutorial/GLOBAL.ipynb +++ b/Tutorial/GLOBAL.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2b85ac2c", + "id": "2f13f15e", "metadata": {}, "source": [ "# Global Mesh" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "7b19cf33", + "id": "c2f5b950", "metadata": {}, "source": [ "This Notebook presents the workflow for developing global meshes. \n", @@ -24,7 +24,7 @@ { "cell_type": "code", "execution_count": null, - "id": "69eb2198", + "id": "458eb029", "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c82ebb80", + "id": "32c20feb", "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1c1ce291", + "id": "ca3f40ea", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "d6c23769", + "id": "14b7d3b1", "metadata": {}, "source": [ "### Graphics" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f56938e8", + "id": "163aa993", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2f5fbd24", + "id": "d6be2261", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6dc9ddcb", + "id": "d36986d1", "metadata": {}, "outputs": [], "source": [ @@ -96,7 +96,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ef704059", + "id": "45259749", "metadata": {}, "outputs": [], "source": [ @@ -106,7 +106,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cdd992ca", + "id": "d8345c26", "metadata": {}, "outputs": [], "source": [ @@ -117,7 +117,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5e1411b9", + "id": "ba1cb82f", "metadata": {}, "outputs": [], "source": [ @@ -128,7 +128,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29085125", + "id": "6b3707b9", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3909fbb7", + "id": "a5723f54", "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f349932a", + "id": "3a1caccd", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "4c1e8eda", + "id": "3d154549", "metadata": {}, "source": [ "- In order to have within the Notebook the executable binaries installed in the conda env of the Kernel we add the corresponding path to the env `PATH`. This is not needed when we are running from python." @@ -170,7 +170,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ee5e5607", + "id": "84a66275", "metadata": {}, "outputs": [], "source": [ @@ -182,7 +182,7 @@ }, { "cell_type": "markdown", - "id": "2b8dd5fb", + "id": "7e089df1", "metadata": {}, "source": [ "## Setup" @@ -190,7 +190,7 @@ }, { "cell_type": "markdown", - "id": "6a264231", + "id": "97e8419a", "metadata": {}, "source": [ "The minimum information required is the corresponding coastlines. They can be in a form that `geopandas` can read or in a `GeoDataFrame`." @@ -199,7 +199,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ffc514fb", + "id": "c2b240ae", "metadata": {}, "outputs": [], "source": [ @@ -209,17 +209,17 @@ { "cell_type": "code", "execution_count": null, - "id": "3bb5a6f8", + "id": "713993c1", "metadata": {}, "outputs": [], "source": [ - "w = gp.read_file('./data/ocean.zip')" + "w = gp.read_file('./data/ocean/ocean.shp')" ] }, { "cell_type": "code", "execution_count": null, - "id": "4fe121ad", + "id": "9a5862fd", "metadata": {}, "outputs": [], "source": [ @@ -228,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "d4cc35da", + "id": "674a80b8", "metadata": {}, "source": [ "We define \"areametry\" as \"global\" and the engine for grid generation ('jigsaw' or 'gmsh').\n", @@ -239,7 +239,7 @@ { "cell_type": "code", "execution_count": null, - "id": "747ec7cc", + "id": "fefbd0be", "metadata": {}, "outputs": [], "source": [ @@ -251,7 +251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "01ec7b29", + "id": "7cc6baf2", "metadata": {}, "outputs": [], "source": [ @@ -260,7 +260,7 @@ }, { "cell_type": "markdown", - "id": "7779b303", + "id": "7fc55c3a", "metadata": {}, "source": [ "**TIP** : You can change the grid generator above with grid_generator = 'gmsh'." @@ -268,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "e5b4b352", + "id": "dc460731", "metadata": {}, "source": [ "## Visualize" @@ -276,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "36398f99", + "id": "52c65942", "metadata": { "tags": [] }, @@ -287,7 +287,7 @@ { "cell_type": "code", "execution_count": null, - "id": "85eae4f4", + "id": "ef0cbe84", "metadata": {}, "outputs": [], "source": [ @@ -296,7 +296,7 @@ }, { "cell_type": "markdown", - "id": "2aa67cbd", + "id": "2cd8cd9b", "metadata": {}, "source": [ "## Control mesh size" @@ -304,7 +304,7 @@ }, { "cell_type": "markdown", - "id": "b07bdd47", + "id": "3b37cd42", "metadata": {}, "source": [ "Better control on the mesh size can be obtained by providing a background control function usually in the form of a scaled DEM. One way to achieve this is to give as argument a dem file, like : " @@ -313,7 +313,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0662295b", + "id": "726d2b8c", "metadata": {}, "outputs": [], "source": [ @@ -329,7 +329,7 @@ { "cell_type": "code", "execution_count": null, - "id": "366f3517", + "id": "edd19989", "metadata": {}, "outputs": [], "source": [ @@ -339,7 +339,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fa2f6fb9", + "id": "6eb53692", "metadata": {}, "outputs": [], "source": [ @@ -349,7 +349,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8befd793", + "id": "017c0fc6", "metadata": {}, "outputs": [], "source": [ @@ -359,7 +359,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6f97d976", + "id": "feff1c38", "metadata": {}, "outputs": [], "source": [ @@ -369,7 +369,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7e4e5f20", + "id": "6392d720", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "bdfa26c6", + "id": "2004df45", "metadata": {}, "source": [ "**TIP** : Change the grid generator above with grid_generator = 'jigsaw' to see how `jigsaw` would do it." @@ -386,7 +386,7 @@ }, { "cell_type": "markdown", - "id": "dcc21322", + "id": "67151088", "metadata": {}, "source": [ "## Output" @@ -395,7 +395,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f72e75f", + "id": "88534066", "metadata": {}, "outputs": [], "source": [ @@ -404,7 +404,7 @@ }, { "cell_type": "markdown", - "id": "5e45d993", + "id": "330701e4", "metadata": {}, "source": [ "## Read a given grid" @@ -413,7 +413,7 @@ { "cell_type": "code", "execution_count": null, - "id": "50a9391e", + "id": "b90bf69d", "metadata": {}, "outputs": [], "source": [ @@ -422,7 +422,7 @@ }, { "cell_type": "markdown", - "id": "96755b8f", + "id": "270a2f66", "metadata": {}, "source": [ "### Mesh Validation" @@ -430,7 +430,7 @@ }, { "cell_type": "markdown", - "id": "34fce865", + "id": "f8be8067", "metadata": {}, "source": [ "If you model is SCHISM, the mesh can be validated against it as " @@ -439,7 +439,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b81ed86", + "id": "28e4094b", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "b35461d2", + "id": "f45503a2", "metadata": {}, "source": [ "### Grid Verification" @@ -456,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "271829df", + "id": "7abc85fe", "metadata": {}, "source": [ "The grid is created with a specific boundary defined, usually, as a coastline. In order to check whether that coastline is crossed by the generated grid we can use :" @@ -465,7 +465,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fa958066", + "id": "6833c93a", "metadata": {}, "outputs": [], "source": [ @@ -474,7 +474,7 @@ }, { "cell_type": "markdown", - "id": "e8d96348", + "id": "535657b6", "metadata": {}, "source": [ "*Note* : This is still under development and there is no distiction between 'intersection' and 'touch' for the grid. That is, the nodes could very well be **on** the boundary as they should. " diff --git a/Tutorial/GSS.ipynb b/Tutorial/GSS.ipynb index 28a407ca..8e318e19 100644 --- a/Tutorial/GSS.ipynb +++ b/Tutorial/GSS.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2e1b4e41", + "id": "aafbdc87", "metadata": {}, "source": [ "# Earth Simulations" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "5b4076fb", + "id": "a37f5404", "metadata": {}, "source": [ "This Notebook presents a global storm surge run by pyposeidon. \n", @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2570a9fb", + "id": "1de2592a", "metadata": {}, "outputs": [], "source": [ @@ -38,7 +38,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf21b6a2", + "id": "01dd047f", "metadata": {}, "outputs": [], "source": [ @@ -50,7 +50,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3addc357", + "id": "02c8bb97", "metadata": {}, "outputs": [], "source": [ @@ -60,7 +60,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0fa22a86", + "id": "abedb055", "metadata": {}, "outputs": [], "source": [ @@ -70,7 +70,20 @@ { "cell_type": "code", "execution_count": null, - "id": "f4a00a40", + "id": "4c5e541b", + "metadata": {}, + "outputs": [], + "source": [ + "#Create a folder to save the output\n", + "import os\n", + "if not os.path.exists('test'):\n", + " os.makedirs('test')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0962ae8", "metadata": {}, "outputs": [], "source": [ @@ -82,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "ba82111b", + "id": "c3a19855", "metadata": {}, "source": [ "## Setting up and Executing a global model" @@ -91,7 +104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2f6e57e2", + "id": "261e4a6f", "metadata": {}, "outputs": [], "source": [ @@ -111,7 +124,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b8bb0f60", + "id": "44a9b6d9", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "22ad3e55", + "id": "9dc6750d", "metadata": {}, "outputs": [], "source": [ @@ -131,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a3e044c", + "id": "84ff3ed1", "metadata": {}, "outputs": [], "source": [ @@ -141,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "52c1a1c2", + "id": "95d5a941", "metadata": {}, "outputs": [], "source": [ @@ -151,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "6ff10112", + "id": "ce78ab92", "metadata": {}, "source": [ "## Visualisations" @@ -160,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6f63ce2f", + "id": "c3e65179", "metadata": {}, "outputs": [], "source": [ @@ -171,7 +184,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c31124d1", + "id": "d9d0463c", "metadata": {}, "outputs": [], "source": [ diff --git a/binder/apt.txt b/binder/apt.txt index f359f073..8052af36 100644 --- a/binder/apt.txt +++ b/binder/apt.txt @@ -1 +1,2 @@ libgl1-mesa-glx +xvfb diff --git a/binder/environment.yml b/binder/environment.yml index b1db471c..8e5cd475 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -12,11 +12,12 @@ dependencies: - xorg-libxcursor - xorg-libxft - xorg-libxinerama + - xorg-libxcb - fltk - nodejs - ipympl - pyviz_comms - - pip - - pip: - - gmsh - - "--editable=git+https://github.com/pydap/pydap.git@3f6aa190c59e3bbc6c834377a61579b20275ff69#egg=Pydap" + - jupyterlab<3 + - ipyevents=0.9.0 + - xvfbwrapper + - geoviews=1.9.3 diff --git a/binder/postBuild b/binder/postBuild index 07954794..ce42135e 100644 --- a/binder/postBuild +++ b/binder/postBuild @@ -2,6 +2,10 @@ # Install a JupyterLab extension for demonstration purposes +jupyter labextension install @jupyter-widgets/jupyterlab-manager jupyter-matplotlib jupyterlab-datawidgets itkwidgets ipyevents + +# Download data + cd Tutorial curl -L url https://www.dropbox.com/sh/nd2b012wrpt6qnq/AAAD7aA_qXztUhlT39YK2yBua?dl=1 > data.zip @@ -10,8 +14,8 @@ unzip data.zip -d data/ rm data.zip -wget https://github.com/SciTools/cartopy/raw/master/tools/feature_download.py -python feature_download.py physical -python feature_download.py cultural +wget https://raw.githubusercontent.com/SciTools/cartopy/main/tools/cartopy_feature_download.py +python cartopy_feature_download.py physical +python cartopy_feature_download.py cultural -rm feature_download.py +rm cartopy_feature_download.py diff --git a/binder/start b/binder/start new file mode 100644 index 00000000..535ae17c --- /dev/null +++ b/binder/start @@ -0,0 +1,11 @@ +#!/bin/bash +set -x +export DISPLAY=:99.0 +export PYVISTA_OFF_SCREEN=true +export PYVISTA_USE_IPYVTK=true +export XDG_RUNTIME_DIR=/home/jovyan +which Xvfb +Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & +sleep 3 +set +x +exec "$@" diff --git a/setup.py b/setup.py index 787ee423..75f95ff7 100755 --- a/setup.py +++ b/setup.py @@ -38,7 +38,6 @@ def readme(): "Topic :: Scientific/Engineering :: Atmospheric Science", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", ] @@ -54,7 +53,7 @@ def readme(): SETUP_REQUIRES = "" -TESTS_REQUIRE = ["pytest >= 3.6"] +TESTS_REQUIRE = ["pytest >= 3.8"] URL = ""