From 3b95be228a3d02cfe8e0245ee4f77de6c469153a Mon Sep 17 00:00:00 2001 From: giancastro Date: Mon, 26 Apr 2021 11:36:08 -0300 Subject: [PATCH 1/4] add sphinx --- docs/Makefile | 23 +++++ docs/make.bat | 39 ++++++++ docs/source/.gitignore | 1 + docs/source/_static/css/styles.css | 96 +++++++++++++++++++ docs/source/_static/img/favicon.ico | Bin 0 -> 15406 bytes docs/source/_static/img/logo.png | Bin 0 -> 56267 bytes docs/source/_static/img/logo.svg | 1 + docs/source/_templates/docs-navbar.html | 56 +++++++++++ docs/source/conf.py | 89 +++++++++++++++++ docs/source/getting_started/index.rst | 11 +++ docs/source/getting_started/installation.rst | 22 +++++ docs/source/getting_started/usage.rst | 88 +++++++++++++++++ docs/source/index.rst | 15 +++ docs/source/reference/core.rst | 25 +++++ docs/source/reference/index.rst | 15 +++ docs/source/reference/io.rst | 13 +++ docs/source/reference/mercator.rst | 12 +++ docs/source/reference/sources.rst | 21 ++++ docs/source/reference/transforms.rst | 27 ++++++ docs/source/releases.json | 3 + docs/source/requirements.txt | 3 + 21 files changed, 560 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/.gitignore create mode 100644 docs/source/_static/css/styles.css create mode 100644 docs/source/_static/img/favicon.ico create mode 100644 docs/source/_static/img/logo.png create mode 100644 docs/source/_static/img/logo.svg create mode 100644 docs/source/_templates/docs-navbar.html create mode 100644 docs/source/conf.py create mode 100644 docs/source/getting_started/index.rst create mode 100644 docs/source/getting_started/installation.rst create mode 100644 docs/source/getting_started/usage.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/reference/core.rst create mode 100644 docs/source/reference/index.rst create mode 100644 docs/source/reference/io.rst create mode 100644 docs/source/reference/mercator.rst create mode 100644 docs/source/reference/sources.rst create mode 100644 docs/source/reference/transforms.rst create mode 100644 docs/source/releases.json create mode 100644 docs/source/requirements.txt diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..a3b7e3b --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,23 @@ +# Makefile for Sphinx documentation + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -m sphinx +SOURCEDIR = source +BUILDDIR = build + +.PHONY: help clean html + +help: + @echo "Please use 'make ' where is one of" + @echo " clean to clear all built documentation files" + @echo " html to make all standalone HTML files" + +clean: + -rm -rf $(BUILDDIR)/* + +html: clean + #sphinx-multiversion $(SOURCEDIR) $(BUILDDIR)/html + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..92fc0cc --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,39 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. clean to clear all built documentation files + echo. html to make all standalone HTML files + + goto end +) + +if "%1" == "clean" ( + rmdir %BUILDDIR% /s /q + goto end +) + +if "%1" == "html" ( + sphinx-multiversion %SOURCEDIR% %BUILDDIR%\html + %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +:end diff --git a/docs/source/.gitignore b/docs/source/.gitignore new file mode 100644 index 0000000..9400b55 --- /dev/null +++ b/docs/source/.gitignore @@ -0,0 +1 @@ +_autosummary/ \ No newline at end of file diff --git a/docs/source/_static/css/styles.css b/docs/source/_static/css/styles.css new file mode 100644 index 0000000..f8a5315 --- /dev/null +++ b/docs/source/_static/css/styles.css @@ -0,0 +1,96 @@ +/* +Logo +==== +*/ + +.logo { + max-height: 200px; +} + +/* +Header +====== +*/ + +#navbar-main { + background-color: #F1F1F1!important; + border-bottom: 3px solid #16255F; + height: 70px; +} + +.navbar-brand { + padding: 0.25rem; +} + + +/* +Body +==== +*/ + +body { + background-color: #FAFAFA!important; + color: #353D46!important; +} + + +/* +Left side bar +============= +*/ + +.form-control { + background-color: #FAFAFA!important; +} + +[type=search] { + background-color: #FAFAFA; +} + + +/* +Headings +======== +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #062161!important; +} + +/* +Releases dropdown +======== +*/ + +li.dropdown { + margin-right: auto; +} + +.dropdown { + list-style: none; +} + +.dropdown > a:hover { + COLOR: #00194f; + TEXT-DECORATION: none; + font-weight: none; +} + +div.rst-versions { + overflow: hidden!important; +} + +.deprecated-warning { + font-family: sans-serif; + font-weight:bold; + text-align: center; + background-color: pink; + color: firebrick; + right:0em; + z-index:1000000000000; +} \ No newline at end of file diff --git a/docs/source/_static/img/favicon.ico b/docs/source/_static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..27c91a3fd51643394fc071875b027c5df680fab2 GIT binary patch literal 15406 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 Ue|9~6K6&>O349`f<&nVu0l;1EZvX%Q literal 0 HcmV?d00001 diff --git a/docs/source/_static/img/logo.png b/docs/source/_static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba5296a793efd704ac6f8288e1131c788544f03 GIT binary patch literal 56267 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%0AWhqs_t1mUQEBp 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/img/logo.svg b/docs/source/_static/img/logo.svg new file mode 100644 index 0000000..68359a2 --- /dev/null +++ b/docs/source/_static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/_templates/docs-navbar.html b/docs/source/_templates/docs-navbar.html new file mode 100644 index 0000000..34801e4 --- /dev/null +++ b/docs/source/_templates/docs-navbar.html @@ -0,0 +1,56 @@ +
+ + + {% if logo %} + {% if not theme_logo_link %} + + + + {% elif theme_logo_link[:4] == 'http' %} + + + + {% else %} + + + + {% endif %} + {% else %} + +

