Repository: cthoyt/pybacting (language: python)

Issue:
Enable importing all bacting build artifacts
Blocked by https://github.com/scijava/scyjava/issues/30 and transitively https://github.com/scijava/jgo/issues/31#issuecomment-548056700

To fix this, we'll have to wait for a new release of `jgo` which includes the finished PR https://github.com/scijava/jgo/pull/62. Then, the issue with scyjava will magically go away. This issue can be closed with an update to pybacting's setup.cfg file to include a minimum version of `jgo`


Discussion / hints:
In the meantime, since scijava/jgo#62 is now merged, you could test with the latest dev version of jgo from git, and see whether the problem is resolved for you?

Fix patch:
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index b6a13a8..7ff25df 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -23,6 +23,10 @@ values = [0-9A-Za-z-]+
 search = version = {current_version}
 replace = version = {new_version}
 
+[bumpversion:file:docs/source/conf.py]
+search = release = '{current_version}'
+replace = release = '{new_version}'
+
 [bumpversion:file:src/pybacting/version.py]
 search = VERSION = "{current_version}"
 replace = VERSION = "{new_version}"
diff --git a/.gitignore b/.gitignore
index c849001..07d6ec0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -224,6 +224,7 @@ instance/
 # Sphinx documentation
 docs/_build/
 doc/_build/
+docs/source/api
 
 # PyBuilder
 target/
diff --git a/MANIFEST.in b/MANIFEST.in
index 6c9ae70..dd15b2d 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,6 +1,10 @@
 graft src
 graft tests
 
