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.
Files changed (51) hide show
  1. nepali/__init__.py +1 -1
  2. nepali/char.py +102 -81
  3. nepali/constants.py +66 -0
  4. nepali/date_converter.py +334 -0
  5. nepali/datetime/__init__.py +13 -14
  6. nepali/datetime/_datetime.py +391 -402
  7. nepali/datetime/_formatter.py +325 -0
  8. nepali/datetime/_humanize.py +117 -132
  9. nepali/datetime/_nepalimonth.py +118 -0
  10. nepali/datetime/_nepaliweek.py +125 -0
  11. nepali/datetime/parser/__init__.py +4 -4
  12. nepali/datetime/parser/_parser.py +59 -50
  13. nepali/datetime/parser/validators.py +249 -159
  14. nepali/datetime/utils.py +38 -0
  15. nepali/exceptions.py +8 -3
  16. nepali/locations/__init__.py +3 -0
  17. nepali/locations/_data.py +4271 -0
  18. nepali/locations/_locations.py +38 -0
  19. nepali/locations/models.py +104 -0
  20. nepali/locations/utils.py +54 -0
  21. nepali/number/__init__.py +19 -0
  22. nepali/number/_nepalinumber.py +563 -0
  23. nepali/number/_number.py +53 -0
  24. nepali/number/utils.py +72 -0
  25. nepali/phone_number.py +183 -0
  26. nepali/templatetags/__init__.py +0 -0
  27. nepali/templatetags/nepalidatetime.py +194 -24
  28. nepali/templatetags/nepalinumber.py +97 -7
  29. nepali/tests/test_date_converter.py +148 -0
  30. nepali/tests/test_datetime.py +275 -29
  31. nepali/tests/test_humanize.py +78 -7
  32. nepali/tests/test_locations.py +154 -0
  33. nepali/tests/test_nepalimonth.py +152 -0
  34. nepali/tests/test_nepaliweek.py +154 -0
  35. nepali/tests/test_number.py +3152 -0
  36. nepali/tests/test_parser.py +82 -69
  37. nepali/tests/test_phone_number.py +254 -0
  38. nepali/tests/test_timezone.py +192 -0
  39. nepali/timezone.py +50 -7
  40. nepali/utils.py +9 -68
  41. nepali-1.2.0.dist-info/METADATA +476 -0
  42. nepali-1.2.0.dist-info/RECORD +46 -0
  43. {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info}/WHEEL +1 -1
  44. {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info/licenses}/LICENSE +1 -1
  45. {nepali-0.5.5.dist-info → nepali-1.2.0.dist-info}/top_level.txt +0 -0
  46. nepali/datetime/_converter.py +0 -394
  47. nepali/datetime/_formarter.py +0 -314
  48. nepali/datetime.py +0 -1169
  49. nepali/number.py +0 -51
  50. nepali-0.5.5.dist-info/METADATA +0 -220
  51. 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
+ }
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 nepalidatetime, nepalihumanize as humanize
5
- from nepali.utils import to_local, to_utc, to_nepali_datetime
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
- @register.filter(name='nepalidate')
10
- def nepalidate(datetime_obj, format="%B %d, %Y, %A"):
11
- nepali_datetime_obj = to_nepali_datetime(datetime_obj)
12
- if nepali_datetime_obj == None: return None
13
- return nepali_datetime_obj.strftime(format)
14
-
15
- @register.filter(name='nepalidate_en')
16
- def nepalidate_en(datetime_obj, format="%B %d, %Y, %A"):
17
- nepali_datetime_obj = to_nepali_datetime(datetime_obj)
18
- if nepali_datetime_obj == None: return None
19
- return nepali_datetime_obj.strftime_en(format)
20
-
21
- @register.filter(name='nepalihumanize')
22
- def nepalihumanize(datetime_obj, threshold=None, format=None):
23
- """ templatetag to humanize nepalidatetime """
24
- nepali_datetime_obj = to_nepali_datetime(datetime_obj)
25
- if nepali_datetime_obj == None: return None
26
- return humanize(nepali_datetime_obj, threshold=threshold, format=format)
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 nepalinow(format="%B %d, %Y, %A"):
30
- """ templatetag to display current datetime in nepali format """
31
- return to_nepali_datetime(timezone.now()).strftime(format)
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 NepaliNumber
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
- @register.filter(name='nepalinumber')
8
- def nepalinumber(value):
9
- return NepaliNumber.convert(value)
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
- @register.filter(name='nepalinumber_with_comma')
12
- def nepalinumber_with_comma(value):
13
- return NepaliNumber.convert_and_add_comma(value)
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)