示例#1
0
    def test_storage_sphinx_image_candidate(self):
        config = prepare_conf()

        assets_dir = os.path.join(self.test_dir, 'assets')
        sample_img = os.path.join(assets_dir, 'test.png')

        for mime_type in SUPPORTED_IMAGE_TYPES:
            ext = mimetypes.guess_extension(mime_type)

            # handle python 3.7 interpreter | image/x-ms-bmp -> image/bmp
            # https://bugs.python.org/issue22589
            if not ext and mime_type == 'image/x-ms-bmp':
                ext = mimetypes.guess_extension('image/bmp')

            self.assertIsNotNone(ext)

            pyver = 'py{}{}'.format(sys.version_info.major,
                                    sys.version_info.minor)
            doc_dir = prepare_dirs(
                postfix='-{}-docs-{}'.format(pyver, ext[1:]))
            out_dir = prepare_dirs(postfix='-{}-out-{}'.format(pyver, ext[1:]))

            # prepare documentation set
            #  - create and index document with an asterisk image extension
            #  - copies over an image which should be mapped; note that a real
            #     image is needed as the contents can be parsed through sphinx
            #     to see if its a real image before considering it to be a
            #     candidate
            os.makedirs(doc_dir)

            index_file = os.path.join(doc_dir, 'index.rst')
            with open(index_file, 'w') as f:
                f.write('.. image:: candidate.*')

            img_filename = 'candidate' + ext
            dummy_img_file = os.path.join(doc_dir, img_filename)
            shutil.copyfile(sample_img, dummy_img_file)

            # build and check
            build_sphinx(doc_dir, config=config, out_dir=out_dir)

            with parse('index', out_dir) as data:
                image = data.find('ac:image')
                self.assertIsNotNone(image)

                attachment = image.find('ri:attachment', recursive=False)
                self.assertIsNotNone(attachment)
                self.assertTrue(attachment.has_attr('ri:filename'))
                self.assertEqual(attachment['ri:filename'], img_filename)
示例#2
0
    def test_extensions(self):
        config = self.config.clone()
        config['confluence_sourcelink']['container'] += 'extensions/'
        config['extensions'].append('sphinx.ext.autodoc')
        config['extensions'].append('sphinx.ext.autosummary')
        config['extensions'].append('sphinx.ext.graphviz')
        config['extensions'].append('sphinx.ext.ifconfig')
        config['extensions'].append('sphinx.ext.inheritance_diagram')
        config['extensions'].append('sphinx.ext.todo')
        config['graphviz_output_format'] = 'svg'
        config['todo_include_todos'] = True
        config['todo_link_only'] = True

        # inject a navdoc from the last header/footer page, to the
        # extended autodocs start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev', 'Markdown Table',
                                         None)
            docnames.insert(0, '_validation_prev')
            builder.state.register_title('_validation_next',
                                         'Extended - autodocs', None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        dataset = os.path.join(self.datasets, 'extensions')
        doc_dir = prepare_dirs('validation-set-extensions')
        sys.path.insert(0, os.path.join(dataset, 'src'))

        build_sphinx(dataset, config=config, out_dir=doc_dir)

        sys.path.pop(0)
示例#3
0
    def test_extended_autodocs(self):
        if parse_version(sphinx_version) < parse_version('2.3.1'):
            raise unittest.SkipTest('breathe requires sphinx>=2.3.1')

        config = self.config.clone()
        config['confluence_sourcelink']['container'] += 'extended-autodocs/'
        config['extensions'].append('breathe')
        config['extensions'].append('sphinx.ext.autodoc')

        # inject a navdoc from the last header/footer page, to the
        # extended autodocs start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev', 'sphinx.ext.todo',
                                         None)
            docnames.insert(0, '_validation_prev')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        dataset = os.path.join(self.datasets, 'extended-autodocs')
        doc_dir = prepare_dirs('validation-set-extended-autodocs')
        xml_dir = os.path.join(dataset, 'xml')

        config['breathe_projects'] = {}
        for name in os.listdir(xml_dir):
            sample_dir = os.path.join(xml_dir, name)
            if os.path.isdir(sample_dir):
                config['breathe_projects'][name] = sample_dir

        build_sphinx(dataset, config=config, out_dir=doc_dir)
