Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.

Commit cdec8ec

Browse files
authored
Merge pull request #43 from easydatapy/new-num-parsers-and-fix-int-bug
new num parsers and fix int bug
2 parents 2454f3e + 6fa3cc8 commit cdec8ec

File tree

12 files changed

+142
-35
lines changed

12 files changed

+142
-35
lines changed

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
author = "Rok Grabnar"
2626

2727
# The full version, including alpha/beta/rc tags
28-
release = "0.3.9"
28+
release = "0.3.10"
2929

3030

3131
# -- General configuration ---------------------------------------------------

easydata/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.3.9"
1+
__version__ = "0.3.10"
22

33
from easydata.blocks import * # noqa: F401 F403
44
from easydata.groups import * # noqa: F401 F403

easydata/managers.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,7 @@ def _load_item_parsers_from_model(self, model):
247247
for item_name, parser_method in item_attr_items:
248248
if item_name.startswith("Item"):
249249
if not isinstance(parser_method, ItemGroup):
250-
raise TypeError(
251-
"%s can support only type of ItemGroup" % item_name
252-
)
250+
raise TypeError("%s can support only type of ItemGroup" % item_name)
253251

254252
self._item_groups.append(item_name)
255253

easydata/parsers/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(
7171
process_value: Optional[Union[Callable, Base]] = None,
7272
empty_as_none: bool = False,
7373
debug: bool = False,
74-
debug_source: bool = None,
74+
debug_source: bool = False,
7575
):
7676

7777
if query and from_item:

