Skip to content

Commit

Permalink
Significant digits updates
Browse files Browse the repository at this point in the history
- Adds functionality for significant digits to Date, LongYear, and ExponentialYear
- Updates the tests for significant digits
- Updates the docs for significant digits and a few other references to old syntax (lowercase e, grouping)
- ExponentialYear inherits from LongYear so only need to add it there; LongYear does not inherit from Date, so a bit of code duplication in the _fuzzy() overrides
  • Loading branch information
ColeDCrawford committed May 24, 2024
1 parent 6b3a9d4 commit 5883f53
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 16 deletions.
42 changes: 35 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,8 @@ Test coverage includes every example given in the spec table of features.

* Partial uncertain/approximate:

>>> parse_edtf('(2011)-06-04~') # year certain, month/day approximate.
# Note that the result text is normalized
PartialUncertainOrApproximate: '2011-(06-04)~'
>>> parse_edtf('2004-06~-11') # year certain, month/day approximate.
PartialUncertainOrApproximate: '2004-06~-11'

* Partial unspecified:

Expand All @@ -159,13 +158,42 @@ Test coverage includes every example given in the spec table of features.

* Level 2 Extended intervals:

>>> parse_edtf('2004-06-(01)~/2004-06-(20)~')
Level2Interval: '2004-06-(01)~/2004-06-(20)~'
>>> parse_edtf('2004-06-~01/2004-06-~20')
Level2Interval: '2004-06-~01/2004-06-~20'

* Year requiring more than 4 digits - exponential form:

>>> parse_edtf('Y-17e7')
ExponentialYear: 'Y-17e7'
>>> e = parse_edtf('Y-17E7')
ExponentialYear: 'Y-17E7'
>>> e.estimated()
-170000000

* Significant digits:
# '1950S2': some year between 1900 and 1999, estimated to be 1950
>>> d = parse_edtf('1950S2')
Date: '1950S2'
>>> d.lower_fuzzy()[:3]
(1900, 1, 1)
>>> d.upper_fuzzy()[:3]
(1999, 12, 31)
# 'Y171010000S3': some year between some year between 171000000 and 171999999 estimated to be 171010000, with 3 significant digits.
>>> l = parse_edtf('Y171010000S3')
LongYear: 'Y171010000S3'
>>> l.estimated()
171010000
>>> l.lower_fuzzy()[:3]
(171000000, 1, 1)
>>> l.upper_fuzzy()[:3]
(171999999, 12, 31)
# 'Y3388E2S3': some year in exponential notation between 338000 and 338999, estimated to be 338800
>>> e = parse_edtf('Y3388E2S3')
ExponentialYear: 'Y3388E2S3S3'
>>> e.estimated()
338800
>>> e.lower_fuzzy()[:3]
(338000, 1, 1)
>>> e.upper_fuzzy()[:3]
(338999, 12, 31)

### Natural language representation

Expand Down
78 changes: 75 additions & 3 deletions edtf/parser/parser_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,9 @@ def __init__(
self.year = year # Year is required, but sometimes passed in as a 'date' dict.
self.month = month
self.day = day
self.significant_digits = significant_digits
self.significant_digits = (
int(significant_digits) if significant_digits else None
)

def __str__(self):
r = self.year
Expand All @@ -291,6 +293,36 @@ def isoformat(self, default=date.max):
int(self.day or default.day),
)

def lower_fuzzy(self):
if not hasattr(self, "significant_digits") or not self.significant_digits:
return apply_delta(
sub, self.lower_strict(), self._get_fuzzy_padding(EARLIEST)
)
else:
total_digits = len(self.year)
insignificant_digits = total_digits - self.significant_digits
lower_year = (
int(self.year)
// (10**insignificant_digits)
* (10**insignificant_digits)
)
return struct_time([lower_year, 1, 1] + TIME_EMPTY_TIME + TIME_EMPTY_EXTRAS)

