Exemplo n.º 1
0
    def test_last_version(self):
        v1 = Version('1.2.3')
        v2 = Version('4.5.6')

        assert last_version([v1, v2]) == v2
        assert last_version([v1, v2], VersionRange('1')) == v1
        assert last_version([v1, v2], VersionRange('4')) == v2
Exemplo n.º 2
0
def install(archive_path: str, delete_zip_file: bool = True):
    """Install a theme from a zip-file
    """
    logger.debug(
        'Requested theme installation from zip-file {}'.format(archive_path))

    # Create temporary directory
    tmp_dir_path = util.mk_tmp_dir(subdir='theme')

    try:
        # Extract archive to the temporary directory
        _extract_archive(archive_path, tmp_dir_path)

        # Try to initialize the theme to ensure everything is okay
        theme = _theme.Theme('tmp.theme.{}'.format(
            path.basename(tmp_dir_path)))

        # Install required pip packages
        for pkg_name, pkg_version in theme.requires['packages'].items():
            logger.info(
                "Theme '{}' requires pip package '{} {}', going to install it".
                format(theme.name, pkg_name, pkg_name, pkg_version))
            pip.install(pkg_name, pkg_version, True, reg.get('debug'))

        # Install required plugins
        for p_name, p_version in theme.requires['plugins'].items():
            if not plugman.is_installed(p_name, VersionRange(p_version)):
                logger.info(
                    "Theme '{}' requires plugin '{}', installing...".format(
                        theme.name, p_name, p_version))
                plugman.install(p_name, VersionRange(p_version))

        # Theme has been successfully initialized, so now it can be moved to the 'themes' package
        dst_path = path.join(_themes_path, theme.name)
        if path.exists(dst_path):
            logger.warn(
                "Existing theme installation at '{}' will be replaced with new one"
                .format(dst_path))
            rmtree(dst_path)

        # Move directory to the final location
        move(tmp_dir_path, dst_path)
        logger.debug("'{}' has been successfully moved to '{}'".format(
            tmp_dir_path, dst_path))

        reload.reload()

    finally:
        # Remove temporary directory
        if path.exists(tmp_dir_path):
            rmtree(tmp_dir_path)

        # Remove ZIP file
        if delete_zip_file:
            unlink(archive_path)
Exemplo n.º 3
0
    def test_version_in_range(self):
        vr1_x = VersionRange('1.x')
        vr1_1_x = VersionRange('1.1.x')

        v1 = Version('1')
        v1_1 = Version('1.1')
        v1_1_1 = Version('1.1.1')

        assert v1 in vr1_x
        assert v1_1 in vr1_x
        assert v1_1_1 in vr1_x

        assert v1 not in vr1_1_x
        assert v1_1 in vr1_1_x
        assert v1_1_1 in vr1_1_x
Exemplo n.º 4
0
    def test_range_in_range(self):
        vr1_x = VersionRange('1.x')

        assert VersionRange('1.2.3') in vr1_x
        assert '1.2.3' in vr1_x
        assert [VersionRange('1.2.3'), VersionRange('1.3.2')] in vr1_x

        assert VersionRange('3.2.1') not in vr1_x
        assert [VersionRange('3.2.1'), VersionRange('1.3.2')] not in vr1_x
Exemplo n.º 5
0
 def test_range_str(self):
     assert str(VersionRange('1.0.0')) == '==1.0.0'
     assert str(VersionRange('>=1')) == '>=1.0.0'
     assert str(VersionRange('1.0')) == '==1.0.*'
     assert str(VersionRange('1')) == '==1.*'
     assert str(VersionRange('>=1.2.3,<=3.2.1')) == '>=1.2.3,<=3.2.1'
     assert str(VersionRange('>1.2.3,<3.2.1')) == '>=1.2.4,<=3.2.0'
