dwca_hunter 0.5.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  module DwcaHunter
3
4
  class ResourceArctos < DwcaHunter::Resource
4
-
5
5
  def initialize(opts = {})
6
- @command = 'arctos'
7
- @title = 'Arctos'
8
- @url = 'https://www.dropbox.com/s/3rmny5d8cfm9mmp/arctos.tar.gz?dl=1'
9
- @UUID = 'eea8315d-a244-4625-859a-226675622312'
6
+ @command = "arctos"
7
+ @title = "Arctos"
8
+ @url = "https://www.dropbox.com/s/3rmny5d8cfm9mmp/arctos.tar.gz?dl=1"
9
+ @UUID = "eea8315d-a244-4625-859a-226675622312"
10
10
  @download_path = File.join(Dir.tmpdir,
11
- 'dwca_hunter',
12
- 'arctos',
13
- 'data.zip')
11
+ "dwca_hunter",
12
+ "arctos",
13
+ "data.zip")
14
14
  @synonyms = []
15
15
  @names = []
16
16
  @vernaculars = []
@@ -22,7 +22,7 @@ module DwcaHunter
22
22
 
23
23
  def download
24
24
  puts "Downloading cached verion of the file. Ask Arctos to generate new."
25
- `curl -s -L #{@url} -o #{@download_path}`
25
+ `curl -s -L #{@url} -o #{@download_path}`
26
26
  end
27
27
 
28
28
  def unpack
@@ -30,7 +30,7 @@ module DwcaHunter
30
30
  end
31
31
 
32
32
  def make_dwca
33
- DwcaHunter::logger_write(self.object_id, 'Extracting data')
33
+ DwcaHunter.logger_write(object_id, "Extracting data")
34
34
  get_names
35
35
  generate_dwca
36
36
  end
@@ -45,121 +45,123 @@ module DwcaHunter
45
45
  end
46
46
 
47
47
  def collect_vernaculars
48
- file = CSV.open(File.join(@download_dir, 'common_name.csv'),
49
- headers: true)
48
+ file = CSV.open(File.join(@download_dir, "common_name.csv"),
49
+ headers: true)
50
50
  file.each_with_index do |row, i|
51
+ canonical = row["SCIENTIFIC_NAME"]
52
+ vernacular_name_string = row["COMMON_NAME"]
51
53
 
52
- canonical = row['SCIENTIFIC_NAME']
53
- vernacular_name_string = row['COMMON_NAME']
54
-
55
- if @vernaculars_hash.has_key?(canonical)
54
+ if @vernaculars_hash.key?(canonical)
56
55
  @vernaculars_hash[canonical] << vernacular_name_string
57
56
  else
58
57
  @vernaculars_hash[canonical] = [vernacular_name_string]
59
58
  end
60
59
 
61
- puts "Processed %s vernaculars" % i if i % 10000 == 0
60
+ puts "Processed %s vernaculars" % i if i % 10_000 == 0
62
61
  end
63
62
  end
64
63
 
65
64
  def collect_synonyms
66
- file = CSV.open(File.join(@download_dir, 'relationships.csv'),
67
- headers: true)
65
+ file = CSV.open(File.join(@download_dir, "relationships.csv"),
66
+ headers: true)
68
67
  file.each_with_index do |row, i|
69
- canonical = row['scientific_name']
70
- if @synonyms_hash.has_key?(canonical)
68
+ canonical = row["scientific_name"]
69
+ if @synonyms_hash.key?(canonical)
71
70
  @synonyms_hash[canonical] <<
72
- { name_string: row['related_name'], status: row['TAXON_RELATIONSHIP']}
71
+ { name_string: row["related_name"], status: row["TAXON_RELATIONSHIP"] }
73
72
  else
74
73
  @synonyms_hash[canonical] = [
75
- { name_string: row['related_name'], status: row['TAXON_RELATIONSHIP']}
74
+ { name_string: row["related_name"], status: row["TAXON_RELATIONSHIP"] }
76
75
  ]
77
76
  end
78
- puts "Processed %s synonyms" % i if i % 10000 == 0
77
+ puts "Processed %s synonyms" % i if i % 10_000 == 0
79
78
  end
80
79
  end
81
80
 
82
81
  def collect_names
83
82
  @names_index = {}