def upper_fuzzy(self):
if not hasattr(self, "significant_digits") or not self.significant_digits:
return apply_delta(
add, self.upper_strict(), self._get_fuzzy_padding(LATEST)
)
else:
total_digits = len(self.year)
insignificant_digits = total_digits - self.significant_digits
upper_year = (int(self.year) // (10**insignificant_digits) + 1) * (
10**insignificant_digits
) - 1
return struct_time(
[upper_year, 12, 31] + TIME_EMPTY_TIME + TIME_EMPTY_EXTRAS
)

def _precise_year(self, lean):
# Replace any ambiguous characters in the year string with 0s or 9s
if lean == EARLIEST:
Expand Down Expand Up @@ -547,7 +579,9 @@ def _get_fuzzy_padding(self, lean):
class LongYear(EDTFObject):
def __init__(self, year, significant_digits=None):
self.year = year
self.significant_digits = significant_digits
self.significant_digits = (
int(significant_digits) if significant_digits else None
)

def __str__(self):
if self.significant_digits:
Expand All @@ -568,6 +602,42 @@ def _strict_date(self, lean):
def estimated(self):
return self._precise_year()

def lower_fuzzy(self):
full_year = self._precise_year()
strict_val = self.lower_strict()
if not self.significant_digits:
return apply_delta(sub, strict_val, self._get_fuzzy_padding(EARLIEST))
else:
insignificant_digits = len(str(full_year)) - int(self.significant_digits)
if insignificant_digits <= 0:
return apply_delta(sub, strict_val, self._get_fuzzy_padding(EARLIEST))
padding_value = 10**insignificant_digits
sig_digits = full_year // padding_value
lower_year = sig_digits * padding_value
return apply_delta(
sub,
struct_time([lower_year, 1, 1] + TIME_EMPTY_TIME + TIME_EMPTY_EXTRAS),
self._get_fuzzy_padding(EARLIEST),
)

def upper_fuzzy(self):
full_year = self._precise_year()
strict_val = self.upper_strict()
if not self.significant_digits:
return apply_delta(add, strict_val, self._get_fuzzy_padding(LATEST))
else:
insignificant_digits = len(str(full_year)) - self.significant_digits
if insignificant_digits <= 0:
return apply_delta(add, strict_val, self._get_fuzzy_padding(LATEST))
padding_value = 10**insignificant_digits
sig_digits = full_year // padding_value
upper_year = (sig_digits + 1) * padding_value - 1
return apply_delta(
add,
struct_time([upper_year, 12, 31] + TIME_EMPTY_TIME + TIME_EMPTY_EXTRAS),
self._get_fuzzy_padding(LATEST),
)


class Season(Date):
def __init__(self, year, season, **kwargs):
Expand Down Expand Up @@ -845,7 +915,9 @@ class ExponentialYear(LongYear):
def __init__(self, base, exponent, significant_digits=None):
self.base = base
self.exponent = exponent
self.significant_digits = significant_digits
self.significant_digits = (
int(significant_digits) if significant_digits else None
)

