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
@@ -1,923 +0,0 @@
1
- require 'bel/evidence_model'
2
- require 'bel/language'
3
- require 'rexml/document'
4
- require 'rexml/streamlistener'
5
-
6
- module BEL::Extension::Format
7
-
8
- class FormatXBEL
9
-
10
- include Formatter
11
- ID = :xbel
12
- MEDIA_TYPES = %i(application/xml)
13
- EXTENSIONS = %i(xml xbel)
14
-
15
- def id
16
- ID
17
- end
18
-
19
- def media_types
20
- MEDIA_TYPES
21
- end
22
-
23
- def file_extensions
24
- EXTENSIONS
25
- end
26
-
27
- def deserialize(data)
28
- EvidenceYielder.new(data)
29
- end
30
-
31
- def serialize(objects, writer = StringIO.new)
32
- XBELYielder.new(objects).each { |xml_data|
33
- writer << xml_data
34
- writer.flush
35
- }
36
- end
37
-
38
- private
39
-
40
- class EvidenceYielder
41
-
42
- def initialize(io)
43
- @io = io
44
- end
45
-
46
- def each(&block)
47
- if block_given?
48
- handler = EvidenceHandler.new(block)
49
- REXML::Document.parse_stream(@io, handler)
50
- else
51
- to_enum(:each)
52
- end
53
- end
54
- end
55
-
56
- class XBELYielder
57
-
58
- FUNCTIONS = ::BEL::Language::FUNCTIONS
59
-
60
- def initialize(data, options = {})
61
- @data = data
62
- end
63
-
64
- def each
65
- if block_given?
66
- header_flag = true
67
-
68
- # yield <document>
69
- el_document = XBELYielder.document
70
- yield start_element_string(el_document)
71
-
72
- el_statement_group = nil
73
- evidence_count = 0
74
- @data.each { |evidence|
75
- if header_flag
76
- # document header
77
- el_statement_group = XBELYielder.statement_group
78
-
79
- yield element_string(
80
- XBELYielder.header(evidence.metadata.document_header)
81
- )
82
- yield element_string(
83
- XBELYielder.namespace_definitions(evidence.references.namespace_definitions)
84
- )
85
- yield element_string(
86
- XBELYielder.annotation_definitions(evidence.references.annotation_definitions)
87
- )
88
-
89
- yield start_element_string(el_statement_group)
90
-
91
- header_flag = false
92
- end
93
-
94
- yield element_string(XBELYielder.evidence(evidence))
95
- evidence_count += 1
96
- }
97
-
98
- if evidence_count > 0
99
- yield end_element_string(el_statement_group)
100
- else
101
- # empty head sections; required for XBEL schema
102
- empty_header = Hash[%w(name description version).map { |element|
103
- [element, ""]
104
- }]
105
- yield element_string(XBELYielder.header(empty_header))
106
- yield element_string(XBELYielder.namespace_definitions({}))
107
- yield element_string(XBELYielder.annotation_definitions({}))
108
- yield element_string(XBELYielder.statement_group)
109
- end
110
- yield end_element_string(el_document)
111
- else
112
- to_enum(:each)
113
- end
114
- end
115
-
116
- def self.evidence(evidence)
117
- statement = evidence.bel_statement
118
- el_statement = REXML::Element.new('bel:statement')
119
-
120
- el_statement.add_element(self.annotation_group(evidence))
121
- self.statement(statement, el_statement)
122
-
123
- el_statement
124
- end
125
-
126
- def self.statement(statement, el_statement)
127
- if statement.relationship
128
- el_statement.add_attribute 'bel:relationship', statement.relationship
129
- end
130
-
131
- el_subject = self.subject(statement.subject)
132
- el_statement.add_element(el_subject)
133
-
134
- if statement.object
135
- el_object = self.object(statement.object)
136
- el_statement.add_element(el_object)
137
- end
138
-
139
- el_statement
140
- end
141
-
142
- def self.subject(subject)
143
- el_subject = REXML::Element.new('bel:subject')
144
- el_subject.add_element(self.term(subject))
145
-
146
- el_subject
147
- end
148
-
149
- def self.object(object)
150
- el_object = REXML::Element.new('bel:object')
151
-
152
- case object
153
- when BEL::Model::Term
154
- el_object.add_element(self.term(object))
155
- when BEL::Model::Statement
156
- el_statement = REXML::Element.new('bel:statement')
157
- el_object.add_element(el_statement)
158
- self.statement(object, el_statement)
159
- end
160
- el_object
161
- end
162
-
163
- def self.term(term)
164
- el_term = REXML::Element.new('bel:term')
165
- term_fx = term.fx.to_s
166
- term_fx = (
167
- FUNCTIONS.fetch(term_fx.to_sym, {}).
168
- fetch(:long_form, nil) || term_fx
169
- ).to_s
170
-
171
- el_term.add_attribute 'bel:function', term_fx
172
-
173
- term.arguments.each do |arg|
174
- case arg
175
- when BEL::Model::Term
176
- el_term.add_element(self.term(arg))
177
- when BEL::Model::Parameter
178
- el_term.add_element(self.parameter(arg))
179
- end
180
- end
181
- el_term
182
- end
183
-
184
- def self.parameter(parameter)
185
- el_parameter = REXML::Element.new('bel:parameter')
186
- el_parameter.text = parameter.value
187
- el_parameter.add_attribute 'bel:ns', parameter.ns
188
- el_parameter
189
- end
190
-
191
- def self.annotation_group(evidence)
192
- el_ag = REXML::Element.new('bel:annotationGroup')
193
-
194
- # XBEL citation
195
- if evidence.citation && evidence.citation.valid?
196
- el_ag.add_element(self.citation(evidence.citation))
197
- end
198
-
199
- # XBEL evidence (::BEL::Model::SummaryText)
200
- if evidence.summary_text && evidence.summary_text.value
201
- xbel_evidence = REXML::Element.new('bel:evidence')
202
- xbel_evidence.text = evidence.summary_text.value
203
- el_ag.add_element(xbel_evidence)
204
- end
205
-
206
- evidence.experiment_context.each do |annotation|
207
- name, value = annotation.values_at(:name, :value)
208
-
209
- if value.respond_to?(:each)
210
- value.each do |v|
211
- el_anno = REXML::Element.new('bel:annotation')
212
- el_anno.text = v
213
- el_anno.add_attribute 'bel:refID', name.to_s
214
-
215
- el_ag.add_element(el_anno)
216
- end
217
- else
218
- el_anno = REXML::Element.new('bel:annotation')
219
- el_anno.text = value
220
- el_anno.add_attribute 'bel:refID', name.to_s
221
-
222
- el_ag.add_element(el_anno)
223
- end
224
- end
225
-
226
- metadata_keys = evidence.metadata.keys - [:document_header]
227
- metadata_keys.each do |k|
228
- v = evidence.metadata[k]
229
- if v.respond_to?(:each)
230
- v.each do |value|
231
- el_anno = REXML::Element.new('bel:annotation')
232
- el_anno.text = value
233
- el_anno.add_attribute 'bel:refID', k.to_s
234
-
235
- el_ag.add_element(el_anno)
236
- end
237
- else
238
- el_anno = REXML::Element.new('bel:annotation')
239
- el_anno.text = v
240
- el_anno.add_attribute 'bel:refID', k.to_s
241
-
242
- el_ag.add_element(el_anno)
243
- end
244
- end
245
-
246
- el_ag
247
- end
248
-
249
- def self.citation(citation)
250
- el_citation = REXML::Element.new('bel:citation')
251
-
252
- if citation.type && !citation.type.to_s.empty?
253
- el_citation.add_attribute 'bel:type', citation.type
254
- end
255
-
256
- if citation.id && !citation.id.to_s.empty?
257
- el_reference = REXML::Element.new('bel:reference')
258
- el_reference.text = citation.id
259
- el_citation.add_element(el_reference)
260
- end
261
-
262
- if citation.name && !citation.name.to_s.empty?
263
- el_name = REXML::Element.new('bel:name')
264
- el_name.text = citation.name
265
- el_citation.add_element(el_name)
266
- end
267
-
268
- if citation.date && !citation.date.to_s.empty?
269
- el_date = REXML::Element.new('bel:date')
270
- el_date.text = citation.date
271
- el_citation.add_element(el_date)
272
- end
273
-
274
- if citation.comment && !citation.comment.to_s.empty?
275
- el_comment = REXML::Element.new('bel:comment')
276
- el_comment.text = citation.comment
277
- el_citation.add_element(el_comment)
278
- end
279
-
280
- if citation.authors && !citation.authors.to_s.empty?
281
- el_author_group = REXML::Element.new('bel:authorGroup')
282
- citation.authors.split('|').each do |author|
283
- el_author = REXML::Element.new('bel:author')
284
- el_author.text = author
285
- el_author_group.add_element(el_author)
286
- end
287
- end
288
-
289
- el_citation
290
- end
291
-
292
- def self.document
293
- el = REXML::Element.new('bel:document')
294
- el.add_namespace('bel', 'http://belframework.org/schema/1.0/xbel')
295
- el.add_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
296
- el.add_attribute('xsi:schemaLocation', 'http://belframework.org/schema/1.0/xbel http://resource.belframework.org/belframework/1.0/schema/xbel.xsd')
297
-
298
- el
299
- end
300
-
301
- def self.statement_group(declare_namespaces = false)
302
- el = REXML::Element.new('bel:statementGroup')
303
-
304
- if declare_namespaces
305
- el.add_namespace('bel', 'http://belframework.org/schema/1.0/xbel')
306
- el.add_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
307
- el.add_attribute('xsi:schemaLocation', 'http://belframework.org/schema/1.0/xbel http://resource.belframework.org/belframework/1.0/schema/xbel.xsd')
308
- end
309
-
310
- el
311
- end
312
-
313
- def self.header(hash)
314
- el_header = REXML::Element.new('bel:header')
315
-
316
- # normalize hash keys
317
- hash = Hash[
318
- hash.map { |k, v|
319
- k = k.to_s.dup
320
- k.downcase!
321
- k.gsub!(/[-_ .]/, '')
322
- [k, v]
323
- }
324
- ]
325
-
326
- (%w(name description version copyright) & hash.keys).each do |field|
327
- el = REXML::Element.new("bel:#{field}")
328
- el.text = hash[field]
329
- el_header.add_element(el)
330
- end
331
-
332
- # add contactinfo with different element name (contactInfo)
333
- if hash.has_key?('contactinfo')
334
- el = REXML::Element.new('bel:contactInfo')
335
- el.text = hash['contactinfo']
336
- el_header.add_element(el)
337
- end
338
-
339
- # handle grouping for authors and licenses
340
- if hash.has_key?('authors')
341
- authors = hash['authors']
342
- el_group = REXML::Element.new('bel:authorGroup')
343
-
344
- [authors].flatten.each do |author|
345
- el = REXML::Element.new('bel:author')
346
- el.text = author.to_s
347
- el_group.add_element(el)
348
- end
349
- el_header.add_element(el_group)
350
- end
351
- if hash.has_key?('licenses')
352
- licenses = hash['licenses']
353
- el_group = REXML::Element.new('bel:licenseGroup')
354
-
355
- [licenses].flatten.each do |license|
356
- el = REXML::Element.new('bel:license')
357
- el.text = license.to_s
358
- el_group.add_element(el)
359
- end
360
- el_header.add_element(el_group)
361
- end
362
-
363
- el_header
364
- end
365
-
366
- def self.namespace_definitions(hash)
367
- el_nd = REXML::Element.new('bel:namespaceGroup')
368
- hash.each do |k, v|
369
- el = REXML::Element.new('bel:namespace')
370
- el.add_attribute 'bel:prefix', k.to_s
371
-
372
- resourceLocation = v.respond_to?(:url) ? v.url : v
373
- el.add_attribute 'bel:resourceLocation', "#{resourceLocation}"
374
-
375
- el_nd.add_element(el)
376
- end
377
-
378
- el_nd
379
- end
380
-
381
- def self.annotation_definitions(hash)
382
- el_ad = REXML::Element.new('bel:annotationDefinitionGroup')
383
- internal = []
384
- external = []
385
- hash.each do |k, v|
386
- type, domain = v.values_at(:type, :domain)
387
- case type.to_sym
388
- when :url
389
- el = REXML::Element.new('bel:externalAnnotationDefinition')
390
- el.add_attribute 'bel:url', domain.to_s
391
- el.add_attribute 'bel:id', k.to_s
392
- external << el
393
- when :pattern
394
- el = REXML::Element.new('bel:internalAnnotationDefinition')
395
- el.add_attribute 'bel:id', k.to_s
396
- el.add_element(REXML::Element.new('bel:description'))
397
- el.add_element(REXML::Element.new('bel:usage'))
398
-
399
- el_pattern = REXML::Element.new('bel:patternAnnotation')
400
- el_pattern.text =
401
- domain.respond_to?(:source) ? domain.source : domain.to_s
402
-
403
- el.add_element(el_pattern)
404
- internal << el
405
- when :list
406
- el = REXML::Element.new('bel:internalAnnotationDefinition')
407
- el.add_attribute 'bel:id', k.to_s
408
- el.add_element(REXML::Element.new('bel:description'))
409
- el.add_element(REXML::Element.new('bel:usage'))
410
-
411
- el_list = REXML::Element.new('bel:listAnnotation')
412
- if domain.respond_to?(:each)
413
- domain.each do |value|
414
- el_list_value = REXML::Element.new('bel:listValue')
415
- el_list_value.text = value.to_s
416
- el_list.add_element(el_list_value)
417
- end
418
- else
419
- el_list_value = REXML::Element.new('bel:listValue')
420
- el_list_value.text = domain.to_s
421
- el_list.add_element(el_list_value)
422
- end
423
-
424
- el.add_element(el_list)
425
- internal << el
426
- else
427
- el = nil
428
- end
429
- end
430
-
431
- # first add internal annotation definitions
432
- internal.each do |internal_element|
433
- el_ad.add_element(internal_element)
434
- end
435
-
436
- # second add external annotation definitions
437
- external.each do |external_element|
438
- el_ad.add_element(external_element)
439
- end
440
-
441
- el_ad
442
- end
443
-
444
- def start_element_string(element)
445
- element.to_s.gsub(%r{(/>)}, '>')
446
- end
447
- private :start_element_string
448
-
449
- def end_element_string(element)
450
- "</#{element.expanded_name}>"
451
- end
452
- private :end_element_string
453
-
454
- def element_string(element)
455
- element.to_s
456
- end
457
- private :element_string
458
- end
459
-
460
- class EvidenceHandler
461
- include REXML::StreamListener
462
- include ::BEL::Model
463
-
464
- ANNOTATION = "annotation"
465
- ANNOTATION_DEFINITION_GROUP = "annotationDefinitionGroup"
466
- ANNOTATION_GROUP = "annotationGroup"
467
- AUTHOR = "author"
468
- AUTHOR_GROUP = "authorGroup"
469
- CITATION = "citation"
470
- COMMENT = "comment"
471
- CONTACT_INFO = "contactInfo"
472
- COPYRIGHT = "copyright"
473
- DATE = "date"
474
- DESCRIPTION = "description"
475
- DOCUMENT = "document"
476
- EVIDENCE = "evidence"
477
- EXTERNAL_ANNOTATION_DEFINITION = "externalAnnotationDefinition"
478
- FUNCTION = "function"
479
- HEADER = "header"
480
- ID = "id"
481
- INTERNAL_ANNOTATION_DEFINITION = "internalAnnotationDefinition"
482
- LICENSE = "license"
483
- LICENSE_GROUP = "licenseGroup"
484
- LIST_ANNOTATION = "listAnnotation"
485
- LIST_VALUE = "listValue"
486
- NAME = "name"
487
- NAMESPACE = "namespace"
488
- NAMESPACE_GROUP = "namespaceGroup"
489
- NS = "ns"
490
- OBJECT = "object"
491
- PARAMETER = "parameter"
492
- PATTERN_ANNOTATION = "patternAnnotation"
493
- PREFIX = "prefix"
494
- REFERENCE = "reference"
495
- REF_ID = "refID"
496
- RELATIONSHIP = "relationship"
497
- RESOURCE_LOCATION = "resourceLocation"
498
- STATEMENT = "statement"
499
- STATEMENT_GROUP = "statementGroup"
500
- SUBJECT = "subject"
501
- TERM = "term"
502
- TYPE = "type"
503
- URL = "url"
504
- USAGE = "usage"
505
- VERSION = "version"
506
-
507
- def initialize(callable)
508
- @callable = callable
509
- @element_stack = []
510
- @text = nil
511
- @evidence = Evidence.new
512
- end
513
-
514
- # Called on element start by REXML.
515
- def tag_start(name, attributes)
516
- name.
517
- sub!(/^bel:/, '').
518
- gsub!(/([A-Z])/) { |match| "_#{match.downcase}" }
519
-
520
- start_method = "start_#{name}"
521
- if self.respond_to? start_method
522
- self.send(start_method, attributes)
523
- end
524
- end
525
-
526
- # Called on element end by REXML.
527
- def tag_end(name)
528
- name.
529
- sub!(/^bel:/, '').
530
- gsub!(/([A-Z])/) { |match| "_#{match.downcase}" }
531
-
532
- end_method = "end_#{name}"
533
- if self.respond_to? end_method
534
- self.send end_method
535
- end
536
- end
537
-
538
- # Called on text node by REXML.
539
- def text(*args)
540
- if args.size.zero?
541
- @text = ''
542
- else
543
- @text = args.first
544
- end
545
- end
546
-
547
- # Start element methods, dynamically invoked.
548
-
549
- def start_header(attributes)
550
- @element_stack << :header
551
- end
552
-
553
- def start_namespace_group(attributes)
554
- @element_stack << :namespace_group
555
- end
556
-
557
- def start_annotation_definition_group(attributes)
558
- @element_stack << :annotation_definition_group
559
- end
560
-
561
- def start_namespace(attributes)
562
- if stack_top == :namespace_group
563
- prefix = attr_value(attributes, PREFIX)
564
- resource_location = attr_value(attributes, RESOURCE_LOCATION)
565
- @evidence.references.namespace_definitions[prefix] = resource_location
566
- end
567
- @element_stack << :namespace
568
- end
569
-
570
- def start_external_annotation_definition(attributes)
571
- if stack_top == :annotation_definition_group
572
- id = attr_value(attributes, ID)
573
- url = attr_value(attributes, URL)
574
- @evidence.references.annotation_definitions[id] = {
575
- :type => :url,
576
- :domain => url
577
- }
578
- end
579
- @element_stack << :external_annotation_definition
580
- end
581
-
582
- def start_internal_annotation_definition(attributes)
583
- if stack_top == :annotation_definition_group
584
- id = attr_value(attributes, ID)
585
- @current_anno_def = {}
586
- @evidence.references.annotation_definitions[id] = @current_anno_def
587
- end
588
- @element_stack << :internal_annotation_definition
589
- end
590
-
591
- def start_list_annotation(attributes)
592
- if stack_top == :internal_annotation_definition
593
- @current_anno_def[:type] = :list
594
- @current_anno_def[:domain] = []
595
- end
596
- @element_stack << :list_annotation
597
- end
598
-
599
- def start_pattern_annotation(attributes)
600
- if stack_top == :internal_annotation_definition
601
- @current_anno_def[:type] = :pattern
602
- end
603
- @element_stack << :pattern_annotation
604
- end
605
-
606
- def start_statement_group(attributes)
607
- @element_stack << :statement_group
608
- end
609
-
610
- def start_statement(attributes)
611
- stmt = Statement.new
612
- stmt.relationship = attr_value(attributes, RELATIONSHIP)
613
- if stack_top == :statement_group
614
- @statement_stack = []
615
- @statement_stack << stmt
616
- elsif stack_top == :object
617
- @statement_stack.last.object = stmt
618
- @statement_stack << stmt
619
- end
620
-
621
- @element_stack << :statement
622
- end
623
-
624
- def start_subject(attributes)
625
- @element_stack << :subject
626
- end
627
-
628
- def start_object(attributes)
629
- @element_stack << :object
630
- end
631
-
632
- def start_term(attributes)
633
- term = Term.new(attr_value(attributes, FUNCTION), [])
634
- if stack_top == :subject || stack_top == :object
635
- # outer term
636
- @term_stack = []
637
- elsif stack_top == :term
638
- # nested term
639
- @term_stack.last.arguments << term
640
- end
641
-
642
- @term_stack << term
643
- @element_stack << :term
644
- end
645
-
646
- def start_parameter(attributes)
647
- if stack_top == :term
648
- ns_id = attr_value(attributes, NS)
649
- # XXX Hitting a SystemStackError on line 174 (inside call).
650
- # Example: large_corpus.xbel
651
- ns = {
652
- :prefix => ns_id,
653
- :url => @evidence.references.namespace_definitions[ns_id]
654
- }
655
- @current_parameter = Parameter.new(ns, nil)
656
- end
657
- @element_stack << :parameter
658
- end
659
-
660
- def start_annotation_group(attributes)
661
- @annotation_id = nil
662
- @element_stack << :annotation_group
663
- end
664
-
665
- def start_annotation(attributes)
666
- if @element_stack[-2] == :statement
667
- ref_id = attr_value(attributes, REF_ID)
668
- @annotation_id = ref_id
669
- @element_stack << :annotation
670
- end
671
- end
672
-
673
- def start_citation(attributes)
674
- type = attr_value(attributes, TYPE)
675
- @evidence.citation.type = type
676
- @element_stack << :citation
677
- end
678
-
679
- def start_evidence(attributes)
680
- @element_stack << :evidence
681
- end
682
-
683
- # End element methods, dynamically invoked.
684
-
685
- def end_header
686
- @element_stack.pop
687
- end
688
-
689
- def end_version
690
- if stack_top == :header
691
- @evidence.metadata.document_header['version'] = @text
692
- end
693
- end
694
-
695
- def end_copyright
696
- if stack_top == :header
697
- @evidence.metadata.document_header['copyright'] = @text
698
- end
699
- end
700
-
701
- def end_contact_info
702
- if stack_top == :header
703
- @evidence.metadata.document_header['contactInfo'] = @text
704
- end
705
- end
706
-
707
- def end_license
708
- if stack_top == :header
709
- @evidence.metadata.document_header['licenses'] ||= []
710
- @evidence.metadata.document_header['licenses'] << @text
711
- end
712
- end
713
-
714
- def end_namespace_group
715
- @element_stack.pop
716
- end
717
-
718
- def end_annotation_definition_group
719
- @element_stack.pop
720
- end
721
-
722
- def end_namespace
723
- @element_stack.pop
724
- end
725
-
726
- def end_external_annotation_definition
727
- @element_stack.pop
728
- end
729
-
730
- def end_internal_annotation_definition
731
- @element_stack.pop
732
- end
733
-
734
- def end_list_annotation
735
- @element_stack.pop
736
- end
737
-
738
- def end_pattern_annotation
739
- begin
740
- @current_anno_def[:domain] = Regexp.new(@text)
741
- rescue RegexpError
742
- @text = Regexp.escape(@text)
743
- retry
744
- end
745
- @element_stack.pop
746
- end
747
-
748
- def end_description
749
- if stack_top == :header
750
- @evidence.metadata.document_header['description'] = @text
751
- end
752
-
753
- if stack_top == :internal_annotation_definition
754
- @current_anno_def[:description] = @text
755
- end
756
- end
757
-
758
- def end_usage
759
- if stack_top == :internal_annotation_definition
760
- @current_anno_def[:usage] = @text
761
- end
762
- end
763
-
764
- def end_list_value
765
- if stack_top == :list_annotation
766
- @current_anno_def[:domain] << @text
767
- end
768
- end
769
-
770
- def end_statement_group
771
- @element_stack.pop
772
- end
773
-
774
- def end_statement
775
- @element_stack.pop
776
-
777
- stmt = @statement_stack.pop
778
- if @statement_stack.empty?
779
- # create new evidence from parsed data
780
- evidence_copy = Evidence.create({
781
- :bel_statement => stmt,
782
- :citation => @evidence.citation.to_h,
783
- :summary_text => @evidence.summary_text.value,
784
- :experiment_context => @evidence.experiment_context.values.dup,
785
- :references => @evidence.references.values.dup,
786
- :metadata => @evidence.metadata.values.dup
787
- })
788
-
789
- # yield evidence
790
- @callable.call(evidence_copy)
791
-
792
- # clear evidence parser state
793
- # note:
794
- # - preserve @evidence.references
795
- # - preserve @evidence.metadata.document_header
796
- @evidence.bel_statement = nil
797
- @evidence.citation = nil
798
- @evidence.summary_text = nil
799
- @evidence.experiment_context = nil
800
- @evidence.metadata.delete_if { |key|
801
- key != :document_header
802
- }
803
- end
804
- end
805
-
806
- def end_subject
807
- @statement_stack.last.subject = @term_stack.last
808
- @element_stack.pop
809
- end
810
-
811
- def end_object
812
- if @statement_stack.last.object == nil
813
- # sets object if it wasn't already set by OBJECT STATEMENT
814
- @statement_stack.last.object = @term_stack.last
815
- end
816
- @element_stack.pop
817
- end
818
-
819
- def end_term
820
- @element_stack.pop
821
-
822
- if @term_stack.size > 1
823
- @term_stack.pop
824
- @current_term = @term_stack.last
825
- end
826
- end
827
-
828
- def end_parameter
829
- @current_parameter.value = @text
830
- @term_stack.last.arguments << @current_parameter
831
- @element_stack.pop
832
- end
833
-
834
- def end_annotation_group
835
- @element_stack.pop
836
- end
837
-
838
- def end_annotation
839
- if @element_stack[-3] == :statement
840
- ref_id = @annotation_id
841
-
842
- annotation = @evidence.experiment_context.find { |annotation|
843
- annotation[:name] == ref_id
844
- }
845
- if annotation
846
- # create array for multiple values by refID
847
- annotation[:value] = [annotation[:value], @text].flatten
848
- else
849
- @evidence.experiment_context << {
850
- :name => ref_id,
851
- :value => @text
852
- }
853
- end
854
- end
855
-
856
- @element_stack.pop
857
- end
858
-
859
- def end_evidence
860
- if @element_stack[-3] == :statement
861
- @evidence.summary_text.value = @text
862
- end
863
-
864
- @element_stack.pop
865
- end
866
-
867
- def end_citation
868
- @element_stack.pop
869
- end
870
-
871
- def end_reference
872
- if stack_top == :citation
873
- @evidence.citation.id = @text
874
- end
875
- end
876
-
877
- def end_name
878
- if stack_top == :header
879
- @evidence.metadata.document_header['name'] = @text
880
- end
881
-
882
- if stack_top == :citation
883
- @evidence.citation.name = @text
884
- end
885
- end
886
-
887
- def end_date
888
- if stack_top == :citation
889
- @evidence.citation.date = @text
890
- end
891
- end
892
-
893
- def end_author
894
- if stack_top == :header
895
- @evidence.metadata.document_header['authors'] ||= []
896
- @evidence.metadata.document_header['authors'] << @text
897
- end
898
-
899
- if stack_top == :citation
900
- (@evidence.citation.authors ||= []) << @text
901
- end
902
- end
903
-
904
- def end_comment
905
- if stack_top == :citation
906
- @evidence.citation.comment = @text
907
- end
908
- end
909
-
910
- private
911
-
912
- def stack_top
913
- @element_stack.last
914
- end
915
-
916
- def attr_value(attributes, attr_name)
917
- attributes["bel:#{attr_name}"]
918
- end
919
- end
920
- end
921
-
922
- register_formatter(FormatXBEL.new)
923
- end