taxamatch_rb 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/taxamatch_rb.rb CHANGED
@@ -1,176 +1,16 @@
1
- # encoding: UTF-8
2
- $:.unshift(File.dirname(__FILE__)) unless
3
- $:.include?(File.dirname(__FILE__)) ||
4
- $:.include?(File.expand_path(File.dirname(__FILE__)))
5
- # $:.unshift('taxamatch_rb')
6
- require 'damerau-levenshtein'
7
- require 'taxamatch_rb/atomizer'
8
- require 'taxamatch_rb/normalizer'
9
- require 'taxamatch_rb/phonetizer'
10
- require 'taxamatch_rb/authmatch'
11
-
12
- if RUBY_VERSION < '1.9.1'
13
- raise 'IMPORTANT: Parsley-store gem requires ruby >= 1.9.1'
1
+ # encoding: utf-8
2
+ require "taxamatch_rb/version"
3
+ require "damerau-levenshtein"
4
+ require "taxamatch_rb/base"
5
+ require "taxamatch_rb/atomizer"
6
+ require "taxamatch_rb/normalizer"
7
+ require "taxamatch_rb/phonetizer"
8
+ require "taxamatch_rb/authmatch"
9
+
10
+ if RUBY_VERSION < "1.9.1"
11
+ fail "IMPORTANT: taxamatch_rb gem requires ruby >= 1.9.1"
14
12
  end
15
13
 
14
+ # Taxamatch provides fuzzy comparison between two scientific names
16
15
  module Taxamatch
