Skip to content

Commit ca4d79d

Browse files
committed
Add exact keyword when parsing and deprecate strict meaning
1 parent 3a6b274 commit ca4d79d

File tree

4 files changed

+50
-12
lines changed

4 files changed

+50
-12
lines changed

docs/_docs/instantiation.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,15 +274,15 @@ When passing only time information the date will default to today.
274274

275275
.. note::
276276

277-
You can pass the ``strict`` keyword argument to ``parse()`` to get the exact type
277+
You can pass the ``exact`` keyword argument to ``parse()`` to get the exact type
278278
that the string represents:
279279

280280
.. code-block:: python
281281
282282
import pendulum
283283
284-
pendulum.parse('2012-05-03', strict=True)
284+
pendulum.parse('2012-05-03', exact=True)
285285
# <Date [2012-05-03]>
286286
287-
pendulum.parse('12:04:23', strict=True)
287+
pendulum.parse('12:04:23', exact=True)
288288
# <Time [12:04:23]>

pendulum/parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def parse(self, text):
3030

3131
parsed = super(Parser, self).parse(text)
3232

33-
if not self.is_strict():
33+
if not self.is_exact():
3434
return self._create_pendulum_object(parsed)
3535

3636
# Checking for date

pendulum/parsing/parser.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import re
44
import copy
5+
import warnings
56

67
from datetime import datetime, date, time
78
from dateutil import parser
@@ -58,16 +59,35 @@ class Parser(object):
5859
DEFAULT_OPTIONS = {
5960
'day_first': False,
6061
'year_first': True,
61-
'strict': False,
62+
'exact': False,
6263
'now': None
6364
}
6465

6566
def __init__(self, **options):
67+
if 'strict' in options:
68+
warnings.warn(
69+
'The "strict" keyword when parsing will have '
70+
'another meaning in version 2.0. Use "exact" instead.',
71+
DeprecationWarning,
72+
stacklevel=2
73+
)
74+
75+
options['exact'] = options['strict']
76+
6677
self._options = copy.copy(self.DEFAULT_OPTIONS)
6778
self._options.update(options)
6879

6980
def is_strict(self):
70-
return self._options['strict']
81+
warnings.warn(
82+
'is_strict() is deprecated. Use is_exact() instead.',
83+
DeprecationWarning,
84+
stacklevel=2
85+
)
86+
87+
return self.is_exact()
88+
89+
def is_exact(self):
90+
return self._options['exact']
7191

7292
def now(self):
7393
return self._options['now'] or datetime.now()

tests/parsing_test/test_parser.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -472,49 +472,67 @@ def test_iso8601_ordinal_invalid(self):
472472

473473
self.assertRaises(ParserError, Parser().parse, text)
474474

475-
def test_strict(self):
475+
def test_exact(self):
476476
text = '2012'
477477

478-
parsed = Parser(strict=True).parse(text)
478+
parsed = Parser(exact=True).parse(text)
479479
self.assertEqual(len(parsed), 3)
480480
self.assertEqual(2012, parsed['year'])
481481
self.assertEqual(1, parsed['month'])
482482
self.assertEqual(1, parsed['day'])
483483

484484
text = '2012-03'
485485

486-
parsed = Parser(strict=True).parse(text)
486+
parsed = Parser(exact=True).parse(text)
487487
self.assertEqual(len(parsed), 3)
488488
self.assertEqual(2012, parsed['year'])
489489
self.assertEqual(3, parsed['month'])
490490
self.assertEqual(1, parsed['day'])
491491

492492
text = '2012-03-13'
493493

494-
parsed = Parser(strict=True).parse(text)
494+
parsed = Parser(exact=True).parse(text)
495495
self.assertEqual(len(parsed), 3)
496496
self.assertEqual(2012, parsed['year'])
497497
self.assertEqual(3, parsed['month'])
498498
self.assertEqual(13, parsed['day'])
499499

500500
text = '2012W055'
501501

502-
parsed = Parser(strict=True).parse(text)
502+
parsed = Parser(exact=True).parse(text)
503503
self.assertEqual(len(parsed), 3)
504504
self.assertEqual(2012, parsed['year'])
505505
self.assertEqual(2, parsed['month'])
506506
self.assertEqual(3, parsed['day'])
507507

508508
text = '2012007'
509509

510-
parsed = Parser(strict=True).parse(text)
510+
parsed = Parser(exact=True).parse(text)
511511
self.assertEqual(len(parsed), 3)
512512
self.assertEqual(2012, parsed['year'])
513513
self.assertEqual(1, parsed['month'])
514514
self.assertEqual(7, parsed['day'])
515515

516516
text = '20:12:05'
517517

518+
parsed = Parser(exact=True).parse(text)
519+
self.assertEqual(len(parsed), 5)
520+
self.assertEqual(20, parsed['hour'])
521+
self.assertEqual(12, parsed['minute'])
522+
self.assertEqual(5, parsed['second'])
523+
self.assertEqual(0, parsed['subsecond'])
524+
525+
def test_strict_is_still_supported(self):
526+
text = '2012'
527+
528+
parsed = Parser(strict=True).parse(text)
529+
self.assertEqual(len(parsed), 3)
530+
self.assertEqual(2012, parsed['year'])
531+
self.assertEqual(1, parsed['month'])
532+
self.assertEqual(1, parsed['day'])
533+
534+
text = '20:12:05'
535+
518536
parsed = Parser(strict=True).parse(text)
519537
self.assertEqual(len(parsed), 5)
520538
self.assertEqual(20, parsed['hour'])

0 commit comments

Comments
 (0)