Source code for pykern.pkcli.rsmanifest
"""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
"""
#: 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, pkio, pkjson, pkcompat
import datetime
import json
fn = pkio.py_path(USER_FILE)
try:
values = pkjson.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=pkcompat.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