fuzzy-date 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -1
- data/demo.rb +2 -2
- data/lib/fuzzy-date.rb +1 -1
- data/lib/fuzzy-date/analyze.rb +66 -77
- data/lib/fuzzy-date/fuzzy-date.rb +13 -1
- data/lib/fuzzy-date/variables.rb +18 -18
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3566a7b503dd739c3eaee9cfc6cdbfe4a8a0e3bf
|
4
|
+
data.tar.gz: f3f2ddbe5c6d38efad627d8e293843267f7f2c05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54bef59ade20151fc60bab750d1153d815753b40101fab78ac212a8172cfa80da737265e9456d83bd9edf78053a6dec1899e96ec3a1461add276fc512fed4506
|
7
|
+
data.tar.gz: e95bf44e9ce6d7e12f59e561ff9c8c7565ee2498252ac94751a0e4614498510dd2e6ff1109237b773c54aba0aeec6992084e35f877e7bb4010eeada2599366a6
|
data/README.md
CHANGED
@@ -4,12 +4,31 @@ The fuzzy-date gem provides a way to parse and use incomplete dates, like those
|
|
4
4
|
|
5
5
|
For example, if you know your great-great-great grandmother was born in April, 1836, but you don't know the day of the month, that's not going to work if you try to parse it as a Date object.
|
6
6
|
|
7
|
-
With fuzzy-date, when you parse an incomplete date, you'll be given
|
7
|
+
With fuzzy-date, when you parse an incomplete date, you'll be given an object of information about the date.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
11
|
`gem install fuzzy-date`
|
12
12
|
|
13
|
+
## Usage:
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
require 'fuzzy-date'
|
17
|
+
|
18
|
+
fuzzy_date = FuzzyDate::parse( '15 March 1971' )
|
19
|
+
|
20
|
+
puts "PARSING: #{ fuzzy_date.original }"
|
21
|
+
|
22
|
+
puts "Short date: #{ fuzzy_date.short }"
|
23
|
+
puts "Long date: #{ fuzzy_date.long }"
|
24
|
+
puts "Full date: #{ fuzzy_date.full }"
|
25
|
+
puts "Year: #{ fuzzy_date.year }"
|
26
|
+
puts "Month: #{ fuzzy_date.month }"
|
27
|
+
puts "Day: #{ fuzzy_date.day }"
|
28
|
+
puts "Month name: #{ fuzzy_date.month_name }"
|
29
|
+
puts "Circa: #{ fuzzy_date.circa }"
|
30
|
+
puts "Era: #{ fuzzy_date.era }"
|
31
|
+
|
13
32
|
## Contributing
|
14
33
|
|
15
34
|
If you'd like to hack on FuzzyDate - and we hope you do! - start by forking the repo on GitHub:
|
data/demo.rb
CHANGED
data/lib/fuzzy-date.rb
CHANGED
data/lib/fuzzy-date/analyze.rb
CHANGED
@@ -17,6 +17,7 @@ class FuzzyDate
|
|
17
17
|
# * DD-MMM-YYYY - 1 or 2 digit day, then month name or abbreviation, then 1 to 4 digit year
|
18
18
|
# * MMM-YYYY - month name or abbreviation, then 1 to 4 digit year
|
19
19
|
# * MMM-DD-YYYY - month name or abbreviation, then 1 or 2 digit day, then 1 to 4 digit year
|
20
|
+
# * YYYY-MMM - 1 to 4 digit year, then month name or abbreviation
|
20
21
|
#
|
21
22
|
# Notes:
|
22
23
|
# - Commas are optional.
|
@@ -30,115 +31,107 @@ class FuzzyDate
|
|
30
31
|
|
31
32
|
date = clean_parameter date
|
32
33
|
|
33
|
-
@
|
34
|
+
@original = date
|
34
35
|
|
35
36
|
date = massage date
|
36
|
-
@
|
37
|
+
@fixed = date
|
37
38
|
|
38
|
-
year, month, day = nil
|
39
|
+
@year, @month, @day = nil
|
39
40
|
|
40
41
|
if date =~ @date_patterns[ :yyyy ]
|
41
|
-
year =
|
42
|
+
@year = $1.to_i
|
42
43
|
|
43
44
|
elsif date =~ @date_patterns[ :yyyy_mm_dd_and_yyyy_mm ]
|
44
|
-
year =
|
45
|
-
month =
|
46
|
-
day =
|
45
|
+
@year = $1.to_i
|
46
|
+
@month = $2.to_i unless $2.nil?
|
47
|
+
@day = $3.to_i unless $3.nil?
|
47
48
|
|
48
49
|
elsif date =~ @date_patterns[ :dd_mm_yyyy ] and euro
|
49
|
-
day =
|
50
|
-
month =
|
51
|
-
year =
|
50
|
+
@day = $1.to_i
|
51
|
+
@month = $2.to_i
|
52
|
+
@year = $3.to_i
|
52
53
|
|
53
54
|
elsif date =~ @date_patterns[ :mm_dd_yyyy ]
|
54
|
-
month =
|
55
|
-
day =
|
56
|
-
year =
|
55
|
+
@month = $1.to_i
|
56
|
+
@day = $2.to_i
|
57
|
+
@year = $3.to_i
|
57
58
|
|
58
59
|
elsif date =~ @date_patterns[ :mm_yyyy ]
|
59
|
-
month =
|
60
|
-
year =
|
60
|
+
@month = $1.to_i
|
61
|
+
@year = $2.to_i
|
61
62
|
|
62
63
|
elsif date =~ @date_patterns[ :dd_mmm_yyyy_and_dd_mmm ]
|
63
64
|
month_text = $2.to_s.capitalize
|
64
|
-
month
|
65
|
-
day
|
66
|
-
year
|
65
|
+
@month = @month_names.key( @month_abbreviations[ month_text ] )
|
66
|
+
@day = $1.to_i
|
67
|
+
@year = $3.to_i unless $3.nil?
|
67
68
|
|
68
69
|
elsif date =~ @date_patterns[ :mmm_dd_yyyy ]
|
69
70
|
month_text = $1.to_s.capitalize
|
70
|
-
month
|
71
|
-
day
|
72
|
-
year
|
71
|
+
@month = @month_names.key( @month_abbreviations[ month_text ] )
|
72
|
+
@day = $2.to_i
|
73
|
+
@year = $3.to_i unless $3.nil?
|
73
74
|
|
74
75
|
elsif date =~ @date_patterns[ :mmm_yyyy_and_mmm ]
|
75
76
|
month_text = $1.to_s.capitalize
|
76
|
-
month
|
77
|
-
year
|
77
|
+
@month = @month_names.key( @month_abbreviations[ month_text ] )
|
78
|
+
@year = $2.to_i unless $2.nil?
|
79
|
+
|
80
|
+
elsif date =~ @date_patterns[ :yyyy_mmm_dd ]
|
81
|
+
@year = $1.to_i unless $1.nil?
|
82
|
+
month_text = $2.to_s.capitalize
|
83
|
+
@month = @month_names.key( @month_abbreviations[ month_text ] )
|
84
|
+
@day = $3.to_i
|
85
|
+
|
86
|
+
elsif date =~ @date_patterns[ :yyyy_mmm ]
|
87
|
+
@year = $1.to_i unless $1.nil?
|
88
|
+
month_text = $2.to_s.capitalize
|
89
|
+
@month = @month_names.key( @month_abbreviations[ month_text ] )
|
78
90
|
|
79
91
|
else
|
80
92
|
raise ArgumentError.new( 'Cannot parse date.' )
|
81
93
|
end
|
82
94
|
|
83
|
-
|
84
|
-
@
|
85
|
-
@date_parts[ :day ] = day ? day.to_i : nil
|
86
|
-
|
87
|
-
#- Some error checking at this point
|
88
|
-
if month.to_i > 13
|
95
|
+
#- Make sure the dates make sense
|
96
|
+
if @month and @month > 13
|
89
97
|
raise ArgumentError.new( 'Month cannot be greater than 12.' )
|
90
|
-
elsif month and day and day
|
91
|
-
unless month
|
98
|
+
elsif @month and @day and @day > @days_in_month[ @month ]
|
99
|
+
unless @month == 2 and @year and Date.parse( '1/1/' + @year ).leap? and @day == 29
|
92
100
|
raise ArgumentError.new( 'Too many days in this month.' )
|
93
101
|
end
|
94
|
-
elsif month and month
|
102
|
+
elsif @month and @month < 1
|
95
103
|
raise ArgumentError.new( 'Month cannot be less than 1.' )
|
96
|
-
elsif day and day
|
104
|
+
elsif @day and @day < 1
|
97
105
|
raise ArgumentError.new( 'Day cannot be less than 1.' )
|
98
106
|
end
|
99
107
|
|
100
|
-
month_name = @month_names[ month
|
101
|
-
@date_parts[ :month_name ] = month_name
|
108
|
+
@month_name = @month_names[ @month ]
|
102
109
|
|
103
110
|
# ----------------------------------------------------------------------
|
104
111
|
|
105
|
-
show_era
|
106
|
-
show_circa
|
107
|
-
|
108
|
-
if year and month and day
|
109
|
-
@
|
110
|
-
@
|
111
|
-
modified_long = show_circa + month_name + ' ' + day + ', ' + year.rjust( 4, "0" ) + show_era
|
112
|
-
@
|
113
|
-
elsif year and month
|
114
|
-
@
|
115
|
-
@
|
116
|
-
@
|
117
|
-
elsif month and day
|
118
|
-
month_text = @month_abbreviations.key(month_text) || month_text
|
119
|
-
@
|
120
|
-
@
|
121
|
-
@
|
112
|
+
show_era = @eras[@era] == :bce ? ' ' + @era : ''
|
113
|
+
show_circa = @circa ? 'About ' : ''
|
114
|
+
|
115
|
+
if @year and @month and @day
|
116
|
+
@short = show_circa + @month.to_s + '/' + @day.to_s + '/' + @year.to_s + show_era
|
117
|
+
@long = show_circa + @month_name + ' ' + @day.to_s + ', ' + @year.to_s + show_era
|
118
|
+
modified_long = show_circa + @month_name + ' ' + @day.to_s + ', ' + @year.to_s.rjust( 4, "0" ) + show_era
|
119
|
+
@full = show_circa + Date.parse( modified_long ).strftime( '%A,' ) + Date.parse( @day.to_s + ' ' + @month_name + ' ' + @year.to_s.rjust( 4, "0" ) ).strftime( ' %B %-1d, %Y' ) + show_era
|
120
|
+
elsif @year and @month
|
121
|
+
@short = show_circa + @month.to_s + '/' + @year.to_s + show_era
|
122
|
+
@long = show_circa + @month_name + ', ' + @year.to_s + show_era
|
123
|
+
@full = @long
|
124
|
+
elsif @month and @day
|
125
|
+
month_text = @month_abbreviations.key( month_text ) || month_text
|
126
|
+
@short = show_circa + @day.to_s + '-' + month_text
|
127
|
+
@long = show_circa + @day.to_s + ' ' + @month_name
|
128
|
+
@full = @long
|
122
129
|
elsif year
|
123
|
-
@
|
124
|
-
@
|
125
|
-
@
|
130
|
+
@short = show_circa + @year.to_s + show_era
|
131
|
+
@long = @short
|
132
|
+
@full = @long
|
126
133
|
end
|
127
134
|
|
128
|
-
@short = @date_parts[ :short ]
|
129
|
-
@long = @date_parts[ :long ]
|
130
|
-
@full = @date_parts[ :full ]
|
131
|
-
@original = @date_parts[ :original ]
|
132
|
-
@fixed = @date_parts[ :fixed ]
|
133
|
-
@year = @date_parts[ :year ]
|
134
|
-
@month = @date_parts[ :month ]
|
135
|
-
@day = @date_parts[ :day ]
|
136
|
-
@month_name = @date_parts[ :month_name ]
|
137
|
-
@circa = @date_parts[ :circa ]
|
138
|
-
@era = @date_parts[ :era ]
|
139
|
-
|
140
|
-
@date_parts
|
141
|
-
|
142
135
|
end
|
143
136
|
|
144
137
|
def clean_parameter( date )
|
@@ -156,18 +149,14 @@ class FuzzyDate
|
|
156
149
|
date_in_parts = date.split date_separator
|
157
150
|
date_in_parts.delete_if { |d| d.to_s.empty? }
|
158
151
|
if date_in_parts.first.match Regexp.new( @circa_words.join( '|' ), true )
|
159
|
-
@
|
152
|
+
@circa = true
|
160
153
|
date_in_parts.shift
|
161
154
|
end
|
162
|
-
if date_in_parts.last.match Regexp.new( @
|
163
|
-
@
|
155
|
+
if date_in_parts.last.match Regexp.new( @eras.keys.join( '|' ), true )
|
156
|
+
@era = date_in_parts.pop.upcase.strip
|
164
157
|
end
|
165
158
|
|
166
159
|
date_in_parts.join '-'
|
167
160
|
end
|
168
161
|
|
169
|
-
|
170
|
-
capture.to_i.to_s
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
162
|
+
end
|
@@ -6,7 +6,19 @@ class FuzzyDate
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_hash
|
9
|
-
|
9
|
+
{
|
10
|
+
circa: @circa,
|
11
|
+
day: @day,
|
12
|
+
era: @era,
|
13
|
+
fixed: @fixed,
|
14
|
+
full: @full,
|
15
|
+
long: @long,
|
16
|
+
month: @month,
|
17
|
+
month_name: @month_name,
|
18
|
+
original: @original,
|
19
|
+
short: @short,
|
20
|
+
year: @year
|
21
|
+
}
|
10
22
|
end
|
11
23
|
|
12
24
|
end
|
data/lib/fuzzy-date/variables.rb
CHANGED
@@ -5,7 +5,7 @@ class FuzzyDate
|
|
5
5
|
|
6
6
|
def setup
|
7
7
|
|
8
|
-
|
8
|
+
set_up_date_parts
|
9
9
|
|
10
10
|
@month_names = {
|
11
11
|
1 => 'January',
|
@@ -73,15 +73,17 @@ class FuzzyDate
|
|
73
73
|
'~'
|
74
74
|
]
|
75
75
|
|
76
|
-
@
|
77
|
-
'AD',
|
78
|
-
'BC',
|
79
|
-
'CE',
|
80
|
-
'BCE'
|
81
|
-
|
82
|
-
|
76
|
+
@eras = {
|
77
|
+
'AD' => :ce,
|
78
|
+
'BC' => :bce,
|
79
|
+
'CE' => :ce,
|
80
|
+
'BCE' => :bce
|
81
|
+
}
|
82
|
+
|
83
83
|
@date_patterns = {
|
84
84
|
yyyy: /^(\d{1,4})$/,
|
85
|
+
yyyy_mmm: /^(\d{1,4})-(#{ @month_abbreviations.keys.join( '|' ) }).*?$/i,
|
86
|
+
yyyy_mmm_dd: /^(\d{1,4})-(#{ @month_abbreviations.keys.join( '|' ) }).*?-(\d{1,2})$/i,
|
85
87
|
yyyy_mm_dd_and_yyyy_mm: /^(\d{3,4})(?:-(\d{1,2})(?:-(\d{1,2}))?)?$/,
|
86
88
|
dd_mm_yyyy: /^(\d{1,2})-(\d{1,2})-(\d{1,4})$/,
|
87
89
|
mm_dd_yyyy: /^(\d{1,2})-(\d{1,2})-(\d{1,4})$/,
|
@@ -89,18 +91,16 @@ class FuzzyDate
|
|
89
91
|
dd_mmm_yyyy_and_dd_mmm: /^(\d{1,2})(?:-(#{ @month_abbreviations.keys.join( '|' ) }).*?(?:-(\d{1,4}))?)?$/i,
|
90
92
|
mmm_dd_yyyy: /^(#{ @month_abbreviations.keys.join( '|' ) }).*?-(\d{1,2})-(\d{1,4})$/i,
|
91
93
|
mmm_yyyy_and_mmm: /^(#{ @month_abbreviations.keys.join( '|' ) }).*?(?:-(\d{1,4}))?$/i
|
92
|
-
|
94
|
+
}
|
93
95
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def set_up_date_parts
|
97
|
-
@
|
98
|
-
@
|
99
|
-
@
|
100
|
-
@
|
101
|
-
@
|
102
|
-
@
|
103
|
-
@date_parts[ :era ] = 'AD'
|
104
|
-
@date_parts
|
99
|
+
@original = nil
|
100
|
+
@circa = false
|
101
|
+
@year = nil
|
102
|
+
@month = nil
|
103
|
+
@day = nil
|
104
|
+
@era = 'AD'
|
105
105
|
end
|
106
|
-
end
|
106
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fuzzy-date
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Cole
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The fuzzy-date gem provides a way to parse and use incomplete dates,
|
14
14
|
like those found in history or genealogy.
|
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
45
|
version: '0'
|
46
46
|
requirements: []
|
47
47
|
rubyforge_project:
|
48
|
-
rubygems_version: 2.0.
|
48
|
+
rubygems_version: 2.0.14
|
49
49
|
signing_key:
|
50
50
|
specification_version: 4
|
51
51
|
summary: Provides a way to use partial and incomplete dates.
|