def _precise_year(self):
return int(self.base) * 10 ** int(self.exponent)
Expand Down
20 changes: 14 additions & 6 deletions edtf/parser/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
# where the first value is a tuple, the second item is a tuple of the normalised parse result.
#
# The values in the second tuple indicate the iso versions of the derived Python `date`s.
# - If there's one other value, all the derived dates should be the same.
# - If there're two other values, then all the lower values should be the same
# - If there is one other value, all the derived dates should be the same.
# - If there are two other values, then all the lower values should be the same
# and all the upper values should be the same.
# - If there are three other values, then the upper and lower ``_strict`` values
# should be the first value, and the upper and lower ``_fuzzy`` values should be
Expand Down Expand Up @@ -194,13 +194,21 @@
("Y-17E7", ("-170000000-01-01", "-170000000-12-31")),
# L2 significant digits
# Some year between 1900 and 1999, estimated to be 1950
("1950S2", ("1900-01-01", "1999-12-31")),
("1950S2", ("1950-01-01", "1950-12-31", "1900-01-01", "1999-12-31")),
("1953S2", ("1953-01-01", "1953-12-31", "1900-01-01", "1999-12-31")),
("1953S3", ("1953-01-01", "1953-12-31", "1950-01-01", "1959-12-31")),
# Some year between 171010000 and 171999999, estimated to be 171010000 ('S3' indicates a precision of 3 significant digits.)
("Y17101E4S3", ("171000000-01-01", "171999999-12-31")),
(
"Y17101E4S3",
("171010000-01-01", "171010000-12-31", "171000000-01-01", "171999999-12-31"),
),
# Some year between 338000 and 338999, estimated to be 338800
("Y3388E2S3", ("338000-01-01", "338999-12-31")),
("Y3388E2S3", ("338800-01-01", "338800-12-31", "338000-01-01", "338999-12-31")),
# some year between 171000000 and 171999999 estimated to be 171010000
("Y171010000S3", ("171010000-01-01", "171999999-12-31")),
(
"Y171010000S3",
("171010000-01-01", "171010000-12-31", "171000000-01-01", "171999999-12-31"),
),
# L2 Seasons
# Spring southern hemisphere, 2001
("2001-29", ("2001-09-01", "2001-11-30")),
Expand Down

5 comments on commit 5883f53

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/edtf
   __init__.py40100% 
   appsettings.py24483%10–13
   convert.py634430%11–19, 21, 38–39, 52, 61, 72–73, 75, 104, 107–109, 113, 117, 136–156
   fields.py922177%88, 93, 95, 98–99, 101–102, 104, 109, 113–116, 155, 157, 159, 169–170, 174–175, 183
   jdutil.py986632%37, 55, 91–92, 105, 152, 154–155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 251–252, 254–255, 257–258, 260, 262, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py71710%3–4, 6, 9–13, 16–21, 24–25, 28–29, 32–37, 40–44, 52–53, 56–62, 65–71, 74–79, 82–85, 88–91, 94–97, 100–107
/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/edtf/natlang
   __init__.py20100% 
   en.py1487152%34, 44–45, 47–50, 55–56, 59–62, 64, 68–71, 73–74, 76–78, 86–88, 90–94, 104, 106, 119, 126, 157–159, 161–166, 169–171, 173–178, 202–205, 209, 224, 226–227, 229, 246, 248, 256, 258, 260, 262, 267, 270, 276
   tests.py660%3, 5, 10, 179, 184–185
/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121992%137–140, 336, 340–343
   parser_classes.py54827749%69, 71, 78–81, 83–84, 86–87, 110–112, 116, 119, 122, 181, 183, 190, 192, 198–202, 207–213, 220–224, 229–235, 246, 257, 286, 290, 302–304, 309, 317–319, 322, 337–338, 342, 371–375, 378, 383–384, 387, 390, 393, 396–400, 403–407, 427–429, 453, 457, 462, 464, 478, 485, 501, 510–512, 514–516, 519–520, 522, 525–528, 530, 532–534, 536, 540, 549–551, 555, 557, 560–562, 566, 568, 573–576, 581–582, 587–588, 590, 593, 596–598, 600, 603, 606–609, 611–617, 624–627, 629–635, 644–645, 648, 651, 654–656, 658, 666, 685–687, 689–692, 694–695, 697–698, 700, 703–704, 706–707, 709, 711, 713–714, 716, 718–723, 725, 727, 729–730, 732, 735–737, 740–742, 745–747, 755, 757–758, 761–762, 765–766, 769–770, 772–773, 777, 781–782, 785, 790–791, 795–796, 798–806, 808, 818–819, 821, 823–824, 826, 829, 834, 839, 845–846, 849, 852, 855, 857–859, 861, 866–867, 869, 878–879, 882, 885, 888–889, 891, 900–901, 903–905, 907, 916–918, 923, 926–927, 929, 934
   tests.py71710%3–4, 6, 8–10, 26, 219, 241, 243–246, 248–250, 252–256, 259–260, 262–263, 266–268, 271–272, 275–278, 281, 284–288, 291, 294, 297, 300–305, 308, 311, 314, 319–320, 322–323, 326, 328–333, 335–342
