Ejemplo n.º 1
0
 def test_entityref(self):
     md = dedent("""
     # Heading & 1
     ## Heading > 2
     ### Heading < 3
     """)
     expected = dedent("""
     Heading &amp; 1 - #heading-1
         Heading &gt; 2 - #heading-2
             Heading &lt; 3 - #heading-3
     """)
     toc = get_toc(get_markdown_toc(md))
     self.assertEqual(str(toc).strip(), expected)
     self.assertEqual(len(toc), 1)
Ejemplo n.º 2
0
 def test_indented_toc(self):
     md = dedent("""
     # Heading 1
     ## Heading 2
     ### Heading 3
     """)
     expected = dedent("""
     Heading 1 - #heading-1
         Heading 2 - #heading-2
             Heading 3 - #heading-3
     """)
     toc = get_toc(get_markdown_toc(md))
     self.assertEqual(str(toc).strip(), expected)
     self.assertEqual(len(toc), 1)
Ejemplo n.º 3
0
 def test_nav_external_links(self):
     nav_cfg = [
         {'Home': 'index.md'},
         {'Local': '/local.html'},
         {'External': 'http://example.com/external.html'}
     ]
     expected = dedent("""
     Page(title='Home', url='/')
     Link(title='Local', url='/local.html')
     Link(title='External', url='http://example.com/external.html')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files([File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])])
     with self.assertLogs('elstir', level='DEBUG') as cm:
         site_navigation = get_navigation(files, cfg)
     self.assertEqual(
         cm.output,
         [
             "DEBUG:elstir.structure.nav:An absolute path to '/local.html' is included in the "
             "'nav' configuration, which presumably points to an external resource.",
             "DEBUG:elstir.structure.nav:An external link to 'http://example.com/external.html' "
             "is included in the 'nav' configuration."
         ]
     )
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 3)
     self.assertEqual(len(site_navigation.pages), 1)
Ejemplo n.º 4
0
    def test_find_toc_by_id(self):
        """
        Test finding the relevant TOC item by the tag ID.
        """

        index = search_index.SearchIndex()

        md = dedent("""
        # Heading 1
        ## Heading 2
        ### Heading 3
        """)
        toc = get_toc(get_markdown_toc(md))

        toc_item = index._find_toc_by_id(toc, "heading-1")
        self.assertEqual(toc_item.url, "#heading-1")
        self.assertEqual(toc_item.title, "Heading 1")

        toc_item2 = index._find_toc_by_id(toc, "heading-2")
        self.assertEqual(toc_item2.url, "#heading-2")
        self.assertEqual(toc_item2.title, "Heading 2")

        toc_item3 = index._find_toc_by_id(toc, "heading-3")
        self.assertEqual(toc_item3.url, "#heading-3")
        self.assertEqual(toc_item3.title, "Heading 3")
Ejemplo n.º 5
0
 def test_nav_from_nested_files(self):
     expected = dedent("""
     Page(title=[blank], url='/')
     Section(title='About')
         Page(title=[blank], url='/about/license/')
         Page(title=[blank], url='/about/release-notes/')
     Section(title='Api guide')
         Page(title=[blank], url='/api-guide/debugging/')
         Page(title=[blank], url='/api-guide/running/')
         Page(title=[blank], url='/api-guide/testing/')
         Section(title='Advanced')
             Page(title=[blank], url='/api-guide/advanced/part-1/')
     """)
     cfg = load_config(site_url='http://example.com/')
     files = Files([
         File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('about/license.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('about/release-notes.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/debugging.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/running.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/advanced/part-1.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
     ])
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 3)
     self.assertEqual(len(site_navigation.pages), 7)
     self.assertEqual(repr(site_navigation.homepage), "Page(title=[blank], url='/')")
Ejemplo n.º 6
0
 def test_nav_bad_links(self):
     nav_cfg = [
         {'Home': 'index.md'},
         {'Missing': 'missing.html'},
         {'Bad External': 'example.com'}
     ]
     expected = dedent("""
     Page(title='Home', url='/')
     Link(title='Missing', url='missing.html')
     Link(title='Bad External', url='example.com')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files([File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])])
     with self.assertLogs('elstir', level='WARNING') as cm:
         site_navigation = get_navigation(files, cfg)
     self.assertEqual(
         cm.output,
         [
             "WARNING:elstir.structure.nav:A relative path to 'missing.html' is included "
             "in the 'nav' configuration, which is not found in the documentation files",
             "WARNING:elstir.structure.nav:A relative path to 'example.com' is included "
             "in the 'nav' configuration, which is not found in the documentation files"
         ]
     )
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 3)
     self.assertEqual(len(site_navigation.pages), 1)
