aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter/interpreterobjects.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/interpreter/interpreterobjects.py')
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py77
1 files changed, 29 insertions, 48 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index d524059..262ff87 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -17,7 +17,7 @@ from ..interpreterbase import (
ContainerTypeInfo, KwargInfo,
InterpreterObject, MesonInterpreterObject, ObjectHolder, MutableInterpreterObject,
FeatureCheckBase, FeatureNewKwargs, FeatureNew, FeatureDeprecated,
- typed_pos_args, typed_kwargs, stringArgs, permittedKwargs,
+ typed_pos_args, typed_kwargs, permittedKwargs,
noArgsFlattening, noPosargs, noKwargs, permissive_unholder_return, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs,
flatten, resolve_second_level_holders, InterpreterException, InvalidArguments, InvalidCode)
from ..interpreter.type_checking import NoneType
@@ -30,9 +30,14 @@ import typing as T
if T.TYPE_CHECKING:
from . import kwargs
from .interpreter import Interpreter
- from ..environment import Environment
from ..envconfig import MachineInfo
+ from typing_extensions import TypedDict
+
+ class EnvironmentSeparatorKW(TypedDict):
+
+ separator: str
+
def extract_required_kwarg(kwargs: 'kwargs.ExtractRequired',
subproject: str,
@@ -229,76 +234,52 @@ class RunProcess(MesonInterpreterObject):
def stderr_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
return self.stderr
-# TODO: Parsing the initial values should be either done directly in the
-# `Interpreter` or in `build.EnvironmentVariables`. This way, this class
-# can be converted into a pure object holder.
-class EnvironmentVariablesObject(MutableInterpreterObject, MesonInterpreterObject):
- # TODO: Move the type cheking for initial_values out of this class and replace T.Any
- def __init__(self, initial_values: T.Optional[T.Any] = None, subproject: str = ''):
- super().__init__(subproject=subproject)
- self.vars = build.EnvironmentVariables()
+
+_ENV_SEPARATOR_KW = KwargInfo('separator', str, default=os.pathsep)
+
+
+class EnvironmentVariablesHolder(ObjectHolder[build.EnvironmentVariables], MutableInterpreterObject):
+
+ def __init__(self, obj: build.EnvironmentVariables, interpreter: 'Interpreter'):
+ super().__init__(obj, interpreter)
self.methods.update({'set': self.set_method,
'append': self.append_method,
'prepend': self.prepend_method,
})
- if isinstance(initial_values, dict):
- for k, v in initial_values.items():
- self.set_method([k, v], {})
- elif initial_values is not None:
- for e in mesonlib.listify(initial_values):
- if not isinstance(e, str):
- raise InterpreterException('Env var definition must be a list of strings.')
- if '=' not in e:
- raise InterpreterException('Env var definition must be of type key=val.')
- (k, val) = e.split('=', 1)
- k = k.strip()
- val = val.strip()
- if ' ' in k:
- raise InterpreterException('Env var key must not have spaces in it.')
- self.set_method([k, val], {})
def __repr__(self) -> str:
repr_str = "<{0}: {1}>"
- return repr_str.format(self.__class__.__name__, self.vars.envvars)
+ return repr_str.format(self.__class__.__name__, self.held_object.envvars)
- def unpack_separator(self, kwargs: T.Dict[str, T.Any]) -> str:
- separator = kwargs.get('separator', os.pathsep)
- if not isinstance(separator, str):
- raise InterpreterException("EnvironmentVariablesObject methods 'separator'"
- " argument needs to be a string.")
- return separator
+ def __deepcopy__(self, memo: T.Dict[str, object]) -> 'EnvironmentVariablesHolder':
+ # Avoid trying to copy the intepreter
+ return EnvironmentVariablesHolder(copy.deepcopy(self.held_object), self.interpreter)
def warn_if_has_name(self, name: str) -> None:
# Multiple append/prepend operations was not supported until 0.58.0.
- if self.vars.has_name(name):
+ if self.held_object.has_name(name):
m = f'Overriding previous value of environment variable {name!r} with a new one'
FeatureNew('0.58.0', m).use(self.subproject)
- @stringArgs
- @permittedKwargs({'separator'})
@typed_pos_args('environment.set', str, varargs=str, min_varargs=1)
- def set_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None:
+ @typed_kwargs('environment.set', _ENV_SEPARATOR_KW)
+ def set_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
name, values = args
- separator = self.unpack_separator(kwargs)
- self.vars.set(name, values, separator)
+ self.held_object.set(name, values, kwargs['separator'])
- @stringArgs
- @permittedKwargs({'separator'})
@typed_pos_args('environment.append', str, varargs=str, min_varargs=1)
- def append_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None:
+ @typed_kwargs('environment.append', _ENV_SEPARATOR_KW)
+ def append_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
name, values = args
- separator = self.unpack_separator(kwargs)
self.warn_if_has_name(name)
- self.vars.append(name, values, separator)
+ self.held_object.append(name, values, kwargs['separator'])
- @stringArgs
- @permittedKwargs({'separator'})
@typed_pos_args('environment.prepend', str, varargs=str, min_varargs=1)
- def prepend_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None:
+ @typed_kwargs('environment.prepend', _ENV_SEPARATOR_KW)
+ def prepend_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
name, values = args
- separator = self.unpack_separator(kwargs)
self.warn_if_has_name(name)
- self.vars.prepend(name, values, separator)
+ self.held_object.prepend(name, values, kwargs['separator'])
class ConfigurationDataObject(MutableInterpreterObject, MesonInterpreterObject):