dwca_hunter 0.5.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.byebug_history +45 -0
  3. data/.gitignore +5 -0
  4. data/.rubocop.yml +3 -2
  5. data/.ruby-version +1 -1
  6. data/Gemfile.lock +61 -83
  7. data/LICENSE.txt +1 -1
  8. data/README.md +1 -1
  9. data/dwca_hunter.gemspec +9 -9
  10. data/exe/dwcahunter +1 -3
  11. data/lib/dwca_hunter.rb +39 -8
  12. data/lib/dwca_hunter/resource.rb +5 -0
  13. data/lib/dwca_hunter/resources/aos-birds.rb +143 -0
  14. data/lib/dwca_hunter/resources/arctos.rb +121 -145
  15. data/lib/dwca_hunter/resources/clements.rb +151 -0
  16. data/lib/dwca_hunter/resources/eol.rb +85 -0
  17. data/lib/dwca_hunter/resources/freebase.rb +51 -49
  18. data/lib/dwca_hunter/resources/how-moore-birds.rb +168 -0
  19. data/lib/dwca_hunter/resources/ioc_word_bird.rb +200 -0
  20. data/lib/dwca_hunter/resources/ipni.rb +111 -0
  21. data/lib/dwca_hunter/resources/itis.rb +99 -99
  22. data/lib/dwca_hunter/resources/mammal_divdb.rb +155 -0
  23. data/lib/dwca_hunter/resources/mammal_species.rb +9 -6
  24. data/lib/dwca_hunter/resources/mcz.rb +123 -0
  25. data/lib/dwca_hunter/resources/ncbi.rb +22 -23
  26. data/lib/dwca_hunter/resources/opentree.rb +5 -5
  27. data/lib/dwca_hunter/resources/paleobiodb.rb +193 -0
  28. data/lib/dwca_hunter/resources/paleodb_harvester.rb +140 -0
  29. data/lib/dwca_hunter/resources/sherborn.rb +91 -0
  30. data/lib/dwca_hunter/resources/wikispecies.rb +142 -129
  31. data/lib/dwca_hunter/version.rb +1 -1
  32. metadata +46 -40
  33. data/files/birdlife_7.csv +0 -11862
  34. data/files/fishbase_taxon_cache.tsv +0 -81000
  35. data/files/reptile_checklist_2014_12.csv +0 -15158
  36. data/files/species-black.txt +0 -251
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e30e9b34ea1c46b021bd3c2ec66ccad4996d4a921c7ce78791b84940bd239f05
4
- data.tar.gz: 1be0e7119fd38094f94a53d71460a8f97a59f2e46a5e9740b814f5dcc97b42cd
3
+ metadata.gz: 76fb831d8f9d33d8cfa32221ce4a5a0e82ee8090ed427c6d2eebc96e267b8151
4
+ data.tar.gz: 33c8040ec605718963ee46eef4a2a4c27770ce3cfb53baf7486047a3d0528410
5
5
  SHA512:
6
- metadata.gz: df1d9bebe191ebf8ae72d601f05374edeaeffbb627d08d7981da582559439dd9ad173656d78a7c88b3a9765562efa8a7095c4eaa5ed0f1f3ef856be94f990b63
7
- data.tar.gz: 703bbf2d197a55a8d4e8510e940f77562540983bb5eddc7a7496ed77af5e610ce0ce5d95a1faa25878a8f8b12a17613808898453a0bd6b7aa19a87dc7c5f000e
6
+ metadata.gz: 380a22edce284de5f1e836b8b4ae236b8d43fecb7b72032d4e4d3c071d77da05bb87498f6e2f868b071f935983e64861cd8ce549d6b9ed8d672b8ab7d53da32e
7
+ data.tar.gz: 97a397e0fc24f5705e46287178f4dd1560621995a19b85007609eba4819127b0a98c49a9dd9ea2d946ead54bf5c4f17e2d85cea738f3c9fdf7ba3de3a5c92f93
@@ -1,4 +1,49 @@
1
1
  q