17
-
18
- class Base
19
-
20
- def initialize
21
- @parser = Taxamatch::Atomizer.new
22
- @dlm = DamerauLevenshtein
23
- end
24
-
25
-
26
- # takes two scientific names and returns true
27
- # if names match and false if they don't
28
- def taxamatch(str1, str2, return_boolean = true)
29
- preparsed_1 = @parser.parse(str1)
30
- preparsed_2 = @parser.parse(str2)
31
- match = taxamatch_preparsed(preparsed_1, preparsed_2) rescue nil
32
- return_boolean ? (!!match && match['match']) : match
33
- end
34
-
35
- # takes two hashes of parsed scientific names, analyses them and
36
- # returns back this function is useful when species strings are preparsed.
37
- def taxamatch_preparsed(preparsed_1, preparsed_2)
38
- result = nil
39
- if preparsed_1[:uninomial] && preparsed_2[:uninomial]
40
- result = match_uninomial(preparsed_1, preparsed_2)
41
- end
42
- if preparsed_1[:genus] && preparsed_2[:genus]
43
- result = match_multinomial(preparsed_1, preparsed_2)
44
- end
45
- if result && result['match']
46
- result['match'] = match_authors(preparsed_1, preparsed_2) == -1 ?
47
- false : true
48
- end
49
- return result
50
- end
51
-
52
- def match_uninomial(preparsed_1, preparsed_2)
53
- match_genera(preparsed_1[:uninomial], preparsed_2[:uninomial])
54
- end
55
-
56
- def match_multinomial(preparsed_1, preparsed_2)
57
- gen_match = match_genera(preparsed_1[:genus], preparsed_2[:genus])
58
- sp_match = match_species(preparsed_1[:species], preparsed_2[:species])
59
- total_length = preparsed_1[:genus][:string].size +
60
- preparsed_2[:genus][:string].size +
61
- preparsed_1[:species][:string].size +
62
- preparsed_2[:species][:string].size
63
- if preparsed_1[:infraspecies] && preparsed_2[:infraspecies]
64
- infrasp_match = match_species(preparsed_1[:infraspecies][0],
65
- preparsed_2[:infraspecies][0])
66
- total_length += preparsed_1[:infraspecies][0][:string].size +
67
- preparsed_2[:infraspecies][0][:string].size
68
- match_hash = match_matches(gen_match, sp_match, infrasp_match)
69
- elsif (preparsed_1[:infraspecies] && !preparsed_2[:infraspecies]) ||
70
- (!preparsed_1[:infraspecies] && preparsed_2[:infraspecies])
71
- match_hash = { 'match' => false,
72
- 'edit_distance' => 5,
73
- 'phonetic_match' => false }
74
- total_length += preparsed_1[:infraspecies] ?
75
- preparsed_1[:infraspecies][0][:string].size :
76
- preparsed_2[:infraspecies][0][:string].size
77
- else
78
- match_hash = match_matches(gen_match, sp_match)
79
- end
80
- match_hash.merge({ 'score' =>
81
- (1 - match_hash['edit_distance']/(total_length/2)) })
82
- match_hash
83
- end
84
-
85
- def match_genera(genus1, genus2, opts = {})
86
- genus1_length = genus1[:normalized].size
87
- genus2_length = genus2[:normalized].size
88
- opts = { with_phonetic_match: true }.merge(opts)
89
- min_length = [genus1_length, genus2_length].min
90
- unless opts[:with_phonetic_match]
91
- genus1[:phonetized] = 'A'
92
- genus2[:phonetized] = 'B'
93
- end
94
- match = false
95
- ed = @dlm.distance(genus1[:normalized],
96
- genus2[:normalized], 1, 3) #TODO put block = 2
97
- return { 'edit_distance' => ed,
98
- 'phonetic_match' => false,
99
- 'match' => false } if ed/min_length.to_f > 0.2
100
- return { 'edit_distance' => ed,
101
- 'phonetic_match' => true,
102
- 'match' => true } if genus1[:phonetized] == genus2[:phonetized]
103
-
104
- match = true if ed <= 3 && (min_length > ed * 2) &&
105
- (ed < 2 || genus1[0] == genus2[0])
106
- { 'edit_distance' => ed, 'match' => match, 'phonetic_match' => false }
107
- end
108
-
109
- def match_species(sp1, sp2, opts = {})
110
- sp1_length = sp1[:normalized].size
111
- sp2_length = sp2[:normalized].size
112
- opts = { with_phonetic_match: true }.merge(opts)
113
- min_length = [sp1_length, sp2_length].min
114
- unless opts[:with_phonetic_match]
115
- sp1[:phonetized] = 'A'
116
- sp2[:phonetized] = 'B'
117
- end
118
- sp1[:phonetized] = Taxamatch::Phonetizer.normalize_ending sp1[:phonetized]
119
- sp2[:phonetized] = Taxamatch::Phonetizer.normalize_ending sp2[:phonetized]
120
- match = false
121
- ed = @dlm.distance(sp1[:normalized],
122
- sp2[:normalized], 1, 4) #TODO put block 4
123
- return { 'edit_distance' => ed,
124
- 'phonetic_match' => false,
125
- 'match' => false } if ed/min_length.to_f > 0.3334
126
- return {'edit_distance' => ed,
127
- 'phonetic_match' => true,
128
- 'match' => true} if sp1[:phonetized] == sp2[:phonetized]
129
-
130
- match = true if ed <= 4 &&
131
- (min_length >= ed * 2) &&
132
- (ed < 2 || sp1[:normalized][0] == sp2[:normalized][0]) &&
133
- (ed < 4 || sp1[:normalized][0...3] == sp2[:normalized][0...3])
134
- { 'edit_distance' => ed, 'match' => match, 'phonetic_match' => false }
135
- end
136
-
137
- def match_authors(preparsed_1, preparsed_2)
138
- p1 = { normalized_authors: [], years: [] }
139
- p2 = { normalized_authors: [], years: [] }
140
- if preparsed_1[:infraspecies] || preparsed_2[:infraspecies]
141
- p1 = preparsed_1[:infraspecies].last if preparsed_1[:infraspecies]
142
- p2 = preparsed_2[:infraspecies].last if preparsed_2[:infraspecies]
143
- elsif preparsed_1[:species] || preparsed_2[:species]
144
- p1 = preparsed_1[:species] if preparsed_1[:species]
145
- p2 = preparsed_2[:species] if preparsed_2[:species]
146
- elsif preparsed_1[:uninomial] && preparsed_2[:uninomial]
147
- p1 = preparsed_1[:uninomial]
148
- p2 = preparsed_2[:uninomial]
149
- end
150
- au1 = p1[:normalized_authors]
151
- au2 = p2[:normalized_authors]
152
- yr1 = p1[:years]
153
- yr2 = p2[:years]
154
- return 0 if au1.empty? || au2.empty?
155
- score = Taxamatch::Authmatch.authmatch(au1, au2, yr1, yr2)
156
- score == 0 ? -1 : 1
157
- end
158
-
159
- def match_matches(genus_match, species_match, infraspecies_match = nil)
160
- match = species_match
161
- if infraspecies_match
162
- match['edit_distance'] += infraspecies_match['edit_distance']
163
- match['match'] &&= infraspecies_match['match']
164
- match['phonetic_match'] &&= infraspecies_match['phonetic_match']
165
- end
166
- match['edit_distance'] += genus_match['edit_distance']
167
- if match['edit_distance'] > (infraspecies_match ? 6 : 4)
168
- match['match'] = false
169
- end
170
- match['match'] &&= genus_match['match']
171
- match['phonetic_match'] &&= genus_match['phonetic_match']
172
- match
173
- end
174
-
175
- end
176
16
  end