edtf
   __init__.py40100% 
   appsettings.py24291%12–13
   convert.py631182%11–19, 21, 73
   fields.py92920%1, 3–6, 8–10, 12, 20, 26, 28, 30–32, 35–36, 48–49, 64, 66, 69, 71–74, 76–80, 82–83, 85, 87–88, 90, 92–93, 95, 97–99, 101–102, 104, 106–109, 111, 113–116, 118, 127–129, 132, 135, 141–142, 144–146, 149, 153, 155, 157, 159, 162–175, 181, 183–184, 186–187, 192–193
   jdutil.py984455%37, 55, 91–92, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py710100% 
edtf/natlang
   __init__.py20100% 
   en.py1481192%56, 59, 119, 165–166, 177–178, 204–205, 209, 276
   tests.py60100% 
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121199%342
   parser_classes.py5488484%110–112, 119, 122, 183, 189–193, 200–202, 209–213, 222–224, 229–235, 246, 337–338, 371–375, 378, 393, 396–400, 403–407, 427–429, 540, 603, 609, 613, 627, 631, 704, 722–723, 725, 730, 736, 741, 746, 782, 785, 791, 796, 798–806, 821, 826, 903, 907, 934
   tests.py710100% 
TOTAL251088564% 

Tests Skipped Failures Errors Time
249 0 💤 0 ❌ 0 🔥 3.591s ⏱️

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/edtf
   __init__.py40100% 
   appsettings.py24483%10–13
   convert.py634430%11–19, 21, 38–39, 52, 61, 72–73, 75, 104, 107–109, 113, 117, 136–156
   fields.py922177%88, 93, 95, 98–99, 101–102, 104, 109, 113–116, 155, 157, 159, 169–170, 174–175, 183
   jdutil.py986632%37, 55, 91–92, 105, 152, 154–155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 251–252, 254–255, 257–258, 260, 262, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py71710%3–4, 6, 9–13, 16–21, 24–25, 28–29, 32–37, 40–44, 52–53, 56–62, 65–71, 74–79, 82–85, 88–91, 94–97, 100–107
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/edtf/natlang
   __init__.py20100% 
   en.py1487152%34, 44–45, 47–50, 55–56, 59–62, 64, 68–71, 73–74, 76–78, 86–88, 90–94, 104, 106, 119, 126, 157–159, 161–166, 169–171, 173–178, 202–205, 209, 224, 226–227, 229, 246, 248, 256, 258, 260, 262, 267, 270, 276
   tests.py660%3, 5, 10, 179, 184–185
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121992%137–140, 336, 340–343
   parser_classes.py54827749%69, 71, 78–81, 83–84, 86–87, 110–112, 116, 119, 122, 181, 183, 190, 192, 198–202, 207–213, 220–224, 229–235, 246, 257, 286, 290, 302–304, 309, 317–319, 322, 337–338, 342, 371–375, 378, 383–384, 387, 390, 393, 396–400, 403–407, 427–429, 453, 457, 462, 464, 478, 485, 501, 510–512, 514–516, 519–520, 522, 525–528, 530, 532–534, 536, 540, 549–551, 555, 557, 560–562, 566, 568, 573–576, 581–582, 587–588, 590, 593, 596–598, 600, 603, 606–609, 611–617, 624–627, 629–635, 644–645, 648, 651, 654–656, 658, 666, 685–687, 689–692, 694–695, 697–698, 700, 703–704, 706–707, 709, 711, 713–714, 716, 718–723, 725, 727, 729–730, 732, 735–737, 740–742, 745–747, 755, 757–758, 761–762, 765–766, 769–770, 772–773, 777, 781–782, 785, 790–791, 795–796, 798–806, 808, 818–819, 821, 823–824, 826, 829, 834, 839, 845–846, 849, 852, 855, 857–859, 861, 866–867, 869, 878–879, 882, 885, 888–889, 891, 900–901, 903–905, 907, 916–918, 923, 926–927, 929, 934
   tests.py71710%3–4, 6, 8–10, 26, 219, 241, 243–246, 248–250, 252–256, 259–260, 262–263, 266–268, 271–272, 275–278, 281, 284–288, 291, 294, 297, 300–305, 308, 311, 314, 319–320, 322–323, 326, 328–333, 335–342
