mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-11-04 09:57:41 +03:00 
			
		
		
		
	First version of integrated Graphene sphinx docs ✨
This commit is contained in:
		
							parent
							
								
									a2140110c2
								
							
						
					
					
						commit
						a0d07343e1
					
				
							
								
								
									
										225
									
								
								docs/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								docs/Makefile
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,225 @@
 | 
			
		|||
# Makefile for Sphinx documentation
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# You can set these variables from the command line.
 | 
			
		||||
SPHINXOPTS    =
 | 
			
		||||
SPHINXBUILD   = sphinx-build
 | 
			
		||||
PAPER         =
 | 
			
		||||
BUILDDIR      = _build
 | 
			
		||||
 | 
			
		||||
# Internal variables.
 | 
			
		||||
PAPEROPT_a4     = -D latex_paper_size=a4
 | 
			
		||||
PAPEROPT_letter = -D latex_paper_size=letter
 | 
			
		||||
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 | 
			
		||||
# the i18n builder cannot share the environment and doctrees with the others
 | 
			
		||||
I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 | 
			
		||||
 | 
			
		||||
.PHONY: help
 | 
			
		||||
help:
 | 
			
		||||
	@echo "Please use \`make <target>' where <target> is one of"
 | 
			
		||||
	@echo "  html       to make standalone HTML files"
 | 
			
		||||
	@echo "  dirhtml    to make HTML files named index.html in directories"
 | 
			
		||||
	@echo "  singlehtml to make a single large HTML file"
 | 
			
		||||
	@echo "  pickle     to make pickle files"
 | 
			
		||||
	@echo "  json       to make JSON files"
 | 
			
		||||
	@echo "  htmlhelp   to make HTML files and a HTML help project"
 | 
			
		||||
	@echo "  qthelp     to make HTML files and a qthelp project"
 | 
			
		||||
	@echo "  applehelp  to make an Apple Help Book"
 | 
			
		||||
	@echo "  devhelp    to make HTML files and a Devhelp project"
 | 
			
		||||
	@echo "  epub       to make an epub"
 | 
			
		||||
	@echo "  epub3      to make an epub3"
 | 
			
		||||
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
 | 
			
		||||
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
 | 
			
		||||
	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
 | 
			
		||||
	@echo "  text       to make text files"
 | 
			
		||||
	@echo "  man        to make manual pages"
 | 
			
		||||
	@echo "  texinfo    to make Texinfo files"
 | 
			
		||||
	@echo "  info       to make Texinfo files and run them through makeinfo"
 | 
			
		||||
	@echo "  gettext    to make PO message catalogs"
 | 
			
		||||
	@echo "  changes    to make an overview of all changed/added/deprecated items"
 | 
			
		||||
	@echo "  xml        to make Docutils-native XML files"
 | 
			
		||||
	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
 | 
			
		||||
	@echo "  linkcheck  to check all external links for integrity"
 | 
			
		||||
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
 | 
			
		||||
	@echo "  coverage   to run coverage check of the documentation (if enabled)"
 | 
			
		||||
	@echo "  dummy      to check syntax errors of document sources"
 | 
			
		||||
 | 
			
		||||
.PHONY: clean
 | 
			
		||||