84
- file = CSV.open(File.join(@download_dir, 'classification.csv'),
85
- headers: true)
83
+ file = CSV.open(File.join(@download_dir, "classification.csv"),
84
+ headers: true)
86
85
  file.each_with_index do |row, i|
87
- next unless row['display_name']
88
- name_string = row['display_name'].gsub(/<\/?i>/,'')
89
- canonical = row['scientific_name']
90
- kingdom = row['kingdom']
91
- phylum = row['phylum']
92
- klass = row['phylclass']
93
- subclass = row['subclass']
94
- order = row['phylorder']
95
- suborder = row['suborder']
96
- superfamily = row['superfamily']
97
- family = row['family']
98
- subfamily = row['subfamily']
99
- tribe = row['tribe']
100
- genus = row['genus']
101
- subgenus = row['subgenus']
102
- species = row['species']
103
- subspecies = row['subspecies']
104
- code = row['nomenclatural_code']
105
-
106
- taxon_id = "ARCT_#{i+1}"
86
+ next unless row["display_name"]
87
+
88
+ name_string = row["display_name"].gsub(%r{</?i>}, "")
89
+ canonical = row["scientific_name"]
90
+ kingdom = row["kingdom"]
91
+ phylum = row["phylum"]
92
+ klass = row["phylclass"]
93
+ subclass = row["subclass"]
94
+ order = row["phylorder"]
95
+ suborder = row["suborder"]
96
+ superfamily = row["superfamily"]
97
+ family = row["family"]
98
+ subfamily = row["subfamily"]
99
+ tribe = row["tribe"]
100
+ genus = row["genus"]
101
+ subgenus = row["subgenus"]
102
+ species = row["species"]
103
+ subspecies = row["subspecies"]
104
+ code = row["nomenclatural_code"]
105
+
106
+ taxon_id = "ARCT_#{i + 1}"
107
107
  @names << { taxon_id: taxon_id,
108
- name_string: name_string,
109
- kingdom: kingdom,
110
- phylum: phylum,
111
- klass: klass,
112
- order: order,
113
- family: family,
114
- genus: genus,
115
- code: code,
116
- }
108
+ name_string: name_string,
109
+ kingdom: kingdom,
110
+ phylum: phylum,
111
+ klass: klass,
112
+ order: order,
113
+ family: family,
114
+ genus: genus,
115
+ code: code }
117
116
 
118
117
  update_vernacular(taxon_id, canonical)
119
118
  update_synonym(taxon_id, canonical)
120
- puts "Processed %s names" % i if i % 10000 == 0
119
+ puts "Processed %s names" % i if i % 10_000 == 0
121
120
  end
122
121
  end
123
122
 
124
123
  def update_vernacular(taxon_id, canonical)
125
- return unless @vernaculars_hash.has_key?(canonical)
124
+ return unless @vernaculars_hash.key?(canonical)
125
+
126
126
  @vernaculars_hash[canonical].each do |vern|
127
127
  @vernaculars << { taxon_id: taxon_id, vern: vern }
128
128
  end
129
129
  end
130
130
 
131
131
  def update_synonym(taxon_id, canonical)
132
- return unless @synonyms_hash.has_key?(canonical)
132
+ return unless @synonyms_hash.key?(canonical)
133
+
133
134
  @synonyms_hash[canonical].each do |syn|
134
135
  @synonyms << { taxon_id: taxon_id, name_string: syn[:name_string],
135
- status: syn[:status] }
136
+ status: syn[:status] }
136
137
  end
137
138
  end
138
139
 
139
140
  def generate_dwca