2
+ row
3
+ data
4
+ cc
5
+ c
6
+ data
7
+ c
8
+ data
9
+ c
10
+ data
11
+ c
12
+ data
13
+ c
14
+ data
15
+ q
16
+ p n
17
+ n
18
+ q
19
+ @name_id_json[n]
20
+ n = row[:acc_name].to_sym
21
+ row[:acc_name].to_sym
22
+ row[:acc_name]
23
+ acc_id
24
+ vi acc_id
25
+ q
26
+ @name_id
27
+ acc_id
28
+ id
29
+ q
30
+ DwcaHunter.resources
31
+ q
32
+ DwcaHunter.resources
33
+ q
34
+ res.size
35
+ res.len
36
+ res
37
+ trd
38
+ exit
39
+ pp row
40
+ require "pp"
41
+ pp row
42
+ row["id"]
43
+ row.id
44
+ row
45
+ data
46
+ q
2
47
  c
3
48
  q
4
49
  resource.title =>q
data/.gitignore CHANGED
@@ -56,3 +56,8 @@ tags
56
56
 
57
57
  # vscode
58
58
  .vs
59
+
60
+ # misc
61
+ *.json
62
+ *.csv
63
+ *.txt
@@ -1,5 +1,6 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.4
2
+ NewCops: disable
3
+ TargetRubyVersion: 2.6.6
3
4
  Exclude:
4
5
  - bin/**/*
5
6
  - db/**/*
@@ -30,4 +31,4 @@ Metrics/MethodLength:
30
31
  Naming/FileName:
31
32
  Exclude:
32
33
  - Gemfile
33
- - Rakefile
34
+ - Rakefile
@@ -1 +1 @@
1
- 2.5.1
1
+ 2.6.6
@@ -1,135 +1,113 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dwca_hunter (0.5.1)
5
- biodiversity (~> 3.5)
6
- dwc-archive (~> 1.0)
4
+ dwca_hunter (0.7.0)
5
+ biodiversity (~> 4)
6
+ dwc-archive (~> 1.1.1)
7
7
  gn_uuid (~> 0.5)
8
8
  htmlentities (~> 4.3)
9
- nokogiri (~> 1.8)
9
+ nokogiri (~> 1.10)
10
10
  rest-client (~> 2.0)
11
+ ruby-xz (~> 1.0)
11
12
  thor (~> 0.19)
12
13
 
13
14
  GEM
14
15
  remote: http://rubygems.org/
15
16
  specs:
16
17
  ast (2.4.0)
17
- biodiversity (3.5.0)
18
- gn_uuid (~> 0.5)
19
- parallel (~> 1.12)
20
- treetop (~> 1.6)
21
- unicode_utils (~> 1.4)
18
+ biodiversity (4.1.0)
19
+ ffi (~> 1.11)
22
20
  byebug (10.0.2)
23
- coderay (1.1.2)
24
- coveralls (0.8.22)
21
+ coveralls (0.8.23)
25
22
  json (>= 1.8, < 3)
26
23
  simplecov (~> 0.16.1)
27
24
  term-ansicolor (~> 1.3)
28
- thor (~> 0.19.4)
25
+ thor (>= 0.19.4, < 2.0)
29
26
  tins (~> 1.6)
30
27
  diff-lcs (1.3)
31
- docile (1.3.1)
32
- domain_name (0.5.20180417)
28
+ docile (1.3.2)
29
+ domain_name (0.5.20190701)
33
30
  unf (>= 0.0.5, < 1.0.0)
34
- dwc-archive (1.0.1)
35
- nokogiri (~> 1.8)
36
- parsley-store (~> 0.3)
37
- eventmachine (1.2.7)
38
- gn_uuid (0.5.0)
31
+ dwc-archive (1.1.1)
32
+ biodiversity (~> 4)
33
+ nokogiri (~> 1.10)
34
+ ffi (1.13.1)
35
+ gn_uuid (0.5.1)
39
36
  htmlentities (4.3.4)
37
+ http-accept (1.7.0)
40
38
  http-cookie (1.0.3)
41
39
  domain_name (~> 0.5)
42
- jaro_winkler (1.5.1)
43
- json (2.1.0)
44
- kramdown (1.17.0)
45
- mime-types (3.1)
40
+ json (2.3.0)
41
+ mime-types (3.3.1)
46
42
  mime-types-data (~> 3.2015)
47
- mime-types-data (3.2016.0521)
48
- mini_portile2 (2.3.0)
43
+ mime-types-data (3.2020.0512)
44
+ mini_portile2 (2.4.0)
49
45
  netrc (0.11.0)
