Пример #1
0
    def test_docs_for_function_with_kwargs(self):
        index = {
            'test_function_with_args_kwargs': test_function_with_args_kwargs
        }
        reference_resolver = parser.ReferenceResolver(duplicate_of={},
                                                      doc_index={},
                                                      index=index,
                                                      py_module_names=['tf'])

        tree = {'': ['test_function_with_args_kwargs']}
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            tree=tree,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(
            full_name='test_function_with_args_kwargs',
            py_object=test_function_with_args_kwargs,
            parser_config=parser_config)

        # Make sure the brief docstring is present
        self.assertEqual(
            inspect.getdoc(test_function_with_args_kwargs).split('\n')[0],
            page_info.doc.brief)

        # Make sure the extracted signature is good.
        self.assertEqual(['unused_arg', '*unused_args', '**unused_kwargs'],
                         page_info.signature)
Пример #2
0
    def test_docs_for_function(self):
        index = {'test_function': test_function}
        reference_resolver = parser.ReferenceResolver(duplicate_of={},
                                                      doc_index={},
                                                      index=index,
                                                      py_module_names=['tf'])

        tree = {'': ['test_function']}
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            tree=tree,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='test_function',
                                           py_object=test_function,
                                           parser_config=parser_config)

        # Make sure the brief docstring is present
        self.assertEqual(
            inspect.getdoc(test_function).split('\n')[0], page_info.doc.brief)

        # Make sure the extracted signature is good.
        self.assertEqual(['unused_arg', "unused_kwarg='default'"],
                         page_info.signature)

        # Make sure this file is contained as the definition location.
        self.assertEqual(os.path.relpath(__file__, '/'),
                         page_info.defined_in.path)
 def make_parser_config(self, visitor, reference_resolver, guide_index,
                        base_dir):
     return parser.ParserConfig(reference_resolver=reference_resolver,
                                duplicates=visitor.duplicates,
                                tree=visitor.tree,
                                reverse_index=visitor.reverse_index,
                                guide_index=guide_index,
                                base_dir=base_dir)
Пример #4
0
    def get_test_objects(self):
        # These are all mutable objects, so rebuild them for each test.
        # Don't cache the objects.
        module = sys.modules[__name__]

        index = {
            'tf':
            sys,  # Can be any module, this test doesn't care about content.
            'tf.TestModule':
            module,
            'tf.test_function':
            test_function,
            'tf.TestModule.test_function':
            test_function,
            'tf.TestModule.TestClass':
            TestClass,
            'tf.TestModule.TestClass.ChildClass':
            TestClass.ChildClass,
            'tf.TestModule.TestClass.ChildClass.GrandChildClass':
            TestClass.ChildClass.GrandChildClass,
        }

        tree = {
            'tf': ['TestModule', 'test_function'],
            'tf.TestModule': ['test_function', 'TestClass'],
            'tf.TestModule.TestClass': ['ChildClass'],
            'tf.TestModule.TestClass.ChildClass': ['GrandChildClass'],
            'tf.TestModule.TestClass.ChildClass.GrandChildClass': []
        }

        duplicate_of = {'tf.test_function': 'tf.TestModule.test_function'}

        duplicates = {
            'tf.TestModule.test_function':
            ['tf.test_function', 'tf.TestModule.test_function']
        }

        base_dir = os.path.dirname(__file__)

        visitor = DummyVisitor(index, duplicate_of)

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates=duplicates,
            duplicate_of=duplicate_of,
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir=base_dir)

        return reference_resolver, parser_config
Пример #5
0
    def test_docs_for_class(self):

        index = {
            'TestClass': TestClass,
            'TestClass.a_method': TestClass.a_method,
            'TestClass.a_property': TestClass.a_property,
            'TestClass.ChildClass': TestClass.ChildClass,
            'TestClass.CLASS_MEMBER': TestClass.CLASS_MEMBER
        }

        visitor = DummyVisitor(index=index, duplicate_of={})

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        tree = {
            'TestClass':
            ['a_method', 'a_property', 'ChildClass', 'CLASS_MEMBER']
        }
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            duplicate_of={},
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='TestClass',
                                           py_object=TestClass,
                                           parser_config=parser_config)

        # Make sure the brief docstring is present
        self.assertEqual(
            six.ensure_str(tf_inspect.getdoc(TestClass)).split('\n')[0],
            page_info.doc.brief)

        # Make sure the method is present
        self.assertEqual(TestClass.a_method, page_info.methods[0].obj)

        # Make sure that the signature is extracted properly and omits self.
        self.assertEqual(["arg='default'"], page_info.methods[0].signature)

        # Make sure the property is present
        self.assertIs(TestClass.a_property, page_info.properties[0].obj)

        # Make sure there is a link to the child class and it points the right way.
        self.assertIs(TestClass.ChildClass, page_info.classes[0].obj)

        # Make sure this file is contained as the definition location.
        self.assertEqual(os.path.relpath(__file__, '/'),
                         page_info.defined_in.path)
