Skip to content

Commit ae07ba3

Browse files
Isira-Seneviratnelitetex
authored andcommitted
Remove unused method in TimeAgoParser
1 parent a7154c3 commit ae07ba3

3 files changed

Lines changed: 138 additions & 223 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,14 @@
77
import java.time.OffsetDateTime;
88
import java.time.ZoneOffset;
99
import java.time.temporal.ChronoUnit;
10-
import java.util.ArrayList;
11-
import java.util.List;
1210
import java.util.Map;
1311
import java.util.regex.Pattern;
14-
import java.util.regex.Matcher;
15-
import java.util.regex.MatchResult;
1612

1713
/**
1814
* A helper class that is meant to be used by services that need to parse durations such as
1915
* {@code 23 seconds} and/or upload dates in the format {@code 2 days ago} or similar.
2016
*/
2117
public class TimeAgoParser {
22-
23-
private static final Pattern DURATION_PATTERN = Pattern.compile("(?:(\\d+) )?([A-z]+)");
24-
2518
private final PatternsHolder patternsHolder;
2619
private final OffsetDateTime now;
2720

@@ -50,13 +43,11 @@ public TimeAgoParser(final PatternsHolder patternsHolder) {
5043
* @throws ParsingException if the time unit could not be recognized
5144
*/
5245
public DateWrapper parse(final String textualDate) throws ParsingException {
53-
for (final Map.Entry<ChronoUnit, Map<String, Integer>> caseUnitEntry
54-
: patternsHolder.specialCases().entrySet()) {
46+
for (final var caseUnitEntry : patternsHolder.specialCases().entrySet()) {
5547
final ChronoUnit chronoUnit = caseUnitEntry.getKey();
56-
for (final Map.Entry<String, Integer> caseMapToAmountEntry
57-
: caseUnitEntry.getValue().entrySet()) {
48+
for (final var caseMapToAmountEntry : caseUnitEntry.getValue().entrySet()) {
5849
final String caseText = caseMapToAmountEntry.getKey();
59-
final Integer caseAmount = caseMapToAmountEntry.getValue();
50+
final int caseAmount = caseMapToAmountEntry.getValue();
6051

6152
if (textualDateMatches(textualDate, caseText)) {
6253
return getResultFor(caseAmount, chronoUnit);
@@ -67,48 +58,6 @@ public DateWrapper parse(final String textualDate) throws ParsingException {
6758
return getResultFor(parseTimeAgoAmount(textualDate), parseChronoUnit(textualDate));
6859
}
6960

70-
/**
71-
* Parses a textual duration into a duration computer number.
72-
*
73-
* @param textualDuration the textual duration to parse
74-
* @return the textual duration parsed, as a primitive {@code long}
75-
* @throws ParsingException if the textual duration could not be parsed
76-
*/
77-
public long parseDuration(final String textualDuration) throws ParsingException {
78-
// We can't use Matcher.results, as it is only available on Android 14 and above
79-
final Matcher matcher = DURATION_PATTERN.matcher(textualDuration);
80-
final List<MatchResult> results = new ArrayList<>();
81-
while (matcher.find()) {
82-
results.add(matcher.toMatchResult());
83-
}
84-
85-
return results.stream()
86-
.map(match -> {
87-
final String digits = match.group(1);
88-
final String word = match.group(2);
89-
90-
int amount;
91-
try {
92-
amount = Integer.parseInt(digits);
93-
} catch (final NumberFormatException ignored) {
94-
amount = 1;
95-
}
96-
97-
final ChronoUnit unit;
98-
try {
99-
unit = parseChronoUnit(word);
100-
} catch (final ParsingException ignored) {
101-
return 0L;
102-
}
103-
104-
return amount * unit.getDuration().getSeconds();
105-
})
106-
.filter(n -> n > 0)
107-
.reduce(Long::sum)
108-
.orElseThrow(() -> new ParsingException(
109-
"Could not parse duration \"" + textualDuration + "\""));
110-
}
111-
11261
private int parseTimeAgoAmount(final String textualDate) {
11362
try {
11463
return Integer.parseInt(textualDate.replaceAll("\\D+", ""));
Lines changed: 135 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,151 @@
11
package org.schabi.newpipe.extractor.localization;
22

3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
36
import org.junit.jupiter.api.BeforeAll;
47
import org.junit.jupiter.api.Test;
58
import org.schabi.newpipe.extractor.exceptions.ParsingException;
69

7-
import static org.junit.jupiter.api.Assertions.assertEquals;
8-
import static org.junit.jupiter.api.Assertions.assertThrows;
10+
import java.time.OffsetDateTime;
11+
import java.time.ZoneOffset;
12+
import java.time.temporal.ChronoUnit;
913

10-
class TimeAgoParserTest {
11-
private static TimeAgoParser timeAgoParser;
14+
public class TimeAgoParserTest {
15+
private static TimeAgoParser parser;
16+
private static OffsetDateTime now;
1217

1318
@BeforeAll
14-
static void setUp() {
15-
timeAgoParser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.DEFAULT);
19+
public static void setUp() {
20+
parser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.DEFAULT);
21+
now = OffsetDateTime.now(ZoneOffset.UTC);
1622
}
1723

1824
@Test
19-
void testGetDuration() throws ParsingException {
20-
assertEquals(1, timeAgoParser.parseDuration("one second"));
21-
assertEquals(1, timeAgoParser.parseDuration("second"));
22-
assertEquals(49, timeAgoParser.parseDuration("49 seconds"));
23-
assertEquals(61, timeAgoParser.parseDuration("1 minute, 1 second"));
25+
void parseTimeAgo() throws ParsingException {
26+
assertTimeWithin1s(
27+
now.minusSeconds(1),
28+
parser.parse("1 second ago").offsetDateTime()
29+
);
30+
assertTimeWithin1s(
31+
now.minusSeconds(12),
32+
parser.parse("12 second ago").offsetDateTime()
33+
);
34+
assertTimeWithin1s(
35+
now.minusMinutes(1),
36+
parser.parse("1 minute ago").offsetDateTime()
37+
);
38+
assertTimeWithin1s(
39+
now.minusMinutes(23),
40+
parser.parse("23 minutes ago").offsetDateTime()
41+
);
42+
assertTimeWithin1s(
43+
now.minusHours(1),
44+
parser.parse("1 hour ago").offsetDateTime()
45+
);
46+
assertTimeWithin1s(
47+
now.minusHours(8),
48+
parser.parse("8 hours ago").offsetDateTime()
49+
);
50+
assertEquals(
51+
now.minusDays(1).truncatedTo(ChronoUnit.HOURS),
52+
parser.parse("1 day ago").offsetDateTime()
53+
);
54+
assertEquals(
55+
now.minusDays(3).truncatedTo(ChronoUnit.HOURS),
56+
parser.parse("3 days ago").offsetDateTime()
57+
);
58+
assertEquals(
59+
now.minusWeeks(1).truncatedTo(ChronoUnit.HOURS),
60+
parser.parse("1 week ago").offsetDateTime()
61+
);
62+
assertEquals(
63+
now.minusWeeks(3).truncatedTo(ChronoUnit.HOURS),
64+
parser.parse("3 weeks ago").offsetDateTime()
65+
);
66+
assertEquals(
67+
now.minusMonths(1).truncatedTo(ChronoUnit.HOURS),
68+
parser.parse("1 month ago").offsetDateTime()
69+
);
70+
assertEquals(
71+
now.minusMonths(3).truncatedTo(ChronoUnit.HOURS),
72+
parser.parse("3 months ago").offsetDateTime()
73+
);
74+
assertEquals(
75+
now.minusYears(1).minusDays(1).truncatedTo(ChronoUnit.HOURS),
76+
parser.parse("1 year ago").offsetDateTime()
77+
);
78+
assertEquals(
79+
now.minusYears(3).minusDays(1).truncatedTo(ChronoUnit.HOURS),
80+
parser.parse("3 years ago").offsetDateTime()
81+
);
2482
}
2583

2684
@Test
27-
void testGetDurationError() {
28-
assertThrows(ParsingException.class, () -> timeAgoParser.parseDuration("abcd"));
29-
assertThrows(ParsingException.class, () -> timeAgoParser.parseDuration("12 abcd"));
85+
void parseTimeAgoShort() throws ParsingException {
86+
final TimeAgoParser parser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.DEFAULT);
87+
final OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
88+
89+
assertTimeWithin1s(
90+
now.minusSeconds(1),
91+
parser.parse("1 sec ago").offsetDateTime()
92+
);
93+
assertTimeWithin1s(
94+
now.minusSeconds(12),
95+
parser.parse("12 sec ago").offsetDateTime()
96+
);
97+
assertTimeWithin1s(
98+
now.minusMinutes(1),
99+
parser.parse("1 min ago").offsetDateTime()
100+
);
101+
assertTimeWithin1s(
102+
now.minusMinutes(23),
103+
parser.parse("23 min ago").offsetDateTime()
104+
);
105+
assertTimeWithin1s(
106+
now.minusHours(1),
107+
parser.parse("1 hr ago").offsetDateTime()
108+
);
109+
assertTimeWithin1s(
110+
now.minusHours(8),
111+
parser.parse("8 hr ago").offsetDateTime()
112+
);
113+
assertEquals(
114+
now.minusDays(1).truncatedTo(ChronoUnit.HOURS),
115+
parser.parse("1 day ago").offsetDateTime()
116+
);
117+
assertEquals(
118+
now.minusDays(3).truncatedTo(ChronoUnit.HOURS),
119+
parser.parse("3 days ago").offsetDateTime()
120+
);
121+
assertEquals(
122+
now.minusWeeks(1).truncatedTo(ChronoUnit.HOURS),
123+
parser.parse("1 wk ago").offsetDateTime()
124+
);
125+
assertEquals(
126+
now.minusWeeks(3).truncatedTo(ChronoUnit.HOURS),
127+
parser.parse("3 wk ago").offsetDateTime()
128+
);
129+
assertEquals(
130+
now.minusMonths(1).truncatedTo(ChronoUnit.HOURS),
131+
parser.parse("1 mo ago").offsetDateTime()
132+
);
133+
assertEquals(
134+
now.minusMonths(3).truncatedTo(ChronoUnit.HOURS),
135+
parser.parse("3 mo ago").offsetDateTime()
136+
);
137+
assertEquals(
138+
now.minusYears(1).minusDays(1).truncatedTo(ChronoUnit.HOURS),
139+
parser.parse("1 yr ago").offsetDateTime()
140+
);
141+
assertEquals(
142+
now.minusYears(3).minusDays(1).truncatedTo(ChronoUnit.HOURS),
143+
parser.parse("3 yr ago").offsetDateTime()
144+
);
145+
}
146+
147+
void assertTimeWithin1s(final OffsetDateTime expected, final OffsetDateTime actual) {
148+
final long delta = Math.abs(expected.toEpochSecond() - actual.toEpochSecond());
149+
assertTrue(delta <= 1, String.format("Expected: %s\nActual: %s", expected, actual));
30150
}
31-
}
151+
}

0 commit comments

Comments
 (0)