Skip to content

Commit

Permalink
Handle unspecified and qualified ("16XX~")
Browse files Browse the repository at this point in the history
Unspecified dates previously could not handle qualification. Unspecified dates also couldn't handle dates with 3 unspecified digits ("1XXX"). This commit adds both those features and tests for those use cases.
  • Loading branch information
ColeDCrawford committed May 28, 2024
1 parent d550274 commit ef24bc7
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 4 deletions.
7 changes: 7 additions & 0 deletions edtf/appsettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@
PADDING_MONTH_PRECISION = EDTF.get("PADDING_MONTH_PRECISION", relativedelta(months=1))
PADDING_YEAR_PRECISION = EDTF.get("PADDING_YEAR_PRECISION", relativedelta(years=1))
PADDING_SEASON_PRECISION = EDTF.get("PADDING_SEASON_PRECISION", relativedelta(weeks=12))
PADDING_DECADE_PRECISION = EDTF.get("PADDING_DECADE_PRECISION", relativedelta(years=10))
PADDING_CENTURY_PRECISION = EDTF.get(
"PADDING_CENTURY_PRECISION", relativedelta(years=100)
)
PADDING_MILLENNIUM_PRECISION = EDTF.get(
"PADDING_MILLENNIUM_PRECISION", relativedelta(years=1000)
)
MULTIPLIER_IF_UNCERTAIN = EDTF.get("MULTIPLIER_IF_UNCERTAIN", 1.0)
MULTIPLIER_IF_APPROXIMATE = EDTF.get("MULTIPLIER_IF_APPROXIMATE", 1.0)
MULTIPLIER_IF_BOTH = EDTF.get("MULTIPLIER_IF_BOTH", 2.0)
Expand Down
8 changes: 5 additions & 3 deletions edtf/parser/grammar.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,17 +161,19 @@ def f(toks):
Level1Interval.set_parser(level1Interval)

# (* *** unspecified *** *)
yearWithOneOrTwoUnspecifedDigits = Combine(digit + digit + (digit ^ "X") + "X")("year")
yearWithOneOrTwoOrThreeUnspecifedDigits = Combine(
digit + (digit ^ "X") + (digit ^ "X") + "X"
)("year")
monthUnspecified = year + "-" + L("XX")("month")
dayUnspecified = yearMonth + "-" + L("XX")("day")
dayAndMonthUnspecified = year + "-" + L("XX")("month") + "-" + L("XX")("day")

unspecified = (
yearWithOneOrTwoUnspecifedDigits
yearWithOneOrTwoOrThreeUnspecifedDigits
^ monthUnspecified
^ dayUnspecified
^ dayAndMonthUnspecified
)
) + Optional(UASymbol)("ua")
Unspecified.set_parser(unspecified)

# (* *** uncertainOrApproxDate *** *)
Expand Down
84 changes: 83 additions & 1 deletion edtf/parser/parser_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,89 @@ def precision(self):


class Unspecified(Date):
pass
def __init__(
self,
year=None,
month=None,
day=None,
significant_digits=None,
ua=None,
**kwargs,
):
for param in ("date", "lower", "upper"):
if param in kwargs:
self.__init__(**kwargs[param])
return
self.year = year # Year is required, but sometimes passed in as a 'date' dict.
self.month = month
self.day = day
self.significant_digits = (
int(significant_digits) if significant_digits else None
)
self.ua = ua if ua else None

def __str__(self):
r = self.year
if self.month:
r += f"-{self.month}"
if self.day:
r += f"-{self.day}"
if self.ua:
r += str(self.ua)
return r

def _get_fuzzy_padding(self, lean):
if not self.ua:
return relativedelta()
multiplier = self.ua._get_multiplier()
padding = relativedelta()

if self.year:
if self.precision == PRECISION_MILLENIUM:
padding += relativedelta(
years=int(
multiplier * appsettings.PADDING_MILLENNIUM_PRECISION.years
)
)
elif self.precision == PRECISION_CENTURY:
padding += relativedelta(
years=int(multiplier * appsettings.PADDING_CENTURY_PRECISION.years)
)
elif self.precision == PRECISION_DECADE:
padding += relativedelta(
years=int(multiplier * appsettings.PADDING_DECADE_PRECISION.years)
)
else:
padding += relativedelta(
years=int(multiplier * appsettings.PADDING_YEAR_PRECISION.years)
)
if self.month:
padding += relativedelta(
months=int(multiplier * appsettings.PADDING_MONTH_PRECISION.months)
)
if self.day:
padding += relativedelta(
days=int(multiplier * appsettings.PADDING_DAY_PRECISION.days)
)

return padding

@property
def precision(self):
if self.day:
return PRECISION_DAY
if self.month:
return PRECISION_MONTH
if self.year:
if self.year.isdigit():
return PRECISION_YEAR
if len(self.year) == 4 and self.year.endswith("XXX"):
return PRECISION_MILLENIUM
if len(self.year) == 4 and self.year.endswith("XX"):
return PRECISION_CENTURY
if len(self.year) == 4 and self.year.endswith("X"):
return PRECISION_DECADE
raise ValueError(f"Unspecified date {self} has no precision")