50
- nokogiri (1.8.4)
51
- mini_portile2 (~> 2.3.0)
52
- parallel (1.12.1)
53
- parser (2.5.1.2)
46
+ nokogiri (1.10.9)
47
+ mini_portile2 (~> 2.4.0)
48
+ parallel (1.19.1)
49
+ parser (2.7.1.3)
54
50
  ast (~> 2.4.0)
55
- parsley-store (0.3.6)
56
- biodiversity (~> 3.1)
57
- redis (~> 3.0)
58
- polyglot (0.3.5)
59
- powerpack (0.1.2)
60
51
  rainbow (3.0.0)
61
- rake (12.3.1)
62
- redis (3.3.5)
63
- rest-client (2.0.2)
52
+ rake (13.0.1)
53
+ rest-client (2.1.0)
54
+ http-accept (>= 1.7.0, < 2.0)
64
55
  http-cookie (>= 1.0.2, < 2.0)
65
56
  mime-types (>= 1.16, < 4.0)
66
57
  netrc (~> 0.8)
67
- reverse_markdown (1.1.0)
68
- nokogiri
69
- rspec (3.7.0)
70
- rspec-core (~> 3.7.0)
71
- rspec-expectations (~> 3.7.0)
72
- rspec-mocks (~> 3.7.0)
73
- rspec-core (3.7.1)
74
- rspec-support (~> 3.7.0)
75
- rspec-expectations (3.7.0)
58
+ rexml (3.2.4)
59
+ rspec (3.9.0)
60
+ rspec-core (~> 3.9.0)
61
+ rspec-expectations (~> 3.9.0)
62
+ rspec-mocks (~> 3.9.0)
63
+ rspec-core (3.9.2)
64
+ rspec-support (~> 3.9.3)
65
+ rspec-expectations (3.9.2)
76
66
  diff-lcs (>= 1.2.0, < 2.0)
77
- rspec-support (~> 3.7.0)
78
- rspec-mocks (3.7.0)
67
+ rspec-support (~> 3.9.0)
68
+ rspec-mocks (3.9.1)
79
69
  diff-lcs (>= 1.2.0, < 2.0)
80
- rspec-support (~> 3.7.0)
81
- rspec-support (3.7.1)
82
- rubocop (0.58.1)
83
- jaro_winkler (~> 1.5.1)
70
+ rspec-support (~> 3.9.0)
71
+ rspec-support (3.9.3)
72
+ rubocop (0.84.0)
84
73
  parallel (~> 1.10)
85
- parser (>= 2.5, != 2.5.1.1)
86
- powerpack (~> 0.1)
74
+ parser (>= 2.7.0.1)
87
75
  rainbow (>= 2.2.2, < 4.0)
76
+ rexml
77
+ rubocop-ast (>= 0.0.3)
88
78
  ruby-progressbar (~> 1.7)
89
- unicode-display_width (~> 1.0, >= 1.0.1)
90
- ruby-progressbar (1.9.0)
79
+ unicode-display_width (>= 1.4.0, < 2.0)
80
+ rubocop-ast (0.0.3)
81
+ parser (>= 2.7.0.1)
82
+ ruby-progressbar (1.10.1)
83
+ ruby-xz (1.0.0)
91
84
  simplecov (0.16.1)
92
85
  docile (~> 1.1)
93
86
  json (>= 1.8, < 3)
94
87
  simplecov-html (~> 0.10.0)
95
88
  simplecov-html (0.10.2)
96
- solargraph (0.23.5)
97
- coderay (~> 1.1)
98
- eventmachine (~> 1.2, >= 1.2.5)
99
- htmlentities (~> 4.3, >= 4.3.4)
100
- kramdown (~> 1.16)
101
- parser (~> 2.4)
102
- reverse_markdown (~> 1.0, >= 1.0.5)
103
- rubocop (~> 0.52)
104
- thor (~> 0.19, >= 0.19.4)
105
- tilt (~> 2.0)
106
- yard (~> 0.9)
107
- term-ansicolor (1.6.0)
89
+ sync (0.5.0)
90
+ term-ansicolor (1.7.1)
108
91
  tins (~> 1.0)
109
- thor (0.19.4)
110
- tilt (2.0.8)
111
- tins (1.16.3)
112
- treetop (1.6.10)
113
- polyglot (~> 0.3)
92
+ thor (0.20.3)
93
+ tins (1.25.0)
94
+ sync
114
95
  unf (0.1.4)
115
96
  unf_ext
116
- unf_ext (0.0.7.5)
117
- unicode-display_width (1.4.0)
118
- unicode_utils (1.4.0)
119
- yard (0.9.15)
97
+ unf_ext (0.0.7.7)
98
+ unicode-display_width (1.7.0)
120
99
 
121
100
  PLATFORMS
122
101
  ruby
123
102
 
124
103
  DEPENDENCIES
125
- bundler (~> 1.16)
104
+ bundler (~> 2.0)
126
105
  byebug (~> 10.0)
127
106
  coveralls (~> 0.8)
128
107
  dwca_hunter!
129
- rake (~> 12.3)
130
- rspec (~> 3.7)
131
- rubocop (~> 0.58)
132
- solargraph (~> 0.23)
108
+ rake (~> 13.0)
109
+ rspec (~> 3.9)
110
+ rubocop (~> 0.84)
133
111
 
134
112
  BUNDLED WITH
135
- 1.16.3
113
+ 2.1.4
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Marine Biological Laboratory
1
+ Copyright (c) 2011-2020 Dmitry Mozzherin
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -32,7 +32,7 @@ See dwca_hunter/bin/dwca-hunt.rb as a example how to use the code.
32
32
 
33
33
  ## Copyright
34
34
 
35
- Copyright (c) 2011-2016 Dmitry Mozzherin. See LICENSE.txt for further details.
35
+ Copyright (c) 2011-2020 Dmitry Mozzherin. See LICENSE.txt for further details.
36
36
 
37
37
  [code-climate-img]: https://codeclimate.com/badge.png
38
38
  [code-climate]: https://codeclimate.com/github/GlobalNamesArchitecture/dwca_hunter
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
  require "dwca_hunter/version"
7
7
 
8
8
  Gem::Specification.new do |gem|
9
- gem.required_ruby_version = ">= 2.4"
9
+ gem.required_ruby_version = ">= 2.6.6"
10
10
  gem.name = "dwca_hunter"
11
11
  gem.version = DwcaHunter.version
12
12
  gem.license = "MIT"
@@ -26,19 +26,19 @@ Gem::Specification.new do |gem|
26
26
  gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  gem.require_paths = ["lib"]
28
28
 
29
- gem.add_dependency "biodiversity", "~> 3.5"
30
- gem.add_dependency "dwc-archive", "~> 1.0"
29
+ gem.add_dependency "biodiversity", "~> 4"
30
+ gem.add_dependency "dwc-archive", "~> 1.1.1"
31
31
  gem.add_dependency "gn_uuid", "~> 0.5"
32
32
  gem.add_dependency "htmlentities", "~> 4.3"
33
- gem.add_dependency "nokogiri", "~> 1.8"
33
+ gem.add_dependency "nokogiri", "~> 1.10"
34
34
  gem.add_dependency "rest-client", "~> 2.0"
35
+ gem.add_dependency "ruby-xz", "~> 1.0"
35
36
  gem.add_dependency "thor", "~> 0.19"
36
37
 
37
- gem.add_development_dependency "bundler", "~> 1.16"
38
+ gem.add_development_dependency "bundler", "~> 2.0"
38
39
  gem.add_development_dependency "byebug", "~> 10.0"
39
40
  gem.add_development_dependency "coveralls", "~> 0.8"
40
- gem.add_development_dependency "rake", "~> 12.3"
41
- gem.add_development_dependency "rspec", "~> 3.7"
42
- gem.add_development_dependency "rubocop", "~> 0.58"
43
- gem.add_development_dependency "solargraph", "~> 0.23"
41
+ gem.add_development_dependency "rake", "~> 13.0"
42
+ gem.add_development_dependency "rspec", "~> 3.9"
43
+ gem.add_development_dependency "rubocop", "~> 0.84"
44
44
  end
@@ -37,9 +37,7 @@ class DwcaHunterCLI < Thor
37
37
  res = []
38
38
  DwcaHunter.resources.each do |resource|
39
39
  r = resource.new
40
- if add_resource?(search, r)
41
- res << { n: nil, command: r.command, resource: r.title }
42
- end
40
+ res << { n: nil, command: r.command, resource: r.title } if add_resource?(search, r)
43
41
  end
44
42
  res.sort_by { |r| r[:command] }.each_with_object([]) do |r, a|
45
43
  r[:n] = a.size + 1
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "base64"
3
4
  require "biodiversity"
4
- require "logger"
5
- require "fileutils"
6
- require "uri"
7
- require "tmpdir"
8
- require "net/http"
9
- require "json"
10
- require "htmlentities"
11
5
  require "dwc_archive"
12
6
  require "dwca_hunter/resource"
7
+ require "fileutils"
8
+ require "htmlentities"
9
+ require "json"
10
+ require "logger"
11
+ require "net/http"
13
12
  require "rest_client"
14
- require "base64"
13
+ require "tmpdir"
14
+ require "uri"
15
15
 
16
16
  Dir[File.join(__dir__, "dwca_hunter", "*.rb")].
17
17
  each { |f| require f }
@@ -51,5 +51,36 @@ module DwcaHunter
51
51
  c < Resource
52
52
  end
53
53
  end
54
+
55
+ def normalize_authors(auth)
56
+ reg = Regexp.new(/^([\(]?)(.*?)(([\s,\)][^[:upper:]]*)?$)/)
57
+ auth = auth.gsub(/duPont/, 'du Pont')
58
+ match = reg.match(auth)
59
+ return auth if match.nil?
60
+ a1, a2, a3 = match[1..3]
61
+ a2mod = a2.gsub('&', ',')
62
+ ary2 = a2mod.split(',').map(&:strip)
63
+ a2 = move_initials(ary2) if ary2.size > 1
64
+ "#{a1}#{a2}#{a3}"
65
+ end
66
+
67
+ def move_initials(ary)
68
+ res = []
69
+ ary.each do |a|
70
+ if res.empty?
71
+ res << a
72
+ next
73
+ end
74
+ match = /^([[:upper:]]{1,4})(\sJr)?$/.match(a)
75
+ if !match.nil?
76
+ initialls = match[1].split('').join('. ')
77
+ res[-1] = "#{initialls}. #{res[-1]}#{match[2].to_s}"
78
+ else
79
+ res << a
80
+ end
81
+ end
82
+ res.size == 1 ? res[0] : "#{res[0..-2].join(', ')} & #{res[-1]}"
83
+ end
54
84
  end
55
85
  end
86
+
@@ -7,6 +7,11 @@ module DwcaHunter
7
7
  `unzip -qq -u #{file} > /dev/null 2>&1`
8
8
  end
9
9
 
10
+ def self.gunzip(file, dir = nil)
11
+ Dir.chdir(dir) if dir
12
+ `gunzip #{file}`
13
+ end
14
+
10
15
  def initialize(opts)
11
16
  @needs_download = !(opts[:download] == false)
