taxonifi 0.2.0 → 0.3.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +59 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +5 -17
  5. data/Gemfile.lock +22 -40
  6. data/README.md +192 -0
  7. data/Rakefile +35 -26
  8. data/lib/export/format/base.rb +1 -1
  9. data/lib/export/format/species_file.rb +154 -152
  10. data/lib/lumper/clump.rb +1 -1
  11. data/lib/lumper/lumper.rb +22 -18
  12. data/lib/lumper/lumps/parent_child_name_collection.rb +1 -2
  13. data/lib/lumper/name_index.rb +21 -0
  14. data/lib/{models → model}/author_year.rb +2 -2
  15. data/lib/{models → model}/base.rb +35 -5
  16. data/lib/{models → model}/collection.rb +8 -1
  17. data/lib/{models → model}/name.rb +128 -36
  18. data/lib/{models → model}/name_collection.rb +134 -33
  19. data/lib/{models → model}/person.rb +1 -1
  20. data/lib/{models → model}/ref.rb +4 -2
  21. data/lib/model/ref_collection.rb +171 -0
  22. data/lib/{models → model}/species_name.rb +24 -3
  23. data/lib/splitter/builder.rb +1 -1
  24. data/lib/splitter/parser.rb +5 -0
  25. data/lib/splitter/tokens.rb +54 -9
  26. data/lib/taxonifi/version.rb +3 -0
  27. data/lib/taxonifi.rb +5 -9
  28. data/taxonifi.gemspec +29 -99
  29. data/test/helper.rb +1 -1
  30. data/test/test_exporter.rb +1 -1
  31. data/test/test_lumper_names.rb +9 -9
  32. data/test/test_lumper_refs.rb +4 -4
  33. data/test/test_parser.rb +97 -26
  34. data/test/test_splitter_tokens.rb +25 -4
  35. data/test/test_taxonifi_base.rb +1 -1
  36. data/test/test_taxonifi_geog.rb +1 -1
  37. data/test/test_taxonifi_name.rb +13 -14
  38. data/test/test_taxonifi_name_collection.rb +11 -5
  39. data/test/test_taxonifi_ref.rb +1 -1
  40. data/test/test_taxonifi_ref_collection.rb +40 -3
  41. data/test/test_taxonifi_species_name.rb +51 -1
  42. data/travis/before_install.sh +2 -0
  43. metadata +96 -66
  44. data/README.rdoc +0 -154
  45. data/VERSION +0 -1
  46. data/lib/models/ref_collection.rb +0 -107
  47. /data/lib/{models → model}/generic_object.rb +0 -0
  48. /data/lib/{models → model}/geog.rb +0 -0
  49. /data/lib/{models → model}/geog_collection.rb +0 -0
  50. /data/lib/{models → model}/shared_class_methods.rb +0 -0
data/test/test_parser.rb CHANGED
@@ -2,35 +2,106 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), '../lib/splitter/parser'))
3
3
 
4
4
  class Test_TaxonifiSplitterParser < Test::Unit::TestCase
5
-
6
5
  # TODO: this could also go to builder related tests
6
+
7
7
  def test_that_parse_species_name_parses
