chronic 0.1.5 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
- data/.gitignore +5 -0
- data/.yardopts +3 -0
- data/HISTORY.md +180 -0
- data/LICENSE +21 -0
- data/README.md +176 -0
- data/Rakefile +39 -32
- data/chronic.gemspec +17 -0
- data/lib/chronic/chronic.rb +294 -208
- data/lib/chronic/grabber.rb +22 -17
- data/lib/chronic/handler.rb +90 -0
- data/lib/chronic/handlers.rb +365 -278
- data/lib/chronic/mini_date.rb +38 -0
- data/lib/chronic/numerizer.rb +121 -0
- data/lib/chronic/ordinal.rb +23 -19
- data/lib/chronic/pointer.rb +20 -17
- data/lib/chronic/repeater.rb +126 -105
- data/lib/chronic/repeaters/repeater_day.rb +49 -43
- data/lib/chronic/repeaters/repeater_day_name.rb +48 -42
- data/lib/chronic/repeaters/repeater_day_portion.rb +81 -80
- data/lib/chronic/repeaters/repeater_fortnight.rb +59 -53
- data/lib/chronic/repeaters/repeater_hour.rb +49 -43
- data/lib/chronic/repeaters/repeater_minute.rb +55 -39
- data/lib/chronic/repeaters/repeater_month.rb +77 -55
- data/lib/chronic/repeaters/repeater_month_name.rb +83 -82
- data/lib/chronic/repeaters/repeater_season.rb +107 -21
- data/lib/chronic/repeaters/repeater_season_name.rb +41 -22
- data/lib/chronic/repeaters/repeater_second.rb +39 -33
- data/lib/chronic/repeaters/repeater_time.rb +117 -103
- data/lib/chronic/repeaters/repeater_week.rb +63 -57
- data/lib/chronic/repeaters/repeater_weekday.rb +85 -0
- data/lib/chronic/repeaters/repeater_weekend.rb +64 -9
- data/lib/chronic/repeaters/repeater_year.rb +70 -51
- data/lib/chronic/scalar.rb +64 -29
- data/lib/chronic/season.rb +37 -0
- data/lib/chronic/separator.rb +50 -38
- data/lib/chronic/span.rb +31 -0
- data/lib/chronic/tag.rb +42 -0
- data/lib/chronic/time_zone.rb +30 -0
- data/lib/chronic/token.rb +45 -0
- data/lib/chronic.rb +86 -22
- data/test/helper.rb +6 -0
- data/test/test_Chronic.rb +118 -20
- data/test/test_DaylightSavings.rb +118 -0
- data/test/test_Handler.rb +36 -42
- data/test/test_MiniDate.rb +32 -0
- data/test/test_Numerizer.rb +72 -0
- data/test/test_RepeaterDayName.rb +15 -16
- data/test/test_RepeaterFortnight.rb +16 -17
- data/test/test_RepeaterHour.rb +22 -19
- data/test/test_RepeaterMinute.rb +34 -0
- data/test/test_RepeaterMonth.rb +20 -17
- data/test/test_RepeaterMonthName.rb +17 -18
- data/test/test_RepeaterSeason.rb +40 -0
- data/test/test_RepeaterTime.rb +20 -22
- data/test/test_RepeaterWeek.rb +16 -17
- data/test/test_RepeaterWeekday.rb +55 -0
- data/test/test_RepeaterWeekend.rb +74 -0
- data/test/test_RepeaterYear.rb +24 -18
- data/test/test_Span.rb +5 -6
- data/test/test_Token.rb +5 -6
- data/test/test_parsing.rb +743 -338
- metadata +81 -54
- data/History.txt +0 -29
- data/Manifest.txt +0 -43
- data/README.txt +0 -149
- data/test/parse_numbers.rb +0 -50
- data/test/suite.rb +0 -9
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Chronic
|
|
2
|
+
class Handler
|
|
3
|
+
|
|
4
|
+
# @return [Array] A list of patterns
|
|
5
|
+
attr_reader :pattern
|
|
6
|
+
|
|
7
|
+
# @return [Symbol] The method which handles this list of patterns.
|
|
8
|
+
# This method should exist inside the {Handlers} module
|
|
9
|
+
attr_reader :handler_method
|
|
10
|
+
|
|
11
|
+
# @param [Array] pattern A list of patterns to match tokens against
|
|
12
|
+
# @param [Symbol] handler_method The method to be invoked when patterns
|
|
13
|
+
# are matched. This method should exist inside the {Handlers} module
|
|
14
|
+
def initialize(pattern, handler_method)
|
|
15
|
+
@pattern = pattern
|
|
16
|
+
@handler_method = handler_method
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @param [Array] tokens
|
|
20
|
+
# @param [Hash] definitions
|
|
21
|
+
# @return [Boolean]
|
|
22
|
+
# @see Chronic.tokens_to_span
|
|
23
|
+
def match(tokens, definitions)
|
|
24
|
+
token_index = 0
|
|
25
|
+
|
|
26
|
+
@pattern.each do |element|
|
|
27
|
+
name = element.to_s
|
|
28
|
+
optional = name[-1, 1] == '?'
|
|
29
|
+
name = name.chop if optional
|
|
30
|
+
|
|
31
|
+
case element
|
|
32
|
+
when Symbol
|
|
33
|
+
if tags_match?(name, tokens, token_index)
|
|
34
|
+
token_index += 1
|
|
35
|
+
next
|
|
36
|
+
else
|
|
37
|
+
if optional
|
|
38
|
+
next
|
|
39
|
+
else
|
|
40
|
+
return false
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
when String
|
|
44
|
+
return true if optional && token_index == tokens.size
|
|
45
|
+
|
|
46
|
+
if definitions.key?(name.to_sym)
|
|
47
|
+
sub_handlers = definitions[name.to_sym]
|
|
48
|
+
else
|
|
49
|
+
raise ChronicPain, "Invalid subset #{name} specified"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
sub_handlers.each do |sub_handler|
|
|
53
|
+
return true if sub_handler.match(tokens[token_index..tokens.size], definitions)
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
raise ChronicPain, "Invalid match type: #{element.class}"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
return false if token_index != tokens.size
|
|
61
|
+
return true
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def invoke(type, tokens, options)
|
|
65
|
+
if Chronic.debug
|
|
66
|
+
puts "-#{type}"
|
|
67
|
+
puts "Handler: #{@handler_method}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
Handlers.send(@handler_method, tokens, options)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @param [Handler] The handler to compare
|
|
74
|
+
# @return [Boolean] True if these handlers match
|
|
75
|
+
def ==(other)
|
|
76
|
+
@pattern == other.pattern
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def tags_match?(name, tokens, token_index)
|
|
82
|
+
klass = Chronic.const_get(name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase })
|
|
83
|
+
|
|
84
|
+
if tokens[token_index]
|
|
85
|
+
!tokens[token_index].tags.select { |o| o.kind_of?(klass) }.empty?
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
end
|