mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-10-29 23:17:47 +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