8
- lexer = Taxonifi::Splitter::Lexer.new("Foo (Bar) stuff things (Smith, 1912)", :species_name)
9
- builder = Taxonifi::Model::SpeciesName.new
10
- Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
11
- assert_equal "Foo", builder.genus.name
12
- assert_equal "Bar", builder.subgenus.name
13
- assert_equal builder.genus, builder.subgenus.parent
14
- assert_equal "stuff", builder.species.name
15
- assert_equal builder.subgenus, builder.species.parent
16
- assert_equal "things", builder.subspecies.name
17
- assert_equal builder.species, builder.subspecies.parent
18
- assert_equal "Smith", builder.names.last.author
19
- assert_equal 1912, builder.names.last.year
20
- assert_equal true, builder.names.last.parens
21
- assert_equal "Foo (Bar) stuff things (Smith, 1912)", builder.display_name
22
-
23
- lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things Smith, 1912", :species_name)
24
- builder = Taxonifi::Model::SpeciesName.new
25
- Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
26
- assert_equal "Foo", builder.genus.name
27
- assert_equal "stuff", builder.species.name
28
- assert_equal "things", builder.subspecies.name
29
- assert_equal "Smith", builder.names.last.author
30
- assert_equal 1912 , builder.names.last.year
31
- assert_equal false, builder.names.last.parens
32
- assert_equal "Foo stuff things Smith, 1912", builder.display_name
8
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff Smith, 1912", :species_name)
9
+ builder = Taxonifi::Model::SpeciesName.new
10
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
11
+ assert_equal "Foo", builder.genus.name
12
+ assert_equal "stuff", builder.species.name
13
+ assert_equal "Smith", builder.names.last.author
14
+ assert_equal 1912 , builder.names.last.year
15
+ assert_equal false, builder.names.last.parens
16
+ assert_equal "Foo stuff Smith, 1912", builder.display_name
17
+ end
18
+
19
+ def test_that_parse_species_name_parses_subspecies
20
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things Smith, 1912", :species_name)
21
+ builder = Taxonifi::Model::SpeciesName.new
22
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
23
+ assert_equal "Foo", builder.genus.name
24
+ assert_equal "stuff", builder.species.name
25
+ assert_equal "things", builder.subspecies.name
26
+ assert_equal "Smith", builder.names.last.author
27
+ assert_equal 1912 , builder.names.last.year
28
+ assert_equal false, builder.names.last.parens
29
+ assert_equal "Foo stuff things Smith, 1912", builder.display_name
30
+ end
31
+
32
+ def test_that_parse_species_name_parses_subgenera
33
+ lexer = Taxonifi::Splitter::Lexer.new("Foo (Bar) stuff things (Smith, 1912)", :species_name)
34
+ builder = Taxonifi::Model::SpeciesName.new
35
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
36
+ assert_equal "Foo", builder.genus.name
37
+ assert_equal "Bar", builder.subgenus.name
38
+ assert_equal builder.genus, builder.subgenus.parent
39
+ assert_equal "stuff", builder.species.name
40
+ assert_equal builder.subgenus, builder.species.parent
41
+ assert_equal "things", builder.subspecies.name
42
+ assert_equal builder.species, builder.subspecies.parent
43
+ assert_equal "Smith", builder.names.last.author
44
+ assert_equal 1912, builder.names.last.year
45
+ assert_equal true, builder.names.last.parens
46
+ assert_equal "Foo (Bar) stuff things (Smith, 1912)", builder.display_name
47
+ end
48
+
49
+ def test_that_parse_species_name_parses_variety_following_subspecies
50
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff things var. blorf Smith, 1912", :species_name)
51
+ builder = Taxonifi::Model::SpeciesName.new
52
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
53
+ assert_equal "Foo", builder.genus.name
54
+ assert_equal "stuff", builder.species.name
55
+ assert_equal "things", builder.subspecies.name
56
+ assert_equal "blorf", builder.variety.name
57
+ assert_equal "Smith", builder.names.last.author
58
+ assert_equal 1912 , builder.names.last.year
59
+ assert_equal false, builder.names.last.parens
60
+ assert_equal "Foo stuff things var. blorf Smith, 1912", builder.display_name
61
+ end
62
+
63
+
64
+ def test_that_parse_species_name_parses_variety_following_species
65
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff v. blorf Smith, 1912", :species_name)
66
+ builder = Taxonifi::Model::SpeciesName.new
67
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
68
+ assert_equal "Foo", builder.genus.name
69
+ assert_equal "stuff", builder.species.name
70
+ assert_equal nil, builder.subspecies
71
+ assert_equal "blorf", builder.variety.name
72
+ assert_equal "Smith", builder.names.last.author
73
+ assert_equal 1912 , builder.names.last.year
74
+ assert_equal false, builder.names.last.parens
75
+ assert_equal "Foo stuff var. blorf Smith, 1912", builder.display_name
33
76
  end
34
77
 
78
+
79
+ def test_that_parse_species_name_parses_variety_following_species_without_author_year
80
+ lexer = Taxonifi::Splitter::Lexer.new("Foo stuff v. blorf", :species_name)
81
+ builder = Taxonifi::Model::SpeciesName.new
82
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
83
+ assert_equal "Foo", builder.genus.name
84
+ assert_equal "stuff", builder.species.name
85
+ assert_equal nil, builder.subspecies
86
+ assert_equal "blorf", builder.variety.name
87
+ assert_equal nil, builder.names.last.parens # not set
88
+ assert_equal "Foo stuff var. blorf", builder.display_name
89
+ end
90
+
91
+
92
+ def test_that_parse_species_name_parses_variety_following_species_without_author_year_II
93
+ lexer = Taxonifi::Splitter::Lexer.new("Calyptonotus rolandri var. opacus", :species_name)
94
+ builder = Taxonifi::Model::SpeciesName.new
95
+ Taxonifi::Splitter::Parser.new(lexer, builder).parse_species_name
96
+ assert_equal "Calyptonotus", builder.genus.name
97
+ assert_equal "rolandri", builder.species.name
98
+ assert_equal nil, builder.subspecies
99
+ assert_equal "opacus", builder.variety.name
100
+ assert_equal nil, builder.names.last.parens # not set
101
+ assert_equal "Calyptonotus rolandri var. opacus", builder.display_name
102
+ end
103
+
104
+
105
+
35
106
  end