140
- DwcaHunter::logger_write(self.object_id,
141
- 'Creating DarwinCore Archive file')
142
- @core = [['http://rs.tdwg.org/dwc/terms/taxonID',
143
- 'http://rs.tdwg.org/dwc/terms/scientificName',
144
- 'http://rs.tdwg.org/dwc/terms/kingdom',
145
- 'http://rs.tdwg.org/dwc/terms/phylum',
146
- 'http://rs.tdwg.org/dwc/terms/class',
147
- 'http://rs.tdwg.org/dwc/terms/order',
148
- 'http://rs.tdwg.org/dwc/terms/family',
149
- 'http://rs.tdwg.org/dwc/terms/genus',
150
- 'http://rs.tdwg.org/dwc/terms/nomenclaturalCode',
151
- ]]
141
+ DwcaHunter.logger_write(object_id,
142
+ "Creating DarwinCore Archive file")
143
+ @core = [["http://rs.tdwg.org/dwc/terms/taxonID",
144
+ "http://rs.tdwg.org/dwc/terms/scientificName",
145
+ "http://rs.tdwg.org/dwc/terms/kingdom",
146
+ "http://rs.tdwg.org/dwc/terms/phylum",
147
+ "http://rs.tdwg.org/dwc/terms/class",
148
+ "http://rs.tdwg.org/dwc/terms/order",
149
+ "http://rs.tdwg.org/dwc/terms/family",
150
+ "http://rs.tdwg.org/dwc/terms/genus",
151
+ "http://rs.tdwg.org/dwc/terms/nomenclaturalCode"]]
152
152
  @names.each do |n|
153
153
  @core << [n[:taxon_id], n[:name_string],
154
- n[:kingdom], n[:phylum], n[:klass], n[:order], n[:family],
155
- n[:genus], n[:code]]
154
+ n[:kingdom], n[:phylum], n[:klass], n[:order], n[:family],
155
+ n[:genus], n[:code]]
156
156
  end
157
157
  @extensions << {
158
158
  data: [[
159
- 'http://rs.tdwg.org/dwc/terms/taxonID',
160
- 'http://rs.tdwg.org/dwc/terms/vernacularName']],
161
- file_name: 'vernacular_names.txt',
162
- row_type: 'http://rs.gbif.org/terms/1.0/VernacularName' }
159
+ "http://rs.tdwg.org/dwc/terms/taxonID",
160
+ "http://rs.tdwg.org/dwc/terms/vernacularName"
161
+ ]],
162
+ file_name: "vernacular_names.txt",
163
+ row_type: "http://rs.gbif.org/terms/1.0/VernacularName"
164
+ }
163
165
 
164
166
  @vernaculars.each do |v|
165
167
  @extensions[-1][:data] << [v[:taxon_id], v[:vern]]
@@ -167,12 +169,12 @@ module DwcaHunter
167
169
 
168
170
  @extensions << {
169
171
  data: [[
170
- 'http://rs.tdwg.org/dwc/terms/taxonID',
171
- 'http://rs.tdwg.org/dwc/terms/scientificName',
172
- 'http://rs.tdwg.org/dwc/terms/taxonomicStatus',
173
- ]],
174
- file_name: 'synonyms.txt',
175
- }
172
+ "http://rs.tdwg.org/dwc/terms/taxonID",
173
+ "http://rs.tdwg.org/dwc/terms/scientificName",
174
+ "http://rs.tdwg.org/dwc/terms/taxonomicStatus"
175
+ ]],
176
+ file_name: "synonyms.txt"
177
+ }
176
178
  @synonyms.each do |s|
177
179
  @extensions[-1][:data] << [s[:taxon_id], s[:name_string], s[:status]]
178
180
  end
@@ -180,14 +182,14 @@ module DwcaHunter
180
182
  id: @uuid,
181
183
  title: @title,
182
184
  authors: [
183
- {email: 'dustymc at gmail dot com'}
184
- ],
185
+ { email: "dustymc at gmail dot com" }
186
+ ],
185
187
  metadata_providers: [
186
- { first_name: 'Dmitry',
187
- last_name: 'Mozzherin',
188
- email: 'dmozzherin@gmail.com' }
189
- ],
190
- abstract: 'Arctos is an ongoing effort to integrate access to specimen data, collection-management tools, and external resources on the internet.',
188
+ { first_name: "Dmitry",
189
+ last_name: "Mozzherin",
190
+ email: "dmozzherin@gmail.com" }
191
+ ],
192
+ abstract: "Arctos is an ongoing effort to integrate access to specimen data, collection-management tools, and external resources on the internet.",
191
193
  url: @url
192
194
  }