class Level1Interval(Interval):
Expand Down
7 changes: 7 additions & 0 deletions edtf/parser/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,13 @@
("-0275~", ("-0275-01-01", "-0275-12-31", "-0276-01-01", "-0274-12-31")),
("-0001~", ("-0001-01-01", "-0001-12-31", "-0002-01-01", "0000-12-31")),
("0000~", ("0000-01-01", "0000-12-31", "-0001-01-01", "0001-12-31")),
# Unspecified and qualified
# "circa 17th century"
("16XX~", ("1600-01-01", "1699-12-31", "1500-01-01", "1799-12-31")),
("16XX%", ("1600-01-01", "1699-12-31", "1400-01-01", "1899-12-31")),
("1XXX", ("1000-01-01", "1999-12-31")),
("1XXX~", ("1000-01-01", "1999-12-31", "0000-01-01", "2999-12-31")),
("156X~", ("1560-01-01", "1569-12-31", "1550-01-01", "1579-12-31")),
# L1 Extended Interval
# beginning unknown, end 2006
# for intervals with an unknown beginning or end, the unknown bound is calculated with the constant DELTA_IF_UNKNOWN (10 years)
Expand Down

4 comments on commit ef24bc7

@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.py27485%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.py10100%3, 5, 10, 179, 184–185, 190–191, 207, 211
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123992%147–150, 348, 352–355
   parser_classes.py60032545%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, 553–560, 563, 566–573, 576–579, 581–583, 588–589, 592–593, 597, 600–601, 604–605, 609, 613–626, 631–633, 637, 639, 642–644, 648, 650, 655–658, 663–664, 669–670, 672, 675, 678–680, 682, 685, 688–691, 693–699, 706–709, 711–717, 726–727, 730, 733, 736–738, 740, 748, 767–769, 771–774, 776–777, 779–780, 782, 785–786, 788–789, 791, 793, 795–796, 798, 800–805, 807, 809, 811–812, 814, 817–819, 822–824, 827–829, 837, 839–840, 843–844, 847–848, 851–852, 854–855, 859, 863–864, 867, 872–873, 877–878, 880–888, 890, 900–901, 903, 905–906, 908, 911, 916, 921, 927–928, 931, 934, 937, 939–941, 943, 948–949, 951, 960–961, 964, 967, 970–971, 973, 982–983, 985–987, 989, 998–1000, 1005, 1008–1009, 1011, 1016
   tests.py76760%3–4, 6, 8–10, 26, 226, 240, 262, 264–267, 269–271, 273–277, 280–281, 283–284, 287–289, 292–293, 296–299, 302, 305–309, 312, 315, 318, 321–326, 329, 332, 335, 340–341, 343–344, 347, 349–354, 356–363, 366–368, 370
edtf
   __init__.py40100% 
   appsettings.py27292%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.py10190%211
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123199%354
   parser_classes.py6009484%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, 555–556, 577, 597, 601, 605, 614, 616, 619, 626, 685, 691, 695, 709, 713, 786, 804–805, 807, 812, 818, 823, 828, 864, 867, 873, 878, 880–888, 903, 908, 985, 989, 1016
   tests.py76198%370
TOTAL264295463% 

Tests Skipped Failures Errors Time
254 0 💤 0 ❌ 0 🔥 2.525s ⏱️

@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.py27485%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.py10100%3, 5, 10, 179, 184–185, 190–191, 207, 211
/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123992%147–150, 348, 352–355
   parser_classes.py60032545%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, 553–560, 563, 566–573, 576–579, 581–583, 588–589, 592–593, 597, 600–601, 604–605, 609, 613–626, 631–633, 637, 639, 642–644, 648, 650, 655–658, 663–664, 669–670, 672, 675, 678–680, 682, 685, 688–691, 693–699, 706–709, 711–717, 726–727, 730, 733, 736–738, 740, 748, 767–769, 771–774, 776–777, 779–780, 782, 785–786, 788–789, 791, 793, 795–796, 798, 800–805, 807, 809, 811–812, 814, 817–819, 822–824, 827–829, 837, 839–840, 843–844, 847–848, 851–852, 854–855, 859, 863–864, 867, 872–873, 877–878, 880–888, 890, 900–901, 903, 905–906, 908, 911, 916, 921, 927–928, 931, 934, 937, 939–941, 943, 948–949, 951, 960–961, 964, 967, 970–971, 973, 982–983, 985–987, 989, 998–1000, 1005, 1008–1009, 1011, 1016
   tests.py76760%3–4, 6, 8–10, 26, 226, 240, 262, 264–267, 269–271, 273–277, 280–281, 283–284, 287–289, 292–293, 296–299, 302, 305–309, 312, 315, 318, 321–326, 329, 332, 335, 340–341, 343–344, 347, 349–354, 356–363, 366–368, 370
