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
@@ -0,0 +1,325 @@
1
+ import datetime as pythonDateTime
2
+
3
+ from nepali import number
4
+ from nepali.exceptions import (
5
+ InvalidDateFormatException,
6
+ InvalidNepaliDateTimeObjectException,
7
+ )
8
+
9
+ from ._datetime import nepalidate, nepalidatetime
10
+ from ._nepalimonth import nepalimonth
11
+ from ._nepaliweek import nepaliweek
12
+
13
+
14
+ class NepaliDateTimeFormatter:
15
+ """
16
+ NepaliDateTimeFormatter: formats nepali datetime to string ( using strftime )
17
+ """
18
+
19
+ # format according to python's datetime with class method
20
+ format_map = {
21
+ "a": "weekdayHalf",
22
+ "A": "weekdayFull",
23
+ "w": "weekdayNumber",
24
+ "d": "day",
25
+ "-d": "day_nonzero",
26
+ "b": "monthFull",
27
+ "B": "monthFull",
28
+ "m": "monthNumber",
29
+ "-m": "monthNumber_nonzero",
30
+ "y": "yearHalf",
31
+ "Y": "yearFull",
32
+ "H": "hour24",
33
+ "-H": "hour24_nonzero",
34
+ "I": "hour12",
35
+ "-I": "hour12_nonzero",
36
+ "p": "ampm",
37
+ "M": "minute",
38
+ "-M": "minute_nonzero",
39
+ "S": "second",
40
+ "-S": "second_nonzero",
41
+ }
42
+
43
+ def __init__(self, datetime_object, devanagari=False):
44
+ # TODO: Change variable npDateTime into snake case: `np_date_time`
45
+ if type(datetime_object) == nepalidatetime:
46
+ self.npDateTime = datetime_object
47
+ elif type(datetime_object) == nepalidate:
48
+ self.npDateTime = datetime_object.to_nepalidatetime()
49
+ elif type(datetime_object) == pythonDateTime.date:
50
+ self.npDateTime = nepalidatetime.from_date(datetime_object)
51
+ elif type(datetime_object) == pythonDateTime.datetime:
52
+ self.npDateTime = nepalidatetime.from_datetime(datetime_object)
53
+ else:
54
+ raise InvalidNepaliDateTimeObjectException(
55
+ "Argument must be instance of nepalidate or nepalidatetime or datetime.datetime or datetime.date"
56
+ )
57
+
58
+ self.devanagari = devanagari
59
+
60
+ def __str__(self):
61
+ return str(self.npDateTime)
62
+
63
+ def get_str(self, format):
64
+ """generates formatted string"""
65
+ i, n = 0, len(format)
66
+ time_str = []
67
+ try:
68
+ while i < n:
69
+ ch = format[i]
70
+ i += 1
71
+ if ch == "%":
72
+ if i < n:
73
+ ch = format[i]
74
+
75
+ if ch == "%":
76
+ # for % character
77
+ time_str.append("%")
78
+
79
+ elif ch == "-":
80
+ # special mid characters eg. "-" for non zero padded values
81
+ special_ch = ch
82
+ if i + 1 < n:
83
+ i += 1
84
+ ch = format[i]
85
+ time_str.append(
86
+ getattr(self, self.get_format_map(special_ch + ch))
87
+ )
88
+ else:
89
+ # mapping % forwarded character
90
+ time_str.append(getattr(self, self.get_format_map(ch)))
91
+ i += 1
92
+ else:
93
+ time_str.append(ch)
94
+ except InvalidDateFormatException as e:
95
+ raise e
96
+ except Exception:
97
+ raise Exception("Unable to convert NepaliDateTime to str")
98
+ time_str = "".join(time_str)
99
+
100
+ return time_str
101
+
102
+ def get_format_map(self, ch: str) -> str:
103
+ if ch not in self.format_map:
104
+ raise InvalidDateFormatException(f"Invalid Date format %{ch}")
105
+ return self.format_map[ch]
106
+
107
+ @property
108
+ def weekdayHalf(self):
109
+ """
110
+ %a
111
+ """
112
+ week = nepaliweek(self.npDateTime.weekday())
113
+ if not self.devanagari:
114
+ return week.abbr
115
+ return week.abbr_ne
116
+
117
+ @property
118
+ def weekdayFull(self):
119
+ """
120
+ %A
121
+ """
122
+ week = nepaliweek(self.npDateTime.weekday())
123
+ if not self.devanagari:
124
+ return week.name
125
+ return week.name_ne
126
+
127
+ @property
128
+ def weekdayNumber(self):
129
+ """
130
+ %w
131
+ """
132
+ if not self.devanagari:
133
+ return str(self.npDateTime.weekday())
134
+ return number.english_to_nepali(self.npDateTime.weekday())
135
+
136
+ @property
137
+ def day(self):
138
+ """
139
+ %d
140
+ """
141
+ day = str(self.npDateTime.day)
142
+ if len(day) < 2:
143
+ day = "0" + day
144
+ if not self.devanagari:
145
+ return str(day)
146
+ return number.english_to_nepali(day)
147
+
148
+ @property
149
+ def day_nonzero(self):
150
+ """
151
+ %-D
152
+ """
153
+ day = str(self.npDateTime.day)
154
+ if not self.devanagari:
155
+ return str(day)
156
+ return number.english_to_nepali(day)
157
+
158
+ @property
159
+ def monthFull(self):
160
+ """
161
+ %B or %b
162
+ """
163
+ month = nepalimonth(self.npDateTime.month)
164
+ if not self.devanagari:
165
+ return month.name
166
+ return month.name_ne
167
+
168
+ @property
169
+ def monthNumber(self):
170
+ """
171
+ %m
172
+ """
173
+ month = str(self.npDateTime.month)
174
+ if len(month) < 2:
175
+ month = "0" + month
176
+ if not self.devanagari:
177
+ return str(month)
178
+ return number.english_to_nepali(month)
179
+
180
+ @property
181
+ def monthNumber_nonzero(self):
182
+ """
183
+ %-m
184
+ """
185
+ month = str(self.npDateTime.month)
186
+ if not self.devanagari:
187
+ return str(month)
188
+ return number.english_to_nepali(month)
189
+
190
+ @property
191
+ def yearHalf(self):
192
+ """
193
+ %y
194
+ """
195
+ if not self.devanagari:
196
+ return str(self.npDateTime.year)[2:]
197
+ return number.english_to_nepali(str(self.npDateTime.year)[2:])
198
+
199
+ @property
200
+ def yearFull(self):
201
+ """
202
+ %Y
203
+ """
204
+ if not self.devanagari:
205
+ return str(self.npDateTime.year)
206
+ return number.english_to_nepali(self.npDateTime.year)
207
+
208
+ @property
209
+ def hour24(self):
210
+ """
211
+ %H
212
+ """
213
+ hour = str(self.npDateTime.hour)
214
+ if len(hour) < 2:
215
+ hour = "0" + hour
216
+ if not self.devanagari:
217
+ return str(hour)
218
+ return number.english_to_nepali(hour)
219
+
220
+ @property
221
+ def hour24_nonzero(self):
222
+ """
223
+ %-H
224
+ """
225
+ hour = self.npDateTime.hour
226
+ if not self.devanagari:
227
+ return str(hour)
228
+ return number.english_to_nepali(hour)
229
+
230
+ @property
231
+ def hour12(self):
232
+ """
233
+ %I
234
+ """
235
+ hour = self.npDateTime.hour
236
+ if hour > 12:
237
+ hour = hour - 12
238
+ if hour == 0:
239
+ hour = 12
240
+ hour = str(hour)
241
+ if len(hour) < 2:
242
+ hour = "0" + hour
243
+
244
+ if not self.devanagari:
245
+ return str(hour)
246
+ return number.english_to_nepali(hour)
247
+
248
+ @property
249
+ def hour12_nonzero(self):
250
+ """
251
+ %-I
252
+ """
253
+ hour = self.npDateTime.hour
254
+ if hour > 12:
255
+ hour = hour - 12
256
+ if hour == 0:
257
+ hour = 12
258
+ hour = str(hour)
259
+ if not self.devanagari:
260
+ return str(hour)
261
+ return number.english_to_nepali(hour)
262
+
263
+ @property
264
+ def ampm(self):
265
+ """
266
+ %p
267
+ """
268
+ if not self.devanagari:
269
+ ampm = "AM"
270
+ if self.npDateTime.hour > 12:
271
+ ampm = "PM"
272
+ return str(ampm)
273
+
274
+ ampm = ""
275
+ if self.npDateTime.hour < 12:
276
+ ampm = "शुभप्रभात"
277
+ elif self.npDateTime.hour >= 12 and self.npDateTime.hour < 18:
278
+ ampm = "मध्यान्ह"
279
+ else:
280
+ ampm = "अपरान्ह"
281
+ return str(ampm)
282
+
283
+ @property
284
+ def minute(self):
285
+ """
286
+ %M
287
+ """
288
+ minute = str(self.npDateTime.minute)
289
+ if len(minute) < 2:
290
+ minute = "0" + minute
291
+ if not self.devanagari:
292
+ return str(minute)
293
+ return number.english_to_nepali(minute)
294
+
295
+ @property
296
+ def minute_nonzero(self):
297
+ """
298
+ %-M
299
+ """
300
+ minute = str(self.npDateTime.minute)
301
+ if not self.devanagari:
302
+ return str(minute)
303
+ return number.english_to_nepali(minute)
304
+
305
+ @property
306
+ def second(self):
307
+ """
308
+ %S
309
+ """
310
+ second = str(self.npDateTime.second)
311
+ if len(second) < 2:
312
+ second = "0" + second
313
+ if not self.devanagari:
314
+ return str(second)
315
+ return number.english_to_nepali(second)
316
+
317
+ @property
318
+ def second_nonzero(self):
319
+ """
320
+ %-S
321
+ """
322
+ second = str(self.npDateTime.second)
323
+ if not self.devanagari:
324
+ return str(second)
325
+ return number.english_to_nepali(second)
@@ -1,139 +1,124 @@
1
- import datetime as pythonDateTime
2
-
3
- from nepali.char import NepaliChar
1
+ from nepali import number
4
2
  from nepali.timezone import now
