icu_utils 1.0.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 +15 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +29 -0
- data/Icon.png +0 -0
- data/LICENSE.txt +22 -0
- data/README.md +19 -0
- data/Rakefile +1 -0
- data/bin/autospec +16 -0
- data/bin/rake +16 -0
- data/bin/ri +16 -0
- data/bin/rspec +16 -0
- data/icu_utils.gemspec +25 -0
- data/lib/icu_utils/federation.rb +309 -0
- data/lib/icu_utils/version.rb +3 -0
- data/lib/icu_utils.rb +2 -0
- data/spec/federation_spec.rb +190 -0
- data/spec/spec_helper.rb +2 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZmI4OGJlNjg3MjJkZjEwNDFlMmMyZTViNmExY2RmYTczN2Q3YWI0Yw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YzUzYTA0ZDlhN2IxZGVmYWZlNjc1NjQ1NTNkMjFjMTI1NDVhOTk4ZA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZmQ1Y2EyNzFlZWZiZjNiODhjMDM2Nzc4NWEyOTFlYjY3OGU4NTZjYjgwYWNi
|
10
|
+
MmRmNTI1ZTYwOTNhMDg2YmFkMzlhZDc2MWI5MWU3NWFmYzdmMzQ5M2EzMDdm
|
11
|
+
Njg5YjcwMDRkOThkMTFjNTZiNjM2MTZkOTEwODU4MzI3ODA5NTU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NmFlZTU2YjNmZWM4NzM2YWE2ODJkNDM5Yzc5MWYzZjVlM2MwNTA1MDcwMThi
|
14
|
+
MDk1MDgxZTNlMTliOGYzZThlNWM4OWQxMzM2NTlhNDZjM2RkZTZhY2FmMzFl
|
15
|
+
ODM2ZGE4YTJjOGE3ZjA2NTI1MGFiNjcwZGEwMjQ0MWFiNWQxMGM=
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
icu_utils (1.0.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.2.4)
|
10
|
+
rake (10.1.0)
|
11
|
+
rdoc (3.9.5)
|
12
|
+
rspec (2.14.1)
|
13
|
+
rspec-core (~> 2.14.0)
|
14
|
+
rspec-expectations (~> 2.14.0)
|
15
|
+
rspec-mocks (~> 2.14.0)
|
16
|
+
rspec-core (2.14.7)
|
17
|
+
rspec-expectations (2.14.3)
|
18
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
19
|
+
rspec-mocks (2.14.4)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
bundler (~> 1.3)
|
26
|
+
icu_utils!
|
27
|
+
rake
|
28
|
+
rdoc
|
29
|
+
rspec
|
data/Icon.png
ADDED
Binary file
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Mark Orr
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# IcuUtils
|
2
|
+
|
3
|
+
A place for utilities shared across the various ICU apps and gems.
|
4
|
+
|
5
|
+
So far just includes a class to handle FIDE federations.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'icu_utils'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install icu_utils
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/autospec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'autospec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'autospec')
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rake', 'rake')
|
data/bin/ri
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ri' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rdoc', 'ri')
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/icu_utils.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'icu_utils/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "icu_utils"
|
8
|
+
s.version = IcuUtils::VERSION
|
9
|
+
s.authors = ["Mark Orr"]
|
10
|
+
s.email = ["mark.j.l.orr@googlemail.com"]
|
11
|
+
s.description = %q{A place for shared utilities for sharing between the various ICU apps and gems}
|
12
|
+
s.summary = %q{Shared ICU utilities}
|
13
|
+
s.homepage = "http://github.com/sanichi/icu_utils"
|
14
|
+
s.license = "MIT"
|
15
|
+
|
16
|
+
s.extra_rdoc_files = %w(LICENSE.txt README.md)
|
17
|
+
s.files = `git ls-files`.split($/)
|
18
|
+
s.test_files = s.files.grep(%r{^(spec)/})
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency "rdoc"
|
25
|
+
end
|
@@ -0,0 +1,309 @@
|
|
1
|
+
module ICU
|
2
|
+
#
|
3
|
+
# This class can be used to map a string into an object representing a chess federation.
|
4
|
+
# In FIDE, chess federations are generally either referred to by their full names such as
|
5
|
+
# _Ireland_ or _Russia_ or by three letter codes such as _IRL_ or _RUS_. The three letter
|
6
|
+
# codes are mostly the same as those found in the international standard known as
|
7
|
+
# {ISO 3166-1 alpha-3}[http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3], but with
|
8
|
+
# some differences (e.g. for England, Scotland and Wales).
|
9
|
+
#
|
10
|
+
# You cannot directly create instances of this class using _new_. Instead, you supply
|
11
|
+
# a string to the class method _find_ and, if the string supplied uniguely identifies a
|
12
|
+
# federation, an instance is returned which responds to _name_ and _code_.
|
13
|
+
#
|
14
|
+
# fed = ICU::Federation.find('IRL')
|
15
|
+
# fed.name # => "Ireland"
|
16
|
+
# fed.code # => "IRL"
|
17
|
+
#
|
18
|
+
# If the string is not sufficient to identify a federation, the _find_ method returns _nil_.
|
19
|
+
#
|
20
|
+
# fed = ICU::Federation.find('ZYX') # => nil
|
21
|
+
#
|
22
|
+
# If the string is three letters long and matches (case insenstively) one of the unique
|
23
|
+
# federation codes, then the instance corresponding to that federation is returned.
|
24
|
+
#
|
25
|
+
# ICU::Federation.find('rUs').code # => "RUS"
|
26
|
+
#
|
27
|
+
# If the string is more than three letters long and if it is a substring (case insensitive)
|
28
|
+
# of exactly one federation name, then that federation is returned.
|
29
|
+
#
|
30
|
+
# ICU::Federation.find('ongoli').name # => "Mongolia"
|
31
|
+
#
|
32
|
+
# In all other cases, nil is returned. In the following example, the string matches more than one federation.
|
33
|
+
#
|
34
|
+
# ICU::Federation.find('land') # => nil
|
35
|
+
#
|
36
|
+
# The method is not fooled by irrelevant white space.
|
37
|
+
#
|
38
|
+
# ICU::Federation.find(' united states ').code # => 'USA'
|
39
|
+
#
|
40
|
+
# The class method _menu_ will return an array of two-element arrays each of which contain a name
|
41
|
+
# and a code.
|
42
|
+
#
|
43
|
+
# ICU::Federation.menu # => [['Afghanistan', 'AFG'], ['Albania', 'ALB], ...]
|
44
|
+
#
|
45
|
+
# Such an array could be used, for example, as the basis of a selection menu in a web application.
|
46
|
+
# Various options are available to alter the array returned. Use the _:order_ option to order by code
|
47
|
+
# instead of the default (by country name).
|
48
|
+
#
|
49
|
+
# ICU::Federation.menu(:order => 'code') # => [..., ['Ireland', 'IRL'], ['Iraq', 'IRQ], ...]
|
50
|
+
#
|
51
|
+
# To put one country at the top (followed by the rest, in order) supply the country's code with the _:top_ option:
|
52
|
+
#
|
53
|
+
# ICU::Federation.menu(:top => 'IRL') # => [['Ireland', 'IRL'], ['Afghanistan', 'AFG], ...]
|
54
|
+
#
|
55
|
+
# To supply an extra "None" item at the top, specify its label with the _:none_ option:
|
56
|
+
#
|
57
|
+
# ICU::Federation.menu(:none => 'None') # => [['None', ''], ['Afghanistan', 'AFG], ...]
|
58
|
+
#
|
59
|
+
# The "None" option's code is the empty string and it comes above the "top" option if both are specified.
|
60
|
+
#
|
61
|
+
class Federation
|
62
|
+
attr_reader :code, :name
|
63
|
+
private_class_method :new
|
64
|
+
|
65
|
+
# Given a code, name or part of a name, return the corresponding federation instance.
|
66
|
+
# If there is no match or more than one match, _nil_ is returned.
|
67
|
+
def self.find(str=nil)
|
68
|
+
return nil unless str
|
69
|
+
str = str.to_s
|
70
|
+
return nil if str.length < 3
|
71
|
+
compile
|
72
|
+
str = str.strip.squeeze(' ').downcase
|
73
|
+
return @@codes[str] if str.length == 3
|
74
|
+
return @@names[str] if @@names[str]
|
75
|
+
matches = Array.new
|
76
|
+
@@names.each_key do |name|
|
77
|
+
matches << @@names[name] if name.index(str)
|
78
|
+
end
|
79
|
+
matches.uniq!
|
80
|
+
return nil unless matches.length == 1
|
81
|
+
matches[0]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Return an array of codes and names suitable for creating a federation menu in Rails.
|
85
|
+
# ICU::Federation.menu(:order => 'code') # order federations by code (instead of by name)
|
86
|
+
# ICU::Federation.menu(:top => 'IRL') # make this federation come first
|
87
|
+
# ICU::Federation.menu(:none => 'None') # add a dummy top entry with name "None" and blank code
|
88
|
+
def self.menu(opts = {})
|
89
|
+
compile
|
90
|
+
top, menu = nil, []
|
91
|
+
@@objects.each {|o| opts[:top] == o.code ? top = [o.name, o.code] : menu.push([o.name, o.code]) }
|
92
|
+
opts[:order] == 'code' ? menu.sort!{|a,b| a.last <=> b.last} : menu.sort!{|a,b| a.first <=> b.first}
|
93
|
+
menu.unshift(top) if top
|
94
|
+
menu.unshift([opts[:none], '']) if opts[:none]
|
95
|
+
menu
|
96
|
+
end
|
97
|
+
|
98
|
+
# Return an array of sorted federation codes.
|
99
|
+
def self.codes
|
100
|
+
compile
|
101
|
+
@@objects.map(&:code).sort
|
102
|
+
end
|
103
|
+
|
104
|
+
def initialize(code, name) # :nodoc: because new is private
|
105
|
+
@code = code
|
106
|
+
@name = name
|
107
|
+
end
|
108
|
+
|
109
|
+
# :enddoc:
|
110
|
+
private
|
111
|
+
|
112
|
+
def self.compile
|
113
|
+
return if @@objects
|
114
|
+
@@names = Hash.new
|
115
|
+
@@codes = Hash.new
|
116
|
+
@@objects = Array.new
|
117
|
+
@@data.each do |d|
|
118
|
+
object = new(d[0], d[1])
|
119
|
+
@@objects << object
|
120
|
+
@@codes[d[0].downcase] = object
|
121
|
+
(1..d.length-1).each do |i|
|
122
|
+
@@names[d[i].downcase] = object
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# The data structures compiled.
|
128
|
+
@@objects, @@codes, @@names = nil, nil, nil
|
129
|
+
|
130
|
+
# An array of data that gets compiled into other data structures.
|
131
|
+
@@data =
|
132
|
+
[
|
133
|
+
['AFG', 'Afghanistan'],
|
134
|
+
['ALB', 'Albania'],
|
135
|
+
['ALG', 'Algeria'],
|
136
|
+
['AND', 'Andorra'],
|
137
|
+
['ANG', 'Angola'],
|
138
|
+
['ANT', 'Antigua'],
|
139
|
+
['ARG', 'Argentina'],
|
140
|
+
['ARM', 'Armenia'],
|
141
|
+
['ARU', 'Aruba'],
|
142
|
+
['AUS', 'Australia'],
|
143
|
+
['AUT', 'Austria'],
|
144
|
+
['AZE', 'Azerbaijan'],
|
145
|
+
['BAH', 'Bahamas'],
|
146
|
+
['BRN', 'Bahrain'],
|
147
|
+
['BAN', 'Bangladesh'],
|
148
|
+
['BAR', 'Barbados'],
|
149
|
+
['BLR', 'Belarus'],
|
150
|
+
['BEL', 'Belgium'],
|
151
|
+
['BIZ', 'Belize'],
|
152
|
+
['BEN', 'Benin Republic'],
|
153
|
+
['BER', 'Bermuda'],
|
154
|
+
['BHU', 'Bhutan'],
|
155
|
+
['BOL', 'Bolivia'],
|
156
|
+
['BIH', 'Bosnia and Herzegovina'],
|
157
|
+
['BOT', 'Botswana'],
|
158
|
+
['BRA', 'Brazil'],
|
159
|
+
['IVB', 'British Virgin Islands'],
|
160
|
+
['BRU', 'Brunei Darussalam'],
|
161
|
+
['BUL', 'Bulgaria'],
|
162
|
+
['BUR', 'Burkina Faso'],
|
163
|
+
['BDI', 'Burundi'],
|
164
|
+
['CAM', 'Cambodia'],
|
165
|
+
['CMR', 'Cameroon'],
|
166
|
+
['CAN', 'Canada'],
|
167
|
+
['CHA', 'Chad'],
|
168
|
+
['CHI', 'Chile'],
|
169
|
+
['CHN', 'China'],
|
170
|
+
['TPE', 'Chinese Taipei'],
|
171
|
+
['COL', 'Colombia'],
|
172
|
+
['CRC', 'Costa Rica'],
|
173
|
+
['CRO', 'Croatia'],
|
174
|
+
['CUB', 'Cuba'],
|
175
|
+
['CYP', 'Cyprus'],
|
176
|
+
['CZE', 'Czech Republic'],
|
177
|
+
['DEN', 'Denmark'],
|
178
|
+
['DJI', 'Djibouti'],
|
179
|
+
['DOM', 'Dominican Republic'],
|
180
|
+
['ECU', 'Ecuador'],
|
181
|
+
['EGY', 'Egypt'],
|
182
|
+
['ESA', 'El Salvador'],
|
183
|
+
['ENG', 'England'],
|
184
|
+
['EST', 'Estonia'],
|
185
|
+
['ETH', 'Ethiopia'],
|
186
|
+
['FAI', 'Faroe Islands'],
|
187
|
+
['FIJ', 'Fiji'],
|
188
|
+
['FIN', 'Finland'],
|
189
|
+
['FRA', 'France'],
|
190
|
+
['GAB', 'Gabon'],
|
191
|
+
['GAM', 'Gambia'],
|
192
|
+
['GEO', 'Georgia'],
|
193
|
+
['GER', 'Germany'],
|
194
|
+
['GHA', 'Ghana'],
|
195
|
+
['GRE', 'Greece'],
|
196
|
+
['GUA', 'Guatemala'],
|
197
|
+
['GCI', 'Guernsey'],
|
198
|
+
['GUY', 'Guyana'],
|
199
|
+
['HAI', 'Haiti'],
|
200
|
+
['HON', 'Honduras'],
|
201
|
+
['HKG', 'Hong Kong'],
|
202
|
+
['HUN', 'Hungary'],
|
203
|
+
['ISL', 'Iceland'],
|
204
|
+
['IND', 'India'],
|
205
|
+
['INA', 'Indonesia'],
|
206
|
+
['IRI', 'Iran'],
|
207
|
+
['IRQ', 'Iraq'],
|
208
|
+
['IRL', 'Ireland'],
|
209
|
+
['ISR', 'Israel'],
|
210
|
+
['ITA', 'Italy'],
|
211
|
+
['CIV', 'Ivory Coast'],
|
212
|
+
['JAM', 'Jamaica'],
|
213
|
+
['JPN', 'Japan'],
|
214
|
+
['JCI', 'Jersey'],
|
215
|
+
['JOR', 'Jordan'],
|
216
|
+
['KAZ', 'Kazakhstan'],
|
217
|
+
['KEN', 'Kenya'],
|
218
|
+
['KUW', 'Kuwait'],
|
219
|
+
['KGZ', 'Kyrgyzstan'],
|
220
|
+
['LAT', 'Latvia'],
|
221
|
+
['LIB', 'Lebanon'],
|
222
|
+
['LBA', 'Libya'],
|
223
|
+
['LIE', 'Liechtenstein'],
|
224
|
+
['LTU', 'Lithuania'],
|
225
|
+
['LUX', 'Luxembourg'],
|
226
|
+
['MAC', 'Macau'],
|
227
|
+
['MKD', 'Macedonia', 'Former YUG Rep of Macedonia', 'Former Yugoslav Republic of Macedonia', 'FYROM'],
|
228
|
+
['MAD', 'Madagascar'],
|
229
|
+
['MAW', 'Malawi'],
|
230
|
+
['MAS', 'Malaysia'],
|
231
|
+
['MDV', 'Maldives'],
|
232
|
+
['MLI', 'Mali'],
|
233
|
+
['MLT', 'Malta'],
|
234
|
+
['MAU', 'Mauritania'],
|
235
|
+
['MRI', 'Mauritius'],
|
236
|
+
['MEX', 'Mexico'],
|
237
|
+
['MDA', 'Moldova'],
|
238
|
+
['MNC', 'Monaco'],
|
239
|
+
['MGL', 'Mongolia'],
|
240
|
+
['MNE', 'Montenegro'],
|
241
|
+
['MAR', 'Morocco'],
|
242
|
+
['MOZ', 'Mozambique'],
|
243
|
+
['MYA', 'Myanmar'],
|
244
|
+
['NAM', 'Namibia'],
|
245
|
+
['NEP', 'Nepal'],
|
246
|
+
['NED', 'Netherlands'],
|
247
|
+
['AHO', 'Netherlands Antilles'],
|
248
|
+
['NZL', 'New Zealand'],
|
249
|
+
['NCA', 'Nicaragua'],
|
250
|
+
['NGR', 'Nigeria'],
|
251
|
+
['NOR', 'Norway'],
|
252
|
+
['PAK', 'Pakistan'],
|
253
|
+
['PLW', 'Palau'],
|
254
|
+
['PLE', 'Palestine'],
|
255
|
+
['PAN', 'Panama'],
|
256
|
+
['PNG', 'Papua New Guinea'],
|
257
|
+
['PAR', 'Paraguay'],
|
258
|
+
['PER', 'Peru'],
|
259
|
+
['PHI', 'Philippines'],
|
260
|
+
['POL', 'Poland'],
|
261
|
+
['POR', 'Portugal'],
|
262
|
+
['PUR', 'Puerto Rico'],
|
263
|
+
['QAT', 'Qatar'],
|
264
|
+
['ROU', 'Romania'],
|
265
|
+
['RUS', 'Russia'],
|
266
|
+
['RWA', 'Rwanda'],
|
267
|
+
['SMR', 'San Marino'],
|
268
|
+
['STP', 'Sao Tome and Principe'],
|
269
|
+
['SCO', 'Scotland'],
|
270
|
+
['SEN', 'Senegal'],
|
271
|
+
['SRB', 'Serbia'],
|
272
|
+
['SEY', 'Seychelles'],
|
273
|
+
['SLE', 'Siera Leone'],
|
274
|
+
['SIN', 'Singapore'],
|
275
|
+
['SVK', 'Slovakia'],
|
276
|
+
['SLO', 'Slovenia'],
|
277
|
+
['SOM', 'Somalia'],
|
278
|
+
['RSA', 'South Africa'],
|
279
|
+
['KOR', 'South Korea'],
|
280
|
+
['ESP', 'Spain'],
|
281
|
+
['SRI', 'Sri Lanka'],
|
282
|
+
['SUD', 'Sudan'],
|
283
|
+
['SUR', 'Surinam'],
|
284
|
+
['SWE', 'Sweden'],
|
285
|
+
['SUI', 'Switzerland'],
|
286
|
+
['SYR', 'Syria'],
|
287
|
+
['TJK', 'Tajikistan'],
|
288
|
+
['TAN', 'Tanzania'],
|
289
|
+
['THA', 'Thailand'],
|
290
|
+
['TRI', 'Trinidad and Tobago'],
|
291
|
+
['TUN', 'Tunisia'],
|
292
|
+
['TUR', 'Turkey'],
|
293
|
+
['TKM', 'Turkmenistan'],
|
294
|
+
['UGA', 'Uganda'],
|
295
|
+
['UKR', 'Ukraine'],
|
296
|
+
['UAE', 'United Arab Emirates'],
|
297
|
+
['USA', 'United States of America'],
|
298
|
+
['URU', 'Uruguay'],
|
299
|
+
['ISV', 'US Virgin Islands'],
|
300
|
+
['UZB', 'Uzbekistan'],
|
301
|
+
['VEN', 'Venezuela'],
|
302
|
+
['VIE', 'Vietnam'],
|
303
|
+
['WLS', 'Wales'],
|
304
|
+
['YEM', 'Yemen'],
|
305
|
+
['ZAM', 'Zambia'],
|
306
|
+
['ZIM', 'Zimbabwe'],
|
307
|
+
]
|
308
|
+
end
|
309
|
+
end
|
data/lib/icu_utils.rb
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module ICU
|
4
|
+
describe Federation do
|
5
|
+
context "#find using codes" do
|
6
|
+
it "should find a federation given a valid code" do
|
7
|
+
fed = Federation.find('IRL')
|
8
|
+
fed.code.should == 'IRL'
|
9
|
+
fed.name.should == 'Ireland'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should find a federation from code case insensitively" do
|
13
|
+
fed = Federation.find('rUs')
|
14
|
+
fed.code.should == 'RUS'
|
15
|
+
fed.name.should == 'Russia'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should find a federation despite irrelevant whitespace" do
|
19
|
+
fed = Federation.find(' mex ')
|
20
|
+
fed.code.should == 'MEX'
|
21
|
+
fed.name.should == 'Mexico'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return nil for an invalid code" do
|
25
|
+
Federation.find('XYZ').should be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "#find using names" do
|
30
|
+
it "should find a federation given a valid name" do
|
31
|
+
fed = Federation.find('England')
|
32
|
+
fed.code.should == 'ENG'
|
33
|
+
fed.name.should == 'England'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should find a federation from name case insensitively" do
|
37
|
+
fed = Federation.find('franCE')
|
38
|
+
fed.code.should == 'FRA'
|
39
|
+
fed.name.should == 'France'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should not be fooled by irrelevant whitespace" do
|
43
|
+
fed = Federation.find(' united states of america ')
|
44
|
+
fed.code.should == 'USA'
|
45
|
+
fed.name.should == 'United States of America'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return nil for an invalid name" do
|
49
|
+
Federation.find('Mordor').should be_nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "#find using parts of names" do
|
54
|
+
it "should find a federation given a substring which is unique and at least 4 characters" do
|
55
|
+
fed = Federation.find('bosni')
|
56
|
+
fed.code.should == 'BIH'
|
57
|
+
fed.name.should == 'Bosnia and Herzegovina'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should not be fooled by irrelevant whitespace" do
|
61
|
+
fed = Federation.find(' arab EMIRATES ')
|
62
|
+
fed.code.should == 'UAE'
|
63
|
+
fed.name.should == 'United Arab Emirates'
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not find a federation if the substring matches more than one" do
|
67
|
+
Federation.find('land').should be_nil
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return nil for any string smaller in length than 3" do
|
71
|
+
Federation.find('ze').should be_nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "#find federations with alternative names" do
|
76
|
+
it "should find Macedonia multiple ways" do
|
77
|
+
Federation.find('MKD').name.should == 'Macedonia'
|
78
|
+
Federation.find('FYROM').name.should == 'Macedonia'
|
79
|
+
Federation.find('macedoni').name.should == 'Macedonia'
|
80
|
+
Federation.find('Macedonia').name.should == 'Macedonia'
|
81
|
+
Federation.find('former YUG Rep').name.should == 'Macedonia'
|
82
|
+
Federation.find('Republic of Macedonia').name.should == 'Macedonia'
|
83
|
+
Federation.find('former yugoslav republic').name.should == 'Macedonia'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "#find with alternative inputs" do
|
88
|
+
it "should behave robustly with completely invalid inputs" do
|
89
|
+
Federation.find().should be_nil
|
90
|
+
Federation.find(nil).should be_nil
|
91
|
+
Federation.find('').should be_nil
|
92
|
+
Federation.find(1).should be_nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "#new is private" do
|
97
|
+
it "#new cannot be called directly" do
|
98
|
+
lambda { Federation.new('IRL', 'Ireland') }.should raise_error(/private method/)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "documentation examples" do
|
103
|
+
it "should all be correct for valid input" do
|
104
|
+
Federation.find('IRL').name.should == 'Ireland'
|
105
|
+
Federation.find('IRL').code.should == 'IRL'
|
106
|
+
Federation.find('rUs').code.should == 'RUS'
|
107
|
+
Federation.find('ongoli').name.should == 'Mongolia'
|
108
|
+
Federation.find(' united states ').code.should == 'USA'
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should return nil for invalid input" do
|
112
|
+
Federation.find('ZYX').should be_nil
|
113
|
+
Federation.find('land').should be_nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "#menu" do
|
118
|
+
before(:all) do
|
119
|
+
@total = 174
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should return array of name-code pairs in order of name by default" do
|
123
|
+
menu = Federation.menu
|
124
|
+
menu.should have(@total).items
|
125
|
+
names = menu.map{|m| m.first}.join(',')
|
126
|
+
codes = menu.map{|m| m.last}.join(',')
|
127
|
+
names.index('Afghanistan').should == 0
|
128
|
+
names.index('Iraq,Ireland,Israel').should_not be_nil
|
129
|
+
codes.index('AFG').should == 0
|
130
|
+
codes.index('IRQ,IRL,ISR').should_not be_nil
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should be configuarble to order the list by codes" do
|
134
|
+
menu = Federation.menu(:order => "code")
|
135
|
+
menu.should have(@total).items
|
136
|
+
names = menu.map{|m| m.first}.join(',')
|
137
|
+
codes = menu.map{|m| m.last}.join(',')
|
138
|
+
names.index('Afghanistan').should == 0
|
139
|
+
names.index('Ireland,Iraq,Iceland').should_not be_nil
|
140
|
+
codes.index('AFG').should == 0
|
141
|
+
codes.index('IRL,IRQ,ISL').should_not be_nil
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should be configuarble to have a selected country at the top" do
|
145
|
+
menu = Federation.menu(:top => 'IRL')
|
146
|
+
menu.should have(@total).items
|
147
|
+
names = menu.map{|m| m.first}.join(',')
|
148
|
+
codes = menu.map{|m| m.last}.join(',')
|
149
|
+
names.index('Ireland,Afghanistan').should == 0
|
150
|
+
names.index('Iraq,Israel').should_not be_nil
|
151
|
+
codes.index('IRL,AFG').should == 0
|
152
|
+
codes.index('IRQ,ISR').should_not be_nil
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should be configuarble to have 'None' entry at the top" do
|
156
|
+
menu = Federation.menu(:none => 'None')
|
157
|
+
menu.should have(@total + 1).items
|
158
|
+
names = menu.map{|m| m.first}.join(',')
|
159
|
+
codes = menu.map{|m| m.last}.join(',')
|
160
|
+
names.index('None,Afghanistan').should == 0
|
161
|
+
codes.index(',AFG').should == 0
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should be able to handle multiple configuarations" do
|
165
|
+
menu = Federation.menu(:top => 'IRL', :order => 'code', :none => 'None')
|
166
|
+
menu.should have(@total + 1).items
|
167
|
+
names = menu.map{|m| m.first}.join(',')
|
168
|
+
codes = menu.map{|m| m.last}.join(',')
|
169
|
+
names.index('None,Ireland,Afghanistan').should == 0
|
170
|
+
names.index('Iraq,Iceland').should_not be_nil
|
171
|
+
codes.index(',IRL,AFG').should == 0
|
172
|
+
codes.index('IRQ,ISL').should_not be_nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context "#codes" do
|
177
|
+
before(:all) do
|
178
|
+
@total = 174
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should return array of codes ordered alphabetically" do
|
182
|
+
codes = Federation.codes
|
183
|
+
codes.should have(@total).items
|
184
|
+
all = codes.join(',')
|
185
|
+
all.index('AFG').should == 0
|
186
|
+
all.index('INA,IND,IRI,IRL,IRQ,ISL,ISR,ISV,ITA,IVB').should_not be_nil
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: icu_utils
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Orr
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
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
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
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'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: A place for shared utilities for sharing between the various ICU apps
|
70
|
+
and gems
|
71
|
+
email:
|
72
|
+
- mark.j.l.orr@googlemail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files:
|
76
|
+
- LICENSE.txt
|
77
|
+
- README.md
|
78
|
+
files:
|
79
|
+
- .gitignore
|
80
|
+
- .rspec
|
81
|
+
- Gemfile
|
82
|
+
- Gemfile.lock
|
83
|
+
- Icon.png
|
84
|
+
- LICENSE.txt
|
85
|
+
- README.md
|
86
|
+
- Rakefile
|
87
|
+
- bin/autospec
|
88
|
+
- bin/rake
|
89
|
+
- bin/ri
|
90
|
+
- bin/rspec
|
91
|
+
- icu_utils.gemspec
|
92
|
+
- lib/icu_utils.rb
|
93
|
+
- lib/icu_utils/federation.rb
|
94
|
+
- lib/icu_utils/version.rb
|
95
|
+
- spec/federation_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
homepage: http://github.com/sanichi/icu_utils
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.1.10
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Shared ICU utilities
|
121
|
+
test_files:
|
122
|
+
- spec/federation_spec.rb
|
123
|
+
- spec/spec_helper.rb
|