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
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)
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
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
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'
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
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')
def test_invalid_init(self): for v in (['1.2.3'], ('1.2.3', )): with pytest.raises(TypeError): VersionRange(v)
def test_invalid_version_range_identifier(self): with pytest.raises(error.InvalidVersionRangeIdentifier): VersionRange('<1,>2') with pytest.raises(error.InvalidVersionRangeIdentifier): VersionRange('a.b.c')
def test_range_hash(self): vr1_x = VersionRange('1.x') assert hash(vr1_x) == int(vr1_x)