193
195
  super
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DwcaHunter
4
+ class ResourceClements < DwcaHunter::Resource
5
+ def initialize(opts = {})
6
+ @command = "clements-ebird"
7
+ @title = "The eBird/Clements Checklist of Birds of the World"
8
+ @url = "https://uofi.box.com/shared/static/b4n8zqa99hq9rdga27skkh3870yhujgo.csv"
9
+ @UUID = "577c0b56-4a3c-4314-8724-14b304f601de"
10
+ @download_path = File.join(Dir.tmpdir,
11
+ "dwca_hunter",
12
+ "clements",
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 cached and modified version of the file."
25
+ puts "Go to https://www.birds.cornell.edu/clementschecklist/download/ " \
26
+ "for updates."
27
+ `curl -s -L #{@url} -o #{@download_path}`
28
+ end
29
+
30
+ def unpack
31
+ end
32
+
33
+ def make_dwca
34
+ DwcaHunter.logger_write(object_id, "Extracting data")
35
+ get_names
36
+ generate_dwca
37
+ end
38
+
39
+ private
40
+
41
+ def get_names
42
+ Dir.chdir(@download_dir)
43
+ collect_names
44
+ end
45
+
46
+ def collect_names
47
+ @names_index = {}
48
+ file = CSV.open(File.join(@download_dir, "data.csv"),
49
+ headers: true)
50
+ file.each_with_index do |row, i|
51
+ name_string = row["scientific name"]
52
+ canonical = name_string
53
+ kingdom = "Animalia"
54
+ phylum = "Chordata"
55
+ klass = "Aves"
56
+ order = row["order"]
57
+ family = row["family"]
58
+ code = "ICZN"
59
+
60
+ taxon_id = "gn_#{i + 1}"
61
+ @names << { taxon_id: taxon_id,
62
+ name_string: name_string,
63
+ kingdom: kingdom,
64
+ phylum: phylum,
65
+ klass: klass,
66
+ order: order,
67
+ family: family,
68
+ code: code }
69
+
70
+ if row["English name"].to_s != ""
71
+ @vernaculars << {
72
+ taxon_id: taxon_id,
73
+ vern: row["English name"],
74
+ lang: "end"
75
+ }
76
+ end
77
+
78
+ puts "Processed %s names" % i if i % 10_000 == 0
79
+ end
80
+ end
81
+
82
+ def generate_dwca
83
+ DwcaHunter.logger_write(object_id,
84
+ "Creating DarwinCore Archive file")
85
+ @core = [["http://rs.tdwg.org/dwc/terms/taxonID",
86
+ "http://rs.tdwg.org/dwc/terms/scientificName",
87
+ "http://rs.tdwg.org/dwc/terms/kingdom",
88
+ "http://rs.tdwg.org/dwc/terms/phylum",
89
+ "http://rs.tdwg.org/dwc/terms/class",
90
+ "http://rs.tdwg.org/dwc/terms/order",
91
+ "http://rs.tdwg.org/dwc/terms/family",
92
+ "http://rs.tdwg.org/dwc/terms/nomenclaturalCode"]]
93
+ @names.each do |n|
94
+ @core << [n[:taxon_id], n[:name_string],
95
+ n[:kingdom], n[:phylum], n[:klass], n[:order], n[:family],
96
+ n[:code]]
97
+ end
98
+ @extensions << {
99
+ data: [[
100
+ "http://rs.tdwg.org/dwc/terms/taxonID",
101
+ "http://rs.tdwg.org/dwc/terms/vernacularName",
102
+ "http://purl.org/dc/terms/language"
103
+ ]],
104
+ file_name: "vernacular_names.txt",
105
+ row_type: "http://rs.gbif.org/terms/1.0/VernacularName"
106
+ }
107
+
108
+ @vernaculars.each do |v|
109
+ @extensions[-1][:data] << [v[:taxon_id], v[:vern], v[:lang]]
110
+ end
111
+
112
+ @eml = {
113
+ id: @uuid,
114
+ title: @title,
115
+ authors: [
116
+ { first_name: "G. F.",
117
+ last_name: "Clements"
118
+ },
119
+ { first_name: "T. S.",
120
+ last_name: "Schulenberg"
121
+ },
122
+ { first_name: "M. J.",
123
+ last_name: "Iliff"
124
+ },
125
+ { first_name: "S. M.",
126
+ last_name: "Billerman"
127
+ },
128
+ { first_name: "T. A.",
129
+ last_name: "Fredericks"
130
+ },
131
+ { first_name: "B. L.",
132
+ last_name: "Sullivan"
133
+ },
134
+ { first_name: "C. L.",
135
+ last_name: "Wood"
136
+ },
137
+ ],
138
+ metadata_providers: [
139
+ { first_name: "Dmitry",
140
+ last_name: "Mozzherin",
141
+ email: "dmozzherin@gmail.com" }
142
+ ],
143
+ abstract: "The eBird/Clements Checklist of Birds of the World" \
144
+ ": v2019. Downloaded from " \
145
+ "https://www.birds.cornell.edu/clementschecklist/download/",
146
+ url: @url
147
+ }
148
+ super
149
+ end
150
+ end
151
+ end
@@ -1,15 +1,15 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module DwcaHunter
4
4
  class ResourceFreebase < DwcaHunter::Resource
5
5
  def initialize(opts = {})
6
6
  @command = "freebase"
7
- @title = 'Freebase'
8
- @uuid = 'bacd21f0-44e0-43e2-914c-70929916f257'
7
+ @title = "Freebase"
8
+ @uuid = "bacd21f0-44e0-43e2-914c-70929916f257"
9
9
  @download_path = File.join(Dir.tmpdir,
10
- 'dwca_hunter',
11
- 'freebase',
12
- 'data.json')
10
+ "dwca_hunter",
11
+ "freebase",
12
+ "data.json")
13
13
  @data = []