Ejemplo n.º 7
0
 def test_yaml_meta_data_invalid(self):
     doc = dedent("""
         ---
         foo: bar: baz
         ---
         Doc body
         """)
     self.assertEqual(utils.meta.get_data(doc), (doc, {}))
Ejemplo n.º 8
0
 def test_yaml_meta_data_not_dict(self):
     doc = dedent("""
         ---
         - List item
         ---
         Doc body
         """)
     self.assertEqual(utils.meta.get_data(doc), (doc, {}))
Ejemplo n.º 9
0
 def test_mixed_html(self):
     md = dedent("""
     # Heading 1
     ## Heading 2
     # Heading 3
     ### Heading 4
     ### <a>Heading 5</a>
     """)
     expected = dedent("""
     Heading 1 - #heading-1
         Heading 2 - #heading-2
     Heading 3 - #heading-3
         Heading 4 - #heading-4
         Heading 5 - #heading-5
     """)
     toc = get_toc(get_markdown_toc(md))
     self.assertEqual(str(toc).strip(), expected)
     self.assertEqual(len(toc), 2)
Ejemplo n.º 10
0
    def test_unicode_yaml(self):

        yaml_src = dedent('''
            key: value
            key2:
              - value
            ''')

        config = utils.yaml_load(yaml_src)
        self.assertTrue(isinstance(config['key'], str))
        self.assertTrue(isinstance(config['key2'][0], str))
Ejemplo n.º 11
0
 def test_nav_from_files(self):
     expected = dedent("""
     Page(title=[blank], url='/')
     Page(title=[blank], url='/about/')
     """)
     cfg = load_config(site_url='http://example.com/')
     files = Files([
         File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('about.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
     ])
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 2)
     self.assertEqual(len(site_navigation.pages), 2)
     self.assertEqual(repr(site_navigation.homepage), "Page(title=[blank], url='/')")
Ejemplo n.º 12
0
    def test_level(self):
        md = dedent("""
        # Heading 1
        ## Heading 1.1
        ### Heading 1.1.1
        ### Heading 1.1.2
        ## Heading 1.2
        """)
        toc = get_toc(get_markdown_toc(md))

        def get_level_sequence(items):
            for item in items:
                yield item.level
                yield from get_level_sequence(item.children)

        self.assertEqual(tuple(get_level_sequence(toc)), (1, 2, 3, 3, 2))
Ejemplo n.º 13
0
    def test_mm_meta_data(self):
        doc = dedent("""
            Title: Foo Bar
            Date: 2018-07-10
            Summary: Line one
                Line two
            Tags: foo
            Tags: bar

            Doc body
            """)
        self.assertEqual(utils.meta.get_data(doc), ("Doc body", {
            'title': 'Foo Bar',
            'date': '2018-07-10',
            'summary': 'Line one Line two',
            'tags': 'foo bar'
        }))
