| Conditions | 1 |
| Total Lines | 60 |
| Code Lines | 48 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | # coding=utf-8 |
||
| 43 | @pytest.mark.parametrize("air_miles, land_miles, age, vip, expected", [ |
||
| 44 | (5000, 1000, 37, 'yes', True), |
||
| 45 | (1500, 1000, 37, 'yes', False), |
||
| 46 | (5000, 5001, 37, 'yes', False), |
||
| 47 | (5000, 1000, 16, 'yes', False), |
||
| 48 | (5000, 1000, 70, 'yes', False), |
||
| 49 | (5000, 1000, 37, 'no', False), |
||
| 50 | (100, 50, 15, 'no', False) |
||
| 51 | ]) |
||
| 52 | def test_multiple_rules_engine(air_miles, land_miles, age, vip, expected): |
||
| 53 | air_miles_source = DictSource('air_miles') |
||
| 54 | minimum_miles_source = FixedValueSource(3500) |
||
| 55 | minimum_air_miles_rule = SimpleComparisonRule(air_miles_source, |
||
| 56 | minimum_miles_source, |
||
| 57 | GreaterThanOrEqual()) |
||
| 58 | |||
| 59 | land_miles_source = DictSource('land_miles') |
||
| 60 | less_land_than_air_miles_rule = SimpleComparisonRule(land_miles_source, |
||
| 61 | air_miles_source, |
||
| 62 | LessThanOrEqual()) |
||
| 63 | |||
| 64 | air_miles_percentage = PercentageSource(0.05, air_miles_source) |
||
| 65 | air_miles_percentage_rule = SimpleComparisonRule(land_miles_source, |
||
| 66 | air_miles_percentage, |
||
| 67 | GreaterThanOrEqual()) |
||
| 68 | |||
| 69 | air_and_land_miles_rule = BooleanAndRule([minimum_air_miles_rule, |
||
| 70 | less_land_than_air_miles_rule, |
||
| 71 | air_miles_percentage_rule]) |
||
| 72 | |||
| 73 | age_source = DictSource('age') |
||
| 74 | minimum_age_source = FixedValueSource(21) |
||
| 75 | minimum_age_rule = SimpleComparisonRule(age_source, minimum_age_source, |
||
| 76 | GreaterThanOrEqual()) |
||
| 77 | |||
| 78 | maximum_age_source = FixedValueSource(65) |
||
| 79 | maximum_age_rule = SimpleComparisonRule(age_source, maximum_age_source, |
||
| 80 | LessThanOrEqual()) |
||
| 81 | |||
| 82 | vip_status_source = DictSource('vip') |
||
| 83 | positive_vip_status = FixedValueSource('yes') |
||
| 84 | vip_status_rule = SimpleComparisonRule(vip_status_source, |
||
| 85 | positive_vip_status, |
||
| 86 | Equal()) |
||
| 87 | |||
| 88 | engine = Engine([ |
||
| 89 | air_and_land_miles_rule, |
||
| 90 | minimum_age_rule, |
||
| 91 | maximum_age_rule, |
||
| 92 | vip_status_rule |
||
| 93 | ]) |
||
| 94 | |||
| 95 | data = { |
||
| 96 | 'air_miles': air_miles, |
||
| 97 | 'land_miles': land_miles, |
||
| 98 | 'age': age, |
||
| 99 | 'vip': vip |
||
| 100 | } |
||
| 101 | |||
| 102 | assert engine.decide(data) == expected |
||
| 103 |