edtf
   __init__.py40100% 
   appsettings.py27292%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.py10190%211
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123199%354
   parser_classes.py6009484%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, 555–556, 577, 597, 601, 605, 614, 616, 619, 626, 685, 691, 695, 709, 713, 786, 804–805, 807, 812, 818, 823, 828, 864, 867, 873, 878, 880–888, 903, 908, 985, 989, 1016
   tests.py76198%370
TOTAL264295463% 

Tests Skipped Failures Errors Time
254 0 💤 0 ❌ 0 🔥 2.679s ⏱️

@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.py27485%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.py10100%3, 5, 10, 179, 184–185, 190–191, 207, 211
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123992%147–150, 348, 352–355
   parser_classes.py60032545%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, 553–560, 563, 566–573, 576–579, 581–583, 588–589, 592–593, 597, 600–601, 604–605, 609, 613–626, 631–633, 637, 639, 642–644, 648, 650, 655–658, 663–664, 669–670, 672, 675, 678–680, 682, 685, 688–691, 693–699, 706–709, 711–717, 726–727, 730, 733, 736–738, 740, 748, 767–769, 771–774, 776–777, 779–780, 782, 785–786, 788–789, 791, 793, 795–796, 798, 800–805, 807, 809, 811–812, 814, 817–819, 822–824, 827–829, 837, 839–840, 843–844, 847–848, 851–852, 854–855, 859, 863–864, 867, 872–873, 877–878, 880–888, 890, 900–901, 903, 905–906, 908, 911, 916, 921, 927–928, 931, 934, 937, 939–941, 943, 948–949, 951, 960–961, 964, 967, 970–971, 973, 982–983, 985–987, 989, 998–1000, 1005, 1008–1009, 1011, 1016
   tests.py76760%3–4, 6, 8–10, 26, 226, 240, 262, 264–267, 269–271, 273–277, 280–281, 283–284, 287–289, 292–293, 296–299, 302, 305–309, 312, 315, 318, 321–326, 329, 332, 335, 340–341, 343–344, 347, 349–354, 356–363, 366–368, 370
edtf
   __init__.py40100% 
   appsettings.py27292%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.py10190%211
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123199%354
   parser_classes.py6009484%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, 555–556, 577, 597, 601, 605, 614, 616, 619, 626, 685, 691, 695, 709, 713, 786, 804–805, 807, 812, 818, 823, 828, 864, 867, 873, 878, 880–888, 903, 908, 985, 989, 1016
   tests.py76198%370
TOTAL264295463% 

Tests Skipped Failures Errors Time
254 0 💤 0 ❌ 0 🔥 2.629s ⏱️

@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.py27485%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.py10100%3, 5, 10, 179, 184–185, 190–191, 207, 211
/opt/hostedtoolcache/Python/3.12.3/x64/lib/python3.12/site-packages/edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123992%147–150, 348, 352–355
   parser_classes.py60032545%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, 553–560, 563, 566–573, 576–579, 581–583, 588–589, 592–593, 597, 600–601, 604–605, 609, 613–626, 631–633, 637, 639, 642–644, 648, 650, 655–658, 663–664, 669–670, 672, 675, 678–680, 682, 685, 688–691, 693–699, 706–709, 711–717, 726–727, 730, 733, 736–738, 740, 748, 767–769, 771–774, 776–777, 779–780, 782, 785–786, 788–789, 791, 793, 795–796, 798, 800–805, 807, 809, 811–812, 814, 817–819, 822–824, 827–829, 837, 839–840, 843–844, 847–848, 851–852, 854–855, 859, 863–864, 867, 872–873, 877–878, 880–888, 890, 900–901, 903, 905–906, 908, 911, 916, 921, 927–928, 931, 934, 937, 939–941, 943, 948–949, 951, 960–961, 964, 967, 970–971, 973, 982–983, 985–987, 989, 998–1000, 1005, 1008–1009, 1011, 1016
   tests.py76760%3–4, 6, 8–10, 26, 226, 240, 262, 264–267, 269–271, 273–277, 280–281, 283–284, 287–289, 292–293, 296–299, 302, 305–309, 312, 315, 318, 321–326, 329, 332, 335, 340–341, 343–344, 347, 349–354, 356–363, 366–368, 370
edtf
   __init__.py40100% 
   appsettings.py27292%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.py10190%211
edtf/parser
   __init__.py40100% 
   edtf_exceptions.py30100% 
   grammar.py123199%354
   parser_classes.py6009484%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, 555–556, 577, 597, 601, 605, 614, 616, 619, 626, 685, 691, 695, 709, 713, 786, 804–805, 807, 812, 818, 823, 828, 864, 867, 873, 878, 880–888, 903, 908, 985, 989, 1016
   tests.py76198%370
TOTAL264295463% 

Tests Skipped Failures Errors Time
254 0 💤 0 ❌ 0 🔥 4.070s ⏱️

Please sign in to comment.