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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +53 -8
  3. data/bel.gemspec +10 -15
  4. data/bin/bel +63 -4
  5. data/bin/bel2rdf.rb +1 -1
  6. data/bin/bel_compare.rb +1 -1
  7. data/bin/bel_parse.rb +1 -1
  8. data/bin/bel_rdfschema.rb +1 -1
  9. data/bin/bel_summarize.rb +1 -1
  10. data/bin/bel_upgrade.rb +1 -1
  11. data/lib/bel.rb +8 -10
  12. data/lib/bel/completion.rb +3 -2
  13. data/lib/bel/completion/value_match_rule.rb +10 -0
  14. data/lib/bel/evidence_model/citation.rb +101 -43
  15. data/lib/bel/evidence_model/evidence.rb +2 -2
  16. data/lib/bel/evidence_model/experiment_context.rb +1 -0
  17. data/lib/bel/evidence_model/metadata.rb +15 -2
  18. data/lib/bel/evidence_model/references.rb +10 -10
  19. data/lib/bel/json.rb +63 -0
  20. data/lib/bel/json/adapter/multi_json.rb +36 -0
  21. data/lib/bel/json/adapter/oj.rb +65 -0
  22. data/lib/bel/json/adapter/ruby_json.rb +28 -0
  23. data/lib/bel/json/reader.rb +9 -0
  24. data/lib/bel/json/writer.rb +9 -0
  25. data/lib/bel/libbel.rb +1 -4
  26. data/lib/bel/parser.rb +2 -2
  27. data/lib/bel/rdf_repository.rb +18 -0
  28. data/lib/bel/rdf_repository/plugins/memory.rb +28 -0
  29. data/lib/bel/rdf_repository/plugins/mongo.rb +28 -0
  30. data/lib/bel/resource.rb +24 -0
  31. data/lib/bel/resource/namespace.rb +122 -0
  32. data/lib/bel/resource/namespace_value.rb +69 -0
  33. data/lib/bel/resource/namespaces.rb +83 -0
  34. data/lib/bel/resource/search.rb +26 -0
  35. data/lib/bel/resource/search/api.rb +36 -0
  36. data/lib/bel/resource/search/search_result.rb +32 -0
  37. data/lib/bel/translate.rb +108 -0
  38. data/lib/bel/translator.rb +69 -0
  39. data/lib/bel/translator/plugins/bel_script.rb +36 -0
  40. data/lib/bel/translator/plugins/bel_script/bel_yielder.rb +144 -0
  41. data/lib/bel/translator/plugins/bel_script/evidence_yielder.rb +95 -0
  42. data/lib/bel/translator/plugins/bel_script/translator.rb +24 -0
  43. data/lib/bel/translator/plugins/jgf.rb +37 -0
  44. data/lib/bel/translator/plugins/jgf/translator.rb +160 -0
  45. data/lib/bel/translator/plugins/json_evidence.rb +38 -0
  46. data/lib/bel/translator/plugins/json_evidence/translator.rb +90 -0
  47. data/lib/bel/translator/plugins/rdf.rb +48 -0
  48. data/lib/bel/translator/plugins/rdf/bel_schema.rb +339 -0
  49. data/lib/bel/translator/plugins/rdf/monkey_patch.rb +310 -0
  50. data/lib/bel/translator/plugins/rdf/reader.rb +173 -0
  51. data/lib/bel/translator/plugins/rdf/translator.rb +40 -0
  52. data/lib/bel/translator/plugins/rdf/writer.rb +45 -0
  53. data/lib/bel/translator/plugins/xbel.rb +36 -0
  54. data/lib/bel/translator/plugins/xbel/evidence_handler.rb +468 -0
  55. data/lib/bel/translator/plugins/xbel/evidence_yielder.rb +24 -0
  56. data/lib/bel/translator/plugins/xbel/translator.rb +24 -0
  57. data/lib/bel/translator/plugins/xbel/xbel_yielder.rb +414 -0
  58. data/lib/bel/vendor/little-plugger.rb +323 -0
  59. data/lib/bel/version.rb +1 -1
  60. metadata +44 -158
  61. data/lib/bel/extension.rb +0 -37
  62. data/lib/bel/extension_format.rb +0 -207
  63. data/lib/bel/extensions/bel.rb +0 -258
  64. data/lib/bel/extensions/jgf.rb +0 -219
  65. data/lib/bel/extensions/json/jrjackson.rb +0 -31
  66. data/lib/bel/extensions/json/json.rb +0 -133
  67. data/lib/bel/extensions/json/multi_json.rb +0 -29
  68. data/lib/bel/extensions/json/oj.rb +0 -68
  69. data/lib/bel/extensions/json/ruby_json.rb +0 -29
  70. data/lib/bel/extensions/rdf/bel_rdf.rb +0 -338
  71. data/lib/bel/extensions/rdf/rdf.rb +0 -584
  72. data/lib/bel/extensions/xbel.rb +0 -923
  73. 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