environment : added test, modified docs

This commit is contained in:
alalazo 2016-03-15 15:09:35 +01:00
parent 572cb93bf8
commit cc3d9f4eb7
4 changed files with 80 additions and 44 deletions

View file

@ -3,33 +3,40 @@
import collections
class SetEnv(object):
def __init__(self, name, value, **kwargs):
self.name = name
self.value = value
class AttributeHolder(object):
"""
Policy that permits to store any kind of attribute on self. The attributes must be passed as key/value pairs
during the initialization of the instance.
"""
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
class SetEnv(AttributeHolder):
def __init__(self, name, value, **kwargs):
super(SetEnv, self).__init__(**kwargs)
self.name = name
self.value = value
def execute(self):
os.environ[self.name] = str(self.value)
class UnsetEnv(object):
class UnsetEnv(AttributeHolder):
def __init__(self, name, **kwargs):
super(UnsetEnv, self).__init__(**kwargs)
self.name = name
for key, value in kwargs.items():
setattr(self, key, value)
def execute(self):
os.environ.pop(self.name, None) # Avoid throwing if the variable was not set
class AppendPath(object):
class AppendPath(AttributeHolder):
def __init__(self, name, path, **kwargs):
super(AppendPath, self).__init__(**kwargs)
self.name = name
self.path = path
for key, value in kwargs.items():
setattr(self, key, value)
def execute(self):
environment_value = os.environ.get(self.name, '')
@ -39,12 +46,11 @@ def execute(self):
os.environ[self.name] = ':'.join(directories)
class PrependPath(object):
class PrependPath(AttributeHolder):
def __init__(self, name, path, **kwargs):
super(PrependPath, self).__init__(**kwargs)
self.name = name
self.path = path
for key, value in kwargs.items():
setattr(self, key, value)
def execute(self):
environment_value = os.environ.get(self.name, '')
@ -54,12 +60,11 @@ def execute(self):
os.environ[self.name] = ':'.join(directories)
class RemovePath(object):
class RemovePath(AttributeHolder):
def __init__(self, name, path, **kwargs):
super(RemovePath, self).__init__(**kwargs)
self.name = name
self.path = path
for key, value in kwargs.items():
setattr(self, key, value)
def execute(self):
environment_value = os.environ.get(self.name, '')
@ -70,18 +75,26 @@ def execute(self):
class EnvironmentModifications(object):
"""
Keeps track of requests to modify the current environment
Keeps track of requests to modify the current environment.
"""
def __init__(self, other=None):
"""
Initializes a new instance, copying commands from other if it is not None
Args:
other: another instance of EnvironmentModifications from which (optional)
"""
self.env_modifications = []
if other is not None:
self._check_other(other)
self.env_modifications.extend(other.env_modifications)
self.extend(other)
def __iter__(self):
return iter(self.env_modifications)
def __len__(self):
return len(self.env_modifications)
def extend(self, other):
self._check_other(other)
self.env_modifications.extend(other.env_modifications)
@ -147,8 +160,18 @@ def remove_path(self, name, path, **kwargs):
def concatenate_paths(paths):
"""
Concatenates an iterable of paths into a column separated string
Args:
paths: iterable of paths
Returns:
column separated string
"""
return ':'.join(str(item) for item in paths)
def validate_environment_modifications(env):
modifications = collections.defaultdict(list)
for item in env:

View file

@ -985,30 +985,41 @@ def module(self):
def environment_modifications(self, dependent_spec):
"""
Called before the install() method of dependents.
Return the list of environment modifications needed by dependents (or extensions). Default implementation does
nothing, but this can be overridden by an extendable package to set up the install environment for its
extensions. This is useful if there are some common steps to installing all extensions for a certain package.
Example :
1. Installing python modules generally requires `PYTHONPATH` to point to the lib/pythonX.Y/site-packages
directory in the module's install prefix. This could set that variable.
2. A lot of Qt extensions need `QTDIR` set. This can be used to do that.
Args:
dependent_spec: dependent (or extension) of this spec
Returns:
instance of environment modifications
"""
return EnvironmentModifications()
def module_modifications(self, module, spec, dependent_spec):
"""Called before the install() method of dependents.
"""
Called before the install() method of dependents.
Default implementation does nothing, but this can be
overridden by an extendable package to set up the install
environment for its extensions. This is useful if there are
some common steps to installing all extensions for a
Default implementation does nothing, but this can be overridden by an extendable package to set up the module of
its extensions. This is useful if there are some common steps to installing all extensions for a
certain package.
Some examples:
1. Installing python modules generally requires PYTHONPATH to
point to the lib/pythonX.Y/site-packages directory in the
module's install prefix. This could set that variable.
2. Extensions often need to invoke the 'python' interpreter
from the Python installation being extended. This routine can
put a 'python' Execuable object in the module scope for the
extension package to simplify extension installs.
3. A lot of Qt extensions need QTDIR set. This can be used to do that.
Example :
1. Extensions often need to invoke the 'python' interpreter from the Python installation being extended.
This routine can put a 'python' Executable object in the module scope for the extension package to simplify
extension installs.
"""
pass

View file

@ -55,5 +55,11 @@ def test_extra_arguments(self):
apply_environment_modifications(env)
self.assertEqual('dummy value', os.environ['A'])
def test_copy(self):
pass
def test_extend(self):
env = EnvironmentModifications()
env.set_env('A', 'dummy value')
env.set_env('B', 3)
copy_construct = EnvironmentModifications(env)
self.assertEqual(len(copy_construct), 2)
for x, y in zip(env, copy_construct):
self.assertIs(x, y)

View file

@ -40,11 +40,13 @@ def env_flag(name):
return False
# FIXME : remove this function ?
def path_set(var_name, directories):
path_str = ":".join(str(dir) for dir in directories)
os.environ[var_name] = path_str
# FIXME : remove this function ?
def path_put_first(var_name, directories):
"""Puts the provided directories first in the path, adding them
if they're not already there.
@ -59,12 +61,6 @@ def path_put_first(var_name, directories):
path_set(var_name, new_path)
def pop_keys(dictionary, *keys):
for key in keys:
if key in dictionary:
dictionary.pop(key)
def dump_environment(path):
"""Dump the current environment out to a file."""
with open(path, 'w') as env_file: