biodiversity19 3.1.5 → 3.1.6

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.
@@ -5,21 +5,21 @@ grammar ScientificNameDirty
5
5
  rule root
6
6
  space a:scientific_name_5 space {
7
7
  def value
8
- a.value.gsub(/\s{2,}/, ' ').strip
8
+ a.value.gsub(/\s{2,}/, " ").strip
9
9
  end
10
-
10
+
11
11
  def canonical
12
- a.canonical.gsub(/\s{2,}/, ' ').strip
12
+ a.canonical.gsub(/\s{2,}/, " ").strip
13
13
  end
14
-
14
+
15
15
  def pos
16
16
  a.pos
17
17
  end
18
-
18
+
19
19
  def hybrid
20
20
  a.hybrid
21
21
  end
22
-
22
+
23
23
  def details
24
24
  a.details.class == Array ? a.details : [a.details]
25
25
  end
@@ -35,15 +35,15 @@ grammar ScientificNameDirty
35
35
  def value
36
36
  a.value
37
37
  end
38
-
38
+
39
39
  def canonical
40
40
  a.canonical
41
41
  end
42
-
42
+
43
43
  def pos
44
44
  a.pos
45
45
  end
46
-
46
+
47
47
  def details
48
48
  a.details
49
49
  end
@@ -57,15 +57,15 @@ grammar ScientificNameDirty
57
57
  def value
58
58
  a.value + " " + b.value
59
59
  end
60
-
60
+
61
61
  def canonical
62
62
  a.canonical
63
63
  end
64
-
64
+
65
65
  def pos
66
66
  a.pos.merge(b.pos)
67
67
  end
68
-
68
+
69
69
  def details
70
70
  {:infraspecies => a.details[:infraspecies].merge(b.details)}
71
71
  end
@@ -75,15 +75,15 @@ grammar ScientificNameDirty
75
75
  def value
76
76
  a.value + " " + b.value
77
77
  end
78
-
78
+
79
79
  def canonical
80
80
  a.canonical
81
81
  end
82
-
82
+
83
83
  def pos
84
84
  a.pos.merge(b.pos)
85
85
  end
86
-
86
+
87
87
  def details
88
88
  {:infraspecies => a.details[:infraspecies].merge(b.details)}
89
89
  end
@@ -91,21 +91,21 @@ grammar ScientificNameDirty
91
91
  /
92
92
  super
93
93
  end
94
-
94
+
95
95
  rule species
96
96
  a:species_string space b:year {
97
97
  def value
98
98
  a.value + " " + b.value
99
99
  end
100
-
100
+
101
101
  def canonical
102
102
  a.canonical
103
103
  end
104
-
104
+
105
105
  def pos
106
106
  a.pos.merge(b.pos)
107
107
  end
108
-
108
+
109
109
  def details
110
110
  {:species => a.details[:species].merge(b.details)}
111
111
  end
@@ -117,14 +117,14 @@ grammar ScientificNameDirty
117
117
  rule latin_word
118
118
  a:[a-z\-æœàâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž] b:valid_name_letters {
119
119
  def value
120
- res = ''
121
- text_value.split('').each do |l|
122
- l = 'ae' if l == 'æ'
123
- l = 'oe' if l == 'œ'
120
+ res = ""
121
+ text_value.split("").each do |l|
122
+ l = "ae" if l == "æ"
123
+ l = "oe" if l == "œ"
124
124
  res << l
125
125
  end
126
- res.tr('àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž',
127
- 'aaaaaacceeeiiinnnoooooouuurrrsssz')
126
+ res.tr("àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž",
127
+ "aaaaaacceeeiiinnnoooooouuurrrsssz")
128
128
  end
129
129
  }
130
130
  end
@@ -132,14 +132,14 @@ grammar ScientificNameDirty
132
132
  rule valid_name_letters
133
133
  [a-z\-æœàâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž]+ {
134
134
  def value
135
- res = ''
136
- text_value.split('').each do |l|
137
- l = 'ae' if l == 'æ'
138
- l = 'oe' if l == 'œ'
135
+ res = ""
136
+ text_value.split("").each do |l|
137
+ l = "ae" if l == "æ"
138
+ l = "oe" if l == "œ"
139
139
  res << l
140
140
  end
141
- res.tr('àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž',
142
- 'aaaaaacceeeiiinnnoooooouuurrrsssz')
141
+ res.tr("àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž",
142
+ "aaaaaacceeeiiinnnoooooouuurrrsssz")
143
143
 
144
144
  end
145
145
  }
@@ -150,23 +150,23 @@ grammar ScientificNameDirty
150
150
  /
151
151
  super
152
152
  end
153
-
153
+
154
154
  rule left_paren
155
155
  "(" space "("
156
156
  /
157
157
  super
158
158
  end
159
-
159
+
160
160
  rule year
161
161
  a:year_number space b:approximate_year {
162
162
  def value
163
163
  a.value + " " + b.value
164
164
  end
165
-
165
+
166
166
  def pos
167
167
  a.pos.merge(b.pos)
168
168
  end
169
-
169
+
170
170
  def details
171
171
  {:year => a.value, :approximate_year => b.value}
172
172
  end
@@ -176,11 +176,11 @@ grammar ScientificNameDirty
176
176
  def value
177
177
  a.text_value
178
178
  end
179
-
179
+
180
180
  def pos
181
- {a.interval.begin => ['year', a.interval.end]}
181
+ {a.interval.begin => ["year", a.interval.end]}
182
182
  end
183
-
183
+
184
184
  def details
185
185
  {:year => value}
186
186
  end
@@ -194,40 +194,39 @@ grammar ScientificNameDirty
194
194
  /
195
195
  super
196
196
  end
197
-
197
+
198
198
  rule approximate_year
199
199
  "[" space a:year_number space "]"+ {
200
200
  def value
201
201
  "(" + a.text_value + ")"
202
202
  end
203
-
203
+
204
204
  def pos
205
- {a.interval.begin => ['year', a.interval.end]}
205
+ {a.interval.begin => ["year", a.interval.end]}
206
206
  end
207
-
207
+
208
208
  def details
209
209
  {:approximate_year => value}
210
210
  end
211
211
  }
212
212
  end
213
-
214
-
213
+
215
214
  rule double_year
216
215
  year_number "-" [0-9]+ [A-Za-z]? [\?]? {
217
216
  def value
218
217
  text_value
219
218
  end
220
-
219
+
221
220
  def pos
222
- {interval.begin => ['year', interval.end]}
221
+ {interval.begin => ["year", interval.end]}
223
222
  end
224
-
223
+
225
224
  def details
226
225
  {:year => value}
227
226
  end
228
227
  }
229
228
  end
230
-
229
+
231
230
  rule year_number_with_punctuation
232
231
  a:year_number "." {
233
232
  def value
@@ -235,7 +234,7 @@ grammar ScientificNameDirty
235
234
  end
236
235
 
237
236
  def pos
238
- {interval.begin => ['year', interval.end]}
237
+ {interval.begin => ["year", interval.end]}
239
238
  end
240
239
 
241
240
  def details
@@ -244,7 +243,6 @@ grammar ScientificNameDirty
244
243
  }
245
244
  end
246
245
 
247
-
248
246
  rule page_number
249
247
  ":" space [\d]+
250
248
  {
@@ -252,16 +250,15 @@ grammar ScientificNameDirty
252
250
  end
253
251
  }
254
252
  end
255
-
253
+
256
254
  rule string_authorship_inconsistencies
257
255
  ("corrig.")
258
256
  end
259
257
 
260
-
261
258
  rule garbage
262
259
  space (["',]) space [^щ]*
263
260
  /
264
261
  space_hard [^ш]+
265
262
  end
266
-
263
+
267
264
  end
@@ -1,3 +1,3 @@
1
1
  module Biodiversity
2
- VERSION = '3.1.5'
3
- end
2
+ VERSION = "3.1.6"
3
+ end
@@ -132,6 +132,10 @@ Pseudocercospora dendrobii(H.C. Burnett, 1873)U. Braun & Crous 2003|{"sc
132
132
  Pseudocercospora dendrobii(H.C. Burnett 1873)U. Braun & Crous , 2003|{"scientificName":{"parsed":true, "parser_version":"test_version", "parser_run":1,"verbatim":"Pseudocercospora dendrobii(H.C. Burnett 1873)U. Braun & Crous , 2003","normalized":"Pseudocercospora dendrobii (H.C. Burnett 1873) U. Braun & Crous 2003","canonical":"Pseudocercospora dendrobii","hybrid":false,"details":[{"genus":{"string":"Pseudocercospora"},"species":{"string":"dendrobii","authorship":"(H.C. Burnett 1873)U. Braun & Crous , 2003","combinationAuthorTeam":{"authorTeam":"U. Braun & Crous","author":["U. Braun","Crous"],"year":"2003"},"basionymAuthorTeam":{"authorTeam":"H.C. Burnett","author":["H.C. Burnett"],"year":"1873"}}}],"positions":{"0":["genus",16],"17":["species",26],"27":["author_word",31],"36":["author_word",43],"44":["year",48],"49":["author_word",51],"52":["author_word",57],"60":["author_word",65],"71":["year",75]}}}
133
133
  Sedella pumila (Benth.) Britton & Rose|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Sedella pumila (Benth.) Britton & Rose", "normalized":"Sedella pumila (Benth.) Britton & Rose", "canonical":"Sedella pumila", "hybrid":false, "details":[{"genus":{"string":"Sedella"}, "species":{"string":"pumila", "authorship":"(Benth.) Britton & Rose", "combinationAuthorTeam":{"authorTeam":"Britton & Rose", "author":["Britton", "Rose"]}, "basionymAuthorTeam":{"authorTeam":"Benth.", "author":["Benth."]}}}], "parser_run":1, "positions":{"0":["genus", 7], "8":["species", 14], "16":["author_word", 22], "24":["author_word", 31], "34":["author_word", 38]}}}
134
134
 
135
+ #binomials with apostrophe in species epithet
136
+ Odynerus o'neili Cameron|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Odynerus o'neili Cameron", "normalized":"Odynerus oneili Cameron", "canonical":"Odynerus oneili", "hybrid":false, "details":[{"genus":{"string":"Odynerus"}, "species":{"string":"oneili", "authorship":"Cameron", "basionymAuthorTeam":{"authorTeam":"Cameron", "author":["Cameron"]}}}], "parser_run":1, "positions":{"0":["genus", 8], "9":["species", 16], "17":["author_word", 24]}}}
137
+ Serjania meridionalis Cambess. var. o'donelli F.A. Barkley|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Serjania meridionalis Cambess. var. o'donelli F.A. Barkley", "normalized":"Serjania meridionalis Cambess. var. odonelli F.A. Barkley", "canonical":"Serjania meridionalis odonelli", "hybrid":false, "details":[{"genus":{"string":"Serjania"}, "species":{"string":"meridionalis", "authorship":"Cambess.", "basionymAuthorTeam":{"authorTeam":"Cambess.", "author":["Cambess."]}}, "infraspecies":[{"string":"odonelli", "rank":"var.", "authorship":"F.A. Barkley", "basionymAuthorTeam":{"authorTeam":"F.A. Barkley", "author":["F.A. Barkley"]}}]}], "parser_run":1, "positions":{"0":["genus", 8], "9":["species", 21], "22":["author_word", 30], "31":["infraspecific_type", 35], "36":["infraspecies", 45], "46":["author_word", 50], "51":["author_word", 58]}}}
138
+
135
139
  #infraspecies without rank
136
140
  Hydnellum scrobiculatum zonatum (Batsch) K. A. Harrison 1961|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Hydnellum scrobiculatum zonatum (Batsch) K. A. Harrison 1961", "normalized":"Hydnellum scrobiculatum zonatum (Batsch) K. A. Harrison 1961", "canonical":"Hydnellum scrobiculatum zonatum", "hybrid":false, "details":[{"genus":{"string":"Hydnellum"}, "species":{"string":"scrobiculatum"}, "infraspecies":[{"string":"zonatum", "rank":"n/a", "authorship":"(Batsch) K. A. Harrison 1961", "combinationAuthorTeam":{"authorTeam":"K. A. Harrison", "author":["K. A. Harrison"], "year":"1961"}, "basionymAuthorTeam":{"authorTeam":"Batsch", "author":["Batsch"]}}]}], "parser_run":1, "positions":{"0":["genus", 9], "10":["species", 23], "24":["infraspecies", 31], "33":["author_word", 39], "41":["author_word", 43], "44":["author_word", 46], "47":["author_word", 55], "56":["year", 60]}}}
137
141
  Hydnellum scrobiculatum zonatum (Banker) D. Hall & D.E. Stuntz 1972|{"scientificName":{"parsed":true, "parser_version":"test_version", "parser_run":1,"verbatim":"Hydnellum scrobiculatum zonatum (Banker) D. Hall & D.E. Stuntz 1972","normalized":"Hydnellum scrobiculatum zonatum (Banker) D. Hall & D.E. Stuntz 1972","canonical":"Hydnellum scrobiculatum zonatum","hybrid":false,"details":[{"genus":{"string":"Hydnellum"},"species":{"string":"scrobiculatum"},"infraspecies":[{"string":"zonatum","rank":"n\/a","authorship":"(Banker) D. Hall & D.E. Stuntz 1972","combinationAuthorTeam":{"authorTeam":"D. Hall & D.E. Stuntz","author":["D. Hall","D.E. Stuntz"],"year":"1972"},"basionymAuthorTeam":{"authorTeam":"Banker","author":["Banker"]}}]}],"positions":{"0":["genus",9],"10":["species",23],"24":["infraspecies",31],"33":["author_word",39],"41":["author_word",43],"44":["author_word",48],"51":["author_word",55],"56":["author_word",62],"63":["year",67]}}}
@@ -160,6 +164,7 @@ Rhododendron weyrichii Maxim. f. albiflorum T.Yamaz.|{"scientificName":{"parsed"
160
164
  Armeria maaritima (Mill.) Willd. fma. originaria Bern.|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Armeria maaritima (Mill.) Willd. fma. originaria Bern.", "normalized":"Armeria maaritima (Mill.) Willd. fma. originaria Bern.", "canonical":"Armeria maaritima originaria", "hybrid":false, "details":[{"genus":{"string":"Armeria"}, "species":{"string":"maaritima", "authorship":"(Mill.) Willd.", "combinationAuthorTeam":{"authorTeam":"Willd.", "author":["Willd."]}, "basionymAuthorTeam":{"authorTeam":"Mill.", "author":["Mill."]}}, "infraspecies":[{"string":"originaria", "rank":"fma.", "authorship":"Bern.", "basionymAuthorTeam":{"authorTeam":"Bern.", "author":["Bern."]}}]}], "parser_run":1, "positions":{"0":["genus", 7], "8":["species", 17], "19":["author_word", 24], "26":["author_word", 32], "33":["infraspecific_type", 37], "38":["infraspecies", 48], "49":["author_word", 54]}}}
161
165
  Cotoneaster (Pyracantha) rogersiana var.aurantiaca|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Cotoneaster (Pyracantha) rogersiana var.aurantiaca", "normalized":"Cotoneaster (Pyracantha) rogersiana var. aurantiaca", "canonical":"Cotoneaster rogersiana aurantiaca", "hybrid":false, "details":[{"genus":{"string":"Cotoneaster"}, "infragenus":{"string":"Pyracantha"}, "species":{"string":"rogersiana"}, "infraspecies":[{"string":"aurantiaca", "rank":"var."}]}], "parser_run":1, "positions":{"0":["genus", 11], "13":["infragenus", 23], "25":["species", 35], "36":["infraspecific_type", 40], "40":["infraspecies", 50]}}}
162
166
  Poa annua fo varia|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Poa annua fo varia", "normalized":"Poa annua fo varia", "canonical":"Poa annua varia", "hybrid":false, "details":[{"genus":{"string":"Poa"}, "species":{"string":"annua"}, "infraspecies":[{"string":"varia", "rank":"fo"}]}], "parser_run":1, "positions":{"0":["genus", 3], "4":["species", 9], "10":["infraspecific_type", 12], "13":["infraspecies", 18]}}}
167
+ Physarum globuliferum forma. flavum Leontyev & Dudka|{"scientificName":{"parsed":true, "parser_version":"test_version", "verbatim":"Physarum globuliferum forma. flavum Leontyev & Dudka", "normalized":"Physarum globuliferum forma. flavum Leontyev & Dudka", "canonical":"Physarum globuliferum flavum", "hybrid":false, "details":[{"genus":{"string":"Physarum"}, "species":{"string":"globuliferum"}, "infraspecies":[{"string":"flavum", "rank":"forma.", "authorship":"Leontyev & Dudka", "basionymAuthorTeam":{"authorTeam":"Leontyev & Dudka", "author":["Leontyev", "Dudka"]}}]}], "parser_run":1, "positions":{"0":["genus", 8], "9":["species", 21], "22":["infraspecific_type", 28], "29":["infraspecies", 35], "36":["author_word", 44], "47":["author_word", 52]}}}
163
168
  #TODO: Homalanthus nutans (Mull.Arg.) Benth. & Hook. f. ex Drake|{}
164
169
 
165
170
  #infraspecies_multiple
@@ -289,7 +294,7 @@ Acarospora cratericola cratericola Shenk 1974 group|{"scientificName":{"parsed":
289
294
  Acarospora cratericola cratericola Shenk 1974 species group|{"scientificName":{"parsed":true, "verbatim":"Acarospora cratericola cratericola Shenk 1974 species group", "normalized":"Acarospora cratericola cratericola Shenk 1974", "canonical":"Acarospora cratericola cratericola", "hybrid":false, "details":[{"genus":{"string":"Acarospora"}, "species":{"string":"cratericola"}, "infraspecies":[{"string":"cratericola", "rank":"n/a", "authorship":"Shenk 1974", "basionymAuthorTeam":{"authorTeam":"Shenk", "author":["Shenk"], "year":"1974"}}]}], "parser_version":"test_version", "parser_run":1, "positions":{"0":["genus", 10], "11":["species", 22], "23":["infraspecies", 34], "35":["author_word", 40], "41":["year", 45]}}}
290
295
  Acarospora cratericola cratericola Shenk 1974 species complex|{"scientificName":{"parsed":true, "verbatim":"Acarospora cratericola cratericola Shenk 1974 species complex", "normalized":"Acarospora cratericola cratericola Shenk 1974", "canonical":"Acarospora cratericola cratericola", "hybrid":false, "details":[{"genus":{"string":"Acarospora"}, "species":{"string":"cratericola"}, "infraspecies":[{"string":"cratericola", "rank":"n/a", "authorship":"Shenk 1974", "basionymAuthorTeam":{"authorTeam":"Shenk", "author":["Shenk"], "year":"1974"}}]}], "parser_version":"test_version", "parser_run":1, "positions":{"0":["genus", 10], "11":["species", 22], "23":["infraspecies", 34], "35":["author_word", 40], "41":["year", 45]}}}
291
296
 
292
- #removing taxon concepts
297
+ #ignoring sensu sec
293
298
  Senecio legionensis sensu Samp., non Lange|{"scientificName":{"parsed":true, "verbatim":"Senecio legionensis sensu Samp., non Lange", "normalized":"Senecio legionensis", "canonical":"Senecio legionensis", "hybrid":false, "details":[{"genus":{"string":"Senecio"}, "species":{"string":"legionensis"}}], "parser_version":"test_version", "parser_run":1, "positions":{"0":["genus", 7], "8":["species", 19]}}}
294
299
  Pseudomonas methanica (Söhngen 1906) sensu. Dworkin and Foster 1956|{"scientificName":{"parsed":true, "verbatim":"Pseudomonas methanica (Söhngen 1906) sensu. Dworkin and Foster 1956", "normalized":"Pseudomonas methanica (Söhngen 1906)", "canonical":"Pseudomonas methanica", "hybrid":false, "details":[{"genus":{"string":"Pseudomonas"}, "species":{"string":"methanica", "authorship":"(Söhngen 1906)", "basionymAuthorTeam":{"authorTeam":"Söhngen", "author":["Söhngen"], "year":"1906"}}}], "parser_version":"test_version", "parser_run":1, "positions":{"0":["genus", 11], "12":["species", 21], "23":["author_word", 30], "31":["year", 35]}}}
295
300
  Abarema scutifera sensu auct., non (Blanco)Kosterm.|{"scientificName":{"parsed":true, "verbatim":"Abarema scutifera sensu auct., non (Blanco)Kosterm.", "normalized":"Abarema scutifera", "canonical":"Abarema scutifera", "hybrid":false, "details":[{"genus":{"string":"Abarema"}, "species":{"string":"scutifera"}}], "parser_version":"test_version", "parser_run":1, "positions":{"0":["genus", 7], "8":["species", 17]}}}
@@ -1,30 +1,31 @@
1
1
  # encoding: UTF-8
2
- require_relative '../spec_helper'
2
+ require_relative "../spec_helper"
3
3
 
4
4
  describe ScientificNameCanonical do
5
5
  before(:all) do
6
6
  set_parser(ScientificNameCanonicalParser.new)
7
7
  end
8
8
 
9
- it 'parses names with valid name part and unparseable rest' do
9
+ it "parses names with valid name part and unparseable rest" do
10
10
  [
11
- ['Morea ssjjlajajaj324$33 234243242','Morea',
12
- [{:uninomial=>{:string=>"Morea"}}], {0=>["uninomial", 5]}],
13
- ['Morea (Morea) Burt 2342343242 23424322342 23424234',
14
- 'Morea (Morea)', [{:genus=>{:string=>"Morea"},
15
- :infragenus=>{:string=>"Morea"}}],
16
- {0=>["genus", 5], 7=>["infragenus", 12]}],
17
- ['Morea (Morea) burtius 2342343242 23424322342 23424234',
18
- 'Morea (Morea) burtius', [{:genus=>{:string=>"Morea"},
19
- :infragenus=>{:string=>"Morea"},
20
- :species=>{:string=>"burtius"}}],
21
- {0=>["genus", 5], 7=>["infragenus", 12], 14=>["species", 21]}],
22
- ['Moraea spathulata ( (L. f. Klatt','Moraea spathulata',
23
- [{:genus=>{:string=>"Moraea"}, :species=>{:string=>"spathulata"}}],
24
- {0=>["genus", 6], 7=>["species", 17]} ],
25
- ['Verpericola megasoma ""Dall" Pils.','Verpericola megasoma',
26
- [{:genus=>{:string=>"Verpericola"}, :species=>{:string=>"megasoma"}}],
27
- {0=>["genus", 11], 12=>["species", 20]}]
11
+ ["Morea ssjjlajajaj324$33 234243242","Morea",
12
+ [{ uninomial: { string: "Morea" }}], { 0 => ["uninomial", 5]}],
13
+ ["Morea (Morea) Burt 2342343242 23424322342 23424234",
14
+ "Morea (Morea)", [{ genus: { string: "Morea" },
15
+ infragenus: { string: "Morea" }}],
16
+ { 0 => ["genus", 5], 7 => ["infragenus", 12] }],
17
+ ["Morea (Morea) burtius 2342343242 23424322342 23424234",
18
+ "Morea (Morea) burtius", [{ genus: { string: "Morea" },
19
+ infragenus: { string: "Morea" },
20
+ species: { string: "burtius" }}],
21
+ { 0 => ["genus", 5], 7 => ["infragenus", 12], 14 => ["species", 21] }],
22
+ ["Moraea spathulata ( (L. f. Klatt","Moraea spathulata",
23
+ [{ genus: { string: "Moraea" }, species: { string: "spathulata"}}],
24
+ { 0 => ["genus", 6], 7 => ["species", 17] } ],
25
+ ["Verpericola megasoma \"Dall\" Pils.","Verpericola megasoma",
26
+ [{ genus: { string: "Verpericola" },
27
+ species: { string: "megasoma"}}],
28
+ { 0 => ["genus", 11], 12 => ["species", 20] }]
28
29
  ].each do |n|
29
30
  expect(parse(n[0])).not_to be_nil
30
31
  expect(value(n[0])).to eq n[1]
@@ -32,6 +33,5 @@ describe ScientificNameCanonical do
32
33
  expect(pos(n[0])).to eq n[3]
33
34
  expect(parse(n[0]).hybrid).to be false
34
35
  end
35
- end
36
-
36
+ end
37
37
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require_relative '../spec_helper'
2
+ require_relative "../spec_helper"
3
3
 
4
4
 
5
5
  describe ScientificNameClean do
@@ -7,51 +7,51 @@ describe ScientificNameClean do
7
7
  set_parser(ScientificNameCleanParser.new)
8
8
  end
9
9
 
10
- it 'parses uninomial' do
11
- sn = 'Pseudocercospora'
10
+ it "parses uninomial" do
11
+ sn = "Pseudocercospora"
12
12
  expect(parse(sn)).to_not be_nil
13
- expect(value(sn)).to eq 'Pseudocercospora'
14
- expect(canonical(sn)).to eq 'Pseudocercospora'
15
- expect(details(sn)).to eq [{:uninomial=>{:string=>"Pseudocercospora"}}]
16
- expect(pos(sn)).to eq({ 0=>["uninomial", 16] })
13
+ expect(value(sn)).to eq "Pseudocercospora"
14
+ expect(canonical(sn)).to eq "Pseudocercospora"
15
+ expect(details(sn)).to eq [{ uninomial: { string: "Pseudocercospora" } }]
16
+ expect(pos(sn)).to eq({ 0 => ["uninomial", 16] })
17
17
  end
18
-
19
- it 'parses uninomial with author and year' do
20
- sn = 'Pseudocercospora Speg.'
18
+
19
+ it "parses uninomial with author and year" do
20
+ sn = "Pseudocercospora Speg."
21
21
  expect(parse(sn)).to_not be_nil
22
- expect(details(sn)).to eq [{:uninomial=>
23
- {:string=>"Pseudocercospora",
24
- :authorship=>"Speg.",
25
- :basionymAuthorTeam=>
26
- {:authorTeam=>"Speg.", :author=>["Speg."]}}}]
27
- expect(pos(sn)).to eq({0=>["uninomial", 16], 17=>["author_word", 22]})
28
- sn = 'Pseudocercospora Spegazzini, 1910'
22
+ expect(details(sn)).to eq [{ uninomial:
23
+ { string: "Pseudocercospora",
24
+ authorship: "Speg.",
25
+ basionymAuthorTeam:
26
+ { authorTeam: "Speg.", author: ["Speg."] } } }]
27
+ expect(pos(sn)).to eq({ 0 => ["uninomial", 16], 17 => ["author_word", 22] })
28
+ sn = "Pseudocercospora Spegazzini, 1910"
29
29
  expect(parse(sn)).to_not be_nil
30
- expect(value(sn)).to eq 'Pseudocercospora Spegazzini 1910'
31
- expect(details(sn)).to eq [{:uninomial=>
32
- {:string=>"Pseudocercospora",
33
- :authorship=>"Spegazzini, 1910",
34
- :basionymAuthorTeam=>
35
- {:authorTeam=>"Spegazzini",
36
- :author=>["Spegazzini"], :year=>"1910"}}}]
37
- expect(pos(sn)).to eq({0=>["uninomial", 16],
38
- 17=>["author_word", 27], 29=>["year", 33]})
30
+ expect(value(sn)).to eq "Pseudocercospora Spegazzini 1910"
31
+ expect(details(sn)).to eq [{ uninomial:
32
+ { string: "Pseudocercospora",
33
+ authorship: "Spegazzini, 1910",
34
+ basionymAuthorTeam:
35
+ { authorTeam: "Spegazzini",
36
+ author: ["Spegazzini"], year: "1910" } } }]
37
+ expect(pos(sn)).to eq({ 0 => ["uninomial", 16],
38
+ 17 => ["author_word", 27], 29 => ["year", 33] })
39
39
  end
40
40
 
41
41
  it "parses uninomials with uninomial ranks" do
42
42
  sn = "Epacridaceae trib. Archerieae Crayn & Quinn"
43
43
  expect(parse(sn)).to_not be_nil
44
- expect(details(sn)).to eq [{:uninomial=>
45
- {:string=>"Epacridaceae"},
46
- :rank_uninomials=>"trib.",
47
- :uninomial2=>{:string=>"Archerieae",
48
- :authorship=>"Crayn & Quinn",
49
- :basionymAuthorTeam=>
50
- {:authorTeam=>"Crayn & Quinn",
51
- :author=>["Crayn", "Quinn"]}}}]
44
+ expect(details(sn)).to eq [{ uninomial:
45
+ { string: "Epacridaceae" },
46
+ rank_uninomials: "trib.",
47
+ :uninomial2 => { string: "Archerieae",
48
+ authorship: "Crayn & Quinn",
49
+ basionymAuthorTeam:
50
+ { authorTeam: "Crayn & Quinn",
51
+ author: ["Crayn", "Quinn"] } } }]
52
52
  end
53
53
 
54
- it 'parses names with a valid 2 letter genus' do
54
+ it "parses names with a valid 2 letter genus" do
55
55
  ["Ca Dyar 1914",
56
56
  "Ea Distant 1911",
57
57
  "Ge Nicéville 1895",
@@ -73,170 +73,170 @@ describe ScientificNameClean do
73
73
  "Ba Solem 1983"].each do |name|
74
74
  expect(parse(name)).to_not be_nil
75
75
  end
76
- expect(canonical('Quoyula')).to eq 'Quoyula'
76
+ expect(canonical("Quoyula")).to eq "Quoyula"
77
77
  end
78
78
 
79
- it 'parses canonical' do
80
- sn = 'Pseudocercospora dendrobii'
79
+ it "parses canonical" do
80
+ sn = "Pseudocercospora dendrobii"
81
81
  expect(parse(sn)).to_not be_nil
82
- expect(value(sn)).to eq 'Pseudocercospora dendrobii'
83
- expect(canonical(sn)).to eq 'Pseudocercospora dendrobii'
84
- expect(details(sn)).to eq [{:genus=>
85
- {:string=>"Pseudocercospora"},
86
- :species=>{:string=>"dendrobii"}}]
87
- expect(pos(sn)).to eq({0=>["genus", 16], 21=>["species", 30]})
82
+ expect(value(sn)).to eq "Pseudocercospora dendrobii"
83
+ expect(canonical(sn)).to eq "Pseudocercospora dendrobii"
84
+ expect(details(sn)).to eq [{ genus:
85
+ { string: "Pseudocercospora" },
86
+ species: { string: "dendrobii" } }]
87
+ expect(pos(sn)).to eq({ 0 => ["genus", 16], 21 => ["species", 30] })
88
88
  end
89
89
 
90
- it 'parses abbreviated canonical' do
91
- sn = 'P. dendrobii'
90
+ it "parses abbreviated canonical" do
91
+ sn = "P. dendrobii"
92
92
  expect(parse(sn)).to_not be_nil
93
- expect(value(sn)).to eq 'P. dendrobii'
94
- sn = 'Ps. dendrobii'
93
+ expect(value(sn)).to eq "P. dendrobii"
94
+ sn = "Ps. dendrobii"
95
95
  expect(parse(sn)).to_not be_nil
96
- expect(value(sn)).to eq 'Ps. dendrobii'
97
- expect(details(sn)).to eq [{:genus=>
98
- {:string=>"Ps."},
99
- :species=>{:string=>"dendrobii"}}]
96
+ expect(value(sn)).to eq "Ps. dendrobii"
97
+ expect(details(sn)).to eq [{ genus:
98
+ { string: "Ps." },
99
+ species: { string: "dendrobii" } }]
100
100
  end
101
101
 
102
102
 
103
- it 'parses species name with author and year' do
103
+ it "parses species name with author and year" do
104
104
  sn = "Platypus bicaudatulus Schedl 1935"
105
105
  expect(parse(sn)).to_not be_nil
106
106
  expect(value(sn)).to eq "Platypus bicaudatulus Schedl 1935"
107
107
  sn = "Platypus bicaudatulus Schedl, 1935h"
108
108
  expect(parse(sn)).to_not be_nil
109
109
  expect(value(sn)).to eq "Platypus bicaudatulus Schedl 1935"
110
- expect(details(sn)).to eq [{:genus=>
111
- {:string=>"Platypus"},
112
- :species=>{:string=>"bicaudatulus",
113
- :authorship=>"Schedl, 1935h",
114
- :basionymAuthorTeam=>
115
- {:authorTeam=>"Schedl", :author=>["Schedl"],
116
- :year=>"1935"}}}]
117
- expect(pos(sn)).to eq({0=>["genus", 8],
118
- 9=>["species", 21], 22=>["author_word", 28],
119
- 30=>["year", 35]})
110
+ expect(details(sn)).to eq [{ genus:
111
+ { string: "Platypus" },
112
+ species: { string: "bicaudatulus",
113
+ authorship: "Schedl, 1935h",
114
+ basionymAuthorTeam:
115
+ { authorTeam: "Schedl", author: ["Schedl"],
116
+ year: "1935" } } }]
117
+ expect(pos(sn)).to eq({ 0 => ["genus", 8],
118
+ 9 => ["species", 21], 22 => ["author_word", 28],
119
+ 30 => ["year", 35] })
120
120
  expect(parse("Platypus bicaudatulus Schedl, 1935B")).to_not be_nil
121
121
  sn = "Platypus bicaudatulus Schedl (1935h)"
122
122
  expect(parse(sn)).to_not be_nil
123
- expect(details(sn)).to eq [{:genus=>{:string=>"Platypus"},
124
- :species=>{:string=>"bicaudatulus", :authorship=>"Schedl (1935h)",
125
- :basionymAuthorTeam=>{:authorTeam=>"Schedl", :author=>["Schedl"],
126
- :year=>"1935"}}}]
123
+ expect(details(sn)).to eq [{ genus: { string: "Platypus" },
124
+ species: { string: "bicaudatulus", authorship: "Schedl (1935h)",
125
+ basionymAuthorTeam: { authorTeam: "Schedl", author: ["Schedl"],
126
+ year: "1935" } } }]
127
127
  expect(parse("Platypus bicaudatulus Schedl 1935")).to_not be_nil
128
128
  end
129
129
 
130
- it 'parses species name with abbreviated genus, author and year' do
130
+ it "parses species name with abbreviated genus, author and year" do
131
131
  sn = "P. bicaudatulus Schedl 1935"
132
132
  expect(parse(sn)).to_not be_nil
133
133
  expect(value(sn)).to eq "P. bicaudatulus Schedl 1935"
134
134
  sn = "Pl. bicaudatulus Schedl, 1935h"
135
135
  expect(parse(sn)).not_to be_nil
136
136
  expect(value(sn)).to eq "Pl. bicaudatulus Schedl 1935"
137
- expect(details(sn)).to eq [{:genus=>{:string=>"Pl."},
138
- :species=>{:string=>"bicaudatulus", :authorship=>"Schedl, 1935h",
139
- :basionymAuthorTeam=>{:authorTeam=>"Schedl",
140
- :author=>["Schedl"], :year=>"1935"}}}]
137
+ expect(details(sn)).to eq [{ genus: { string: "Pl." },
138
+ species: { string: "bicaudatulus", authorship: "Schedl, 1935h",
139
+ basionymAuthorTeam: { authorTeam: "Schedl",
140
+ author: ["Schedl"], year: "1935" } } }]
141
141
  sn = "Pla. bicaudatulus Schedl, 1935h"
142
142
  expect(parse(sn)).to_not be_nil
143
143
  expect(value(sn)).to eq "Pla. bicaudatulus Schedl 1935"
144
144
  end
145
145
 
146
- it "parses species name with author's postfix f., filius (son of)" do
146
+ it "parses species name with author\'s postfix f., filius (son of)" do
147
147
  names = [
148
- [ "Platypus bicaudatulus Schedl f. 1935", [{:genus=>{:string=>"Platypus"},
149
- :species=>{:string=>"bicaudatulus", :authorship=>"Schedl f. 1935",
150
- :basionymAuthorTeam=>{:authorTeam=>"Schedl f.",
151
- :author=>["Schedl f."], :year=>"1935"}}}],
152
- 'Platypus bicaudatulus Schedl f. 1935'],
153
- ["Platypus bicaudatulus Schedl filius 1935",
154
- [{:genus=>{:string=>"Platypus"},
155
- :species=>{:string=>"bicaudatulus",
156
- :authorship=>"Schedl filius 1935",
157
- :basionymAuthorTeam=>{:authorTeam=>"Schedl filius",
158
- :author=>["Schedl filius"], :year=>"1935"}}}],
159
- 'Platypus bicaudatulus Schedl filius 1935'],
160
- [ "Fimbristylis ovata (Burm. f.) J. Kern",
161
- [{:genus=>{:string=>"Fimbristylis"}, :species=>{:string=>"ovata",
162
- :authorship=>"(Burm. f.) J. Kern",
163
- :combinationAuthorTeam=>{:authorTeam=>"J. Kern",
164
- :author=>["J. Kern"]},
165
- :basionymAuthorTeam=>{:authorTeam=>"Burm. f.",
166
- :author=>["Burm. f."]}}}], 'Fimbristylis ovata (Burm. f.) J. Kern'],
167
- [ "Carex chordorrhiza Ehrh. ex L. f.",
168
- [{:genus=>{:string=>"Carex"}, :species=>{:string=>"chordorrhiza",
169
- :authorship=>"Ehrh. ex L. f.",
170
- :basionymAuthorTeam=>{:authorTeam=>"Ehrh.",
171
- :author=>["Ehrh."], :exAuthorTeam=>{:authorTeam=>"L. f.",
172
- :author=>["L. f."]}}}}], 'Carex chordorrhiza Ehrh. ex L. f.'],
173
- [ "Amelanchier arborea var. arborea (Michx. f.) Fernald",
174
- [{:genus=>{:string=>"Amelanchier"}, :species=>{:string=>"arborea"},
175
- :infraspecies=>[{:string=>"arborea", :rank=>"var.",
176
- :authorship=>"(Michx. f.) Fernald", :combinationAuthorTeam=>{
177
- :authorTeam=>"Fernald", :author=>["Fernald"]},
178
- :basionymAuthorTeam=>{:authorTeam=>"Michx. f.",
179
- :author=>["Michx. f."]}}]}],
180
- 'Amelanchier arborea var. arborea (Michx. f.) Fernald'],
181
- [ "Cerastium arvense var. fuegianum Hook. f.",
182
- [{:genus=>{:string=>"Cerastium"}, :species=>{:string=>"arvense"},
183
- :infraspecies=>[{:string=>"fuegianum", :rank=>"var.",
184
- :authorship=>"Hook. f.",
185
- :basionymAuthorTeam=>{:authorTeam=>"Hook. f.",
186
- :author=>["Hook. f."]}}]}],
187
- 'Cerastium arvense var. fuegianum Hook. f.'],
188
- [ "Cerastium arvense var. fuegianum Hook.f.",
189
- [{:genus=>{:string=>"Cerastium"}, :species=>{:string=>"arvense"},
190
- :infraspecies=>[{:string=>"fuegianum", :rank=>"var.",
191
- :authorship=>"Hook.f.", :basionymAuthorTeam=>{
192
- :authorTeam=>"Hook.f.", :author=>["Hook.f."]}}]}],
193
- 'Cerastium arvense var. fuegianum Hook.f.'],
194
- [ "Cerastium arvense ssp. velutinum var. velutinum (Raf.) Britton f.",
195
- [{:genus=>{:string=>"Cerastium"}, :species=>{:string=>"arvense"},
196
- :infraspecies=>[{:string=>"velutinum", :rank=>"ssp."},
197
- {:string=>"velutinum", :rank=>"var.",
198
- :authorship=>"(Raf.) Britton f.",
199
- :combinationAuthorTeam=>{:authorTeam=>"Britton f.",
200
- :author=>["Britton f."]}, :basionymAuthorTeam=>{:authorTeam=>"Raf.",
201
- :author=>["Raf."]}}]}],
148
+ ["Platypus bicaudatulus Schedl f. 1935", [{ genus: { string: "Platypus" },
149
+ species: { string: "bicaudatulus", authorship: "Schedl f. 1935",
150
+ basionymAuthorTeam: { authorTeam: "Schedl f.",
151
+ author: ["Schedl f."], year: "1935" } } }],
152
+ "Platypus bicaudatulus Schedl f. 1935"],
153
+ ["Platypus bicaudatulus Schedl filius 1935",
154
+ [{ genus: { string: "Platypus" },
155
+ species: { string: "bicaudatulus",
156
+ authorship: "Schedl filius 1935",
157
+ basionymAuthorTeam: { authorTeam: "Schedl filius",
158
+ author: ["Schedl filius"], year: "1935" } } }],
159
+ "Platypus bicaudatulus Schedl filius 1935"],
160
+ ["Fimbristylis ovata (Burm. f.) J. Kern",
161
+ [{ genus: { string: "Fimbristylis" }, species: { string: "ovata",
162
+ authorship: "(Burm. f.) J. Kern",
163
+ combinationAuthorTeam: { authorTeam: "J. Kern",
164
+ author: ["J. Kern"] },
165
+ basionymAuthorTeam: { authorTeam: "Burm. f.",
166
+ author: ["Burm. f."] } } }], "Fimbristylis ovata (Burm. f.) J. Kern"],
167
+ ["Carex chordorrhiza Ehrh. ex L. f.",
168
+ [{ genus: { string: "Carex" }, species: { string: "chordorrhiza",
169
+ authorship: "Ehrh. ex L. f.",
170
+ basionymAuthorTeam: { authorTeam: "Ehrh.",
171
+ author: ["Ehrh."], exAuthorTeam: { authorTeam: "L. f.",
172
+ author: ["L. f."] } } } }], "Carex chordorrhiza Ehrh. ex L. f."],
173
+ ["Amelanchier arborea var. arborea (Michx. f.) Fernald",
174
+ [{ genus: { string: "Amelanchier" }, species: { string: "arborea"},
175
+ infraspecies: [{ string: "arborea", rank: "var.",
176
+ authorship: "(Michx. f.) Fernald", combinationAuthorTeam: {
177
+ authorTeam: "Fernald", author: ["Fernald"] },
178
+ basionymAuthorTeam: { authorTeam: "Michx. f.",
179
+ author: ["Michx. f."] } }]}],
180
+ "Amelanchier arborea var. arborea (Michx. f.) Fernald"],
181
+ ["Cerastium arvense var. fuegianum Hook. f.",
182
+ [{ genus: { string: "Cerastium" }, species: { string: "arvense"},
183
+ infraspecies: [{ string: "fuegianum", rank: "var.",
184
+ authorship: "Hook. f.",
185
+ basionymAuthorTeam: { authorTeam: "Hook. f.",
186
+ author: ["Hook. f."] } }]}],
187
+ "Cerastium arvense var. fuegianum Hook. f."],
188
+ ["Cerastium arvense var. fuegianum Hook.f.",
189
+ [{ genus: { string: "Cerastium" }, species: { string: "arvense"},
190
+ infraspecies: [{ string: "fuegianum", rank: "var.",
191
+ authorship: "Hook.f.", basionymAuthorTeam: {
192
+ authorTeam: "Hook.f.", author: ["Hook.f."] } }]}],
193
+ "Cerastium arvense var. fuegianum Hook.f."],
194
+ ["Cerastium arvense ssp. velutinum var. velutinum (Raf.) Britton f.",
195
+ [{ genus: { string: "Cerastium" }, species: { string: "arvense"},
196
+ infraspecies: [{ string: "velutinum", rank: "ssp." },
197
+ { string: "velutinum", rank: "var.",
198
+ authorship: "(Raf.) Britton f.",
199
+ combinationAuthorTeam: { authorTeam: "Britton f.",
200
+ author: ["Britton f."] }, basionymAuthorTeam: { authorTeam: "Raf.",
201
+ author: ["Raf."] } }]}],
202
202
  "Cerastium arvense ssp. velutinum var. velutinum (Raf.) Britton f."],
203
- ["Amelanchier arborea f. hirsuta (Michx. f.) Fernald",
204
- [{:infraspecies=>[{:basionymAuthorTeam=>{:author=>["Michx. f."],
205
- :authorTeam=>"Michx. f."}, :string=>"hirsuta", :rank=>"f.",
206
- :combinationAuthorTeam=>{:author=>["Fernald"], :authorTeam=>"Fernald"},
207
- :authorship=>"(Michx. f.) Fernald"}], :genus=>{:string=>"Amelanchier"},
208
- :species=>{:string=>"arborea"}}],
203
+ ["Amelanchier arborea f. hirsuta (Michx. f.) Fernald",
204
+ [{ infraspecies: [{ basionymAuthorTeam: { author: ["Michx. f."],
205
+ authorTeam: "Michx. f." }, string: "hirsuta", rank: "f.",
206
+ combinationAuthorTeam: { author: ["Fernald"], authorTeam: "Fernald" },
207
+ authorship: "(Michx. f.) Fernald" }], genus: { string: "Amelanchier"},
208
+ species: { string: "arborea" } }],
209
209
  "Amelanchier arborea f. hirsuta (Michx. f.) Fernald"],
210
- ["Betula pendula fo. dalecarlica (L. f.) C.K. Schneid.",
211
- [{:infraspecies=>[{:basionymAuthorTeam=>{:author=>["L. f."],
212
- :authorTeam=>"L. f."}, :string=>"dalecarlica", :rank=>"fo.",
213
- :combinationAuthorTeam=>{:author=>["C.K. Schneid."],
214
- :authorTeam=>"C.K. Schneid."}, :authorship=>"(L. f.) C.K. Schneid."}],
215
- :genus=>{:string=>"Betula"}, :species=>{:string=>"pendula"}}],
210
+ ["Betula pendula fo. dalecarlica (L. f.) C.K. Schneid.",
211
+ [{ infraspecies: [{ basionymAuthorTeam: { author: ["L. f."],
212
+ authorTeam: "L. f." }, string: "dalecarlica", rank: "fo.",
213
+ combinationAuthorTeam: { author: ["C.K. Schneid."],
214
+ authorTeam: "C.K. Schneid." }, authorship: "(L. f.) C.K. Schneid."}],
215
+ genus: { string: "Betula" }, species: { string: "pendula"} }],
216
216
  "Betula pendula fo. dalecarlica (L. f.) C.K. Schneid."],
217
- ["Racomitrium canescens f. ericoides (F. Weber ex Brid.) Mönk.",
218
- [{:genus=>{:string=>"Racomitrium"}, :species=>{:string=>"canescens"},
219
- :infraspecies=>[{:string=>"ericoides", :rank=>"f.",
220
- :authorship=>"(F. Weber ex Brid.) Mönk.",
221
- :combinationAuthorTeam=>{:authorTeam=>"Mönk.", :author=>["Mönk."]},
222
- :basionymAuthorTeam=>{:authorTeam=>"F. Weber",
223
- :author=>["F. Weber"], :exAuthorTeam=>{:authorTeam=>"Brid.",
224
- :author=>["Brid."]}}}]}],
217
+ ["Racomitrium canescens f. ericoides (F. Weber ex Brid.) Mönk.",
218
+ [{ genus: { string: "Racomitrium" }, species: { string: "canescens"},
219
+ infraspecies: [{ string: "ericoides", rank: "f.",
220
+ authorship: "(F. Weber ex Brid.) Mönk.",
221
+ combinationAuthorTeam: { authorTeam: "Mönk.", author: ["Mönk."] },
222
+ basionymAuthorTeam: { authorTeam: "F. Weber",
223
+ author: ["F. Weber"], exAuthorTeam: { authorTeam: "Brid.",
224
+ author: ["Brid."] } } }]}],
225
225
  "Racomitrium canescens f. ericoides (F. Weber ex Brid.) Mönk."],
226
- ["Racomitrium canescens forma ericoides (F. Weber ex Brid.) Mönk.",
227
- [{:genus=>{:string=>"Racomitrium"}, :species=>{:string=>"canescens"},
228
- :infraspecies=>[{:string=>"ericoides", :rank=>"forma",
229
- :authorship=>"(F. Weber ex Brid.) Mönk.",
230
- :combinationAuthorTeam=>{:authorTeam=>"Mönk.", :author=>["Mönk."]},
231
- :basionymAuthorTeam=>{:authorTeam=>"F. Weber", :author=>["F. Weber"],
232
- :exAuthorTeam=>{:authorTeam=>"Brid.", :author=>["Brid."]}}}]}],
226
+ ["Racomitrium canescens forma ericoides (F. Weber ex Brid.) Mönk.",
227
+ [{ genus: { string: "Racomitrium" }, species: { string: "canescens"},
228
+ infraspecies: [{ string: "ericoides", rank: "forma",
229
+ authorship: "(F. Weber ex Brid.) Mönk.",
230
+ combinationAuthorTeam: { authorTeam: "Mönk.", author: ["Mönk."] },
231
+ basionymAuthorTeam: { authorTeam: "F. Weber", author: ["F. Weber"],
232
+ exAuthorTeam: { authorTeam: "Brid.", author: ["Brid."] } } }]}],
233
233
  "Racomitrium canescens forma ericoides (F. Weber ex Brid.) Mönk."],
234
- ["Peristernia nassatula forskali Tapparone-Canefri 1875",
235
- [{:genus=>{:string=>"Peristernia"}, :species=>{:string=>"nassatula"},
236
- :infraspecies=>[{:string=>"forskali", :rank=>"n/a",
237
- :authorship=>"Tapparone-Canefri 1875", :basionymAuthorTeam=>{
238
- :authorTeam=>"Tapparone-Canefri", :author=>["Tapparone-Canefri"],
239
- :year=>"1875"}}]}],
234
+ ["Peristernia nassatula forskali Tapparone-Canefri 1875",
235
+ [{ genus: { string: "Peristernia" }, species: { string: "nassatula"},
236
+ infraspecies: [{ string: "forskali", rank: "n/a",
237
+ authorship: "Tapparone-Canefri 1875", basionymAuthorTeam: {
238
+ authorTeam: "Tapparone-Canefri", author: ["Tapparone-Canefri"],
239
+ year: "1875" } }]}],
240
240
  "Peristernia nassatula forskali Tapparone-Canefri 1875"],
241
241
  ]
242
242
  names.each do |sn, sn_details, sn_value|
@@ -246,27 +246,27 @@ describe ScientificNameClean do
246
246
  end
247
247
  end
248
248
 
249
- it 'parses genus with "?"' do
249
+ it "parses genus with '?'" do
250
250
  sn = "Ferganoconcha? oblonga"
251
251
  expect(parse(sn)).to_not be_nil
252
252
  expect(value(sn)).to eq "Ferganoconcha oblonga"
253
- expect(details(sn)).to eq [{:genus=>{:string=>"Ferganoconcha"},
254
- :species=>{:string=>"oblonga"}}]
255
- expect(pos(sn)).to eq({0=>["genus", 14], 15=>["species", 22]})
253
+ expect(details(sn)).to eq [{ genus: { string: "Ferganoconcha" },
254
+ species: { string: "oblonga" } }]
255
+ expect(pos(sn)).to eq({ 0 => ["genus", 14], 15 => ["species", 22] })
256
256
  end
257
257
 
258
- it 'parses æ in the name' do
258
+ it "parses æ in the name" do
259
259
  names = [
260
260
  ["Læptura laetifica Dow, 1913", "Laeptura laetifica Dow 1913"],
261
261
  ["Leptura lætifica Dow, 1913", "Leptura laetifica Dow 1913"],
262
262
  ["Leptura leætifica Dow, 1913", "Leptura leaetifica Dow 1913"],
263
263
  ["Leæptura laetifica Dow, 1913", "Leaeptura laetifica Dow 1913"],
264
264
  ["Leœptura laetifica Dow, 1913", "Leoeptura laetifica Dow 1913"],
265
- ['Ærenea cognata Lacordaire, 1872', 'Aerenea cognata Lacordaire 1872'],
266
- ['Œdicnemus capensis', 'Oedicnemus capensis'],
267
- ['Œnanthæ œnanthe','Oenanthae oenanthe'],
268
- ['Œnanthe œnanthe','Oenanthe oenanthe'],
269
- ['Cerambyx thomæ Gmelin J. F., 1790', 'Cerambyx thomae Gmelin J. F. 1790']
265
+ ["Ærenea cognata Lacordaire, 1872", "Aerenea cognata Lacordaire 1872"],
266
+ ["Œdicnemus capensis", "Oedicnemus capensis"],
267
+ ["Œnanthæ œnanthe","Oenanthae oenanthe"],
268
+ ["Œnanthe œnanthe","Oenanthe oenanthe"],
269
+ ["Cerambyx thomæ Gmelin J. F., 1790", "Cerambyx thomae Gmelin J. F. 1790"]
270
270
  ]
271
271
  names.each do |name_pair|
272
272
  expect(parse(name_pair[0])).to_not be_nil
@@ -274,64 +274,64 @@ describe ScientificNameClean do
274
274
  end
275
275
  end
276
276
 
277
- it 'parses names with e-umlaut' do
278
- sn = 'Kalanchoë tuberosa'
279
- expect(canonical(sn)).to eq 'Kalanchoe tuberosa'
280
- sn = 'Isoëtes asplundii H. P. Fuchs'
281
- expect(canonical(sn)).to eq 'Isoetes asplundii'
277
+ it "parses names with e-umlaut" do
278
+ sn = "Kalanchoë tuberosa"
279
+ expect(canonical(sn)).to eq "Kalanchoe tuberosa"
280
+ sn = "Isoëtes asplundii H. P. Fuchs"
281
+ expect(canonical(sn)).to eq "Isoetes asplundii"
282
282
  end
283
283
 
284
- it 'parses infragenus (ICZN code)' do
284
+ it "parses infragenus (ICZN code)" do
285
285
  sn = "Hegeter (Hegeter) intercedens Lindberg H 1950"
286
286
  expect(parse(sn)).to_not be_nil
287
287
  expect(value(sn)).to eq "Hegeter (Hegeter) intercedens Lindberg H 1950"
288
288
  expect(canonical(sn)).to eq "Hegeter intercedens"
289
- expect(details(sn)).to eq [{:genus=>{:string=>"Hegeter"},
290
- :infragenus=>{:string=>"Hegeter"}, :species=>{:string=>"intercedens",
291
- :authorship=>"Lindberg H 1950",
292
- :basionymAuthorTeam=>{:authorTeam=>"Lindberg H",
293
- :author=>["Lindberg H"], :year=>"1950"}}}]
294
- expect(pos(sn)).to eq({0=>["genus", 7], 9=>["infragenus", 16],
295
- 18=>["species", 29], 30=>["author_word", 38],
296
- 39=>["author_word", 40], 41=>["year", 45]})
289
+ expect(details(sn)).to eq [{ genus: { string: "Hegeter" },
290
+ infragenus: { string: "Hegeter" }, species: { string: "intercedens",
291
+ authorship: "Lindberg H 1950",
292
+ basionymAuthorTeam: { authorTeam: "Lindberg H",
293
+ author: ["Lindberg H"], year: "1950" } } }]
294
+ expect(pos(sn)).to eq({ 0 => ["genus", 7], 9 => ["infragenus", 16],
295
+ 18 => ["species", 29], 30 => ["author_word", 38],
296
+ 39 => ["author_word", 40], 41 => ["year", 45] })
297
297
  sn = "Ixodes (Ixodes) hexagonus hexagonus Neumann, 1911"
298
298
  expect(canonical(sn)).to eq "Ixodes hexagonus hexagonus"
299
299
  sn = "Brachytrypus (B.) grandidieri"
300
300
  expect(canonical(sn)).to eq "Brachytrypus grandidieri"
301
- expect(details(sn)).to eq [{:genus=>{:string=>"Brachytrypus"},
302
- :infragenus=>{:string=>"B."}, :species=>{:string=>"grandidieri"}}]
301
+ expect(details(sn)).to eq [{ genus: { string: "Brachytrypus" },
302
+ infragenus: { string: "B." }, species: { string: "grandidieri"} }]
303
303
  sn = "Empis (Argyrandrus) Bezzi 1909"
304
- expect(details(sn)).to eq [{:uninomial=>{:string=>"Empis",
305
- :infragenus=>{:string=>"Argyrandrus"}, :authorship=>"Bezzi 1909",
306
- :basionymAuthorTeam=>{:authorTeam=>"Bezzi",
307
- :author=>["Bezzi"], :year=>"1909"}}}]
304
+ expect(details(sn)).to eq [{ uninomial: { string: "Empis",
305
+ infragenus: { string: "Argyrandrus" }, authorship: "Bezzi 1909",
306
+ basionymAuthorTeam: { authorTeam: "Bezzi",
307
+ author: ["Bezzi"], year: "1909" } } }]
308
308
  sn = "Platydoris (Bergh )"
309
- expect(details(sn)).to eq [{:uninomial=>{:string=>"Platydoris",
310
- :infragenus=>{:string=>"Bergh"}}}]
309
+ expect(details(sn)).to eq [{ uninomial: { string: "Platydoris",
310
+ infragenus: { string: "Bergh" } } }]
311
311
  expect(value(sn)).to eq "Platydoris (Bergh)"
312
312
  sn = "Platydoris (B.)"
313
- expect(details(sn)).to eq [{:uninomial=>{:string=>"Platydoris",
314
- :infragenus=>{:string=>"B."}}}]
313
+ expect(details(sn)).to eq [{ uninomial: { string: "Platydoris",
314
+ infragenus: { string: "B." } } }]
315
315
  end
316
316
 
317
- it 'parses several authors without a year' do
317
+ it "parses several authors without a year" do
318
318
  sn = "Pseudocercospora dendrobii U. Braun & Crous"
319
319
  expect(parse(sn)).to_not be be_nil
320
320
  expect(value(sn)).to eq "Pseudocercospora dendrobii U. Braun & Crous"
321
321
  expect(canonical(sn)).to eq "Pseudocercospora dendrobii"
322
- expect(details(sn)).to eq [{:genus=>{:string=>"Pseudocercospora"},
323
- :species=>{:string=>"dendrobii", :authorship=>"U. Braun & Crous",
324
- :basionymAuthorTeam=>{:authorTeam=>"U. Braun & Crous",
325
- :author=>["U. Braun", "Crous"]}}}]
326
- expect(pos(sn)).to eq({0=>["genus", 16], 17=>["species", 26],
327
- 27=>["author_word", 29], 30=>["author_word", 35],
328
- 38=>["author_word", 43]})
322
+ expect(details(sn)).to eq [{ genus: { string: "Pseudocercospora" },
323
+ species: { string: "dendrobii", authorship: "U. Braun & Crous",
324
+ basionymAuthorTeam: { authorTeam: "U. Braun & Crous",
325
+ author: ["U. Braun", "Crous"] } } }]
326
+ expect(pos(sn)).to eq({ 0 => ["genus", 16], 17 => ["species", 26],
327
+ 27 => ["author_word", 29], 30 => ["author_word", 35],
328
+ 38 => ["author_word", 43] })
329
329
  sn = "Pseudocercospora dendrobii U. Braun and Crous"
330
330
  expect(parse(sn)).to_not be_nil
331
331
  expect(value(sn)).to eq "Pseudocercospora dendrobii U. Braun & Crous"
332
- expect(pos(sn)).to eq({0=>["genus", 16], 17=>["species", 26],
333
- 27=>["author_word", 29], 30=>["author_word", 35],
334
- 40=>["author_word", 45]})
332
+ expect(pos(sn)).to eq({ 0 => ["genus", 16], 17 => ["species", 26],
333
+ 27 => ["author_word", 29], 30 => ["author_word", 35],
334
+ 40 => ["author_word", 45] })
335
335
  sn = "Pseudocercospora dendrobii U. Braun et Crous"
336
336
  expect(parse(sn)).to_not be_nil
337
337
  expect(value(sn)).to eq "Pseudocercospora dendrobii U. Braun & Crous"
@@ -339,139 +339,140 @@ describe ScientificNameClean do
339
339
  expect(parse(sn)).to_not be_nil
340
340
  expect(value(sn)).to eq "Arthopyrenia hyalospora (Nyl.) R.C. Harris"
341
341
  expect(canonical(sn)).to eq "Arthopyrenia hyalospora"
342
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"},
343
- :species=>{:string=>"hyalospora", :authorship=>"(Nyl.)R.C. Harris",
344
- :combinationAuthorTeam=>{:authorTeam=>"R.C. Harris",
345
- :author=>["R.C. Harris"]},
346
- :basionymAuthorTeam=>{:authorTeam=>"Nyl.", :author=>["Nyl."]}}}]
342
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
343
+ species: { string: "hyalospora", authorship: "(Nyl.)R.C. Harris",
344
+ combinationAuthorTeam: { authorTeam: "R.C. Harris",
345
+ author: ["R.C. Harris"] },
346
+ basionymAuthorTeam: { authorTeam: "Nyl.", author: ["Nyl."] } } }]
347
347
  end
348
348
 
349
- it 'parses several authors with a year' do
349
+ it "parses several authors with a year" do
350
350
  sn = "Pseudocercospora dendrobii U. Braun & Crous 2003"
351
351
  expect(parse(sn)).to_not be_nil
352
352
  expect(value(sn)).to eq "Pseudocercospora dendrobii U. Braun & Crous 2003"
353
353
  expect(canonical(sn)).to eq "Pseudocercospora dendrobii"
354
- expect(details(sn)).to eq [{:genus=>{:string=>"Pseudocercospora"},
355
- :species=>{:string=>"dendrobii", :authorship=>"U. Braun & Crous 2003",
356
- :basionymAuthorTeam=>{:authorTeam=>"U. Braun & Crous",
357
- :author=>["U. Braun", "Crous"], :year=>"2003"}}}]
358
- expect(pos(sn)).to eq({0=>["genus", 16], 17=>["species", 26],
359
- 27=>["author_word", 29], 30=>["author_word", 35],
360
- 38=>["author_word", 43], 44=>["year", 48]})
354
+ expect(details(sn)).to eq [{ genus: { string: "Pseudocercospora" },
355
+ species: { string: "dendrobii", authorship: "U. Braun & Crous 2003",
356
+ basionymAuthorTeam: { authorTeam: "U. Braun & Crous",
357
+ author: ["U. Braun", "Crous"], year: "2003" } } }]
358
+ expect(pos(sn)).to eq({ 0 => ["genus", 16], 17 => ["species", 26],
359
+ 27 => ["author_word", 29], 30 => ["author_word", 35],
360
+ 38 => ["author_word", 43], 44 => ["year", 48] })
361
361
  sn = "Pseudocercospora dendrobii Crous, 2003"
362
362
  expect(parse(sn)).to_not be_nil
363
363
  end
364
364
 
365
- it 'parses basionym authors in parenthesis' do
365
+ it "parses basionym authors in parenthesis" do
366
366
  sn = "Zophosis persis (Chatanay, 1914)"
367
367
  expect(parse(sn)).to_not be_nil
368
- expect(details(sn)).to eq [{:genus=>{:string=>"Zophosis"},
369
- :species=>{:string=>"persis", :authorship=>"(Chatanay, 1914)",
370
- :basionymAuthorTeam=>{:authorTeam=>"Chatanay",
371
- :author=>["Chatanay"], :year=>"1914"}}}]
368
+ expect(details(sn)).to eq [{ genus: { string: "Zophosis" },
369
+ species: { string: "persis", authorship: "(Chatanay, 1914)",
370
+ basionymAuthorTeam: { authorTeam: "Chatanay",
371
+ author: ["Chatanay"], year: "1914" } } }]
372
372
  sn = "Zophosis persis (Chatanay 1914)"
373
373
  expect(parse(sn)).to_not be_nil
374
- expect(details(sn)).to eq [{:genus=>{:string=>"Zophosis"},
375
- :species=>{:string=>"persis", :authorship=>"(Chatanay 1914)",
376
- :basionymAuthorTeam=>{:authorTeam=>"Chatanay",
377
- :author=>["Chatanay"], :year=>"1914"}}}]
374
+ expect(details(sn)).to eq [{ genus: { string: "Zophosis" },
375
+ species: { string: "persis", authorship: "(Chatanay 1914)",
376
+ basionymAuthorTeam: { authorTeam: "Chatanay",
377
+ author: ["Chatanay"], year: "1914" } } }]
378
378
  sn = "Zophosis persis (Chatanay), 1914"
379
379
  expect(parse(sn)).to_not be_nil
380
380
  expect(value(sn)).to eq "Zophosis persis (Chatanay 1914)"
381
- expect(details(sn)).to eq [{:genus=>{:string=>"Zophosis"},
382
- :species=>{:string=>"persis", :authorship=>"(Chatanay), 1914",
383
- :basionymAuthorTeam=>{:author_team=>"(Chatanay), 1914",
384
- :author=>["Chatanay"], :year=>"1914"}}}]
385
- expect(pos(sn)).to eq({0=>["genus", 8], 9=>["species", 15],
386
- 17=>["author_word", 25], 28=>["year", 32]})
381
+ expect(details(sn)).to eq [{ genus: { string: "Zophosis" },
382
+ species: { string: "persis", authorship: "(Chatanay), 1914",
383
+ basionymAuthorTeam: { author_team: "(Chatanay), 1914",
384
+ author: ["Chatanay"], year: "1914" } } }]
385
+ expect(pos(sn)).to eq({ 0 => ["genus", 8], 9 => ["species", 15],
386
+ 17 => ["author_word", 25], 28 => ["year", 32] })
387
387
  expect(parse("Zophosis persis (Chatanay) 1914")).to_not be_nil
388
388
  #parse("Zophosis persis Chatanay (1914)")).to_not be_nil
389
389
  end
390
390
 
391
391
  it "parses name with identificaation annotation -- aff cf sp spp" do
392
- sn = 'Diplocephalus aff. procerus Thaler, 1972'
393
- expect(details(sn)).to eq [{:genus=>{:string=>"Diplocephalus"},
394
- :annotation_identification=>"aff.",
395
- :ignored=>{:species=>{:string=>"procerus", :authorship=>"Thaler, 1972",
396
- :basionymAuthorTeam=>{:authorTeam=>"Thaler",
397
- :author=>["Thaler"], :year=>"1972"}}}}]
398
- sn = 'Diplocephalus aff procerus Thaler, 1972'
399
- expect(details(sn)).to eq [{:genus=>{:string=>"Diplocephalus"},
400
- :annotation_identification=>"aff", :ignored=>{:species=>
401
- {:string=>"procerus", :authorship=>"Thaler, 1972",
402
- :basionymAuthorTeam=>{:authorTeam=>"Thaler",
403
- :author=>["Thaler"], :year=>"1972"}}}}]
404
- sn = 'Diplocephalus affprocerus Thaler, 1972'
405
- expect(details(sn)).to eq [{:genus=>{:string=>"Diplocephalus"},
406
- :species=>{:string=>"affprocerus", :authorship=>"Thaler, 1972",
407
- :basionymAuthorTeam=>{:authorTeam=>"Thaler",
408
- :author=>["Thaler"], :year=>"1972"}}}]
409
- sn = 'Diplocephalus cf. procerus Thaler, 1972'
410
- expect(details(sn)).to eq [{:genus=>{:string=>"Diplocephalus"},
411
- :annotation_identification=>"cf.", :species=>{:species=>
412
- {:string=>"procerus", :authorship=>"Thaler, 1972",
413
- :basionymAuthorTeam=>{:authorTeam=>"Thaler",
414
- :author=>["Thaler"], :year=>"1972"}}}}]
415
- sn = 'Diplocephalus cf procerus Thaler, 1972'
416
- expect(details(sn)).to eq [{:genus=>{:string=>"Diplocephalus"},
417
- :annotation_identification=>"cf", :species=>
418
- {:species=>{:string=>"procerus", :authorship=>"Thaler, 1972",
419
- :basionymAuthorTeam=>{:authorTeam=>"Thaler",
420
- :author=>["Thaler"], :year=>"1972"}}}}]
421
- sn = 'Sphingomonas sp. 37'
422
- expect(details(sn)).to eq [{:genus=>{:string=>"Sphingomonas"},
423
- :annotation_identification=>"sp.", :ignored=>{:unparsed=>"37"}}]
392
+ sn = "Diplocephalus aff. procerus Thaler, 1972"
393
+ expect(details(sn)).to eq [{ genus: { string: "Diplocephalus" },
394
+ annotation_identification: "aff.",
395
+ ignored: { species: { string: "procerus", authorship: "Thaler, 1972",
396
+ basionymAuthorTeam: { authorTeam: "Thaler",
397
+ author: ["Thaler"], year: "1972" } } } }]
398
+ sn = "Diplocephalus aff procerus Thaler, 1972"
399
+ expect(details(sn)).to eq [{ genus: { string: "Diplocephalus" },
400
+ annotation_identification: "aff", ignored: { species:
401
+ { string: "procerus", authorship: "Thaler, 1972",
402
+ basionymAuthorTeam: { authorTeam: "Thaler",
403
+ author: ["Thaler"], year: "1972" } } } }]
404
+ sn = "Diplocephalus affprocerus Thaler, 1972"
405
+ expect(details(sn)).to eq [{ genus: { string: "Diplocephalus" },
406
+ species: { string: "affprocerus", authorship: "Thaler, 1972",
407
+ basionymAuthorTeam: { authorTeam: "Thaler",
408
+ author: ["Thaler"], year: "1972" } } }]
409
+ sn = "Diplocephalus cf. procerus Thaler, 1972"
410
+ expect(details(sn)).to eq [{ genus: { string: "Diplocephalus" },
411
+ annotation_identification: "cf.", species: { species:
412
+ { string: "procerus", authorship: "Thaler, 1972",
413
+ basionymAuthorTeam: { authorTeam: "Thaler",
414
+ author: ["Thaler"], year: "1972" } } } }]
415
+ sn = "Diplocephalus cf procerus Thaler, 1972"
416
+ expect(details(sn)).to eq [{ genus: { string: "Diplocephalus" },
417
+ annotation_identification: "cf", species:
418
+ { species: { string: "procerus", authorship: "Thaler, 1972",
419
+ basionymAuthorTeam: { authorTeam: "Thaler",
420
+ author: ["Thaler"], year: "1972" } } } }]
421
+ sn = "Sphingomonas sp. 37"
422
+ expect(details(sn)).to eq [{ genus: { string: "Sphingomonas" },
423
+ annotation_identification: "sp.", ignored: { unparsed: "37" } }]
424
424
  sn = "Thryothorus leucotis spp. bogotensis"
425
- expect(details(sn)).to eq [{:genus=>{:string=>"Thryothorus"},
426
- :species=>{:string=>"leucotis"}, :infraspecies=>
427
- [{:annotation_identification=>"spp.",
428
- :ignored=>{:infraspecies=>{:string=>"bogotensis", :rank=>"n/a"}}}]}]
425
+ expect(details(sn)).to eq [{ genus: { string: "Thryothorus" },
426
+ species: { string: "leucotis" }, infraspecies:
427
+ [{ annotation_identification: "spp.",
428
+ ignored: { infraspecies: { string: "bogotensis", rank: "n/a" } } }]}]
429
429
  end
430
430
 
431
- it 'parses scientific name' do
431
+ it "parses scientific name" do
432
432
  sn = "Pseudocercospora dendrobii(H.C. Burnett)U. Braun & Crous 2003"
433
433
  expect(parse(sn)).to_not be_nil
434
434
  expect(value(sn)).to eq "Pseudocercospora dendrobii (H.C. Burnett) "\
435
435
  "U. Braun & Crous 2003"
436
436
  expect(canonical(sn)).to eq "Pseudocercospora dendrobii"
437
- expect(details(sn)).to eq [{:genus=>{:string=>"Pseudocercospora"},
438
- :species=>{:string=>"dendrobii",
439
- :authorship=>"(H.C. Burnett)U. Braun & Crous 2003",
440
- :combinationAuthorTeam=>{:authorTeam=>"U. Braun & Crous",
441
- :author=>["U. Braun", "Crous"], :year=>"2003"},
442
- :basionymAuthorTeam=>{:authorTeam=>"H.C. Burnett",
443
- :author=>["H.C. Burnett"]}}}]
437
+ expect(details(sn)).to eq [{ genus: { string: "Pseudocercospora" },
438
+ species: { string: "dendrobii",
439
+ authorship: "(H.C. Burnett)U. Braun & Crous 2003",
440
+ combinationAuthorTeam: { authorTeam: "U. Braun & Crous",
441
+ author: ["U. Braun", "Crous"], year: "2003" },
442
+ basionymAuthorTeam: { authorTeam: "H.C. Burnett",
443
+ author: ["H.C. Burnett"] } } }]
444
444
  sn = "Pseudocercospora dendrobii(H.C. Burnett,1873)"\
445
445
  "U. Braun & Crous 2003"
446
446
  expect(parse(sn)).to_not be_nil
447
447
  expect(value(sn)).to eq "Pseudocercospora dendrobii (H.C. Burnett 1873) "\
448
448
  "U. Braun & Crous 2003"
449
- expect(details(sn)).to eq [{:genus=>{:string=>"Pseudocercospora"},
450
- :species=>{:string=>"dendrobii",
451
- :authorship=>"(H.C. Burnett,1873)U. Braun & Crous 2003",
452
- :combinationAuthorTeam=>{:authorTeam=>"U. Braun & Crous",
453
- :author=>["U. Braun", "Crous"], :year=>"2003"},
454
- :basionymAuthorTeam=>{:authorTeam=>"H.C. Burnett",
455
- :author=>["H.C. Burnett"], :year=>"1873"}}}]
449
+ expect(details(sn)).to eq [{ genus: { string: "Pseudocercospora" },
450
+ species: { string: "dendrobii",
451
+ authorship: "(H.C. Burnett,1873)U. Braun & Crous 2003",
452
+ combinationAuthorTeam: { authorTeam: "U. Braun & Crous",
453
+ author: ["U. Braun", "Crous"], year: "2003" },
454
+ basionymAuthorTeam: { authorTeam: "H.C. Burnett",
455
+ author: ["H.C. Burnett"], year: "1873" } } }]
456
456
  end
457
457
 
458
- it 'parses several authors with several years' do
458
+ it "parses several authors with several years" do
459
459
  sn = "Pseudocercospora dendrobii (H.C. Burnett 1883) U. Braun & Crous 2003"
460
460
  expect(parse(sn)).to_not be_nil
461
461
  expect(value(sn)).to eq "Pseudocercospora dendrobii (H.C. Burnett 1883) "\
462
462
  "U. Braun & Crous 2003"
463
463
  expect(canonical(sn)).to eq "Pseudocercospora dendrobii"
464
- expect(details(sn)).to eq [{:genus=>{:string=>"Pseudocercospora"},
465
- :species=>{:string=>"dendrobii",
466
- :authorship=>"(H.C. Burnett 1883) U. Braun & Crous 2003",
467
- :combinationAuthorTeam=>{:authorTeam=>"U. Braun & Crous",
468
- :author=>["U. Braun", "Crous"], :year=>"2003"},
469
- :basionymAuthorTeam=>{:authorTeam=>"H.C. Burnett",
470
- :author=>["H.C. Burnett"], :year=>"1883"}}}]
471
- expect(pos(sn)).to eq({0=>["genus", 16], 17=>["species", 26],
472
- 28=>["author_word", 32], 33=>["author_word", 40],
473
- 41=>["year", 45], 47=>["author_word", 49],
474
- 50=>["author_word", 55], 58=>["author_word", 63], 64=>["year", 68]})
464
+ expect(details(sn)).to eq [{ genus: { string: "Pseudocercospora" },
465
+ species: { string: "dendrobii",
466
+ authorship: "(H.C. Burnett 1883) U. Braun & Crous 2003",
467
+ combinationAuthorTeam: { authorTeam: "U. Braun & Crous",
468
+ author: ["U. Braun", "Crous"], year: "2003" },
469
+ basionymAuthorTeam: { authorTeam: "H.C. Burnett",
470
+ author: ["H.C. Burnett"], year: "1883" } } }]
471
+ expect(pos(sn)).to eq({ 0 => ["genus", 16], 17 => ["species", 26],
472
+ 28 => ["author_word", 32], 33 => ["author_word", 40],
473
+ 41 => ["year", 45], 47 => ["author_word", 49],
474
+ 50 => ["author_word", 55], 58 => ["author_word", 63],
475
+ 64 => ["year", 68] })
475
476
  end
476
477
 
477
478
  it "parses name with subspecies without rank Zoological Code" do
@@ -480,57 +481,59 @@ describe ScientificNameClean do
480
481
  expect(value(sn)).to eq "Hydnellum scrobiculatum zonatum (Banker) "\
481
482
  "D. Hall & D.E. Stuntz 1972"
482
483
  expect(canonical(sn)).to eq "Hydnellum scrobiculatum zonatum"
483
- expect(details(sn)).to eq [{:genus=>{:string=>"Hydnellum"},
484
- :species=>{:string=>"scrobiculatum"},
485
- :infraspecies=>[{:string=>"zonatum", :rank=>"n/a",
486
- :authorship=>"(Banker) D. Hall & D.E. Stuntz 1972",
487
- :combinationAuthorTeam=>{:authorTeam=>"D. Hall & D.E. Stuntz",
488
- :author=>["D. Hall", "D.E. Stuntz"], :year=>"1972"},
489
- :basionymAuthorTeam=>{:authorTeam=>"Banker", :author=>["Banker"]}}]}]
490
- expect(pos(sn)).to eq({0=>["genus", 9], 10=>["species", 23],
491
- 24=>["infraspecies", 31], 33=>["author_word", 39],
492
- 41=>["author_word", 43], 44=>["author_word", 48],
493
- 51=>["author_word", 55], 56=>["author_word", 62], 63=>["year", 67]})
484
+ expect(details(sn)).to eq [{ genus: { string: "Hydnellum" },
485
+ species: { string: "scrobiculatum" },
486
+ infraspecies: [{ string: "zonatum", rank: "n/a",
487
+ authorship: "(Banker) D. Hall & D.E. Stuntz 1972",
488
+ combinationAuthorTeam: { authorTeam: "D. Hall & D.E. Stuntz",
489
+ author: ["D. Hall", "D.E. Stuntz"], year: "1972" },
490
+ basionymAuthorTeam: { authorTeam: "Banker", author: ["Banker"] } }]}]
491
+ expect(pos(sn)).to eq({ 0 => ["genus", 9], 10 => ["species", 23],
492
+ 24 => ["infraspecies", 31], 33 => ["author_word", 39],
493
+ 41 => ["author_word", 43], 44 => ["author_word", 48],
494
+ 51 => ["author_word", 55], 56 => ["author_word", 62],
495
+ 63 => ["year", 67] })
494
496
  sn = "Begonia pingbienensis angustior"
495
497
  expect(parse(sn)).to_not be_nil
496
- expect(details(sn)).to eq [{:genus=>{:string=>"Begonia"},
497
- :species=>{:string=>"pingbienensis"},
498
- :infraspecies=>[{:string=>"angustior", :rank=>"n/a"}]}]
499
- expect(pos(sn)).to eq({0=>["genus", 7],
500
- 8=>["species", 21], 22=>["infraspecies", 31]})
498
+ expect(details(sn)).to eq [{ genus: { string: "Begonia" },
499
+ species: { string: "pingbienensis" },
500
+ infraspecies: [{ string: "angustior", rank: "n/a" }]}]
501
+ expect(pos(sn)).to eq({ 0 => ["genus", 7],
502
+ 8 => ["species", 21], 22 => ["infraspecies", 31] })
501
503
  end
502
504
 
503
- it 'parses infraspecies with rank' do
505
+ it "parses infraspecies with rank" do
504
506
  sn = "Aus bus Linn. var. bus"
505
507
  expect(parse(sn)).to_not be_nil
506
- expect(details(sn)).to eq [{:genus=>{:string=>"Aus"},
507
- :species=>{:string=>"bus", :authorship=>"Linn.",
508
- :basionymAuthorTeam=>{:authorTeam=>"Linn.",
509
- :author=>["Linn."]}}, :infraspecies=>[{:string=>"bus", :rank=>"var."}]}]
508
+ expect(details(sn)).to eq [{ genus: { string: "Aus" },
509
+ species: { string: "bus", authorship: "Linn.",
510
+ basionymAuthorTeam: { authorTeam: "Linn.",
511
+ author: ["Linn."] } }, infraspecies: [{ string: "bus", rank: "var."}]}]
510
512
  sn = "Agalinis purpurea (L.) Briton var. borealis (Berg.) Peterson 1987"
511
513
  expect(parse(sn)).to_not be_nil
512
- expect(details(sn)).to eq [{:genus=>{:string=>"Agalinis"},
513
- :species=>{:string=>"purpurea", :authorship=>"(L.) Briton",
514
- :combinationAuthorTeam=>{:authorTeam=>"Briton", :author=>["Briton"]},
515
- :basionymAuthorTeam=>{:authorTeam=>"L.",
516
- :author=>["L."]}}, :infraspecies=>[{:string=>"borealis",
517
- :rank=>"var.", :authorship=>"(Berg.) Peterson 1987",
518
- :combinationAuthorTeam=>{:authorTeam=>"Peterson",
519
- :author=>["Peterson"], :year=>"1987"},
520
- :basionymAuthorTeam=>{:authorTeam=>"Berg.", :author=>["Berg."]}}]}]
521
- expect(pos(sn)).to eq({0=>["genus", 8], 9=>["species", 17],
522
- 19=>["author_word", 21], 23=>["author_word", 29],
523
- 30=>["infraspecific_type", 34], 35=>["infraspecies", 43],
524
- 45=>["author_word", 50], 52=>["author_word", 60], 61=>["year", 65]})
514
+ expect(details(sn)).to eq [{ genus: { string: "Agalinis" },
515
+ species: { string: "purpurea", authorship: "(L.) Briton",
516
+ combinationAuthorTeam: { authorTeam: "Briton", author: ["Briton"] },
517
+ basionymAuthorTeam: { authorTeam: "L.",
518
+ author: ["L."] } }, infraspecies: [{ string: "borealis",
519
+ rank: "var.", authorship: "(Berg.) Peterson 1987",
520
+ combinationAuthorTeam: { authorTeam: "Peterson",
521
+ author: ["Peterson"], year: "1987" },
522
+ basionymAuthorTeam: { authorTeam: "Berg.", author: ["Berg."] } }]}]
523
+ expect(pos(sn)).to eq({ 0 => ["genus", 8], 9 => ["species", 17],
524
+ 19 => ["author_word", 21], 23 => ["author_word", 29],
525
+ 30 => ["infraspecific_type", 34], 35 => ["infraspecies", 43],
526
+ 45 => ["author_word", 50], 52 => ["author_word", 60],
527
+ 61 => ["year", 65] })
525
528
  sn = "Phaeographis inusta var. macularis(Leight.) A.L. Sm. 1861"
526
529
  expect(parse(sn)).to_not be_nil
527
530
  expect(value(sn)).to eq "Phaeographis inusta var. macularis (Leight.) "\
528
531
  "A.L. Sm. 1861"
529
532
  expect(canonical(sn)).to eq "Phaeographis inusta macularis"
530
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 19],
531
- 20=>["infraspecific_type", 24], 25=>["infraspecies", 34],
532
- 35=>["author_word", 42], 44=>["author_word", 48],
533
- 49=>["author_word", 52], 53=>["year", 57]})
533
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 19],
534
+ 20 => ["infraspecific_type", 24], 25 => ["infraspecies", 34],
535
+ 35 => ["author_word", 42], 44 => ["author_word", 48],
536
+ 49 => ["author_word", 52], 53 => ["year", 57] })
534
537
  sn = "Cassytha peninsularis J. Z. Weber var. flindersii"
535
538
  expect(canonical(sn)).to eq "Cassytha peninsularis flindersii"
536
539
  sn = "Prunus armeniaca convar. budae (Pénzes) Soó"
@@ -553,60 +556,79 @@ describe ScientificNameClean do
553
556
  expect(canonical(sn)).to eq "Polypodium pectinatum thisisjunk"
554
557
  end
555
558
 
556
- it 'parsex unknown original authors (auct.)/(hort.)/(?)' do
559
+ it "parsex unknown original authors (auct.)/(hort.)/(?)" do
557
560
  sn = "Tragacantha leporina (?) Kuntze"
558
561
  expect(parse(sn)).to_not be_nil
559
562
  expect(value(sn)).to eq "Tragacantha leporina (?) Kuntze"
560
- expect(details(sn)).to eq [{:genus=>{:string=>"Tragacantha"},
561
- :species=>{:string=>"leporina", :authorship=>"(?) Kuntze",
562
- :combinationAuthorTeam=>{:authorTeam=>"Kuntze", :author=>["Kuntze"]},
563
- :basionymAuthorTeam=>{:authorTeam=>"(?)", :author=>["?"]}}}]
563
+ expect(details(sn)).to eq [{ genus: { string: "Tragacantha" },
564
+ species: { string: "leporina", authorship: "(?) Kuntze",
565
+ combinationAuthorTeam: { authorTeam: "Kuntze", author: ["Kuntze"] },
566
+ basionymAuthorTeam: { authorTeam: "(?)", author: ["?"] } } }]
564
567
  sn = "Lachenalia tricolor var. nelsonii (auct.) Baker"
565
568
  expect(parse(sn)).to_not be_nil
566
569
  expect(value(sn)).to eq "Lachenalia tricolor var. nelsonii (auct.) Baker"
567
- expect(details(sn)).to eq [{:genus=>{:string=>"Lachenalia"},
568
- :species=>{:string=>"tricolor"}, :infraspecies=>[{:string=>"nelsonii",
569
- :rank=>"var.", :authorship=>"(auct.) Baker",
570
- :combinationAuthorTeam=>{:authorTeam=>"Baker",
571
- :author=>["Baker"]}, :basionymAuthorTeam=>
572
- {:authorTeam=>"auct.", :author=>["unknown"]}}]}]
573
- expect(pos(sn)).to eq({0=>["genus", 10], 11=>["species", 19],
574
- 20=>["infraspecific_type", 24], 25=>["infraspecies", 33],
575
- 35=>["unknown_author", 40], 42=>["author_word", 47]})
576
- end
577
-
578
- it 'parses unknown authors auct./anon./hort./ht.' do
570
+ expect(details(sn)).to eq [{ genus: { string: "Lachenalia" },
571
+ species: { string: "tricolor" }, infraspecies: [{ string: "nelsonii",
572
+ rank: "var.", authorship: "(auct.) Baker",
573
+ combinationAuthorTeam: { authorTeam: "Baker",
574
+ author: ["Baker"] }, basionymAuthorTeam:
575
+ { authorTeam: "auct.", author: ["unknown"] } }]}]
576
+ expect(pos(sn)).to eq({ 0 => ["genus", 10], 11 => ["species", 19],
577
+ 20 => ["infraspecific_type", 24], 25 => ["infraspecies", 33],
578
+ 35 => ["unknown_author", 40], 42 => ["author_word", 47] })
579
+ end
580
+
581
+ it "parses unknown authors auct./anon./hort./ht." do
579
582
  sn = "Puya acris ht."
580
583
  expect(parse(sn)).to_not be_nil
581
- expect(pos(sn)).to eq({0=>["genus", 4], 5=>["species", 10],
582
- 11=>["unknown_author", 14]})
584
+ expect(pos(sn)).to eq({ 0 => ["genus", 4], 5 => ["species", 10],
585
+ 11 => ["unknown_author", 14] })
583
586
  end
584
587
 
585
- it 'parses normal names with hort or anon in them' do
588
+ it "parses normal names with hort or anon in them" do
586
589
  sn = "Mus musculus hortulanus"
587
590
  expect(parse(sn)).to_not be_nil
588
- expect(pos(sn)).to eq({0=>["genus", 3], 4=>["species", 12],
589
- 13=>["infraspecies", 23]})
591
+ expect(pos(sn)).to eq({ 0 => ["genus", 3], 4 => ["species", 12],
592
+ 13 => ["infraspecies", 23] })
590
593
  end
591
594
 
592
- it 'parses real world examples' do
595
+ it "parses real world examples" do
593
596
  sn = "Stagonospora polyspora M.T. Lucas & Sousa da Câmara 1934"
594
597
  expect(parse(sn)).to_not be_nil
595
- expect(value(sn)).to eq "Stagonospora polyspora M.T. Lucas & Sousa da Câmara 1934"
596
- expect(details(sn)).to eq [{:genus=>{:string=>"Stagonospora"}, :species=>{:string=>"polyspora", :authorship=>"M.T. Lucas & Sousa da Câmara 1934", :basionymAuthorTeam=>{:authorTeam=>"M.T. Lucas & Sousa da Câmara", :author=>["M.T. Lucas", "Sousa da Câmara"], :year=>"1934"}}}]
597
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 22], 23=>["author_word", 27], 28=>["author_word", 33], 36=>["author_word", 41], 42=>["author_word", 44], 45=>["author_word", 51], 52=>["year", 56]})
598
- expect(parse("Cladoniicola staurospora Diederich, van den Boom & Aptroot 2001")).to_not be_nil
599
- sn = "Yarrowia lipolytica var. lipolytica (Wick., Kurtzman & E.A. Herrm.) Van der Walt & Arx 1981"
598
+ expect(value(sn)).
599
+ to eq "Stagonospora polyspora M.T. Lucas & Sousa da Câmara 1934"
600
+ expect(details(sn)).to eq [{ genus: { string: "Stagonospora" },
601
+ species: { string: "polyspora",
602
+ authorship: "M.T. Lucas & Sousa da Câmara 1934", basionymAuthorTeam:
603
+ { authorTeam: "M.T. Lucas & Sousa da Câmara",
604
+ author: ["M.T. Lucas", "Sousa da Câmara"], year: "1934"} } }]
605
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 22],
606
+ 23 => ["author_word", 27], 28 => ["author_word", 33],
607
+ 36 => ["author_word", 41], 42 => ["author_word", 44],
608
+ 45 => ["author_word", 51], 52 => ["year", 56] })
609
+ expect(parse("Cladoniicola staurospora Diederich, "\
610
+ "van den Boom & Aptroot 2001")).to_not be_nil
611
+ sn = "Yarrowia lipolytica var. lipolytica (Wick., Kurtzman & E.A. Herrm.) "\
612
+ "Van der Walt & Arx 1981"
600
613
  expect(parse(sn)).to_not be_nil
601
- expect(value(sn)).to eq "Yarrowia lipolytica var. lipolytica (Wick., Kurtzman & E.A. Herrm.) Van der Walt & Arx 1981"
602
- expect(pos(sn)).to eq({0=>["genus", 8], 9=>["species", 19], 20=>["infraspecific_type", 24], 25=>["infraspecies", 35], 37=>["author_word", 42], 44=>["author_word", 52], 55=>["author_word", 59], 60=>["author_word", 66], 68=>["author_word", 71], 72=>["author_word", 75], 76=>["author_word", 80], 83=>["author_word", 86], 87=>["year", 91]})
614
+ expect(value(sn)).to eq "Yarrowia lipolytica var. lipolytica "\
615
+ "(Wick., Kurtzman & E.A. Herrm.) Van der Walt & Arx 1981"
616
+ expect(pos(sn)).to eq({ 0 => ["genus", 8], 9 => ["species", 19],
617
+ 20 => ["infraspecific_type", 24], 25 => ["infraspecies", 35],
618
+ 37 => ["author_word", 42], 44 => ["author_word", 52],
619
+ 55 => ["author_word", 59], 60 => ["author_word", 66],
620
+ 68 => ["author_word", 71], 72 => ["author_word", 75],
621
+ 76 => ["author_word", 80], 83 => ["author_word", 86],
622
+ 87 => ["year", 91] })
603
623
  expect(parse("Physalospora rubiginosa (Fr.) anon.")).to_not be_nil
604
624
  expect(parse("Pleurotus ëous (Berk.) Sacc. 1887")).to_not be_nil
605
625
  expect(parse("Lecanora wetmorei Śliwa 2004")).to_not be_nil
606
626
  # valid
607
627
  # infraspecific
608
- expect(parse("Calicium furfuraceum * furfuraceum (L.) Pers. 1797")).to_not be_nil
609
- expect(parse("Exobasidium vaccinii ** andromedae (P. Karst.) P. Karst. 1882")).to_not be_nil
628
+ expect(parse("Calicium furfuraceum * furfuraceum (L.) Pers. 1797")).
629
+ to_not be_nil
630
+ expect(parse("Exobasidium vaccinii ** andromedae (P. Karst.) "\
631
+ "P. Karst. 1882")).to_not be_nil
610
632
  expect(parse("Urceolaria scruposa **** clausa Flot. 1849")).to_not be_nil
611
633
  expect(parse("Cortinarius angulatus B gracilescens Fr. 1838")).to_not be_nil
612
634
  expect(parse("Cyathicula scelobelonium")).to_not be_nil
@@ -616,44 +638,61 @@ describe ScientificNameClean do
616
638
  # author is exception
617
639
  sn = "Tuber liui A S. Xu 1999"
618
640
  expect(parse(sn)).to_not be_nil
619
- expect(details(sn)).to eq [{:genus=>{:string=>"Tuber"}, :species=>{:string=>"liui", :authorship=>"A S. Xu 1999", :basionymAuthorTeam=>{:authorTeam=>"A S. Xu", :author=>["A S. Xu"], :year=>"1999"}}}]
620
- expect(parse('Xylaria potentillae A S. Xu')).to_not be_nil
641
+ expect(details(sn)).to eq [{ genus: { string: "Tuber" },
642
+ species: { string: "liui", authorship: "A S. Xu 1999",
643
+ basionymAuthorTeam: { authorTeam: "A S. Xu",
644
+ author: ["A S. Xu"], year: "1999"} } }]
645
+ expect(parse("Xylaria potentillae A S. Xu")).to_not be_nil
621
646
  expect(parse("Agaricus squamula Berk. & M.A. Curtis 1860")).to_not be_nil
622
- expect(parse("Peltula coriacea Büdel, Henssen & Wessels 1986")).to_not be_nil
647
+ expect(parse("Peltula coriacea Büdel, Henssen & Wessels 1986")).
648
+ to_not be_nil
623
649
  #had to add no dot rule for trinomials without a rank to make it to work
624
650
  sn = "Saccharomyces drosophilae anon."
625
651
  expect(parse(sn)).to_not be_nil
626
- expect(details(sn)).to eq [{:genus=>{:string=>"Saccharomyces"}, :species=>{:string=>"drosophilae", :authorship=>"anon.", :basionymAuthorTeam=>{:authorTeam=>"anon.", :author=>["unknown"]}}}]
627
- expect(pos(sn)).to eq({0=>["genus", 13], 14=>["species", 25], 26=>["unknown_author", 31]})
652
+ expect(details(sn)).to eq [{ genus: { string: "Saccharomyces" },
653
+ species: { string: "drosophilae", authorship: "anon.",
654
+ basionymAuthorTeam: { authorTeam: "anon.", author: ["unknown"]} } }]
655
+ expect(pos(sn)).to eq({ 0 => ["genus", 13],
656
+ 14 => ["species", 25],
657
+ 26 => ["unknown_author", 31] })
628
658
  sn = "Abacetus laevicollis de Chaudoir, 1869"
629
659
  expect(parse(sn)).to_not be_nil
630
- expect(canonical(sn)).to eq 'Abacetus laevicollis'
660
+ expect(canonical(sn)).to eq "Abacetus laevicollis"
631
661
  sn = "Gastrosericus eremorum van Beaumont 1955"
632
- expect(canonical(sn)).to eq 'Gastrosericus eremorum'
662
+ expect(canonical(sn)).to eq "Gastrosericus eremorum"
633
663
  sn = "Gastrosericus eremorum von Beaumont 1955"
634
- expect(canonical(sn)).to eq 'Gastrosericus eremorum'
664
+ expect(canonical(sn)).to eq "Gastrosericus eremorum"
635
665
  sn = "Cypraeovula (Luponia) amphithales perdentata"
636
- expect(canonical(sn)).to eq 'Cypraeovula amphithales perdentata'
637
- expect(details(sn)).to eq [{:genus=>{:string=>"Cypraeovula"}, :infragenus=>{:string=>"Luponia"}, :species=>{:string=>"amphithales"}, :infraspecies=>[{:string=>"perdentata", :rank=>"n/a"}]}]
666
+ expect(canonical(sn)).to eq "Cypraeovula amphithales perdentata"
667
+ expect(details(sn)).to eq [{ genus: { string: "Cypraeovula" },
668
+ infragenus: { string: "Luponia"}, species: { string: "amphithales"},
669
+ infraspecies: [{ string: "perdentata", rank: "n/a"}]}]
638
670
  sn = "Polyrhachis orsyllus nat musculus Forel 1901"
639
671
  expect(canonical(sn)).to eq "Polyrhachis orsyllus musculus"
640
- sn = 'Latrodectus 13-guttatus Thorell, 1875'
641
- expect(canonical(sn)).to eq 'Latrodectus tredecguttatus'
642
- expect(value(sn)).to eq 'Latrodectus tredecguttatus Thorell 1875'
643
- sn = 'Latrodectus 3-guttatus Thorell, 1875'
644
- expect(canonical(sn)).to eq 'Latrodectus triguttatus'
645
- expect(value(sn)).to eq 'Latrodectus triguttatus Thorell 1875'
646
- sn = 'Balaninus c-album Schönherr, CJ., 1836'
647
- expect(canonical(sn)).to eq 'Balaninus c-album'
672
+ sn = "Latrodectus 13-guttatus Thorell, 1875"
673
+ expect(canonical(sn)).to eq "Latrodectus tredecguttatus"
674
+ expect(value(sn)).to eq "Latrodectus tredecguttatus Thorell 1875"
675
+ sn = "Latrodectus 3-guttatus Thorell, 1875"
676
+ expect(canonical(sn)).to eq "Latrodectus triguttatus"
677
+ expect(value(sn)).to eq "Latrodectus triguttatus Thorell 1875"
678
+ sn = "Balaninus c-album Schönherr, CJ., 1836"
679
+ expect(canonical(sn)).to eq "Balaninus c-album"
648
680
  end
649
681
 
650
682
  it "parses name with morph." do
651
683
  sn = "Callideriphus flavicollis morph. reductus Fuchs 1961"
652
684
  expect(parse(sn)).to_not be_nil
653
- expect(value(sn)).to eq "Callideriphus flavicollis morph. reductus Fuchs 1961"
685
+ expect(value(sn)).
686
+ to eq "Callideriphus flavicollis morph. reductus Fuchs 1961"
654
687
  expect(canonical(sn)).to eq "Callideriphus flavicollis reductus"
655
- expect(details(sn)).to eq [{:genus=>{:string=>"Callideriphus"}, :species=>{:string=>"flavicollis"}, :infraspecies=>[{:string=>"reductus", :rank=>"morph.", :authorship=>"Fuchs 1961", :basionymAuthorTeam=>{:authorTeam=>"Fuchs", :author=>["Fuchs"], :year=>"1961"}}]}]
656
- expect(pos(sn)).to eq({0=>["genus", 13], 14=>["species", 25], 26=>["infraspecific_type", 32], 33=>["infraspecies", 41], 42=>["author_word", 47], 48=>["year", 52]})
688
+ expect(details(sn)).to eq [{ genus: { string: "Callideriphus" },
689
+ species: { string: "flavicollis"}, infraspecies: [{ string: "reductus",
690
+ rank: "morph.", authorship: "Fuchs 1961", basionymAuthorTeam:
691
+ { authorTeam: "Fuchs", author: ["Fuchs"], year: "1961"} }]}]
692
+ expect(pos(sn)).to eq({ 0 => ["genus", 13], 14 => ["species", 25],
693
+ 26 => ["infraspecific_type", 32],
694
+ 33 => ["infraspecies", 41],
695
+ 42 => ["author_word", 47], 48 => ["year", 52] })
657
696
  end
658
697
 
659
698
 
@@ -662,38 +701,90 @@ describe ScientificNameClean do
662
701
  expect(parse(sn)).to_not be_nil
663
702
  expect(value(sn)).to eq "Caulerpa cupressoides forma nuda"
664
703
  expect(canonical(sn)).to eq "Caulerpa cupressoides nuda"
665
- expect(details(sn)).to eq [{:genus=>{:string=>"Caulerpa"}, :species=>{:string=>"cupressoides"}, :infraspecies=>[{:string=>"nuda", :rank=>"forma"}]}]
666
- expect(pos(sn)).to eq({0=>["genus", 8], 9=>["species", 21], 22=>["infraspecific_type", 27], 28=>["infraspecies", 32]})
704
+ expect(details(sn)).to eq [{ genus: { string: "Caulerpa" },
705
+ species: { string: "cupressoides"},
706
+ infraspecies: [{ string: "nuda", rank: "forma"}]}]
707
+ expect(pos(sn)).to eq({ 0 => ["genus", 8], 9 => ["species", 21],
708
+ 22 => ["infraspecific_type", 27],
709
+ 28 => ["infraspecies", 32] })
667
710
  sn = "Chlorocyperus glaber form. fasciculariforme (Lojac.) Soó"
668
711
  expect(parse(sn)).to_not be_nil
669
- expect(value("Chlorocyperus glaber form. fasciculariforme (Lojac.) Soó")).to eq "Chlorocyperus glaber form. fasciculariforme (Lojac.) Soó"
712
+ expect(value("Chlorocyperus glaber form. fasciculariforme (Lojac.) Soó")).
713
+ to eq "Chlorocyperus glaber form. fasciculariforme (Lojac.) Soó"
670
714
  expect(canonical(sn)).to eq "Chlorocyperus glaber fasciculariforme"
671
- expect(details(sn)).to eq [{:genus=>{:string=>"Chlorocyperus"}, :species=>{:string=>"glaber"}, :infraspecies=>[{:string=>"fasciculariforme", :rank=>"form.", :authorship=>"(Lojac.) Soó", :combinationAuthorTeam=>{:authorTeam=>"Soó", :author=>["Soó"]}, :basionymAuthorTeam=>{:authorTeam=>"Lojac.", :author=>["Lojac."]}}]}]
672
- expect(pos(sn)).to eq({0=>["genus", 13], 14=>["species", 20], 21=>["infraspecific_type", 26], 27=>["infraspecies", 43], 45=>["author_word", 51], 53=>["author_word", 56]})
673
- sn = "Bambusa nana Roxb. fo. alphonse-karri (Mitford ex Satow) Makino ex Shiros."
715
+ expect(details(sn)).to eq [{ genus: { string: "Chlorocyperus" },
716
+ species: { string: "glaber"}, infraspecies:
717
+ [{ string: "fasciculariforme", rank: "form.",
718
+ authorship: "(Lojac.) Soó", combinationAuthorTeam: { authorTeam: "Soó",
719
+ author: ["Soó"]}, basionymAuthorTeam: { authorTeam: "Lojac.",
720
+ author: ["Lojac."]} }]}]
721
+ expect(pos(sn)).to eq({ 0 => ["genus", 13], 14 => ["species", 20],
722
+ 21 => ["infraspecific_type", 26],
723
+ 27 => ["infraspecies", 43],
724
+ 45 => ["author_word", 51],
725
+ 53 => ["author_word", 56] })
726
+ sn = "Bambusa nana Roxb. fo. alphonse-karri (Mitford ex Satow) "\
727
+ "Makino ex Shiros."
674
728
  expect(parse(sn)).to_not be_nil
675
- expect(value(sn)).to eq "Bambusa nana Roxb. fo. alphonse-karri (Mitford ex Satow) Makino ex Shiros."
729
+ expect(value(sn)).to eq "Bambusa nana Roxb. fo. alphonse-karri "\
730
+ "(Mitford ex Satow) Makino ex Shiros."
676
731
  expect(canonical(sn)).to eq "Bambusa nana alphonse-karri"
677
- expect(details(sn)).to eq [{:genus=>{:string=>"Bambusa"}, :species=>{:string=>"nana", :authorship=>"Roxb.", :basionymAuthorTeam=>{:authorTeam=>"Roxb.", :author=>["Roxb."]}}, :infraspecies=>[{:string=>"alphonse-karri", :rank=>"fo.", :authorship=>"(Mitford ex Satow) Makino ex Shiros.", :combinationAuthorTeam=>{:authorTeam=>"Makino", :author=>["Makino"], :exAuthorTeam=>{:authorTeam=>"Shiros.", :author=>["Shiros."]}}, :basionymAuthorTeam=>{:authorTeam=>"Mitford", :author=>["Mitford"], :exAuthorTeam=>{:authorTeam=>"Satow", :author=>["Satow"]}}}]}]
678
- expect(pos(sn)).to eq({0=>["genus", 7], 8=>["species", 12], 13=>["author_word", 18], 19=>["infraspecific_type", 22], 23=>["infraspecies", 37], 39=>["author_word", 46], 50=>["author_word", 55], 57=>["author_word", 63], 67=>["author_word", 74]})
732
+ expect(details(sn)).to eq [{ genus: { string: "Bambusa" },
733
+ species: { string: "nana", authorship: "Roxb.", basionymAuthorTeam:
734
+ { authorTeam: "Roxb.", author: ["Roxb."]} },
735
+ infraspecies: [{ string: "alphonse-karri",
736
+ rank: "fo.", authorship: "(Mitford ex Satow) Makino ex Shiros.",
737
+ combinationAuthorTeam: { authorTeam: "Makino",
738
+ author: ["Makino"], exAuthorTeam: { authorTeam: "Shiros.",
739
+ author: ["Shiros."]} }, basionymAuthorTeam: { authorTeam: "Mitford",
740
+ author: ["Mitford"], exAuthorTeam: { authorTeam: "Satow",
741
+ author: ["Satow"]} } }]}]
742
+ expect(pos(sn)).to eq({ 0 => ["genus", 7], 8 => ["species", 12],
743
+ 13 => ["author_word", 18], 19 => ["infraspecific_type", 22],
744
+ 23 => ["infraspecies", 37], 39 => ["author_word", 46],
745
+ 50 => ["author_word", 55], 57 => ["author_word", 63],
746
+ 67 => ["author_word", 74] })
679
747
  sn = " Sphaerotheca fuliginea f. dahliae Movss. 1967 "
680
748
  sn = "Sphaerotheca fuliginea f. dahliae Movss. 1967"
681
749
  expect(parse(sn)).to_not be_nil
682
750
  expect(value(sn)).to eq "Sphaerotheca fuliginea f. dahliae Movss. 1967"
683
751
  expect(canonical(sn)).to eq "Sphaerotheca fuliginea dahliae"
684
- expect(details(sn)).to eq [{:genus=>{:string=>"Sphaerotheca"}, :species=>{:string=>"fuliginea"}, :infraspecies=>[{:string=>"dahliae", :rank=>"f.", :authorship=>"Movss. 1967", :basionymAuthorTeam=>{:authorTeam=>"Movss.", :author=>["Movss."], :year=>"1967"}}]}]
685
- expect(pos(sn)).to eq({0=>["genus", 12], 16=>["species", 25], 29=>["infraspecific_type", 31], 36=>["infraspecies", 43], 47=>["author_word", 53], 58=>["year", 62]})
686
- expect(parse('Polypodium vulgare nothosubsp. mantoniae (Rothm.) Schidlay')).to_not be_nil
752
+ expect(details(sn)).to eq [{ genus: { string: "Sphaerotheca" },
753
+ species: { string: "fuliginea"}, infraspecies:
754
+ [{ string: "dahliae", rank: "f.", authorship: "Movss. 1967",
755
+ basionymAuthorTeam: { authorTeam: "Movss.",
756
+ author: ["Movss."], year: "1967"} }]}]
757
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 16 => ["species", 25],
758
+ 29 => ["infraspecific_type", 31], 36 => ["infraspecies", 43],
759
+ 47 => ["author_word", 53], 58 => ["year", 62] })
760
+ expect(parse("Polypodium vulgare nothosubsp. mantoniae (Rothm.) Schidlay")).
761
+ to_not be_nil
687
762
  end
688
763
 
689
- it "parses name with several subspecies names NOT BOTANICAL CODE BUT NOT INFREQUENT" do
690
- sn = "Hydnellum scrobiculatum var. zonatum f. parvum (Banker) D. Hall & D.E. Stuntz 1972"
764
+ it "parses name with several subspecies names" do
765
+ # NOT BOTANICAL CODE BUT NOT INFREQUENT"
766
+ sn = "Hydnellum scrobiculatum var. zonatum f. "\
767
+ "parvum (Banker) D. Hall & D.E. Stuntz 1972"
691
768
  expect(parse(sn)).to_not be_nil
692
- expect(value(sn)).to eq "Hydnellum scrobiculatum var. zonatum f. parvum (Banker) D. Hall & D.E. Stuntz 1972"
693
- expect(details(sn)).to eq [{:genus=>{:string=>"Hydnellum"}, :species=>{:string=>"scrobiculatum"}, :infraspecies=>[{:string=>"zonatum", :rank=>"var."}, {:string=>"parvum", :rank=>"f.", :authorship=>"(Banker) D. Hall & D.E. Stuntz 1972", :combinationAuthorTeam=>{:authorTeam=>"D. Hall & D.E. Stuntz", :author=>["D. Hall", "D.E. Stuntz"], :year=>"1972"}, :basionymAuthorTeam=>{:authorTeam=>"Banker", :author=>["Banker"]}}]}]
694
- expect(pos(sn)).to eq({0=>["genus", 9], 10=>["species", 23], 24=>["infraspecific_type", 28], 29=>["infraspecies", 36], 37=>["infraspecific_type", 39], 40=>["infraspecies", 46], 48=>["author_word", 54], 56=>["author_word", 58], 59=>["author_word", 63], 66=>["author_word", 70], 71=>["author_word", 77], 78=>["year", 82]})
695
- expect(parse('Senecio fuchsii C.C.Gmel. subsp. fuchsii var. expansus (Boiss. & Heldr.) Hayek')).to_not be_nil
696
- expect(parse('Senecio fuchsii C.C.Gmel. subsp. fuchsii var. fuchsii')).to_not be_nil
769
+ expect(value(sn)).to eq "Hydnellum scrobiculatum var. zonatum f. "\
770
+ "parvum (Banker) D. Hall & D.E. Stuntz 1972"
771
+ expect(details(sn)).to eq [{ genus: { string: "Hydnellum" }, species:
772
+ { string: "scrobiculatum"}, infraspecies: [{ string: "zonatum",
773
+ rank: "var."}, { string: "parvum", rank: "f.",
774
+ authorship: "(Banker) D. Hall & D.E. Stuntz 1972",
775
+ combinationAuthorTeam: { authorTeam: "D. Hall & D.E. Stuntz",
776
+ author: ["D. Hall", "D.E. Stuntz"], year: "1972"},
777
+ basionymAuthorTeam: { authorTeam: "Banker", author: ["Banker"]} }]}]
778
+ expect(pos(sn)).to eq({ 0 => ["genus", 9], 10 => ["species", 23],
779
+ 24 => ["infraspecific_type", 28], 29 => ["infraspecies", 36],
780
+ 37 => ["infraspecific_type", 39], 40 => ["infraspecies", 46],
781
+ 48 => ["author_word", 54], 56 => ["author_word", 58],
782
+ 59 => ["author_word", 63], 66 => ["author_word", 70],
783
+ 71 => ["author_word", 77], 78 => ["year", 82] })
784
+ expect(parse("Senecio fuchsii C.C.Gmel. subsp. fuchsii var. "\
785
+ "expansus (Boiss. & Heldr.) Hayek")).to_not be_nil
786
+ expect(parse("Senecio fuchsii C.C.Gmel. subsp. fuchsii var. fuchsii")).
787
+ to_not be_nil
697
788
  end
698
789
 
699
790
 
@@ -701,64 +792,139 @@ describe ScientificNameClean do
701
792
  #it is always latin abbrev often 2 words
702
793
  sn = "Arthopyrenia hyalospora (Nyl.) R.C. Harris comb. nov."
703
794
  expect(parse(sn)).to_not be_nil
704
- expect(value(sn)).to eq "Arthopyrenia hyalospora (Nyl.) R.C. Harris comb. nov."
795
+ expect(value(sn)).to eq "Arthopyrenia hyalospora (Nyl.) "\
796
+ "R.C. Harris comb. nov."
705
797
  expect(canonical(sn)).to eq "Arthopyrenia hyalospora"
706
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora", :authorship=>"(Nyl.) R.C. Harris", :combinationAuthorTeam=>{:authorTeam=>"R.C. Harris", :author=>["R.C. Harris"]}, :basionymAuthorTeam=>{:authorTeam=>"Nyl.", :author=>["Nyl."]}}, :status=>"comb. nov."}]
707
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23], 25=>["author_word", 29], 31=>["author_word", 35], 36=>["author_word", 42]})
798
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
799
+ species: { string: "hyalospora", authorship: "(Nyl.) R.C. Harris",
800
+ combinationAuthorTeam: { authorTeam: "R.C. Harris",
801
+ author: ["R.C. Harris"]}, basionymAuthorTeam: { authorTeam: "Nyl.",
802
+ author: ["Nyl."]} }, status: "comb. nov."}]
803
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23],
804
+ 25 => ["author_word", 29], 31 => ["author_word", 35],
805
+ 36 => ["author_word", 42] })
708
806
  end
709
807
 
710
808
  it "parses revised (ex) names" do
711
809
  #invalidly published
712
810
  sn = "Arthopyrenia hyalospora (Nyl. ex Banker) R.C. Harris"
713
811
  expect(parse(sn)).to_not be_nil
714
- expect(value(sn)).to eq "Arthopyrenia hyalospora (Nyl. ex Banker) R.C. Harris"
812
+ expect(value(sn)).
813
+ to eq "Arthopyrenia hyalospora (Nyl. ex Banker) R.C. Harris"
715
814
  expect(canonical(sn)).to eq "Arthopyrenia hyalospora"
716
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora", :authorship=>"(Nyl. ex Banker) R.C. Harris", :combinationAuthorTeam=>{:authorTeam=>"R.C. Harris", :author=>["R.C. Harris"]}, :basionymAuthorTeam=>{:authorTeam=>"Nyl.", :author=>["Nyl."], :exAuthorTeam=>{:authorTeam=>"Banker", :author=>["Banker"]}}}}]
717
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23], 25=>["author_word", 29], 33=>["author_word", 39], 41=>["author_word", 45], 46=>["author_word", 52]})
815
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
816
+ species: { string: "hyalospora",
817
+ authorship: "(Nyl. ex Banker) R.C. Harris", combinationAuthorTeam:
818
+ { authorTeam: "R.C. Harris", author: ["R.C. Harris"]},
819
+ basionymAuthorTeam: { authorTeam: "Nyl.", author: ["Nyl."],
820
+ exAuthorTeam: { authorTeam: "Banker", author: ["Banker"]} } } }]
821
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23],
822
+ 25 => ["author_word", 29], 33 => ["author_word", 39],
823
+ 41 => ["author_word", 45], 46 => ["author_word", 52] })
718
824
  sn = "Arthopyrenia hyalospora Nyl. ex Banker"
719
825
  expect(parse(sn)).to_not be_nil
720
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora", :authorship=>"Nyl. ex Banker", :basionymAuthorTeam=>{:authorTeam=>"Nyl.", :author=>["Nyl."], :exAuthorTeam=>{:authorTeam=>"Banker", :author=>["Banker"]}}}}]
826
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
827
+ species: { string: "hyalospora", authorship: "Nyl. ex Banker",
828
+ basionymAuthorTeam: { authorTeam: "Nyl.", author: ["Nyl."],
829
+ exAuthorTeam: { authorTeam: "Banker", author: ["Banker"]} } } }]
721
830
  sn = "Glomopsis lonicerae Peck ex C.J. Gould 1945"
722
831
  expect(parse(sn)).to_not be_nil
723
- expect(details(sn)).to eq [{:genus=>{:string=>"Glomopsis"}, :species=>{:string=>"lonicerae", :authorship=>"Peck ex C.J. Gould 1945", :basionymAuthorTeam=>{:authorTeam=>"Peck", :author=>["Peck"], :exAuthorTeam=>{:authorTeam=>"C.J. Gould", :author=>["C.J. Gould"], :year=>"1945"}}}}]
724
- expect(pos(sn)).to eq({0=>["genus", 9], 10=>["species", 19], 20=>["author_word", 24], 28=>["author_word", 32], 33=>["author_word", 38], 39=>["year", 43]})
725
- expect(parse("Acanthobasidium delicatum (Wakef.) Oberw. ex Jülich 1979")).to_not be_nil
832
+ expect(details(sn)).to eq [{ genus: { string: "Glomopsis" },
833
+ species: { string: "lonicerae", authorship: "Peck ex C.J. Gould 1945",
834
+ basionymAuthorTeam: { authorTeam: "Peck", author: ["Peck"],
835
+ exAuthorTeam: { authorTeam: "C.J. Gould", author: ["C.J. Gould"],
836
+ year: "1945"} } } }]
837
+ expect(pos(sn)).to eq({ 0 => ["genus", 9], 10 => ["species", 19],
838
+ 20 => ["author_word", 24], 28 => ["author_word", 32],
839
+ 33 => ["author_word", 38], 39 => ["year", 43] })
840
+ expect(parse("Acanthobasidium delicatum (Wakef.) Oberw. ex Jülich 1979")).
841
+ to_not be_nil
726
842
  sn = "Mycosphaerella eryngii (Fr. ex Duby) Johanson ex Oudem. 1897"
727
843
  expect(parse(sn)).to_not be_nil
728
- expect(details(sn)).to eq [{:genus=>{:string=>"Mycosphaerella"}, :species=>{:string=>"eryngii", :authorship=>"(Fr. ex Duby) Johanson ex Oudem. 1897", :combinationAuthorTeam=>{:authorTeam=>"Johanson", :author=>["Johanson"], :exAuthorTeam=>{:authorTeam=>"Oudem.", :author=>["Oudem."], :year=>"1897"}}, :basionymAuthorTeam=>{:authorTeam=>"Fr.", :author=>["Fr."], :exAuthorTeam=>{:authorTeam=>"Duby", :author=>["Duby"]}}}}]
729
- expect(pos(sn)).to eq({0=>["genus", 14], 15=>["species", 22], 24=>["author_word", 27], 31=>["author_word", 35], 37=>["author_word", 45], 49=>["author_word", 55], 56=>["year", 60]})
844
+ expect(details(sn)).to eq [{ genus: { string: "Mycosphaerella" },
845
+ species: { string: "eryngii",
846
+ authorship: "(Fr. ex Duby) Johanson ex Oudem. 1897",
847
+ combinationAuthorTeam: { authorTeam: "Johanson", author: ["Johanson"],
848
+ exAuthorTeam: { authorTeam: "Oudem.", author: ["Oudem."], year: "1897"} },
849
+ basionymAuthorTeam: { authorTeam: "Fr.", author: ["Fr."],
850
+ exAuthorTeam: { authorTeam: "Duby", author: ["Duby"]} } } }]
851
+ expect(pos(sn)).to eq({ 0 => ["genus", 14], 15 => ["species", 22],
852
+ 24 => ["author_word", 27], 31 => ["author_word", 35],
853
+ 37 => ["author_word", 45], 49 => ["author_word", 55],
854
+ 56 => ["year", 60] })
730
855
  #invalid but happens
731
- expect(parse("Mycosphaerella eryngii (Fr. Duby) ex Oudem. 1897")).to_not be_nil
732
- expect(parse("Mycosphaerella eryngii (Fr.ex Duby) ex Oudem. 1897")).to_not be_nil
733
- sn = "Salmonella werahensis (Castellani) Hauduroy and Ehringer in Hauduroy 1937"
856
+ expect(parse("Mycosphaerella eryngii (Fr. Duby) ex Oudem. 1897")).
857
+ to_not be_nil
858
+ expect(parse("Mycosphaerella eryngii (Fr.ex Duby) ex Oudem. 1897")).
859
+ to_not be_nil
860
+ sn = "Salmonella werahensis (Castellani) Hauduroy and Ehringer "\
861
+ "in Hauduroy 1937"
734
862
  expect(parse(sn)).to_not be_nil
735
- expect(details(sn)).to eq [{:genus=>{:string=>"Salmonella"}, :species=>{:string=>"werahensis", :authorship=>"(Castellani) Hauduroy and Ehringer in Hauduroy 1937", :combinationAuthorTeam=>{:authorTeam=>"Hauduroy and Ehringer", :author=>["Hauduroy", "Ehringer"], :exAuthorTeam=>{:authorTeam=>"Hauduroy", :author=>["Hauduroy"], :year=>"1937"}}, :basionymAuthorTeam=>{:authorTeam=>"Castellani", :author=>["Castellani"]}}}]
736
- expect(pos(sn)).to eq({0=>["genus", 10], 11=>["species", 21], 23=>["author_word", 33], 35=>["author_word", 43], 48=>["author_word", 56], 60=>["author_word", 68], 69=>["year", 73]})
863
+ expect(details(sn)).to eq [{ genus: { string: "Salmonella" },
864
+ species: { string: "werahensis",
865
+ authorship: "(Castellani) Hauduroy and Ehringer in Hauduroy 1937",
866
+ combinationAuthorTeam: { authorTeam: "Hauduroy and Ehringer",
867
+ author: ["Hauduroy", "Ehringer"], exAuthorTeam: {
868
+ authorTeam: "Hauduroy", author: ["Hauduroy"], year: "1937"} },
869
+ basionymAuthorTeam: { authorTeam: "Castellani",
870
+ author: ["Castellani"]} } }]
871
+ expect(pos(sn)).to eq({ 0 => ["genus", 10], 11 => ["species", 21],
872
+ 23 => ["author_word", 33], 35 => ["author_word", 43],
873
+ 48 => ["author_word", 56], 60 => ["author_word", 68],
874
+ 69 => ["year", 73] })
737
875
  end
738
876
 
739
- it 'parses named hybrids' do
877
+ it "parses named hybrids" do
740
878
  [
741
- ["×Agropogon P. Fourn. 1934", [{:uninomial=>{:string=>"Agropogon", :authorship=>"P. Fourn. 1934", :basionymAuthorTeam=>{:authorTeam=>"P. Fourn.", :author=>["P. Fourn."], :year=>"1934"}}}]],
742
- ["xAgropogon P. Fourn.", [{:uninomial=>{:string=>"Agropogon", :authorship=>"P. Fourn.", :basionymAuthorTeam=>{:authorTeam=>"P. Fourn.", :author=>["P. Fourn."]}}}]],
743
- ["XAgropogon P.Fourn.", [{:uninomial=>{:string=>"Agropogon", :authorship=>"P.Fourn.", :basionymAuthorTeam=>{:authorTeam=>"P.Fourn.", :author=>["P.Fourn."]}}}]],
744
- ["× Agropogon", [{:uninomial=>{:string=>"Agropogon"}}]],
745
- ["x Agropogon", [{:uninomial=>{:string=>"Agropogon"}}]],
746
- ["X Agropogon", [{:uninomial=>{:string=>"Agropogon"}}]],
747
- ["X Cupressocyparis leylandii", [{:genus=>{:string=>"Cupressocyparis"}, :species=>{:string=>"leylandii"}}]],
748
- ["×Heucherella tiarelloides", [{:genus=>{:string=>"Heucherella"}, :species=>{:string=>"tiarelloides"}}]],
749
- ["xHeucherella tiarelloides", [{:genus=>{:string=>"Heucherella"}, :species=>{:string=>"tiarelloides"}}]],
750
- ["x Heucherella tiarelloides", [{:genus=>{:string=>"Heucherella"}, :species=>{:string=>"tiarelloides"}}]],
751
- ["×Agropogon littoralis (Sm.) C. E. Hubb. 1946", [{:genus=>{:string=>"Agropogon"}, :species=>{:string=>"littoralis", :authorship=>"(Sm.) C. E. Hubb. 1946", :combinationAuthorTeam=>{:authorTeam=>"C. E. Hubb.", :author=>["C. E. Hubb."], :year=>"1946"}, :basionymAuthorTeam=>{:authorTeam=>"Sm.", :author=>["Sm."]}}}]]
879
+ ["×Agropogon P. Fourn. 1934", [{ uninomial: { string: "Agropogon",
880
+ authorship: "P. Fourn. 1934", basionymAuthorTeam:
881
+ { authorTeam: "P. Fourn.", author: ["P. Fourn."], year: "1934" } } }]],
882
+ ["xAgropogon P. Fourn.", [{ uninomial: { string: "Agropogon",
883
+ authorship: "P. Fourn.", basionymAuthorTeam: { authorTeam: "P. Fourn.",
884
+ author: ["P. Fourn."] } } }]],
885
+ ["XAgropogon P.Fourn.", [{ uninomial: { string: "Agropogon",
886
+ authorship: "P.Fourn.", basionymAuthorTeam: { authorTeam: "P.Fourn.",
887
+ author: ["P.Fourn."] } } }]],
888
+ ["× Agropogon", [{ uninomial: { string: "Agropogon" } }]],
889
+ ["x Agropogon", [{ uninomial: { string: "Agropogon" } }]],
890
+ ["X Agropogon", [{ uninomial: { string: "Agropogon" } }]],
891
+ ["X Cupressocyparis leylandii", [{ genus: { string: "Cupressocyparis" },
892
+ species: { string: "leylandii"} }]],
893
+ ["×Heucherella tiarelloides", [{ genus: { string: "Heucherella" },
894
+ species: { string: "tiarelloides"} }]],
895
+ ["xHeucherella tiarelloides", [{ genus: { string: "Heucherella" },
896
+ species: { string: "tiarelloides"} }]],
897
+ ["x Heucherella tiarelloides", [{ genus: { string: "Heucherella" },
898
+ species: { string: "tiarelloides"} }]],
899
+ ["×Agropogon littoralis (Sm.) C. E. Hubb. 1946", [{ genus:
900
+ { string: "Agropogon" }, species: { string: "littoralis",
901
+ authorship: "(Sm.) C. E. Hubb. 1946", combinationAuthorTeam:
902
+ { authorTeam: "C. E. Hubb.", author: ["C. E. Hubb."], year: "1946"},
903
+ basionymAuthorTeam: { authorTeam: "Sm.", author: ["Sm."]} } }]]
752
904
  ].each do |res|
753
905
  expect(parse(res[0])).to_not be_nil
754
906
  expect(parse(res[0]).hybrid).to eq true
755
907
  expect(details(res[0])).to eq res[1]
756
908
  end
757
909
  [
758
- ['Asplenium X inexpectatum (E.L. Braun 1940) Morton (1956)',[{:genus=>{:string=>"Asplenium"}, :species=>{:string=>"inexpectatum", :authorship=>"(E.L. Braun 1940) Morton (1956)", :combinationAuthorTeam=>{:authorTeam=>"Morton", :author=>["Morton"], :year=>"1956"}, :basionymAuthorTeam=>{:authorTeam=>"E.L. Braun", :author=>["E.L. Braun"], :year=>"1940"}}}]],
759
- ['Mentha ×smithiana R. A. Graham 1949',[{:genus=>{:string=>"Mentha"}, :species=>{:string=>"smithiana", :authorship=>"R. A. Graham 1949", :basionymAuthorTeam=>{:authorTeam=>"R. A. Graham", :author=>["R. A. Graham"], :year=>"1949"}}}]],
760
- ['Salix ×capreola Andersson (1867)',[{:genus=>{:string=>"Salix"}, :species=>{:string=>"capreola", :authorship=>"Andersson (1867)", :basionymAuthorTeam=>{:authorTeam=>"Andersson", :author=>["Andersson"], :year=>"1867"}}}]],
761
- ['Salix x capreola Andersson',[{:genus=>{:string=>"Salix"}, :species=>{:string=>"capreola", :authorship=>"Andersson", :basionymAuthorTeam=>{:authorTeam=>"Andersson", :author=>["Andersson"]}}}]]
910
+ ["Asplenium X inexpectatum (E.L. Braun 1940) Morton (1956)",
911
+ [{ genus: { string: "Asplenium" }, species: { string: "inexpectatum",
912
+ authorship: "(E.L. Braun 1940) Morton (1956)", combinationAuthorTeam:
913
+ { authorTeam: "Morton", author: ["Morton"], year: "1956"},
914
+ basionymAuthorTeam: { authorTeam: "E.L. Braun", author: ["E.L. Braun"],
915
+ year: "1940"} } }]],
916
+ ["Mentha ×smithiana R. A. Graham 1949",[{ genus: { string: "Mentha" },
917
+ species: { string: "smithiana", authorship: "R. A. Graham 1949",
918
+ basionymAuthorTeam: { authorTeam: "R. A. Graham",
919
+ author: ["R. A. Graham"], year: "1949"} } }]],
920
+ ["Salix ×capreola Andersson (1867)",[{ genus: { string: "Salix" },
921
+ species: { string: "capreola", authorship: "Andersson (1867)",
922
+ basionymAuthorTeam: { authorTeam: "Andersson", author: ["Andersson"],
923
+ year: "1867"} } }]],
924
+ ["Salix x capreola Andersson",[{ genus: { string: "Salix" },
925
+ species: { string: "capreola", authorship: "Andersson",
926
+ basionymAuthorTeam: { authorTeam: "Andersson",
927
+ author: ["Andersson"]} } }]]
762
928
  ].each do |res|
763
929
  expect(parse(res[0])).to_not be_nil
764
930
  expect(parse(res[0]).hybrid).to eq true
@@ -766,62 +932,102 @@ describe ScientificNameClean do
766
932
  end
767
933
  sn = "Rosa alpina x pomifera"
768
934
  expect(canonical(sn)).to eq "Rosa alpina × pomifera"
769
- expect(parse(sn).details).to eq [{:genus=>{:string=>"Rosa"}, :species=>{:string=>"alpina"}}, {:species=>{:string=>"pomifera"}, :genus=>{:string=>"Rosa"}}]
935
+ expect(parse(sn).details).to eq [{ genus: { string: "Rosa" },
936
+ species: { string: "alpina"} }, { species: { string: "pomifera"},
937
+ genus: { string: "Rosa"} }]
770
938
  end
771
939
 
772
940
  it "parses hybrid combination" do
773
941
  sn = "Arthopyrenia hyalospora X Hydnellum scrobiculatum"
774
942
  expect(parse(sn)).to_not be_nil
775
943
  expect(parse(sn).hybrid).to eq true
776
- expect(value(sn)).to eq "Arthopyrenia hyalospora \303\227 Hydnellum scrobiculatum"
777
- expect(canonical(sn)).to eq "Arthopyrenia hyalospora × Hydnellum scrobiculatum"
778
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora"}}, {:genus=>{:string=>"Hydnellum"}, :species=>{:string=>"scrobiculatum"}}]
779
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23], 26=>["genus", 35], 36=>["species", 49]})
780
- sn = "Arthopyrenia hyalospora (Banker) D. Hall X Hydnellum scrobiculatum D.E. Stuntz"
944
+ expect(value(sn)).
945
+ to eq "Arthopyrenia hyalospora \303\227 Hydnellum scrobiculatum"
946
+ expect(canonical(sn)).
947
+ to eq "Arthopyrenia hyalospora × Hydnellum scrobiculatum"
948
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
949
+ species: { string: "hyalospora"} }, { genus: { string: "Hydnellum"},
950
+ species: { string: "scrobiculatum"} }]
951
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23],
952
+ 26 => ["genus", 35], 36 => ["species", 49] })
953
+ sn = "Arthopyrenia hyalospora (Banker) D. Hall X Hydnellum "\
954
+ "scrobiculatum D.E. Stuntz"
781
955
  expect(parse(sn)).to_not be_nil
782
956
  expect(parse(sn).hybrid).to eq true
783
- expect(value(sn)).to eq "Arthopyrenia hyalospora (Banker) D. Hall \303\227 Hydnellum scrobiculatum D.E. Stuntz"
784
- expect(canonical(sn)).to eq "Arthopyrenia hyalospora × Hydnellum scrobiculatum"
785
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23], 25=>["author_word", 31], 33=>["author_word", 35], 36=>["author_word", 40], 43=>["genus", 52], 53=>["species", 66], 67=>["author_word", 71], 72=>["author_word", 78]})
786
- expect(value("Arthopyrenia hyalospora X")).to eq "Arthopyrenia hyalospora \303\227 ?"
957
+ expect(value(sn)).to eq "Arthopyrenia hyalospora (Banker) "\
958
+ "D. Hall \303\227 Hydnellum scrobiculatum D.E. Stuntz"
959
+ expect(canonical(sn)).
960
+ to eq "Arthopyrenia hyalospora × Hydnellum scrobiculatum"
961
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23],
962
+ 25 => ["author_word", 31], 33 => ["author_word", 35],
963
+ 36 => ["author_word", 40], 43 => ["genus", 52],
964
+ 53 => ["species", 66], 67 => ["author_word", 71],
965
+ 72 => ["author_word", 78] })
966
+ expect(value("Arthopyrenia hyalospora X")).
967
+ to eq "Arthopyrenia hyalospora \303\227 ?"
787
968
  sn = "Arthopyrenia hyalospora x"
788
969
  expect(parse(sn)).to_not be_nil
789
970
  expect(parse(sn).hybrid).to eq true
790
971
  expect(canonical(sn)).to eq "Arthopyrenia hyalospora"
791
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora"}}, "?"]
792
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23]})
972
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
973
+ species: { string: "hyalospora"} }, "?"]
974
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23] })
793
975
  sn = "Arthopyrenia hyalospora × ?"
794
976
  expect(parse(sn)).to_not be_nil
795
977
  expect(parse(sn).hybrid).to eq true
