From 63f38ef10bdf05c8aaa01b47ba25e86bd0473526 Mon Sep 17 00:00:00 2001 From: Martin Holmer Date: Fri, 13 Apr 2018 16:14:23 -0400 Subject: [PATCH] Clarify datatype of parameters in JSON files --- taxcalc/behavior.json | 2 +- taxcalc/current_law_policy.json | 52 ++++++++++++++++---------------- taxcalc/parameters.py | 12 ++++++-- taxcalc/tests/test_parameters.py | 13 ++++---- 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/taxcalc/behavior.json b/taxcalc/behavior.json index 2344fa8f5..02f0ce0b9 100644 --- a/taxcalc/behavior.json +++ b/taxcalc/behavior.json @@ -51,7 +51,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "validations": {"min": false, "max": true} }, diff --git a/taxcalc/current_law_policy.json b/taxcalc/current_law_policy.json index b1ae6f392..a533a82a6 100644 --- a/taxcalc/current_law_policy.json +++ b/taxcalc/current_law_policy.json @@ -660,7 +660,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -952,7 +952,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -1090,7 +1090,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -2258,7 +2258,7 @@ "col_var": "idedtype", "col_label": ["medical", "statelocal", "realestate", "casualty", "misc", "interest", "charity"], "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [[true, true, true, true, true, true, true]], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -2306,7 +2306,7 @@ "col_var": "idedtype", "col_label": ["medical", "statelocal", "realestate", "casualty", "misc", "interest", "charity"], "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [[true, true, true, true, true, true, true]], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -2386,7 +2386,7 @@ "col_var": "idedtype", "col_label": ["medical", "statelocal", "realestate", "casualty", "misc", "interest", "charity"], "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [[true, true, true, true, true, true, true]], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -2794,7 +2794,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -4370,7 +4370,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -4394,7 +4394,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [true], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -5238,7 +5238,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false, false, false, @@ -5315,7 +5315,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -5587,7 +5587,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -5865,7 +5865,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -5969,7 +5969,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6017,7 +6017,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6569,7 +6569,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6593,7 +6593,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6617,7 +6617,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6641,7 +6641,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6665,7 +6665,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6689,7 +6689,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6713,7 +6713,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6737,7 +6737,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6761,7 +6761,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6785,7 +6785,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", @@ -6809,7 +6809,7 @@ "col_var": "", "col_label": "", "boolean_value": true, - "integer_value": true, + "integer_value": false, "value": [false], "range": {"min": false, "max": true}, "out_of_range_minmsg": "", diff --git a/taxcalc/parameters.py b/taxcalc/parameters.py index 855d7fa32..441f97a70 100644 --- a/taxcalc/parameters.py +++ b/taxcalc/parameters.py @@ -97,7 +97,9 @@ def set_default_vals(self, known_years=999999): if not isinstance(name, six.string_types): msg = 'parameter name {} is not a string' raise ValueError(msg.format(name)) - integer_values = data.get('integer_value', None) + intg_val = data.get('integer_value', None) + bool_val = data.get('bool_value', None) + integer_values = intg_val or bool_val values = data.get('value', None) if values: cpi_inflated = data.get('cpi_inflated', False) @@ -360,7 +362,9 @@ def _update(self, year_mods): continue # handle elsewhere in this method if name in self._vals: vals_indexed = self._vals[name].get('cpi_inflated', False) - integer_values = self._vals[name].get('integer_value') + intg_val = self._vals[name].get('integer_value', None) + bool_val = self._vals[name].get('bool_value', None) + integer_values = intg_val or bool_val else: msg = 'parameter name {} not in parameter values dictionary' raise ValueError(msg.format(name)) @@ -396,7 +400,9 @@ def _update(self, year_mods): pvalues = [cval[year - self.start_year]] index_rates = self._indexing_rates_for_update(name, year, num_years_to_expand) - integer_values = self._vals[pname]['integer_value'] + intg_val = self._vals[pname].get('integer_value', None) + bool_val = self._vals[pname].get('bool_value', None) + integer_values = intg_val or bool_val nval = self._expand_array(pvalues, integer_values, inflate=pindexed, inflation_rates=index_rates, diff --git a/taxcalc/tests/test_parameters.py b/taxcalc/tests/test_parameters.py index 639fcaa00..59c8c4bbe 100644 --- a/taxcalc/tests/test_parameters.py +++ b/taxcalc/tests/test_parameters.py @@ -322,18 +322,18 @@ def test_bool_int_value_info(tests_path, json_filename): pdict = json.load(pfile) maxint = np.iinfo(np.int8).max for param in sorted(pdict.keys()): - # check that boolean_value always implies integer_value - if pdict[param]['boolean_value'] and not pdict[param]['integer_value']: - msg = 'param,integer_value,boolean_value,= {} {} {}' + # check that boolean_value is never integer_value + if pdict[param]['boolean_value'] and pdict[param]['integer_value']: + msg = 'param,boolean_value,integer_value,= {} {} {}' msg = msg.format(str(param), pdict[param]['boolean_value'], pdict[param]['integer_value']) - assert msg == 'ERROR: boolean_value is not integer_value' + assert msg == 'ERROR: boolean_value is integer_value' # check that cpi_indexed param is not boolean or integer nonfloat_value = (pdict[param]['integer_value'] or pdict[param]['boolean_value']) if pdict[param]['cpi_inflated'] and nonfloat_value: - msg = 'param,integer_value,boolean_value= {} {} {}' + msg = 'param,boolean_value,integer_value,= {} {} {}' msg = msg.format(str(param), pdict[param]['boolean_value'], pdict[param]['integer_value']) @@ -344,7 +344,8 @@ def test_bool_int_value_info(tests_path, json_filename): val = val[0] valstr = str(val) val_is_boolean = bool(valstr == 'True' or valstr == 'False') - val_is_integer = not bool('.' in valstr or abs(val) > maxint) + val_is_integer = (not bool('.' in valstr or abs(val) > maxint) and + not val_is_boolean) # check that val_is_integer is consistent with integer_value if val_is_integer != pdict[param]['integer_value']: msg = 'param,integer_value,valstr= {} {} {}'