Ejemplo n.º 1
0
    def test_save_environment_json(self):
        config_data = {
            'build': {
                'image': '2.0',
            },
            'python': {
                'version': 2.7,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        python_env = Virtualenv(
            version=self.version,
            build_env=self.build_env,
            config=config,
        )

        with patch(
                'readthedocs.doc_builder.python_environments.PythonEnvironment.environment_json_path',
                return_value=tempfile.mktemp(suffix='envjson'),
        ):
            python_env.save_environment_json()
            json_data = json.load(open(python_env.environment_json_path()))

        expected_data = {
            'build': {
                'image': 'readthedocs/build:2.0',
                'hash': 'a1b2c3',
            },
            'python': {
                'version': 2.7,
            },
        }
        self.assertDictEqual(json_data, expected_data)
Ejemplo n.º 2
0
    def test_is_obsolete_with_json_missing_build_hash(self):
        config_data = {
            'build': {
                'image': '2.0',
                'hash': 'a1b2c3',
            },
            'python': {
                'version': 2.7,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        # Set container_image manually
        self.pip.container_image = 'readthedocs/build:2.0'
        self.pip.save()

        python_env = Virtualenv(
            version=self.version,
            build_env=self.build_env,
            config=config,
        )
        env_json_data = '{"build": {"image": "readthedocs/build:2.0"}, "python": {"version": 2.7}}'  # noqa
        with patch('os.path.exists') as exists, patch('readthedocs.doc_builder.python_environments.open', mock_open(read_data=env_json_data)) as _open:  # noqa
            exists.return_value = True
            self.assertTrue(python_env.is_obsolete)
Ejemplo n.º 3
0
    def test_build_respects_yaml(self):
        '''Test YAML build options'''
        project = get(Project,
                      slug='project-1',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      enable_pdf_build=False,
                      enable_epub_build=False,
                      versions=[fixture()])
        version = project.versions.all()[0]

        build_env = LocalEnvironment(project=project, version=version, build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load({
            'formats': ['epub']
        })()[0])
        task = UpdateDocsTask(build_env=build_env, project=project, python_env=python_env,
                              version=version, search=False, localmedia=False, config=config)
        task.build_docs()

        # The HTML and the Epub format were built.
        self.mocks.html_build.assert_called_once_with()
        self.mocks.epub_build.assert_called_once_with()
        # PDF however was disabled and therefore not built.
        self.assertFalse(self.mocks.pdf_build.called)
Ejemplo n.º 4
0
    def test_build(self):
        '''Test full build'''
        project = get(Project,
                      slug='project-1',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      versions=[fixture()])
        version = project.versions.all()[0]
        self.mocks.configure_mock('api_versions', {'return_value': [version]})
        self.mocks.configure_mock('api', {
            'get.return_value': {'downloads': "no_url_here"}
        })
        self.mocks.patches['html_build'].stop()

        build_env = LocalEnvironment(project=project, version=version, build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTask(build_env=build_env, project=project, python_env=python_env,
                              version=version, search=False, localmedia=False, config=config)
        task.build_docs()

        # Get command and check first part of command list is a call to sphinx
        self.assertEqual(self.mocks.popen.call_count, 3)
        cmd = self.mocks.popen.call_args_list[2][0]
        self.assertRegexpMatches(cmd[0][0], r'python')
        self.assertRegexpMatches(cmd[0][1], r'sphinx-build')
Ejemplo n.º 5
0
    def test_build(self):
        '''Test full build'''
        project = get(Project,
                      slug='project-1',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      versions=[fixture()])
        version = project.versions.all()[0]
        self.mocks.configure_mock('api_versions', {'return_value': [version]})
        self.mocks.configure_mock(
            'api', {'get.return_value': {
                'downloads': "no_url_here"
            }})
        self.mocks.patches['html_build'].stop()

        build_env = LocalEnvironment(project=project,
                                     version=version,
                                     build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTask(build_env=build_env,
                              project=project,
                              python_env=python_env,
                              version=version,
                              search=False,
                              localmedia=False,
                              config=config)
        task.build_docs()

        # Get command and check first part of command list is a call to sphinx
        self.assertEqual(self.mocks.popen.call_count, 3)
        cmd = self.mocks.popen.call_args_list[2][0]
        self.assertRegexpMatches(cmd[0][0], r'python')
        self.assertRegexpMatches(cmd[0][1], r'sphinx-build')
Ejemplo n.º 6
0
    def test_build_respects_epub_flag(self):
        '''Test build with epub enabled'''
        project = get(Project,
                      slug='project-1',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      enable_pdf_build=False,
                      enable_epub_build=True,
                      versions=[fixture()])
        version = project.versions.all()[0]

        build_env = LocalEnvironment(project=project,
                                     version=version,
                                     build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTask(build_env=build_env,
                              project=project,
                              python_env=python_env,
                              version=version,
                              search=False,
                              localmedia=False,
                              config=config)
        task.build_docs()

        # The HTML and the Epub format were built.
        self.mocks.html_build.assert_called_once_with()
        self.mocks.epub_build.assert_called_once_with()
        # PDF however was disabled and therefore not built.
        self.assertFalse(self.mocks.pdf_build.called)
    def test_is_obsolete_with_project_different_build_image(self):
        config_data = {
            'build': {
                'image': '2.0',
            },
            'python': {
                'version': 2.7,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        # Set container_image manually
        self.pip.container_image = 'readthedocs/build:latest'
        self.pip.save()

        python_env = Virtualenv(
            version=self.version,
            build_env=None,
            config=config,
        )
        env_json_data = '{"build": {"image": "readthedocs/build:2.0"}, "python": {"version": 2.7}}'
        with patch('os.path.exists') as exists, patch('readthedocs.doc_builder.python_environments.open', mock_open(read_data=env_json_data)) as _open:  # noqa
            exists.return_value = True
            self.assertTrue(python_env.is_obsolete)
Ejemplo n.º 8
0
    def test_is_obsolete_with_invalid_env_json_file(self):
        yaml_config = create_load()()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        with patch('os.path.exists') as exists:
            exists.return_value = True
            python_env = Virtualenv(
                version=self.version,
                build_env=self.build_env,
                config=config,
            )

        self.assertFalse(python_env.is_obsolete)
    def test_is_obsolete_with_invalid_env_json_file(self):
        yaml_config = create_load()()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        with patch('os.path.exists') as exists:
            exists.return_value = True
            python_env = Virtualenv(
                version=self.version,
                build_env=None,
                config=config,
            )

        self.assertFalse(python_env.is_obsolete)
Ejemplo n.º 10
0
    def test_build_pdf_latex_not_failure(self):
        '''Test pass during PDF builds and bad latex failure status code'''

        self.mocks.patches['html_build'].stop()
        self.mocks.patches['pdf_build'].stop()

        project = get(Project,
                      slug='project-2',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      enable_pdf_build=True,
                      enable_epub_build=False,
                      versions=[fixture()])
        version = project.versions.all()[0]
        assert project.conf_dir() == '/tmp/rtd'

        build_env = LocalBuildEnvironment(project=project,
                                          version=version,
                                          build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTaskStep(build_env=build_env,
                                  project=project,
                                  python_env=python_env,
                                  version=version,
                                  search=False,
                                  localmedia=False,
                                  config=config)

        # Mock out the separate calls to Popen using an iterable side_effect
        returns = [
            ((b'', b''), 0),  # sphinx-build html
            ((b'', b''), 0),  # sphinx-build pdf
            ((b'Output written on foo.pdf', b''), 1),  # latex
            ((b'', b''), 0),  # makeindex
            ((b'', b''), 0),  # latex
        ]
        mock_obj = mock.Mock()
        mock_obj.communicate.side_effect = [
            output for (output, status) in returns
        ]
        type(mock_obj).returncode = mock.PropertyMock(
            side_effect=[status for (output, status) in returns])
        self.mocks.popen.return_value = mock_obj

        with build_env:
            task.build_docs()
        self.assertEqual(self.mocks.popen.call_count, 7)
        self.assertTrue(build_env.successful)
Ejemplo n.º 11
0
    def test_build_pdf_latex_not_failure(self):
        '''Test pass during PDF builds and bad latex failure status code'''
        if six.PY3:
            import pytest
            pytest.xfail(
                "test_build_pdf_latex_not_failure is known to fail on 3.6")

        self.mocks.patches['html_build'].stop()
        self.mocks.patches['pdf_build'].stop()

        project = get(Project,
                      slug='project-2',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      enable_pdf_build=True,
                      enable_epub_build=False,
                      versions=[fixture()])
        version = project.versions.all()[0]
        assert project.conf_dir() == '/tmp/rtd'

        build_env = LocalEnvironment(project=project, version=version, build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTask(build_env=build_env, project=project, python_env=python_env,
                              version=version, search=False, localmedia=False, config=config)

        # Mock out the separate calls to Popen using an iterable side_effect
        returns = [
            (('', ''), 0),  # sphinx-build html
            (('', ''), 0),  # sphinx-build pdf
            (('Output written on foo.pdf', ''), 1),  # latex
            (('', ''), 0),  # makeindex
            (('', ''), 0),  # latex
        ]
        mock_obj = mock.Mock()
        mock_obj.communicate.side_effect = [output for (output, status)
                                            in returns]
        type(mock_obj).returncode = mock.PropertyMock(
            side_effect=[status for (output, status) in returns])
        self.mocks.popen.return_value = mock_obj

        with build_env:
            task.build_docs()
        self.assertEqual(self.mocks.popen.call_count, 7)
        self.assertTrue(build_env.successful)
Ejemplo n.º 12
0
    def test_build_pdf_latex_failures(self):
        '''Build failure if latex fails'''
        if six.PY3:
            import pytest
            pytest.xfail(
                "test_build_pdf_latex_failures is known to fail on 3.6")

        self.mocks.patches['html_build'].stop()
        self.mocks.patches['pdf_build'].stop()

        project = get(Project,
                      slug='project-1',
                      documentation_type='sphinx',
                      conf_py_file='test_conf.py',
                      enable_pdf_build=True,
                      enable_epub_build=False,
                      versions=[fixture()])
        version = project.versions.all()[0]
        assert project.conf_dir() == '/tmp/rtd'

        build_env = LocalEnvironment(project=project, version=version, build={})
        python_env = Virtualenv(version=version, build_env=build_env)
        config = ConfigWrapper(version=version, yaml_config=create_load()()[0])
        task = UpdateDocsTask(build_env=build_env, project=project, python_env=python_env,
                              version=version, search=False, localmedia=False, config=config)

        # Mock out the separate calls to Popen using an iterable side_effect
        returns = [
            (('', ''), 0),  # sphinx-build html
            (('', ''), 0),  # sphinx-build pdf
            (('', ''), 1),  # latex
            (('', ''), 0),  # makeindex
            (('', ''), 0),  # latex
        ]
        mock_obj = mock.Mock()
        mock_obj.communicate.side_effect = [output for (output, status)
                                            in returns]
        type(mock_obj).returncode = mock.PropertyMock(
            side_effect=[status for (output, status) in returns])
        self.mocks.popen.return_value = mock_obj

        with build_env:
            task.build_docs()
        self.assertEqual(self.mocks.popen.call_count, 7)
        self.assertTrue(build_env.failed)
Ejemplo n.º 13
0
    def test_is_obsolete_with_json_same_data_as_version(self):
        config_data = {
            'build': {
                'image': '2.0',
            },
            'python': {
                'version': 3.5,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        python_env = Virtualenv(
            version=self.version,
            build_env=self.build_env,
            config=config,
        )
        env_json_data = '{"build": {"image": "readthedocs/build:2.0", "hash": "a1b2c3"}, "python": {"version": 3.5}}'  # noqa
        with patch('os.path.exists') as exists, patch('readthedocs.doc_builder.python_environments.open', mock_open(read_data=env_json_data)) as _open:  # noqa
            exists.return_value = True
            self.assertFalse(python_env.is_obsolete)
    def test_is_obsolete_with_json_same_data_as_version(self):
        config_data = {
            'build': {
                'image': '2.0',
            },
            'python': {
                'version': 3.5,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        python_env = Virtualenv(
            version=self.version,
            build_env=None,
            config=config,
        )
        env_json_data = '{"build": {"image": "readthedocs/build:2.0"}, "python": {"version": 3.5}}'
        with patch('os.path.exists') as exists, patch('readthedocs.doc_builder.python_environments.open', mock_open(read_data=env_json_data)) as _open:  # noqa
            exists.return_value = True
            self.assertFalse(python_env.is_obsolete)
    def test_is_obsolete_with_json_different_build_image(self):
        config_data = {
            'build': {
                'image': 'latest',
            },
            'python': {
                'version': 2.7,
            },
        }
        yaml_config = create_load(config_data)()[0]
        config = ConfigWrapper(version=self.version, yaml_config=yaml_config)

        python_env = Virtualenv(
            version=self.version,
            build_env=None,
            config=config,
        )
        env_json_data = '{"build": {"image": "readthedocs/build:2.0"}, "python": {"version": 2.7}}'
        with patch('os.path.exists') as exists, patch(
                'readthedocs.doc_builder.python_environments.open',
                mock_open(read_data=env_json_data)) as _open:  # noqa
            exists.return_value = True
            self.assertTrue(python_env.is_obsolete)