5
- from nepali.exceptions import InvalidNepaliDateTimeObjectException
6
- from nepali.utils import to_nepali_timezone
7
3
 
8
- from ._datetime import nepalidate, nepalidatetime
4
+ from .utils import to_nepalidatetime
5
+
9
6
 
10
7
  class HumanizeDateTime:
11
- """
12
- HumanizeDate converts NepaliDateTime to nepali human readable form
13
- """
14
-
15
- __past_text = "अघि"
16
- __future_text = "पछि"
17
- __now_text = "भर्खरै"
18
- __year_text = "वर्ष"
19
- __month_text = "महिना"
20
- __day_text = "दिन"
21
- __hour_text = "घण्टा"
22
- __minute_text = "मिनेट"
23
- __second_text = "सेकेन्ड"
24
-
25
- def __init__(self, datetime_obj, *args, **kwargs):
26
- """
27
- initializes humanize class
28
- datetime_obj: python datetime object to be humanized
29
- threshold (kwargs): threshold to be humanize
30
- format (kwargs): format to display behind threshold
31
- """
32
- if type(datetime_obj) == nepalidatetime:
33
- self.datetime_obj = datetime_obj.to_datetime()
34
- elif type(datetime_obj) == nepalidate:
35
- self.datetime_obj = nepalidatetime.from_nepali_date(datetime_obj).to_datetime()
36
- elif type(datetime_obj) == pythonDateTime.date:
37
- self.datetime_obj = nepalidatetime.from_date(datetime_obj).to_datetime()
38
- elif type(datetime_obj) == pythonDateTime.datetime:
39
- self.datetime_obj = to_nepali_timezone(datetime_obj)
40
- else:
41
- raise InvalidNepaliDateTimeObjectException('Argument must be instance of NepaliDate or NepaliDateTime or datetime.datetime or datetime.date')
42
-
43
- self.threshold = kwargs.get('threshold')
44
- self.format = kwargs.get('format')
45
-
46
- # seconds after from now to datetime_obj
47
- self.seconds = None
48
-
49
-
50
- def __calc_seconds(self):
51
- """ calculates total seconds from now """
52
-
53
- current_date_time = now()
54
- date = self.datetime_obj
55
- self.seconds = int((current_date_time-date).total_seconds())
56
- self.interval_tense = self.__past_text
57
- if(self.seconds < 0):
58
- self.interval_tense = self.__future_text
59
-
60
- def to_str(self):
61
- """ returns humanize string """
62
-
63
- self.__calc_seconds() # refreshing seconds
64
- seconds = self.seconds
65
- if( seconds < 0):
66
- seconds = 0 - seconds
67
-
68
- if not self.threshold == None:
69
- if( seconds >= self.threshold):
70
- return self.get_datetime().strip()
71
-
72
- return self.get_humanize().strip()
73
-
74
-
75
- def get_humanize(self):
76
- """
77
- returns humanize datetime
78
- """
79
- self.__calc_seconds() # refreshing seconds
80
-
81
- interval_value = 0
82
- interval_text = ""
83
- if( self.seconds == 0 ):
84
- # now
85
- return self.__now_text
86
-
87
- elif( self.seconds < 60):
88
- # seconds
89
- interval_value = self.seconds
90
- interval_text = self.__second_text
91
-
92
- elif( self.seconds < 3600):
93
- # minute
94
- interval_value = self.seconds//60
95
- interval_text = self.__minute_text
96
-
97
- elif( self.seconds < 86400):
98
- # hour
99
- interval_value = self.seconds//3600
100
- interval_text = self.__hour_text
101
-
102
- elif( self.seconds < 2592000):
103
- # day
104
- interval_value = self.seconds//86400
105
- interval_text = self.__day_text
106
-
107
- elif( self.seconds < 946080000):
108
- # month
109
- interval_value = self.seconds//2592000
110
- interval_text = self.__month_text
111
-
112
- else:
113
- # year
114
- interval_value = self.seconds//946080000
115
- interval_text = self.__year_text
116
-
117
- interval_value = NepaliChar.number(interval_value)
118
- return str(interval_value)+' '+str(interval_text)+' '+self.interval_tense
119
-
120
-
121
- def get_datetime(self):
122
- """
123
- returns date in nepali characters
124
- """
125
- if not self.format:
126
- self.format = '%B %d, %Y'
127
- ndt = nepalidatetime.from_datetime(self.datetime_obj)
128
- return ndt.strftime(self.format)
129
-
130
- def __str__(self):
131
- return self.to_str()
132
-
133
- def __repr__(self):
134
- return str(self)
8
+ """
9
+ HumanizeDate converts NepaliDateTime to nepali human readable form
10
+ """
11
+
12
+ __past_text = "अघि"
13
+ __future_text = "पछि"
14
+ __now_text = "भर्खरै"
15
+ __year_text = "वर्ष"
16
+ __month_text = "महिना"
17
+ __day_text = "दिन"
18
+ __hour_text = "घण्टा"
19
+ __minute_text = "मिनेट"
20
+ __second_text = "सेकेन्ड"
21
+
22
+ def __init__(self, datetime_obj, **kwargs):
23
+ """
24
+ initializes humanize class
25
+ datetime_obj: python datetime object to be humanized
26
+ threshold (kwargs): threshold to be humanize
27
+ format (kwargs): format to display behind threshold
28
+ """
29
+ self.datetime_obj = to_nepalidatetime(datetime_obj)
30
+
31
+ self.threshold = kwargs.get("threshold")
32
+ self.format = kwargs.get("format")
33
+
34
+ # seconds after from now to datetime_obj
35
+ self.seconds = 0
36
+
37
+ def __calc_seconds(self):
38
+ """calculates total seconds from now"""
39
+ current_date_time = now()
40
+
41
+ # TODO (@aj3sh): support datetime - nepalidatetime
42
+ self.seconds = int(
43
+ (current_date_time - self.datetime_obj.to_datetime()).total_seconds()
44
+ )
45
+
46
+ self.interval_tense = self.__past_text
47
+ if self.seconds < 0:
48
+ self.seconds *= -1
49
+ self.interval_tense = self.__future_text
50
+
51
+ return self.seconds
52
+
53
+ def to_str(self):
54
+ """returns humanize string"""
55
+ seconds = self.__calc_seconds() # calculating seconds
56
+
57
+ if self.threshold is not None and seconds >= self.threshold:
58
+ return self._get_datetime_str().strip()
59
+
60
+ return self._get_humanize_str().strip()
61
+
62
+ def _get_humanize_str(self):
63
+ """
64
+ returns humanize datetime
65
+ """
66
+ interval_value = 0
67
+ interval_text = ""
68
+ if self.seconds == 0:
69
+ # now
70
+ return self.__now_text
71
+
72
+ elif self.seconds < 60:
73
+ # seconds
74
+ interval_value = self.seconds
75
+ interval_text = self.__second_text
76
+
77
+ elif self.seconds < 3600:
78
+ # minute
79
+ interval_value = self.seconds // 60
80
+ interval_text = self.__minute_text
81
+
82
+ elif self.seconds < 86400:
83
+ # hour
84
+ interval_value = self.seconds // 3600
85
+ interval_text = self.__hour_text
86
+
87
+ elif self.seconds < 2764800:
88
+ # day
89
+ interval_value = self.seconds // 86400
90
+ interval_text = self.__day_text
91
+
92
+ elif self.seconds < 31622400:
93
+ # month
94
+ interval_value = self.seconds // 2764800
95
+ interval_text = self.__month_text
96
+
97
+ else:
98
+ # year
99
+ interval_value = self.seconds // 31622400
100
+ interval_text = self.__year_text
101
+
102
+ interval_value = number.english_to_nepali(interval_value)
103
+ return (
104
+ str(interval_value) + " " + str(interval_text) + " " + self.interval_tense
105
+ )
106
+
107
+ def _get_datetime_str(self):
108
+ """
109
+ returns date in nepali characters
110
+ """
111
+ if not self.format:
112
+ self.format = "%B %d, %Y"
113
+ return self.datetime_obj.strftime_ne(self.format)
114
+
115
+ def __str__(self):
116
+ return self.to_str()
117
+
118
+ def __repr__(self):
119
+ return str(self)
135
120
 
136
121
 
137
122
  def nepalihumanize(datetime_obj, threshold=None, format=None):
138
- """ returns to humanize nepalidatetime """
139
- return HumanizeDateTime(datetime_obj, threshold=threshold, format=format).to_str()
123
+ """returns to humanize nepalidatetime"""
124
+ return HumanizeDateTime(datetime_obj, threshold=threshold, format=format).to_str()