edtf
   __init__.py40100% 
   appsettings.py24291%12–13
   convert.py631182%11–19, 21, 73
   fields.py92920%1, 3–6, 8–10, 12, 20, 26, 28, 30–32, 35–36, 48–49, 64, 66, 69, 71–74, 76–80, 82–83, 85, 87–88, 90, 92–93, 95, 97–99, 101–102, 104, 106–109, 111, 113–116, 118, 127–129, 132, 135, 141–142, 144–146, 149, 153, 155, 157, 159, 162–175, 181, 183–184, 186–187, 192–193
   jdutil.py984455%37, 55, 91–92, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py710100% 
edtf/natlang
   __init__.py20100% 
   en.py1481192%56, 59, 119, 165–166, 177–178, 204–205, 209, 276
   tests.py60100% 
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121199%342
   parser_classes.py5488484%110–112, 119, 122, 183, 189–193, 200–202, 209–213, 222–224, 229–235, 246, 337–338, 371–375, 378, 393, 396–400, 403–407, 427–429, 540, 603, 609, 613, 627, 631, 704, 722–723, 725, 730, 736, 741, 746, 782, 785, 791, 796, 798–806, 821, 826, 903, 907, 934
   tests.py710100% 
TOTAL251088564% 

Tests Skipped Failures Errors Time
249 0 💤 0 ❌ 0 🔥 3.839s ⏱️

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/edtf
   __init__.py40100% 
   appsettings.py24483%10–13
   convert.py634430%11–19, 21, 38–39, 52, 61, 72–73, 75, 104, 107–109, 113, 117, 136–156
   fields.py922177%88, 93, 95, 98–99, 101–102, 104, 109, 113–116, 155, 157, 159, 169–170, 174–175, 183
   jdutil.py986632%37, 55, 91–92, 105, 152, 154–155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 251–252, 254–255, 257–258, 260, 262, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py71710%3–4, 6, 9–13, 16–21, 24–25, 28–29, 32–37, 40–44, 52–53, 56–62, 65–71, 74–79, 82–85, 88–91, 94–97, 100–107
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/edtf/natlang
   __init__.py20100% 
   en.py1487152%34, 44–45, 47–50, 55–56, 59–62, 64, 68–71, 73–74, 76–78, 86–88, 90–94, 104, 106, 119, 126, 157–159, 161–166, 169–171, 173–178, 202–205, 209, 224, 226–227, 229, 246, 248, 256, 258, 260, 262, 267, 270, 276
   tests.py660%3, 5, 10, 179, 184–185
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121992%137–140, 336, 340–343
   parser_classes.py54827749%69, 71, 78–81, 83–84, 86–87, 110–112, 116, 119, 122, 181, 183, 190, 192, 198–202, 207–213, 220–224, 229–235, 246, 257, 286, 290, 302–304, 309, 317–319, 322, 337–338, 342, 371–375, 378, 383–384, 387, 390, 393, 396–400, 403–407, 427–429, 453, 457, 462, 464, 478, 485, 501, 510–512, 514–516, 519–520, 522, 525–528, 530, 532–534, 536, 540, 549–551, 555, 557, 560–562, 566, 568, 573–576, 581–582, 587–588, 590, 593, 596–598, 600, 603, 606–609, 611–617, 624–627, 629–635, 644–645, 648, 651, 654–656, 658, 666, 685–687, 689–692, 694–695, 697–698, 700, 703–704, 706–707, 709, 711, 713–714, 716, 718–723, 725, 727, 729–730, 732, 735–737, 740–742, 745–747, 755, 757–758, 761–762, 765–766, 769–770, 772–773, 777, 781–782, 785, 790–791, 795–796, 798–806, 808, 818–819, 821, 823–824, 826, 829, 834, 839, 845–846, 849, 852, 855, 857–859, 861, 866–867, 869, 878–879, 882, 885, 888–889, 891, 900–901, 903–905, 907, 916–918, 923, 926–927, 929, 934
   tests.py71710%3–4, 6, 8–10, 26, 219, 241, 243–246, 248–250, 252–256, 259–260, 262–263, 266–268, 271–272, 275–278, 281, 284–288, 291, 294, 297, 300–305, 308, 311, 314, 319–320, 322–323, 326, 328–333, 335–342
