Source code for pywebpack.helpers
# -*- coding: utf-8 -*-
#
# This file is part of PyWebpack
# Copyright (C) 2017-2020 CERN.
# Copyright (C) 2020 Cottage Labs LLP.
#
# PyWebpack is free software; you can redistribute it and/or modify
# it under the terms of the Revised BSD License; see LICENSE file for
# more details.
"""Webpack bundle API."""
from __future__ import absolute_import, print_function
from functools import wraps
import pkg_resources
from semver import max_satisfying
def _load_ep(ep):
mod = ep.load()
return mod() if callable(mod) else mod
[docs]def bundles_from_entry_point(group):
"""Load bundles from entry point group."""
return (_load_ep(ep) for ep in pkg_resources.iter_entry_points(group))
[docs]def cached(f):
"""Decorator to cache result of property."""
@wraps(f)
def inner(self):
name = "_{}".format(f.__name__)
if getattr(self, name, None) is None:
setattr(self, name, f(self))
return getattr(self, name)
return inner
[docs]def check_exit(f):
"""Decorator to ensure that an NPM process exited successfully."""
@wraps(f)
def inner(self, *args, **kwargs):
exit_code = f(self, *args, **kwargs)
if exit_code != 0:
raise RuntimeError("Process exited with code {}".format(exit_code))
return exit_code
return inner
[docs]def merge_deps(deps, bundles_deps):
"""Merge NPM dependencies."""
keys = ["dependencies", "devDependencies", "peerDependencies"]
for k in keys:
deps.setdefault(k, {})
if k in bundles_deps:
target_deps = deps[k]
source_deps = bundles_deps[k]
for pkg, version in source_deps.items():
if pkg in target_deps:
satisfying = max_satisfying([target_deps[pkg], version], "*", True)
target_deps[pkg] = satisfying
else:
target_deps[pkg] = version
return deps