def process_raw_upload(target_sandbox):
    test_dir = os.path.dirname(os.path.realpath(__file__))
    base_dir = os.path.join(test_dir, os.pardir)
    sandbox_dir = os.path.join(base_dir, target_sandbox)
    raw_file = os.path.join(sandbox_dir, 'raw.conf')

    if not os.path.exists(raw_file):
        print('[sandbox] missing file', raw_file)
        return

    doc_dir = prepare_dirs('sandbox-raw')
    with prepare_sphinx(sandbox_dir, out_dir=doc_dir, relax=True) as app:
        publisher = ConfluencePublisher()
        publisher.init(app.config)
        publisher.connect()

        while True:
            data = {
                'labels': [],
            }

            with io.open(raw_file, 'r', encoding='utf-8') as f:
                data['content'] = f.read()

            print('[sandbox] publishing page...')
            try:
                publisher.store_page('raw', data)
            except ConfluenceBadApiError as ex:
                print('[sandbox] failed to publish content:', ex)

            print('[sandbox] any key to retry; q to quit')
            if input().lower() == 'q':
                break
示例#5
0
    def test_nonjsonresponse(self):
        config = dict(self.config)
        config['confluence_server_url'] = 'https://example.com/'
        dataset = os.path.join(self.datasets, 'base')
        doc_dir = prepare_dirs('validation-set-nonjsonresponse')

        with self.assertRaises(ConfluenceBadApiError):
            build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#6
0
    def test_hierarchy(self):
        config = dict(self.config)
        config['confluence_max_doc_depth'] = 2
        config['confluence_page_hierarchy'] = True

        dataset = os.path.join(self.datasets, 'hierarchy')
        doc_dir = prepare_dirs('validation-set-hierarchy')

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#7
0
    def test_header_footer(self):
        config = dict(self.config)

        dataset = os.path.join(self.datasets, 'header-footer')
        doc_dir = prepare_dirs('validation-set-hf')

        config['confluence_header_file'] = os.path.join(dataset, 'header.tpl')
        config['confluence_footer_file'] = os.path.join(dataset, 'footer.tpl')

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#8
0
def process_sandbox(target_sandbox, builder=None, defines=None):
    test_dir = os.path.dirname(os.path.realpath(__file__))
    base_dir = os.path.join(test_dir, os.pardir)
    sandbox_dir = os.path.join(base_dir, target_sandbox)

    container = 'sandbox-test'
    if builder:
        container += '-' + builder

    doc_dir = prepare_dirs(container)
    build_sphinx(sandbox_dir, out_dir=doc_dir, builder=builder,
        extra_config=defines, relax=True)
示例#9
0
    def test_standard_macro_restricted(self):
        config = dict(self.config)

        dataset = os.path.join(self.datasets, 'standard')
        doc_dir = prepare_dirs('validation-set-standard-nm')

        config['confluence_adv_restricted'] = [
            'anchor',
            'children',
            'code',
            'info',
            'viewfile',
            'jira'
        ]
        config['confluence_header_file'] = os.path.join(dataset, 'no-macro.tpl')
        config['confluence_publish_postfix'] = ' (nomacro)'

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#10
0
    def test_extensions(self):
        config = dict(self.config)
        config['extensions'].append('sphinx.ext.autodoc')
        config['extensions'].append('sphinx.ext.autosummary')
        config['extensions'].append('sphinx.ext.graphviz')
        config['extensions'].append('sphinx.ext.ifconfig')
        config['extensions'].append('sphinx.ext.inheritance_diagram')
        config['extensions'].append('sphinx.ext.todo')
        config['graphviz_output_format'] = 'svg'
        config['todo_include_todos'] = True
        config['todo_link_only'] = True

        dataset = os.path.join(self.datasets, 'extensions')
        doc_dir = prepare_dirs('validation-set-extensions')
        sys.path.insert(0, os.path.join(dataset, 'src'))

        build_sphinx(dataset, config=config, out_dir=doc_dir)

        sys.path.pop(0)