data/taxamatch_rb.gemspec CHANGED
@@ -1,62 +1,35 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'taxamatch_rb/version'
5
5
 
6
- Gem::Specification.new do |s|
7
- s.name = "taxamatch_rb"
8
- s.version = "1.0.1"
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "taxamatch_rb"
8
+ gem.version = Taxamatch::VERSION
9
+ gem.authors = ["Dmitry Mozzherin"]
10
+ gem.email = ["dmozzherin@gmail.com"]
9
11
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Dmitry Mozzherin"]
12
- s.date = "2013-06-17"
13
- s.description = "This gem implements algorithm for fuzzy matching scientific names developed by Tony Rees"
14
- s.email = "dmozzherin@gmail.com"
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.md"
18
- ]
19
- s.files = [
20
- "CHANGELOG",
21
- "Gemfile",
22
- "Gemfile.lock",
23
- "LICENSE",
24
- "Makefile",
25
- "README.md",
26
- "Rakefile",
27
- "VERSION",
28
- "lib/taxamatch_rb.rb",
29
- "lib/taxamatch_rb/atomizer.rb",
30
- "lib/taxamatch_rb/authmatch.rb",
31
- "lib/taxamatch_rb/normalizer.rb",
32
- "lib/taxamatch_rb/phonetizer.rb",
33
- "spec/spec.opts",
34
- "spec/spec_helper.rb",
35
- "spec/taxamatch_rb_spec.rb",
36
- "spec/taxamatch_test.txt",
37
- "taxamatch_rb.gemspec"
38
- ]
39
- s.homepage = "http://github.com/GlobalNamesArchitecture/taxamatch_rb"
40
- s.require_paths = ["lib"]
41
- s.rubygems_version = "1.8.25"
42
- s.summary = "Implementation of Tony Rees Taxamatch algorithms"
12
+ gem.summary = %q{Fuzzy matching of scientific names}
13
+ gem.description = "The purpose of Taxamatch gem is to facilitate fuzzy" \
14
+ "comparison of two scientific name renderings to find" \
15
+ "out if they actually point to the same scientific name."
16
+ gem.homepage = "https://github.com/GlobalNamesArchitecture/taxamatch_rb"
17
+ gem.license = "MIT"
43
18
 
44
- if s.respond_to? :specification_version then
45
- s.specification_version = 3
19
+ gem.files = `git ls-files -z`.split("\x0").
20
+ reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ gem.bindir = "exe"
22
+ gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ gem.require_paths = ["lib"]
46
24
 
