commit 8ead11ce9f640acceadfec77451800bd498b02a2 Author: Peter Williams Date: Mon Dec 2 15:05:57 2019 -0500 Stub a new empty project Deriving from the `toasty` file structure. diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..436e57c --- /dev/null +++ b/.coveragerc @@ -0,0 +1,7 @@ +[report] + +omit = wwt_data_formats/*tests/* +exclude_lines = + pragma: no cover + if __name__ == .__main__.: + raise NotImplementedError diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..cf27a37 --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1 @@ +service_name: travis-pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ae5115 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.py[cod] +*.egg +*.egg-info +/dist/ +/build/ +/eggs/ +/sdist/ +__pycache__/ diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..db03a79 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,15 @@ +version: 2 + +build: + image: latest + +python: + version: 3.7 + install: + - method: pip + path: . + extra_requirements: + - docs + +# Don't build any extra formats +formats: [] diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1496692 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,40 @@ +language: c + +os: + - linux + - osx + +sudo: false + +# Don't CI branches besides master. PR's still get built -- this just prevents +# PR branches from being built twice in the standard workflow. +branches: + only: + - master + +notifications: + email: false + +env: + global: + - CONDA_CHANNELS="conda-forge" + - CONDA_DEPENDENCIES="astropy coveralls numpydoc pytest-cov sphinx sphinx-automodapi" + - PIP_DEPENDENCIES="astropy-sphinx-theme" + matrix: + - PYTHON_VERSION=2.7 + - PYTHON_VERSION=3.6 + - PYTHON_VERSION=3.7 + +install: + - git clone git://github.com/astropy/ci-helpers.git + - source ci-helpers/travis/setup_conda.sh + +script: + - python setup.py sdist + - cd dist && pip install *.tar.gz --verbose && cd .. + - python setup.py build_ext --inplace + - py.test --cov wwt_data_formats wwt_data_formats + - make -C docs html linkcheck + +after_success: + - coveralls diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..5172a96 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,3 @@ +# 0.0.1.dev0 (unreleased) + +- First version diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..247829d --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 the AAS WorldWide Telescope project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..a04781a --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,13 @@ +include LICENSE +include .coveragerc +include *.md +include *.yml + +graft docs +prune docs/_build + +global-exclude *~ +global-exclude *.pyc +global-exclude *.pyo +global-exclude .git +global-exclude .ipynb_checkpoints diff --git a/README.md b/README.md new file mode 100644 index 0000000..f2a05b3 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# WWT Data Formats + + [wwt_data_formats] is a low-level Python package that +interfaces with the various XML serialization formats used by the [AAS] +[WorldWide Telescope]. + +[wwt_data_formats]: https://wwt-data-formats.readthedocs.io/ +[AAS]: https://aas.org/ +[WorldWide Telescope]: http://www.worldwidetelescope.org/ + + + +## Installation + +The easiest way to install [wwt_data_formats] is through [pip]: + +``` +pip install wwt_data_formats +``` + +[pip]: https://pip.pypa.io/ + + +## Documentation, Examples, etc. + +For documentation and examples, go to: + +https://wwt-data-formats.readthedocs.io/ + + +## Contributions + +Contributions to [wwt_data_formats] are welcome! See +[the WorldWide Telescope contributors’ guide] for applicable information. We +use a standard workflow with issues and pull requests. All participants in +[wwt_data_formats] and the WWT communities must abide by the +[WWT Code of Conduct]. + +[the WorldWide Telescope contributors’ guide]: https://worldwidetelescope.github.io/contributing/ +[WWT Code of Conduct]: https://worldwidetelescope.github.io/code-of-conduct/ + + +## Release History + +Releases of [wwt_data_formats] are logged in the file [CHANGES.md](./CHANGES.md), as +well as release listings maintained by +[GitHub](https://github.com/WorldWideTelescope/wwt_data_formats/releases) and +[PyPI](https://pypi.org/project/wwt_data_formats/#history). + + +## Dependencies + +[wwt_data_formats] is a Python package so, yes, Python is required. + +- [astropy] is not a required dependency, but can be used +- [pytest] to run the test suite + +[astropy]: https://www.astropy.org/ +[pytest]: https://docs.pytest.org/ + + +## Legalities + +[wwt_data_formats] is copyright the AAS WorldWide Telescope Team. It is +licensed under the [MIT License](./LICENSE). + + +## Acknowledgments + +[wwt_data_formats] is part of the AAS WorldWide Telescope system, a [.NET Foundation] +project managed by the non-profit [American Astronomical Society] (AAS). Work +on WWT has been supported by the AAS, the US [National Science Foundation] +(grants [1550701] and [1642446]), the [Gordon and Betty Moore Foundation], and +[Microsoft]. + +[.NET Foundation]: https://dotnetfoundation.org/ +[American Astronomical Society]: https://aas.org/ +[National Science Foundation]: https://www.nsf.gov/ +[1550701]: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1550701 +[1642446]: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1642446 +[Gordon and Betty Moore Foundation]: https://www.moore.org/ +[Microsoft]: https://www.microsoft.com/ diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md new file mode 100644 index 0000000..706debb --- /dev/null +++ b/RELEASE_PROCESS.md @@ -0,0 +1,30 @@ +# The wwt_data_formats release process + +These are notes for the `wwt_data_formats` developers about how to create a new release. + +1. Create a branch intended to become the next release. +2. Finish features, test functionality, etc. +3. `python setup.py sdist` and verify contents. +4. Make sure that `CHANGES.md` is up-to-date. +5. For the final commit, update the version number in `setup.py` and + `docs/conf.py`, and add a proper version and date to `CHANGES.md`. Commit + with message `Release version ${version}`. +6. Push to GitHub and create a pull request for the new release called + "Release PR for version $version". +7. Get it so that it passes CI, creating fixup commits as necessary. +8. When it's really really ready, `git clean -fxd && python setup.py sdist && + twine upload dist/*.tar.gz`. If `twine` finds problems, make any final + changes and retry. +9. If needed, do a `git rebase -i` to make the version-bump commit the last + one again. +10. `git tag v${version}` +11. Update the version number to `${cur_major}.${next_minor}.0.dev0` and add a + new separator in `CHANGES.md` along the lines of `${version} (unreleased)`. + Commit with a message of `Back to development.` +12. `git push` (with `-f` if history was rewritten) to the PR branch. This had + *really* better still pass CI. +13. Merge into `master`. +14. Pull the merged `master` locally. +15. `git push --tags` +16. Create a new release on GitHub and copy the latest contents of + `CHANGES.md` into the description. diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..ba65b13 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +/_build/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..47099f0 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = -W +SPHINXBUILD = python -msphinx +SPHINXPROJ = wwt_data_formats +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/copybutton.js b/docs/_static/copybutton.js new file mode 100644 index 0000000..fb312df --- /dev/null +++ b/docs/_static/copybutton.js @@ -0,0 +1,92 @@ +// Copyright (c) 2014-2018, Astropy Developers +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, this +// list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// * Neither the name of the Astropy Team nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-default .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': '1px', 'color': border_color, 'font-size': '11px', + 'color': '#aaaaaa', + 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('Hide prompt'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + // button.css('text-decoration', 'line-through'); + button.text('Show prompt'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + // button.css('text-decoration', 'none'); + button.text('Hide prompt'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000..d9f351c --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,24 @@ +{% extends "!layout.html" %} +{%- block extrahead %} +{% if not embedded %} + + +{% endif %} +{% endblock %} + +{# astropy hardcodes a link to astropy.org in the header bar, which we don't want #} +{# It also hardcodes an Astropy logo in the `a.brand` element that we remove #} +{% block header %} +
+ {{ theme_logotext1 }}{{ theme_logotext2 }}{{ theme_logotext3 }} +
    +
  • Index
  • +
  • Modules
  • +
  • + {% block sidebarsearch %} + {% include "searchbox.html" %} + {% endblock %} +
  • +
+
+{% endblock %} diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 0000000..54573cf --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,6 @@ +API Documentation +================= + +.. automodapi:: wwt_data_formats + :no-inheritance-diagram: + :no-inherited-members: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..32d0426 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +project = 'wwt_data_formats' +author = 'The AAS WorldWide Telescope Team' +copyright = '2019, ' + author + +release = '0.0.1.dev0' # the full version string; also update ../setup.py +version = '0.0.1.dev0' # the "short" version + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.intersphinx', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinx_automodapi.automodapi', + 'sphinx_automodapi.smart_resolver', + 'numpydoc', +] + +templates_path = ['_templates'] +source_suffix = '.rst' +master_doc = 'index' +language = None +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +pygments_style = 'sphinx' +todo_include_todos = False + +html_theme = 'bootstrap-astropy' +html_theme_options = { + 'logotext1': 'wwt_data_formats', + 'logotext2': '', + 'logotext3': ':docs', + 'astropy_project_menubar': False, +} +html_static_path = ['_static'] +htmlhelp_basename = 'wwtdataformatsdoc' + +intersphinx_mapping = { + 'python': ( + 'https://docs.python.org/3/', + (None, 'http://data.astropy.org/intersphinx/python3.inv') + ), + + 'numpy': ( + 'https://docs.scipy.org/doc/numpy/', + (None, 'http://data.astropy.org/intersphinx/numpy.inv') + ), + + 'astropy': ( + 'http://docs.astropy.org/en/stable/', + None + ), +} + +numpydoc_show_class_members = False + +nitpicky = True +nitpick_ignore = [('py:class', 'ipywidgets.widgets.domwidget.DOMWidget')] + +default_role = 'obj' + +html_logo = 'images/logo.png' + +linkcheck_retries = 5 +linkcheck_timeout = 10 diff --git a/docs/images/logo.png b/docs/images/logo.png new file mode 100644 index 0000000..c6e198e Binary files /dev/null and b/docs/images/logo.png differ diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..1716ec3 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,46 @@ +============================================================================= +wwt_data_formats: low-level interface to AAS WorldWide Telescope data formats +============================================================================= + +`wwt_data_formats`_ is a low-level Python package that interfaces with the +various XML serialization formats used by the AAS_ `WorldWide Telescope`_. + +.. _wwt_data_formats: https://wwt-data-formats.readthedocs.io/ +.. _AAS: https://aas.org/ +.. _WorldWide Telescope: http://www.worldwidetelescope.org/home + + +User guide +========== + +.. toctree:: + :maxdepth: 1 + + installation + api + + +Getting help +============ + +If you run into any issues when using `wwt_data_formats`_, please open an +issue `on its GitHub repository +`_. + + +Acknowledgments +=============== + +`wwt_data_formats`_ is part of the `AAS`_ `WorldWide Telescope`_ system, a +`.NET Foundation`_ project managed by the non-profit `American Astronomical +Society`_ (AAS). Work on WWT has been supported by the AAS, the US `National +Science Foundation`_ (grants 1550701_ and 1642446_), the `Gordon and Betty +Moore Foundation`_, and `Microsoft`_. + +.. _.NET Foundation: https://dotnetfoundation.org/ +.. _American Astronomical Society: https://aas.org/ +.. _National Science Foundation: https://www.nsf.gov/ +.. _1550701: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1550701 +.. _1642446: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1642446 +.. _Gordon and Betty Moore Foundation: https://www.moore.org/ +.. _Microsoft: https://www.microsoft.com/ diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..8b1a65e --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,39 @@ +=========================== +Installing wwt_data_formats +=========================== + +Installing wwt_data_formats with pip +==================================== + +You can also install the latest release of ``wwt_data_formats`` using pip_:: + + pip install wwt_data_formats + +.. _pip: https://pip.pypa.io/ + + +Dependencies +============ + +If you install ``wwt_data_formats`` using pip_ as described above, any +required dependencies will get installed automatically. The `README in the Git +repository`_ lists the current dependencies if you would like to see an +explict list. + +.. _README in the Git repository: https://github.com/WorldWideTelescope/wwt_data_formats/#readme + + +Installing the developer version +================================ + +If you want to use the very latest developer version, you should clone `this +repository `_ and manually +install the package in “editable” mode:: + + git clone https://github.com/WorldWideTelescope/wwt_data_formats.git + cd wwt_data_formats + pip install -e . + +You can run the test suite with the command:: + + pytest wwt_data_formats diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..a19d7ad --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=python -msphinx +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=wwt_data_formats + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The Sphinx module was not found. Make sure you have Sphinx installed, + echo.then set the SPHINXBUILD environment variable to point to the full + echo.path of the 'sphinx-build' executable. Alternatively you may add the + echo.Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9a58c51 --- /dev/null +++ b/setup.py @@ -0,0 +1,86 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright 2019 the AAS WorldWide Telescope team +# Licensed under the MIT License + +from __future__ import absolute_import, division, print_function + +import os +from setuptools import setup, Extension + +def get_long_desc(): + in_preamble = True + lines = [] + + with open('README.md') as f: + for line in f: + if in_preamble: + if line.startswith(''): + in_preamble = False + else: + if line.startswith(''): + break + else: + lines.append(line) + + lines.append(''' + +For more information, including installation instructions, please visit [the +project homepage]. + +[the project homepage]: https://wwt-data-formats.readthedocs.io/ +''') + return ''.join(lines) + + +setup_args = dict( + name = 'wwt_data_formats', + version = '0.0.1.dev0', # also update docs/conf.py + description = 'Low-level interface to AAS WorldWide Telescope data formats', + long_description = get_long_desc(), + long_description_content_type = 'text/markdown', + url = 'https://wwt-data-formats.readthedocs.io/', + license = 'MIT', + platforms = 'Linux, Mac OS X', + + author = 'AAS WorldWide Telescope Team', + author_email = 'wwt@aas.org', + + classifiers = [ + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Topic :: Scientific/Engineering :: Astronomy', + 'Topic :: Scientific/Engineering :: Visualization', + ], + + packages = [ + 'wwt_data_formats', + 'wwt_data_formats.tests', + ], + include_package_data = True, + + install_requires = [ + ], + + extras_require = { + 'test': [ + 'coveralls', + 'pytest-cov', + ], + 'docs': [ + 'astropy-sphinx-theme', + 'numpydoc', + 'sphinx', + 'sphinx-automodapi', + ], + }, +) + + +# That was fun. + +if __name__ == '__main__': + setup(**setup_args) diff --git a/wwt_data_formats/__init__.py b/wwt_data_formats/__init__.py new file mode 100644 index 0000000..2266e74 --- /dev/null +++ b/wwt_data_formats/__init__.py @@ -0,0 +1,5 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright 2019 the AAS WorldWide Telescope project +# Licensed under the MIT License. + +from __future__ import absolute_import, division, print_function diff --git a/wwt_data_formats/tests/__init__.py b/wwt_data_formats/tests/__init__.py new file mode 100644 index 0000000..ccf2cf9 --- /dev/null +++ b/wwt_data_formats/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright 2019 the AAS WorldWide Telescope project +# Licensed under the MIT License.