From 83469ea04d17f8fd74a16148a252b3b702bd7fc1 Mon Sep 17 00:00:00 2001 From: "Justin W. Flory" Date: Tue, 7 Nov 2017 16:23:18 -0500 Subject: [PATCH 1/4] Rewrite documentation to improve readability This commit rewrites and reorganizes the index page for the datagrepper documentation. It uses active voice and tries to simplify sentences to improve the [Flesch Reading Ease](https://yoast.com/flesch-reading-ease-score/) score. --- .gitignore | 3 + datagrepper/docs/index.rst | 188 +++++++++++++++++++------------------ 2 files changed, 99 insertions(+), 92 deletions(-) diff --git a/.gitignore b/.gitignore index f602e270..8687a94e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ dist build *.egg + +# Sphinx built documentation (for testing docs generation) +datagrepper/docs/_build/ diff --git a/datagrepper/docs/index.rst b/datagrepper/docs/index.rst index 32698c12..3c3daf84 100644 --- a/datagrepper/docs/index.rst +++ b/datagrepper/docs/index.rst @@ -1,38 +1,32 @@ .. |crarr| unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS -Prerequisites -------------- +Pre-requisites +-------------- + +datagrepper interacts with a JSON API with a tool called HTTPie_. All examples +here use it. Use this command to install it on Fedora:: -If you've never interacted with a JSON API before, you should check out -the handy command-line tool `HTTPie -`_. -All our examples here will use it. To install it on Fedora run ``$ sudo -yum -y install httpie``. + sudo dnf install httpie -If you get stuck here, feel free to drop into the ``#fedora-apps`` -channel on `freenode `_ to -ask questions or even just to give us a high five if everything goes well. Requesting all messages in the last 2 days ------------------------------------------ -datagrepper takes all time arguments in `seconds`, so we'll need to -convert 2 days to 172800 seconds first. Then we can use `HTTPie -`_ -like this:: +datagrepper takes time arguments in `seconds`. So, we need to convert two days +to 172,800 seconds first. Then, we can use HTTPie_ to get the JSON payload:: + + http get {{URL}}raw delta==172800 - $ http get {{URL}}raw delta==172800 Paging results -------------- -You're going to get a large JSON response that's too big to read -through. Try limiting the number of results to make it more -digestable:: +The previous example is a large JSON response that's too big to read through. +Limit the number of results to make it more digestable:: - $ http get {{URL}}raw \ - delta==172800 \ - rows_per_page==1 + http get {{URL}}raw \ + delta==172800 \ + rows_per_page==1 .. code-block:: javascript @@ -61,20 +55,22 @@ digestable:: "total": 2052 } -In the above output, the contents of ``raw_messages`` has been omitted for -readability. Notice a few things: first, the ``arguments`` dict describes -all the parameters that datagrepper used to execute your query. The -``start`` and ``end`` timestamps are included (they were derived from -the ``delta`` that you supplied). +In this example, ``raw_messages`` was omitted for readability. + +Notice a few things. -Your ``rows_per_page`` is there. It has a sibling value ``page`` which -is a pointer to which "page" of data you are on. You could issue the -following query to get the next one:: +#. **``arguments`` dict**: Describes all parameters datagrepper uses to execute + query +#. **Timestamps**: ``start`` and ``end`` included (derived from your ``delta``) +#. **Pagination**: ``rows_per_page`` shows the rows per page, its sibling value + ``page`` is pointer to "page" of data you are on - $ http get {{URL}}raw \ - delta==172800 \ - rows_per_page==1 \ - page==2 +Use this command to get to the next page:: + + http get {{URL}}raw \ + delta==172800 \ + rows_per_page==1 \ + page==2 .. code-block:: javascript @@ -103,92 +99,100 @@ following query to get the next one:: "total": 2052 } +The number of rows are retrieved from newest to oldest ("descending"). The +``order`` argument lets you specify that. The default is ``desc``, but you can +set it to ``asc`` for ascending order (i.e. oldest to newest). -By default, the order of rows retrieved is from newest to oldest ("descending") -There is an ``order`` argument you can specify to set that how you like. The -default is "desc", but you can set it to "asc" for ascending order, a.k.a. -from oldest to newest. Only Bodhi messages (OR wiki) ----------------------------- -There is a `long list `_ of types of -messages that come across the Fedora Infrastructure's message bus. -You can limit the scope of your query to only one kind of message -by specifying a ``category``:: +There is a `list of topics`_ that come across Fedora's messaging bus +(**fedmsg**). Specify a ``category`` to limit your message to one kind of +topic:: + + http get {{URL}}raw \ + delta==172800 \ + category==bodhi - $ http get {{URL}}raw \ - delta==172800 \ - category==bodhi +Here, ``category`` is singular but comes back in the ``arguments`` dict as +*categories* (plural)! You can specify multiple categories and messages that +match *either* category will return. They are ``OR``'d together:: -Note that, in this example, ``category`` is singular but it comes back in -the ``arguments`` dict as *categories* (plural!) You can specify more -than one category and messages that match *either* category will be returned. -They are **OR**'d together:: + http get {{URL}}raw \ + delta==172800 \ + category==bodhi \ + category==wiki - $ http get {{URL}}raw \ - delta==172800 \ - category==bodhi \ - category==wiki +Messages for specific users and packages +---------------------------------------- -Messages for a particular users and packages --------------------------------------------- +Search for events relating to multiple users with this query:: -Just like categories, you can search for events relating to one or multiple -users:: + http get {{URL}}raw \ + delta==172800 \ + user==toshio \ + user==pingou - $ http get {{URL}}raw \ - delta==172800 \ - user==toshio \ - user==pingou +Same for packages:: -Same goes for packages:: + http get {{URL}}raw \ + delta==172800 \ + package==nethack - $ http get {{URL}}raw \ - delta==172800 \ - package==nethack -Everything but the... ---------------------- +Excluding data +-------------- + +For each positive filter, there is a corresponding *negative filter*. If you +want to query all messages **except for Koji messages**, use this query:: -There are corresponding *negative filters* for each of the above mentioned -positive filters. For instance, if you wanted to get all messages **except for -Koji messages**, you could use this query:: + http get {{URL}}raw \ + delta==172800 \ + not_category==buildsys - $ http get {{URL}}raw \ - delta==172800 \ - not_category==buildsys +Positive and negative filters are combinable. This query returns all messages +except for user ``toshio``'s *Ask Fedora* activity:: -You can combine positive and negative filters as you might expect to, for -instance, get all messages relating to the user toshio **except** for Ask -Fedora activity:: + http get {{URL}}raw \ + delta==172800 \ + user==toshio \ + not_category==askbot - $ http get {{URL}}raw \ - delta==172800 \ - user==toshio \ - not_category==askbot Putting it all together (CNF) ----------------------------- -If you specify multiple ``category`` filters and multiple ``user`` filters -and multiple ``package`` filters, they are merged together in a way that looks -like `Conjunctive Normal Form (CNF) -`_. +Multiple ``category``, ``user``, and ``package`` filters are merged together in +a way that looks like `Conjunctive Normal Form`_ (CNF). -For example, this query will return all messages from the past 2 days where +The following query returns all messages from the past two days where *(category==bodhi OR category==wiki) AND (user==toshio OR user==pingou)*:: - $ http get {{URL}}raw \ - delta==172800 \ - category==bodhi \ - category==wiki \ - user==toshio \ - user==pingou + http get {{URL}}raw \ + delta==172800 \ + category==bodhi \ + category==wiki \ + user==toshio \ + user==pingou + Topics list ----------- If you don't know what topics are available for you to query, check the `list -of topics in the documentation -`_. +of topics`_ in the documentation. + + +Get help +-------- + +If you get stuck, join ``#fedora-apps`` on freenode_ to ask questions. Or, if +everything is awesome, we welcome high-fives and karma cookies. + + +.. _`HTTPie`: https://github.com/jkbr/httpie#httpie-a-cli-curl-like-tool-for-humans +.. _`list of topics`: http://fedmsg.com/en/latest/topics.html +.. _`Conjunctive Normal Form`: https://wikipedia.org/wiki/Conjunctive_normal_form +.. _`freenode`: https://fedoraproject.org/wiki/How_to_use_IRC + From 7b3e6acc368eeeaa43e7865c06a3307d32f1bb5e Mon Sep 17 00:00:00 2001 From: "Justin W. Flory" Date: Tue, 7 Nov 2017 16:26:27 -0500 Subject: [PATCH 2/4] Add test script for testing reST doc generation --- datagrepper/docs/Makefile | 20 +++++ datagrepper/docs/conf.py | 157 ++++++++++++++++++++++++++++++++++++++ test-requirements.txt | 3 +- tests/generate-docs.sh | 12 +++ 4 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 datagrepper/docs/Makefile create mode 100644 datagrepper/docs/conf.py create mode 100755 tests/generate-docs.sh diff --git a/datagrepper/docs/Makefile b/datagrepper/docs/Makefile new file mode 100644 index 00000000..2b094e47 --- /dev/null +++ b/datagrepper/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = datagrepper +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) \ No newline at end of file diff --git a/datagrepper/docs/conf.py b/datagrepper/docs/conf.py new file mode 100644 index 00000000..30a648df --- /dev/null +++ b/datagrepper/docs/conf.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# datagrepper documentation build configuration file, created by +# sphinx-quickstart on Tue Nov 7 16:18:46 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# 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 sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# 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.mathjax'] + +# 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' + +# General information about the project. +project = 'datagrepper' +copyright = '2017, Fedora Infrastructure Team' +author = 'Fedora Infrastructure Team' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '' +# The full version, including alpha/beta/rc tags. +release = '' + +# 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 patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- 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 = 'alabaster' + +# 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'] + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'datagrepperdoc' + + +# -- 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, 'datagrepper.tex', 'datagrepper Documentation', + 'Fedora Infrastructure Team', '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, 'datagrepper', 'datagrepper 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, 'datagrepper', 'datagrepper Documentation', + author, 'datagrepper', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/test-requirements.txt b/test-requirements.txt index 2a6c4c4f..151658d2 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,2 +1,3 @@ -nose freezegun +nose +sphinx diff --git a/tests/generate-docs.sh b/tests/generate-docs.sh new file mode 100755 index 00000000..ff7f04d2 --- /dev/null +++ b/tests/generate-docs.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# +# Script to automatically build and test the Sphinx documentation currently in +# the repo. This script should always be run before submitting a new pull +# request. +# +# If you're on Windows, please use the `make.bat` script in `docs/` directory. +# + +cd ../datagrepper/docs/ +make clean html + From 76fd54f2f4809c3a2c35bd75f94ba31133f95941 Mon Sep 17 00:00:00 2001 From: "Justin W. Flory" Date: Wed, 8 Nov 2017 10:46:35 -0500 Subject: [PATCH 3/4] Update Sphinx extensions, settings; minor docs reformatting --- datagrepper/docs/conf.py | 17 +++++++++++++---- datagrepper/docs/datagrepper.png | Bin 0 -> 13533 bytes datagrepper/docs/index.rst | 9 ++++----- 3 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 datagrepper/docs/datagrepper.png diff --git a/datagrepper/docs/conf.py b/datagrepper/docs/conf.py index 30a648df..86715c22 100644 --- a/datagrepper/docs/conf.py +++ b/datagrepper/docs/conf.py @@ -31,7 +31,10 @@ # 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.mathjax'] +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.viewcode', + 'sphinx.ext.napoleon'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -55,9 +58,9 @@ # built documents. # # The short X.Y version. -version = '' +version = '0.8' # The full version, including alpha/beta/rc tags. -release = '' +release = '0.8.0-develop' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -89,7 +92,13 @@ # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + 'logo': 'datagrepper.png', + 'logo_name': True, + 'github_user': 'fedora-infra', + 'github_repo': 'datagrepper', + 'page_width': '1040px', +} # 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, diff --git a/datagrepper/docs/datagrepper.png b/datagrepper/docs/datagrepper.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c79493ec5b0eba450bb4ee0471451e3af375b2 GIT binary patch literal 13533 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 Date: Wed, 8 Nov 2017 10:49:48 -0500 Subject: [PATCH 4/4] Add virtualenvs to .gitignore --- .gitignore | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.gitignore b/.gitignore index 8687a94e..ef94796f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,18 @@ build # Sphinx built documentation (for testing docs generation) datagrepper/docs/_build/ + +# Python virtualenvs +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +.Python +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Mm]an +[Ss]cripts +pyvenv.cfg +.venv +pip-selfcheck.json +