Skip to content

Commit 201db36

Browse files
committed
Alloz variable neutralization in YAML test files
Fix text for comparison with country-template parameter Bump Update CHANGELOG.md Co-authored-by: sandcha <[email protected]> Test neutralized_variables new attribute for YAML tests Update CHANGELOG.md Co-authored-by: sandcha <[email protected]> Add tbs with neutralized variables to yaml tbs cache fixup! Add tbs with neutralized variables to yaml tbs cache Add test on yaml runner on tbs cache with neutralized variable fixup! Add test on yaml runner on tbs cache with neutralized variable
1 parent 6b3e1d3 commit 201db36

File tree

6 files changed

+85
-18
lines changed

6 files changed

+85
-18
lines changed

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## 35.5.0 [#1021](https://github.com/openfisca/openfisca-core/pull/1021)
4+
5+
#### New features
6+
7+
- Introduce `neutralize_variables` option in YAML test files
8+
- A neutralized variable in a YAML test will return its default value when computed.
9+
310
### 35.4.2 [#1026](https://github.com/openfisca/openfisca-core/pull/1026)
411

512
#### Bug fix
@@ -38,7 +45,7 @@
3845
- When libraries do not implement their own types, MyPy provides stubs, or type sheds
3946
- Thanks to `__future__.annotations`, those stubs or type sheds are casted to `typing.Any`
4047
- Since 1.20.x, NumPy now provides their own type definitions
41-
- The introduction of NumPy 1.20.x in #990 caused one major problem:
48+
- The introduction of NumPy 1.20.x in #990 caused one major problem:
4249
- It is general practice to do not import at runtime modules only used for typing purposes, thanks to the `typing.TYPE_CHEKING` variable
4350
- The new `numpy.typing` module was being imported at runtime, rendering OpenFisca unusable to all users depending on previous versions of NumPy (1.20.x-)
4451
- These changes revert #990 and solve #1009 and #1012

openfisca_core/tools/test_runner.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,22 @@ def import_yaml():
3131
return yaml, Loader
3232

3333

34-
TEST_KEYWORDS = {'absolute_error_margin', 'description', 'extensions', 'ignore_variables', 'input', 'keywords', 'max_spiral_loops', 'name', 'only_variables', 'output', 'period', 'reforms', 'relative_error_margin'}
34+
TEST_KEYWORDS = {
35+
'absolute_error_margin',
36+
'description',
37+
'extensions',
38+
'ignore_variables',
39+
'input',
40+
'keywords',
41+
'max_spiral_loops',
42+
'name',
43+
'neutralized_variables',
44+
'only_variables',
45+
'output',
46+
'period',
47+
'reforms',
48+
'relative_error_margin'
49+
}
3550

3651
yaml, Loader = import_yaml()
3752

@@ -137,7 +152,12 @@ def runtest(self):
137152
unexpected_keys = set(self.test.keys()).difference(TEST_KEYWORDS)
138153
raise ValueError("Unexpected keys {} in test '{}' in file '{}'".format(unexpected_keys, self.name, self.fspath))
139154

140-
self.tax_benefit_system = _get_tax_benefit_system(self.baseline_tax_benefit_system, self.test.get('reforms', []), self.test.get('extensions', []))
155+
self.tax_benefit_system = _get_tax_benefit_system(
156+
self.baseline_tax_benefit_system,
157+
self.test.get('reforms', []),
158+
self.test.get('extensions', []),
159+
self.test.get('neutralized_variables', [])
160+
)
141161

142162
builder = SimulationBuilder()
143163
input = self.test.get('input', {})
@@ -262,14 +282,16 @@ def pytest_collect_file(self, parent, path):
262282
options = self.options)
263283

264284

265-
def _get_tax_benefit_system(baseline, reforms, extensions):
285+
def _get_tax_benefit_system(baseline, reforms, extensions, neutralized_variables):
266286
if not isinstance(reforms, list):
267287
reforms = [reforms]
268288
if not isinstance(extensions, list):
269289
extensions = [extensions]
290+
if not isinstance(neutralized_variables, list):
291+
neutralized_variables = [neutralized_variables]
270292

271293
# keep reforms order in cache, ignore extensions order
272-
key = hash((id(baseline), ':'.join(reforms), frozenset(extensions)))
294+
key = hash((id(baseline), ':'.join(reforms), frozenset(extensions), ':'.join(neutralized_variables)))
273295
if _tax_benefit_system_cache.get(key):
274296
return _tax_benefit_system_cache.get(key)
275297

@@ -282,6 +304,9 @@ def _get_tax_benefit_system(baseline, reforms, extensions):
282304
current_tax_benefit_system = current_tax_benefit_system.clone()
283305
current_tax_benefit_system.load_extension(extension)
284306

307+
for neutralized_variable in neutralized_variables:
308+
current_tax_benefit_system.neutralize_variable(neutralized_variable)
309+
285310
_tax_benefit_system_cache[key] = current_tax_benefit_system
286311

