Source code for metapack_build.package.csv

# Copyright (c) 2017 Civic Knowledge. This file is licensed under the terms of the
# MIT License, included in this distribution as LICENSE

""" """

from metapack import PackageError
from metapack.util import datetime_now
from metapack_build.package import PackageBuilder
from os.path import abspath
from rowgenerators import parse_app_url


[docs]class CsvPackageBuilder(PackageBuilder): """""" type_code = 'csv' type_suffix = '.csv' def __init__(self, source_ref=None, package_root=None, resource_root=None, callback=None, env=None): super().__init__(source_ref, package_root, callback, env) from metapack import MetapackPackageUrl self.package_path, self.cache_path = self.make_package_path(self.package_root, self.package_name) if self.package_root.proto == 'file': self.package_root.ensure_dir() if resource_root is not None: self.resource_root = resource_root else: self.resource_root = source_ref.dirname().as_type(MetapackPackageUrl) assert isinstance(self.resource_root, MetapackPackageUrl), (type(self.resource_root), self.resource_root) self._last_write_path = None
[docs] @classmethod def make_package_path(cls, package_root, package_name): # self.package_path, self.cache_path = self.make_package_path(self.package_name, self.package_root) cache_path = package_name + cls.type_suffix package_path = package_root.join(cache_path) return package_path, cache_path
def _load_resource(self, source_r, abs_path=False): """The CSV package has no reseources, so we just need to resolve the URLs to them. Usually, the CSV package is built from a file system ackage on a publically acessible server. """ r = self.doc.resource(source_r.name) r.url = self.resource_root.join(r.url).inner # r.resolved_url def _relink_documentation(self): for doc in self.doc['Documentation'].find(['Root.Documentation', 'Root.Image']): doc.url = doc.resolved_url
[docs] def save(self, path=None): from metapack import MetapackPackageUrl # HACK ... if not self.doc.ref: self.doc._ref = self.package_path # Really should not do this but ... self.check_is_ready() self.load_declares() self.doc.cleanse() self._load_resources() self._relink_documentation() self._clean_doc() if path is None: if self.package_path.inner.proto == 'file': path = self.package_path.path else: raise PackageError("Can't write doc to path: '{}'".format(path)) self.doc['Root'].get_or_new_term('Root.Issued').value = datetime_now() self._last_write_path = path self.doc.write_csv(path) return parse_app_url(abspath(path)).as_type(MetapackPackageUrl)