Skip to content

Commit

Permalink
Add multi-module version of build_api_docs.py (#4038)
Browse files Browse the repository at this point in the history
Devsite uses two processes to publish the site: stable and nightly. They both call the same the `build_api_docs.py` script from the master branch. Also, the stable one uses the last released version of cirq, nightly uses master. Currently, due to the split of the modules, the `build_api_docs.py` script fails for the stable release (as cirq_google doesn't exist in v0.10 yet). This PR duplicates build_api_docs for stable and master.
  • Loading branch information
balopat committed Apr 21, 2021
1 parent 574652c commit 3953052
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 29 deletions.
41 changes: 12 additions & 29 deletions dev_tools/docs/build_api_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Tool to generate external api_docs for Cirq (Shameless copy from TFQ)."""
"""Tool to generate external api_docs for Cirq.
This version is for the stable docs building that uses the v0.10 monolithic cirq
module. This will be replaced with build_api_docs_multi_module.py after v0.11 is
released.
"""
import os
import sys
import types

import networkx
Expand All @@ -26,7 +29,6 @@
from tensorflow_docs.api_generator import public_api

import cirq
import cirq_google
from cirq import _doc

flags.DEFINE_string("output_dir", "/tmp/cirq_api", "Where to output the docs")
Expand All @@ -39,7 +41,7 @@

flags.DEFINE_bool("search_hints", True, "Include metadata search hints in the generated files")

flags.DEFINE_string("site_path", "reference/python", "Path prefix in the _toc.yaml")
flags.DEFINE_string("site_path", "quark/cirq/api_docs/python", "Path prefix in the _toc.yaml")

FLAGS = flags.FLAGS

Expand All @@ -62,11 +64,6 @@ def filter_unwanted_inherited_methods(path, parent, children):


def main(unused_argv):
generate_cirq()
generate_cirq_google()


def generate_cirq():
doc_generator = generate_lib.DocGenerator(
root_title="Cirq",
py_modules=[("cirq", cirq)],
Expand All @@ -75,31 +72,17 @@ def generate_cirq():
search_hints=FLAGS.search_hints,
site_path=FLAGS.site_path,
callbacks=[public_api.local_definitions_filter, filter_unwanted_inherited_methods],
extra_docs=_doc.RECORDED_CONST_DOCS,
)
doc_controls.decorate_all_class_attributes(
doc_controls.do_not_doc_inheritable, networkx.DiGraph, skip=[]
)
doc_generator.build(output_dir=FLAGS.output_dir)


def generate_cirq_google():
doc_generator = generate_lib.DocGenerator(
root_title="Cirq-google",
py_modules=[("cirq_google", cirq_google)],
base_dir=os.path.dirname(cirq_google.__file__),
code_url_prefix=FLAGS.code_url_prefix,
search_hints=FLAGS.search_hints,
site_path=FLAGS.site_path,
callbacks=[public_api.local_definitions_filter, filter_unwanted_inherited_methods],
private_map={
# Opt to not build docs for these paths for now since they error.
"cirq_google.engine.client.quantum.QuantumEngineServiceClient": ["enums"],
"cirq_google.engine.client.quantum_v1alpha1.QuantumEngineServiceClient": ["enums"],
"cirq_google.api": ["v1"],
"cirq.google.engine.client.quantum.QuantumEngineServiceClient": ["enums"],
"cirq.google.engine.client.quantum_v1alpha1.QuantumEngineServiceClient": ["enums"],
"cirq.google.api": ["v1"],
},
extra_docs=_doc.RECORDED_CONST_DOCS,
)
doc_controls.decorate_all_class_attributes(
doc_controls.do_not_doc_inheritable, networkx.DiGraph, skip=[]
)
doc_generator.build(output_dir=FLAGS.output_dir)


Expand Down
109 changes: 109 additions & 0 deletions dev_tools/docs/build_api_docs_multi_module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Copyright 2020 The Cirq Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Tool to generate external api_docs for Cirq.
This version is for the nightly docs building that uses the new modules, cirq-core and cirq-google.
"""

import os
import types

import networkx
from absl import app
from absl import flags
from tensorflow_docs.api_generator import doc_controls
from tensorflow_docs.api_generator import generate_lib
from tensorflow_docs.api_generator import public_api

import cirq
import cirq_google
from cirq import _doc

flags.DEFINE_string("output_dir", "/tmp/cirq_api", "Where to output the docs")

flags.DEFINE_string(
"code_url_prefix",
"https://github.com/quantumlib/cirq/tree/master/cirq",
"The url prefix for links to code.",
)

flags.DEFINE_bool("search_hints", True, "Include metadata search hints in the generated files")

flags.DEFINE_string("site_path", "reference/python", "Path prefix in the _toc.yaml")

FLAGS = flags.FLAGS


def filter_unwanted_inherited_methods(path, parent, children):
"""Filter the unwanted inherited methods.
CircuitDag inherits a lot of methods from `networkx.DiGraph` and `Graph`.
This filter removes these, as it creates a lot of noise in the API docs.
"""
if parent.__name__ != "CircuitDag":
return children

filtered_children = []
for name, obj in children:
if isinstance(obj, types.FunctionType):
if obj.__module__.startswith('cirq'):
filtered_children.append((name, obj))
return filtered_children


def main(unused_argv):
generate_cirq()
generate_cirq_google()


def generate_cirq():
doc_generator = generate_lib.DocGenerator(
root_title="Cirq",
py_modules=[("cirq", cirq)],
base_dir=os.path.dirname(cirq.__file__),
code_url_prefix=FLAGS.code_url_prefix,
search_hints=FLAGS.search_hints,
site_path=FLAGS.site_path,
callbacks=[public_api.local_definitions_filter, filter_unwanted_inherited_methods],
extra_docs=_doc.RECORDED_CONST_DOCS,
)
doc_controls.decorate_all_class_attributes(
doc_controls.do_not_doc_inheritable, networkx.DiGraph, skip=[]
)
doc_generator.build(output_dir=FLAGS.output_dir)


def generate_cirq_google():
doc_generator = generate_lib.DocGenerator(
root_title="Cirq-google",
py_modules=[("cirq_google", cirq_google)],
base_dir=os.path.dirname(cirq_google.__file__),
code_url_prefix=FLAGS.code_url_prefix,
search_hints=FLAGS.search_hints,
site_path=FLAGS.site_path,
callbacks=[public_api.local_definitions_filter, filter_unwanted_inherited_methods],
private_map={
# Opt to not build docs for these paths for now since they error.
"cirq_google.engine.client.quantum.QuantumEngineServiceClient": ["enums"],
"cirq_google.engine.client.quantum_v1alpha1.QuantumEngineServiceClient": ["enums"],
"cirq_google.api": ["v1"],
},
extra_docs=_doc.RECORDED_CONST_DOCS,
)
doc_generator.build(output_dir=FLAGS.output_dir)


if __name__ == "__main__":
app.run(main)

0 comments on commit 3953052

Please sign in to comment.