287312
return current_tax_benefit_system

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
setup(
3737
name = 'OpenFisca-Core',
38-
version = '35.4.2',
38+
version = '35.5.0',
3939
author = 'OpenFisca Team',
4040
author_email = '[email protected]',
4141
classifiers = [

tests/core/test_yaml.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ def test_with_anchors(tax_benefit_system):
6565
assert run_yaml_test(tax_benefit_system, 'test_with_anchors.yaml') == EXIT_OK
6666

6767

68+
def test_with_neutralized_variables(tax_benefit_system):
69+
assert run_yaml_test(tax_benefit_system, 'test_with_neutralized_variables.yaml') == EXIT_OK
70+
71+
6872
def test_run_tests_from_directory_fail(tax_benefit_system):
6973
assert run_yaml_test(tax_benefit_system, yaml_tests_dir) == EXIT_TESTSFAILED
7074

tests/core/tools/test_runner/test_yaml_runner.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ def apply_reform(self, path):
2727
def load_extension(self, extension):
2828
pass
2929

30+
def neutralize_variable(self, variable_name):
31+
pass
32+
3033
def entities_by_singular(self):
3134
return {}
3235

@@ -95,51 +98,62 @@ def test_variable_not_found():
9598
def test_tax_benefit_systems_with_reform_cache():
9699
baseline = TaxBenefitSystem()
97100

98-
ab_tax_benefit_system = _get_tax_benefit_system(baseline, 'ab', [])
99-
ba_tax_benefit_system = _get_tax_benefit_system(baseline, 'ba', [])
101+
ab_tax_benefit_system = _get_tax_benefit_system(baseline, 'ab', [], [])
102+
ba_tax_benefit_system = _get_tax_benefit_system(baseline, 'ba', [], [])
100103
assert ab_tax_benefit_system != ba_tax_benefit_system
101104

102105

103106
def test_reforms_formats():
104107
baseline = TaxBenefitSystem()
105108

106-
lonely_reform_tbs = _get_tax_benefit_system(baseline, 'lonely_reform', [])
107-
list_lonely_reform_tbs = _get_tax_benefit_system(baseline, ['lonely_reform'], [])
109+
lonely_reform_tbs = _get_tax_benefit_system(baseline, 'lonely_reform', [], [])
110+
list_lonely_reform_tbs = _get_tax_benefit_system(baseline, ['lonely_reform'], [], [])
108111
assert lonely_reform_tbs == list_lonely_reform_tbs
109112

110113

111114
def test_reforms_order():
112115
baseline = TaxBenefitSystem()
113116

114-
abba_tax_benefit_system = _get_tax_benefit_system(baseline, ['ab', 'ba'], [])
115-
baab_tax_benefit_system = _get_tax_benefit_system(baseline, ['ba', 'ab'], [])
117+
abba_tax_benefit_system = _get_tax_benefit_system(baseline, ['ab', 'ba'], [], [])
118+
baab_tax_benefit_system = _get_tax_benefit_system(baseline, ['ba', 'ab'], [], [])
116119
assert abba_tax_benefit_system != baab_tax_benefit_system # keep reforms order in cache
117120

118121

119122
def test_tax_benefit_systems_with_extensions_cache():
120123
baseline = TaxBenefitSystem()
121124

122-
xy_tax_benefit_system = _get_tax_benefit_system(baseline, [], 'xy')
123-
yx_tax_benefit_system = _get_tax_benefit_system(baseline, [], 'yx')
125+
xy_tax_benefit_system = _get_tax_benefit_system(baseline, [], 'xy', [])
126+
yx_tax_benefit_system = _get_tax_benefit_system(baseline, [], 'yx', [])
124127
assert xy_tax_benefit_system != yx_tax_benefit_system
125128

126129

127130
def test_extensions_formats():
128131
baseline = TaxBenefitSystem()
129132

130-
lonely_extension_tbs = _get_tax_benefit_system(baseline, [], 'lonely_extension')
131-
list_lonely_extension_tbs = _get_tax_benefit_system(baseline, [], ['lonely_extension'])
133+
lonely_extension_tbs = _get_tax_benefit_system(baseline, [], 'lonely_extension', [])
134+
list_lonely_extension_tbs = _get_tax_benefit_system(baseline, [], ['lonely_extension'], [])
132135
assert lonely_extension_tbs == list_lonely_extension_tbs
133136

134137

135138
def test_extensions_order():
136139
baseline = TaxBenefitSystem()
137140

138-
xy_tax_benefit_system = _get_tax_benefit_system(baseline, [], ['x', 'y'])
139-
yx_tax_benefit_system = _get_tax_benefit_system(baseline, [], ['y', 'x'])
141+
xy_tax_benefit_system = _get_tax_benefit_system(baseline, [], ['x', 'y'], [])
142+
yx_tax_benefit_system = _get_tax_benefit_system(baseline, [], ['y', 'x'], [])
140143
assert xy_tax_benefit_system == yx_tax_benefit_system # extensions order is ignored in cache
141144

142145

146+
def test_tax_benefit_systems_with_neutralized_variables():
147+
baseline = TaxBenefitSystem()
148+
149+
re_tax_benefit_system = _get_tax_benefit_system(baseline, 'r', ['e'], [])
150+
ren_tax_benefit_system = _get_tax_benefit_system(baseline, 'r', ['e'], ['n'])
151+
n_tax_benefit_system = _get_tax_benefit_system(baseline, [], [], ['n'])
152+
153+
assert re_tax_benefit_system != ren_tax_benefit_system
154+
assert ren_tax_benefit_system != n_tax_benefit_system
155+
156+
143157
def test_performance_graph_option_output():
144158
test = {'input': {'salary': {'2017-01': 2000}}, 'output': {'salary': {'2017-01': 2000}}}
145159
test_item = TestItem(test)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
- name: "Result outside neutralized variables"
2+
period: 2021-01
3+
neutralized_variables:
4+
- housing_allowance
5+
input:
6+
age: 30
7+
output:
8+
basic_income: 600
9+
10+
- name: "Result within neutralized variables"
11+
period: 2021-01
12+
neutralized_variables:
13+
- basic_income
14+
input:
15+
age: 30
16+
output:
17+
basic_income: 0

0 commit comments

Comments
 (0)