36
107
 
@@ -14,6 +14,21 @@ end
14
14
 
15
15
  class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
16
16
 
17
+ def test_variety
18
+ lexer = Taxonifi::Splitter::Lexer.new("var. blorf")
19
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
20
+
21
+ lexer = Taxonifi::Splitter::Lexer.new(" var. blorf")
22
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
23
+
24
+ lexer = Taxonifi::Splitter::Lexer.new("v. blorf")
25
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
26
+
27
+ lexer = Taxonifi::Splitter::Lexer.new(" v. blorf ")
28
+ assert lexer.pop(Taxonifi::Splitter::Tokens::Variety)
29
+ end
30
+
31
+
17
32
  def test_year
18
33
  lexer = Taxonifi::Splitter::Lexer.new("1235")
19
34
  assert lexer.pop(Taxonifi::Splitter::Tokens::Year)
@@ -53,7 +68,7 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
53
68
  assert lexer.pop(Taxonifi::Splitter::Tokens::RightParen)
54
69
  end
55
70
 
56
- def test_right_paren
71
+ def test_comma
57
72
  lexer = Taxonifi::Splitter::Lexer.new(",")
58
73
  assert lexer.pop(Taxonifi::Splitter::Tokens::Comma)
59
74
  end
@@ -167,9 +182,15 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
167
182
  "Costa Lima, A. M. da, C. A. Campos Seabra, and C. R. Hathaway", # 36
168
183
  "Falcon, L. A., R. van den Bosch, C. A. Ferris, L. K. Stromberg, L. K. Etzel, R. E. Stinner, and T. F. Leigh", # 37
169
184
  "Kinzer, R. E., J. W. Davis, Jr., J. R. Coppedge, and S. L. Jones", # 38
170
- "Doesburg, P. H. van, Jr. " # 39
185
+ "Doesburg, P. H. van, Jr. ", # 39
186
+ "Arias J. R., Young D. G." # 40
171
187
  ]
172
188
 
189
+ lexer = Taxonifi::Splitter::Lexer.new(auths[40])
190
+ assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
191
+ assert_equal ['Arias', 'Young'], t.names.collect{|n| n[:last_name] }
192
+ assert_equal [%w{J R}, %w{D G}] , t.names[0..1].collect{|n| n[:initials] }
193
+
173
194
  lexer = Taxonifi::Splitter::Lexer.new(auths[39])
174
195
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
175
196
  assert_equal ['Doesburg'], t.names.collect{|n| n[:last_name] }
@@ -298,13 +319,13 @@ class Test_TaxonifiSplitterTokens < Test::Unit::TestCase
298
319
  assert_equal 1, t.names.size
299
320
  assert_equal "Smith", t.names[0][:last_name]
300
321
 
301
- lexer = Taxonifi::Splitter::Lexer.new(auths[12])
322
+ lexer = Taxonifi::Splitter::Lexer.new(auths[13])
302
323
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
303
324
  assert_equal 2, t.names.size
304
325
  assert_equal "Smith", t.names[0][:last_name]
305
326
  assert_equal "Barnes", t.names[1][:last_name]
306
327
 
307
- lexer = Taxonifi::Splitter::Lexer.new(auths[13])
328
+ lexer = Taxonifi::Splitter::Lexer.new(auths[12])
308
329
  assert t = lexer.pop(Taxonifi::Splitter::Tokens::Authors)
309
330
  assert_equal 2, t.names.size
310
331
  assert_equal "Smith", t.names[0][:last_name]
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/base'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/base'))
3
3
 
4
4
  class TestTaxonifiBase < Test::Unit::TestCase
5
5
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/name'))
3
3
 
4
4
  class TestTaxonifiGeog < Test::Unit::TestCase
5
5
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/name'))
3
3
 
4
4
  class TestTaxonifiName < Test::Unit::TestCase
