Source code for okonomiyaki.repositories.grits

from ..bundled.traitlets import HasTraits, Enum, Instance
from ..errors import OkonomiyakiError
from ..file_formats import egg_name, split_egg_name
from ..platforms.epd_platform import EPD_PLATFORM_SHORT_NAMES, EPDPlatform

from .enpkg import EnpkgS3IndexEntry

_DEFAULT_QA_LEVEL = "stable"


[docs]class GritsEggEntry(HasTraits): """ This class models an egg entry metadata as required by Grits. Example ------- >>> entry = GritsEggEntry.from_egg("numpy-1.7.1-1.egg", "rh5-32", "free") # Grits key, metadata and tags are available as simple properties >>> entry.grits_key >>> entry.grits_metadata >>> entry.grits_tags """ platform = Enum(EPD_PLATFORM_SHORT_NAMES) qa_level = Enum(["stable", "staging", "ci"], _DEFAULT_QA_LEVEL) _enpkg_metadata = Instance(EnpkgS3IndexEntry) @property def repository_type(self): return self._enpkg_metadata.product @repository_type.setter def repository_type(self, value): self._enpkg_metadata.product = value @property def name(self): return self._enpkg_metadata.name @property def version(self): """The upstream version (not including the build number).""" return self._enpkg_metadata.version @property def build(self): return self._enpkg_metadata.build @property def egg_name(self): """The egg filename.""" return egg_name(self._enpkg_metadata.egg_basename, self.version, self.build) @property def grits_key(self): return "enthought/eggs/{0}/{1}".format(self.platform, self.egg_name) @property def python_version(self): return self._enpkg_metadata.python @property def grits_tags(self): tag_keys = ("accessible", "owned", "modifiable", "visible", "writable") if self.repository_type == "free": return dict((k, ["enthought-free"]) for k in tag_keys) elif self.repository_type == "commercial": tags = dict((k, ["enthought-commercial", "enthought-academic"]) for k in tag_keys) tags["visible"] = ["enthought-free"] return tags else: raise NotImplementedError( "Tags for repository type '{}' not implemented yet". format(self.repository)) @property def grits_metadata(self): ret = self._enpkg_metadata.to_dict() ret["platform"] = self.platform ret["qa_level"] = self.qa_level ret.pop("available") return ret @classmethod
[docs] def from_egg(cls, path, platform, repository_type="commercial", qa_level=_DEFAULT_QA_LEVEL): """Create a GritsEggEntry from an egg package. Parameters ---------- Parameters: str Path to the egg platform: str The consolidated platform (e.g. 'rh5-32') repository_type: str Type of repository: 'commercial' or 'free' """ enpkg_metadata = EnpkgS3IndexEntry.from_egg(path, repository_type) return cls( platform=platform, qa_level=qa_level, _enpkg_metadata=enpkg_metadata )
@classmethod def from_setuptools_egg(cls, path, platform=None): if platform is None: platform = EPDPlatform.from_running_system().short enpkg_metadata = EnpkgS3IndexEntry.from_setuptools_egg(path) return cls(platform=platform, _enpkg_metadata=enpkg_metadata) @classmethod def _from_grits_metadata(cls, data, platform): qa_level = data.pop("qa_level", _DEFAULT_QA_LEVEL) data.pop("name") enpkg_metadata = EnpkgS3IndexEntry.from_data(data) return cls( platform=platform, qa_level=qa_level, _enpkg_metadata=enpkg_metadata ) @classmethod def from_key_and_metadata(cls, key, data): platform = _grits_egg_key_to_platform(key) data = data.copy() data.setdefault("egg_basename", _grits_egg_key_to_egg_basename(key)) return cls._from_grits_metadata(data, platform)
def _grits_egg_key_to_platform(key): parts = key.split("/") return parts[2] def _grits_egg_key_to_egg_basename(key): parts = key.split("/") egg_name = parts[-1] if not egg_name.endswith(".egg"): raise OkonomiyakiError("Invalid grits key for eggs: {}".format(key)) else: return split_egg_name(egg_name)[0]