14
14
  @all_taxa = {}
15
15
  @cleaned_taxa = {}
@@ -27,11 +27,11 @@ module DwcaHunter
27
27
  end
28
28
 
29
29
  def download
30
- DwcaHunter::logger_write(self.object_id,
31
- 'Querying freebase for species information...')
30
+ DwcaHunter.logger_write(object_id,
31
+ "Querying freebase for species information...")
32
32
  q = {
33
33
  query: [{
34
- type: '/biology/organism_classification',
34
+ type: "/biology/organism_classification",
35
35
  id: nil,
36
36
  guid: nil,
37
37
  name: nil,
@@ -41,16 +41,16 @@ module DwcaHunter
41
41
  id: nil,
42
42
  guid: nil,
43
43
  scientific_name: nil,
44
- optional: true,
45
- },
44
+ optional: true
45
+ }
46
46
  }],
47
- cursor: true,
47
+ cursor: true
48
48
  }
49
49
 
50
50
  run_query(q)
51
51
 
52
52
  data = JSON.pretty_generate @data
53
- f = open(@download_path, 'w:utf-8')
53
+ f = open(@download_path, "w:utf-8")
54
54
  f.write(data)
55
55
  f.close
56
56
  end
@@ -60,31 +60,32 @@ module DwcaHunter
60
60
  def run_query(q)
61
61
  count = 0
62
62
  requests_num = 0
63
- while true
63
+ loop do
64
64
  freebase_url = "http://api.freebase.com/api/service/mqlread?query=%s" %
65
- URI.encode(q.to_json)
65
+ URI.encode(q.to_json)
66
66
  res = JSON.load RestClient.get(freebase_url)
67
67
  requests_num += 1
68
- break if res['result'] == nil || res['result'].empty?
68
+ break if res["result"].nil? || res["result"].empty?
69
+
69
70
  if requests_num % 10 == 0
70
- DwcaHunter::logger_write(self.object_id,
71
- "Received %s names" % count)
71
+ DwcaHunter.logger_write(object_id,
72
+ "Received %s names" % count)
72
73
  end
73
- count += res['result'].size
74
- res['result'].each { |d| @data << d }
75
- q[:cursor] = res['cursor']
74
+ count += res["result"].size
75
+ res["result"].each { |d| @data << d }
76
+ q[:cursor] = res["cursor"]
76
77
  end
77
78
  end
78
79
 
79
80
  def organize_data
80
- @data = JSON.load(open(@download_path, 'r:utf-8').read)
81
+ @data = JSON.load(open(@download_path, "r:utf-8").read)
81
82
  @data.each do |d|
82
- scientific_name = d['scientific_name'].to_s
83
+ scientific_name = d["scientific_name"].to_s
83
84
  id = d["id"]
84
- parent_id = d['higher_classification'] ?
85
- d['higher_classification']["id"] :
85
+ parent_id = d["higher_classification"] ?
86
+ d["higher_classification"]["id"] :
86
87
  nil