5
5
 
@@ -30,12 +30,12 @@ class TestTaxonifiName < Test::Unit::TestCase
30
30
  n = Taxonifi::Model::Name.new()
31
31
  assert n.respond_to?(:rank)
32
32
  end
33
-
33
+
34
34
  def test_that_name_has_an_author
35
35
  n = Taxonifi::Model::Name.new()
36
36
  assert n.respond_to?(:author)
37
37
  end
38
-
38
+
39
39
  def test_that_name_has_a_year
40
40
  n = Taxonifi::Model::Name.new()
41
41
  assert n.respond_to?(:year)
@@ -74,13 +74,12 @@ class TestTaxonifiName < Test::Unit::TestCase
74
74
  end
75
75
  end
76
76
 
77
- def test_that_rank_can_be_set
77
+ def test_that_rank_can_be_set
78
78
  n = Taxonifi::Model::Name.new()
79
79
  n.rank = "family"
80
80
  assert_equal "family", n.rank
81
81
  end
82
82
 
83
-
84
83
  def test_that_parent_is_higher_rank_than_child
85
84
  n = Taxonifi::Model::Name.new()
86
85
  n.rank = "genus"
@@ -111,11 +110,11 @@ class TestTaxonifiName < Test::Unit::TestCase
111
110
  end
112
111
 
113
112
  def create_a_few_names
114
- @n0 = Taxonifi::Model::Name.new(:name => "Baridae", :rank => "Family", :id => 2)
115
- @n1 = Taxonifi::Model::Name.new(:name => "Barinae", :rank => "Subfamily", :id => 15, :parent => @n0)
116
- @n2 = Taxonifi::Model::Name.new(:name => "Foo", :rank => "Genus", :author => "Frank", :year => 2020, :id => 14, :parent => @n1 )
117
- @n3 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "Subgenus", :author => "Frank", :year => 2020, :id => 19, :parent => @n2 )
118
- @n4 = Taxonifi::Model::Name.new(:name => "boo", :rank => "Species", :author => "Frank", :year => 2020, :id => 11, :parent => @n3 )
113
+ @n0 = Taxonifi::Model::Name.new(:name => "Baridae", :rank => "Family", :id => 2)
114
+ @n1 = Taxonifi::Model::Name.new(:name => "Barinae", :rank => "Subfamily", :id => 15, :parent => @n0)
115
+ @n2 = Taxonifi::Model::Name.new(:name => "Foo", :rank => "Genus", :author => "Frank", :year => 2020, :id => 14, :parent => @n1 )
116
+ @n3 = Taxonifi::Model::Name.new(:name => "Bar", :rank => "Subgenus", :author => "Frank", :year => 2020, :id => 19, :parent => @n2 )
117
+ @n4 = Taxonifi::Model::Name.new(:name => "boo", :rank => "Species", :author => "Frank", :year => 2020, :id => 11, :parent => @n3 )
119
118
  end
120
119
 
121
120
  def dont_test_prologify
@@ -140,7 +139,7 @@ class TestTaxonifiName < Test::Unit::TestCase
140
139
  def test_nomenclator_name
141
140
  create_a_few_names
142
141
  n5 = Taxonifi::Model::Name.new(:name => "beep", :rank => "Subspecies", :author => "Frank", :year => 2020, :id => 11, :parent => @n4 )
143
-
142
+
144
143
  assert_equal 'Foo', @n2.nomenclator_name
145
144
  assert_equal 'Foo (Bar)', @n3.nomenclator_name
146
145
  assert_equal 'Foo (Bar) boo', @n4.nomenclator_name
@@ -165,14 +164,14 @@ class TestTaxonifiName < Test::Unit::TestCase
165
164
  assert_equal '2-15-14g', @n2.parent_ids_sf_style
166
165
  assert_equal '2-15', @n1.parent_ids_sf_style
167
166
  end
168
-
167
+
169
168
  def test_author_year_index
170
169
  n = Taxonifi::Model::Name.new(author_year: 'Smith and Jones, 1920')
171
170
  assert_equal '1920-||smith|-||jones|', n.author_year_index
172
171
  end
173
172
 
174
173
  def test_genus_group_parent
175
- n1 = Taxonifi::Model::Name.new(name: "Fooidae", rank: "family", author: nil , year: nil) #
174
+ n1 = Taxonifi::Model::Name.new(name: "Fooidae", rank: "family", author: nil, year: nil) #
176
175
  n2 = Taxonifi::Model::Name.new(name: "Foo", rank: "genus", author: nil , year: nil, :parent => n1) # Foo