Exemplo n.º 6
0
    def load(self):
        """Load the theme
        """
        from plugins import assetman

        # Check for requirements
        try:
            package_info.check_requirements(self._package_name)
        except package_info.error.Error as e:
            raise RuntimeError('Error while loading theme {}: {}'.format(self._package_name, e))

        # Create translations directory
        lang_dir = path.join(self._path, 'res', 'lang')
        if not path.exists(lang_dir):
            makedirs(lang_dir, 0o755, True)

        # Create translation stub files
        for lng in lang.langs():
            lng_f_path = path.join(lang_dir, '{}.yml'.format(lng))
            if not path.exists(lng_f_path):
                with open(lng_f_path, 'wt'):
                    pass

        # Register translation resources
        lang.register_package(self._package_name)

        # Register template resources
        tpl_path = path.join(self._path, 'res', 'tpl')
        if not path.exists(tpl_path):
            makedirs(tpl_path, 0o755, True)
        tpl.register_package(self._package_name)

        # Register assetman resources
        assets_path = path.join(self._path, 'res', 'assets')
        if not path.exists(assets_path):
            makedirs(assets_path, 0o755, True)
        assetman.register_package(self._package_name)

        # Load required plugins
        for pn, pv in self._requires['plugins'].items():
            plugman.load(pn, VersionRange(pv))

        # Load theme's module
        try:
            self._module = import_module(self._package_name)
            if hasattr(self._module, 'theme_load') and callable(self._module.theme_load):
                self._module.theme_load()

            # theme_load_{env.type}() hook
            env_type = reg.get('env.type')
            hook_names = ['theme_load_{}'.format(env_type)]
            if env_type == 'wsgi':
                hook_names.append('theme_load_uwsgi')
            for hook_name in hook_names:
                if hasattr(self._module, hook_name):
                    getattr(self._module, hook_name)()

            logger.debug("Theme '{}' successfully loaded".format(self._package_name))
        except Exception as e:
            raise _error.ThemeLoadError("Error while loading theme package '{}': {}".format(self._package_name, e))

        # Compile assets
        if not reg.get('theme.compiled'):
            assetman.setup()
            assetman.build(self._package_name)
            reg.put('theme.compiled', True)

        self._is_loaded = True

        return self
Exemplo n.º 7
0
    def test_version_range(self):
        assert VersionRange('') == \
               VersionRange('*') == \
               VersionRange('*.*') == \
               VersionRange('*.*.*') == \
               VersionRange('x') == \
               VersionRange('x.x') == \
               VersionRange('x.x.x') == \
               VersionRange('>=0') == \
               VersionRange('<={}.{}.{}'.format(*[VERSION_PART_MAX for _ in range(3)]))

        assert VersionRange('1') == \
               VersionRange('1.*') == \
               VersionRange('1.*.*') == \
               VersionRange('1.x') == \
               VersionRange('1.x.x') == \
               VersionRange('^1') == \
               VersionRange('^1.0') == \
               VersionRange('==1') == \
               VersionRange('==1.x') == \
               VersionRange('==1.*') == \
               VersionRange('==1.x.x') == \
               VersionRange('==1.*.*') == \
               VersionRange('>=1,<=1.{}'.format(_MAX_MINOR_PATCH)) == \
               VersionRange('>0.{},<2'.format(_MAX_MINOR_PATCH))

        assert VersionRange('1.0') == \
               VersionRange('1.0.*') == \
               VersionRange('1.0.x') == \
               VersionRange('~1') == \
               VersionRange('~1.0') == \
               VersionRange('==1.0.x') == \
               VersionRange('==1.0.*') == \
               VersionRange('>=1.0,<=1.0.{}'.format(VERSION_PART_MAX)) == \
               VersionRange('>0.{},<1.1'.format(_MAX_MINOR_PATCH))

        assert VersionRange('1.0.0') == \
               VersionRange('==1.0.0')
Exemplo n.º 8
0
 def test_invalid_init(self):
     for v in (['1.2.3'], ('1.2.3', )):
         with pytest.raises(TypeError):
             VersionRange(v)
Exemplo n.º 9
0
    def test_invalid_version_range_identifier(self):
        with pytest.raises(error.InvalidVersionRangeIdentifier):
            VersionRange('<1,>2')

        with pytest.raises(error.InvalidVersionRangeIdentifier):
            VersionRange('a.b.c')
Exemplo n.º 10
0
    def test_range_hash(self):
        vr1_x = VersionRange('1.x')

        assert hash(vr1_x) == int(vr1_x)