87
- synonyms = d['synonym_scientific_name']
88
+ synonyms = d["synonym_scientific_name"]
88
89
  @all_taxa[id] = { id: id,
89
90
  parent_id: parent_id,
90
91
  scientific_name: scientific_name,
@@ -93,6 +94,7 @@ module DwcaHunter
93
94
 
94
95
  @all_taxa.each do |k, v|
95
96
  next unless v[:scientific_name] && v[:scientific_name].strip != ""
97
+
96
98
  parent_id = v[:parent_id]
97
99
  until (@all_taxa[parent_id] &&
98
100
  @all_taxa[parent_id][:scientific_name]) || parent_id.nil?
@@ -103,29 +105,28 @@ module DwcaHunter
103
105
  v[:parent_id] = parent_id
104
106
  @cleaned_taxa[k] = v
105
107
  end
106
-
107
108
  end
108
109
 
109
110
  def generate_dwca
110
- DwcaHunter::logger_write(self.object_id,
111
- 'Creating DarwinCore Archive file')
112
- @core = [['http://rs.tdwg.org/dwc/terms/taxonID',
113
- 'http://rs.tdwg.org/dwc/terms/scientificName',
114
- 'http://rs.tdwg.org/dwc/terms/parentNameUsageID']]
111
+ DwcaHunter.logger_write(object_id,
112
+ "Creating DarwinCore Archive file")
113
+ @core = [["http://rs.tdwg.org/dwc/terms/taxonID",
114
+ "http://rs.tdwg.org/dwc/terms/scientificName",
115
+ "http://rs.tdwg.org/dwc/terms/parentNameUsageID"]]
115
116
 
116
117
  @extensions << { data: [[
117
- 'http://rs.tdwg.org/dwc/terms/TaxonID',
118
- 'http://rs.tdwg.org/dwc/terms/scientificName',
119
- ]], file_name: 'synonyms.txt' }
120
- DwcaHunter::logger_write(self.object_id,
121
- 'Creating synonyms extension for DarwinCore Archive file')
118
+ "http://rs.tdwg.org/dwc/terms/TaxonID",
119
+ "http://rs.tdwg.org/dwc/terms/scientificName"
120
+ ]], file_name: "synonyms.txt" }
121
+ DwcaHunter.logger_write(object_id,
122
+ "Creating synonyms extension for DarwinCore Archive file")
122
123
  count = 0
123
- @cleaned_taxa.each do |key, taxon|
124
+ @cleaned_taxa.each do |_key, taxon|
124
125
  count += 1
125
126
  @core << [taxon[:id], taxon[:scientific_name], taxon[:parent_id]]
126
127
  if count % BATCH_SIZE == 0
127
- DwcaHunter::logger_write(self.object_id,
128
- "Traversing %s extension data record" % count)
128
+ DwcaHunter.logger_write(object_id,
129
+ "Traversing %s extension data record" % count)
129
130
  end
130
131
  taxon[:synonyms].each do |name|
131
132
  @extensions[-1][:data] << [taxon[:id], name]
@@ -134,19 +135,20 @@ module DwcaHunter
134
135
  @eml = {
135
136
  id: @uuid,
136
137
  title: @title,
137
- license: 'http://creativecommons.org/licenses/by-sa/3.0/',
138
+ license: "http://creativecommons.org/licenses/by-sa/3.0/",
138
139
  authors: [
139
- { url: 'http://www.freebase.com/home' }],
140
- abstract: 'An entity graph of people, places and things, ' +
141
- 'built by a community that loves open data.',
140
+ { url: "http://www.freebase.com/home" }
141
+ ],
142
+ abstract: "An entity graph of people, places and things, " \
143
+ "built by a community that loves open data.",
142
144
  metadata_providers: [
143
- { first_name: 'Dmitry',
144
- last_name: 'Mozzherin',
145
- email: 'dmozzherin@mbl.edu' }],
146
- url: 'http://www.freebase.com/home'
145
+ { first_name: "Dmitry",
146
+ last_name: "Mozzherin",
147
+ email: "dmozzherin@mbl.edu" }
148
+ ],
149
+ url: "http://www.freebase.com/home"
147
150
  }
148
151
  super
149
152
  end
150
-
151
153
  end
152
154
  end