Пример #6
0
    def test_docs_for_module(self):
        # Get the current module.
        module = sys.modules[__name__]

        index = {
            'TestModule': module,
            'TestModule.test_function': test_function,
            'TestModule.test_function_with_args_kwargs':
            test_function_with_args_kwargs,
            'TestModule.TestClass': TestClass,
        }

        visitor = DummyVisitor(index=index, duplicate_of={})

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        tree = {
            'TestModule':
            ['TestClass', 'test_function', 'test_function_with_args_kwargs']
        }
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            duplicate_of={},
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='TestModule',
                                           py_object=module,
                                           parser_config=parser_config)

        # Make sure the brief docstring is present
        self.assertEqual(
            tf_inspect.getdoc(module).split('\n')[0], page_info.doc.brief)

        # Make sure that the members are there
        funcs = {f_info.obj for f_info in page_info.functions}
        self.assertEqual({test_function, test_function_with_args_kwargs},
                         funcs)

        classes = {cls_info.obj for cls_info in page_info.classes}
        self.assertEqual({TestClass}, classes)

        # Make sure this file is contained as the definition location.
        self.assertEqual(os.path.relpath(__file__, '/'),
                         page_info.defined_in.path)
Пример #7
0
    def test_docs_for_message_class(self):
        class CMessage(object):
            def hidden(self):
                pass

        class Message(object):
            def hidden2(self):
                pass

        class MessageMeta(object):
            def hidden3(self):
                pass

        class ChildMessage(CMessage, Message, MessageMeta):
            def my_method(self):
                pass

        index = {
            'ChildMessage': ChildMessage,
            'ChildMessage.hidden': ChildMessage.hidden,
            'ChildMessage.hidden2': ChildMessage.hidden2,
            'ChildMessage.hidden3': ChildMessage.hidden3,
            'ChildMessage.my_method': ChildMessage.my_method,
        }

        visitor = DummyVisitor(index=index, duplicate_of={})

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        tree = {'ChildMessage': ['hidden', 'hidden2', 'hidden3', 'my_method']}

        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            duplicate_of={},
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='ChildMessage',
                                           py_object=ChildMessage,
                                           parser_config=parser_config)

        self.assertEqual(1, len(page_info.methods))
        self.assertEqual('my_method', page_info.methods[0].short_name)
Пример #8
0
    def test_namedtuple_field_order(self):
        namedtupleclass = collections.namedtuple(
            'namedtupleclass', {'z', 'y', 'x', 'w', 'v', 'u'})

        index = {
            'namedtupleclass': namedtupleclass,
            'namedtupleclass.u': namedtupleclass.u,
            'namedtupleclass.v': namedtupleclass.v,
            'namedtupleclass.w': namedtupleclass.w,
            'namedtupleclass.x': namedtupleclass.x,
            'namedtupleclass.y': namedtupleclass.y,
            'namedtupleclass.z': namedtupleclass.z,
        }

        visitor = DummyVisitor(index=index, duplicate_of={})

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        tree = {'namedtupleclass': {'u', 'v', 'w', 'x', 'y', 'z'}}
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            duplicate_of={},
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='namedtupleclass',
                                           py_object=namedtupleclass,
                                           parser_config=parser_config)

        # Each namedtiple field has a docstring of the form:
        #   'Alias for field number ##'. These props are returned sorted.

        def sort_key(prop_info):
            return int(prop_info.obj.__doc__.split(' ')[-1])

        self.assertSequenceEqual(page_info.properties,
                                 sorted(page_info.properties, key=sort_key))
Пример #9
0
    def test_docs_for_class_should_skip(self):
        class Parent(object):
            @doc_controls.do_not_doc_inheritable
            def a_method(self, arg='default'):
                pass

        class Child(Parent):
            def a_method(self, arg='default'):
                pass

        index = {
            'Child': Child,
            'Child.a_method': Child.a_method,
        }

        visitor = DummyVisitor(index=index, duplicate_of={})

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        tree = {
            'Child': ['a_method'],
        }

        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates={},
            duplicate_of={},
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir='/')

        page_info = parser.docs_for_object(full_name='Child',
                                           py_object=Child,
                                           parser_config=parser_config)

        # Make sure the `a_method` is not present
        self.assertEqual(0, len(page_info.methods))
