Skip to content

Commit c0a7dab

Browse files
authored
feat: support library variables (#156)
1 parent 8faad27 commit c0a7dab

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed

docs/basic/state.md

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ state = PipelineRunState(
3232
])
3333
```
3434

35+
The following `RunParameterType` values are available:
36+
37+
* `RunParameterType.Parameter` to set a pipeline parameter: `@pipeline().parameters.<parameter_name>`
38+
* `RunParameterType.Global` to set a global parameter: `@pipeline().globalParameters.<global_parameter_name>`
39+
* `RunParameterType.System` to set a system parameter: `@pipeline().<system_parameter_name>`
40+
* `RunParameterType.Dataset` to set a dataset: `@dataset().<dataset_name>`
41+
* `RunParameterType.LinkedService` to set a linked service: `@linkedService().<linked_service_name>`
42+
* `RunParameterType.LibraryVariables` to set a library variable: `@pipeline().libraryVariables.<variable_name>`
43+
3544
### Activity results
3645

3746
In the scenario where an activity has an expression that references the output of another activity `activity('another_activity_name').output.some_field`, the `PipelineRunState` can be used to configure the output of the `another_activity_name` activity.

src/data_factory_testing_framework/_expression_runtime/expression_runtime.py

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ def evaluate(self, expression: str, state: PipelineRunState) -> str:
6464
and not state._contains_parameter_with_type_and_name(RunParameterType.Global, property_name)
6565
):
6666
raise ParameterNotFoundError(RunParameterType.Global, property_name) from e
67+
elif (
68+
f"pipeline().libraryVariables.{property_name}" in expression
69+
and not state._contains_parameter_with_type_and_name(
70+
RunParameterType.LibraryVariables, property_name
71+
)
72+
):
73+
raise ParameterNotFoundError(RunParameterType.LibraryVariables, property_name) from e
6774
elif (
6875
f"pipeline().dataset.{property_name}" in expression
6976
and not state._contains_parameter_with_type_and_name(RunParameterType.Dataset, property_name)

src/data_factory_testing_framework/_pythonnet/data_factory_testing_framework_expressions_evaluator.py

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def evaluate(expression: str, state: PipelineRunState) -> Union[str, int, float,
1616
parameters = {
1717
"globalParameters": {},
1818
"parameters": {},
19+
"libraryVariables": {},
1920
"dataset": {},
2021
"linkedService": {},
2122
}
@@ -27,6 +28,8 @@ def evaluate(expression: str, state: PipelineRunState) -> Union[str, int, float,
2728
parameters["globalParameters"][parameter.name] = parameter.value
2829
elif parameter.type == RunParameterType.Pipeline:
2930
parameters["parameters"][parameter.name] = parameter.value
31+
elif parameter.type == RunParameterType.LibraryVariables:
32+
parameters["libraryVariables"][parameter.name] = parameter.value
3033
elif parameter.type == RunParameterType.Dataset:
3134
parameters["dataset"][parameter.name] = parameter.value
3235
elif parameter.type == RunParameterType.LinkedService:

src/data_factory_testing_framework/state/_run_parameter_type.py

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class RunParameterType(str, Enum, metaclass=CaseInsensitiveEnumMeta):
99
Dataset = "Dataset"
1010
LinkedService = "LinkedService"
1111
System = "System"
12+
LibraryVariables = "LibraryVariables"
1213

1314
def __str__(self) -> str:
1415
"""Get the string representation of the enum.

tests/unit/functions/test_data_factory_testing_framework_expression_evaluator.py

+44
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,17 @@
7575
"value",
7676
id="pipeline_global_parameters_reference",
7777
),
78+
p(
79+
"@pipeline().libraryVariables.variable",
80+
PipelineRunState(
81+
parameters=[
82+
RunParameter(RunParameterType.LibraryVariables, "variable", "value"),
83+
]
84+
),
85+
"@pipeline().libraryVariables.variable",
86+
"value",
87+
id="pipeline_library_variables_reference",
88+
),
7889
p(
7990
"@variables('variable')",
8091
PipelineRunState(
@@ -724,6 +735,37 @@ def test_evaluate_system_variable_raises_exception_when_parameter_not_set() -> N
724735
assert str(exinfo.value) == "Parameter: 'RunId' of type 'RunParameterType.System' not found"
725736

726737

738+
def test_evaluate_library_variable() -> None:
739+
# Arrange
740+
expression = "@pipeline().libraryVariables.variable"
741+
expression_runtime = ExpressionRuntime()
742+
state = PipelineRunState(
743+
parameters=[
744+
RunParameter(RunParameterType.LibraryVariables, "variable", "value"),
745+
]
746+
)
747+
748+
# Act
749+
evaluated_value = expression_runtime.evaluate(expression, state)
750+
751+
# Assert
752+
assert evaluated_value == "value"
753+
754+
755+
def test_evaluate_library_variable_raises_exception_when_parameter_not_set() -> None:
756+
# Arrange
757+
expression = "@pipeline().libraryVariables.variable"
758+
expression_runtime = ExpressionRuntime()
759+
state = PipelineRunState()
760+
761+
# Act
762+
with pytest.raises(ParameterNotFoundError) as exinfo:
763+
expression_runtime.evaluate(expression, state)
764+
765+
# Assert
766+
assert str(exinfo.value) == "Parameter: 'variable' of type 'RunParameterType.LibraryVariables' not found"
767+
768+
727769
@pytest.mark.parametrize(
728770
["json_expression", "accessor", "expected"],
729771
[
@@ -967,6 +1009,7 @@ def test_conditional_expression_with_branching(
9671009
[
9681010
(RunParameterType.Pipeline, "pipeline().parameters"),
9691011
(RunParameterType.Global, "pipeline().globalParameters"),
1012+
(RunParameterType.LibraryVariables, "pipeline().libraryVariables"),
9701013
(RunParameterType.Dataset, "pipeline().dataset"),
9711014
(RunParameterType.LinkedService, "pipeline().linkedService"),
9721015
(RunParameterType.System, "pipeline()"),
@@ -990,6 +1033,7 @@ def test_complex_expression_with_missing_parameter(run_parameter_type: RunParame
9901033
"run_parameter_type, parameter_prefix",
9911034
[
9921035
(RunParameterType.Global, "pipeline().globalParameters"),
1036+
(RunParameterType.LibraryVariables, "pipeline().libraryVariables"),
9931037
(RunParameterType.Dataset, "pipeline().dataset"),
9941038
(RunParameterType.LinkedService, "pipeline().linkedService"),
9951039
(RunParameterType.System, "pipeline()"),

0 commit comments

Comments
 (0)