{{ project }}

+
+ {% endif %} + + + + {% set navbar_class, navbar_align = navbar_align_class() %} + +
\ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..f73cada --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,89 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import json +import sys +sys.path.insert(0, os.path.abspath('../..')) + + +# -- Project information ----------------------------------------------------- + +project = 'mapshader' +copyright = '2021, makepath' +author = 'makepath' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'sphinx.ext.autosummary', + 'sphinx_multiversion', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'pydata_sphinx_theme' + +html_logo = '_static/img/logo.svg' + +html_favicon = '_static/img/favicon.ico' + +# sphinx-multiversion config +smv_branch_whitelist = 'master' + +smv_tag_whitelist = r'^v([0-9]\.[1]\.[3-9]|[1-9]\.[0-9]\.[0-9])' + +# Load releases +with open('releases.json') as f: + releases = json.load(f) + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + 'external_links': [], + 'github_url': 'https://github.com/makepath/mapshader', +} + +html_context = { + 'css_files': ['_static/css/styles.css'], + 'releases': [(release, url) for release, url in releases.items()], +} + +autosummary_generate = True + +exclude_patterns = ['_build', '_templates'] + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/docs/source/getting_started/index.rst b/docs/source/getting_started/index.rst new file mode 100644 index 0000000..15cddc5 --- /dev/null +++ b/docs/source/getting_started/index.rst @@ -0,0 +1,11 @@ +.. _getting_started: + +*************** +Getting started +*************** + +.. toctree:: + :maxdepth: 2 + + installation + usage \ No newline at end of file diff --git a/docs/source/getting_started/installation.rst b/docs/source/getting_started/installation.rst new file mode 100644 index 0000000..ab95a88 --- /dev/null +++ b/docs/source/getting_started/installation.rst @@ -0,0 +1,22 @@ +.. _getting_started.installation: + +************ +Installation +************ + +.. code-block:: bash + + # via pip + pip install mapshader + + +Setup Mapshader Conda Environment +================================= + +.. code-block:: bash + + conda create -n mapshader python=3.8 + conda activate mapshader + git clone git@github.com:makepath/mapshader.git + cd mapshader + pip install -e . diff --git a/docs/source/getting_started/usage.rst b/docs/source/getting_started/usage.rst new file mode 100644 index 0000000..f1ffd4b --- /dev/null +++ b/docs/source/getting_started/usage.rst @@ -0,0 +1,88 @@ +.. _getting_started.usage: + +***** +Usage +***** + +Run Tests +========= + +.. code-block:: bash + + conda activate mapshader + pytest mapshader/tests -sv + + +Run Flask Server +================ + +.. code-block:: bash + + conda activate mapshader + python mapshader/flask_app.py + + >>> * Serving Flask app "flask_app" (lazy loading) + >>> * Environment: production + >>> WARNING: This is a development server. Do not use it in a production deployment. + >>> Use a production WSGI server instead. + >>> * Debug mode: on + >>> * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) + >>> * Restarting with stat + + +Mapshader Config (YAML) +======================= + +While mapshader comes with default services to help with testing, users can create their own services via YAML. + +*my_services.yaml* + +.. code-block:: yaml + + --- + + metadata: + version: 1 + + sources: + - name: Elevation + key: elevation-user + text: Elevation + description: Global elevation + geometry_type: raster + shade_how: linear + span: min/max + raster_interpolate: linear + xfield: geometry + yfield: geometry + filepath: ~/mapshader/mapshader/tests/fixtures/elevation.tif + transforms: + - name: squeeze + args: + dim: band + - name: cast + args: + dtype: float64 + - name: orient_array + - name: flip_coords + args: + dim: y + - name: reproject_raster + args: + epsg: 3857 + + +This configuration file can then be passed to the flask server upon startup: + +.. code-block:: bash + + conda activate mapshader + python mapshader/flask_app.py -f my_services.yaml + + >>> * Serving Flask app "flask_app" (lazy loading) + >>> * Environment: production + >>> WARNING: This is a development server. Do not use it in a production deployment. + >>> Use a production WSGI server instead. + >>> * Debug mode: on + >>> * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) + >>> * Restarting with stat \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..63a40d4 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,15 @@ +.. _index: + +*********************** +mapshader documentation +*********************** + +Simple Python GIS Web Services. + +.. toctree:: + :maxdepth: 1 + :hidden: + :titlesonly: + + getting_started/index + reference/index \ No newline at end of file diff --git a/docs/source/reference/core.rst b/docs/source/reference/core.rst new file mode 100644 index 0000000..f323b32 --- /dev/null +++ b/docs/source/reference/core.rst @@ -0,0 +1,25 @@ +.. _core: + +**** +Core +**** + +Canvas +====== +.. autosummary:: + :toctree: _autosummary + + mapshader.core.create_agg + mapshader.core.point_aggregation + mapshader.core.line_aggregation + mapshader.core.polygon_aggregation + mapshader.core.raster_aggregation + mapshader.core.apply_additional_transforms + mapshader.core.shade_discrete + mapshader.core.shade_agg + mapshader.core.to_raster + mapshader.core.render_map + mapshader.core.get_geojson + mapshader.core.get_legend + mapshader.core.render_geojson + mapshader.core.render_legend diff --git a/docs/source/reference/index.rst b/docs/source/reference/index.rst new file mode 100644 index 0000000..d85f9cb --- /dev/null +++ b/docs/source/reference/index.rst @@ -0,0 +1,15 @@ +.. _reference: + +********* +Reference +********* + +.. toctree:: + :maxdepth: 2 + + core + io + mercator + sources + transforms + \ No newline at end of file diff --git a/docs/source/reference/io.rst b/docs/source/reference/io.rst new file mode 100644 index 0000000..93992e4 --- /dev/null +++ b/docs/source/reference/io.rst @@ -0,0 +1,13 @@ +.. _io: + +** +IO +** + +IO +== +.. autosummary:: + :toctree: _autosummary + + mapshader.io.load_raster + mapshader.io.load_vector diff --git a/docs/source/reference/mercator.rst b/docs/source/reference/mercator.rst new file mode 100644 index 0000000..09a91d9 --- /dev/null +++ b/docs/source/reference/mercator.rst @@ -0,0 +1,12 @@ +.. _mercator: + +******** +Mercator +******** + +Mercator +======== +.. autosummary:: + :toctree: _autosummary + + mapshader.mercator.MercatorTileDefinition diff --git a/docs/source/reference/sources.rst b/docs/source/reference/sources.rst new file mode 100644 index 0000000..e9eb67f --- /dev/null +++ b/docs/source/reference/sources.rst @@ -0,0 +1,21 @@ +.. _sources: + +******* +Sources +******* + +Sources +======= +.. autosummary:: + :toctree: _autosummary + + mapshader.sources.MapSource + mapshader.sources.RasterSource + mapshader.sources.VectorSource + mapshader.sources.MapService + mapshader.sources.TileService + mapshader.sources.ImageService + mapshader.sources.WMSService + mapshader.sources.GeoJSONService + mapshader.sources.parse_sources + mapshader.sources.get_services diff --git a/docs/source/reference/transforms.rst b/docs/source/reference/transforms.rst new file mode 100644 index 0000000..3d6d848 --- /dev/null +++ b/docs/source/reference/transforms.rst @@ -0,0 +1,27 @@ +.. _transforms: + +********** +Transforms +********** + +Transforms +========== +.. autosummary:: + :toctree: _autosummary + + mapshader.transforms.reproject_raster + mapshader.transforms.reproject_vector + mapshader.transforms.flip_coords + mapshader.transforms.to_spatialpandas + mapshader.transforms.squeeze + mapshader.transforms.cast + mapshader.transforms.orient_array + mapshader.transforms.get_data_array_extent + mapshader.transforms.canvas_like + mapshader.transforms.build_vector_overviews + mapshader.transforms.build_raster_overviews + mapshader.transforms.add_xy_fields + mapshader.transforms.select_by_attributes + mapshader.transforms.polygon_to_line + mapshader.transforms.raster_to_categorical_points + mapshader.transforms.get_transform_by_name \ No newline at end of file diff --git a/docs/source/releases.json b/docs/source/releases.json new file mode 100644 index 0000000..915ab62 --- /dev/null +++ b/docs/source/releases.json @@ -0,0 +1,3 @@ +{ + "latest": "https://mapshader.org/index.html" +} \ No newline at end of file diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt new file mode 100644 index 0000000..7f220cc --- /dev/null +++ b/docs/source/requirements.txt @@ -0,0 +1,3 @@ +pydata_sphinx_theme +sphinx +sphinx-multiversion \ No newline at end of file From c5c372cf93893971241f2f7252926957415d6ed0 Mon Sep 17 00:00:00 2001 From: giancastro Date: Wed, 5 May 2021 16:33:36 -0300 Subject: [PATCH 2/4] handle big function params --- docs/source/conf.py | 1 + docs/sphinxext/__init__.py | 0 docs/sphinxext/autodoc_process_signature.py | 62 +++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 docs/sphinxext/__init__.py create mode 100644 docs/sphinxext/autodoc_process_signature.py diff --git a/docs/source/conf.py b/docs/source/conf.py index f73cada..641ba47 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -34,6 +34,7 @@ 'sphinx.ext.viewcode', 'sphinx.ext.autosummary', 'sphinx_multiversion', + 'docs.sphinxext.autodoc_process_signature', ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/sphinxext/__init__.py b/docs/sphinxext/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/docs/sphinxext/autodoc_process_signature.py b/docs/sphinxext/autodoc_process_signature.py new file mode 100644 index 0000000..6fd72c5 --- /dev/null +++ b/docs/sphinxext/autodoc_process_signature.py @@ -0,0 +1,62 @@ +import re + + +TREATMENTS = { + re.compile(r'(?<=cmap=)(\[.*\])'): 'mapshader.colors.colors', +} + + +def parameter_treatment(app, objtype, name, obj, options, args, retann): + ''' + Treat the object signature, replacing the regex matching with a new + text. + + Parameters + ---------- + app : sphinx.application.Sphinx + The Sphinx application object. + objtype : str + The type of the object which the docstring belongs to (one of + ``"module"``, ``"class"``, ``"exception"``, ``"function"``, + ``"method"``, ``"attribute"``). + name : str + The fully qualified name of the object. + obj : any + The object itself. + options : dict + The options given to the directive: an object with attributes + ``inherited_members``, ``undoc_members``, ``show_inheritance`` + and ``noindex`` that are true if the flag option of same name + was given to the auto directive. + args : str + The object signature, as a string of the form + ``"(parameter_1, parameter_2)"``, or ``None`` if introspection + didn't succeed and signature wasn't specified in the directive. + retann : str + The function return annotation as a string of the form + ``" -> annotation"``, or ``None`` if there is no return annotation. + + Returns + ------- + args : str + The treated object signature. + retann : str + The input function return annotation. + + References + ---------- + - sphinx: https://github.com/sphinx-doc/sphinx/blob/b237e78f9c233170f271c326bf46b7fb3b103858/doc/usage/extensions/autodoc.rst # noqa + ''' + if objtype not in ('function', 'method', 'class'): + return + + if args is None: + return + + for regex, new_text in TREATMENTS.items(): + args = regex.sub(new_text, args) + + return args, retann + +def setup(app): + app.connect('autodoc-process-signature', parameter_treatment) From c911f3add9e975eacf85add0c282a2a0a2cdf004 Mon Sep 17 00:00:00 2001 From: giancastro Date: Fri, 14 May 2021 09:59:13 -0300 Subject: [PATCH 3/4] mock map colors import on sphinx --- docs/source/conf.py | 4 +- docs/sphinxext/__init__.py | 0 docs/sphinxext/autodoc_process_signature.py | 62 --------------------- 3 files changed, 3 insertions(+), 63 deletions(-) delete mode 100644 docs/sphinxext/__init__.py delete mode 100644 docs/sphinxext/autodoc_process_signature.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 641ba47..4fdc072 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -34,7 +34,6 @@ 'sphinx.ext.viewcode', 'sphinx.ext.autosummary', 'sphinx_multiversion', - 'docs.sphinxext.autodoc_process_signature', ] # Add any paths that contain templates here, relative to this directory. @@ -88,3 +87,6 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] + +# autodoc config +autodoc_mock_imports = ['mapshader.colors'] diff --git a/docs/sphinxext/__init__.py b/docs/sphinxext/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/docs/sphinxext/autodoc_process_signature.py b/docs/sphinxext/autodoc_process_signature.py deleted file mode 100644 index 6fd72c5..0000000 --- a/docs/sphinxext/autodoc_process_signature.py +++ /dev/null @@ -1,62 +0,0 @@ -import re - - -TREATMENTS = { - re.compile(r'(?<=cmap=)(\[.*\])'): 'mapshader.colors.colors', -} - - -def parameter_treatment(app, objtype, name, obj, options, args, retann): - ''' - Treat the object signature, replacing the regex matching with a new - text. - - Parameters - ---------- - app : sphinx.application.Sphinx - The Sphinx application object. - objtype : str - The type of the object which the docstring belongs to (one of - ``"module"``, ``"class"``, ``"exception"``, ``"function"``, - ``"method"``, ``"attribute"``). - name : str - The fully qualified name of the object. - obj : any - The object itself. - options : dict - The options given to the directive: an object with attributes - ``inherited_members``, ``undoc_members``, ``show_inheritance`` - and ``noindex`` that are true if the flag option of same name - was given to the auto directive. - args : str - The object signature, as a string of the form - ``"(parameter_1, parameter_2)"``, or ``None`` if introspection - didn't succeed and signature wasn't specified in the directive. - retann : str - The function return annotation as a string of the form - ``" -> annotation"``, or ``None`` if there is no return annotation. - - Returns - ------- - args : str - The treated object signature. - retann : str - The input function return annotation. - - References - ---------- - - sphinx: https://github.com/sphinx-doc/sphinx/blob/b237e78f9c233170f271c326bf46b7fb3b103858/doc/usage/extensions/autodoc.rst # noqa - ''' - if objtype not in ('function', 'method', 'class'): - return - - if args is None: - return - - for regex, new_text in TREATMENTS.items(): - args = regex.sub(new_text, args) - - return args, retann - -def setup(app): - app.connect('autodoc-process-signature', parameter_treatment) From 6a1e88897f01901371a2e2cc12fe8b365f8e6ce6 Mon Sep 17 00:00:00 2001 From: giancastro Date: Fri, 11 Jun 2021 14:55:42 -0300 Subject: [PATCH 4/4] update --- docs/Makefile | 2 +- docs/source/reference/core.rst | 4 +--- docs/source/reference/index.rst | 1 + docs/source/reference/io.rst | 2 -- docs/source/reference/mercator.rst | 2 -- docs/source/reference/services.rst | 16 ++++++++++++++++ docs/source/reference/sources.rst | 9 --------- docs/source/reference/transforms.rst | 2 -- docs/source/releases.json | 3 ++- 9 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 docs/source/reference/services.rst diff --git a/docs/Makefile b/docs/Makefile index a3b7e3b..acd69fc 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -17,7 +17,7 @@ clean: -rm -rf $(BUILDDIR)/* html: clean - #sphinx-multiversion $(SOURCEDIR) $(BUILDDIR)/html + sphinx-multiversion $(SOURCEDIR) $(BUILDDIR)/html @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." diff --git a/docs/source/reference/core.rst b/docs/source/reference/core.rst index f323b32..ac818fb 100644 --- a/docs/source/reference/core.rst +++ b/docs/source/reference/core.rst @@ -4,8 +4,6 @@ Core **** -Canvas -====== .. autosummary:: :toctree: _autosummary @@ -19,7 +17,7 @@ Canvas mapshader.core.shade_agg mapshader.core.to_raster mapshader.core.render_map - mapshader.core.get_geojson + mapshader.core.get_source_data mapshader.core.get_legend mapshader.core.render_geojson mapshader.core.render_legend diff --git a/docs/source/reference/index.rst b/docs/source/reference/index.rst index d85f9cb..336c11c 100644 --- a/docs/source/reference/index.rst +++ b/docs/source/reference/index.rst @@ -10,6 +10,7 @@ Reference core io mercator + services sources transforms \ No newline at end of file diff --git a/docs/source/reference/io.rst b/docs/source/reference/io.rst index 93992e4..53bd910 100644 --- a/docs/source/reference/io.rst +++ b/docs/source/reference/io.rst @@ -4,8 +4,6 @@ IO ** -IO -== .. autosummary:: :toctree: _autosummary diff --git a/docs/source/reference/mercator.rst b/docs/source/reference/mercator.rst index 09a91d9..af9bdb3 100644 --- a/docs/source/reference/mercator.rst +++ b/docs/source/reference/mercator.rst @@ -4,8 +4,6 @@ Mercator ******** -Mercator -======== .. autosummary:: :toctree: _autosummary diff --git a/docs/source/reference/services.rst b/docs/source/reference/services.rst new file mode 100644 index 0000000..868d224 --- /dev/null +++ b/docs/source/reference/services.rst @@ -0,0 +1,16 @@ +.. _services: + +******** +Services +******** + +.. autosummary:: + :toctree: _autosummary + + mapshader.services.MapService + mapshader.services.TileService + mapshader.services.ImageService + mapshader.services.WMSService + mapshader.services.GeoJSONService + mapshader.services.parse_sources + mapshader.services.get_services diff --git a/docs/source/reference/sources.rst b/docs/source/reference/sources.rst index e9eb67f..e3757a7 100644 --- a/docs/source/reference/sources.rst +++ b/docs/source/reference/sources.rst @@ -4,18 +4,9 @@ Sources ******* -Sources -======= .. autosummary:: :toctree: _autosummary mapshader.sources.MapSource mapshader.sources.RasterSource mapshader.sources.VectorSource - mapshader.sources.MapService - mapshader.sources.TileService - mapshader.sources.ImageService - mapshader.sources.WMSService - mapshader.sources.GeoJSONService - mapshader.sources.parse_sources - mapshader.sources.get_services diff --git a/docs/source/reference/transforms.rst b/docs/source/reference/transforms.rst index 3d6d848..b3c55ed 100644 --- a/docs/source/reference/transforms.rst +++ b/docs/source/reference/transforms.rst @@ -4,8 +4,6 @@ Transforms ********** -Transforms -========== .. autosummary:: :toctree: _autosummary diff --git a/docs/source/releases.json b/docs/source/releases.json index 915ab62..48a1989 100644 --- a/docs/source/releases.json +++ b/docs/source/releases.json @@ -1,3 +1,4 @@ { - "latest": "https://mapshader.org/index.html" + "latest": "https://mapshader.org/index.html", + "0.1.0": "https://mapshader.org/v0.1.0/index.html" } \ No newline at end of file