47
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
- s.add_runtime_dependency(%q<biodiversity>, ["~> 3.1.0"])
49
- s.add_runtime_dependency(%q<damerau-levenshtein>, ["~> 0.5.4"])
50
- s.add_runtime_dependency(%q<json>, ["~> 1.7.7"])
51
- else
52
- s.add_dependency(%q<biodiversity>, ["~> 3.1.0"])
53
- s.add_dependency(%q<damerau-levenshtein>, ["~> 0.5.4"])
54
- s.add_dependency(%q<json>, ["~> 1.7.7"])
55
- end
56
- else
57
- s.add_dependency(%q<biodiversity>, ["~> 3.1.0"])
58
- s.add_dependency(%q<damerau-levenshtein>, ["~> 0.5.4"])
59
- s.add_dependency(%q<json>, ["~> 1.7.7"])
60
- end
61
- end
25
+ gem.add_runtime_dependency "biodiversity", "~> 3.1"
26
+ gem.add_runtime_dependency "damerau-levenshtein", "~> 1.0"
27
+ gem.add_runtime_dependency "json", "~> 1.8"
62
28
 
29
+ gem.add_development_dependency "bundler", "~> 1.6"
30
+ gem.add_development_dependency "rake", "~> 10.4"
31
+ gem.add_development_dependency "rspec", "~> 3.2"
32
+ gem.add_development_dependency "cucumber", "~> 2.0"
33
+ gem.add_development_dependency "coveralls", "~> 0.8"
34
+ gem.add_development_dependency "rubocop", "~> 0.30"
35
+ end
metadata CHANGED
@@ -1,116 +1,192 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taxamatch_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dmitry Mozzherin
9
8
  autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2013-06-17 00:00:00.000000000 Z
11
+ date: 2015-04-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: biodiversity
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 3.1.0
19
+ version: '3.1'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 3.1.0
26
+ version: '3.1'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: damerau-levenshtein
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: 0.5.4
33
+ version: '1.0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: 0.5.4
40
+ version: '1.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: json
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 1.7.7
47
+ version: '1.8'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 1.7.7
62
- description: This gem implements algorithm for fuzzy matching scientific names developed
63
- by Tony Rees
64
- email: dmozzherin@gmail.com
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.4'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: cucumber
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.8'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.30'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.30'
139
+ description: The purpose of Taxamatch gem is to facilitate fuzzycomparison of two
140
+ scientific name renderings to findout if they actually point to the same scientific
141
+ name.
142
+ email:
143
+ - dmozzherin@gmail.com
65
144
  executables: []
66
145
  extensions: []
67
- extra_rdoc_files:
68
- - LICENSE
69
- - README.md
146
+ extra_rdoc_files: []
70
147
  files:
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".rubocop.yml"
151
+ - ".travis.yml"
71
152
  - CHANGELOG
153
+ - CODE_OF_CONDUCT.md
72
154
  - Gemfile
73
- - Gemfile.lock
74
- - LICENSE
75
- - Makefile
155
+ - LICENSE.txt
76
156
  - README.md
77
157
  - Rakefile
78
- - VERSION
158
+ - bin/console
159
+ - bin/setup
79
160
  - lib/taxamatch_rb.rb
80
161
  - lib/taxamatch_rb/atomizer.rb
81
162
  - lib/taxamatch_rb/authmatch.rb
163
+ - lib/taxamatch_rb/base.rb
82
164
  - lib/taxamatch_rb/normalizer.rb
83
165
  - lib/taxamatch_rb/phonetizer.rb
84
- - spec/spec.opts
85
- - spec/spec_helper.rb
86
- - spec/taxamatch_rb_spec.rb
87
- - spec/taxamatch_test.txt
166
+ - lib/taxamatch_rb/version.rb
88
167
  - taxamatch_rb.gemspec
89
- homepage: http://github.com/GlobalNamesArchitecture/taxamatch_rb
90
- licenses: []
168
+ homepage: https://github.com/GlobalNamesArchitecture/taxamatch_rb
169
+ licenses:
170
+ - MIT
171
+ metadata: {}
91
172
  post_install_message:
92
173
  rdoc_options: []
93
174
  require_paths:
94
175
  - lib
95
176
  required_ruby_version: !ruby/object:Gem::Requirement
96
- none: false
97
177
  requirements:
98
- - - ! '>='
178
+ - - ">="
99
179
  - !ruby/object:Gem::Version
100
180
  version: '0'
