Skip to content

Commit b964fcb

Browse files
committed
Add duration method for Datetime provider
1 parent 1eaf4f1 commit b964fcb

File tree

7 files changed

+108
-6
lines changed

7 files changed

+108
-6
lines changed

CHANGELOG.rst

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Version 17.0.0
2+
--------------
3+
4+
- Added ``mimesis.enums.DurationUnit`` enum.
5+
- Added ``.duration()`` method for ``Datetime`` provider to generate random durations.
6+
17
Version 16.0.0
28
--------------
39

docs/conf.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@
7070
# built documents.
7171
#
7272
# The short X.Y version.
73-
version = "16.0"
73+
version = "17.0"
7474
# The full version, including alpha/beta/rc tags.
75-
release = "16.0.0"
75+
release = "17.0.0"
7676

7777
# The language for content autogenerated by Sphinx. Refer to documentation
7878
# for a list of supported languages.

mimesis/__init__.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
CountryCode,
1717
DocumentFile,
1818
DSNType,
19+
DurationUnit,
1920
EANFormat,
2021
EmojyCategory,
2122
FileType,
@@ -107,6 +108,7 @@
107108
"Algorithm",
108109
"AudioFile",
109110
"CardType",
111+
"DurationUnit",
110112
"CompressedFile",
111113
"CountryCode",
112114
"DocumentFile",
@@ -146,7 +148,7 @@
146148
"__license__",
147149
]
148150

149-
__version__ = "16.0.0"
151+
__version__ = "17.0.0"
150152
__title__ = "mimesis"
151153
__description__ = "Mimesis: Fake Data Generator."
152154
__url__ = "https://github.com/lk-geimfari/mimesis"

mimesis/enums.py

+15
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@
1313
from enum import Enum, auto
1414

1515

16+
class DurationUnit(Enum):
17+
"""Provides duration units.
18+
19+
An argument for :meth:`~mimesis.Datetime.duration()`.
20+
"""
21+
22+
WEEKS = "weeks"
23+
DAYS = "days"
24+
HOURS = "hours"
25+
MINUTES = "minutes"
26+
SECONDS = "seconds"
27+
MILLISECONDS = "milliseconds"
28+
MICROSECONDS = "microseconds"
29+
30+
1631
class Locale(Enum):
1732
"""This class provides access to the supported locales from one place.
1833

mimesis/providers/date.py

+31-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from mimesis.compat import pytz
88
from mimesis.datasets import GMT_OFFSETS, ROMAN_NUMS, TIMEZONES
9-
from mimesis.enums import TimestampFormat, TimezoneRegion
9+
from mimesis.enums import DurationUnit, TimestampFormat, TimezoneRegion
1010
from mimesis.providers.base import BaseDataProvider
1111
from mimesis.types import Date, DateTime, Time
1212

@@ -288,3 +288,33 @@ def timestamp(
288288
return stamp.isoformat()
289289
else:
290290
return int(stamp.timestamp())
291+
292+
def duration(
293+
self,
294+
min_duration: int = 1,
295+
max_duration: int = 10,
296+
duration_unit: DurationUnit | None = DurationUnit.MINUTES,
297+
) -> timedelta:
298+
"""Generate a random duration.
299+
300+
The default duration unit is Duration.MINUTES.
301+
302+
When the duration unit is None, then random
303+
duration from DurationUnit is chosen.
304+
305+
A timedelta object represents a duration, the difference
306+
between two datetime or date instances.
307+
308+
:param min_duration: Minimum duration.
309+
:param max_duration: Maximum duration.
310+
:param duration_unit: Duration unit.
311+
:return: Duration as timedelta.
312+
"""
313+
if min_duration > max_duration:
314+
raise ValueError("min_duration must be less or equal to max_duration")
315+
316+
if not isinstance(min_duration, int) or not isinstance(max_duration, int):
317+
raise TypeError("min_duration and max_duration must be integers")
318+
319+
unit = self.validate_enum(duration_unit, DurationUnit)
320+
return timedelta(**{unit: self.random.randint(min_duration, max_duration)})

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "mimesis"
3-
version = "16.0.0"
3+
version = "17.0.0"
44
description = "Mimesis: Fake Data Generator."
55
authors = ["Isaak Uchakaev <[email protected]>"]
66
license = "MIT"

tests/test_providers/test_datetime.py tests/test_providers/test_date.py

+50-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from mimesis import Datetime
77
from mimesis.datasets import GMT_OFFSETS, TIMEZONES
8-
from mimesis.enums import TimestampFormat, TimezoneRegion
8+
from mimesis.enums import DurationUnit, TimestampFormat, TimezoneRegion
99
from mimesis.exceptions import NonEnumerableError
1010

1111
from . import patterns
@@ -215,6 +215,49 @@ def test_week_date(self, _datetime):
215215
assert (int(year) >= 2017) and (int(year) <= _datetime._CURRENT_YEAR)
216216
assert int(week) <= 52
217217

218+
@pytest.mark.parametrize(
219+
"min_duration, max_duration, duration_unit",
220+
[
221+
(1, 10, DurationUnit.WEEKS),
222+
(1, 10, DurationUnit.DAYS),
223+
(1, 10, DurationUnit.HOURS),
224+
(1, 10, DurationUnit.MINUTES),
225+
(1, 10, DurationUnit.SECONDS),
226+
(1, 10, DurationUnit.MILLISECONDS),
227+
(1, 10, DurationUnit.MICROSECONDS),
228+
(1, 10, None),
229+
],
230+
)
231+
def test_duration(self, _datetime, min_duration, max_duration, duration_unit):
232+
result = _datetime.duration(
233+
min_duration=min_duration,
234+
max_duration=max_duration,
235+
duration_unit=duration_unit,
236+
)
237+
assert isinstance(result, datetime.timedelta)
238+
239+
def test_duration_error(self, _datetime):
240+
with pytest.raises(ValueError):
241+
_datetime.duration(
242+
min_duration=10,
243+
max_duration=1,
244+
duration_unit=DurationUnit.WEEKS,
245+
)
246+
247+
with pytest.raises(NonEnumerableError):
248+
_datetime.duration(
249+
min_duration=10,
250+
max_duration=10,
251+
duration_unit="Blabla",
252+
)
253+
254+
with pytest.raises(TypeError):
255+
_datetime.duration(
256+
min_duration=10.5,
257+
max_duration=10.9,
258+
duration_unit=DurationUnit.WEEKS,
259+
)
260+
218261

219262
class TestSeededDatetime:
220263
@pytest.fixture
@@ -289,3 +332,9 @@ def test_bulk_create_datetimes(self, d1, d2):
289332
assert d1.bulk_create_datetimes(
290333
date_start, date_end, minutes=10
291334
) == d2.bulk_create_datetimes(date_start, date_end, minutes=10)
335+
336+
def test_duratioh(self, d1, d2):
337+
assert d1.duration() == d2.duration()
338+
assert d1.duration(10, 20, DurationUnit.WEEKS) == d2.duration(
339+
10, 20, DurationUnit.WEEKS
340+
)

0 commit comments

Comments
 (0)