Ejemplo n.º 14
0
 def test_nav_no_title(self):
     nav_cfg = [
         'index.md',
         {'About': 'about.md'}
     ]
     expected = dedent("""
     Page(title=[blank], url='/')
     Page(title='About', url='/about/')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files([
         File(nav_cfg[0], cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File(nav_cfg[1]['About'], cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
     ])
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 2)
     self.assertEqual(len(site_navigation.pages), 2)
Ejemplo n.º 15
0
 def test_nav_missing_page(self):
     nav_cfg = [
         {'Home': 'index.md'}
     ]
     expected = dedent("""
     Page(title='Home', url='/')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files([
         File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('page_not_in_nav.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
     ])
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 1)
     self.assertEqual(len(site_navigation.pages), 1)
     for file in files:
         self.assertIsInstance(file.page, Page)
Ejemplo n.º 16
0
    def test_env_var_in_yaml(self):

        yaml_src = dedent('''
            key1: !ENV VARNAME
            key2: !ENV UNDEFINED
            key3: !ENV [UNDEFINED, default]
            key4: !ENV [UNDEFINED, VARNAME, default]
            key5: !ENV BOOLVAR
            ''')
        config = utils.yaml_load(yaml_src)
        self.assertIsInstance(config['key1'], str)
        self.assertEqual(config['key1'], 'Hello, World!')
        self.assertIsNone(config['key2'])
        self.assertIsInstance(config['key3'], str)
        self.assertEqual(config['key3'], 'default')
        self.assertIsInstance(config['key4'], str)
        self.assertEqual(config['key4'], 'Hello, World!')
        self.assertIs(config['key5'], False)
Ejemplo n.º 17
0
 def test_page(title, filename, config):
     test_page = Page(
         title,
         File(filename, config['docs_dir'], config['site_dir'],
              config['use_directory_urls']), config)
     test_page.content = """
         <h1 id="heading-1">Heading 1</h1>
         <p>Content 1</p>
         <h2 id="heading-2">Heading 2</h1>
         <p>Content 2</p>
         <h3 id="heading-3">Heading 3</h1>
         <p>Content 3</p>"""
     test_page.markdown = dedent("""
         # Heading 1
         ## Heading 2
         ### Heading 3""")
     test_page.toc = get_toc(get_markdown_toc(test_page.markdown))
     return test_page
Ejemplo n.º 18
0
 def test_nav_no_directory_urls(self):
     nav_cfg = [
         {'Home': 'index.md'},
         {'About': 'about.md'}
     ]
     expected = dedent("""
     Page(title='Home', url='/index.html')
     Page(title='About', url='/about.html')
     """)
     cfg = load_config(nav=nav_cfg, use_directory_urls=False, site_url='http://example.com/')
     files = Files(
         [File(list(item.values())[0], cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
          for item in nav_cfg]
     )
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 2)
     self.assertEqual(len(site_navigation.pages), 2)
     self.assertEqual(repr(site_navigation.homepage), "Page(title='Home', url='/index.html')")
Ejemplo n.º 19
0
 def test_yaml_meta_data(self):
     doc = dedent("""
         ---
         Title: Foo Bar
         Date: 2018-07-10
         Summary: Line one
             Line two
         Tags:
             - foo
             - bar
         ---
         Doc body
         """)
     self.assertEqual(utils.meta.get_data(doc),
                      ("Doc body", {
                          'Title': 'Foo Bar',
                          'Date': datetime.date(2018, 7, 10),
                          'Summary': 'Line one Line two',
                          'Tags': ['foo', 'bar']
                      }))
Ejemplo n.º 20
0
    def test_nested_ungrouped_no_titles_windows(self):
        nav_cfg = [
            'index.md',
            'about\\contact.md',
            'about\\sub\\license.md',
        ]
        expected = dedent("""
        Page(title=[blank], url='/')
        Page(title=[blank], url='/about/contact/')
        Page(title=[blank], url='/about/sub/license/')
        """)

        cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
        files = Files(
            [File(item, cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']) for item in nav_cfg]
        )
        site_navigation = get_navigation(files, cfg)
        self.assertEqual(str(site_navigation).strip(), expected)
        self.assertEqual(len(site_navigation.items), 3)
        self.assertEqual(len(site_navigation.pages), 3)
Ejemplo n.º 21
0
 def test_nested_ungrouped_nav(self):
     nav_cfg = [
         {'Home': 'index.md'},
         {'Contact': 'about/contact.md'},
         {'License Title': 'about/sub/license.md'},
     ]
     expected = dedent("""
     Page(title='Home', url='/')
     Page(title='Contact', url='/about/contact/')
     Page(title='License Title', url='/about/sub/license/')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files(
         [File(list(item.values())[0], cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
          for item in nav_cfg]
     )
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 3)
     self.assertEqual(len(site_navigation.pages), 3)
Ejemplo n.º 22
0
 def test_indented_nav(self):
     nav_cfg = [
         {'Home': 'index.md'},
         {'API Guide': [
             {'Running': 'api-guide/running.md'},
             {'Testing': 'api-guide/testing.md'},
             {'Debugging': 'api-guide/debugging.md'},
             {'Advanced': [
                 {'Part 1': 'api-guide/advanced/part-1.md'},
             ]},
         ]},
         {'About': [
             {'Release notes': 'about/release-notes.md'},
             {'License': '/license.html'}
         ]},
         {'External': 'https://example.com/'}
     ]
     expected = dedent("""
     Page(title='Home', url='/')
     Section(title='API Guide')
         Page(title='Running', url='/api-guide/running/')
         Page(title='Testing', url='/api-guide/testing/')
         Page(title='Debugging', url='/api-guide/debugging/')
         Section(title='Advanced')
             Page(title='Part 1', url='/api-guide/advanced/part-1/')
     Section(title='About')
         Page(title='Release notes', url='/about/release-notes/')
         Link(title='License', url='/license.html')
     Link(title='External', url='https://example.com/')
     """)
     cfg = load_config(nav=nav_cfg, site_url='http://example.com/')
     files = Files([
         File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/running.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/debugging.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('api-guide/advanced/part-1.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
         File('about/release-notes.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']),
     ])
     site_navigation = get_navigation(files, cfg)
     self.assertEqual(str(site_navigation).strip(), expected)
     self.assertEqual(len(site_navigation.items), 4)
     self.assertEqual(len(site_navigation.pages), 6)
     self.assertEqual(repr(site_navigation.homepage), "Page(title='Home', url='/')")
     self.assertIsNone(site_navigation.items[0].parent)
     self.assertEqual(site_navigation.items[0].ancestors, [])
     self.assertIsNone(site_navigation.items[1].parent)
     self.assertEqual(site_navigation.items[1].ancestors, [])
     self.assertEqual(len(site_navigation.items[1].children), 4)
     self.assertEqual(repr(site_navigation.items[1].children[0].parent), "Section(title='API Guide')")
     self.assertEqual(site_navigation.items[1].children[0].ancestors, [site_navigation.items[1]])
     self.assertEqual(repr(site_navigation.items[1].children[1].parent), "Section(title='API Guide')")
     self.assertEqual(site_navigation.items[1].children[1].ancestors, [site_navigation.items[1]])
     self.assertEqual(repr(site_navigation.items[1].children[2].parent), "Section(title='API Guide')")
     self.assertEqual(site_navigation.items[1].children[2].ancestors, [site_navigation.items[1]])
     self.assertEqual(repr(site_navigation.items[1].children[3].parent), "Section(title='API Guide')")
     self.assertEqual(site_navigation.items[1].children[3].ancestors, [site_navigation.items[1]])
     self.assertEqual(len(site_navigation.items[1].children[3].children), 1)
     self.assertEqual(repr(site_navigation.items[1].children[3].children[0].parent), "Section(title='Advanced')")
     self.assertEqual(site_navigation.items[1].children[3].children[0].ancestors,
                      [site_navigation.items[1].children[3], site_navigation.items[1]])
     self.assertIsNone(site_navigation.items[2].parent)
     self.assertEqual(len(site_navigation.items[2].children), 2)
     self.assertEqual(repr(site_navigation.items[2].children[0].parent), "Section(title='About')")
     self.assertEqual(site_navigation.items[2].children[0].ancestors, [site_navigation.items[2]])
     self.assertEqual(repr(site_navigation.items[2].children[1].parent), "Section(title='About')")
     self.assertEqual(site_navigation.items[2].children[1].ancestors, [site_navigation.items[2]])
     self.assertIsNone(site_navigation.items[3].parent)
     self.assertEqual(site_navigation.items[3].ancestors, [])
     self.assertIsNone(site_navigation.items[3].children)
Ejemplo n.º 23
0
 def test_no_meta_data(self):
     doc = dedent("""
         Doc body
         """)
     self.assertEqual(utils.meta.get_data(doc), (doc, {}))
Ejemplo n.º 24
0
    def test_create_search_index(self):

        html_content = """
        <h1 id="heading-1">Heading 1</h1>
        <p>Content 1</p>
        <h2 id="heading-2">Heading 2</h1>
        <p>Content 2</p>
        <h3 id="heading-3">Heading 3</h1>
        <p>Content 3</p>
        """

        base_cfg = load_config()
        pages = [
            Page(
                'Home',
                File('index.md', base_cfg['docs_dir'], base_cfg['site_dir'],
                     base_cfg['use_directory_urls']), base_cfg),
            Page(
                'About',
                File('about.md', base_cfg['docs_dir'], base_cfg['site_dir'],
                     base_cfg['use_directory_urls']), base_cfg)
        ]

        md = dedent("""
        # Heading 1
        ## Heading 2
        ### Heading 3
        """)
        toc = get_toc(get_markdown_toc(md))

        full_content = ''.join("""Heading{0}Content{0}""".format(i)
                               for i in range(1, 4))

        plugin = search.SearchPlugin()
        errors, warnings = plugin.load_config({})

        for page in pages:
            # Fake page.read_source() and page.render()
            page.markdown = md
            page.toc = toc
            page.content = html_content

            index = search_index.SearchIndex(**plugin.config)
            index.add_entry_from_context(page)

            self.assertEqual(len(index._entries), 4)

            loc = page.url

            self.assertEqual(index._entries[0]['title'], page.title)
            self.assertEqual(strip_whitespace(index._entries[0]['text']),
                             full_content)
            self.assertEqual(index._entries[0]['location'], loc)

            self.assertEqual(index._entries[1]['title'], "Heading 1")
            self.assertEqual(index._entries[1]['text'], "Content 1")
            self.assertEqual(index._entries[1]['location'],
                             "{}#heading-1".format(loc))

            self.assertEqual(index._entries[2]['title'], "Heading 2")
            self.assertEqual(strip_whitespace(index._entries[2]['text']),
                             "Content2")
            self.assertEqual(index._entries[2]['location'],
                             "{}#heading-2".format(loc))

            self.assertEqual(index._entries[3]['title'], "Heading 3")
            self.assertEqual(strip_whitespace(index._entries[3]['text']),
                             "Content3")
            self.assertEqual(index._entries[3]['location'],
                             "{}#heading-3".format(loc))