+recursive-include docs *.py
+recursive-include docs *.rst
+recursive-include docs Makefile
+
 global-exclude *.py[cod] __pycache__ *.so *.dylib .DS_Store *.gpickle
 
 exclude .appveyor.yml .bumpversion.cfg .coveragerc .flake8 .travis.yml .readthedocs.yml tox.ini .pre-commit-config.yaml
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..4771322
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,19 @@
+# Minimal makefile for Sphinx documentation
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+SPHINXPROJ    = Bioregistry
+SOURCEDIR     = source
+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)
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..5a22c0a
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,229 @@
+# -*- coding: utf-8 -*-
+#
+# Configuration file for the Sphinx documentation builder.
+#
+# This file does only contain a selection of the most common options. For a
+# full list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- 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 re
+import sys
+from datetime import date
+
+sys.path.insert(0, os.path.abspath('../../src'))
+
+# -- Project information -----------------------------------------------------
+
+project = 'pybacting'
+copyright = f'{date.today().year}, Charles Tapley Hoyt'
+author = 'Charles Tapley Hoyt'
+
+# The full version, including alpha/beta/rc tags.
+release = '0.1.4-dev'
+
+# The short X.Y version.
+parsed_version = re.match(
+    '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(?:-(?P<release>[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+(?P<build>[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?',
+    release,
+)
+version = parsed_version.expand('\g<major>.\g<minor>.\g<patch>')
+
+if parsed_version.group('release'):
+    tags.add('prerelease')
+
+# -- General configuration ---------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = False
+
+# A list of prefixes that are ignored when creating the module index. (new in Sphinx 0.6)
+modindex_common_prefix = ["pybacting."]
+
+# 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.autosummary',
+    'sphinx.ext.autodoc',
+    'sphinx.ext.coverage',
+    'sphinx.ext.intersphinx',
+    "sphinx.ext.todo",
+    'sphinx.ext.mathjax',
+    'sphinx.ext.viewcode',
+    'sphinx_autodoc_typehints',
+    'sphinx_automodapi.automodapi',
+]
+
+# generate autosummary pages
+autosummary_generate = True
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# 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 = []
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# -- 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 = 'sphinx_rtd_theme'
+
+# 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 = {}
+
+# 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']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# The default sidebars (for documents that don't match any pattern) are
+# defined by theme itself.  Builtin themes are using these templates by
+# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+# 'searchbox.html']``.
+#
+# html_sidebars = {}
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#
+if os.path.exists('logo.png'):
+    html_logo = 'logo.png'
+
+# -- Options for HTMLHelp output ---------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'pybactingdoc'
+
+# -- Options for LaTeX output ------------------------------------------------
+
+# latex_elements = {
+#     The paper size ('letterpaper' or 'a4paper').
+#
+#     'papersize': 'letterpaper',
+#
+#     The font size ('10pt', '11pt' or '12pt').
+#
+#     'pointsize': '10pt',
+#
+#     Additional stuff for the LaTeX preamble.
+#
+#     'preamble': '',
+#
+#     Latex figure (float) alignment
+#
+#     'figure_align': 'htbp',
+# }
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+# latex_documents = [
+#     (
+#         master_doc,
+#         'pybacting.tex',
+#         'PyBacting Documentation',
+#         author,
+#         'manual',
+#     ),
+# ]
+
+# -- Options for manual page output ------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (
+        master_doc,
+        'pybacting',
+        'PyBacting Documentation',
+        [author],
+        1,
+    ),
+]
+
+# -- Options for Texinfo output ----------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (
+        master_doc,
+        'pybacting',
+        'PyBacting Documentation',
+        author,
+        'Charles Tapley Hoyt',
+        'A python wrapper around Bacting',
+        'Miscellaneous',
+    ),
+]
+
+# -- Options for Epub output -------------------------------------------------
+
+# Bibliographic Dublin Core info.
+# epub_title = project
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#
+# epub_identifier = ''
+
+# A unique identification for the text.
+#
+# epub_uid = ''
+
+# A list of files that should not be packed into the epub file.
+# epub_exclude_files = ['search.html']
+
+# -- Extension configuration -------------------------------------------------
+
+# -- Options for intersphinx extension ---------------------------------------
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {
+    'https://docs.python.org/3/': None,
+}
+
+autoclass_content = 'both'
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 0000000..38b1157
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,17 @@
+PyBacting |release| Documentation
+===================================
+.. automodule:: pybacting
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Getting Started
+   :name: start
+
+   installation
+   managers
+
+Indices and Tables
+------------------
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
new file mode 100644
index 0000000..694734b
--- /dev/null
+++ b/docs/source/installation.rst
@@ -0,0 +1,23 @@
+Installation
+============
+The most recent release can be installed from
+`PyPI <https://pypi.org/project/pybacting>`_ with:
+
+.. code-block:: shell
+
+    $ pip install pybacting
+
+The most recent code and data can be installed directly from GitHub with:
+
+.. code-block:: shell
+
+    $ pip install git+https://github.com/cthoyt/pybacting.git
+
+To install in development mode, use the following:
+
+.. code-block:: shell
+
+    $ git clone git+https://github.com/cthoyt/pybacting.git
+    $ cd pybacting
+    $ pip install -e .
+
diff --git a/docs/source/managers.rst b/docs/source/managers.rst
new file mode 100644
index 0000000..8eeec6e
--- /dev/null
+++ b/docs/source/managers.rst
@@ -0,0 +1,6 @@
+Managers
+========
+.. automodapi:: pybacting.api
+    :no-heading:
+    :headings: --
+    :include-all-objects:
diff --git a/setup.cfg b/setup.cfg
index 394583d..199093f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -58,6 +58,13 @@ package_dir =
 [options.packages.find]
 where = src
 
+[options.extras_require]
+docs =
+    sphinx
+    sphinx-rtd-theme
+    sphinx-autodoc-typehints
+    sphinx_automodapi
+
 ##########################
 # Darglint Configuration #
 ##########################
diff --git a/src/pybacting/__main__.py b/src/pybacting/__main__.py
new file mode 100644
index 0000000..d7d8db9
--- /dev/null
+++ b/src/pybacting/__main__.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+"""CLI for PyBacting."""
+
+from .cli import main
+
+if __name__ == "__main__":
+    main()
diff --git a/src/pybacting/api.py b/src/pybacting/api.py
index 8ea7ba0..bdd5842 100644
--- a/src/pybacting/api.py
+++ b/src/pybacting/api.py
@@ -9,6 +9,12 @@
     "opsin",
     "inchi",
     "pubchem",
