medjool 0.5.7 → 0.7.0
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.
- checksums.yaml +5 -13
- data/.ruby-version +1 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +28 -0
- data/lib/medjool/date_range.rb +3 -2
- data/lib/medjool/parser.rb +34 -16
- data/lib/medjool/regexs.rb +2 -2
- data/lib/medjool.rb +1 -1
- data/test/test_medjool.rb +31 -1
- metadata +20 -17
checksums.yaml
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
|
|
5
|
-
data.tar.gz: !binary |-
|
|
6
|
-
ZTViZGZhNTFiYTk3OGJjNTg2M2Y5MGViMzM2ZGNkNTJjMmUwNGZjZA==
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 3e849a9ee874d8112e2ee66c5428fc52d483a9517132b9ce5c781d762d687687
|
|
4
|
+
data.tar.gz: a35b502d072b296279bd0b1882a3d8a042e7c0ef7d9229af1d16ce4c540a94d8
|
|
7
5
|
SHA512:
|
|
8
|
-
metadata.gz:
|
|
9
|
-
|
|
10
|
-
ZTVjM2Y0NTc2OGEzOTFjZmM0MGQ2NmU1YWZhYmNkNGZlNTJkM2Y3ZjI2M2E0
|
|
11
|
-
ZjExMWE1ZDU4Mzg3ZDYzYjI2Y2E0NjIyMGEzZTNjZDQwNjJlMWI=
|
|
12
|
-
data.tar.gz: !binary |-
|
|
13
|
-
M2Y0N2QwMzNjNzM4MDljMDEyMTBkOGE2NDk4MGFjOWRiNzNhZDkyZTNhZTM4
|
|
14
|
-
OTRjOTMyZjIzYTg1OGM5NTQ1NWRmMTA4Yzk5OTMyMWUyM2MwYTM1MDdlMmVk
|
|
15
|
-
NzA4OWU5ZWUxOWNkYmUxMzg0YTBkOTdlOTViMDIzZGI0NjViYmQ=
|
|
6
|
+
metadata.gz: 2882248b162c9e0d09332ea1fa10b1e3ac109c8b9e6fd34c72d9edbf7dd5bc876035a57f50d4f2a2f8839b3659d0d3917379baf8b24fa3143ba304f12aaf7450
|
|
7
|
+
data.tar.gz: a6948793120f4ee891e2dccd2bd759d01b4a265fa896d0bce3718fb90aeca798ffeda5bf7d3a767a575f33c08a5f77aaa7af112427b9a158779d41ef36970438
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.5.8
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: https://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
activesupport (4.2.7.1)
|
|
5
|
+
i18n (~> 0.7)
|
|
6
|
+
json (~> 1.7, >= 1.7.7)
|
|
7
|
+
minitest (~> 5.1)
|
|
8
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
9
|
+
tzinfo (~> 1.1)
|
|
10
|
+
i18n (0.7.0)
|
|
11
|
+
json (1.8.6)
|
|
12
|
+
minitest (5.9.1)
|
|
13
|
+
rake (11.1.2)
|
|
14
|
+
thread_safe (0.3.5)
|
|
15
|
+
timecop (0.6.3)
|
|
16
|
+
tzinfo (1.2.2)
|
|
17
|
+
thread_safe (~> 0.1)
|
|
18
|
+
|
|
19
|
+
PLATFORMS
|
|
20
|
+
ruby
|
|
21
|
+
|
|
22
|
+
DEPENDENCIES
|
|
23
|
+
activesupport (~> 4.2.4)
|
|
24
|
+
rake (~> 11.1.2)
|
|
25
|
+
timecop (~> 0.6.3)
|
|
26
|
+
|
|
27
|
+
BUNDLED WITH
|
|
28
|
+
1.17.3
|
data/lib/medjool/date_range.rb
CHANGED
|
@@ -3,10 +3,11 @@ require 'active_support/core_ext'
|
|
|
3
3
|
|
|
4
4
|
class Medjool::DateRange
|
|
5
5
|
|
|
6
|
-
attr_accessor :start_date, :end_date
|
|
6
|
+
attr_accessor :start_date, :end_date, :prefix
|
|
7
7
|
|
|
8
|
-
def initialize(start_date, end_date)
|
|
8
|
+
def initialize(start_date, end_date, prefix = nil)
|
|
9
9
|
@start_date = start_date
|
|
10
10
|
@end_date = end_date
|
|
11
|
+
@prefix = prefix
|
|
11
12
|
end
|
|
12
13
|
end
|
data/lib/medjool/parser.rb
CHANGED
|
@@ -15,31 +15,37 @@ class Medjool::Parser
|
|
|
15
15
|
|
|
16
16
|
def parse_date_range(text)
|
|
17
17
|
if bits = Medjool::DATE_RANGE_MATCHER.match(text.strip)
|
|
18
|
-
if bits[
|
|
18
|
+
if bits[1].present?
|
|
19
|
+
prefix = bits[1].strip.sub(/:$/, '')
|
|
20
|
+
else
|
|
21
|
+
prefix = nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if bits[52]
|
|
19
25
|
# October
|
|
20
26
|
if month_start = self.parse(text.strip, update_now = false)
|
|
21
27
|
month_end = month_start.end_of_month
|
|
22
|
-
return Medjool::DateRange.new(month_start, month_end)
|
|
28
|
+
return Medjool::DateRange.new(month_start, month_end, prefix)
|
|
23
29
|
end
|
|
24
|
-
elsif bits[
|
|
30
|
+
elsif bits[3]
|
|
25
31
|
# 12-15 Oct
|
|
26
32
|
# Start is 12 Oct
|
|
27
|
-
end_month = bits[
|
|
28
|
-
start_month = bits[
|
|
29
|
-
range_start = self.parse("#{bits[
|
|
33
|
+
end_month = bits[17]
|
|
34
|
+
start_month = bits[6] || end_month
|
|
35
|
+
range_start = self.parse("#{bits[4]} #{start_month}", update_now = false)
|
|
30
36
|
# End is 15 Oct
|
|
31
|
-
range_end = self.parse("#{bits[
|
|
32
|
-
return Medjool::DateRange.new(range_start, range_end)
|
|
33
|
-
elsif bits[
|
|
37
|
+
range_end = self.parse("#{bits[16]} #{end_month}", update_now = false)
|
|
38
|
+
return Medjool::DateRange.new(range_start, range_end, prefix)
|
|
39
|
+
elsif bits[29]
|
|
34
40
|
# Oct 12-15
|
|
35
41
|
# Start is 12 Oct
|
|
36
|
-
end_month = bits[
|
|
37
|
-
start_month = bits[
|
|
42
|
+
end_month = bits[41]
|
|
43
|
+
start_month = bits[29] || end_month
|
|
38
44
|
|
|
39
|
-
range_start = self.parse("#{bits[
|
|
45
|
+
range_start = self.parse("#{bits[39]} #{start_month}", update_now = false)
|
|
40
46
|
# End is 15 Oct
|
|
41
|
-
range_end = self.parse("#{bits[
|
|
42
|
-
return Medjool::DateRange.new(range_start, range_end)
|
|
47
|
+
range_end = self.parse("#{bits[51]} #{end_month}", update_now = false)
|
|
48
|
+
return Medjool::DateRange.new(range_start, range_end, prefix)
|
|
43
49
|
end
|
|
44
50
|
end
|
|
45
51
|
end
|
|
@@ -68,10 +74,22 @@ class Medjool::Parser
|
|
|
68
74
|
end
|
|
69
75
|
end
|
|
70
76
|
|
|
71
|
-
|
|
77
|
+
should_determine_ambiguity = false
|
|
78
|
+
if @context[:now]
|
|
79
|
+
should_determine_ambiguity = true
|
|
80
|
+
else
|
|
72
81
|
# In the absence of context, always fall back on the default guess
|
|
73
82
|
guess_date = base_date
|
|
74
|
-
|
|
83
|
+
|
|
84
|
+
# Only exception for that is the special case where it's currently December,
|
|
85
|
+
# and "January" *obviouly* should mean January NEXT year not THIS year
|
|
86
|
+
if Date.today.month == 12 && guess_date < 10.months.ago
|
|
87
|
+
should_determine_ambiguity = true
|
|
88
|
+
@context[:now] = Date.today
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
if should_determine_ambiguity
|
|
75
93
|
# Determine the ambiguity level for this data
|
|
76
94
|
ambiguity = determine_ambiguity(text)
|
|
77
95
|
|
data/lib/medjool/regexs.rb
CHANGED
|
@@ -10,8 +10,8 @@ module Medjool
|
|
|
10
10
|
ORDINAL_MATCHER = /(\s*([0-9]{1,2}#{ORDINAL_POSTFIX}?),?\s*)/
|
|
11
11
|
END_OF_MONTH_MATCHER = /^\s*(29|30|31)#{ORDINAL_POSTFIX}?\s*$/
|
|
12
12
|
YEAR_MATCHER = /(\s*([0-9]{4}\s*|\s*'?[0-9]{2}),?\s*)/
|
|
13
|
-
TEXT_DATE_MATCHER = /(#{DAYNAME_MATCHER}|#{ORDINAL_MATCHER}|#{YEAR_MATCHER}|#{MONTH_MATCHER})/
|
|
13
|
+
TEXT_DATE_MATCHER = /(#{DAYNAME_MATCHER}|#{ORDINAL_MATCHER}|#{YEAR_MATCHER}|#{MONTH_MATCHER}([^a-zA-Z]|$))/
|
|
14
14
|
DATE_MATCHER = /^[^a-zA-Z0-9]*(#{TEXT_DATE_MATCHER}+|#{DM_DM_YYYY_MATCHER}|#{YYYY_MM_DD_MATCHER})/
|
|
15
15
|
|
|
16
|
-
DATE_RANGE_MATCHER = /^((([0-9]+)( #{MONTH_NAME_MATCHER})? ?[-–] ?([0-9]+) #{MONTH_NAME_MATCHER}([^a-zA-Z]|$))|(#{MONTH_NAME_MATCHER} ([0-9]+) ?[-–] ?(#{MONTH_NAME_MATCHER} )?([0-9]+))|#{MONTH_NAME_MATCHER}([^a-zA-Z]|$))$/
|
|
16
|
+
DATE_RANGE_MATCHER = /^([^:]+: )?((([0-9]+)( #{MONTH_NAME_MATCHER})? ?[-–] ?([0-9]+) #{MONTH_NAME_MATCHER}([^a-zA-Z]|$))|(#{MONTH_NAME_MATCHER} ([0-9]+) ?[-–] ?(#{MONTH_NAME_MATCHER} )?([0-9]+))|#{MONTH_NAME_MATCHER}([^a-zA-Z]|$))$/
|
|
17
17
|
end
|
data/lib/medjool.rb
CHANGED
data/test/test_medjool.rb
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
require 'helper'
|
|
4
4
|
|
|
5
|
+
class TestMedjoolInDecember < TestCase
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
# 23rd December 2013
|
|
9
|
+
Timecop.freeze("2022-12-23".to_date)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
Timecop.return
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_january_date_in_december
|
|
17
|
+
assert_equal "2023-01-01".to_date, Medjool.parse("January 1st")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
5
21
|
class TestMedjool < TestCase
|
|
6
22
|
|
|
7
23
|
def setup
|
|
@@ -17,7 +33,8 @@ class TestMedjool < TestCase
|
|
|
17
33
|
@variations = ["*Monday", "1st July", "2nd July 2010", "1 July 2009", "Monday 2nd July 2009", "Monday 2nd", "Monday 2", "Monday 2 July",
|
|
18
34
|
"Tue", "Tues", "tuesday", "Tuesday", "Wed", "Wednesday", "Thu", "Thur", "Thurs", "Thursday", "Fri", "Friday-"]
|
|
19
35
|
@variations.each do |t|
|
|
20
|
-
|
|
36
|
+
stripped_date = t.sub(/[*-]/, "")
|
|
37
|
+
assert_equal Date.parse(stripped_date), Medjool.parse(t), "Error parsing '#{t}'"
|
|
21
38
|
end
|
|
22
39
|
end
|
|
23
40
|
|
|
@@ -68,6 +85,7 @@ class TestMedjool < TestCase
|
|
|
68
85
|
assert parser.is_date_range?("12–15 Jan")
|
|
69
86
|
assert parser.is_date_range?("12 – 15 Jan")
|
|
70
87
|
assert parser.is_date_range?("28 January – 3 February")
|
|
88
|
+
assert parser.is_date_range?("Hanging out: 28 January – 3 February")
|
|
71
89
|
assert parser.is_date_range?("AUGUST 12-15")
|
|
72
90
|
assert !parser.is_date_range?("October 15")
|
|
73
91
|
assert !parser.is_date_range?("09/12/2012")
|
|
@@ -80,18 +98,30 @@ class TestMedjool < TestCase
|
|
|
80
98
|
assert date_range, "Could not parse input as date range"
|
|
81
99
|
assert_equal "2013-10-01".to_date, date_range.start_date
|
|
82
100
|
assert_equal "2013-10-31".to_date, date_range.end_date
|
|
101
|
+
assert_nil date_range.prefix
|
|
83
102
|
date_range = parser.parse_date_range("12-15 Jan")
|
|
84
103
|
assert date_range, "Could not parse input as date range"
|
|
85
104
|
assert_equal "2014-01-12".to_date, date_range.start_date
|
|
86
105
|
assert_equal "2014-01-15".to_date, date_range.end_date
|
|
106
|
+
assert_nil date_range.prefix
|
|
87
107
|
date_range = parser.parse_date_range("28 Jan-3 Feb")
|
|
88
108
|
assert date_range, "Could not parse input as date range"
|
|
89
109
|
assert_equal "2014-01-28".to_date, date_range.start_date
|
|
90
110
|
assert_equal "2014-02-03".to_date, date_range.end_date
|
|
111
|
+
assert_nil date_range.prefix
|
|
91
112
|
|
|
92
113
|
assert parser.parse_date_range("October 15").nil?
|
|
93
114
|
end
|
|
94
115
|
|
|
116
|
+
def test_parse_date_range_with_prefix
|
|
117
|
+
parser = Medjool::Parser.new(:now => "2013-08-01".to_datetime)
|
|
118
|
+
date_range = parser.parse_date_range("Living the dream: 12-15 Jan")
|
|
119
|
+
assert date_range, "Could not parse input as date range"
|
|
120
|
+
assert_equal "2014-01-12".to_date, date_range.start_date
|
|
121
|
+
assert_equal "2014-01-15".to_date, date_range.end_date
|
|
122
|
+
assert_equal "Living the dream", date_range.prefix
|
|
123
|
+
end
|
|
124
|
+
|
|
95
125
|
def test_lone_numbers
|
|
96
126
|
parser = Medjool::Parser.new
|
|
97
127
|
assert_equal Date.parse("1st"), parser.parse("1")
|
metadata
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: medjool
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andy Geers
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-12-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: 3.2.12
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: 3.2.12
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: minitest
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- - ~>
|
|
45
|
+
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '5.0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- - ~>
|
|
52
|
+
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '5.0'
|
|
55
55
|
description: Medjool is a date parser written in pure Ruby, which processes dates
|
|
@@ -62,8 +62,11 @@ extra_rdoc_files:
|
|
|
62
62
|
- README.md
|
|
63
63
|
- LICENSE
|
|
64
64
|
files:
|
|
65
|
-
- .gitignore
|
|
65
|
+
- ".gitignore"
|
|
66
|
+
- ".ruby-version"
|
|
66
67
|
- BUILDING.md
|
|
68
|
+
- Gemfile
|
|
69
|
+
- Gemfile.lock
|
|
67
70
|
- LICENSE
|
|
68
71
|
- README.md
|
|
69
72
|
- Rakefile
|
|
@@ -78,25 +81,25 @@ homepage: http://github.com/andygeers/medjool
|
|
|
78
81
|
licenses:
|
|
79
82
|
- MIT
|
|
80
83
|
metadata: {}
|
|
81
|
-
post_install_message:
|
|
84
|
+
post_install_message:
|
|
82
85
|
rdoc_options:
|
|
83
|
-
- --charset=UTF-8
|
|
86
|
+
- "--charset=UTF-8"
|
|
84
87
|
require_paths:
|
|
85
88
|
- lib
|
|
86
89
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
90
|
requirements:
|
|
88
|
-
- -
|
|
91
|
+
- - ">="
|
|
89
92
|
- !ruby/object:Gem::Version
|
|
90
93
|
version: '0'
|
|
91
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
95
|
requirements:
|
|
93
|
-
- -
|
|
96
|
+
- - ">="
|
|
94
97
|
- !ruby/object:Gem::Version
|
|
95
98
|
version: '0'
|
|
96
99
|
requirements: []
|
|
97
|
-
rubyforge_project:
|
|
98
|
-
rubygems_version: 2.
|
|
99
|
-
signing_key:
|
|
100
|
+
rubyforge_project:
|
|
101
|
+
rubygems_version: 2.7.6.2
|
|
102
|
+
signing_key:
|
|
100
103
|
specification_version: 4
|
|
101
104
|
summary: Date parsing with context
|
|
102
105
|
test_files:
|