|
|
@@ -163,9 +163,11 @@ def _items(items):
|
|
|
if not isinstance(item, dict) or set(item) - {'fuel_ratio', 'conditions'}:
|
|
|
raise ValueError('items is invalid')
|
|
|
ratio = item.get('fuel_ratio')
|
|
|
- if isinstance(ratio, bool) or isinstance(ratio, int) or isinstance(ratio, float):
|
|
|
+ if isinstance(ratio, bool):
|
|
|
+ raise ValueError('fuel_ratio is invalid')
|
|
|
+ if isinstance(ratio, (int, float)):
|
|
|
ratio = '{0:.4f}'.format(ratio)
|
|
|
- if not isinstance(ratio, str) or not ratio.strip() or len(ratio.strip()) > 10:
|
|
|
+ if not isinstance(ratio, str) or not _fuel_ratio(ratio):
|
|
|
raise ValueError('fuel_ratio is invalid')
|
|
|
rows.append({
|
|
|
'fuel_ratio': ratio.strip(),
|
|
|
@@ -196,6 +198,23 @@ def _conditions(conditions):
|
|
|
return rows
|
|
|
|
|
|
|
|
|
+def _fuel_ratio(value):
|
|
|
+ value = value.strip()
|
|
|
+ if not value or value.count('.') > 1:
|
|
|
+ return False
|
|
|
+ if '.' not in value:
|
|
|
+ return value in ('0', '1')
|
|
|
+ whole, fraction = value.split('.', 1)
|
|
|
+ if whole not in ('0', '1') or not fraction or len(fraction) > 4:
|
|
|
+ return False
|
|
|
+ for character in fraction:
|
|
|
+ if character < '0' or character > '9':
|
|
|
+ return False
|
|
|
+ if whole == '1' and fraction.strip('0') != '':
|
|
|
+ return False
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
def _text(value, max_length, key):
|
|
|
if not isinstance(value, str) or not value.strip() or len(value.strip()) > max_length:
|
|
|
raise ValueError(key + ' is invalid')
|