edtf
   __init__.py40100% 
   appsettings.py24291%12–13
   convert.py631182%11–19, 21, 73
   fields.py92920%1, 3–6, 8–10, 12, 20, 26, 28, 30–32, 35–36, 48–49, 64, 66, 69, 71–74, 76–80, 82–83, 85, 87–88, 90, 92–93, 95, 97–99, 101–102, 104, 106–109, 111, 113–116, 118, 127–129, 132, 135, 141–142, 144–146, 149, 153, 155, 157, 159, 162–175, 181, 183–184, 186–187, 192–193
   jdutil.py984455%37, 55, 91–92, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py710100% 
edtf/natlang
   __init__.py20100% 
   en.py1481192%56, 59, 119, 165–166, 177–178, 204–205, 209, 276
   tests.py60100% 
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121199%342
   parser_classes.py5488484%110–112, 119, 122, 183, 189–193, 200–202, 209–213, 222–224, 229–235, 246, 337–338, 371–375, 378, 393, 396–400, 403–407, 427–429, 540, 603, 609, 613, 627, 631, 704, 722–723, 725, 730, 736, 741, 746, 782, 785, 791, 796, 798–806, 821, 826, 903, 907, 934
   tests.py710100% 
TOTAL251088564% 

Tests Skipped Failures Errors Time
249 0 💤 0 ❌ 0 🔥 3.979s ⏱️

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/edtf
   __init__.py40100% 
   appsettings.py24483%10–13
   convert.py634430%11–19, 21, 38–39, 52, 61, 72–73, 75, 104, 107–109, 113, 117, 136–156
   fields.py922177%88, 93, 95, 98–99, 101–102, 104, 109, 113–116, 155, 157, 159, 169–170, 174–175, 183
   jdutil.py986632%37, 55, 91–92, 105, 152, 154–155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 251–252, 254–255, 257–258, 260, 262, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py71710%3–4, 6, 9–13, 16–21, 24–25, 28–29, 32–37, 40–44, 52–53, 56–62, 65–71, 74–79, 82–85, 88–91, 94–97, 100–107
/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/edtf/natlang
   __init__.py20100% 
   en.py1487152%34, 44–45, 47–50, 55–56, 59–62, 64, 68–71, 73–74, 76–78, 86–88, 90–94, 104, 106, 119, 126, 157–159, 161–166, 169–171, 173–178, 202–205, 209, 224, 226–227, 229, 246, 248, 256, 258, 260, 262, 267, 270, 276
   tests.py660%3, 5, 10, 179, 184–185
