iso_bsd-i18n 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ceef5f26f3ebeaf81508fb5a3728e993e5a286d6
4
+ data.tar.gz: 7e68f9db7ee9725eac6315515a4f00686674a166
5
+ SHA512:
6
+ metadata.gz: cb845651fc8f40d60147b627bf39848e18e4bf06835216bc035b1ec3f87a08b5d7d0c839f7fcb4ccc150cdd5487d995b4f0edb8be3ad0040ecf4c1936583cc61
7
+ data.tar.gz: 8346cca19f8edd8357244d593ff791c0780fb29aaec8dfe44fc47f7b1e3b9a22c73ae473de5f8cc2dcecb31492b7b98f588369c2a00d0408abeb5547538c3db5
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,28 @@
1
+ # rcov generated
2
+ coverage
3
+
4
+ # rdoc generated
5
+ rdoc
6
+
7
+ # yard generated
8
+ doc
9
+ .yardoc
10
+
11
+ # bundler
12
+ .bundle
13
+
14
+ # jeweler generated
15
+ pkg
16
+
17
+ .localeapp/
18
+
19
+ *~
20
+ *.out
21
+ *.project
22
+ *.DS_Store
23
+ *~
24
+ .#*
25
+ *#
26
+ Gemfile.lock
27
+ *.lock
28
+ *.gem
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ rvm: 1.9.2
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 William Wedler
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # iso_bsd-i18n
2
+
3
+ Text data for describing ISO Bead Seat Diameters for bicycle wheels.
4
+
5
+ For background, see
6
+ http://www.sheldonbrown.com/tire-sizing.html#isoetrto
7
+
8
+ ## Basic Usage
9
+
10
+ require 'iso_bsd-i18n'
11
+
12
+ s = IsoBsdI18n::Size.new(622)
13
+ # Application(s)
14
+ s.app
15
+ # Traditional name(s)
16
+ s.trad
17
+ # Rarity information
18
+ s.rarity
19
+ # Test if common size
20
+ s.rarity.commmon?
21
+
22
+ # SizeCollection of all sizes
23
+ c = IsoBsdI18n::Size.all
24
+
25
+ # SizeCollection of common sizes
26
+ # (based on default rarity divisions)
27
+ c = IsoBsdI18n::Rarity::default_division.common
28
+
29
+ my_divisions = {:common=>[bsd,..], :uncommon=>[bsd,..], :rare=>[bsd]}
30
+
31
+ # Testing rarity based on specified divisions
32
+ s.rarity(my_divisions).common?
33
+
34
+ # Override default rarity divisions
35
+ Rarity::default_division = my_divisions
36
+
37
+ # License
38
+
39
+ See license file.
40
+
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+ require 'rake'
14
+
15
+ require 'rspec/core'
16
+ require 'rspec/core/rake_task'
17
+ RSpec::Core::RakeTask.new(:spec) do |spec|
18
+ spec.pattern = FileList['spec/**/*_spec.rb']
19
+ end
20
+
21
+ task :default => :spec
22
+
23
+ begin
24
+ # rake/rdoctask is deprecated in RDoc 2.4.2+
25
+ require 'rdoc/task'
26
+ rescue LoadError
27
+ require 'rake/rdoctask'
28
+ end
29
+
30
+ require_relative './lib/iso_bsd-i18n'
31
+
32
+ Rake::RDocTask.new do |rdoc|
33
+ version = IsoBsdI18n::VERSION
34
+
35
+ rdoc.rdoc_dir = 'rdoc'
36
+ rdoc.title = "iso_bsd-i18n #{version}"
37
+ rdoc.rdoc_files.include('README*')
38
+ rdoc.rdoc_files.include('lib/**/*.rb')
39
+ end
40
+
41
+ require 'i18n-spec/tasks'
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'iso_bsd-i18n/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{iso_bsd-i18n}
7
+ s.version = IsoBsdI18n::VERSION
8
+ s.homepage = "http://freeridepg.org/"
9
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.authors = [%q{William Wedler}]
11
+ s.date = %q{2012-11-09}
12
+ s.description = %q{Text describing bicycle wheel size information.}
13
+ s.email = %q{wedler.w@freeridepgh.org}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE.txt",
16
+ "README.md"
17
+ ]
18
+ s.files = `git ls-files`.split("\n")
19
+ s.licenses = [%q{MIT}]
20
+ s.require_paths = [%q{lib}]
21
+ s.rubygems_version = %q{1.8.6}
22
+ s.summary = %q{Text describing bicycle wheel size information. The purpose of this information is to assist in understanding and identifying a bicycle wheel size.}
23
+
24
+ s.add_development_dependency(%q<rake>, [">= 0"])
25
+ s.add_development_dependency(%q<rspec>, [">= 1.3.0"])
26
+ s.add_development_dependency(%q<i18n-spec>, [">= 0"])
27
+
28
+ s.add_runtime_dependency 'i18n', '>= 0', '>= 0'
29
+ s.add_runtime_dependency 'bundler', '~> 1.2', '~> 1.2'
30
+ end
31
+
@@ -0,0 +1,18 @@
1
+ require 'i18n'
2
+ require_relative 'iso_bsd-i18n/version'
3
+ require_relative 'iso_bsd-i18n/size'
4
+ require_relative 'iso_bsd-i18n/rarity'
5
+
6
+ module IsoBsdI18n
7
+ def IsoBsdI18n::init
8
+ I18n.load_path << Dir[File.join(File.expand_path(File.dirname(__FILE__) + '/../locales'), '*.yml')]
9
+ I18n.load_path.flatten!
10
+ end
11
+
12
+ if defined?(Rails)
13
+ require 'iso_bsd-i18n/iso_bsd-i18n_initializer.rb'
14
+ else
15
+ IsoBsdI18n::init
16
+ end
17
+
18
+ end
@@ -0,0 +1,58 @@
1
+ require 'i18n'
2
+
3
+ module IsoBsdI18n
4
+
5
+ # A Division encapsulates the classification of wheels into
6
+ # specified non-intersecting groups.
7
+ class Division
8
+
9
+ # @param [Hash, #each_pair] group_list Hash mapping division to array of sizes in the division
10
+ def initialize(group_list)
11
+ @raw_groups = group_list
12
+ @data = DivisionData.new(@raw_groups)
13
+ self.extend @data.to_mod
14
+ end
15
+
16
+ # @return [Hash]
17
+ def hash
18
+ @raw_groups
19
+ end
20
+
21
+ def == (other)
22
+ @raw_groups == other.hash
23
+ end
24
+
25
+ private
26
+
27
+ # Defining methods on the fly for Division instances
28
+ # http://blog.jayfields.com/2008/02/ruby-dynamically-define-method.html
29
+ class DivisionData
30
+ def initialize(data)
31
+ @h = data
32
+ @h ||= {}
33
+ @groups = {} # holder for caching
34
+ end
35
+
36
+ def to_mod
37
+ h = @h
38
+ grps = @groups
39
+ Module.new do
40
+ h.each_pair do |gname, collection|
41
+ define_method gname do
42
+ col = grps[gname]
43
+ col ||= SizeCollection.new(collection)
44
+ grps[gname] = col
45
+ end
46
+
47
+ define_method "#{gname}?" do |bsd|
48
+ col = grps[gname]
49
+ col ||= SizeCollection.new(collection)
50
+ col.include?(bsd)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end # class DivisionData
56
+
57
+ end # class Division
58
+ end # module BsdIsoI18n
@@ -0,0 +1,7 @@
1
+ module IsoBsdI18n
2
+ class Railtie < ::Rails::Railtie #:nodoc:
3
+ initializer 'rails-i18n' do |app|
4
+ IsoBsdI18n::init
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,130 @@
1
+ require 'i18n'
2
+ require_relative 'size'
3
+ require_relative 'division'
4
+
5
+ module IsoBsdI18n
6
+
7
+ # Classify Size instances based on rarity.
8
+ # Used to help distinguish similar sizes.
9
+ #
10
+ module Rarity
11
+
12
+ COMMON = [630, 622, 559, 507, 406, 305] unless defined?(COMMON)
13
+ UNCOMMON = [590, 597, 571] unless defined?(UNCOMMON)
14
+ RARE = [635, 599, 587, 584, 547, 540, 520,
15
+ 490, 457, 451, 440, 419, 390, 369,
16
+ 355, 349, 340, 337, 317, 203, 152, 137] unless defined?(RARE)
17
+
18
+ # The Division object used to classify size rarity.
19
+ # Used by default when explicit division is not specifed
20
+ # for Rarity functions.
21
+ #
22
+ # @return [Division]
23
+ def self.default_division
24
+ @default_division ||= Division.new(self.default_division_raw)
25
+ @default_division
26
+ end
27
+
28
+ # Configure the default to specify rarity divisions.
29
+ # When nil is given, the default is defined based on
30
+ # COMMON, UNCOMMON and RARE lists.
31
+ #
32
+ # @param [Hash, Division, nil] d
33
+ def self.default_division=(d)
34
+ if d.class == Division
35
+ @default_division = d
36
+ else
37
+ d = nil unless d.respond_to?(:each_pair)
38
+ d ||= self.default_division_raw
39
+ @default_division = Division.new(d)
40
+ end
41
+ return @default_division
42
+ end
43
+
44
+ # Get the Hash to specify a default division based on
45
+ # COMMON, UNCOMMON and RARE lists
46
+ # @return [Hash]
47
+ def self.default_division_raw
48
+ {
49
+ :common => COMMON,
50
+ :uncommon => UNCOMMON,
51
+ :rare => RARE
52
+ }
53
+ end
54
+
55
+ # Get the sizes of the given rarity
56
+ #
57
+ # @params [Symbol, String] rarity
58
+ # @params [Division] division
59
+ # @return [SizeCollection]
60
+ def self.get(rarity, division=nil)
61
+ division ||= default_division
62
+ division.send(rarity)
63
+ end
64
+
65
+ # Rarity value object to be used as an attribute to Size instances
66
+ #
67
+ class Value
68
+
69
+ # @param [Integer] bsd
70
+ # @param [Division, #each_pair] division rarity classifications
71
+ def initialize(bsd, division=nil)
72
+ @bsd = bsd
73
+ self.division=division
74
+ @data = ValueData.new(@bsd, @division)
75
+ self.extend @data.to_mod
76
+ end
77
+
78
+ # @return [String] Translated rarity
79
+ def to_s
80
+ str = nil
81
+ @division.hash.keys.each do |k|
82
+ if self.send("#{k}?")
83
+ str = I18n.translate("isobsd.rarity.#{k}")
84
+ end
85
+ end
86
+ str ||= AttribNoData.new
87
+
88
+ return str
89
+ end
90
+
91
+ private
92
+
93
+ # Initialize the Division object used to test for rarity
94
+ #
95
+ def division=(div)
96
+ @division = div if div.class == Division
97
+ @division ||= Division.new(div) if div.respond_to?(:each_pair)
98
+ @division ||= Rarity::default_division
99
+ end
100
+
101
+ # Defining methods on the fly for Value instances
102
+ class ValueData
103
+ def initialize(bsd, division)
104
+ @diameter = bsd
105
+ @div = division
106
+ @membership = {}
107
+ end
108
+
109
+ # @return [Module] A Value instance extends on initialization
110
+ def to_mod
111
+ div = @div
112
+ h = div.hash
113
+ diam = @diameter
114
+ mem = @membership
115
+ Module.new do
116
+ h.each_pair do |gname, collection|
117
+ define_method "#{gname}?" do
118
+ mem[gname] ||= div.send("#{gname}?", diam)
119
+ mem[gname]
120
+ end
121
+ end # h.each_pair do
122
+ end
123
+ end
124
+ end # class ValueData
125
+
126
+ end # class Value
127
+
128
+ end # module Rarity
129
+
130
+ end
@@ -0,0 +1,244 @@
1
+ require 'i18n'
2
+
3
+ module IsoBsdI18n
4
+
5
+ class AttribNoData < String
6
+ def initialize(str = nil)
7
+ str ||= I18n.translate('isobsd.messages.not_applicable')
8
+ super(str)
9
+ end
10
+
11
+ def capitalize
12
+ self.to_s
13
+ end
14
+ end
15
+
16
+ class SizeUnknown < String
17
+ def initialize(bsd)
18
+ @bsd = bsd
19
+ super(I18n.translate('isobsd.messages.unknown'))
20
+ end
21
+ end
22
+
23
+ class Size
24
+
25
+ # @param [Integer] bsd
26
+ #
27
+ def initialize(bsd)
28
+ @bsd = bsd
29
+ end
30
+
31
+ # Test if the given BSD value maps to known size data
32
+ #
33
+ # @param [Integer, #to_i] val
34
+ #
35
+ # @return [Boolean]
36
+ def self.unknown?(val)
37
+ !I18n.translate('isobsd.sizes').has_key?(val.to_i)
38
+ end
39
+
40
+ # Test if this size is unknown
41
+ #
42
+ # @return [Boolean]
43
+ def unknown?
44
+ Size.unknown?(@bsd)
45
+ end
46
+
47
+ # @return [String] The bsd as string.
48
+ #
49
+ def to_s
50
+ @bsd.to_s
51
+ end
52
+
53
+ def to_sym
54
+ @bsd.to_s.to_sym
55
+ end
56
+
57
+
58
+ # @return [Integer] The bsd for this size.
59
+ #
60
+ def to_i
61
+ @bsd.to_i
62
+ end
63
+
64
+ def <=>(other)
65
+ self.to_i <=> other.to_i
66
+ end
67
+
68
+ # @return [String] The bsd and units like 622mm
69
+ #
70
+ def diameter
71
+ @diam ||= "#{@bsd}mm"
72
+ @diam
73
+ end
74
+
75
+ # Traditional name or names of this size
76
+ # @return [String, Array]
77
+ def trad
78
+ lookup(:trad)
79
+ end
80
+
81
+ # Appliication(s) of this size
82
+ # @return [String, Array]
83
+ def app
84
+ lookup(:app)
85
+ end
86
+
87
+ # Rarity of the size given rarity divisions
88
+ #
89
+ # @param [Division, #each_pair] rarity_data rarity classifications
90
+ #
91
+ def rarity(rarity_data = nil)
92
+ if rarity_data.nil?
93
+ # Only cache when default rarity being used
94
+ @rarity ||= Rarity::Value.new(@bsd, rarity_data)
95
+ return @rarity
96
+ else
97
+ return Rarity::Value.new(@bsd, rarity_data)
98
+ end
99
+ end
100
+
101
+ # Provides a hash containing all attributes
102
+ #
103
+ # @return [Hash] of size attributes
104
+ def hash
105
+ {
106
+ :diameter => self.diameter,
107
+ :app => self.app,
108
+ :trad => self.trad,
109
+ :rarity => self.rarity.to_s
110
+ }
111
+ end
112
+
113
+ # @return [Array] All size information in an Array of Size objects
114
+ def Size.all
115
+ @all ||= SizeCollection.new(I18n.translate('isobsd.sizes').keys)
116
+ @all
117
+ end
118
+
119
+ private
120
+
121
+ # Lookup the attribute for the given key
122
+ # Returns an Array if multiple values map the the attribute
123
+ #
124
+ # @param [Symbol] key Attribute to lookup
125
+ # @return [String, Array]
126
+ def lookup(key)
127
+ if unknown?
128
+ return data
129
+ end
130
+
131
+ val = data[key]
132
+ val ||= AttribNoData.new
133
+
134
+ # Convert multi-lined entries to an array
135
+ if val.class == Hash
136
+ val = val.values
137
+ end
138
+
139
+ return val
140
+ end
141
+
142
+ # Wrapper for the I18n::translate call to retrieve wheel size data
143
+ # @return [Hash]
144
+ def data
145
+ @data ||= (unknown?) ? SizeUnknown.new(@bsd) : I18n.translate("isobsd.sizes")[@bsd]
146
+ @data
147
+ end
148
+
149
+ end # class Size
150
+
151
+ class SizeCollection
152
+
153
+ include Enumerable
154
+
155
+ # @param [Array] data List of sizes to include in the collection
156
+ def initialize(data=[])
157
+ @list = data
158
+ end
159
+
160
+ # Array of size objects in the collection
161
+ #
162
+ # @return [Array]
163
+ def sizes
164
+ select_sizes(@list)
165
+ end
166
+
167
+ def each
168
+ self.sizes.each do |s|
169
+ yield s
170
+ end
171
+ end
172
+
173
+ # Test if the given size is in the collection
174
+ #
175
+ # @param [Size, #==] val
176
+ #
177
+ # @return [Boolean]
178
+ def include?(val)
179
+ @list.include?(val)
180
+ end
181
+
182
+ # A nested hash of structure
183
+ # { size.diameter => size.hash ,... }
184
+ #
185
+ # @return (Hash)
186
+ def hash
187
+ Hash[sizes.map{|s| [s.to_i, s.hash]}]
188
+ end
189
+
190
+ # @param [Array] locales String array specifying locales to include
191
+ # @return [Hash] The hash for each Size in the collection for each locale specified
192
+ def hash_locale(locales=nil)
193
+ orig_locale = I18n.locale
194
+ h = {}
195
+
196
+ if(locales.nil? || locales.empty?)
197
+ locales = I18n::available_locales
198
+ end
199
+
200
+ begin
201
+ locales.each do |l|
202
+ begin
203
+ if ! I18n.translate('isobsd', :raise => true, :locale => l).nil?
204
+ I18n.locale = l
205
+ h[l] = self.hash
206
+ end
207
+ rescue
208
+ end
209
+ end
210
+ ensure
211
+ I18n.locale = orig_locale
212
+ end
213
+ return h
214
+ end
215
+
216
+ # Hash of structure
217
+ # {size.bsd => size.diameter, ... }
218
+ #
219
+ # @return [Hash]
220
+ def labels
221
+ Hash[sizes.map{|s| [s.to_s, s.diameter]}]
222
+ end
223
+
224
+ # Array of size.hash
225
+ #
226
+ # @return [Array]
227
+ def to_data
228
+ sizes.map{|s| {:id=>s.to_s, :text=>s.diameter}}
229
+ end
230
+
231
+ private
232
+
233
+ # @param [Array] targets List of sizes to include
234
+ # @param [Hash] size_data Data set to build Size objects from
235
+ # @return [Array] of Size objects
236
+ def select_sizes(targets=nil,size_data=nil)
237
+ size_data ||= I18n.translate('isobsd.sizes')
238
+ group = size_data.select{|k,v| (targets.include? k)} unless targets.nil?
239
+ group ||= size_data
240
+ group.keys.map{|k| Size.new(k)}
241
+ end
242
+ end # class SizeCollection
243
+
244
+ end