|
7 | 7 | _REPLACE_WITH_VALUE = True |
8 | 8 | _DO_NOT_DELETE_ORIGIN_VALUE = False |
9 | 9 | _DO_NOT_REPLACE_WITH_VALUE = False |
10 | | - |
| 10 | +_NO_KEY_TRANSFORMATIONS = None |
11 | 11 |
|
12 | 12 | @pytest.mark.parametrize( |
13 | 13 | [ |
|
16 | 16 | "field_path", |
17 | 17 | "delete_origin_value", |
18 | 18 | "replace_record", |
| 19 | + "key_transformation", |
19 | 20 | "expected_record", |
20 | 21 | ], |
21 | 22 | [ |
|
25 | 26 | ["field2"], |
26 | 27 | _DO_NOT_DELETE_ORIGIN_VALUE, |
27 | 28 | _DO_NOT_REPLACE_WITH_VALUE, |
| 29 | + _NO_KEY_TRANSFORMATIONS, |
28 | 30 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE}, |
29 | 31 | id="flatten by dpath, don't delete origin value", |
30 | 32 | ), |
|
34 | 36 | ["field2"], |
35 | 37 | _DELETE_ORIGIN_VALUE, |
36 | 38 | _DO_NOT_REPLACE_WITH_VALUE, |
| 39 | + _NO_KEY_TRANSFORMATIONS, |
37 | 40 | {"field1": _ANY_VALUE, "field3": _ANY_VALUE}, |
38 | 41 | id="flatten by dpath, delete origin value", |
39 | 42 | ), |
|
46 | 49 | ["field2", "*", "field4"], |
47 | 50 | _DO_NOT_DELETE_ORIGIN_VALUE, |
48 | 51 | _DO_NOT_REPLACE_WITH_VALUE, |
| 52 | + _NO_KEY_TRANSFORMATIONS, |
49 | 53 | { |
50 | 54 | "field1": _ANY_VALUE, |
51 | 55 | "field2": {"field3": {"field4": {"field5": _ANY_VALUE}}}, |
|
62 | 66 | ["field2", "*", "field4"], |
63 | 67 | _DELETE_ORIGIN_VALUE, |
64 | 68 | _DO_NOT_REPLACE_WITH_VALUE, |
| 69 | + _NO_KEY_TRANSFORMATIONS, |
65 | 70 | {"field1": _ANY_VALUE, "field2": {"field3": {}}, "field5": _ANY_VALUE}, |
66 | 71 | id="flatten by dpath with *, delete origin value", |
67 | 72 | ), |
|
71 | 76 | ["{{ config['field_path'] }}"], |
72 | 77 | _DO_NOT_DELETE_ORIGIN_VALUE, |
73 | 78 | _DO_NOT_REPLACE_WITH_VALUE, |
| 79 | + _NO_KEY_TRANSFORMATIONS, |
74 | 80 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE}, |
75 | 81 | id="flatten by dpath from config, don't delete origin value", |
76 | 82 | ), |
|
80 | 86 | ["non-existing-field"], |
81 | 87 | _DO_NOT_DELETE_ORIGIN_VALUE, |
82 | 88 | _DO_NOT_REPLACE_WITH_VALUE, |
| 89 | + _NO_KEY_TRANSFORMATIONS, |
83 | 90 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
84 | 91 | id="flatten by non-existing dpath, don't delete origin value", |
85 | 92 | ), |
|
89 | 96 | ["*", "non-existing-field"], |
90 | 97 | _DO_NOT_DELETE_ORIGIN_VALUE, |
91 | 98 | _DO_NOT_REPLACE_WITH_VALUE, |
| 99 | + _NO_KEY_TRANSFORMATIONS, |
92 | 100 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
93 | 101 | id="flatten by non-existing dpath with *, don't delete origin value", |
94 | 102 | ), |
|
98 | 106 | ["field2"], |
99 | 107 | _DO_NOT_DELETE_ORIGIN_VALUE, |
100 | 108 | _DO_NOT_REPLACE_WITH_VALUE, |
| 109 | + _NO_KEY_TRANSFORMATIONS, |
101 | 110 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE}, |
102 | 111 | id="flatten by dpath, not to update when record has field conflicts, don't delete origin value", |
103 | 112 | ), |
|
107 | 116 | ["field2"], |
108 | 117 | _DO_NOT_DELETE_ORIGIN_VALUE, |
109 | 118 | _DO_NOT_REPLACE_WITH_VALUE, |
| 119 | + _NO_KEY_TRANSFORMATIONS, |
110 | 120 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE}, |
111 | 121 | id="flatten by dpath, not to update when record has field conflicts, delete origin value", |
112 | 122 | ), |
|
116 | 126 | ["field2"], |
117 | 127 | _DO_NOT_DELETE_ORIGIN_VALUE, |
118 | 128 | _REPLACE_WITH_VALUE, |
| 129 | + _NO_KEY_TRANSFORMATIONS, |
119 | 130 | {"field3": _ANY_VALUE}, |
120 | 131 | id="flatten by dpath, replace with value", |
121 | 132 | ), |
|
125 | 136 | ["field2"], |
126 | 137 | _DELETE_ORIGIN_VALUE, |
127 | 138 | _REPLACE_WITH_VALUE, |
| 139 | + _NO_KEY_TRANSFORMATIONS, |
128 | 140 | {"field3": _ANY_VALUE}, |
129 | 141 | id="flatten by dpath, delete_origin_value do not affect to replace_record", |
130 | 142 | ), |
| 143 | + pytest.param( |
| 144 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 145 | + {}, |
| 146 | + ["field2"], |
| 147 | + _DO_NOT_DELETE_ORIGIN_VALUE, |
| 148 | + _DO_NOT_REPLACE_WITH_VALUE, |
| 149 | + "field2_{{ key }}", |
| 150 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field2_field3": _ANY_VALUE}, |
| 151 | + id="flatten by dpath, not delete origin value, add keys transformation", |
| 152 | + ), |
| 153 | + pytest.param( |
| 154 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 155 | + {}, |
| 156 | + ["field2"], |
| 157 | + _DELETE_ORIGIN_VALUE, |
| 158 | + _DO_NOT_REPLACE_WITH_VALUE, |
| 159 | + "field2_{{ key }}", |
| 160 | + {"field1": _ANY_VALUE, "field2_field3": _ANY_VALUE}, |
| 161 | + id="flatten by dpath, delete origin value, add keys transformation", |
| 162 | + ), |
| 163 | + pytest.param( |
| 164 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 165 | + {}, |
| 166 | + ["field2"], |
| 167 | + _DO_NOT_DELETE_ORIGIN_VALUE, |
| 168 | + _REPLACE_WITH_VALUE, |
| 169 | + "field2_{{ key }}", |
| 170 | + {"field2_field3": _ANY_VALUE}, |
| 171 | + id="flatten by dpath, not delete origin value, replace record, add keys transformation", |
| 172 | + ), |
131 | 173 | ], |
132 | 174 | ) |
133 | 175 | def test_dpath_flatten_lists( |
134 | | - input_record, config, field_path, delete_origin_value, replace_record, expected_record |
| 176 | + input_record, config, field_path, delete_origin_value, replace_record, key_transformation, expected_record |
135 | 177 | ): |
136 | 178 | flattener = DpathFlattenFields( |
137 | 179 | field_path=field_path, |
138 | 180 | parameters={}, |
139 | 181 | config=config, |
140 | 182 | delete_origin_value=delete_origin_value, |
141 | 183 | replace_record=replace_record, |
| 184 | + key_transformation=key_transformation, |
142 | 185 | ) |
143 | 186 | flattener.transform(input_record) |
144 | 187 | assert input_record == expected_record |
0 commit comments