fuzzy-date 0.2.0 → 0.2.1
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 +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.
|