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
data/lib/bel/extension.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module BEL
|
2
|
-
|
3
|
-
# The {Extension} module defines specific areas of customization within the
|
4
|
-
# *bel* gem:
|
5
|
-
#
|
6
|
-
# - Document formats: see {BEL::Extension::Format}
|
7
|
-
module Extension
|
8
|
-
|
9
|
-
# Loads BEL extensions from the +$LOAD_PATH+ under the path
|
10
|
-
# +bel/extensions/{extension}+. These extensions are merely ruby scripts
|
11
|
-
# meant to extend functionality within the *bel* gem.
|
12
|
-
#
|
13
|
-
# For example, let's say we created the foo.rb file containing a Foo
|
14
|
-
# extension. We must do the following to load it:
|
15
|
-
#
|
16
|
-
# - Locate foo.rb at +bel/extensions/foo.rb+ anywhere on the +$LOAD_PATH+.
|
17
|
-
# - Instantiate and register our extension.
|
18
|
-
# - Call +BEL.extension :foo+ to load the extension.
|
19
|
-
#
|
20
|
-
# @param [Array<#to_s>] extensions the extensions to load
|
21
|
-
def self.load_extension(*extensions)
|
22
|
-
extensions.each do |ext|
|
23
|
-
Kernel.require "bel/extensions/#{ext}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class ExtensionRegistrationError < StandardError
|
28
|
-
|
29
|
-
attr_reader :extension
|
30
|
-
|
31
|
-
def initialize(extension, msg = "Extension error for #{extension}")
|
32
|
-
super(msg)
|
33
|
-
@extension = extension
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/bel/extension_format.rb
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
module BEL
|
2
|
-
module Extension
|
3
|
-
|
4
|
-
# The {Format} module defines a framework for adding new document formats.
|
5
|
-
# This is useful when reading, writing, and {BEL::Translation translating}
|
6
|
-
# BEL data.
|
7
|
-
#
|
8
|
-
# A {Format} extension is defined and registered in the following steps:
|
9
|
-
#
|
10
|
-
# - Create a ruby source file located under +bel/extensions/+ on the
|
11
|
-
# +$LOAD_PATH+.
|
12
|
-
# - Within the file, create a class that implements the protocol specified
|
13
|
-
# by {Format::Formatter}.
|
14
|
-
# - Instantiate and register your format extension by calling
|
15
|
-
# {Format.register_formatter}.
|
16
|
-
#
|
17
|
-
# To see how to define a new format extension have a look at the
|
18
|
-
# {Format::Formatter} module.
|
19
|
-
#
|
20
|
-
module Format
|
21
|
-
|
22
|
-
FORMATTER_MUTEX = Mutex.new
|
23
|
-
private_constant :FORMATTER_MUTEX
|
24
|
-
|
25
|
-
# Registers the +formatter+ object as available to callers. The
|
26
|
-
# +formatter+ should respond to the methods defined in the
|
27
|
-
# {Format::Formatter} module.
|
28
|
-
#
|
29
|
-
# @param [Format::Formatter] formatter the formatter to register
|
30
|
-
# @return [Format::Formatter] the +formatter+ parameter is returned
|
31
|
-
# for convenience
|
32
|
-
def self.register_formatter(formatter)
|
33
|
-
FORMATTER_MUTEX.synchronize {
|
34
|
-
@@formatters ||= []
|
35
|
-
# vivified hash, like: { :foo => { :bar => [] } }
|
36
|
-
@@index ||= (
|
37
|
-
Hash.new do |h0, k0|
|
38
|
-
h0[k0] = Hash.new do |h1, k1|
|
39
|
-
h1[k1] = []
|
40
|
-
end
|
41
|
-
end
|
42
|
-
)
|
43
|
-
|
44
|
-
if _formatters(formatter.id)
|
45
|
-
raise ExtensionRegistrationError.new(formatter.id)
|
46
|
-
end
|
47
|
-
|
48
|
-
# track registered formatters
|
49
|
-
@@formatters << formatter
|
50
|
-
|
51
|
-
# index formatter by its id
|
52
|
-
@@index[:id][symbolize(formatter.id)] << formatter
|
53
|
-
|
54
|
-
# index formatter by one or more file extensions
|
55
|
-
[formatter.file_extensions].flatten.compact.to_a.each do |file_ext|
|
56
|
-
@@index[:file_extension][symbolize(file_ext)] << formatter
|
57
|
-
end
|
58
|
-
|
59
|
-
# index formatter by one or more media types
|
60
|
-
[formatter.media_types].flatten.compact.to_a.each do |media_type|
|
61
|
-
@@index[:media_type][symbolize(media_type)] << formatter
|
62
|
-
end
|
63
|
-
|
64
|
-
formatter
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
# Returns the {Format::Formatter formatters} found for the +values+
|
69
|
-
# splat. The returned matches have the same cardinality as the +values+
|
70
|
-
# splat to allow destructuring.
|
71
|
-
#
|
72
|
-
# @example Retrieve a single formatter by id.
|
73
|
-
# bel_formatter = Format.formatters(:bel)
|
74
|
-
# @example Retrieve a single formatter by file extension.
|
75
|
-
# xbel_formatter = Format.formatters(:xml)
|
76
|
-
# @example Retrieve a single formatter by media type.
|
77
|
-
# json_formatter = Format.formatters(%s(application/json))
|
78
|
-
# @example Retrieve multiple formatters using mixed values.
|
79
|
-
# belf, xbelf, jsonf = Format.formatters(:bel, :xml, "application/json")
|
80
|
-
#
|
81
|
-
# @param [Array<#to_s>] values the splat that identifies formatters
|
82
|
-
# @return [Format::Formatter Array<Format::Formatter>] for each
|
83
|
-
# consecutive value in the +values+ splat; if the +values+ splat
|
84
|
-
# contains one value then a single formatter reference is returned
|
85
|
-
# (e.g. not an Array)
|
86
|
-
def self.formatters(*values)
|
87
|
-
FORMATTER_MUTEX.synchronize {
|
88
|
-
_formatters(*values)
|
89
|
-
}
|
90
|
-
end
|
91
|
-
|
92
|
-
def self._formatters(*values)
|
93
|
-
if values.empty?
|
94
|
-
Array.new @@formatters
|
95
|
-
else
|
96
|
-
index = (@@index ||= {})
|
97
|
-
matches = values.map { |value|
|
98
|
-
value = symbolize(value)
|
99
|
-
@@index.values_at(:id, :file_extension, :media_type).
|
100
|
-
compact.
|
101
|
-
inject([]) { |result, coll|
|
102
|
-
if coll.has_key?(value)
|
103
|
-
result.concat(coll[value])
|
104
|
-
end
|
105
|
-
result
|
106
|
-
}.uniq.first
|
107
|
-
}
|
108
|
-
matches.size == 1 ? matches.first : matches
|
109
|
-
end
|
110
|
-
end
|
111
|
-
private_class_method :_formatters
|
112
|
-
|
113
|
-
def self.symbolize(key)
|
114
|
-
key.to_s.to_sym
|
115
|
-
end
|
116
|
-
private_class_method :symbolize
|
117
|
-
|
118
|
-
# The Formatter module defines methods to be implemented by a format
|
119
|
-
# extension +Class+. It is broken up into three parts:
|
120
|
-
#
|
121
|
-
# - Metadata
|
122
|
-
# - {#id}: the runtime-wide unique extension id
|
123
|
-
# - {#media_types}: the media types this format supports
|
124
|
-
# - {#file_extensions}: the file extensions this format supports
|
125
|
-
# - Deserialize
|
126
|
-
# - {#deserialize}: read the implemented document format and return
|
127
|
-
# {::BEL::Model::Evidence} objects
|
128
|
-
# - Serialize
|
129
|
-
# - {#serialize}: write {::BEL::Model::Evidence} objects to the
|
130
|
-
# implemented document format
|
131
|
-
#
|
132
|
-
# @example Typical creation of a {Formatter} class.
|
133
|
-
# class FormatYAML
|
134
|
-
# include BEL::Extension::Format::Formatter
|
135
|
-
# # override methods
|
136
|
-
# end
|
137
|
-
#
|
138
|
-
# @example Create a YAML format extension.
|
139
|
-
# class FormatYAML
|
140
|
-
# include BEL::Extension::Format::Formatter
|
141
|
-
#
|
142
|
-
# ID = :yaml
|
143
|
-
# MEDIA_TYPES = %i(text/yaml)
|
144
|
-
# EXTENSIONS = %i(yaml)
|
145
|
-
#
|
146
|
-
# def id
|
147
|
-
# ID
|
148
|
-
# end
|
149
|
-
#
|
150
|
-
# def media_types
|
151
|
-
# MEDIA_TYPES
|
152
|
-
# end
|
153
|
-
#
|
154
|
-
# def file_extensions
|
155
|
-
# EXTENSIONS
|
156
|
-
# end
|
157
|
-
#
|
158
|
-
# def deserialize(data)
|
159
|
-
# YAML.load(data)
|
160
|
-
# end
|
161
|
-
#
|
162
|
-
# def serialize(data)
|
163
|
-
# YAML.dump(data)
|
164
|
-
# end
|
165
|
-
# end
|
166
|
-
module Formatter
|
167
|
-
|
168
|
-
def id
|
169
|
-
raise NotImplementedError.new("#{__method__} is not implemented.")
|
170
|
-
end
|
171
|
-
|
172
|
-
def media_types
|
173
|
-
# optional
|
174
|
-
nil
|
175
|
-
end
|
176
|
-
|
177
|
-
def file_extensions
|
178
|
-
# optional
|
179
|
-
nil
|
180
|
-
end
|
181
|
-
|
182
|
-
def evidence_hash(object)
|
183
|
-
raise NotImplementedError.new("#{__method__} is not implemented.")
|
184
|
-
end
|
185
|
-
|
186
|
-
def deserialize(data)
|
187
|
-
raise NotImplementedError.new("#{__method__} is not implemented.")
|
188
|
-
end
|
189
|
-
|
190
|
-
def serialize(data, writer = nil)
|
191
|
-
raise NotImplementedError.new("#{__method__} is not implemented.")
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
# FormatError represents an error when the specified format is not
|
196
|
-
# supported by the {Format} extension framework.
|
197
|
-
class FormatError < StandardError
|
198
|
-
|
199
|
-
FORMAT_ERROR = %Q{Format "%s" is not supported.}
|
200
|
-
|
201
|
-
def initialize(format)
|
202
|
-
super(FORMAT_ERROR % format)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
data/lib/bel/extensions/bel.rb
DELETED
@@ -1,258 +0,0 @@
|
|
1
|
-
require 'bel'
|
2
|
-
|
3
|
-
module BEL::Extension::Format
|
4
|
-
|
5
|
-
class FormatBEL
|
6
|
-
|
7
|
-
include Formatter
|
8
|
-
|
9
|
-
ID = :bel
|
10
|
-
MEDIA_TYPES = %i(application/bel)
|
11
|
-
EXTENSIONS = %i(bel)
|
12
|
-
|
13
|
-
def id
|
14
|
-
ID
|
15
|
-
end
|
16
|
-
|
17
|
-
def media_types
|
18
|
-
MEDIA_TYPES
|
19
|
-
end
|
20
|
-
|
21
|
-
def file_extensions
|
22
|
-
EXTENSIONS
|
23
|
-
end
|
24
|
-
|
25
|
-
def deserialize(data, &block)
|
26
|
-
EvidenceYielder.new(data)
|
27
|
-
end
|
28
|
-
|
29
|
-
def serialize(objects, writer = StringIO.new, options = {})
|
30
|
-
BELYielder.new(objects).each { |bel_part|
|
31
|
-
writer << "#{bel_part}"
|
32
|
-
writer.flush
|
33
|
-
}
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class EvidenceYielder
|
38
|
-
include ::BEL::Model
|
39
|
-
include ::BEL::Quoting
|
40
|
-
|
41
|
-
SPECIAL_ANNOTATIONS = {
|
42
|
-
'Citation' => true,
|
43
|
-
'Evidence' => true,
|
44
|
-
}
|
45
|
-
|
46
|
-
def initialize(data)
|
47
|
-
@data = data
|
48
|
-
@references = References.new
|
49
|
-
@metadata = Metadata.new
|
50
|
-
end
|
51
|
-
|
52
|
-
def each
|
53
|
-
if block_given?
|
54
|
-
::BEL::Script.parse(@data).each { |parsed_obj|
|
55
|
-
case parsed_obj
|
56
|
-
when ::BEL::Language::DocumentProperty
|
57
|
-
@metadata.document_header[parsed_obj.name] = parsed_obj.value
|
58
|
-
when ::BEL::Model::Statement
|
59
|
-
yield to_evidence(parsed_obj, @references, @metadata)
|
60
|
-
when ::BEL::Language::AnnotationDefinition
|
61
|
-
@references.annotation_definitions[parsed_obj.prefix] = {
|
62
|
-
:type => parsed_obj.type,
|
63
|
-
:domain => parsed_obj.value
|
64
|
-
}
|
65
|
-
when ::BEL::Namespace::NamespaceDefinition
|
66
|
-
@references.namespace_definitions[parsed_obj.prefix] = parsed_obj.url
|
67
|
-
end
|
68
|
-
}
|
69
|
-
else
|
70
|
-
to_enum(:each)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def to_evidence(statement, references, metadata)
|
77
|
-
evidence = Evidence.new
|
78
|
-
evidence.bel_statement = statement
|
79
|
-
|
80
|
-
if statement.annotations.include? 'Citation'
|
81
|
-
fields = statement.annotations['Citation'].value
|
82
|
-
if fields.respond_to? :each
|
83
|
-
evidence.citation = Citation.new(
|
84
|
-
*fields.map { |field|
|
85
|
-
remove_quotes(field)
|
86
|
-
}.to_a
|
87
|
-
)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
if statement.annotations.include? 'Evidence'
|
92
|
-
value = statement.annotations['Evidence'].value
|
93
|
-
evidence.summary_text.value = value
|
94
|
-
end
|
95
|
-
|
96
|
-
annotations = statement.annotations.dup
|
97
|
-
annotations.delete_if { |k, _| SPECIAL_ANNOTATIONS[k] }
|
98
|
-
evidence.experiment_context = ExperimentContext.new(
|
99
|
-
annotations.map { |k, v|
|
100
|
-
value = v.value
|
101
|
-
obj = {
|
102
|
-
:name => k,
|
103
|
-
:value => value
|
104
|
-
}
|
105
|
-
|
106
|
-
annotation_def = references.annotation_definitions[k]
|
107
|
-
if annotation_def
|
108
|
-
type, domain = annotation_def.values_at(:type, :domain)
|
109
|
-
if type == :url
|
110
|
-
obj[:uri] = "#{domain}/#{value}"
|
111
|
-
obj[:url] = domain
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
obj
|
116
|
-
}
|
117
|
-
)
|
118
|
-
|
119
|
-
evidence.references = references
|
120
|
-
evidence.metadata = metadata
|
121
|
-
evidence
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
class BELYielder
|
126
|
-
|
127
|
-
def initialize(data, options = {})
|
128
|
-
@data = data
|
129
|
-
@write_header = (options[:write_header] || true)
|
130
|
-
end
|
131
|
-
|
132
|
-
def each
|
133
|
-
if block_given?
|
134
|
-
header_flag = true
|
135
|
-
@data.each { |evidence|
|
136
|
-
bel = to_bel(evidence)
|
137
|
-
if @write_header && header_flag
|
138
|
-
yield document_header(evidence.metadata.document_header)
|
139
|
-
yield namespace_definitions(
|
140
|
-
evidence.references.namespace_definitions
|
141
|
-
)
|
142
|
-
yield annotation_definitions(
|
143
|
-
evidence.references.annotation_definitions
|
144
|
-
)
|
145
|
-
header_flag = false
|
146
|
-
end
|
147
|
-
|
148
|
-
yield bel
|
149
|
-
}
|
150
|
-
else
|
151
|
-
to_enum(:each)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
private
|
156
|
-
|
157
|
-
def document_header(header)
|
158
|
-
return "" unless header
|
159
|
-
|
160
|
-
header.reduce("") { |bel, (name, value)|
|
161
|
-
name_s = name.to_s
|
162
|
-
value_s =
|
163
|
-
if value.respond_to?(:each)
|
164
|
-
value.join('|')
|
165
|
-
else
|
166
|
-
value.to_s
|
167
|
-
end
|
168
|
-
|
169
|
-
# handle casing for document properties (special case, contactinfo)
|
170
|
-
name_s = (name_s.downcase == 'contactinfo') ?
|
171
|
-
'ContactInfo' :
|
172
|
-
name_s.capitalize
|
173
|
-
|
174
|
-
bel << %Q{SET DOCUMENT #{name_s} = "#{value_s}"\n}
|
175
|
-
bel
|
176
|
-
}
|
177
|
-
end
|
178
|
-
|
179
|
-
def annotation_definitions(annotation_definitions)
|
180
|
-
return "" unless annotation_definitions
|
181
|
-
|
182
|
-
annotation_definitions.reduce("") { |bel, (prefix, annotation)|
|
183
|
-
bel << "DEFINE ANNOTATION #{prefix} AS "
|
184
|
-
type = annotation[:type] || annotation["type"]
|
185
|
-
domain = annotation[:domain] || annotation["domain"]
|
186
|
-
case type.to_sym
|
187
|
-
when :url
|
188
|
-
bel << %Q{URL "#{domain}"\n}
|
189
|
-
when :pattern
|
190
|
-
bel << %Q{PATTERN "#{domain}"\n}
|
191
|
-
when :list
|
192
|
-
bel << %Q|LIST {#{domain.inspect[1...-1]}}\n|
|
193
|
-
end
|
194
|
-
bel
|
195
|
-
}
|
196
|
-
end
|
197
|
-
|
198
|
-
def namespace_definitions(namespace_definitions)
|
199
|
-
return "" unless namespace_definitions
|
200
|
-
|
201
|
-
namespace_definitions.reduce("") { |bel, (prefix, url)|
|
202
|
-
bel << %Q{DEFINE NAMESPACE #{prefix} AS URL "#{url}"\n}
|
203
|
-
bel
|
204
|
-
}
|
205
|
-
end
|
206
|
-
|
207
|
-
def to_bel(evidence)
|
208
|
-
bel = ""
|
209
|
-
|
210
|
-
# Citation
|
211
|
-
citation = evidence.citation
|
212
|
-
if citation && citation.values.any?
|
213
|
-
values = citation.values
|
214
|
-
values.map! { |v| v || "" }
|
215
|
-
values.map! { |v|
|
216
|
-
if v.respond_to?(:each)
|
217
|
-
v.join('|')
|
218
|
-
else
|
219
|
-
v
|
220
|
-
end
|
221
|
-
}
|
222
|
-
value_string = values.inspect[1...-1]
|
223
|
-
bel << "SET Citation = {#{value_string}}\n"
|
224
|
-
end
|
225
|
-
|
226
|
-
# Evidence
|
227
|
-
summary_text = evidence.summary_text
|
228
|
-
if summary_text && summary_text.value
|
229
|
-
value = summary_text.value
|
230
|
-
value.gsub!("\n", "")
|
231
|
-
value.gsub!('"', %Q{\\"})
|
232
|
-
bel << %Q{SET Evidence = "#{value}"\n}
|
233
|
-
end
|
234
|
-
|
235
|
-
# Annotation
|
236
|
-
experiment_context = evidence.experiment_context
|
237
|
-
if experiment_context
|
238
|
-
experiment_context.
|
239
|
-
sort_by { |obj| obj[:name] }.
|
240
|
-
each { |obj|
|
241
|
-
name, value = obj.values_at(:name, :value)
|
242
|
-
if value.respond_to? :each
|
243
|
-
value = "{#{value.inspect[1...-1]}}"
|
244
|
-
else
|
245
|
-
value = value.inspect
|
246
|
-
end
|
247
|
-
bel << "SET #{name} = #{value}\n"
|
248
|
-
}
|
249
|
-
end
|
250
|
-
|
251
|
-
# BEL statement
|
252
|
-
bel << "#{evidence.bel_statement.to_s}\n"
|
253
|
-
bel
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
register_formatter(FormatBEL.new)
|
258
|
-
end
|