easydata/parsers/dict.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class Dict(BaseData):
2626
def __init__(
2727
self,
2828
query: Optional[QuerySearchBase] = None,
29-
key_parser: Base = None,
30-
val_parser: Base = None,
29+
key_parser: Optional[Base] = None,
30+
val_parser: Optional[Base] = None,
3131
key_query: Optional[QuerySearchBase] = None,
3232
val_query: Optional[QuerySearchBase] = None,
3333
dict_val_from_key: bool = False,

easydata/parsers/number.py

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
from typing import TYPE_CHECKING, Any
1+
from typing import TYPE_CHECKING, Any, Optional
22

33
from easydata.parsers.base import BaseData
44
from easydata.parsers.price import BaseNum, BasePriceFloat
55
from easydata.utils import mix
66

77
__all__ = (
8+
"SFloat",
9+
"SInt",
810
"Float",
911
"Int",
1012
"FloatText",
@@ -60,11 +62,48 @@ def _max_value_config(self):
6062
return self.config.get("ED_NUMBER_MAX_VALUE")
6163

6264

65+
class SFloat(BaseData):
66+
def __init__(
67+
self,
68+
*args,
69+
decimals: Optional[int] = None,
70+
**kwargs,
71+
):
72+
73+
self._decimals = decimals
74+
75+
super().__init__(*args, **kwargs)
76+
77+
def parse_value(
78+
self,
79+
value: Any,
80+
data: Any,
81+
):
82+
83+
if value is None:
84+
return None
85+
86+
return mix.parse_float(
87+
value=value,
88+
decimals=self._decimals,
89+
)
90+
91+
92+
class SInt(BaseData):
93+
def parse_value(
94+
self,
95+
value: Any,
96+
data: Any,
97+
):
98+
99+
return mix.parse_int(value)
100+
101+
63102
class Float(DefaultNumConfigMixin, BaseNum):
64103
def __init__(
65104
self,
66105
*args,
67-
parse_bool: bool = False,
106+
parse_bool: bool = True,
68107
**kwargs,
69108
):
70109

@@ -81,8 +120,8 @@ def parse_value(
81120
data: Any,
82121
):
83122

84-
if self._parse_bool and isinstance(value, bool):
85-
value = float(value)
123+
if isinstance(value, bool):
124+
return float(value) if self._parse_bool else None
86125

87126
return super().parse_value(value, data)
88127

@@ -93,18 +132,35 @@ def _parse_num_value(self, value: Any):
93132
)
94133

95134

96-
class Int(NumToIntMixin, Float):
135+
class Int(BaseNum):
136+
def __init__(
137+
self,
138+
*args,
139+
parse_bool: bool = False,
140+
**kwargs,
141+
):
142+
143+
self._parse_bool = parse_bool
144+
145+
super().__init__(
146+
*args,
147+
**kwargs,
148+
)
149+
97150
def parse_value(
98151
self,
99152
value: Any,
100153
data: Any,
101154
):
102155

103-
if self._parse_bool and isinstance(value, bool):
104-
return int(value)
156+
if isinstance(value, bool):
157+
return int(value) if self._parse_bool else None
105158

106159
return super().parse_value(value, data)
107160

161+
def _parse_num_value(self, value: Any):
162+
return mix.parse_int(value=value)
163+
108164

109165
class FloatText(NumToStrMixin, Float):
110166
pass

easydata/parsers/price.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,15 @@ def parse_value(
7070
data: Any,
7171
):
7272

73-
value = super().parse_value(value=value, data=data)
73+
if isinstance(value, (float, int)):
74+
value = self._parse_num_value(value)
75+
else:
76+
value = super().parse_value(value=value, data=data)
7477

75-
if value is None:
76-
return None
78+
if value is None:
79+
return None
7780

78-
value = self._parse_num_value(value)
81+
value = self._parse_num_value(value)
7982

8083
if value is None:
8184
return None

easydata/parsers/time.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,9 @@ def _settings(self) -> Optional[dict]:
203203
settings["NORMALIZE"] = self._date_normalize # type: ignore
204204

205205
if self._return_time_as_period is not None:
206-
settings["RETURN_TIME_AS_PERIOD"] = (
207-
self._return_time_as_period # type: ignore
208-
)
206+
settings[
207+
"RETURN_TIME_AS_PERIOD"
208+
] = self._return_time_as_period # type: ignore
209209

210210
if self._parsers is not None:
211211
settings["PARSERS"] = self._parsers # type: ignore
@@ -214,9 +214,9 @@ def _settings(self) -> Optional[dict]:
214214
settings["FUZZY"] = self._fuzzy # type: ignore
215215

216216
if self._prefer_locale_date_order is not None:
217-
settings["PREFER_LOCALE_DATE_ORDER"] = (
218-
self._prefer_locale_date_order # type: ignore
219-
)
217+
settings[
218+
"PREFER_LOCALE_DATE_ORDER"
219+
] = self._prefer_locale_date_order # type: ignore
220220

221221
if self._default_languages is not None:
222222
settings["DEFAULT_LANGUAGES"] = self._default_languages # type: ignore

easydata/processors/data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def __init__(
4242
new_source: Optional[str] = None,
4343
process_source_data=None,
4444
debug: bool = False,
45-
debug_raw: bool = None,
45+
debug_raw: bool = False,
4646
):
4747

4848
self._source = source

easydata/utils/mix.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def _parse_float(
2424
return float(value) if is_str_float(value) else None
2525

2626

27+
def _parse_int(value: str):
28+
try:
29+
return int(value)
30+
except ValueError:
31+
return None
32+
33+
2734
def unique_list(list_data: list) -> list:
2835
unique_list_data = []
2936

@@ -306,6 +313,22 @@ def parse_float(
306313
return value
307314

308315

316+
def parse_int(
317+
value: Any,
318+
) -> Optional[int]:
319+
320+
if isinstance(value, int):
321+
return value
322+
elif isinstance(value, float):
323+
return int(value)
324+
elif isinstance(value, str):
325+
value.strip()
326+
327+
return _parse_int(value)
328+
329+
return None
330+
331+
309332
def is_built_in_type(value):
310333
return isinstance(value, (int, str, float, dict, list, bool, tuple))
311334

0 commit comments

Comments
 (0)