bel 0.3.3 → 0.4.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -8
- data/bel.gemspec +10 -15
- data/bin/bel +63 -4
- data/bin/bel2rdf.rb +1 -1
- data/bin/bel_compare.rb +1 -1
- data/bin/bel_parse.rb +1 -1
- data/bin/bel_rdfschema.rb +1 -1
- data/bin/bel_summarize.rb +1 -1
- data/bin/bel_upgrade.rb +1 -1
- data/lib/bel.rb +8 -10
- data/lib/bel/completion.rb +3 -2
- data/lib/bel/completion/value_match_rule.rb +10 -0
- data/lib/bel/evidence_model/citation.rb +101 -43
- data/lib/bel/evidence_model/evidence.rb +2 -2
- data/lib/bel/evidence_model/experiment_context.rb +1 -0
- data/lib/bel/evidence_model/metadata.rb +15 -2
- data/lib/bel/evidence_model/references.rb +10 -10
- data/lib/bel/json.rb +63 -0
- data/lib/bel/json/adapter/multi_json.rb +36 -0
- data/lib/bel/json/adapter/oj.rb +65 -0
- data/lib/bel/json/adapter/ruby_json.rb +28 -0
- data/lib/bel/json/reader.rb +9 -0
- data/lib/bel/json/writer.rb +9 -0
- data/lib/bel/libbel.rb +1 -4
- data/lib/bel/parser.rb +2 -2
- data/lib/bel/rdf_repository.rb +18 -0
- data/lib/bel/rdf_repository/plugins/memory.rb +28 -0
- data/lib/bel/rdf_repository/plugins/mongo.rb +28 -0
- data/lib/bel/resource.rb +24 -0
- data/lib/bel/resource/namespace.rb +122 -0
- data/lib/bel/resource/namespace_value.rb +69 -0
- data/lib/bel/resource/namespaces.rb +83 -0
- data/lib/bel/resource/search.rb +26 -0
- data/lib/bel/resource/search/api.rb +36 -0
- data/lib/bel/resource/search/search_result.rb +32 -0
- data/lib/bel/translate.rb +108 -0
- data/lib/bel/translator.rb +69 -0
- data/lib/bel/translator/plugins/bel_script.rb +36 -0
- data/lib/bel/translator/plugins/bel_script/bel_yielder.rb +144 -0
- data/lib/bel/translator/plugins/bel_script/evidence_yielder.rb +95 -0
- data/lib/bel/translator/plugins/bel_script/translator.rb +24 -0
- data/lib/bel/translator/plugins/jgf.rb +37 -0
- data/lib/bel/translator/plugins/jgf/translator.rb +160 -0
- data/lib/bel/translator/plugins/json_evidence.rb +38 -0
- data/lib/bel/translator/plugins/json_evidence/translator.rb +90 -0
- data/lib/bel/translator/plugins/rdf.rb +48 -0
- data/lib/bel/translator/plugins/rdf/bel_schema.rb +339 -0
- data/lib/bel/translator/plugins/rdf/monkey_patch.rb +310 -0
- data/lib/bel/translator/plugins/rdf/reader.rb +173 -0
- data/lib/bel/translator/plugins/rdf/translator.rb +40 -0
- data/lib/bel/translator/plugins/rdf/writer.rb +45 -0
- data/lib/bel/translator/plugins/xbel.rb +36 -0
- data/lib/bel/translator/plugins/xbel/evidence_handler.rb +468 -0
- data/lib/bel/translator/plugins/xbel/evidence_yielder.rb +24 -0
- data/lib/bel/translator/plugins/xbel/translator.rb +24 -0
- data/lib/bel/translator/plugins/xbel/xbel_yielder.rb +414 -0
- data/lib/bel/vendor/little-plugger.rb +323 -0
- data/lib/bel/version.rb +1 -1
- metadata +44 -158
- data/lib/bel/extension.rb +0 -37
- data/lib/bel/extension_format.rb +0 -207
- data/lib/bel/extensions/bel.rb +0 -258
- data/lib/bel/extensions/jgf.rb +0 -219
- data/lib/bel/extensions/json/jrjackson.rb +0 -31
- data/lib/bel/extensions/json/json.rb +0 -133
- data/lib/bel/extensions/json/multi_json.rb +0 -29
- data/lib/bel/extensions/json/oj.rb +0 -68
- data/lib/bel/extensions/json/ruby_json.rb +0 -29
- data/lib/bel/extensions/rdf/bel_rdf.rb +0 -338
- data/lib/bel/extensions/rdf/rdf.rb +0 -584
- data/lib/bel/extensions/xbel.rb +0 -923
- data/lib/bel/format.rb +0 -58
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require_relative 'evidence_handler'
|
3
|
+
|
4
|
+
module BEL::Translator::Plugins
|
5
|
+
|
6
|
+
module Xbel
|
7
|
+
|
8
|
+
class EvidenceYielder
|
9
|
+
|
10
|
+
def initialize(io)
|
11
|
+
@io = io
|
12
|
+
end
|
13
|
+
|
14
|
+
def each(&block)
|
15
|
+
if block_given?
|
16
|
+
handler = EvidenceHandler.new(block)
|
17
|
+
REXML::Document.parse_stream(@io, handler)
|
18
|
+
else
|
19
|
+
to_enum(:each)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'evidence_yielder'
|
2
|
+
require_relative 'xbel_yielder'
|
3
|
+
|
4
|
+
module BEL::Translator::Plugins
|
5
|
+
|
6
|
+
module Xbel
|
7
|
+
|
8
|
+
class XbelTranslator
|
9
|
+
|
10
|
+
include ::BEL::Translator
|
11
|
+
|
12
|
+
def read(data)
|
13
|
+
EvidenceYielder.new(data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def write(objects, writer = StringIO.new, options = {})
|
17
|
+
XBELYielder.new(objects).each { |xml_data|
|
18
|
+
writer << xml_data
|
19
|
+
writer.flush
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,414 @@
|
|
1
|
+
require 'bel'
|
2
|
+
require 'rexml/document'
|
3
|
+
|
4
|
+
module BEL::Translator::Plugins
|
5
|
+
|
6
|
+
module Xbel
|
7
|
+
|
8
|
+
class XBELYielder
|
9
|
+
|
10
|
+
FUNCTIONS = ::BEL::Language::FUNCTIONS
|
11
|
+
|
12
|
+
def initialize(data, options = {})
|
13
|
+
@data = data
|
14
|
+
end
|
15
|
+
|
16
|
+
def each
|
17
|
+
if block_given?
|
18
|
+
header_flag = true
|
19
|
+
|
20
|
+
# yield <document>
|
21
|
+
el_document = XBELYielder.document
|
22
|
+
yield start_element_string(el_document)
|
23
|
+
|
24
|
+
el_statement_group = nil
|
25
|
+
evidence_count = 0
|
26
|
+
@data.each { |evidence|
|
27
|
+
if header_flag
|
28
|
+
# document header
|
29
|
+
el_statement_group = XBELYielder.statement_group
|
30
|
+
|
31
|
+
yield element_string(
|
32
|
+
XBELYielder.header(evidence.metadata.document_header)
|
33
|
+
)
|
34
|
+
yield element_string(
|
35
|
+
XBELYielder.namespace_definitions(evidence.references.namespaces)
|
36
|
+
)
|
37
|
+
yield element_string(
|
38
|
+
XBELYielder.annotation_definitions(evidence.references.annotations)
|
39
|
+
)
|
40
|
+
|
41
|
+
yield start_element_string(el_statement_group)
|
42
|
+
|
43
|
+
header_flag = false
|
44
|
+
end
|
45
|
+
|
46
|
+
yield element_string(XBELYielder.evidence(evidence))
|
47
|
+
evidence_count += 1
|
48
|
+
}
|
49
|
+
|
50
|
+
if evidence_count > 0
|
51
|
+
yield end_element_string(el_statement_group)
|
52
|
+
else
|
53
|
+
# empty head sections; required for XBEL schema
|
54
|
+
|
55
|
+
empty_header = Hash[%w(name description version).map { |element|
|
56
|
+
[element, ""]
|
57
|
+
}]
|
58
|
+
yield element_string(XBELYielder.header(empty_header))
|
59
|
+
yield element_string(XBELYielder.namespace_definitions({}))
|
60
|
+
yield element_string(XBELYielder.annotation_definitions({}))
|
61
|
+
yield element_string(XBELYielder.statement_group)
|
62
|
+
end
|
63
|
+
yield end_element_string(el_document)
|
64
|
+
else
|
65
|
+
to_enum(:each)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.evidence(evidence)
|
70
|
+
statement = evidence.bel_statement
|
71
|
+
el_statement = REXML::Element.new('bel:statement')
|
72
|
+
|
73
|
+
el_statement.add_element(self.annotation_group(evidence))
|
74
|
+
self.statement(statement, el_statement)
|
75
|
+
|
76
|
+
el_statement
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.statement(statement, el_statement)
|
80
|
+
if statement.relationship
|
81
|
+
el_statement.add_attribute 'bel:relationship', statement.relationship
|
82
|
+
end
|
83
|
+
|
84
|
+
el_subject = self.subject(statement.subject)
|
85
|
+
el_statement.add_element(el_subject)
|
86
|
+
|
87
|
+
if statement.object
|
88
|
+
el_object = self.object(statement.object)
|
89
|
+
el_statement.add_element(el_object)
|
90
|
+
end
|
91
|
+
|
92
|
+
el_statement
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.subject(subject)
|
96
|
+
el_subject = REXML::Element.new('bel:subject')
|
97
|
+
el_subject.add_element(self.term(subject))
|
98
|
+
|
99
|
+
el_subject
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.object(object)
|
103
|
+
el_object = REXML::Element.new('bel:object')
|
104
|
+
|
105
|
+
case object
|
106
|
+
when ::BEL::Model::Term
|
107
|
+
el_object.add_element(self.term(object))
|
108
|
+
when ::BEL::Model::Statement
|
109
|
+
el_statement = REXML::Element.new('bel:statement')
|
110
|
+
el_object.add_element(el_statement)
|
111
|
+
self.statement(object, el_statement)
|
112
|
+
end
|
113
|
+
el_object
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.term(term)
|
117
|
+
el_term = REXML::Element.new('bel:term')
|
118
|
+
term_fx = term.fx.to_s
|
119
|
+
term_fx = (
|
120
|
+
FUNCTIONS.fetch(term_fx.to_sym, {}).
|
121
|
+
fetch(:long_form, nil) || term_fx
|
122
|
+
).to_s
|
123
|
+
|
124
|
+
el_term.add_attribute 'bel:function', term_fx
|
125
|
+
|
126
|
+
term.arguments.each do |arg|
|
127
|
+
case arg
|
128
|
+
when ::BEL::Model::Term
|
129
|
+
el_term.add_element(self.term(arg))
|
130
|
+
when ::BEL::Model::Parameter
|
131
|
+
el_term.add_element(self.parameter(arg))
|
132
|
+
end
|
133
|
+
end
|
134
|
+
el_term
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.parameter(parameter)
|
138
|
+
el_parameter = REXML::Element.new('bel:parameter')
|
139
|
+
el_parameter.text = parameter.value
|
140
|
+
el_parameter.add_attribute 'bel:ns', parameter.ns
|
141
|
+
el_parameter
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.annotation_group(evidence)
|
145
|
+
el_ag = REXML::Element.new('bel:annotationGroup')
|
146
|
+
|
147
|
+
# XBEL citation
|
148
|
+
if evidence.citation && evidence.citation.valid?
|
149
|
+
el_ag.add_element(self.citation(evidence.citation))
|
150
|
+
end
|
151
|
+
|
152
|
+
# XBEL evidence (::BEL::Model::SummaryText)
|
153
|
+
if evidence.summary_text && evidence.summary_text.value
|
154
|
+
xbel_evidence = REXML::Element.new('bel:evidence')
|
155
|
+
xbel_evidence.text = evidence.summary_text.value
|
156
|
+
el_ag.add_element(xbel_evidence)
|
157
|
+
end
|
158
|
+
|
159
|
+
evidence.experiment_context.each do |annotation|
|
160
|
+
name, value = annotation.values_at(:name, :value)
|
161
|
+
|
162
|
+
if value.respond_to?(:each)
|
163
|
+
value.each do |v|
|
164
|
+
el_anno = REXML::Element.new('bel:annotation')
|
165
|
+
el_anno.text = v
|
166
|
+
el_anno.add_attribute 'bel:refID', name.to_s
|
167
|
+
|
168
|
+
el_ag.add_element(el_anno)
|
169
|
+
end
|
170
|
+
else
|
171
|
+
el_anno = REXML::Element.new('bel:annotation')
|
172
|
+
el_anno.text = value
|
173
|
+
el_anno.add_attribute 'bel:refID', name.to_s
|
174
|
+
|
175
|
+
el_ag.add_element(el_anno)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
metadata_keys = evidence.metadata.keys - [:document_header]
|
180
|
+
metadata_keys.each do |k|
|
181
|
+
v = evidence.metadata[k]
|
182
|
+
if v.respond_to?(:each)
|
183
|
+
v.each do |value|
|
184
|
+
el_anno = REXML::Element.new('bel:annotation')
|
185
|
+
el_anno.text = value
|
186
|
+
el_anno.add_attribute 'bel:refID', k.to_s
|
187
|
+
|
188
|
+
el_ag.add_element(el_anno)
|
189
|
+
end
|
190
|
+
else
|
191
|
+
el_anno = REXML::Element.new('bel:annotation')
|
192
|
+
el_anno.text = v
|
193
|
+
el_anno.add_attribute 'bel:refID', k.to_s
|
194
|
+
|
195
|
+
el_ag.add_element(el_anno)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
el_ag
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.citation(citation)
|
203
|
+
el_citation = REXML::Element.new('bel:citation')
|
204
|
+
|
205
|
+
if citation.type && !citation.type.to_s.empty?
|
206
|
+
el_citation.add_attribute 'bel:type', citation.type
|
207
|
+
end
|
208
|
+
|
209
|
+
if citation.id && !citation.id.to_s.empty?
|
210
|
+
el_reference = REXML::Element.new('bel:reference')
|
211
|
+
el_reference.text = citation.id
|
212
|
+
el_citation.add_element(el_reference)
|
213
|
+
end
|
214
|
+
|
215
|
+
if citation.name && !citation.name.to_s.empty?
|
216
|
+
el_name = REXML::Element.new('bel:name')
|
217
|
+
el_name.text = citation.name
|
218
|
+
el_citation.add_element(el_name)
|
219
|
+
end
|
220
|
+
|
221
|
+
if citation.date && !citation.date.to_s.empty?
|
222
|
+
el_date = REXML::Element.new('bel:date')
|
223
|
+
el_date.text = citation.date
|
224
|
+
el_citation.add_element(el_date)
|
225
|
+
end
|
226
|
+
|
227
|
+
if citation.comment && !citation.comment.to_s.empty?
|
228
|
+
el_comment = REXML::Element.new('bel:comment')
|
229
|
+
el_comment.text = citation.comment
|
230
|
+
el_citation.add_element(el_comment)
|
231
|
+
end
|
232
|
+
|
233
|
+
if citation.authors && !citation.authors.to_s.empty?
|
234
|
+
el_author_group = REXML::Element.new('bel:authorGroup')
|
235
|
+
citation.authors.each do |author|
|
236
|
+
el_author = REXML::Element.new('bel:author')
|
237
|
+
el_author.text = author
|
238
|
+
el_author_group.add_element(el_author)
|
239
|
+
end
|
240
|
+
el_citation.add_element(el_author_group)
|
241
|
+
end
|
242
|
+
|
243
|
+
el_citation
|
244
|
+
end
|
245
|
+
|
246
|
+
def self.document
|
247
|
+
el = REXML::Element.new('bel:document')
|
248
|
+
el.add_namespace('bel', 'http://belframework.org/schema/1.0/xbel')
|
249
|
+
el.add_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
|
250
|
+
el.add_attribute('xsi:schemaLocation', 'http://belframework.org/schema/1.0/xbel http://resource.belframework.org/belframework/1.0/schema/xbel.xsd')
|
251
|
+
|
252
|
+
el
|
253
|
+
end
|
254
|
+
|
255
|
+
def self.statement_group(declare_namespaces = false)
|
256
|
+
el = REXML::Element.new('bel:statementGroup')
|
257
|
+
|
258
|
+
if declare_namespaces
|
259
|
+
el.add_namespace('bel', 'http://belframework.org/schema/1.0/xbel')
|
260
|
+
el.add_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
|
261
|
+
el.add_attribute('xsi:schemaLocation', 'http://belframework.org/schema/1.0/xbel http://resource.belframework.org/belframework/1.0/schema/xbel.xsd')
|
262
|
+
end
|
263
|
+
|
264
|
+
el
|
265
|
+
end
|
266
|
+
|
267
|
+
def self.header(hash)
|
268
|
+
el_header = REXML::Element.new('bel:header')
|
269
|
+
|
270
|
+
# normalize hash keys
|
271
|
+
hash = Hash[
|
272
|
+
hash.map { |k, v|
|
273
|
+
k = k.to_s.dup
|
274
|
+
k.downcase!
|
275
|
+
k.gsub!(/[-_ .]/, '')
|
276
|
+
[k, v]
|
277
|
+
}
|
278
|
+
]
|
279
|
+
|
280
|
+
(%w(name description version copyright) & hash.keys).each do |field|
|
281
|
+
el = REXML::Element.new("bel:#{field}")
|
282
|
+
el.text = hash[field]
|
283
|
+
el_header.add_element(el)
|
284
|
+
end
|
285
|
+
|
286
|
+
# add contactinfo with different element name (contactInfo)
|
287
|
+
if hash.has_key?('contactinfo')
|
288
|
+
el = REXML::Element.new('bel:contactInfo')
|
289
|
+
el.text = hash['contactinfo']
|
290
|
+
el_header.add_element(el)
|
291
|
+
end
|
292
|
+
|
293
|
+
# handle grouping for authors and licenses
|
294
|
+
if hash.has_key?('authors')
|
295
|
+
authors = hash['authors']
|
296
|
+
el_group = REXML::Element.new('bel:authorGroup')
|
297
|
+
|
298
|
+
[authors].flatten.each do |author|
|
299
|
+
el = REXML::Element.new('bel:author')
|
300
|
+
el.text = author.to_s
|
301
|
+
el_group.add_element(el)
|
302
|
+
end
|
303
|
+
el_header.add_element(el_group)
|
304
|
+
end
|
305
|
+
if hash.has_key?('licenses')
|
306
|
+
licenses = hash['licenses']
|
307
|
+
el_group = REXML::Element.new('bel:licenseGroup')
|
308
|
+
|
309
|
+
[licenses].flatten.each do |license|
|
310
|
+
el = REXML::Element.new('bel:license')
|
311
|
+
el.text = license.to_s
|
312
|
+
el_group.add_element(el)
|
313
|
+
end
|
314
|
+
el_header.add_element(el_group)
|
315
|
+
end
|
316
|
+
|
317
|
+
el_header
|
318
|
+
end
|
319
|
+
|
320
|
+
def self.namespace_definitions(hash)
|
321
|
+
el_nd = REXML::Element.new('bel:namespaceGroup')
|
322
|
+
hash.each do |k, v|
|
323
|
+
el = REXML::Element.new('bel:namespace')
|
324
|
+
el.add_attribute 'bel:prefix', k.to_s
|
325
|
+
|
326
|
+
resourceLocation = v.respond_to?(:url) ? v.url : v
|
327
|
+
el.add_attribute 'bel:resourceLocation', "#{resourceLocation}"
|
328
|
+
|
329
|
+
el_nd.add_element(el)
|
330
|
+
end
|
331
|
+
|
332
|
+
el_nd
|
333
|
+
end
|
334
|
+
|
335
|
+
def self.annotation_definitions(hash)
|
336
|
+
el_ad = REXML::Element.new('bel:annotationDefinitionGroup')
|
337
|
+
internal = []
|
338
|
+
external = []
|
339
|
+
hash.each do |k, v|
|
340
|
+
type, domain = v.values_at(:type, :domain)
|
341
|
+
case type.to_sym
|
342
|
+
when :url
|
343
|
+
el = REXML::Element.new('bel:externalAnnotationDefinition')
|
344
|
+
el.add_attribute 'bel:url', domain.to_s
|
345
|
+
el.add_attribute 'bel:id', k.to_s
|
346
|
+
external << el
|
347
|
+
when :pattern
|
348
|
+
el = REXML::Element.new('bel:internalAnnotationDefinition')
|
349
|
+
el.add_attribute 'bel:id', k.to_s
|
350
|
+
el.add_element(REXML::Element.new('bel:description'))
|
351
|
+
el.add_element(REXML::Element.new('bel:usage'))
|
352
|
+
|
353
|
+
el_pattern = REXML::Element.new('bel:patternAnnotation')
|
354
|
+
el_pattern.text =
|
355
|
+
domain.respond_to?(:source) ? domain.source : domain.to_s
|
356
|
+
|
357
|
+
el.add_element(el_pattern)
|
358
|
+
internal << el
|
359
|
+
when :list
|
360
|
+
el = REXML::Element.new('bel:internalAnnotationDefinition')
|
361
|
+
el.add_attribute 'bel:id', k.to_s
|
362
|
+
el.add_element(REXML::Element.new('bel:description'))
|
363
|
+
el.add_element(REXML::Element.new('bel:usage'))
|
364
|
+
|
365
|
+
el_list = REXML::Element.new('bel:listAnnotation')
|
366
|
+
if domain.respond_to?(:each)
|
367
|
+
domain.each do |value|
|
368
|
+
el_list_value = REXML::Element.new('bel:listValue')
|
369
|
+
el_list_value.text = value.to_s
|
370
|
+
el_list.add_element(el_list_value)
|
371
|
+
end
|
372
|
+
else
|
373
|
+
el_list_value = REXML::Element.new('bel:listValue')
|
374
|
+
el_list_value.text = domain.to_s
|
375
|
+
el_list.add_element(el_list_value)
|
376
|
+
end
|
377
|
+
|
378
|
+
el.add_element(el_list)
|
379
|
+
internal << el
|
380
|
+
else
|
381
|
+
el = nil
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
# first add internal annotation definitions
|
386
|
+
internal.each do |internal_element|
|
387
|
+
el_ad.add_element(internal_element)
|
388
|
+
end
|
389
|
+
|
390
|
+
# second add external annotation definitions
|
391
|
+
external.each do |external_element|
|
392
|
+
el_ad.add_element(external_element)
|
393
|
+
end
|
394
|
+
|
395
|
+
el_ad
|
396
|
+
end
|
397
|
+
|
398
|
+
def start_element_string(element)
|
399
|
+
element.to_s.gsub(%r{(/>)}, '>')
|
400
|
+
end
|
401
|
+
private :start_element_string
|
402
|
+
|
403
|
+
def end_element_string(element)
|
404
|
+
"</#{element.expanded_name}>"
|
405
|
+
end
|
406
|
+
private :end_element_string
|
407
|
+
|
408
|
+
def element_string(element)
|
409
|
+
element.to_s
|
410
|
+
end
|
411
|
+
private :element_string
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|