bel 0.3.3 → 0.4.0.beta1

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.
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