12
17
  @needs_unpack = !(opts[:unpack] == false)
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DwcaHunter
4
+ class ResourceAOS < DwcaHunter::Resource
5
+ def initialize(opts = {})
6
+ @command = "aos-birds"
7
+ @title = "American Ornithological Society"
8
+ @url = "http://checklist.americanornithology.org/taxa.csv"
9
+ @UUID = "91d38806-8435-479f-a18d-705e5cb0767c"
10
+ @download_path = File.join(Dir.tmpdir,
11
+ "dwca_hunter",
12
+ "aos",
13
+ "data.csv")
14
+ @synonyms = []
15
+ @names = []
16
+ @vernaculars = []
17
+ @extensions = []
18
+ @synonyms_hash = {}
19
+ @vernaculars_hash = {}
20
+ super(opts)
21
+ end
22
+
23
+ def download
24
+ puts "Downloading csv from remote"
25
+ `curl -s -L #{@url} -o #{@download_path}`
26
+ end
27
+
28
+ def unpack; end
29
+
30
+ def make_dwca
31
+ DwcaHunter.logger_write(object_id, "Extracting data")
32
+ get_names
33
+ generate_dwca
34
+ end
35
+
36
+ private
37
+
38
+ def get_names
39
+ Dir.chdir(@download_dir)
40
+ collect_names
41
+ end
42
+
43
+ def collect_names
44
+ @names_index = {}
45
+ file = CSV.open(File.join(@download_dir, "data.csv"),
46
+ headers: true)
47
+ file.each_with_index do |row, _i|
48
+ taxon_id = row["id"]
49
+ name_string = row["species"]
50
+ kingdom = "Animalia"
51
+ phylum = "Chordata"
52
+ klass = "Aves"
53
+ order = row["order"]
54
+ family = row["family"]
55
+ genus = row["genus"]
56
+ code = "ICZN"
57
+
58
+ @names << {
59
+ taxon_id: taxon_id,
60
+ name_string: name_string,
61
+ kingdom: kingdom,
62
+ phylum: phylum,
63
+ klass: klass,
64
+ order: order,
65
+ family: family,
66
+ genus: genus,
67
+ code: code
68
+ }
69
+ if row["common_name"].to_s != ""
70
+ @vernaculars << {
71
+ taxon_id: taxon_id,
72
+ vern: row["common_name"],
73
+ lang: "en"
74
+ }
75
+ end
76
+ next unless row["french_name"].to_s != ""
77
+
78
+ @vernaculars << {
79
+ taxon_id: taxon_id,
80
+ vern: row["french_name"],
81
+ lang: "fr"
82
+ }
83
+ end
84
+ end
85
+
86
+ def generate_dwca
87
+ DwcaHunter.logger_write(object_id,
88
+ "Creating DarwinCore Archive file")
89
+ @core = [["http://rs.tdwg.org/dwc/terms/taxonID",
90
+ "http://rs.tdwg.org/dwc/terms/scientificName",
91
+ "http://rs.tdwg.org/dwc/terms/kingdom",
92
+ "http://rs.tdwg.org/dwc/terms/phylum",
93
+ "http://rs.tdwg.org/dwc/terms/class",
94
+ "http://rs.tdwg.org/dwc/terms/order",
95
+ "http://rs.tdwg.org/dwc/terms/family",
96
+ "http://rs.tdwg.org/dwc/terms/genus",
97
+ "http://rs.tdwg.org/dwc/terms/nomenclaturalCode"]]
98
+ @names.each do |n|
99
+ @core << [n[:taxon_id], n[:name_string],
100
+ n[:kingdom], n[:phylum], n[:klass], n[:order], n[:family],
101
+ n[:genus], n[:code]]
102
+ end
103
+ @extensions << {
104
+ data: [[
105
+ "http://rs.tdwg.org/dwc/terms/taxonID",
106
+ "http://rs.tdwg.org/dwc/terms/vernacularName",
107
+ "http://purl.org/dc/terms/language"
108
+ ]],
109
+ file_name: "vernacular_names.txt",
110
+ row_type: "http://rs.gbif.org/terms/1.0/VernacularName"
111
+ }
112
+
113
+ @vernaculars.each do |v|
114
+ @extensions[-1][:data] << [v[:taxon_id], v[:vern], v[:lang]]
115
+ end
116
+ @eml = {
117
+ id: @uuid,
118
+ title: @title,
119
+ authors: [
120
+ { first_name: "R. T.",
121
+ last_name: "Chesser" }
122
+ ],
123
+ metadata_providers: [
124
+ { first_name: "Dmitry",
125
+ last_name: "Mozzherin",
126
+ email: "dmozzherin@gmail.com" }
127
+ ],
128
+ abstract: "The American Ornithological Society's (AOS) Checklist is " \
129
+ "the official source on the taxonomy of birds found in North and " \
130
+ "Middle America, including adjacent islands. This list is produced " \
131
+ "by the North American Classification and Nomenclature Committee " \
132
+ "(NACC) of the AOS.\n\n" \
133
+ "Recommended citation: Chesser, R. T., K. J. Burns, C. Cicero, " \
134
+ "J. L. Dunn, A. W. Kratter, I. J. Lovette, P. C. Rasmussen, " \
135
+ "J. V. Remsen, Jr., D. F. Stotz, and K. Winker. 2019. Check-list " \
136
+ "of North American Birds (online). American Ornithological Society. " \
137
+ "http://checklist.aou.org/taxa",
138
+ url: @url
139
+ }
140
+ super
141
+ end
142
+ end
143
+ end