101
- segments:
102
- - 0
103
- hash: 1177825761849915556
104
181
  required_rubygems_version: !ruby/object:Gem::Requirement
105
- none: false
106
182
  requirements:
107
- - - ! '>='
183
+ - - ">="
108
184
  - !ruby/object:Gem::Version
109
185
  version: '0'
110
186
  requirements: []
111
187
  rubyforge_project:
112
- rubygems_version: 1.8.25
188
+ rubygems_version: 2.4.5
113
189
  signing_key:
114
- specification_version: 3
115
- summary: Implementation of Tony Rees Taxamatch algorithms
190
+ specification_version: 4
191
+ summary: Fuzzy matching of scientific names
116
192
  test_files: []
data/Gemfile.lock DELETED
@@ -1,86 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activesupport (3.2.13)
5
- i18n (= 0.6.1)
6
- multi_json (~> 1.0)
7
- biodiversity (3.1.0)
8
- parallel
9
- parallel (~> 0.6)
10
- rake (~> 10.0)
11
- treetop
12
- treetop (~> 1.4)
13
- unicode_utils (~> 1.4)
14
- builder (3.2.0)
15
- columnize (0.3.6)
16
- cucumber (1.3.1)
17
- builder (>= 2.1.2)
18
- diff-lcs (>= 1.1.3)
19
- gherkin (~> 2.12.0)
20
- multi_json (~> 1.3)
21
- damerau-levenshtein (0.5.4)
22
- debugger (1.5.0)
23
- columnize (>= 0.3.1)
24
- debugger-linecache (~> 1.2.0)
25
- debugger-ruby_core_source (~> 1.2.0)
26
- debugger-linecache (1.2.0)
27
- debugger-ruby_core_source (1.2.0)
28
- diff-lcs (1.2.4)
29
- gherkin (2.12.0)
30
- multi_json (~> 1.3)
31
- git (1.2.5)
32
- i18n (0.6.1)
33
- jeweler (1.8.4)
34
- bundler (~> 1.0)
35
- git (>= 1.2.5)
36
- rake
37
- rdoc
38
- json (1.7.7)
39
- metaclass (0.0.1)
40
- mocha (0.13.3)
41
- metaclass (~> 0.0.1)
42
- multi_json (1.7.3)
43
- parallel (0.7.0)
44
- polyglot (0.3.3)
45
- rake (10.0.4)
46
- rake-compiler (0.8.3)
47
- rake
48
- rdoc (4.0.1)
49
- json (~> 1.4)
50
- rspec (2.13.0)
51
- rspec-core (~> 2.13.0)
52
- rspec-expectations (~> 2.13.0)
53
- rspec-mocks (~> 2.13.0)
54
- rspec-core (2.13.1)
55
- rspec-expectations (2.13.0)
56
- diff-lcs (>= 1.1.3, < 2.0)
57
- rspec-mocks (2.13.1)
58
- ruby-prof (0.13.0)
59
- shoulda (3.5.0)
60
- shoulda-context (~> 1.0, >= 1.0.1)
61
- shoulda-matchers (>= 1.4.1, < 3.0)
62
- shoulda-context (1.1.1)
63
- shoulda-matchers (2.1.0)
64
- activesupport (>= 3.0.0)
65
- treetop (1.4.14)
66
- polyglot
67
- polyglot (>= 0.3.1)
68
- unicode_utils (1.4.0)
69
-
70
- PLATFORMS
71
- ruby
72
-
73
- DEPENDENCIES
74
- biodiversity (~> 3.1.0)
75
- bundler (~> 1.3)
76
- cucumber (~> 1.3)
77
- damerau-levenshtein (~> 0.5.4)
78
- debugger (~> 1.5)
79
- jeweler (~> 1.8)
80
- json (~> 1.7.7)
81
- mocha (~> 0.13)
82
- rake (~> 10.0)
83
- rake-compiler (~> 0.8)
84
- rspec (~> 2.13)
85
- ruby-prof (~> 0.13)
86
- shoulda (~> 3.5)
data/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2009-2013 Marine Biological Laboratory
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.