clean:
 | 
			
		||||
	rm -rf $(BUILDDIR)/*
 | 
			
		||||
 | 
			
		||||
.PHONY: html
 | 
			
		||||
html:
 | 
			
		||||
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
 | 
			
		||||
 | 
			
		||||
.PHONY: dirhtml
 | 
			
		||||
dirhtml:
 | 
			
		||||
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
 | 
			
		||||
 | 
			
		||||
.PHONY: singlehtml
 | 
			
		||||
singlehtml:
 | 
			
		||||
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
 | 
			
		||||
 | 
			
		||||
.PHONY: pickle
 | 
			
		||||
pickle:
 | 
			
		||||
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished; now you can process the pickle files."
 | 
			
		||||
 | 
			
		||||
.PHONY: json
 | 
			
		||||
json:
 | 
			
		||||
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished; now you can process the JSON files."
 | 
			
		||||
 | 
			
		||||
.PHONY: htmlhelp
 | 
			
		||||
htmlhelp:
 | 
			
		||||
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished; now you can run HTML Help Workshop with the" \
 | 
			
		||||
	      ".hhp project file in $(BUILDDIR)/htmlhelp."
 | 
			
		||||
 | 
			
		||||
.PHONY: qthelp
 | 
			
		||||
qthelp:
 | 
			
		||||
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
 | 
			
		||||
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
 | 
			
		||||
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Graphene.qhcp"
 | 
			
		||||
	@echo "To view the help file:"
 | 
			
		||||
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Graphene.qhc"
 | 
			
		||||
 | 
			
		||||
.PHONY: applehelp
 | 
			
		||||
applehelp:
 | 
			
		||||
	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
 | 
			
		||||
	@echo "N.B. You won't be able to view it unless you put it in" \
 | 
			
		||||
	      "~/Library/Documentation/Help or install it in your application" \
 | 
			
		||||
	      "bundle."
 | 
			
		||||
 | 
			
		||||
.PHONY: devhelp
 | 
			
		||||
devhelp:
 | 
			
		||||
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished."
 | 
			
		||||
	@echo "To view the help file:"
 | 
			
		||||
	@echo "# mkdir -p $$HOME/.local/share/devhelp/Graphene"
 | 
			
		||||
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Graphene"
 | 
			
		||||
	@echo "# devhelp"
 | 
			
		||||
 | 
			
		||||
.PHONY: epub
 | 
			
		||||
epub:
 | 
			
		||||
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
 | 
			
		||||
 | 
			
		||||
.PHONY: epub3
 | 
			
		||||
epub3:
 | 
			
		||||
	$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
 | 
			
		||||
 | 
			
		||||
.PHONY: latex
 | 
			
		||||
latex:
 | 
			
		||||
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
 | 
			
		||||
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
 | 
			
		||||
	      "(use \`make latexpdf' here to do that automatically)."
 | 
			
		||||
 | 
			
		||||
.PHONY: latexpdf
 | 
			
		||||
latexpdf:
 | 
			
		||||
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
 | 
			
		||||
	@echo "Running LaTeX files through pdflatex..."
 | 
			
		||||
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
 | 
			
		||||
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
 | 
			
		||||
 | 
			
		||||
.PHONY: latexpdfja
 | 
			
		||||
latexpdfja:
 | 
			
		||||
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
 | 
			
		||||
	@echo "Running LaTeX files through platex and dvipdfmx..."
 | 
			
		||||
	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
 | 
			
		||||
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
 | 
			
		||||
 | 
			
		||||
.PHONY: text
 | 
			
		||||
text:
 | 
			
		||||
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The text files are in $(BUILDDIR)/text."
 | 
			
		||||
 | 
			
		||||
.PHONY: man
 | 
			
		||||
man:
 | 
			
		||||
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
 | 
			
		||||
 | 
			
		||||
.PHONY: texinfo
 | 
			
		||||
texinfo:
 | 
			
		||||
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
 | 
			
		||||
	@echo "Run \`make' in that directory to run these through makeinfo" \
 | 
			
		||||
	      "(use \`make info' here to do that automatically)."
 | 
			
		||||
 | 
			
		||||
.PHONY: info
 | 
			
		||||
info:
 | 
			
		||||
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
 | 
			
		||||
	@echo "Running Texinfo files through makeinfo..."
 | 
			
		||||
	make -C $(BUILDDIR)/texinfo info
 | 
			
		||||
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
 | 
			
		||||
 | 
			
		||||
.PHONY: gettext
 | 
			
		||||
gettext:
 | 
			
		||||
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
 | 
			
		||||
 | 
			
		||||
.PHONY: changes
 | 
			
		||||
changes:
 | 
			
		||||
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "The overview file is in $(BUILDDIR)/changes."
 | 
			
		||||
 | 
			
		||||
.PHONY: linkcheck
 | 
			
		||||
linkcheck:
 | 
			
		||||
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Link check complete; look for any errors in the above output " \
 | 
			
		||||
	      "or in $(BUILDDIR)/linkcheck/output.txt."
 | 
			
		||||
 | 
			
		||||
.PHONY: doctest
 | 
			
		||||
doctest:
 | 
			
		||||
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
 | 
			
		||||
	@echo "Testing of doctests in the sources finished, look at the " \
 | 
			
		||||
	      "results in $(BUILDDIR)/doctest/output.txt."
 | 
			
		||||
 | 
			
		||||
.PHONY: coverage
 | 
			
		||||
coverage:
 | 
			
		||||
	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
 | 
			
		||||
	@echo "Testing of coverage in the sources finished, look at the " \
 | 
			
		||||
	      "results in $(BUILDDIR)/coverage/python.txt."
 | 
			
		||||
 | 
			
		||||
.PHONY: xml
 | 
			
		||||
xml:
 | 
			
		||||
	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
 | 
			
		||||
 | 
			
		||||
.PHONY: pseudoxml
 | 
			
		||||
pseudoxml:
 | 
			
		||||
	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
 | 
			
		||||
 | 
			
		||||
.PHONY: dummy
 | 
			
		||||
dummy:
 | 
			
		||||
	$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "Build finished. Dummy builder generates no files."
 | 
			
		||||
							
								
								
									
										434
									
								
								docs/conf.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										434
									
								
								docs/conf.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,434 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
#
 | 
			
		||||
# Graphene documentation build configuration file, created by
 | 
			
		||||
# sphinx-quickstart on Sun Sep 11 18:30:51 2016.
 | 
			
		||||
#
 | 
			
		||||
# 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.autodoc',
 | 
			
		||||
    'sphinx.ext.intersphinx',
 | 
			
		||||
    'sphinx.ext.todo',
 | 
			
		||||
    'sphinx.ext.coverage',
 | 
			
		||||
    'sphinx.ext.viewcode',
 | 
			
		||||
    'sphinx.ext.githubpages',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# 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 encoding of source files.
 | 
			
		||||
#
 | 
			
		||||
# source_encoding = 'utf-8-sig'
 | 
			
		||||
 | 
			
		||||
# The master toctree document.
 | 
			
		||||
master_doc = 'index'
 | 
			
		||||
 | 
			
		||||
# General information about the project.
 | 
			
		||||
project = u'Graphene'
 | 
			
		||||
copyright = u'Graphene 2016'
 | 
			
		||||
author = u'Syrus Akbary'
 | 
			
		||||
 | 
			
		||||
# 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 = u'1.0'
 | 
			
		||||
# The full version, including alpha/beta/rc tags.
 | 
			
		||||
release = u'1.0.dev'
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
# There are two options for replacing |today|: either, you set today to some
 | 
			
		||||
# non-false value, then it is used:
 | 
			
		||||
#
 | 
			
		||||
# today = ''
 | 
			
		||||
#
 | 
			
		||||
# Else, today_fmt is used as the format for a strftime call.
 | 
			
		||||
#
 | 
			
		||||
# today_fmt = '%B %d, %Y'
 | 
			
		||||
 | 
			
		||||
# 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 reST default role (used for this markup: `text`) to use for all
 | 
			
		||||
# documents.
 | 
			
		||||
#
 | 
			
		||||
# default_role = None
 | 
			
		||||
 | 
			
		||||
# If true, '()' will be appended to :func: etc. cross-reference text.
 | 
			
		||||
#
 | 
			
		||||
# add_function_parentheses = True
 | 
			
		||||
 | 
			
		||||
# If true, the current module name will be prepended to all description
 | 
			
		||||
# unit titles (such as .. function::).
 | 
			
		||||
#
 | 
			
		||||
# add_module_names = True
 | 
			
		||||
 | 
			
		||||
# If true, sectionauthor and moduleauthor directives will be shown in the
 | 
			
		||||
# output. They are ignored by default.
 | 
			
		||||
#
 | 
			
		||||
# show_authors = False
 | 
			
		||||
 | 
			
		||||
# The name of the Pygments (syntax highlighting) style to use.
 | 
			
		||||
pygments_style = 'sphinx'
 | 
			
		||||
 | 
			
		||||
# A list of ignored prefixes for module index sorting.
 | 
			
		||||
# modindex_common_prefix = []
 | 
			
		||||
 | 
			
		||||
# If true, keep warnings as "system message" paragraphs in the built documents.
 | 
			
		||||
# keep_warnings = False
 | 
			
		||||
 | 
			
		||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
 | 
			
		||||
todo_include_todos = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- 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 themes here, relative to this directory.
 | 
			
		||||
# html_theme_path = []
 | 
			
		||||
 | 
			
		||||
# The name for this set of Sphinx documents.
 | 
			
		||||
# "<project> v<release> documentation" by default.
 | 
			
		||||
#
 | 
			
		||||
# html_title = u'Graphene v1.0.dev'
 | 
			
		||||
 | 
			
		||||
# A shorter title for the navigation bar.  Default is the same as html_title.
 | 
			
		||||
#
 | 
			
		||||
# html_short_title = None
 | 
			
		||||
 | 
			
		||||
# The name of an image file (relative to this directory) to place at the top
 | 
			
		||||
# of the sidebar.
 | 
			
		||||
#
 | 
			
		||||
# html_logo = None
 | 
			
		||||
 | 
			
		||||
# The name of an image file (relative to this directory) to use as a favicon of
 | 
			
		||||
# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 | 
			
		||||
# pixels large.
 | 
			
		||||
#
 | 
			
		||||
# html_favicon = None
 | 
			
		||||
 | 
			
		||||
# 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']
 | 
			
		||||
 | 
			
		||||
# Add any extra paths that contain custom files (such as robots.txt or
 | 
			
		||||
# .htaccess) here, relative to this directory. These files are copied
 | 
			
		||||
# directly to the root of the documentation.
 | 
			
		||||
#
 | 
			
		||||
# html_extra_path = []
 | 
			
		||||
 | 
			
		||||
# If not None, a 'Last updated on:' timestamp is inserted at every page
 | 
			
		||||
# bottom, using the given strftime format.
 | 
			
		||||
# The empty string is equivalent to '%b %d, %Y'.
 | 
			
		||||
#
 | 
			
		||||
# html_last_updated_fmt = None
 | 
			
		||||
 | 
			
		||||
# If true, SmartyPants will be used to convert quotes and dashes to
 | 
			
		||||
# typographically correct entities.
 | 
			
		||||
#
 | 
			
		||||
# html_use_smartypants = True
 | 
			
		||||
 | 
			
		||||
# Custom sidebar templates, maps document names to template names.
 | 
			
		||||
#
 | 
			
		||||
# html_sidebars = {}
 | 
			
		||||
 | 
			
		||||
# Additional templates that should be rendered to pages, maps page names to
 | 
			
		||||
# template names.
 | 
			
		||||
#
 | 
			
		||||
# html_additional_pages = {}
 | 
			
		||||
 | 
			
		||||
# If false, no module index is generated.
 | 
			
		||||
#
 | 
			
		||||
# html_domain_indices = True
 | 
			
		||||
 | 
			
		||||
# If false, no index is generated.
 | 
			
		||||
#
 | 
			
		||||
# html_use_index = True
 | 
			
		||||
 | 
			
		||||
# If true, the index is split into individual pages for each letter.
 | 
			
		||||
#
 | 
			
		||||
# html_split_index = False
 | 
			
		||||
 | 
			
		||||
# If true, links to the reST sources are added to the pages.
 | 
			
		||||
#
 | 
			
		||||
# html_show_sourcelink = True
 | 
			
		||||
 | 
			
		||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
 | 
			
		||||
#
 | 
			
		||||
# html_show_sphinx = True
 | 
			
		||||
 | 
			
		||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
 | 
			
		||||
#
 | 
			
		||||
# html_show_copyright = True
 | 
			
		||||
 | 
			
		||||
# If true, an OpenSearch description file will be output, and all pages will
 | 
			
		||||
# contain a <link> tag referring to it.  The value of this option must be the
 | 
			
		||||
# base URL from which the finished HTML is served.
 | 
			
		||||
#
 | 
			
		||||
# html_use_opensearch = ''
 | 
			
		||||
 | 
			
		||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
 | 
			
		||||
# html_file_suffix = None
 | 
			
		||||
 | 
			
		||||
# Language to be used for generating the HTML full-text search index.
 | 
			
		||||
# Sphinx supports the following languages:
 | 
			
		||||
#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
 | 
			
		||||
#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
 | 
			
		||||
#
 | 
			
		||||
# html_search_language = 'en'
 | 
			
		||||
 | 
			
		||||
# A dictionary with options for the search language support, empty by default.
 | 
			
		||||
# 'ja' uses this config value.
 | 
			
		||||
# 'zh' user can custom change `jieba` dictionary path.
 | 
			
		||||
#
 | 
			
		||||
# html_search_options = {'type': 'default'}
 | 
			
		||||
 | 
			
		||||
# The name of a javascript file (relative to the configuration directory) that
 | 
			
		||||
# implements a search results scorer. If empty, the default will be used.
 | 
			
		||||
#
 | 
			
		||||
# html_search_scorer = 'scorer.js'
 | 
			
		||||
 | 
			
		||||
# Output file base name for HTML help builder.
 | 
			
		||||
htmlhelp_basename = 'Graphenedoc'
 | 
			
		||||
 | 
			
		||||
# -- 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, 'Graphene.tex', u'Graphene Documentation',
 | 
			
		||||
     u'Syrus Akbary', 'manual'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# The name of an image file (relative to this directory) to place at the top of
 | 
			
		||||
# the title page.
 | 
			
		||||
#
 | 
			
		||||
# latex_logo = None
 | 
			
		||||
 | 
			
		||||
# For "manual" documents, if this is true, then toplevel headings are parts,
 | 
			
		||||
# not chapters.
 | 
			
		||||
#
 | 
			
		||||
# latex_use_parts = False
 | 
			
		||||
 | 
			
		||||
# If true, show page references after internal links.
 | 
			
		||||
#
 | 
			
		||||
# latex_show_pagerefs = False
 | 
			
		||||
 | 
			
		||||
# If true, show URL addresses after external links.
 | 
			
		||||
#
 | 
			
		||||
# latex_show_urls = False
 | 
			
		||||
 | 
			
		||||
# Documents to append as an appendix to all manuals.
 | 
			
		||||
#
 | 
			
		||||
# latex_appendices = []
 | 
			
		||||
 | 
			
		||||
# It false, will not define \strong, \code, 	itleref, \crossref ... but only
 | 
			
		||||
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
 | 
			
		||||
# packages.
 | 
			
		||||
#
 | 
			
		||||
# latex_keep_old_macro_names = True
 | 
			
		||||
 | 
			
		||||
# If false, no module index is generated.
 | 
			
		||||
#
 | 
			
		||||
# latex_domain_indices = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- 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, 'graphene', u'Graphene Documentation',
 | 
			
		||||
     [author], 1)
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# If true, show URL addresses after external links.
 | 
			
		||||
#
 | 
			
		||||
# man_show_urls = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- 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, 'Graphene', u'Graphene Documentation',
 | 
			
		||||
     author, 'Graphene', 'One line description of project.',
 | 
			
		||||
     'Miscellaneous'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Documents to append as an appendix to all manuals.
 | 
			
		||||
#
 | 
			
		||||
# texinfo_appendices = []
 | 
			
		||||
 | 
			
		||||
# If false, no module index is generated.
 | 
			
		||||
#
 | 
			
		||||
# texinfo_domain_indices = True
 | 
			
		||||
 | 
			
		||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
 | 
			
		||||
#
 | 
			
		||||
# texinfo_show_urls = 'footnote'
 | 
			
		||||
 | 
			
		||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
 | 
			
		||||
#
 | 
			
		||||
# texinfo_no_detailmenu = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Options for Epub output ----------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Bibliographic Dublin Core info.
 | 
			
		||||
epub_title = project
 | 
			
		||||
epub_author = author
 | 
			
		||||
epub_publisher = author
 | 
			
		||||
epub_copyright = copyright
 | 
			
		||||
 | 
			
		||||
# The basename for the epub file. It defaults to the project name.
 | 
			
		||||
# epub_basename = project
 | 
			
		||||
 | 
			
		||||
# The HTML theme for the epub output. Since the default themes are not
 | 
			
		||||
# optimized for small screen space, using the same theme for HTML and epub
 | 
			
		||||
# output is usually not wise. This defaults to 'epub', a theme designed to save
 | 
			
		||||
# visual space.
 | 
			
		||||
#
 | 
			
		||||
# epub_theme = 'epub'
 | 
			
		||||
 | 
			
		||||
# The language of the text. It defaults to the language option
 | 
			
		||||
# or 'en' if the language is not set.
 | 
			
		||||
#
 | 
			
		||||
# epub_language = ''
 | 
			
		||||
 | 
			
		||||
# The scheme of the identifier. Typical schemes are ISBN or URL.
 | 
			
		||||
# epub_scheme = ''
 | 
			
		||||
 | 
			
		||||
# 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 tuple containing the cover image and cover page html template filenames.
 | 
			
		||||
#
 | 
			
		||||
# epub_cover = ()
 | 
			
		||||
 | 
			
		||||
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
 | 
			
		||||
#
 | 
			
		||||
# epub_guide = ()
 | 
			
		||||
 | 
			
		||||
# HTML files that should be inserted before the pages created by sphinx.
 | 
			
		||||
# The format is a list of tuples containing the path and title.
 | 
			
		||||
#
 | 
			
		||||
# epub_pre_files = []
 | 
			
		||||
 | 
			
		||||
# HTML files that should be inserted after the pages created by sphinx.
 | 
			
		||||
# The format is a list of tuples containing the path and title.
 | 
			
		||||
#
 | 
			
		||||
# epub_post_files = []
 | 
			
		||||
 | 
			
		||||
# A list of files that should not be packed into the epub file.
 | 
			
		||||
epub_exclude_files = ['search.html']
 | 
			
		||||
 | 
			
		||||
# The depth of the table of contents in toc.ncx.
 | 
			
		||||
#
 | 
			
		||||
# epub_tocdepth = 3
 | 
			
		||||
 | 
			
		||||
# Allow duplicate toc entries.
 | 
			
		||||
#
 | 
			
		||||
# epub_tocdup = True
 | 
			
		||||
 | 
			
		||||
# Choose between 'default' and 'includehidden'.
 | 
			
		||||
#
 | 
			
		||||
# epub_tocscope = 'default'
 | 
			
		||||
 | 
			
		||||
# Fix unsupported image types using the Pillow.
 | 
			
		||||
#
 | 
			
		||||
# epub_fix_images = False
 | 
			
		||||
 | 
			
		||||
# Scale large images.
 | 
			
		||||
#
 | 
			
		||||
# epub_max_image_width = 0
 | 
			
		||||
 | 
			
		||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
 | 
			
		||||
#
 | 
			
		||||
# epub_show_urls = 'inline'
 | 
			
		||||
 | 
			
		||||
# If false, no index is generated.
 | 
			
		||||
#
 | 
			
		||||
# epub_use_index = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Example configuration for intersphinx: refer to the Python standard library.
 | 
			
		||||
intersphinx_mapping = {'https://docs.python.org/': None}
 | 
			
		||||
							
								
								
									
										11
									
								
								docs/index.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								docs/index.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
Graphene
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
Contents:
 | 
			
		||||
 | 
			
		||||
.. toctree::
 | 
			
		||||
   :maxdepth: 2
 | 
			
		||||
 | 
			
		||||
   quickstart
 | 
			
		||||
   types/index
 | 
			
		||||
   relay/index
 | 
			
		||||
							
								
								
									
										51
									
								
								docs/quickstart.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								docs/quickstart.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
Getting started
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
Let’s build a basic GraphQL schema from scratch.
 | 
			
		||||
 | 
			
		||||
Requirements
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
-  Python (2.7, 3.2, 3.3, 3.4, 3.5, pypy)
 | 
			
		||||
-  Graphene (1.0)
 | 
			
		||||
 | 
			
		||||
Project setup
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
    pip install graphene>=1.0
 | 
			
		||||
 | 
			
		||||
Creating a basic Schema
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
A GraphQL schema describes your data model, and provides a GraphQL
 | 
			
		||||
server with an associated set of resolve methods that know how to fetch
 | 
			
		||||
data.
 | 
			
		||||
 | 
			
		||||
We are going to create a very simple schema, with a ``Query`` with only
 | 
			
		||||
one field: ``hello``. And when we query it should return ``"World"``.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class Query(graphene.ObjectType):
 | 
			
		||||
        hello = graphene.String()
 | 
			
		||||
 | 
			
		||||
        def resolve_hello(self, args, context, info):
 | 
			
		||||
            return 'World'
 | 
			
		||||
 | 
			
		||||
    schema = graphene.Schema(query=Query)
 | 
			
		||||
 | 
			
		||||
Querying
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
Then, we can start querying our schema:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    result = schema.execute('{ hello }')
 | 
			
		||||
    print result.data['hello'] # "World"
 | 
			
		||||
 | 
			
		||||
Congrats! You got your first graphene schema working!
 | 
			
		||||
							
								
								
									
										45
									
								
								docs/relay/connection.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								docs/relay/connection.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,45 @@
 | 
			
		|||
Connection
 | 
			
		||||
==========
 | 
			
		||||
 | 
			
		||||
A connection is a vitaminized version of a List that provides ways of
 | 
			
		||||
slicing and paginating through it. The way you create Connection types
 | 
			
		||||
in ``graphene`` is using ``relay.Connection`` and ``relay.ConnectionField``.
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
If we want to create a custom Connection on a given node, we have to subclass the
 | 
			
		||||
``Connection`` class.
 | 
			
		||||
 | 
			
		||||
In the following example, ``extra`` will be an extra field in the connection,
 | 
			
		||||
and ``other`` an extra field in the Connection Edge.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class ShipConnection(Connection):
 | 
			
		||||
        extra = String()
 | 
			
		||||
 | 
			
		||||
        class Meta:
 | 
			
		||||
            node = Ship
 | 
			
		||||
 | 
			
		||||
        class Edge:
 | 
			
		||||
            other = String()
 | 
			
		||||
 | 
			
		||||
The ``ShipConnection`` connection class, will have automatically a ``pageInfo`` field,
 | 
			
		||||
and a ``edges`` field (which is a list of ``ShipConnection.Edge``).
 | 
			
		||||
This ``Edge`` will have a ``node`` field linking to the specified node
 | 
			
		||||
(in ``ShipConnection.Meta``) and the field ``other`` that we defined in the class.
 | 
			
		||||
 | 
			
		||||
Connection Field
 | 
			
		||||
----------------
 | 
			
		||||
You can create connection fields in any Connection, in case any ObjectType
 | 
			
		||||
that implements ``Node`` will have a default Connection.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class Faction(graphene.ObjectType):
 | 
			
		||||
        name = graphene.String()
 | 
			
		||||
        ships = relay.ConnectionField(ShipConnection)
 | 
			
		||||
 | 
			
		||||
        def resolve_ships(self, args, context, info):
 | 
			
		||||
            return []
 | 
			
		||||
							
								
								
									
										29
									
								
								docs/relay/index.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								docs/relay/index.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
Relay
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
Graphene has complete support for `Relay`_ and offers some utils to make
 | 
			
		||||
integration from Python easy.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. toctree::
 | 
			
		||||
   :maxdepth: 2
 | 
			
		||||
 | 
			
		||||
   nodes
 | 
			
		||||
   connection
 | 
			
		||||
   mutations
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Useful links
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
-  `Getting started with Relay`_
 | 
			
		||||
-  `Relay Global Identification Specification`_
 | 
			
		||||
-  `Relay Cursor Connection Specification`_
 | 
			
		||||
-  `Relay input Object Mutation`_
 | 
			
		||||
 | 
			
		||||
.. _Relay: https://facebook.github.io/relay/docs/graphql-relay-specification.html
 | 
			
		||||
.. _Relay specification: https://facebook.github.io/relay/graphql/objectidentification.htm#sec-Node-root-field
 | 
			
		||||
.. _Getting started with Relay: https://facebook.github.io/relay/docs/graphql-relay-specification.html
 | 
			
		||||
.. _Relay Global Identification Specification: https://facebook.github.io/relay/graphql/objectidentification.htm
 | 
			
		||||
.. _Relay Cursor Connection Specification: https://facebook.github.io/relay/graphql/connections.htm
 | 
			
		||||
.. _Relay input Object Mutation: https://facebook.github.io/relay/graphql/mutations.htm
 | 
			
		||||
							
								
								
									
										27
									
								
								docs/relay/mutations.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								docs/relay/mutations.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
Mutations
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
Most APIs don’t just allow you to read data, they also allow you to
 | 
			
		||||
write. In GraphQL, this is done using mutations. Just like queries,
 | 
			
		||||
Relay puts some additional requirements on mutations, but Graphene
 | 
			
		||||
nicely manages that for you. All you need to do is make your mutation a
 | 
			
		||||
subclass of ``relay.ClientIDMutation``.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class IntroduceShip(relay.ClientIDMutation):
 | 
			
		||||
 | 
			
		||||
        class Input:
 | 
			
		||||
            ship_name = graphene.String(required=True)
 | 
			
		||||
            faction_id = graphene.String(required=True)
 | 
			
		||||
 | 
			
		||||
        ship = graphene.Field(Ship)
 | 
			
		||||
        faction = graphene.Field(Faction)
 | 
			
		||||
 | 
			
		||||
        @classmethod
 | 
			
		||||
        def mutate_and_get_payload(cls, input, context, info):
 | 
			
		||||
            ship_name = input.get('ship_name')
 | 
			
		||||
            faction_id = input.get('faction_id')
 | 
			
		||||
            ship = create_ship(ship_name, faction_id)
 | 
			
		||||
            faction = get_faction(faction_id)
 | 
			
		||||
            return IntroduceShip(ship=ship, faction=faction)
 | 
			
		||||
							
								
								
									
										85
									
								
								docs/relay/nodes.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								docs/relay/nodes.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,85 @@
 | 
			
		|||
Nodes
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
A ``Node`` is an Interface provided by ``graphene.relay`` that contains
 | 
			
		||||
a single field ``id`` (which is a ``ID!``). Any object that inherits
 | 
			
		||||
from it have to implement a ``get_node`` method for retrieving a
 | 
			
		||||
``Node`` by an *id*.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
Example usage (taken from the `Starwars Relay example`_):
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class Ship(graphene.ObjectType):
 | 
			
		||||
        '''A ship in the Star Wars saga'''
 | 
			
		||||
        class Meta:
 | 
			
		||||
            interfaces = (relay.Node, )
 | 
			
		||||
 | 
			
		||||
        name = graphene.String(description='The name of the ship.')
 | 
			
		||||
 | 
			
		||||
        @classmethod
 | 
			
		||||
        def get_node(cls, id, context, info):
 | 
			
		||||
            return get_ship(id)
 | 
			
		||||
 | 
			
		||||
The ``id`` returned by the ``Ship`` type when you query it will be a
 | 
			
		||||
scalar which contains the enough info for the server for knowing it’s
 | 
			
		||||
type and it’s id.
 | 
			
		||||
 | 
			
		||||
For example, the instance ``Ship(id=1)`` will return ``U2hpcDox`` as the
 | 
			
		||||
id when you query it (which is the base64 encoding of ``Ship:1``), and
 | 
			
		||||
which could be useful later if we want to query a node by its id.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Custom Nodes
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
You can use the predefined ``relay.Node`` or you can subclass it, defining
 | 
			
		||||
custom ways of how a node id is encoded (using the ``to_global_id`` method in the class)
 | 
			
		||||
or how we can retrieve a Node given a encoded id (with the ``get_node_from_global_id`` method).
 | 
			
		||||
 | 
			
		||||
Example of a custom node:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class CustomNode(Node):
 | 
			
		||||
 | 
			
		||||
        class Meta:
 | 
			
		||||
            name = 'Node'
 | 
			
		||||
 | 
			
		||||
        @staticmethod
 | 
			
		||||
        def to_global_id(type, id):
 | 
			
		||||
            return '{}:{}'.format(type, id)
 | 
			
		||||
 | 
			
		||||
        @staticmethod
 | 
			
		||||
        def get_node_from_global_id(global_id, context, info):
 | 
			
		||||
            type, id = global_id.split(':')
 | 
			
		||||
            if type == 'User':
 | 
			
		||||
                return get_user(id)
 | 
			
		||||
            elif type == 'Photo':
 | 
			
		||||
                return get_photo(id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The ``get_node_from_global_id`` method will be called when ``CustomNode.Field`` is resolved.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Node Root field
 | 
			
		||||
---------------
 | 
			
		||||
 | 
			
		||||
As is required in the `Relay specification`_, the server must implement
 | 
			
		||||
a root field called ``node`` that returns a ``Node`` Interface.
 | 
			
		||||
 | 
			
		||||
For this reason, ``graphene`` provides the field ``relay.Node.Field``,
 | 
			
		||||
which links to any type in the Schema which implements ``Node``.
 | 
			
		||||
Example usage:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class Query(graphene.ObjectType):
 | 
			
		||||
        # Should be CustomNode.Field() if we want to use our custom Node
 | 
			
		||||
        node = relay.Node.Field()
 | 
			
		||||
 | 
			
		||||
.. _Starwars Relay example: https://github.com/graphql-python/graphene/blob/master/examples/starwars_relay/schema.py
 | 
			
		||||
							
								
								
									
										43
									
								
								docs/types/abstracttypes.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								docs/types/abstracttypes.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
AbstractTypes
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
An AbstractType contains fields that could be shared among
 | 
			
		||||
``graphene.ObjectType``, ``graphene.Interface``,
 | 
			
		||||
``graphene.InputObjectType`` or other ``graphene.AbstractType``.
 | 
			
		||||
 | 
			
		||||
The basics:
 | 
			
		||||
 | 
			
		||||
- Each AbstractType is a Python class that inherits from ``graphene.AbstractType``.
 | 
			
		||||
- Each attribute of the AbstractType represents a field (could be a ``graphene.Field`` or 
 | 
			
		||||
  ``graphene.InputField`` depending on where is mounted)
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
In this example UserFields is an ``AbstractType`` with a name. ``User`` and
 | 
			
		||||
``UserInput`` are two types that will have their own fields
 | 
			
		||||
plus the ones defined in ``UserFields``.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class UserFields(graphene.AbstractType):
 | 
			
		||||
        name = graphene.String()
 | 
			
		||||
 | 
			
		||||
    class User(graphene.ObjectType, UserFields):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    class UserInput(graphene.InputObjectType, UserFields):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. code:: graphql
 | 
			
		||||
 | 
			
		||||
    type User {
 | 
			
		||||
      name: String
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inputtype UserInput {
 | 
			
		||||
      name: String
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										67
									
								
								docs/types/enums.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								docs/types/enums.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
Enums
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
A ``Enum`` is a special ``GraphQL`` type that represents a set of
 | 
			
		||||
symbolic names (members) bound to unique, constant values.
 | 
			
		||||
 | 
			
		||||
Definition
 | 
			
		||||
----------
 | 
			
		||||
 | 
			
		||||
You can create an ``Enum`` using classes:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class Episode(graphene.Enum):
 | 
			
		||||
        NEWHOPE = 4
 | 
			
		||||
        EMPIRE = 5
 | 
			
		||||
        JEDI = 6
 | 
			
		||||
 | 
			
		||||
But also using instances of Enum:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    Episode = graphene.Enum('Episode', [('NEWHOPE', 4), ('EMPIRE', 5), ('JEDI', 6)])
 | 
			
		||||
 | 
			
		||||
Value descriptions
 | 
			
		||||
------------------
 | 
			
		||||
 | 
			
		||||
It's possible to add a description to a enum value, for that the the enum value
 | 
			
		||||
needs to have the ``description`` property on it.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class Episode(graphene.Enum):
 | 
			
		||||
        NEWHOPE = 4
 | 
			
		||||
        EMPIRE = 5
 | 
			
		||||
        JEDI = 6
 | 
			
		||||
 | 
			
		||||
        @property
 | 
			
		||||
        def description(self):
 | 
			
		||||
            if self == Episode.NEWHOPE:
 | 
			
		||||
                return 'New Hope Episode'
 | 
			
		||||
            return 'Other episode'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Usage with Python Enums
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
In case that the Enums are already defined it's possible to reuse them using
 | 
			
		||||
the ``Enum.from_enum`` function.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    graphene.Enum.from_enum(AlreadyExistingPyEnum)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Notes
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
Internally, ``graphene.Enum`` uses `enum.Enum`_ Python
 | 
			
		||||
implementation if available, or a backport if not.
 | 
			
		||||
 | 
			
		||||
So you can use it in the same way as you would do with Python
 | 
			
		||||
``enum.Enum``.
 | 
			
		||||
 | 
			
		||||
.. _``enum.Enum``: https://docs.python.org/3/library/enum.html
 | 
			
		||||
							
								
								
									
										13
									
								
								docs/types/index.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								docs/types/index.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
===============
 | 
			
		||||
Types Reference
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
.. toctree::
 | 
			
		||||
   :maxdepth: 1
 | 
			
		||||
 | 
			
		||||
   enums
 | 
			
		||||
   scalars
 | 
			
		||||
   interfaces
 | 
			
		||||
   abstracttypes
 | 
			
		||||
   objecttypes
 | 
			
		||||
   mutations
 | 
			
		||||
							
								
								
									
										60
									
								
								docs/types/interfaces.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								docs/types/interfaces.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
Interfaces
 | 
			
		||||
==========
 | 
			
		||||
 | 
			
		||||
An Interface contains the essential fields that will be implemented among
 | 
			
		||||
multiple ObjectTypes.
 | 
			
		||||
 | 
			
		||||
The basics:
 | 
			
		||||
- Each Interface is a Python class that inherits from ``graphene.Interface``.
 | 
			
		||||
- Each attribute of the Interface represents a GraphQL field.
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
This example model defines a Character, which has a name. ``Human`` and
 | 
			
		||||
``Droid`` are two of the Interface implementations.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class Character(graphene.Interface):
 | 
			
		||||
        name = graphene.String()
 | 
			
		||||
 | 
			
		||||
    # Human is a Character implementation
 | 
			
		||||
    class Human(ObjectType):
 | 
			
		||||
        class Meta:
 | 
			
		||||
            interfaces = (Character, )
 | 
			
		||||
 | 
			
		||||
        born_in = graphene.String()
 | 
			
		||||
 | 
			
		||||
    # Droid is a Character implementation
 | 
			
		||||
    class Droid(Character):
 | 
			
		||||
        class Meta:
 | 
			
		||||
            interfaces = (Character, )
 | 
			
		||||
 | 
			
		||||
        function = graphene.String()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**name** is a field in the ``Character`` interface that will be in both
 | 
			
		||||
``Human`` and ``Droid`` ObjectTypes (as those implement the ``Character``
 | 
			
		||||
interface). Each ObjectType also define extra fields at the same
 | 
			
		||||
time.
 | 
			
		||||
 | 
			
		||||
The above types would have the following representation in a schema:
 | 
			
		||||
 | 
			
		||||
.. code:: graphql
 | 
			
		||||
 | 
			
		||||
    interface Character {
 | 
			
		||||
      name: String
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type Droid implements Character {
 | 
			
		||||
      name: String
 | 
			
		||||
      function: String
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type Human implements Character {
 | 
			
		||||
      name: String
 | 
			
		||||
      bornIn: String
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										78
									
								
								docs/types/mutations.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								docs/types/mutations.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
Mutations
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
A Mutation is a special ObjectType that also defines an Input.
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
This example defines a Mutation:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class CreatePerson(graphene.Mutation):
 | 
			
		||||
        class Input:
 | 
			
		||||
            name = graphene.String()
 | 
			
		||||
 | 
			
		||||
        ok = graphene.Boolean()
 | 
			
		||||
        person = graphene.Field(lambda: Person)
 | 
			
		||||
 | 
			
		||||
        def mutate(self, args, context, info):
 | 
			
		||||
            person = Person(name=args.get('name'))
 | 
			
		||||
            ok = True
 | 
			
		||||
            return CreatePerson(person=person, ok=ok)
 | 
			
		||||
 | 
			
		||||
**person** and **ok** are the output fields of the Mutation when is
 | 
			
		||||
resolved.
 | 
			
		||||
 | 
			
		||||
**Input** attributes are the arguments that the Mutation
 | 
			
		||||
``CreatePerson`` needs for resolving, in this case **name** will be the
 | 
			
		||||
only argument for the mutation.
 | 
			
		||||
 | 
			
		||||
**mutate** is the function that will be applied once the mutation is
 | 
			
		||||
called.
 | 
			
		||||
 | 
			
		||||
So, we can finish our schema like this:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    # ... the Mutation Class
 | 
			
		||||
 | 
			
		||||
    class Person(graphene.ObjectType):
 | 
			
		||||
        name = graphene.String()
 | 
			
		||||
 | 
			
		||||
    class MyMutations(graphene.ObjectType):
 | 
			
		||||
        create_person = CreatePerson.Field()
 | 
			
		||||
 | 
			
		||||
    schema = graphene.Schema(mutation=MyMutations)
 | 
			
		||||
 | 
			
		||||
Executing the Mutation
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
Then, if we query (``schema.execute(query_str)``) the following:
 | 
			
		||||
 | 
			
		||||
.. code:: graphql
 | 
			
		||||
 | 
			
		||||
    mutation myFirstMutation {
 | 
			
		||||
        createPerson(name:"Peter") {
 | 
			
		||||
            person {
 | 
			
		||||
                name
 | 
			
		||||
            }
 | 
			
		||||
            ok
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
We should receive:
 | 
			
		||||
 | 
			
		||||
.. code:: json
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        "createPerson": {
 | 
			
		||||
            "person" : {
 | 
			
		||||
                name: "Peter"
 | 
			
		||||
            },
 | 
			
		||||
            "ok": true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										106
									
								
								docs/types/objecttypes.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								docs/types/objecttypes.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
ObjectTypes
 | 
			
		||||
===========
 | 
			
		||||
 | 
			
		||||
An ObjectType is the single, definitive source of information about your
 | 
			
		||||
data. It contains the essential fields and behaviors of the data you’re
 | 
			
		||||
querying.
 | 
			
		||||
 | 
			
		||||
The basics:
 | 
			
		||||
 | 
			
		||||
- Each ObjectType is a Python class that inherits 
 | 
			
		||||
  ``graphene.ObjectType`` or inherits an implemented `Interface`_.
 | 
			
		||||
- Each attribute of the ObjectType represents a ``Field``.
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
This example model defines a Person, which has a first\_name and
 | 
			
		||||
last\_name:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class Person(graphene.ObjectType):
 | 
			
		||||
        first_name = graphene.String()
 | 
			
		||||
        last_name = graphene.String()
 | 
			
		||||
        full_name = graphene.String()
 | 
			
		||||
 | 
			
		||||
        def resolve_full_name(self, args, context, info):
 | 
			
		||||
            return '{} {}'.format(self.first_name, self.last_name)
 | 
			
		||||
 | 
			
		||||
**first\_name** and **last\_name** are fields of the ObjectType. Each
 | 
			
		||||
field is specified as a class attribute, and each attribute maps to a
 | 
			
		||||
Field.
 | 
			
		||||
 | 
			
		||||
The above ``Person`` ObjectType would have the following representation
 | 
			
		||||
in a schema:
 | 
			
		||||
 | 
			
		||||
.. code:: graphql
 | 
			
		||||
 | 
			
		||||
    type Person {
 | 
			
		||||
      firstName: String
 | 
			
		||||
      lastName: String
 | 
			
		||||
      fullName: String
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Resolvers
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
A resolver is a method that resolves certain field within a
 | 
			
		||||
``ObjectType``. The resolver of a field will be, if not specified
 | 
			
		||||
otherwise, the ``resolve_{field_name}`` within the ``ObjectType``.
 | 
			
		||||
 | 
			
		||||
By default a resolver will take the ``args``, ``context`` and ``info``
 | 
			
		||||
arguments.
 | 
			
		||||
 | 
			
		||||
Quick example
 | 
			
		||||
~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
This example model defines a ``Query`` type, which has a reverse field
 | 
			
		||||
that reverses the given ``word`` argument using the ``resolve_reverse``
 | 
			
		||||
method in the class.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    class Query(graphene.ObjectType):
 | 
			
		||||
        reverse = graphene.String(word=graphene.String())
 | 
			
		||||
 | 
			
		||||
        def resolve_reverse(self, args, context, info):
 | 
			
		||||
            word = args.get('word')
 | 
			
		||||
            return word[::-1]
 | 
			
		||||
 | 
			
		||||
Resolvers outside the class
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
A field could also specify a custom resolver outside the class:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import graphene
 | 
			
		||||
 | 
			
		||||
    def reverse(root, args, context, info):
 | 
			
		||||
        word = args.get('word')
 | 
			
		||||
        return word[::-1]
 | 
			
		||||
 | 
			
		||||
    class Query(graphene.ObjectType):
 | 
			
		||||
        reverse = graphene.String(word=graphene.String(), resolver=reverse)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Instances as data containers
 | 
			
		||||
----------------------------
 | 
			
		||||
 | 
			
		||||
Graphene ``ObjectType``\ s could act as containers too. So with the
 | 
			
		||||
previous example you could do.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    peter = Person(first_name='Peter', last_name='Griffin')
 | 
			
		||||
 | 
			
		||||
    peter.first_name # prints "Peter"
 | 
			
		||||
    peter.last_name # prints "Griffin"
 | 
			
		||||
 | 
			
		||||
.. _Interface: /docs/interfaces/
 | 
			
		||||
							
								
								
									
										68
									
								
								docs/types/scalars.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								docs/types/scalars.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
Scalars
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
Graphene define the following base Scalar Types:
 | 
			
		||||
- ``graphene.String``
 | 
			
		||||
- ``graphene.Int``
 | 
			
		||||
- ``graphene.Float``
 | 
			
		||||
- ``graphene.Boolean``
 | 
			
		||||
- ``graphene.ID``
 | 
			
		||||
 | 
			
		||||
Graphene also provides custom scalars for Dates and JSON:
 | 
			
		||||
- ``graphene.types.datetime.DateTime``
 | 
			
		||||
- ``graphene.types.json.JSONString``
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Custom scalars
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
You can create a custom scalar for your schema.
 | 
			
		||||
The following is an example for creating a DateTime scalar:
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    import datetime
 | 
			
		||||
    from graphene.core.classtypes import Scalar
 | 
			
		||||
    from graphql.core.language import ast
 | 
			
		||||
 | 
			
		||||
    class DateTime(Scalar):
 | 
			
		||||
        '''DateTime Scalar Description'''
 | 
			
		||||
 | 
			
		||||
        @staticmethod
 | 
			
		||||
        def serialize(dt):
 | 
			
		||||
            return dt.isoformat()
 | 
			
		||||
 | 
			
		||||
        @staticmethod
 | 
			
		||||
        def parse_literal(node):
 | 
			
		||||
            if isinstance(node, ast.StringValue):
 | 
			
		||||
                return datetime.datetime.strptime(
 | 
			
		||||
                    node.value, "%Y-%m-%dT%H:%M:%S.%f")
 | 
			
		||||
 | 
			
		||||
        @staticmethod
 | 
			
		||||
        def parse_value(value):
 | 
			
		||||
            return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f")
 | 
			
		||||
 | 
			
		||||
Mounting Scalars
 | 
			
		||||
----------------
 | 
			
		||||
 | 
			
		||||
This scalars if are mounted in a ``ObjectType``, ``Interface`` or
 | 
			
		||||
``Mutation``, would act as ``Field``\ s.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    class Person(graphene.ObjectType):
 | 
			
		||||
        name = graphene.String()
 | 
			
		||||
 | 
			
		||||
    # Is equivalent to:
 | 
			
		||||
    class Person(graphene.ObjectType):
 | 
			
		||||
        name = graphene.Field(graphene.String())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
If the types are mounted in a ``Field``, would act as ``Argument``\ s.
 | 
			
		||||
 | 
			
		||||
.. code:: python
 | 
			
		||||
 | 
			
		||||
    graphene.Field(graphene.String(), to=graphene.String())
 | 
			
		||||
 | 
			
		||||
    # Is equivalent to:
 | 
			
		||||
    graphene.Field(graphene.String(), to=graphene.Argument(graphene.String()))
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user