/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121992%137–140, 336, 340–343
   parser_classes.py54827749%69, 71, 78–81, 83–84, 86–87, 110–112, 116, 119, 122, 181, 183, 190, 192, 198–202, 207–213, 220–224, 229–235, 246, 257, 286, 290, 302–304, 309, 317–319, 322, 337–338, 342, 371–375, 378, 383–384, 387, 390, 393, 396–400, 403–407, 427–429, 453, 457, 462, 464, 478, 485, 501, 510–512, 514–516, 519–520, 522, 525–528, 530, 532–534, 536, 540, 549–551, 555, 557, 560–562, 566, 568, 573–576, 581–582, 587–588, 590, 593, 596–598, 600, 603, 606–609, 611–617, 624–627, 629–635, 644–645, 648, 651, 654–656, 658, 666, 685–687, 689–692, 694–695, 697–698, 700, 703–704, 706–707, 709, 711, 713–714, 716, 718–723, 725, 727, 729–730, 732, 735–737, 740–742, 745–747, 755, 757–758, 761–762, 765–766, 769–770, 772–773, 777, 781–782, 785, 790–791, 795–796, 798–806, 808, 818–819, 821, 823–824, 826, 829, 834, 839, 845–846, 849, 852, 855, 857–859, 861, 866–867, 869, 878–879, 882, 885, 888–889, 891, 900–901, 903–905, 907, 916–918, 923, 926–927, 929, 934
   tests.py71710%3–4, 6, 8–10, 26, 219, 241, 243–246, 248–250, 252–256, 259–260, 262–263, 266–268, 271–272, 275–278, 281, 284–288, 291, 294, 297, 300–305, 308, 311, 314, 319–320, 322–323, 326, 328–333, 335–342
edtf
   __init__.py40100% 
   appsettings.py24291%12–13
   convert.py631182%11–19, 21, 73
   fields.py92920%1, 3–6, 8–10, 12, 20, 26, 28, 30–32, 35–36, 48–49, 64, 66, 69, 71–74, 76–80, 82–83, 85, 87–88, 90, 92–93, 95, 97–99, 101–102, 104, 106–109, 111, 113–116, 118, 127–129, 132, 135, 141–142, 144–146, 149, 153, 155, 157, 159, 162–175, 181, 183–184, 186–187, 192–193
   jdutil.py984455%37, 55, 91–92, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py710100% 
edtf/natlang
   __init__.py20100% 
   en.py1481192%56, 59, 119, 165–166, 177–178, 204–205, 209, 276
   tests.py60100% 
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121199%342
   parser_classes.py5488484%110–112, 119, 122, 183, 189–193, 200–202, 209–213, 222–224, 229–235, 246, 337–338, 371–375, 378, 393, 396–400, 403–407, 427–429, 540, 603, 609, 613, 627, 631, 704, 722–723, 725, 730, 736, 741, 746, 782, 785, 791, 796, 798–806, 821, 826, 903, 907, 934
   tests.py710100% 
TOTAL251088564% 

Tests Skipped Failures Errors Time
249 0 💤 0 ❌ 0 🔥 3.990s ⏱️

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
/opt/hostedtoolcache/Python/3.12.3/x64/lib/python3.12/site-packages/edtf
   __init__.py40100% 
   appsettings.py24483%10–13
   convert.py634430%11–19, 21, 38–39, 52, 61, 72–73, 75, 104, 107–109, 113, 117, 136–156
   fields.py922177%88, 93, 95, 98–99, 101–102, 104, 109, 113–116, 155, 157, 159, 169–170, 174–175, 183
   jdutil.py986632%37, 55, 91–92, 105, 152, 154–155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 251–252, 254–255, 257–258, 260, 262, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py71710%3–4, 6, 9–13, 16–21, 24–25, 28–29, 32–37, 40–44, 52–53, 56–62, 65–71, 74–79, 82–85, 88–91, 94–97, 100–107