示例#11
0
    def test_standard_default(self):
        config = self.config.clone()
        config['confluence_sourcelink']['container'] += 'standard/'

        dataset = os.path.join(self.datasets, 'standard')
        doc_dir = prepare_dirs('validation-set-standard')

        # inject a navdoc to the header/footer start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev', self.test_key,
                                         None)
            docnames.insert(0, '_validation_prev')
            builder.state.register_title('_validation_next',
                                         'Header/footer example', None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#12
0
    def test_markdown(self):
        config = self.config.clone()
        config['confluence_sourcelink']['container'] += 'markdown/'
        config['extensions'].append('myst_parser')

        dataset = os.path.join(self.datasets, 'markdown')
        doc_dir = prepare_dirs('validation-set-markdown')

        # inject a navdoc from the last hierarchy example page, to the
        # extensions start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev',
                                         'Hierarchy example (d)', None)
            docnames.insert(0, '_validation_prev')
            builder.state.register_title('_validation_next', 'Extensions',
                                         None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#13
0
    def test_hierarchy(self):
        config = self.config.clone()
        config['confluence_max_doc_depth'] = 2
        config['confluence_page_hierarchy'] = True
        config['confluence_sourcelink']['container'] += 'hierarchy/'

        # inject a navdoc from the last "Header/footer" page, to the
        # markdown start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev',
                                         'Header/footer example (page c)',
                                         None)
            docnames.insert(0, '_validation_prev')
            builder.state.register_title('_validation_next', 'Markdown', None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        dataset = os.path.join(self.datasets, 'hierarchy')
        doc_dir = prepare_dirs('validation-set-hierarchy')

        build_sphinx(dataset, config=config, out_dir=doc_dir, relax=True)
示例#14
0
    def test_header_footer(self):
        config = self.config.clone()
        config['confluence_sourcelink']['container'] += 'header-footer/'

        dataset = os.path.join(self.datasets, 'header-footer')
        doc_dir = prepare_dirs('validation-set-hf')

        config['confluence_header_file'] = os.path.join(dataset, 'header.tpl')
        config['confluence_footer_file'] = os.path.join(dataset, 'footer.tpl')

        # inject a navdoc from the last "standard" page, to the
        # hierarchy example start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_prev',
                                         'Verification of content', None)
            docnames.insert(0, '_validation_prev')
            builder.state.register_title('_validation_next',
                                         'Hierarchy example', None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        build_sphinx(dataset, config=config, out_dir=doc_dir)
示例#15
0
    def setUpClass(cls):
        enable_sphinx_info()

        # build configuration
        space_key = os.getenv(SPACE_ENV_KEY, DEFAULT_TEST_SPACE)
        cls.config = prepare_conf()
        cls.config['confluence_disable_notifications'] = True
        cls.config['confluence_page_hierarchy'] = True
        cls.config['confluence_page_generation_notice'] = True
        cls.config['confluence_parent_page'] = None
        cls.config['confluence_prev_next_buttons_location'] = 'both'
        cls.config['confluence_publish'] = True
        cls.config['confluence_server_pass'] = os.getenv(AUTH_ENV_KEY)
        cls.config['confluence_server_url'] = DEFAULT_TEST_URL
        cls.config['confluence_server_user'] = DEFAULT_TEST_USER
        cls.config['confluence_sourcelink'] = {
            'type': 'github',
            'owner': 'sphinx-contrib',
            'repo': 'confluencebuilder',
            'container': 'tests/validation-sets/',
        }
        cls.config['confluence_space_key'] = space_key
        cls.config['confluence_timeout'] = 10
        cls.config['imgmath_font_size'] = 14
        cls.config['imgmath_image_format'] = 'svg'
        cls.config['imgmath_use_preview'] = True
        cls.config['manpages_url'] = 'https://example.org/{path}'
        cls.test_desc = os.getenv(TESTDESC_ENV_KEY, DEFAULT_TEST_DESC)
        cls.test_key = os.getenv(TESTKEY_ENV_KEY, DEFAULT_TEST_KEY)
        cls.test_version = os.getenv(TESTKEY_ENV_KEY, DEFAULT_TEST_VERSION)

        # overrides from user
        try:
            from validation_test_overrides import config_overrides
            cls.config.update(config_overrides)
        except ImportError:
            pass
        try:
            from validation_test_overrides import config_test_desc
            cls.test_desc = config_test_desc
        except ImportError:
            pass
        try:
            from validation_test_overrides import config_test_key
            cls.test_key = config_test_key
        except ImportError:
            pass
        try:
            from validation_test_overrides import config_test_version
            cls.test_version = config_test_version
        except ImportError:
            pass

        # finalize
        if cls.config['confluence_space_key'].startswith('~'):
            cls.config['confluence_root_homepage'] = False
        cls.config['confluence_publish_prefix'] = ''
        cls.config['confluence_publish_postfix'] = ''
        cls.config['confluence_purge'] = False
        cls.config['confluence_sourcelink']['version'] = cls.test_version
        cls.config['rst_epilog'] = """
.. |test_key| replace:: {}
.. |test_desc| replace:: {}
""".format(cls.test_key, cls.test_desc)

        # find validate-sets base folder
        test_dir = os.path.dirname(os.path.realpath(__file__))
        cls.datasets = os.path.join(test_dir, 'validation-sets')

        # setup base structure
        dataset = os.path.join(cls.datasets, 'base')
        doc_dir = prepare_dirs('validation-set-base')

        config = cls.config.clone()
        config['confluence_sourcelink']['container'] += 'base/'

        # inject a navdoc from the "standard" start page
        def navdocs_transform(builder, docnames):
            builder.state.register_title('_validation_next', 'Standard', None)
            docnames.append('_validation_next')
            return docnames

        config['confluence_navdocs_transform'] = navdocs_transform

        # build/publish test base page
        build_sphinx(dataset, config=config, out_dir=doc_dir)

        # finalize configuration for tests
        cls.config['confluence_parent_page'] = cls.test_key
        cls.config['confluence_purge'] = True
        cls.config['confluence_purge_from_root'] = True
        cls.config['confluence_root_homepage'] = False
示例#16
0
    def setUpClass(cls):
        enable_sphinx_info()

        # build configuration
        cls.config = prepare_conf()
        cls.config['confluence_disable_notifications'] = True
        cls.config['confluence_page_hierarchy'] = True
        cls.config['confluence_parent_page'] = None
        cls.config['confluence_publish'] = True
        cls.config['confluence_space_name'] = os.getenv(
            SPACE_ENV_KEY, DEFAULT_TEST_SPACE)
        cls.config['confluence_server_pass'] = os.getenv(AUTH_ENV_KEY)
        cls.config['confluence_server_url'] = DEFAULT_TEST_URL
        cls.config['confluence_server_user'] = DEFAULT_TEST_USER
        cls.config['confluence_timeout'] = 1
        cls.config['imgmath_font_size'] = 14
        cls.config['imgmath_image_format'] = 'svg'
        cls.config['imgmath_use_preview'] = True
        cls.config['manpages_url'] = 'https://example.org/{path}'
        cls.test_desc = os.getenv(TESTDESC_ENV_KEY, DEFAULT_TEST_DESC)
        cls.test_key = os.getenv(TESTKEY_ENV_KEY, DEFAULT_TEST_KEY)

        # overrides from user
        try:
            from validation_test_overrides import config_overrides
            cls.config.update(config_overrides)
        except ImportError:
            pass
        try:
            from validation_test_overrides import config_test_desc
            cls.test_desc = config_test_desc
        except ImportError:
            pass
        try:
            from validation_test_overrides import config_test_key
            cls.test_key = config_test_key
        except ImportError:
            pass

        # finalize
        if cls.config['confluence_space_name'].startswith('~'):
            cls.config['confluence_master_homepage'] = False
        else:
            cls.config['confluence_master_homepage'] = True
        cls.config['confluence_publish_prefix'] = ''
        cls.config['confluence_publish_postfix'] = ''
        cls.config['confluence_purge'] = False
        cls.config['rst_epilog'] = """
.. |test_key| replace:: {}
.. |test_desc| replace:: {}
""".format(cls.test_key, cls.test_desc)

        # find validate-sets base folder
        test_dir = os.path.dirname(os.path.realpath(__file__))
        cls.datasets = os.path.join(test_dir, 'validation-sets')

        # setup base structure
        dataset = os.path.join(cls.datasets, 'base')
        doc_dir = prepare_dirs('validation-set-base')

        # build/publish test base page
        build_sphinx(dataset, config=cls.config, out_dir=doc_dir)

        # finalize configuration for tests
        cls.config['confluence_master_homepage'] = False
        cls.config['confluence_parent_page'] = cls.test_key
        cls.config['confluence_prev_next_buttons_location'] = 'both'
        cls.config['confluence_purge'] = True
        cls.config['confluence_purge_from_master'] = True
示例#17
0
    def test_standard_default(self):
        dataset = os.path.join(self.datasets, 'standard')
        doc_dir = prepare_dirs('validation-set-standard')

        build_sphinx(dataset, config=self.config, out_dir=doc_dir)