nepali 0.5.5__py3-none-any.whl → 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nepali/__init__.py +1 -1
- nepali/char.py +102 -81
- nepali/constants.py +66 -0
- nepali/date_converter.py +334 -0
- nepali/datetime/__init__.py +13 -14
- nepali/datetime/_datetime.py +391 -402
- nepali/datetime/_formatter.py +325 -0
- nepali/datetime/_humanize.py +117 -132
- nepali/datetime/_nepalimonth.py +118 -0
- nepali/datetime/_nepaliweek.py +125 -0
- nepali/datetime/parser/__init__.py +4 -4
- nepali/datetime/parser/_parser.py +59 -50
- nepali/datetime/parser/validators.py +249 -159
- nepali/datetime/utils.py +38 -0
- nepali/exceptions.py +8 -3
- nepali/locations/__init__.py +3 -0
- nepali/locations/_data.py +4271 -0
- nepali/locations/_locations.py +38 -0
- nepali/locations/models.py +104 -0
- nepali/locations/utils.py +54 -0
- nepali/number/__init__.py +19 -0
- nepali/number/_nepalinumber.py +563 -0
- nepali/number/_number.py +53 -0
- nepali/number/utils.py +72 -0
- nepali/phone_number.py +183 -0
- nepali/templatetags/__init__.py +0 -0
- nepali/templatetags/nepalidatetime.py +194 -24
- nepali/templatetags/nepalinumber.py +97 -7
- nepali/tests/test_date_converter.py +148 -0
- nepali/tests/test_datetime.py +275 -29
- nepali/tests/test_humanize.py +78 -7
- nepali/tests/test_locations.py +154 -0
- nepali/tests/test_nepalimonth.py +152 -0
- nepali/tests/test_nepaliweek.py +154 -0
- nepali/tests/test_number.py +3152 -0
- nepali/tests/test_parser.py +82 -69
- nepali/tests/test_phone_number.py +254 -0
- nepali/tests/test_timezone.py +192 -0
- nepali/timezone.py +50 -7
- nepali/utils.py +9 -68
- nepali-1.2.0.dist-info/METADATA +476 -0
- nepali-1.2.0.dist-info/RECORD +46 -0
- {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info}/WHEEL +1 -1
- {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info/licenses}/LICENSE +1 -1
- {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info}/top_level.txt +0 -0
- nepali/datetime/_converter.py +0 -394
- nepali/datetime/_formarter.py +0 -314
- nepali/datetime.py +0 -1169
- nepali/number.py +0 -51
- nepali-0.5.5.dist-info/METADATA +0 -220
- nepali-0.5.5.dist-info/RECORD +0 -27
nepali/phone_number.py
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from enum import Enum
|
|
3
|
+
|
|
4
|
+
_mobile_number_re = re.compile(r"^(?:\+977|977)?(?:-)?(?:98|97|96)\d{8}$")
|
|
5
|
+
_landline_number_re = re.compile(
|
|
6
|
+
r"^(?:\+977|977)?(?:-)?(?:0)?(?:[01][1-9]|2[13-9]|[3-9]\d)\d{6,7}$"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Operator(Enum):
|
|
11
|
+
NEPAL_TELECOM = "Nepal Telecom"
|
|
12
|
+
NCELL = "Ncell"
|
|
13
|
+
SMART_CELL = "Smart Cell"
|
|
14
|
+
UTL = "UTL"
|
|
15
|
+
HELLO_MOBILE = "Hello Mobile"
|
|
16
|
+
|
|
17
|
+
def __str__(self) -> str:
|
|
18
|
+
return self.value
|
|
19
|
+
|
|
20
|
+
def __repr__(self) -> str:
|
|
21
|
+
return f"<Operator: {self.value}>"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def is_mobile_number(number: str) -> bool:
|
|
25
|
+
"""
|
|
26
|
+
Returns True is the input number is mobile number.
|
|
27
|
+
|
|
28
|
+
>>> is_mobile = is_mobile_number(number)
|
|
29
|
+
>>> if is_mobile:
|
|
30
|
+
>>> ...
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
return bool(_mobile_number_re.match(number))
|
|
34
|
+
except Exception:
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def is_landline_number(number: str) -> bool:
|
|
39
|
+
"""
|
|
40
|
+
Returns True is the input number is mobile number.
|
|
41
|
+
|
|
42
|
+
>>> is_mobile = is_mobile_number(number)
|
|
43
|
+
>>> if is_mobile:
|
|
44
|
+
>>> ...
|
|
45
|
+
"""
|
|
46
|
+
try:
|
|
47
|
+
return bool(_landline_number_re.match(number))
|
|
48
|
+
except Exception:
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def is_valid(number: str) -> bool:
|
|
53
|
+
return is_mobile_number(number) or is_landline_number(number)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_exact_number(number: str) -> str:
|
|
57
|
+
# replacing start 977
|
|
58
|
+
if number.startswith("977"):
|
|
59
|
+
number = number.replace("977", "")
|
|
60
|
+
# replacing +977 and all -
|
|
61
|
+
return number.replace("+977", "").replace("-", "")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def parse(number: str):
|
|
65
|
+
"""
|
|
66
|
+
Parse and returns the details of the phone number: `dict`.
|
|
67
|
+
The return data may vary between mobile and landline numbers.
|
|
68
|
+
If the number is invalid it returns `None`.
|
|
69
|
+
|
|
70
|
+
If you want to make sure you get a valid response, please use
|
|
71
|
+
`is_valid`, `is_mobile_number`, and `is_landline_number`.
|
|
72
|
+
|
|
73
|
+
:return:
|
|
74
|
+
{
|
|
75
|
+
"type": "Mobile" | "Landline",
|
|
76
|
+
"number": "XXXXXXX",
|
|
77
|
+
...
|
|
78
|
+
}
|
|
79
|
+
"""
|
|
80
|
+
if not number and type(number) != str:
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
number = number.replace("-", "")
|
|
84
|
+
|
|
85
|
+
# checking if mobile number
|
|
86
|
+
if is_mobile_number(number):
|
|
87
|
+
return _parse_mobile_number(number)
|
|
88
|
+
|
|
89
|
+
if is_landline_number(number):
|
|
90
|
+
return _parse_landline_number(number)
|
|
91
|
+
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _get_operator(number: str) -> Operator | None:
|
|
96
|
+
"""
|
|
97
|
+
Returns operator from the number.
|
|
98
|
+
NOTE: The number should be 10digit mobile number.
|
|
99
|
+
"""
|
|
100
|
+
starting_number = number[:3]
|
|
101
|
+
|
|
102
|
+
# NTC
|
|
103
|
+
if starting_number in ["984", "985", "986", "974", "975"]:
|
|
104
|
+
return Operator.NEPAL_TELECOM
|
|
105
|
+
|
|
106
|
+
# NCELL
|
|
107
|
+
if starting_number in ["980", "981", "982"]:
|
|
108
|
+
return Operator.NCELL
|
|
109
|
+
|
|
110
|
+
# Smart Cell
|
|
111
|
+
if starting_number in ["961", "962", "988"]:
|
|
112
|
+
return Operator.SMART_CELL
|
|
113
|
+
|
|
114
|
+
# UTL
|
|
115
|
+
if starting_number == "972":
|
|
116
|
+
return Operator.UTL
|
|
117
|
+
|
|
118
|
+
# Hello Mobile
|
|
119
|
+
if starting_number == "963":
|
|
120
|
+
return Operator.HELLO_MOBILE
|
|
121
|
+
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _parse_mobile_number(number: str):
|
|
126
|
+
"""
|
|
127
|
+
Parse and returns mobile number details.
|
|
128
|
+
:return:
|
|
129
|
+
{
|
|
130
|
+
"type": "Mobile",
|
|
131
|
+
"number": "98XXXXXXXX",
|
|
132
|
+
"operator": <Operator>
|
|
133
|
+
}
|
|
134
|
+
"""
|
|
135
|
+
number = get_exact_number(number)
|
|
136
|
+
operator = _get_operator(number)
|
|
137
|
+
|
|
138
|
+
if not operator:
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
detail = {
|
|
142
|
+
"type": "Mobile",
|
|
143
|
+
"number": number,
|
|
144
|
+
"operator": operator,
|
|
145
|
+
}
|
|
146
|
+
return detail
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _get_area_code(number) -> str:
|
|
150
|
+
"""
|
|
151
|
+
Returns area code of the number.
|
|
152
|
+
NOTE: The number should be landline number without +977/977.
|
|
153
|
+
"""
|
|
154
|
+
code = number[:3]
|
|
155
|
+
|
|
156
|
+
# Kathmandu, Lalitpur, and Bhaktapur => 01
|
|
157
|
+
if number.startswith("01") and code not in ["010", "011", "019"]:
|
|
158
|
+
return "01"
|
|
159
|
+
|
|
160
|
+
return code
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _parse_landline_number(number) -> dict:
|
|
164
|
+
"""
|
|
165
|
+
Parse and returns mobile number details.
|
|
166
|
+
:return:
|
|
167
|
+
{
|
|
168
|
+
"type": "Landline",
|
|
169
|
+
"number": "98XXXXXXXX",
|
|
170
|
+
"operator": <Operator>
|
|
171
|
+
}
|
|
172
|
+
"""
|
|
173
|
+
number = get_exact_number(number)
|
|
174
|
+
|
|
175
|
+
# adding zero
|
|
176
|
+
if number[0] != "0":
|
|
177
|
+
number = f"0{number}"
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
"type": "Landline",
|
|
181
|
+
"number": number,
|
|
182
|
+
"area_code": _get_area_code(number),
|
|
183
|
+
}
|
nepali/templatetags/__init__.py
CHANGED
|
File without changes
|
|
@@ -1,31 +1,201 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains django templatetags for nepali date and time.
|
|
3
|
+
"""
|
|
4
|
+
import datetime
|
|
5
|
+
import warnings
|
|
6
|
+
from typing import Optional, Union
|
|
7
|
+
|
|
1
8
|
from django import template
|
|
2
9
|
from django.utils import timezone
|
|
3
10
|
|
|
4
|
-
from nepali.datetime import
|
|
5
|
-
from nepali.
|
|
11
|
+
from nepali.datetime import nepalidate as _nepalidate
|
|
12
|
+
from nepali.datetime import nepalidatetime as _nepalidatetime
|
|
13
|
+
from nepali.datetime import nepalihumanize as humanize
|
|
14
|
+
from nepali.exceptions import InvalidNepaliDateTimeObjectException
|
|
15
|
+
from nepali.utils import to_nepalidatetime
|
|
6
16
|
|
|
17
|
+
_DEFAULT_DATE_FORMAT = "%B %d, %Y, %A"
|
|
18
|
+
DEPRECIATION_WARNING_MESSAGE = (
|
|
19
|
+
"The templatetag 'nepalidatetime' has been depreciated "
|
|
20
|
+
"and will be removed in the future release. "
|
|
21
|
+
"Please use `django-nepali` package."
|
|
22
|
+
)
|
|
23
|
+
_datetime = Union[datetime.date, datetime.datetime, _nepalidate, _nepalidatetime]
|
|
7
24
|
register = template.Library()
|
|
8
25
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
|
|
27
|
+
@register.filter(name="nepalidate")
|
|
28
|
+
def nepalidate(
|
|
29
|
+
datetime_obj: _datetime, format: str = _DEFAULT_DATE_FORMAT
|
|
30
|
+
) -> Union[str, None]:
|
|
31
|
+
"""
|
|
32
|
+
Renders the datetime object into nepali datetime format in 'en-US' locale (English).
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
```
|
|
36
|
+
{{ datetime_obj|nepalidate }}
|
|
37
|
+
{{ datetime_obj|nepalidate:"%Y-%m-%d" }}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
:param datetime_obj: Datetime object
|
|
41
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
42
|
+
:returns: Nepali datetime format in 'en-US' locale
|
|
43
|
+
"""
|
|
44
|
+
warnings.warn(
|
|
45
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
46
|
+
category=DeprecationWarning,
|
|
47
|
+
)
|
|
48
|
+
return nepalidate_en(datetime_obj, format=format)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@register.filter(name="nepalidate_en")
|
|
52
|
+
def nepalidate_en(
|
|
53
|
+
datetime_obj: _datetime, format: str = _DEFAULT_DATE_FORMAT
|
|
54
|
+
) -> Union[str, None]:
|
|
55
|
+
"""
|
|
56
|
+
Renders the datetime object into nepali datetime format in 'en-US' locale (English).
|
|
57
|
+
|
|
58
|
+
Usage:
|
|
59
|
+
```
|
|
60
|
+
{{ datetime_obj|nepalidate_en }}
|
|
61
|
+
{{ datetime_obj|nepalidate_en:"%Y-%m-%d" }}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
:param datetime_obj: Datetime object
|
|
65
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
66
|
+
:returns: Nepali datetime format in 'en-US' locale
|
|
67
|
+
"""
|
|
68
|
+
warnings.warn(
|
|
69
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
70
|
+
category=DeprecationWarning,
|
|
71
|
+
)
|
|
72
|
+
try:
|
|
73
|
+
nepali_datetime_obj = to_nepalidatetime(datetime_obj)
|
|
74
|
+
return nepali_datetime_obj.strftime_en(format)
|
|
75
|
+
except InvalidNepaliDateTimeObjectException:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@register.filter(name="nepalidate_ne")
|
|
80
|
+
def nepalidate_ne(
|
|
81
|
+
datetime_obj: _datetime, format: str = _DEFAULT_DATE_FORMAT
|
|
82
|
+
) -> Union[str, None]:
|
|
83
|
+
"""
|
|
84
|
+
Renders the datetime object into nepali datetime format in 'ne' locale (Nepali).
|
|
85
|
+
|
|
86
|
+
Usage:
|
|
87
|
+
```
|
|
88
|
+
{{ datetime_obj|nepalidate_ne }}
|
|
89
|
+
{{ datetime_obj|nepalidate_ne:"%Y-%m-%d" }}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
:param datetime_obj: Datetime object
|
|
93
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
94
|
+
:returns: Nepali datetime format in 'ne' locale
|
|
95
|
+
"""
|
|
96
|
+
warnings.warn(
|
|
97
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
98
|
+
category=DeprecationWarning,
|
|
99
|
+
)
|
|
100
|
+
try:
|
|
101
|
+
nepali_datetime_obj = to_nepalidatetime(datetime_obj)
|
|
102
|
+
return nepali_datetime_obj.strftime_ne(format)
|
|
103
|
+
except InvalidNepaliDateTimeObjectException:
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@register.filter(name="nepalihumanize")
|
|
108
|
+
def nepalihumanize(
|
|
109
|
+
datetime_obj: _datetime,
|
|
110
|
+
threshold: Optional[int] = None,
|
|
111
|
+
format: Optional[str] = None,
|
|
112
|
+
) -> Union[str, None]:
|
|
113
|
+
"""
|
|
114
|
+
Renders the datetime object to a human readable form for 'ne' locale (Nepali).
|
|
115
|
+
|
|
116
|
+
Usage:
|
|
117
|
+
```
|
|
118
|
+
{{ datetime_obj|nepalihumanize }}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
:param datetime_obj: Datetime object
|
|
122
|
+
:param threshold: Threshold in seconds that determines when to render
|
|
123
|
+
the datetime object in the standard datetime format, optional
|
|
124
|
+
:param format: Output format if threshold exceeded, optional
|
|
125
|
+
:returns: Datetime object in human readable form
|
|
126
|
+
"""
|
|
127
|
+
warnings.warn(
|
|
128
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
129
|
+
category=DeprecationWarning,
|
|
130
|
+
)
|
|
131
|
+
try:
|
|
132
|
+
nepali_datetime_obj = to_nepalidatetime(datetime_obj)
|
|
133
|
+
return humanize(nepali_datetime_obj, threshold=threshold, format=format)
|
|
134
|
+
except InvalidNepaliDateTimeObjectException:
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@register.simple_tag
|
|
139
|
+
def nepalinow(format: str = _DEFAULT_DATE_FORMAT) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Renders the current nepali datetime in 'en-US' locale (English).
|
|
142
|
+
|
|
143
|
+
Usage:
|
|
144
|
+
```
|
|
145
|
+
{% nepalinow %}
|
|
146
|
+
{% nepalinow '%Y-%m-%d' %}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
:param datetime_obj: Datetime object
|
|
150
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
151
|
+
:returns: Current nepali datetime
|
|
152
|
+
"""
|
|
153
|
+
warnings.warn(
|
|
154
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
155
|
+
category=DeprecationWarning,
|
|
156
|
+
)
|
|
157
|
+
return nepalinow_en(format)
|
|
158
|
+
|
|
159
|
+
|
|
28
160
|
@register.simple_tag
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
161
|
+
def nepalinow_en(format: str = _DEFAULT_DATE_FORMAT) -> str:
|
|
162
|
+
"""
|
|
163
|
+
Renders the current nepali datetime in 'en-US' locale (English).
|
|
164
|
+
|
|
165
|
+
Usage:
|
|
166
|
+
```
|
|
167
|
+
{% nepalinow_en %}
|
|
168
|
+
{% nepalinow_en '%Y-%m-%d' %}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
:param datetime_obj: Datetime object
|
|
172
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
173
|
+
:returns: Current nepali datetime
|
|
174
|
+
"""
|
|
175
|
+
warnings.warn(
|
|
176
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
177
|
+
category=DeprecationWarning,
|
|
178
|
+
)
|
|
179
|
+
return to_nepalidatetime(timezone.now()).strftime(format)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@register.simple_tag
|
|
183
|
+
def nepalinow_ne(format: str = _DEFAULT_DATE_FORMAT) -> str:
|
|
184
|
+
"""
|
|
185
|
+
Renders the current nepali datetime in 'ne' locale (Nepali).
|
|
186
|
+
|
|
187
|
+
Usage:
|
|
188
|
+
```
|
|
189
|
+
{% nepalinow_ne %}
|
|
190
|
+
{% nepalinow_ne '%Y-%m-%d' %}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
:param datetime_obj: Datetime object
|
|
194
|
+
:param format: Output format, defaults to "%B %d, %Y, %A"
|
|
195
|
+
:returns: Current nepali datetime
|
|
196
|
+
"""
|
|
197
|
+
warnings.warn(
|
|
198
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
199
|
+
category=DeprecationWarning,
|
|
200
|
+
)
|
|
201
|
+
return to_nepalidatetime(timezone.now()).strftime_ne(format)
|
|
@@ -1,13 +1,103 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains django templatetags for nepali number.
|
|
3
|
+
"""
|
|
4
|
+
import warnings
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
1
7
|
from django import template
|
|
2
8
|
|
|
3
|
-
from nepali.number import
|
|
9
|
+
from nepali.number import (
|
|
10
|
+
add_comma,
|
|
11
|
+
add_comma_english,
|
|
12
|
+
convert_and_add_comma,
|
|
13
|
+
english_to_nepali,
|
|
14
|
+
)
|
|
4
15
|
|
|
5
16
|
register = template.Library()
|
|
6
17
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
18
|
+
DEPRECIATION_WARNING_MESSAGE = (
|
|
19
|
+
"The templatetag 'nepalinumber' has been depreciated "
|
|
20
|
+
"and will be removed in the future release. "
|
|
21
|
+
"Please use `django-nepali` package."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@register.filter(name="nepalinumber")
|
|
26
|
+
def nepalinumber(value: Any) -> str:
|
|
27
|
+
"""
|
|
28
|
+
Converts the number into nepali number and renders it.
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
```
|
|
32
|
+
{{ number|nepalinumber }}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
:param value: Number to be converted
|
|
36
|
+
:returns: Nepali output of given number
|
|
37
|
+
"""
|
|
38
|
+
warnings.warn(
|
|
39
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
40
|
+
category=DeprecationWarning,
|
|
41
|
+
)
|
|
42
|
+
return english_to_nepali(value)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@register.filter(name="nepalinumber_with_comma")
|
|
46
|
+
def nepalinumber_with_comma(value: Any) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Converts the number into nepali number and renders it.
|
|
49
|
+
|
|
50
|
+
Usage:
|
|
51
|
+
```
|
|
52
|
+
{{ number|nepalinumber_with_comma }}
|
|
53
|
+
```
|
|
54
|
+
Basically same as `{{ number|nepalinumber|nepali_comma }}`
|
|
55
|
+
|
|
56
|
+
:param value: Number to be converted and commas added
|
|
57
|
+
:returns: Nepali output of given number with commas
|
|
58
|
+
"""
|
|
59
|
+
warnings.warn(
|
|
60
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
61
|
+
category=DeprecationWarning,
|
|
62
|
+
)
|
|
63
|
+
return convert_and_add_comma(value)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@register.filter(name="nepali_comma")
|
|
67
|
+
def nepali_comma(value: Any) -> str:
|
|
68
|
+
"""
|
|
69
|
+
Renders the given value with commas added in Nepali style without converting the number.
|
|
70
|
+
|
|
71
|
+
Usage:
|
|
72
|
+
```
|
|
73
|
+
{{ number|nepali_comma }}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
:param value: Number to be added with commas
|
|
77
|
+
:returns: Output of given number with commas
|
|
78
|
+
"""
|
|
79
|
+
warnings.warn(
|
|
80
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
81
|
+
category=DeprecationWarning,
|
|
82
|
+
)
|
|
83
|
+
return add_comma(value)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@register.filter(name="english_comma")
|
|
87
|
+
def english_comma(value: Any) -> str:
|
|
88
|
+
"""
|
|
89
|
+
Renders the given value with commas added in English style without converting the number.
|
|
90
|
+
|
|
91
|
+
Usage:
|
|
92
|
+
```
|
|
93
|
+
{{ number|english_comma }}
|
|
94
|
+
```
|
|
10
95
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
96
|
+
:param value: Number to be added with commas
|
|
97
|
+
:returns: Output of given number with commas
|
|
98
|
+
"""
|
|
99
|
+
warnings.warn(
|
|
100
|
+
message=DEPRECIATION_WARNING_MESSAGE,
|
|
101
|
+
category=DeprecationWarning,
|
|
102
|
+
)
|
|
103
|
+
return add_comma_english(value)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""
|
|
2
|
+
To run only this unit test use the command below.
|
|
3
|
+
|
|
4
|
+
python -m unittest nepali/tests/test_date_converter.py -v
|
|
5
|
+
"""
|
|
6
|
+
import unittest
|
|
7
|
+
|
|
8
|
+
from nepali.date_converter import converter
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestNepaliDateConverter(unittest.TestCase):
|
|
12
|
+
"""tests for date_converter.converter module"""
|
|
13
|
+
# test date range
|
|
14
|
+
def test_english_date_range(self):
|
|
15
|
+
self.assertEqual(converter.en_min_year(), 1944)
|
|
16
|
+
self.assertEqual(converter.en_max_year(), 2042)
|
|
17
|
+
|
|
18
|
+
def test_nepali_date_range(self):
|
|
19
|
+
self.assertEqual(converter.np_min_year(), 2000)
|
|
20
|
+
self.assertEqual(converter.np_max_year(), 2099)
|
|
21
|
+
|
|
22
|
+
# english_to_nepali
|
|
23
|
+
def test_converter_english_to_nepali_raise_exception_on_max_year_range(self):
|
|
24
|
+
with self.assertRaises(Exception):
|
|
25
|
+
converter.english_to_nepali(2060, 1, 4)
|
|
26
|
+
|
|
27
|
+
def test_converter_english_to_nepali_raise_exception_on_min_year_range(self):
|
|
28
|
+
with self.assertRaises(Exception):
|
|
29
|
+
converter.english_to_nepali(1920, 1, 4)
|
|
30
|
+
|
|
31
|
+
def test_converter_english_to_nepali_raise_exception_on_min_month_range(self):
|
|
32
|
+
with self.assertRaises(Exception):
|
|
33
|
+
converter.english_to_nepali(2023, 0, 4)
|
|
34
|
+
|
|
35
|
+
def test_converter_english_to_nepali_raise_exception_on_max_month_range(self):
|
|
36
|
+
with self.assertRaises(Exception):
|
|
37
|
+
converter.english_to_nepali(2023, 13, 4)
|
|
38
|
+
|
|
39
|
+
def test_converter_english_to_nepali_raise_exception_on_min_day_range(self):
|
|
40
|
+
with self.assertRaises(Exception):
|
|
41
|
+
converter.english_to_nepali(2023, 1, 0)
|
|
42
|
+
|
|
43
|
+
def test_converter_english_to_nepali_raise_exception_on_max_day_range(self):
|
|
44
|
+
with self.assertRaises(Exception):
|
|
45
|
+
converter.english_to_nepali(2023, 1, 40)
|
|
46
|
+
|
|
47
|
+
def test_converter_english_to_nepali_returns_valid_past_nepali_date(self):
|
|
48
|
+
y, m, d = converter.english_to_nepali(1994, 8, 13)
|
|
49
|
+
self.assertEqual(y, 2051)
|
|
50
|
+
self.assertEqual(m, 4)
|
|
51
|
+
self.assertEqual(d, 29)
|
|
52
|
+
|
|
53
|
+
def test_converter_english_to_nepali_returns_valid_past_nepali_date2(self):
|
|
54
|
+
y, m, d = converter.english_to_nepali(1944, 5, 28)
|
|
55
|
+
self.assertEqual(y, 2001)
|
|
56
|
+
self.assertEqual(m, 2)
|
|
57
|
+
self.assertEqual(d, 15)
|
|
58
|
+
|
|
59
|
+
def test_converter_english_to_nepali_returns_valid_recent_nepali_date(self):
|
|
60
|
+
y, m, d = converter.english_to_nepali(2023, 1, 28)
|
|
61
|
+
self.assertEqual(y, 2079)
|
|
62
|
+
self.assertEqual(m, 10)
|
|
63
|
+
self.assertEqual(d, 14)
|
|
64
|
+
|
|
65
|
+
def test_converter_english_to_nepali_returns_valid_future_nepali_date(self):
|
|
66
|
+
y, m, d = converter.english_to_nepali(2030, 11, 26)
|
|
67
|
+
self.assertEqual(y, 2087)
|
|
68
|
+
self.assertEqual(m, 8)
|
|
69
|
+
self.assertEqual(d, 10)
|
|
70
|
+
|
|
71
|
+
def test_converter_english_to_nepali_for_min_edge_date(self):
|
|
72
|
+
y, m, d = converter.english_to_nepali(1944, 1, 1)
|
|
73
|
+
self.assertEqual(y, 2000)
|
|
74
|
+
self.assertEqual(m, 9)
|
|
75
|
+
self.assertEqual(d, 17)
|
|
76
|
+
|
|
77
|
+
def test_converter_english_to_nepali_for_max_edge_date(self):
|
|
78
|
+
y, m, d = converter.english_to_nepali(2042, 12, 31)
|
|
79
|
+
self.assertEqual(y, 2099)
|
|
80
|
+
self.assertEqual(m, 9)
|
|
81
|
+
self.assertEqual(d, 16)
|
|
82
|
+
|
|
83
|
+
# nepali_to_english
|
|
84
|
+
def test_converter_nepali_to_englishReturnErrorOnMaxYearRange(self):
|
|
85
|
+
with self.assertRaises(Exception):
|
|
86
|
+
converter.nepali_to_english(3000, 1, 4)
|
|
87
|
+
|
|
88
|
+
def test_converter_nepali_to_english_raise_exception_on_min_year_range(self):
|
|
89
|
+
with self.assertRaises(Exception):
|
|
90
|
+
converter.nepali_to_english(1920, 1, 4)
|
|
91
|
+
|
|
92
|
+
def test_converter_nepali_to_english_raise_exception_on_min_month_range(self):
|
|
93
|
+
with self.assertRaises(Exception):
|
|
94
|
+
converter.nepali_to_english(2079, 0, 4)
|
|
95
|
+
|
|
96
|
+
def test_converter_nepali_to_english_raise_exception_on_max_month_range(self):
|
|
97
|
+
with self.assertRaises(Exception):
|
|
98
|
+
converter.nepali_to_english(2079, 13, 4)
|
|
99
|
+
|
|
100
|
+
def test_converter_nepali_to_english_raise_exception_on_min_day_range(self):
|
|
101
|
+
with self.assertRaises(Exception):
|
|
102
|
+
converter.nepali_to_english(2079, 1, 0)
|
|
103
|
+
|
|
104
|
+
def test_converter_nepali_to_english_raise_exception_on_max_day_range(self):
|
|
105
|
+
with self.assertRaises(Exception):
|
|
106
|
+
converter.nepali_to_english(2079, 1, 40)
|
|
107
|
+
|
|
108
|
+
def test_converter_nepali_to_english_returns_valid_past_english_date(self):
|
|
109
|
+
y, m, d = converter.nepali_to_english(2051, 4, 29)
|
|
110
|
+
self.assertEqual(y, 1994)
|
|
111
|
+
self.assertEqual(m, 8)
|
|
112
|
+
self.assertEqual(d, 13)
|
|
113
|
+
|
|
114
|
+
def test_converter_nepali_to_english_returns_valid_past_english_date2(self):
|
|
115
|
+
y, m, d = converter.nepali_to_english(2001, 2, 15)
|
|
116
|
+
self.assertEqual(y, 1944)
|
|
117
|
+
self.assertEqual(m, 5)
|
|
118
|
+
self.assertEqual(d, 28)
|
|
119
|
+
|
|
120
|
+
def test_converter_nepali_to_english_returns_valid_recent_english_date(self):
|
|
121
|
+
y, m, d = converter.nepali_to_english(2079, 10, 14)
|
|
122
|
+
self.assertEqual(y, 2023)
|
|
123
|
+
self.assertEqual(m, 1)
|
|
124
|
+
self.assertEqual(d, 28)
|
|
125
|
+
|
|
126
|
+
def test_converter_nepali_to_english_returns_valid_future_english_date(self):
|
|
127
|
+
y, m, d = converter.nepali_to_english(2087, 8, 10)
|
|
128
|
+
self.assertEqual(y, 2030)
|
|
129
|
+
self.assertEqual(m, 11)
|
|
130
|
+
self.assertEqual(d, 26)
|
|
131
|
+
|
|
132
|
+
def test_converter_nepali_to_english_returns_valid_english_leap_year_date(self):
|
|
133
|
+
y, m, d = converter.nepali_to_english(2080, 12, 15)
|
|
134
|
+
self.assertEqual(y, 2024)
|
|
135
|
+
self.assertEqual(m, 3)
|
|
136
|
+
self.assertEqual(d, 28)
|
|
137
|
+
|
|
138
|
+
def test_converter_nepali_to_english_for_min_edge_date(self):
|
|
139
|
+
y, m, d = converter.nepali_to_english(2000, 1, 1)
|
|
140
|
+
self.assertEqual(y, 1943)
|
|
141
|
+
self.assertEqual(m, 4)
|
|
142
|
+
self.assertEqual(d, 14)
|
|
143
|
+
|
|
144
|
+
def test_converter_nepali_to_english_for_max_edge_date(self):
|
|
145
|
+
y, m, d = converter.nepali_to_english(2099, 12, 30)
|
|
146
|
+
self.assertEqual(y, 2043)
|
|
147
|
+
self.assertEqual(m, 4)
|
|
148
|
+
self.assertEqual(d, 13)
|