Пример #10
0
    def test_write(self):
        module = sys.modules[__name__]

        index = {
            'tf':
            sys,  # Can be any module, this test doesn't care about content.
            'tf.TestModule':
            module,
            'tf.test_function':
            test_function,
            'tf.TestModule.test_function':
            test_function,
            'tf.TestModule.TestClass':
            TestClass,
            'tf.TestModule.TestClass.ChildClass':
            TestClass.ChildClass,
            'tf.TestModule.TestClass.ChildClass.GrandChildClass':
            TestClass.ChildClass.GrandChildClass,
        }

        tree = {
            'tf': ['TestModule', 'test_function'],
            'tf.TestModule': ['test_function', 'TestClass'],
            'tf.TestModule.TestClass': ['ChildClass'],
            'tf.TestModule.TestClass.ChildClass': ['GrandChildClass'],
            'tf.TestModule.TestClass.ChildClass.GrandChildClass': []
        }

        duplicate_of = {'tf.TestModule.test_function': 'tf.test_function'}

        duplicates = {
            'tf.test_function':
            ['tf.test_function', 'tf.TestModule.test_function']
        }

        output_dir = tempfile.mkdtemp()
        base_dir = os.path.dirname(__file__)

        reference_resolver = parser.ReferenceResolver(
            duplicate_of=duplicate_of,
            doc_index={},
            index=index,
            py_module_names=['tf'])
        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates=duplicates,
            tree=tree,
            reverse_index={},
            guide_index={},
            base_dir=base_dir)
        generate_lib.write_docs(output_dir,
                                parser_config,
                                duplicate_of,
                                index,
                                yaml_toc=True)

        # Make sure that the right files are written to disk.
        self.assertTrue(os.path.exists(os.path.join(output_dir, 'index.md')))
        self.assertTrue(os.path.exists(os.path.join(output_dir, 'tf.md')))
        self.assertTrue(os.path.exists(os.path.join(output_dir, '_toc.yaml')))
        self.assertTrue(
            os.path.exists(os.path.join(output_dir, 'tf/TestModule.md')))
        self.assertTrue(
            os.path.exists(os.path.join(output_dir, 'tf/test_function.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(output_dir, 'tf/TestModule/TestClass.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(output_dir,
                             'tf/TestModule/TestClass/ChildClass.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(
                    output_dir,
                    'tf/TestModule/TestClass/ChildClass/GrandChildClass.md')))
        # Make sure that duplicates are not written
        self.assertFalse(
            os.path.exists(
                os.path.join(output_dir, 'tf/TestModule/test_function.md')))
    def test_write(self):
        if sys.version_info >= (3, 0):
            self.skipTest(
                'Warning: Doc generation is not supported from python3.')

        module = sys.modules[__name__]

        index = {
            'tf':
            sys,  # Can be any module, this test doesn't care about content.
            'tf.TestModule':
            module,
            'tf.test_function':
            test_function,
            'tf.TestModule.test_function':
            test_function,
            'tf.TestModule.TestClass':
            TestClass,
            'tf.TestModule.TestClass.ChildClass':
            TestClass.ChildClass,
            'tf.TestModule.TestClass.ChildClass.GrandChildClass':
            TestClass.ChildClass.GrandChildClass,
        }

        tree = {
            'tf': ['TestModule', 'test_function'],
            'tf.TestModule': ['test_function', 'TestClass'],
            'tf.TestModule.TestClass': ['ChildClass'],
            'tf.TestModule.TestClass.ChildClass': ['GrandChildClass'],
            'tf.TestModule.TestClass.ChildClass.GrandChildClass': []
        }

        duplicate_of = {'tf.test_function': 'tf.TestModule.test_function'}

        duplicates = {
            'tf.TestModule.test_function':
            ['tf.test_function', 'tf.TestModule.test_function']
        }

        base_dir = os.path.dirname(__file__)

        visitor = DummyVisitor(index, duplicate_of)

        reference_resolver = parser.ReferenceResolver.from_visitor(
            visitor=visitor, doc_index={}, py_module_names=['tf'])

        parser_config = parser.ParserConfig(
            reference_resolver=reference_resolver,
            duplicates=duplicates,
            duplicate_of=duplicate_of,
            tree=tree,
            index=index,
            reverse_index={},
            guide_index={},
            base_dir=base_dir)

        output_dir = googletest.GetTempDir()

        generate_lib.write_docs(output_dir, parser_config, yaml_toc=True)

        # Make sure that the right files are written to disk.
        self.assertTrue(os.path.exists(os.path.join(output_dir, 'index.md')))
        self.assertTrue(os.path.exists(os.path.join(output_dir, 'tf.md')))
        self.assertTrue(os.path.exists(os.path.join(output_dir, '_toc.yaml')))
        self.assertTrue(
            os.path.exists(os.path.join(output_dir, 'tf/TestModule.md')))
        self.assertFalse(
            os.path.exists(os.path.join(output_dir, 'tf/test_function.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(output_dir, 'tf/TestModule/TestClass.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(output_dir,
                             'tf/TestModule/TestClass/ChildClass.md')))
        self.assertTrue(
            os.path.exists(
                os.path.join(
                    output_dir,
                    'tf/TestModule/TestClass/ChildClass/GrandChildClass.md')))
        # Make sure that duplicates are not written
        self.assertTrue(
            os.path.exists(
                os.path.join(output_dir, 'tf/TestModule/test_function.md')))