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