/opt/hostedtoolcache/Python/3.12.3/x64/lib/python3.12/site-packages/edtf/natlang
   __init__.py20100% 
   en.py1487152%34, 44–45, 47–50, 55–56, 59–62, 64, 68–71, 73–74, 76–78, 86–88, 90–94, 104, 106, 119, 126, 157–159, 161–166, 169–171, 173–178, 202–205, 209, 224, 226–227, 229, 246, 248, 256, 258, 260, 262, 267, 270, 276
   tests.py660%3, 5, 10, 179, 184–185
/opt/hostedtoolcache/Python/3.12.3/x64/lib/python3.12/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121992%137–140, 336, 340–343
   parser_classes.py54827749%69, 71, 78–81, 83–84, 86–87, 110–112, 116, 119, 122, 181, 183, 190, 192, 198–202, 207–213, 220–224, 229–235, 246, 257, 286, 290, 302–304, 309, 317–319, 322, 337–338, 342, 371–375, 378, 383–384, 387, 390, 393, 396–400, 403–407, 427–429, 453, 457, 462, 464, 478, 485, 501, 510–512, 514–516, 519–520, 522, 525–528, 530, 532–534, 536, 540, 549–551, 555, 557, 560–562, 566, 568, 573–576, 581–582, 587–588, 590, 593, 596–598, 600, 603, 606–609, 611–617, 624–627, 629–635, 644–645, 648, 651, 654–656, 658, 666, 685–687, 689–692, 694–695, 697–698, 700, 703–704, 706–707, 709, 711, 713–714, 716, 718–723, 725, 727, 729–730, 732, 735–737, 740–742, 745–747, 755, 757–758, 761–762, 765–766, 769–770, 772–773, 777, 781–782, 785, 790–791, 795–796, 798–806, 808, 818–819, 821, 823–824, 826, 829, 834, 839, 845–846, 849, 852, 855, 857–859, 861, 866–867, 869, 878–879, 882, 885, 888–889, 891, 900–901, 903–905, 907, 916–918, 923, 926–927, 929, 934
   tests.py71710%3–4, 6, 8–10, 26, 219, 241, 243–246, 248–250, 252–256, 259–260, 262–263, 266–268, 271–272, 275–278, 281, 284–288, 291, 294, 297, 300–305, 308, 311, 314, 319–320, 322–323, 326, 328–333, 335–342
edtf
   __init__.py40100% 
   appsettings.py24291%12–13
   convert.py631182%11–19, 21, 73
   fields.py92920%1, 3–6, 8–10, 12, 20, 26, 28, 30–32, 35–36, 48–49, 64, 66, 69, 71–74, 76–80, 82–83, 85, 87–88, 90, 92–93, 95, 97–99, 101–102, 104, 106–109, 111, 113–116, 118, 127–129, 132, 135, 141–142, 144–146, 149, 153, 155, 157, 159, 162–175, 181, 183–184, 186–187, 192–193
   jdutil.py984455%37, 55, 91–92, 287, 291, 314, 316–317, 319, 321, 346, 348, 350, 370–372, 374, 376, 378, 381–383, 385, 387, 389, 392–393, 395, 397, 399–400, 402, 405–407, 410–413, 415, 417, 424, 431
   tests.py710100% 
edtf/natlang
   __init__.py20100% 
   en.py1481192%56, 59, 119, 165–166, 177–178, 204–205, 209, 276
   tests.py60100% 
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py121199%342
   parser_classes.py5488484%110–112, 119, 122, 183, 189–193, 200–202, 209–213, 222–224, 229–235, 246, 337–338, 371–375, 378, 393, 396–400, 403–407, 427–429, 540, 603, 609, 613, 627, 631, 704, 722–723, 725, 730, 736, 741, 746, 782, 785, 791, 796, 798–806, 821, 826, 903, 907, 934
   tests.py710100% 
TOTAL251088564% 

Tests Skipped Failures Errors Time
249 0 💤 0 ❌ 0 🔥 5.888s ⏱️

Please sign in to comment.