796
- expect(details(sn)).to eq [{:genus=>{:string=>"Arthopyrenia"}, :species=>{:string=>"hyalospora"}}, "?"]
797
- expect(pos(sn)).to eq({0=>["genus", 12], 13=>["species", 23]})
978
+ expect(details(sn)).to eq [{ genus: { string: "Arthopyrenia" },
979
+ species: { string: "hyalospora"} }, "?"]
980
+ expect(pos(sn)).to eq({ 0 => ["genus", 12], 13 => ["species", 23] })
798
981
  end
799
982
 
800
- it 'parses names with taxon concept' do
983
+ it "parses names with taxon concept" do
801
984
  sn = "Stenometope laevissimus sec. Eschmeyer 2004"
802
- expect(details(sn)).to eq [{:genus=>{:string=>"Stenometope"}, :species=>{:string=>"laevissimus"}, :taxon_concept=>{:authorship=>"Eschmeyer 2004", :basionymAuthorTeam=>{:authorTeam=>"Eschmeyer", :author=>["Eschmeyer"], :year=>"2004"}}}]
803
- expect(pos(sn)).to eq({0=>["genus", 11], 12=>["species", 23], 29=>["author_word", 38], 39=>["year", 43]})
985
+ expect(details(sn)).to eq [{ genus: { string: "Stenometope" },
986
+ species: { string: "laevissimus"}, taxon_concept:
987
+ { authorship: "Eschmeyer 2004",
988
+ basionymAuthorTeam: { authorTeam: "Eschmeyer",
989
+ author: ["Eschmeyer"], year: "2004"} } }]
990
+ expect(pos(sn)).to eq({ 0 => ["genus", 11], 12 => ["species", 23],
991
+ 29 => ["author_word", 38], 39 => ["year", 43] })
804
992
  sn = "Stenometope laevissimus Bibron 1855 sec. Eschmeyer 2004"
805
993
  expect(parse(sn)).to_not be_nil
806
- expect(details(sn)).to eq [{:genus=>{:string=>"Stenometope"}, :species=>{:string=>"laevissimus", :authorship=>"Bibron 1855", :basionymAuthorTeam=>{:authorTeam=>"Bibron", :author=>["Bibron"], :year=>"1855"}}, :taxon_concept=>{:authorship=>"Eschmeyer 2004", :basionymAuthorTeam=>{:authorTeam=>"Eschmeyer", :author=>["Eschmeyer"], :year=>"2004"}}}]
807
- expect(pos(sn)).to eq({0=>["genus", 11], 12=>["species", 23], 24=>["author_word", 30], 31=>["year", 35], 41=>["author_word", 50], 51=>["year", 55]})
994
+ expect(details(sn)).to eq [{ genus: { string: "Stenometope" },
995
+ species: { string: "laevissimus", authorship: "Bibron 1855",
996
+ basionymAuthorTeam: { authorTeam: "Bibron", author: ["Bibron"],
997
+ year: "1855"} }, taxon_concept: { authorship: "Eschmeyer 2004",
998
+ basionymAuthorTeam: { authorTeam: "Eschmeyer",
999
+ author: ["Eschmeyer"], year: "2004"} } }]
1000
+ expect(pos(sn)).to eq({ 0 => ["genus", 11], 12 => ["species", 23],
1001
+ 24 => ["author_word", 30], 31 => ["year", 35],
1002
+ 41 => ["author_word", 50], 51 => ["year", 55] })
808
1003
  end
809
1004
 
810
- it 'parses names with spaces inconsistencies at the start and the end and in the middle' do
811
- expect(parse(" Asplenium X inexpectatum (E.L. Braun 1940) Morton (1956) ")).to_not be_nil
1005
+ it "parses names with spaces inconsistencies" do
1006
+ expect(parse(" Asplenium X inexpectatum (E.L. Braun 1940) "\
1007
+ "Morton (1956) ")).to_not be_nil
812
1008
  end
813
1009
 
814
- it 'parses names with any number of spaces' do
815
- sn = "Trematosphaeria phaeospora (E. Müll.) L. Holm 1957"
1010
+ it "parses names with any number of spaces" do
1011
+ sn = "Trematosphaeria phaeospora (E. Müll.)"\
1012
+ " L. Holm 1957"
816
1013
  expect(parse(sn)).to_not be_nil
817
1014
  expect(value(sn)).to eq "Trematosphaeria phaeospora (E. Müll.) L. Holm 1957"
818
1015
  expect(canonical(sn)).to eq "Trematosphaeria phaeospora"
819
- expect(details(sn)).to eq [{:genus=>{:string=>"Trematosphaeria"}, :species=>{:string=>"phaeospora", :authorship=>"(E. Müll.) L. Holm 1957", :combinationAuthorTeam=>{:authorTeam=>"L. Holm", :author=>["L. Holm"], :year=>"1957"}, :basionymAuthorTeam=>{:authorTeam=>"E. Müll.", :author=>["E. Müll."]}}}]
820
- expect(pos(sn)).to eq({0=>["genus", 15], 16=>["species", 26], 28=>["author_word", 30], 31=>["author_word", 36], 46=>["author_word", 48], 61=>["author_word", 65], 66=>["year", 70]})
1016
+ expect(details(sn)).to eq [{ genus: { string: "Trematosphaeria" },
1017
+ species: { string: "phaeospora", authorship: "(E. Müll.) "\
1018
+ "L. Holm 1957",
1019
+ combinationAuthorTeam: { authorTeam: "L. Holm",
1020
+ author: ["L. Holm"], year: "1957"},
1021
+ basionymAuthorTeam: { authorTeam: "E. Müll.", author: ["E. Müll."]} } }]
1022
+ expect(pos(sn)).to eq({ 0 => ["genus", 15], 16 => ["species", 26],
1023
+ 28 => ["author_word", 30], 31 => ["author_word", 36],
1024
+ 46 => ["author_word", 48], 61 => ["author_word", 65],
1025
+ 66 => ["year", 70] })
821
1026
  end
822
1027
 
823
- it 'does not parse serveral authors groups with several years NOT CORRECT' do
824
- expect(parse("Pseudocercospora dendrobii (H.C. Burnett 1883) (Leight.) (Movss. 1967) U. Braun & Crous 2003")).to be_nil
1028
+ it "does not parse serveral authors groups with several years NOT CORRECT" do
1029
+ expect(parse("Pseudocercospora dendrobii (H.C. Burnett 1883) "\
1030
+ "(Leight.) (Movss. 1967) U. Braun & Crous 2003")).to be_nil
825
1031
  end
826
1032
 
827
1033
  it "does not parse unallowed utf-8 chars in name part" do
@@ -831,47 +1037,90 @@ describe ScientificNameClean do
831
1037
  end
832
1038
 
833
1039
  it "parses new stuff" do
834
- sn = 'Nesticus quelpartensis Paik & Namkung, in Paik, Yaginuma & Namkung, 1969'
835
- expect(details(sn)).to eq [{:genus=>{:string=>"Nesticus"}, :species=>{:string=>"quelpartensis", :authorship=>"Paik & Namkung, in Paik, Yaginuma & Namkung, 1969", :basionymAuthorTeam=>{:authorTeam=>"Paik & Namkung", :author=>["Paik", "Namkung"], :exAuthorTeam=>{:authorTeam=>"Paik, Yaginuma & Namkung", :author=>["Paik", "Yaginuma", "Namkung"], :year=>"1969"}}}}]
836
- expect(parse('Dipoena yoshidai Ono, in Ono et al., 1991')).to_not be_nil
837
- sn = 'Latrodectus mactans bishopi Kaston, 1938'
838
- expect(details(sn)).to eq [{:genus=>{:string=>"Latrodectus"}, :species=>{:string=>"mactans"}, :infraspecies=>[{:string=>"bishopi", :rank=>"n/a", :authorship=>"Kaston, 1938", :basionymAuthorTeam=>{:authorTeam=>"Kaston", :author=>["Kaston"], :year=>"1938"}}]}]
839
- sn = 'Thiobacillus x Parker and Prisk 1953' #have to figure out black lists for this one
840
- sn = 'Bacille de Plaut, Kritchevsky and Séguin 1921'
841
- expect(details(sn)).to eq [{:uninomial=>{:string=>"Bacille", :authorship=>"de Plaut, Kritchevsky and Séguin 1921", :basionymAuthorTeam=>{:authorTeam=>"de Plaut, Kritchevsky and Séguin", :author=>["de Plaut", "Kritchevsky", "Séguin"], :year=>"1921"}}}]
842
- sn = 'Araneus van bruysseli Petrunkevitch, 1911'
843
- expect(details(sn)).to eq [{:genus=>{:string=>"Araneus"}, :species=>{:string=>"van"}, :infraspecies=>[{:string=>"bruysseli", :rank=>"n/a", :authorship=>"Petrunkevitch, 1911", :basionymAuthorTeam=>{:authorTeam=>"Petrunkevitch", :author=>["Petrunkevitch"], :year=>"1911"}}]}]
844
- sn = 'Sapromyces laidlawi ab Sabin 1941'
845
- expect(details(sn)).to eq [{:genus=>{:string=>"Sapromyces"}, :species=>{:string=>"laidlawi", :authorship=>"ab Sabin 1941", :basionymAuthorTeam=>{:authorTeam=>"ab Sabin", :author=>["ab Sabin"], :year=>"1941"}}}]
846
- sn = 'Nocardia rugosa di Marco and Spalla 1957'
847
- expect(details(sn)).to eq [{:genus=>{:string=>"Nocardia"}, :species=>{:string=>"rugosa", :authorship=>"di Marco and Spalla 1957", :basionymAuthorTeam=>{:authorTeam=>"di Marco and Spalla", :author=>["di Marco", "Spalla"], :year=>"1957"}}}]
848
- sn = 'Flexibacter elegans Lewin 1969 non Soriano 1945'
849
- expect(details(sn)).to eq [{:genus=>{:string=>"Flexibacter"}, :species=>{:string=>"elegans", :authorship=>"Lewin 1969 non Soriano 1945", :basionymAuthorTeam=>{:authorTeam=>"Lewin", :author=>["Lewin"], :year=>"1969"}}}]
850
- sn = 'Flexibacter elegans Soriano 1945, non Lewin 1969'
851
- expect(details(sn)).to eq [{:genus=>{:string=>"Flexibacter"}, :species=>{:string=>"elegans", :authorship=>"Soriano 1945, non Lewin 1969", :basionymAuthorTeam=>{:authorTeam=>"Soriano", :author=>["Soriano"], :year=>"1945"}}}]
852
- sn = 'Schottera nicaeënsis (J.V. Lamouroux ex Duby) Guiry & Hollenberg'
853
- expect(details(sn)).to eq [{:genus=>{:string=>"Schottera"}, :species=>{:string=>"nicaeensis", :authorship=>"(J.V. Lamouroux ex Duby) Guiry & Hollenberg", :combinationAuthorTeam=>{:authorTeam=>"Guiry & Hollenberg", :author=>["Guiry", "Hollenberg"]}, :basionymAuthorTeam=>{:authorTeam=>"J.V. Lamouroux", :author=>["J.V. Lamouroux"], :exAuthorTeam=>{:authorTeam=>"Duby", :author=>["Duby"]}}}}]
854
- sn = 'Deschampsia cespitosa ssp pumila'
855
- expect(details(sn)).to eq [{:genus=>{:string=>"Deschampsia"}, :species=>{:string=>"cespitosa"}, :infraspecies=>[{:string=>"pumila", :rank=>"ssp"}]}]
1040
+ sn = "Nesticus quelpartensis Paik & Namkung, in Paik, "\
1041
+ "Yaginuma & Namkung, 1969"
1042
+ expect(details(sn)).to eq [{ genus: { string: "Nesticus" },
1043
+ species: { string: "quelpartensis",
1044
+ authorship: "Paik & Namkung, in Paik, Yaginuma & Namkung, 1969",
1045
+ basionymAuthorTeam: { authorTeam: "Paik & Namkung",
1046
+ author: ["Paik", "Namkung"], exAuthorTeam:
1047
+ { authorTeam: "Paik, Yaginuma & Namkung",
1048
+ author: ["Paik", "Yaginuma", "Namkung"], year: "1969"} } } }]
1049
+ expect(parse("Dipoena yoshidai Ono, in Ono et al., 1991")).to_not be_nil
1050
+ sn = "Latrodectus mactans bishopi Kaston, 1938"
1051
+ expect(details(sn)).to eq [{ genus: { string: "Latrodectus" },
1052
+ species: { string: "mactans"}, infraspecies: [{ string: "bishopi",
1053
+ rank: "n/a", authorship: "Kaston, 1938",
1054
+ basionymAuthorTeam: { authorTeam: "Kaston",
1055
+ author: ["Kaston"], year: "1938"} }]}]
1056
+ #have to figure out black lists for this one
1057
+ sn = "Thiobacillus x Parker and Prisk 1953"
1058
+ sn = "Bacille de Plaut, Kritchevsky and Séguin 1921"
1059
+ expect(details(sn)).to eq [{ uninomial: { string: "Bacille",
1060
+ authorship: "de Plaut, Kritchevsky and Séguin 1921",
1061
+ basionymAuthorTeam: { authorTeam: "de Plaut, Kritchevsky and Séguin",
1062
+ author: ["de Plaut", "Kritchevsky", "Séguin"], year: "1921" } } }]
1063
+ sn = "Araneus van bruysseli Petrunkevitch, 1911"
1064
+ expect(details(sn)).to eq [{ genus: { string: "Araneus" },
1065
+ species: { string: "van"}, infraspecies: [{ string: "bruysseli",
1066
+ rank: "n/a", authorship: "Petrunkevitch, 1911",
1067
+ basionymAuthorTeam: { authorTeam: "Petrunkevitch",
1068
+ author: ["Petrunkevitch"], year: "1911"} }]}]
1069
+ sn = "Sapromyces laidlawi ab Sabin 1941"
1070
+ expect(details(sn)).to eq [{ genus: { string: "Sapromyces" },
1071
+ species: { string: "laidlawi", authorship: "ab Sabin 1941",
1072
+ basionymAuthorTeam: { authorTeam: "ab Sabin", author: ["ab Sabin"],
1073
+ year: "1941"} } }]
1074
+ sn = "Nocardia rugosa di Marco and Spalla 1957"
1075
+ expect(details(sn)).to eq [{ genus: { string: "Nocardia" },
1076
+ species: { string: "rugosa", authorship: "di Marco and Spalla 1957",
1077
+ basionymAuthorTeam: { authorTeam: "di Marco and Spalla",
1078
+ author: ["di Marco", "Spalla"], year: "1957"} } }]
1079
+ sn = "Flexibacter elegans Lewin 1969 non Soriano 1945"
1080
+ expect(details(sn)).to eq [{ genus: { string: "Flexibacter" },
1081
+ species: { string: "elegans", authorship: "Lewin 1969 non Soriano 1945",
1082
+ basionymAuthorTeam: { authorTeam: "Lewin", author: ["Lewin"],
1083
+ year: "1969"} } }]
1084
+ sn = "Flexibacter elegans Soriano 1945, non Lewin 1969"
1085
+ expect(details(sn)).to eq [{ genus: { string: "Flexibacter" },
1086
+ species: { string: "elegans", authorship: "Soriano 1945, non Lewin 1969",
1087
+ basionymAuthorTeam: { authorTeam: "Soriano", author: ["Soriano"],
1088
+ year: "1945"} } }]
1089
+ sn = "Schottera nicaeënsis (J.V. Lamouroux ex Duby) Guiry & Hollenberg"
1090
+ expect(details(sn)).to eq [{ genus: { string: "Schottera" },
1091
+ species: { string: "nicaeensis",
1092
+ authorship: "(J.V. Lamouroux ex Duby) Guiry & Hollenberg",
1093
+ combinationAuthorTeam: { authorTeam: "Guiry & Hollenberg",
1094
+ author: ["Guiry", "Hollenberg"]}, basionymAuthorTeam:
1095
+ { authorTeam: "J.V. Lamouroux", author: ["J.V. Lamouroux"],
1096
+ exAuthorTeam: { authorTeam: "Duby", author: ["Duby"]} } } }]
1097
+ sn = "Deschampsia cespitosa ssp pumila"
1098
+ expect(details(sn)).to eq [{ genus: { string: "Deschampsia" },
1099
+ species: { string: "cespitosa"},
1100
+ infraspecies: [{ string: "pumila", rank: "ssp"}]}]
856
1101
  end
857
1102
 
858
1103
  # Combination genus names merges without dash or capital letter
859
- it 'parses hybrid names with capitalized second name in genus (botanical code error)' do
860
- sn = 'Anacampti-Platanthera P. Fourn.'
1104
+ it "parses hybrid names with capitalized second name in genus" do
1105
+ # (botanical code error)
1106
+ sn = "Anacampti-Platanthera P. Fourn."
861
1107
  expect(parse(sn)).to_not be_nil
862
- expect(canonical(sn)).to eq 'Anacamptiplatanthera'
863
- sn = 'Anacampti-Platanthera vulgaris P. Fourn.'
1108
+ expect(canonical(sn)).to eq "Anacamptiplatanthera"
1109
+ sn = "Anacampti-Platanthera vulgaris P. Fourn."
864
1110
  expect(parse(sn)).to_not be_nil
865
- expect(canonical(sn)).to eq 'Anacamptiplatanthera vulgaris'
1111
+ expect(canonical(sn)).to eq "Anacamptiplatanthera vulgaris"
866
1112
  end
867
1113
 
868
- it 'parses genus names starting with uppercase letters AE OE' do
869
- sn = 'AEmona separata Broun 1921'
870
- expect(canonical(sn)).to eq 'Aemona separata'
871
- sn = 'OEmona simplex White, 1855'
872
- expect(canonical(sn)).to eq 'Oemona simplex'
1114
+ it "parses genus names starting with uppercase letters AE OE" do
1115
+ sn = "AEmona separata Broun 1921"
1116
+ expect(canonical(sn)).to eq "Aemona separata"
1117
+ sn = "OEmona simplex White, 1855"
1118
+ expect(canonical(sn)).to eq "Oemona simplex"
873
1119
  end
874
- #"Arthrosamanea eriorhachis (Harms & sine ref. ) Aubrév." -- ignore & sine ref. (means without reference)
1120
+
1121
+
1122
+ #"Arthrosamanea eriorhachis (Harms & sine ref. ) Aubrév."
1123
+ # -- ignore & sine ref. (means without reference)
875
1124
 
876
1125
  =begin
877
1126
  new stuff
@@ -881,7 +1130,8 @@ describe ScientificNameClean do
881
1130
  sn
882
1131
  Tamiops swinhoei near hainanus|Tamiops swinhoei near hainanus
883
1132
  Conus textile form archiepiscopus|Conus textile form archiepiscopus|
884
- Crypticus pseudosericeus ssp. olivieri Desbrochers des Loges,1881|Crypticus pseudosericeus olivieri des
1133
+ Crypticus pseudosericeus ssp. olivieri Desbrochers des \
1134
+ Loges,1881|Crypticus pseudosericeus olivieri des
885
1135
  Solanum nigrum subsp nigrum|Solanum nigrum subsp nigrum
886
1136
  Protoglossus taeniatum author unknown|Protoglossus taeniatum author unknown
887
1137
  Dupontiella (S. ?) bicolor|Dupontiella|