flexyear 0.0.1 → 0.0.2
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 +7 -0
- data/CHANGELOG +5 -0
- data/README.md +9 -6
- data/Rakefile +5 -0
- data/flexyear.gemspec +2 -1
- data/lib/flexyear/range_parsers/circa_parser.rb +13 -0
- data/lib/flexyear/range_parsers/decade_parser.rb +11 -0
- data/lib/flexyear/range_parsers/early_parser.rb +11 -0
- data/lib/flexyear/range_parsers/late_parser.rb +11 -0
- data/lib/flexyear/range_parsers/mid_parser.rb +11 -0
- data/lib/flexyear/range_parsers/range_parser.rb +31 -0
- data/lib/flexyear/range_parsers/specific_year_parser.rb +11 -0
- data/lib/flexyear/range_parsers/year_range_parser.rb +10 -0
- data/lib/flexyear/version.rb +2 -2
- data/lib/flexyear.rb +25 -41
- data/spec/flexyear_spec.rb +6 -6
- metadata +72 -60
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 03f0180f05ab5d01948b0a24796cbfd9a7b23970
|
4
|
+
data.tar.gz: cfaa51b4ed1ebae6f300a629cd1d500b3a1ab7e2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b48806ae6b6b7658b7b0893a56bcfbb3ee28dbec7991cc3bad224495bb66ec3a8fd57fafbffd6a1b92c482ad431fbae6e21a215a0c62451fdb87c40e38cad2e5
|
7
|
+
data.tar.gz: 82427042b5d194fdc6afe64fc615e638ff9a4c7252071f76bb6cb6b4b2dc9cfd5c66ddaa724962d614985432cc921cb599dbea10fbd680beae595a958b73bdd0
|
data/CHANGELOG
ADDED
data/README.md
CHANGED
@@ -4,11 +4,13 @@ Flexible years! Parse decades, ranges, and etc into low & high values.
|
|
4
4
|
|
5
5
|
Examples:
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
```ruby
|
8
|
+
FlexYear.new("1980s").year_low == 1980
|
9
|
+
FlexYear.new("1980s").year_high == 1989
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
FlexYear.new("mid-80s").year_low == 1983
|
12
|
+
FlexYear.new("mid-80s").year_high == 1986
|
13
|
+
```
|
12
14
|
|
13
15
|
It's pretty flexible in the kinds of things it takes. For more examples, see the spec.
|
14
16
|
|
@@ -16,7 +18,9 @@ It's pretty flexible in the kinds of things it takes. For more examples, see the
|
|
16
18
|
|
17
19
|
Add this line to your application's Gemfile:
|
18
20
|
|
19
|
-
|
21
|
+
```ruby
|
22
|
+
gem 'flexyear'
|
23
|
+
```
|
20
24
|
|
21
25
|
And then execute:
|
22
26
|
|
@@ -26,7 +30,6 @@ Or install it yourself as:
|
|
26
30
|
|
27
31
|
$ gem install flexyear
|
28
32
|
|
29
|
-
|
30
33
|
## Contributing
|
31
34
|
|
32
35
|
1. Fork it
|
data/Rakefile
CHANGED
data/flexyear.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'flexyear/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "flexyear"
|
8
|
-
spec.version =
|
8
|
+
spec.version = FlexYear::VERSION
|
9
9
|
spec.authors = ["Dan Melnick & Yan Pritzker"]
|
10
10
|
spec.email = ["pair+dm+yp@reverb.com"]
|
11
11
|
spec.description = %q{Parse common year range formats like '1973-75' or natural language ranges like 'mid 80s'}
|
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
23
24
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class FlexYear
|
2
|
+
class CircaParser < RangeParser
|
3
|
+
CIRCA_KEYWORDS = ["circ", "ca", "c.a.", "ca.", "cca", "c.", "approx", "appx", "about", "around"]
|
4
|
+
|
5
|
+
def self.can_parse?(string)
|
6
|
+
CIRCA_KEYWORDS.any?{|circa_pattern| string.downcase.include?(circa_pattern)}
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse
|
10
|
+
[-1, 1]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class FlexYear
|
2
|
+
class RangeParser
|
3
|
+
class << self
|
4
|
+
attr_reader :parser_classes
|
5
|
+
end
|
6
|
+
|
7
|
+
@parser_classes = []
|
8
|
+
|
9
|
+
def self.parse(string)
|
10
|
+
parser = find_parser(string)
|
11
|
+
return nil unless parser
|
12
|
+
parser.parse
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_parser(string)
|
16
|
+
parser_class = RangeParser.parser_classes.find do |klass|
|
17
|
+
klass.can_parse?(string)
|
18
|
+
end
|
19
|
+
return parser_class.new(string) if parser_class
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.inherited(subclass)
|
24
|
+
RangeParser.parser_classes << subclass
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(string)
|
28
|
+
@string = string
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/flexyear/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.0.
|
1
|
+
class FlexYear
|
2
|
+
VERSION = "0.0.2"
|
3
3
|
end
|
data/lib/flexyear.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
require 'flexyear/range_parsers/range_parser'
|
2
|
+
require 'flexyear/range_parsers/early_parser'
|
3
|
+
require 'flexyear/range_parsers/mid_parser'
|
4
|
+
require 'flexyear/range_parsers/late_parser'
|
5
|
+
require 'flexyear/range_parsers/decade_parser'
|
6
|
+
require 'flexyear/range_parsers/year_range_parser'
|
7
|
+
require 'flexyear/range_parsers/circa_parser'
|
8
|
+
require 'flexyear/range_parsers/specific_year_parser'
|
1
9
|
require 'flexyear/version'
|
2
10
|
require 'date'
|
3
11
|
|
@@ -14,39 +22,10 @@ class FlexYear
|
|
14
22
|
|
15
23
|
attr_reader :year_low, :year_high
|
16
24
|
|
17
|
-
CIRCA_KEYWORDS = ["circ", "ca", "c.a.", "ca.", "cca", "c.", "approx", "appx", "about", "around"]
|
18
|
-
|
19
25
|
def initialize(year_string)
|
20
26
|
@year_string = year_string.to_s
|
21
27
|
|
22
|
-
|
23
|
-
@low = 0
|
24
|
-
@high = 3
|
25
|
-
elsif @year_string.start_with?("mid")
|
26
|
-
@low = 3
|
27
|
-
@high = 6
|
28
|
-
elsif @year_string.start_with?("late")
|
29
|
-
@low = 6
|
30
|
-
@high = 9
|
31
|
-
elsif @year_string.end_with?("s") # decade
|
32
|
-
@low = 0
|
33
|
-
@high = 9
|
34
|
-
elsif @year_string.include?("-")
|
35
|
-
@year_string =~ /(\d+)\s*-\s*(\d+)/
|
36
|
-
if $1 && $2
|
37
|
-
@year_low = centuryize($1).to_i
|
38
|
-
@year_high = centuryize($2, @year_low).to_i
|
39
|
-
return
|
40
|
-
end
|
41
|
-
elsif CIRCA_KEYWORDS.any?{|circa_pattern| @year_string.downcase.include?(circa_pattern)}
|
42
|
-
@low = -1
|
43
|
-
@high = 1
|
44
|
-
elsif @year_string.downcase.include?('reissue')
|
45
|
-
raise InvalidYearError, 'Please enter the date of manufacture, not the reissue era.'
|
46
|
-
else # specific year
|
47
|
-
@low = 0
|
48
|
-
@high = 0
|
49
|
-
end
|
28
|
+
@low, @high = RangeParser.parse(@year_string)
|
50
29
|
|
51
30
|
parse_year
|
52
31
|
end
|
@@ -73,20 +52,25 @@ class FlexYear
|
|
73
52
|
end
|
74
53
|
|
75
54
|
def parse_year
|
76
|
-
if @year_string =~ /(\d+)
|
77
|
-
@
|
78
|
-
|
79
|
-
@base_year = centuryize($1).to_i
|
55
|
+
if @year_string =~ /(\d+)\s*-\s*(\d+)/ && $1 && $2
|
56
|
+
@year_low = centuryize($1).to_i
|
57
|
+
@year_low, @year_high = [@year_low, centuryize($2, @year_low).to_i].sort
|
80
58
|
else
|
81
|
-
@
|
82
|
-
|
59
|
+
if @year_string =~ /(\d+).*s$/
|
60
|
+
@base_year = centuryize($1).to_i
|
61
|
+
elsif @year_string =~ /^\w+\s+(\d+)/
|
62
|
+
@base_year = centuryize($1).to_i
|
63
|
+
else
|
64
|
+
@base_year = @year_string.gsub(/\D+/,'').to_i
|
65
|
+
end
|
83
66
|
|
84
|
-
|
85
|
-
|
86
|
-
|
67
|
+
if @base_year > 9999
|
68
|
+
raise InvalidYearError, "Please use a four digit year."
|
69
|
+
end
|
87
70
|
|
88
|
-
|
89
|
-
|
71
|
+
@year_low = @base_year + (@low || 0)
|
72
|
+
@year_high = @base_year + (@high || 0)
|
73
|
+
end
|
90
74
|
end
|
91
75
|
|
92
76
|
# Represents a flexible year entry that must be in the past.
|
data/spec/flexyear_spec.rb
CHANGED
@@ -82,6 +82,12 @@ describe FlexYear do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
context "given a range 1975-1973 (from high to low)" do
|
86
|
+
subject { FlexYear.new('1975-1973') }
|
87
|
+
its(:year_low) { should eq(1973) }
|
88
|
+
its(:year_high) { should eq(1975) }
|
89
|
+
end
|
90
|
+
|
85
91
|
context "given a range" do
|
86
92
|
["2003-4", "2003-04"].each do |range|
|
87
93
|
subject { FlexYear.new(range) }
|
@@ -90,12 +96,6 @@ describe FlexYear do
|
|
90
96
|
end
|
91
97
|
end
|
92
98
|
|
93
|
-
context 'given a reissue' do
|
94
|
-
specify do
|
95
|
-
expect { FlexYear.new('65 reissue') }.to raise_error(FlexYear::InvalidYearError)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
99
|
context 'given a circa' do
|
100
100
|
context 'at the end of the string' do
|
101
101
|
subject { FlexYear.new('1973 (Circa)') }
|
metadata
CHANGED
@@ -1,95 +1,107 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: flexyear
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- Dan Melnick & Yan Pritzker
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: bundler
|
22
|
-
|
23
|
-
|
24
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
25
17
|
- - ~>
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 1
|
29
|
-
- 3
|
30
|
-
version: "1.3"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
31
20
|
type: :development
|
32
|
-
|
33
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
34
28
|
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
|
-
|
37
|
-
requirements:
|
38
|
-
- -
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
43
48
|
type: :development
|
44
|
-
|
45
|
-
|
46
|
-
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Parse common year range formats like '1973-75' or natural language ranges
|
56
|
+
like 'mid 80s'
|
57
|
+
email:
|
47
58
|
- pair+dm+yp@reverb.com
|
48
59
|
executables: []
|
49
|
-
|
50
60
|
extensions: []
|
51
|
-
|
52
61
|
extra_rdoc_files: []
|
53
|
-
|
54
|
-
files:
|
62
|
+
files:
|
55
63
|
- .gitignore
|
64
|
+
- CHANGELOG
|
56
65
|
- Gemfile
|
57
66
|
- LICENSE.txt
|
58
67
|
- README.md
|
59
68
|
- Rakefile
|
60
69
|
- flexyear.gemspec
|
61
70
|
- lib/flexyear.rb
|
71
|
+
- lib/flexyear/range_parsers/circa_parser.rb
|
72
|
+
- lib/flexyear/range_parsers/decade_parser.rb
|
73
|
+
- lib/flexyear/range_parsers/early_parser.rb
|
74
|
+
- lib/flexyear/range_parsers/late_parser.rb
|
75
|
+
- lib/flexyear/range_parsers/mid_parser.rb
|
76
|
+
- lib/flexyear/range_parsers/range_parser.rb
|
77
|
+
- lib/flexyear/range_parsers/specific_year_parser.rb
|
78
|
+
- lib/flexyear/range_parsers/year_range_parser.rb
|
62
79
|
- lib/flexyear/version.rb
|
63
80
|
- spec/flexyear_spec.rb
|
64
|
-
has_rdoc: true
|
65
81
|
homepage: http://github.com/reverbdev/flexyear
|
66
|
-
licenses:
|
82
|
+
licenses:
|
67
83
|
- MIT
|
84
|
+
metadata: {}
|
68
85
|
post_install_message:
|
69
86
|
rdoc_options: []
|
70
|
-
|
71
|
-
require_paths:
|
87
|
+
require_paths:
|
72
88
|
- lib
|
73
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
segments:
|
85
|
-
- 0
|
86
|
-
version: "0"
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
87
99
|
requirements: []
|
88
|
-
|
89
100
|
rubyforge_project:
|
90
|
-
rubygems_version:
|
101
|
+
rubygems_version: 2.0.0
|
91
102
|
signing_key:
|
92
|
-
specification_version:
|
103
|
+
specification_version: 4
|
93
104
|
summary: Natural language year range parser
|
94
|
-
test_files:
|
105
|
+
test_files:
|
95
106
|
- spec/flexyear_spec.rb
|
107
|
+
has_rdoc:
|