177
176
  n3 = Taxonifi::Model::Name.new(name: "Bar", rank: "subgenus", author: nil , year: nil, :parent => n2) # Foo (Bar)
178
177
  n4 = Taxonifi::Model::Name.new(name: "aus", rank: "species", author: nil , year: nil, :parent => n3) # Foo (Bar) aus
@@ -185,7 +184,7 @@ class TestTaxonifiName < Test::Unit::TestCase
185
184
  #
186
185
  # ICZN Subclass
187
186
  #
188
-
187
+
189
188
  def test_that_iczn_family_ends_in_idae
190
189
  n = Taxonifi::Model::IcznName.new
191
190
  assert_raise Taxonifi::NameError do
@@ -161,6 +161,12 @@ class TestTaxonifiNameCollection < Test::Unit::TestCase
161
161
  assert_equal n11.id, c.name_exists?(n12)
162
162
  end
163
163
 
164
+ def test_that_name_collection_can_assign_ref_collections
165
+ r = Taxonifi::Model::RefCollection.new
166
+ c = Taxonifi::Model::NameCollection.new(:ref_collection => r)
167
+ assert c.ref_collection == r
168
+ end
169
+
164
170
  def test_that_name_collection_generate_ref_collection
165
171
  c = Taxonifi::Model::NameCollection.new
166
172
  c.generate_ref_collection
@@ -182,14 +188,14 @@ class TestTaxonifiNameCollection < Test::Unit::TestCase
182
188
 
183
189
  c.generate_ref_collection
184
190
  assert_equal 3, c.ref_collection.collection.size
185
- # References are sorted
186
- assert_equal ['Jones'], c.ref_collection.collection.first.authors.collect{|r| r.last_name}
187
- assert_equal ['Smith', 'Jones'], c.ref_collection.collection[1].authors.collect{|r| r.last_name}
188
- assert_equal ['Smith', 'Jones', 'Simon'], c.ref_collection.collection.last.authors.collect{|r| r.last_name}
189
- assert_equal 2011, c.ref_collection.collection.first.year
191
+ assert_equal ['Smith', 'Jones'], c.ref_collection.collection.first.authors.collect{|r| r.last_name}
192
+ assert_equal ['Smith', 'Jones', 'Simon'], c.ref_collection.collection[1].authors.collect{|r| r.last_name}
193
+ assert_equal ['Jones'], c.ref_collection.collection.last.authors.collect{|r| r.last_name}
194
+ assert_equal 2011, c.ref_collection.collection.last.year
190
195
  foo = 1
191
196
  end
192
197
 
193
198
 
199
+
194
200
  end
195
201
 
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/ref'))
3
3
 
4
4
  class TestTaxonifiRef < Test::Unit::TestCase
5
5
 
@@ -1,7 +1,7 @@
1
1
  require 'helper'
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/ref_collection'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/ref_collection'))
3
3
 
4
- class TestTaxonifiCollection < Test::Unit::TestCase
4
+ class TestTaxonifiRefCollection < Test::Unit::TestCase
5
5
 
6
6
  def test_that_add_objects_adds_refs
7
7
  c = Taxonifi::Model::RefCollection.new
@@ -51,18 +51,55 @@ class TestTaxonifiCollection < Test::Unit::TestCase
51
51
  def test_uniquify_authors
52
52
  c = Taxonifi::Model::RefCollection.new
53
53
  ['Smith, A.R. 1920', 'Jones, A.R. and Smith, A.R. 1940', 'Jones, B. 1999', 'Jones, A. R. 1922', 'Jones, A. R., Smith, A.R. and Frank, A. 1943'].each do |a|
54
+ # smith ar
55
+ # jones ar
56
+ # jones b
57
+ # frank a
54
58
  n = Taxonifi::Model::Ref.new(:author_year => a)
55
59
  c.add_object(n)
56
60
  end
57
- assert_equal 4, c.unique_authors.size
61
+
62
+ assert_equal 8, c.all_authors.size
58
63
  assert_not_equal c.collection.first.authors.first, c.collection[1].authors.last
64
+
59
65
  c.uniquify_authors(5)
66
+ assert_equal 4, c.all_authors.size
60
67
  assert_equal c.collection.first.authors.first, c.collection[1].authors.last
61
68
  assert_equal c.collection.first.authors.first, c.collection[4].authors[1]