+    "xml",
+    "rdf",
+    "oscar",
+    "bridgedb",
+    "excel",
+    "biojava",
 ]
 
 WORKSPACE = "."
@@ -52,15 +58,43 @@
 
 cdk_class = jimport("net.bioclipse.managers.CDKManager")
 cdk = cdk_class(WORKSPACE)
+"""The CDK manager from Bacting."""
 
 inchi_cls = jimport("net.bioclipse.managers.InChIManager")
 inchi = inchi_cls(WORKSPACE)
+"""The InChI manager from Bacting."""
 
 opsin_class = jimport("net.bioclipse.managers.OpsinManager")
 opsin = opsin_class(WORKSPACE)
+"""The Opsin manager from Bacting."""
 
 pubchem_cls = jimport("net.bioclipse.managers.PubChemManager")
 pubchem = pubchem_cls(WORKSPACE)
+"""The PubChem manager from Bacting."""
+
+xml_cls = jimport("net.bioclipse.managers.XMLManager")
+xml = xml_cls(WORKSPACE)
+"""The XML manager from Bacting."""
+
+rdf_cls = jimport("net.bioclipse.managers.RDFManager")
+rdf = rdf_cls(WORKSPACE)
+"""The RDF manager from Bacting."""
+
+oscar_cls = jimport("net.bioclipse.managers.OscarManager")
+oscar = oscar_cls(WORKSPACE)
+"""The Oscar manager from Bacting."""
+
+bridgedb_cls = jimport("net.bioclipse.managers.BridgedbManager")
+bridgedb = bridgedb_cls(WORKSPACE)
+"""The BridgeDB manager from Bacting."""
+
+excel_cls = jimport("net.bioclipse.managers.ExcelManager")
+excel = excel_cls(WORKSPACE)
+"""The Excel manager from Bacting."""
+
+biojava_cls = jimport("net.bioclipse.managers.BiojavaManager")
+biojava = biojava_cls(WORKSPACE)
+"""The BioJava manager from Bacting."""
 
 xml_cls = jimport("net.bioclipse.managers.XMLManager")
 xml = xml_cls(WORKSPACE)
diff --git a/src/pybacting/cli.py b/src/pybacting/cli.py
new file mode 100644
index 0000000..9c34216
--- /dev/null
+++ b/src/pybacting/cli.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+"""CLI for PyBacting."""
+
+import click
+
+__all__ = [
+    "main",
+]
+
+
+@click.command()
+@click.version_option()
+def main():
+    """Run the PyBacting CLI."""
+
+
+if __name__ == "__main__":
+    main()
diff --git a/tox.ini b/tox.ini
index f5cf42a..3eee90f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -14,8 +14,9 @@ envlist =
     pyroma
     mypy
     # documentation linters/checkers
-    # doc8
-    # docs
+    doc8
+    docs
+    docstr-coverage
     # the actual tests
     py
     doctests
@@ -75,6 +76,14 @@ commands =
     flake8 src/pybacting/ tests/ setup.py
 description = Run the flake8 tool with several plugins (bandit, docstrings, import order, pep8 naming).
 
+[testenv:docstr-coverage]
+skip_install = true
+deps =
+    docstr-coverage
+commands =
+    docstr-coverage --skip-private --skip-magic src/ setup.py
+description = Run the docstr-coverage tool to check documentation coverage
+
 [testenv:lint]
 deps =
     black


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 1ba7c8f..07fad65 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -25,6 +25,28 @@ jobs:
         run: tox -e pyroma
       - name: Check static typing with MyPy
         run: tox -e mypy
+  docs:
+    name: Documentation
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: [ 3.7, 3.9 ]
+    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 dependencies
+        run: pip install tox
+      - name: Check RST conformity with doc8
+        run: tox -e doc8
+      - name: Check docstring coverage
+        run: tox -e docstr-coverage
+      - name: Check documentation build with Sphinx
+        run: |
+          sudo apt-get install graphviz
+          tox -e docs
   tests:
     name: Tests
     runs-on: ${{ matrix.os }}