def extract(): """Extract docs from tf namespace and write them to disk.""" visitor = doc_generator_visitor.DocGeneratorVisitor('tf') api_visitor = public_api.PublicAPIVisitor(visitor) # Access something in contrib so tf.contrib is properly loaded (it's hidden # behind lazy loading) _ = tf.contrib.__name__ # Exclude some libaries in contrib from the documentation altogether. # TODO(wicke): Shrink this list. api_visitor.do_not_descend_map.update({ 'contrib': [ 'compiler', 'factorization', 'grid_rnn', 'labeled_tensor', 'ndlstm', 'quantization', 'session_bundle', 'slim', 'solvers', 'specs', 'tensor_forest', 'tensorboard', 'testing', 'tfprof', ], 'contrib.bayesflow': [ 'entropy', 'monte_carlo', 'special_math', 'stochastic_gradient_estimators', 'stochastic_graph', 'stochastic_tensor', 'stochastic_variables', 'variational_inference' ], 'contrib.distributions': ['bijector'], 'contrib.ffmpeg': ['ffmpeg_ops'], 'contrib.graph_editor': ['edit', 'match', 'subgraph', 'transform', 'select', 'util'], 'contrib.layers': ['feature_column', 'summaries'], 'contrib.learn': [ 'datasets', 'head', 'graph_actions', 'io', 'models', 'monitors', 'ops', 'preprocessing', 'utils', ], 'contrib.util': ['loader'], }) traverse.traverse(tf, api_visitor) # tf_debug is not imported with tf, it's a separate module altogether visitor.set_root_name('tfdbg') traverse.traverse(tf_debug, api_visitor) return visitor
def test_duplicates(self): visitor = doc_generator_visitor.DocGeneratorVisitor() visitor('submodule.DocGeneratorVisitor', doc_generator_visitor.DocGeneratorVisitor, [('index', doc_generator_visitor.DocGeneratorVisitor.index), ('index2', doc_generator_visitor.DocGeneratorVisitor.index)]) visitor('submodule2.DocGeneratorVisitor', doc_generator_visitor.DocGeneratorVisitor, [('index', doc_generator_visitor.DocGeneratorVisitor.index), ('index2', doc_generator_visitor.DocGeneratorVisitor.index)]) visitor('DocGeneratorVisitor2', doc_generator_visitor.DocGeneratorVisitor, [('index', doc_generator_visitor.DocGeneratorVisitor.index), ('index2', doc_generator_visitor.DocGeneratorVisitor.index)]) # The shorter path should be master, or if equal, the lexicographically # first will be. self.assertEqual( { 'DocGeneratorVisitor2': sorted([ 'submodule.DocGeneratorVisitor', 'submodule2.DocGeneratorVisitor', 'DocGeneratorVisitor2' ]), 'DocGeneratorVisitor2.index': sorted([ 'submodule.DocGeneratorVisitor.index', 'submodule.DocGeneratorVisitor.index2', 'submodule2.DocGeneratorVisitor.index', 'submodule2.DocGeneratorVisitor.index2', 'DocGeneratorVisitor2.index', 'DocGeneratorVisitor2.index2' ]), }, visitor.duplicates) self.assertEqual( { 'submodule.DocGeneratorVisitor': 'DocGeneratorVisitor2', 'submodule.DocGeneratorVisitor.index': 'DocGeneratorVisitor2.index', 'submodule.DocGeneratorVisitor.index2': 'DocGeneratorVisitor2.index', 'submodule2.DocGeneratorVisitor': 'DocGeneratorVisitor2', 'submodule2.DocGeneratorVisitor.index': 'DocGeneratorVisitor2.index', 'submodule2.DocGeneratorVisitor.index2': 'DocGeneratorVisitor2.index', 'DocGeneratorVisitor2.index2': 'DocGeneratorVisitor2.index' }, visitor.duplicate_of) self.assertEqual( { id(doc_generator_visitor.DocGeneratorVisitor): 'DocGeneratorVisitor2', id(doc_generator_visitor.DocGeneratorVisitor.index): 'DocGeneratorVisitor2.index', }, visitor.reverse_index)
def test_call_class(self): visitor = doc_generator_visitor.DocGeneratorVisitor() visitor('DocGeneratorVisitor', doc_generator_visitor.DocGeneratorVisitor, [('index', doc_generator_visitor.DocGeneratorVisitor.index)]) self.assertEqual({'DocGeneratorVisitor': ['index']}, visitor.tree) self.assertEqual( { 'DocGeneratorVisitor': doc_generator_visitor.DocGeneratorVisitor, 'DocGeneratorVisitor.index': doc_generator_visitor.DocGeneratorVisitor.index }, visitor.index)
def test_call_module(self): visitor = doc_generator_visitor.DocGeneratorVisitor() visitor('doc_generator_visitor', doc_generator_visitor, [ ('DocGeneratorVisitor', doc_generator_visitor.DocGeneratorVisitor) ]) self.assertEqual({'doc_generator_visitor': ['DocGeneratorVisitor']}, visitor.tree) self.assertEqual( { 'doc_generator_visitor': doc_generator_visitor, 'doc_generator_visitor.DocGeneratorVisitor': doc_generator_visitor.DocGeneratorVisitor, }, visitor.index)
def extract(py_modules, do_not_descend_map): """Extract docs from tf namespace and write them to disk.""" # Traverse the first module. visitor = doc_generator_visitor.DocGeneratorVisitor(py_modules[0][0]) api_visitor = public_api.PublicAPIVisitor(visitor) add_dict_to_dict(do_not_descend_map, api_visitor.do_not_descend_map) traverse.traverse(py_modules[0][1], api_visitor) # Traverse all py_modules after the first: for module_name, module in py_modules[1:]: visitor.set_root_name(module_name) traverse.traverse(module, api_visitor) return visitor
def test_call_raises(self): visitor = doc_generator_visitor.DocGeneratorVisitor() with self.assertRaises(RuntimeError): visitor('non_class_or_module', 'non_class_or_module_object', [])