62
69
  assert_equal c.collection[1].authors.first, c.collection[3].authors.first
63
70
  assert_equal 5, c.collection.first.authors.first.id
64
71
  end
65
72
 
73
+ def test_uniquify_tricky_authors
74
+ c = Taxonifi::Model::RefCollection.new
75
+ ['Quate and Quate, 1920',].each do |a|
76
+ n = Taxonifi::Model::Ref.new(:author_year => a)
77
+ c.add_object(n)
78
+ end
79
+
80
+ assert_equal 2, c.unique_authors.size
81
+ c.uniquify_authors(0)
82
+ assert_equal 2, c.unique_authors.size
83
+ assert_not_equal c.collection.first.authors.first, c.collection.first.authors.last
84
+ end
85
+
86
+ def test_uniquify_trickier_authors
87
+ c = Taxonifi::Model::RefCollection.new
88
+ ['Quate and Quate, 1920', 'Quate, Smith and Quate, 1921', 'Smith, 1930', 'Quate, Quate, and Smith, 2000'].each do |a|
89
+ # Quate1
90
+ # Quate2
91
+ # Smith1
92
+ n = Taxonifi::Model::Ref.new(:author_year => a)
93
+ c.add_object(n)
94
+ end
95
+
96
+ assert_equal 9, c.all_authors.size
97
+ c.uniquify_authors(0)
98
+ assert_equal 3, c.unique_authors.size
99
+ # assert_not_equal c.collection.first.authors.first, c.collection.first.authors.last
100
+ end
101
+
102
+
66
103
 
67
104
 
68
105
  end
@@ -1,5 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require File.expand_path(File.join(File.dirname(__FILE__), '../lib/models/species_name'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/model/species_name'))
3
3
 
4
4
  class TestTaxonifiSpeciesName < Test::Unit::TestCase
5
5
 
@@ -92,4 +92,54 @@ class TestTaxonifiSpeciesName < Test::Unit::TestCase
92
92
  assert_equal "Foo (Bar) stuff things (Jones, 2012)", sn3.display_name
93
93
  end
94
94
 
95
+ def test_new_from_string_for_simple_species_name
96
+ string = "Foo bar Smith, 1920"
97
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
98
+ assert_equal "Foo", sn.genus.name
99
+ assert_equal "bar", sn.species.name
100
+ assert_equal 1920, sn.species.year
101
+ assert_equal "Smith", sn.species.authors.first.last_name
102
+ end
103
+
104
+ def test_new_from_string_for_more_complex_species_name
105
+ string = 'Aus (Cus) bus dus (Smith, 1920)'
106
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
107
+ assert_equal "Aus", sn.genus.name
108
+ assert_equal "Cus", sn.subgenus.name
109
+ assert_equal "bus", sn.species.name
110
+ assert_equal "dus", sn.subspecies.name
111
+ assert_equal 1920, sn.subspecies.year
112
+ assert_equal "Smith", sn.subspecies.authors.first.last_name
113
+ assert_equal true, sn.subspecies.parens
114
+ end
115
+
116
+ def test_new_from_simple_ampersand_authors
117
+ string = 'Pericoma deceptrix Quate & Brown, 2004'
118
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
119
+ assert_equal "Pericoma", sn.genus.name
120
+ assert_equal nil, sn.subgenus
121
+ assert_equal "deceptrix", sn.species.name
122
+ assert_equal nil, sn.subspecies
123
+ assert_equal 2004, sn.species.year
124
+ assert_equal "Quate", sn.species.authors.first.last_name
125
+ assert_equal "Brown", sn.species.authors.last.last_name
126
+ assert_equal false, sn.species.parens
127
+ end
128
+
129
+ def test_new_from_simple_ampersand_parened_authors
130
+ string = 'Pericoma deceptrix (Quate & Brown, 2004)'
131
+ sn = Taxonifi::Model::SpeciesName.new_from_string(string)
132
+ assert_equal "Pericoma", sn.genus.name
133
+ assert_equal nil, sn.subgenus
134
+ assert_equal "deceptrix", sn.species.name
135
+ assert_equal nil, sn.subspecies
136
+ assert_equal 2004, sn.species.year
137
+ assert_equal "Quate", sn.species.authors.first.last_name
138
+ assert_equal "Brown", sn.species.authors.last.last_name
139
+ assert_equal true, sn.species.parens
140
+ end
141
+
142
+
143
+
144
+
95
145
  end
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ gem install bundler -v=1.9.4