Source code for pykern.pkcli.rsmanifest

# -*- coding: utf-8 -*-
u"""Create and read global and user manifests.

:copyright: Copyright (c) 2017 RadiaSoft LLC.  All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from __future__ import absolute_import, division, print_function

#: Appears in each directory
BASENAME = 'rsmanifest.json'

#POSIT: https://github.com/radiasoft/containers/blob/master/bin/build build_rsmanifest()
#: Written once at build time
CONTAINER_FILE = '/' + BASENAME

#: Format version
FILE_VERSION = '20170217.180000'

#: Read and written multiple times as the run user
USER_FILE = '~/' + BASENAME

# Identifies codes which are not installed in a pyenv
_NO_PYENV = ''


[docs]def add_code(name, version, uri, source_d, virtual_env=None, pyenv=None): """Add a new code to ~?rsmanifest.json Args: name (str): name of the package version (str): commit or version uri (str): repo, source link source_d (str): directory containing virtual_env (str): DEPRECATED pyenv (str): pyenv version """ from pykern import pkcollections from pykern import pkio from pykern import pkjson import datetime import json fn = pkio.py_path(USER_FILE) try: values = pkcollections.json_load_any(fn) except Exception as e: if not (pkio.exception_is_not_found(e) or isinstance(e, ValueError)): raise values = pkcollections.Dict( version=FILE_VERSION, codes=pkcollections.Dict({_NO_PYENV: pkcollections.Dict()}), ) if pyenv: assert not virtual_env, \ 'only one of pyenv or virtual-env (DEPRECATED)' elif virtual_env: assert not pyenv, \ 'only one of pyenv or virtual-env (DEPRECATED)' pyenv = virtual_env if not pyenv: pyenv = _NO_PYENV v = values.codes.get(pyenv) or pkcollections.Dict() v[name.lower()] = pkcollections.Dict( installed=datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), name=name, source_d=source_d, uri=uri, version=version, ) values.codes[pyenv] = v pkjson.dump_pretty(values, filename=fn)
[docs]def pkunit_setup(): """Create rsmanifest files""" from pykern import pkjson pkjson.dump_pretty( { 'version': FILE_VERSION, 'image': { 'type': 'pkunit', }, }, filename=CONTAINER_FILE, ) add_code('pkunit', '1.1', 'https://pykern.org', '/tmp')
[docs]def read_all(): """Merge all manifests Returns: dict: merged data """ from pykern import pkio from pykern import pkjson fn = pkio.py_path(USER_FILE) # Both must exist or error u = pkjson.load_any(fn) c = pkjson.load_any(pkio.py_path(CONTAINER_FILE)) assert u.version == c.version, \ '(user.version) {} != {} (container.version)'.format(u.version, c.version) # There are "guaranteed" to be no collisions, but if there are # we override user. c.update(u) return c