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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YmY3MGU3YThiMTg2OTE5NjM0OWYyYTVhNGMyMzgzZDQ0YzEwNWZjYg==
5
- data.tar.gz: !binary |-
6
- ZTViZGZhNTFiYTk3OGJjNTg2M2Y5MGViMzM2ZGNkNTJjMmUwNGZjZA==
2
+ SHA256:
3
+ metadata.gz: 3e849a9ee874d8112e2ee66c5428fc52d483a9517132b9ce5c781d762d687687
4
+ data.tar.gz: a35b502d072b296279bd0b1882a3d8a042e7c0ef7d9229af1d16ce4c540a94d8
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MTE4MzU2ZDVjYzkxMDZjZTNkNDJiODE2MjAxM2I0OTM1ZjAyZTUyOThjYjk2
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
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ #ruby '1.9.3'
4
+
5
+ gem 'rake', '~> 11.1.2'
6
+ gem 'activesupport', '~> 4.2.4'
7
+ gem 'timecop', '~> 0.6.3'
8
+
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
@@ -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
@@ -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[51]
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[2]
30
+ elsif bits[3]
25
31
  # 12-15 Oct
26
32
  # Start is 12 Oct
27
- end_month = bits[16]
28
- start_month = bits[5] || end_month
29
- range_start = self.parse("#{bits[3]} #{start_month}", update_now = false)
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[15]} #{end_month}", update_now = false)
32
- return Medjool::DateRange.new(range_start, range_end)
33
- elsif bits[28]
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[40]
37
- start_month = bits[28] || end_month
42
+ end_month = bits[41]
43
+ start_month = bits[29] || end_month
38
44
 
39
- range_start = self.parse("#{bits[38]} #{start_month}", update_now = false)
45
+ range_start = self.parse("#{bits[39]} #{start_month}", update_now = false)
40
46
  # End is 15 Oct
41
- range_end = self.parse("#{bits[50]} #{end_month}", update_now = false)
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
- unless @context[:now]
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
- else
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
 
@@ -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
@@ -1,5 +1,5 @@
1
1
  module Medjool
2
- VERSION = '0.5.7'
2
+ VERSION = '0.7.0'
3
3
 
4
4
  require 'medjool/parser'
5
5
  require 'medjool/date_range'
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
- assert_equal Date.parse(t), Medjool.parse(t), "Error parsing '#{t}'"
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.5.7
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: 2016-03-31 00:00:00.000000000 Z
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.2.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: