bel 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +4 -2
- data/bin/bel +60 -3
- data/lib/bel/completion_rule.rb +2 -2
- data/lib/bel/evidence_model.rb +5 -0
- data/lib/bel/evidence_model/bel_parameter.rb +1 -6
- data/lib/bel/evidence_model/buffering_evidence_combiner.rb +182 -0
- data/lib/bel/evidence_model/evidence.rb +21 -0
- data/lib/bel/evidence_model/hash_map_references.rb +33 -0
- data/lib/bel/evidence_model/map_references.rb +30 -0
- data/lib/bel/evidence_model/map_references_combiner.rb +30 -0
- data/lib/bel/evidence_model/streaming_evidence_combiner.rb +37 -0
- data/lib/bel/evidence_model/util.rb +84 -0
- data/lib/bel/gen.rb +7 -3
- data/lib/bel/gen/annotation.rb +5 -2
- data/lib/bel/gen/evidence.rb +10 -4
- data/lib/bel/gen/namespace.rb +37 -0
- data/lib/bel/gen/parameter.rb +71 -0
- data/lib/bel/gen/sample_resources.rb +52 -0
- data/lib/bel/gen/statement.rb +33 -0
- data/lib/bel/gen/term.rb +33 -0
- data/lib/bel/language.rb +4 -4
- data/lib/bel/libbel/library_resolver.rb +1 -1
- data/lib/bel/namespace.rb +3 -3
- data/lib/bel/quoting.rb +218 -14
- data/lib/bel/translator.rb +11 -3
- data/lib/bel/translator/plugins/bel_script/bel_citation_serialization.rb +2 -2
- data/lib/bel/translator/plugins/bel_script/bel_discrete_serialization.rb +1 -1
- data/lib/bel/translator/plugins/bel_script/bel_yielder.rb +32 -21
- data/lib/bel/translator/plugins/bel_script/evidence_serialization.rb +11 -10
- data/lib/bel/translator/plugins/bel_script/evidence_yielder.rb +2 -2
- data/lib/bel/translator/plugins/bel_script/translator.rb +1 -1
- data/lib/bel/translator/plugins/json_evidence/translator.rb +5 -1
- data/lib/bel/translator/plugins/rdf/monkey_patch.rb +4 -0
- data/lib/bel/translator/plugins/xbel/evidence_handler.rb +23 -12
- data/lib/bel/translator/plugins/xbel/evidence_yielder.rb +1 -1
- data/lib/bel/translator/plugins/xbel/translator.rb +4 -4
- data/lib/bel/translator/plugins/xbel/xbel_yielder.rb +24 -7
- data/lib/bel/util.rb +55 -21
- data/lib/bel/version.rb +1 -1
- metadata +13 -3
- data/lib/bel/gen/bel_expression.rb +0 -128
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f162658eee7622744bcf1334c246b34b9178c70f
|
4
|
+
data.tar.gz: e13d38c9a6775f28b83bd6803f076dec155feb30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f40dca2bb377aec1d86066648a0ac51a61f60bc7f12f76cc583b46e5e54367baf018bebe5832451433382ee9bf21eb3e4ce6e7d7deddb0070ec09b7cf15f49ba
|
7
|
+
data.tar.gz: 81b35ae4c5c6fcaf6ac81c37731fe5783004ee67b0dd8e5b6253204687eb5db0d63754d1902137223ade06379dea40b403353e176c95b9dc1164c96f6e5cda9e
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,22 @@ All notable changes to bel.rb will be documented in this file. The curated log b
|
|
3
3
|
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
5
5
|
|
6
|
+
## [0.6.0][0.6.0] - 2016-03-15
|
7
|
+
### Fixed
|
8
|
+
- Serialization of BEL Script / XBEL can produce incorrect annotation and namespaces references ([Issue #111][111]).
|
9
|
+
|
10
|
+
### Changed
|
11
|
+
- Separate random sampling from random data in BEL generator ([Issue #105][105]).
|
12
|
+
- Improved BEL quoting API. **Deprecated previous API methods.** ([Issue #104][104]).
|
13
|
+
- BEL and XBEL translators will now buffer on write to account for all annotation/namespace references. Pass the `-t streaming=true` option to `bel translate` to stream data when the references are consistent.
|
14
|
+
|
15
|
+
### Added
|
16
|
+
- Added translator read/write option passing from the `bel translate` subcommand.
|
17
|
+
|
18
|
+
### Development
|
19
|
+
- Added *doctest* Rake task to run YARD `@example` tests in method level documentation.
|
20
|
+
- Added gosh commands for running unit, integration and doctests ([Issue #85][85]).
|
21
|
+
|
6
22
|
## [0.5.0][0.5.0] - 2016-02-10
|
7
23
|
### Fixed
|
8
24
|
- Fix missing RDF prefixes when converting BEL Script to RDF ([Issue #71][71]).
|
@@ -75,6 +91,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
75
91
|
### Added
|
76
92
|
- Development gem dependencies (i.e. byebug, pry, pry-byebug) for debugging.
|
77
93
|
|
94
|
+
[0.6.0]: https://github.com/OpenBEL/bel.rb/compare/0.5.0...0.6.0
|
78
95
|
[0.5.0]: https://github.com/OpenBEL/bel.rb/compare/0.4.2...0.5.0
|
79
96
|
[0.4.2]: https://github.com/OpenBEL/bel.rb/compare/0.4.1...0.4.2
|
80
97
|
[0.4.1]: https://github.com/OpenBEL/bel.rb/compare/0.4.0...0.4.1
|
@@ -93,6 +110,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
93
110
|
[68]: https://github.com/OpenBEL/bel.rb/issues/68
|
94
111
|
[71]: https://github.com/OpenBEL/bel.rb/issues/71
|
95
112
|
[82]: https://github.com/OpenBEL/bel.rb/issues/82
|
113
|
+
[85]: https://github.com/OpenBEL/bel.rb/issues/85
|
96
114
|
[86]: https://github.com/OpenBEL/bel.rb/pull/86
|
97
115
|
[90]: https://github.com/OpenBEL/bel.rb/issues/90
|
98
116
|
[91]: https://github.com/OpenBEL/bel.rb/issues/91
|
@@ -104,5 +122,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
104
122
|
[98]: https://github.com/OpenBEL/bel.rb/issues/98
|
105
123
|
[100]: https://github.com/OpenBEL/bel.rb/issues/100
|
106
124
|
[102]: https://github.com/OpenBEL/bel.rb/issues/102
|
125
|
+
[104]: https://github.com/OpenBEL/bel.rb/issues/104
|
126
|
+
[105]: https://github.com/OpenBEL/bel.rb/issues/105
|
127
|
+
[111]: https://github.com/OpenBEL/bel.rb/issues/111
|
107
128
|
[20150611]: http://resource.belframework.org/belframework/20150611/
|
108
129
|
[RDF.rb]: https://github.com/ruby-rdf/rdf
|
data/README.md
CHANGED
@@ -75,7 +75,7 @@ the root of the bel.rb tree:
|
|
75
75
|
## branches
|
76
76
|
|
77
77
|
- master branch
|
78
|
-
- Contains stable code. Releases are created from this branch using a tag (e.g.
|
78
|
+
- Contains stable code. Releases are created from this branch using a tag (e.g. `MAJOR.MINOR.PATCH`).
|
79
79
|
- [![Travis CI Build](https://travis-ci.org/OpenBEL/bel.rb.svg?branch=master)](https://travis-ci.org/OpenBEL/bel.rb)
|
80
80
|
|
81
81
|
- next branch
|
@@ -110,7 +110,7 @@ the root of the bel.rb tree:
|
|
110
110
|
plugins
|
111
111
|
|
112
112
|
|
113
|
-
bel
|
113
|
+
bel
|
114
114
|
Copyright (C) 2015 OpenBEL
|
115
115
|
Apache License, Version 2.0, January 2004
|
116
116
|
http://www.apache.org/licenses/
|
@@ -418,4 +418,6 @@ the root of the bel.rb tree:
|
|
418
418
|
end
|
419
419
|
```
|
420
420
|
|
421
|
+
Built with collaboration and a lot of :heart: from the OpenBEL community.
|
422
|
+
|
421
423
|
[CHANGELOG]: https://github.com/OpenBEL/bel.rb/blob/master/CHANGELOG.md
|
data/bin/bel
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
$:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
3
3
|
require 'erb'
|
4
4
|
require 'bel'
|
5
|
+
require 'bel/util'
|
5
6
|
require 'bel/vendor/trollop'
|
6
7
|
|
7
8
|
VERSION_BANNER = <<-VERSION
|
@@ -232,14 +233,28 @@ Subcommands:
|
|
232
233
|
def run
|
233
234
|
parsed_options =
|
234
235
|
Trollop::options do
|
235
|
-
synopsis "Translates BEL evidence between
|
236
|
-
usage "[OPTIONS]... translate [OPTIONS]
|
236
|
+
synopsis "Translates BEL evidence between formats using translator plugins."
|
237
|
+
usage "[OPTIONS]... translate [OPTIONS] FROM_TRANSLATOR TO_TRANSLATOR"
|
237
238
|
|
238
239
|
opt :'input-file', 'The file containing evidence data to translate. If not specified the default is to read from STDIN.',
|
239
240
|
:type => String,
|
240
241
|
:long => :'input-file',
|
241
242
|
:short => :i,
|
242
243
|
:default => nil
|
244
|
+
|
245
|
+
opt :'from-option', 'A "key=value" option to be sent to the FROM_TRANSLATOR.',
|
246
|
+
:type => String,
|
247
|
+
:multi => true,
|
248
|
+
:long => :'from-option',
|
249
|
+
:short => :f,
|
250
|
+
:default => nil
|
251
|
+
|
252
|
+
opt :'to-option', 'A "key=value" option to be sent to the TO_TRANSLATOR.',
|
253
|
+
:type => String,
|
254
|
+
:multi => true,
|
255
|
+
:long => :'to-option',
|
256
|
+
:short => :t,
|
257
|
+
:default => nil
|
243
258
|
end
|
244
259
|
|
245
260
|
input_io = which_io(parsed_options[:'input-file'])
|
@@ -282,12 +297,48 @@ Subcommands:
|
|
282
297
|
Trollop::educate
|
283
298
|
end
|
284
299
|
|
300
|
+
from_options = map_kv_options(parsed_options, :'from-option')
|
301
|
+
to_options = map_kv_options(parsed_options, :'to-option')
|
302
|
+
|
285
303
|
begin
|
286
|
-
BEL.translate(
|
304
|
+
BEL.translate(
|
305
|
+
input_io,
|
306
|
+
from_format,
|
307
|
+
to_format,
|
308
|
+
$stdout,
|
309
|
+
from_options.merge(to_options) # XXX Merge conflicts.
|
310
|
+
)
|
287
311
|
ensure
|
288
312
|
$stdout.close
|
289
313
|
end
|
290
314
|
end
|
315
|
+
|
316
|
+
private
|
317
|
+
|
318
|
+
def map_kv_options(parsed_options, opt)
|
319
|
+
BEL.keys_to_symbols(
|
320
|
+
Hash[
|
321
|
+
parsed_options[opt].map { |opt|
|
322
|
+
key, value = opt.split('=')
|
323
|
+
if !key || !value
|
324
|
+
nil
|
325
|
+
else
|
326
|
+
value =
|
327
|
+
case value
|
328
|
+
when "true"
|
329
|
+
true
|
330
|
+
when "false"
|
331
|
+
false
|
332
|
+
else
|
333
|
+
value
|
334
|
+
end
|
335
|
+
|
336
|
+
[key, value]
|
337
|
+
end
|
338
|
+
}.compact
|
339
|
+
]
|
340
|
+
)
|
341
|
+
end
|
291
342
|
end
|
292
343
|
|
293
344
|
class UpgradeCommand
|
@@ -405,11 +456,17 @@ Subcommands:
|
|
405
456
|
:long => :translator,
|
406
457
|
:short => :t,
|
407
458
|
:default => 'bel'
|
459
|
+
|
460
|
+
opt :sample, 'Sample namespace values and annotations from BEL resources.',
|
461
|
+
:long => :sample,
|
462
|
+
:short => :s,
|
463
|
+
:default => false
|
408
464
|
end
|
409
465
|
|
410
466
|
# require BEL generator and include in GenerateCommand
|
411
467
|
require 'bel/gen'
|
412
468
|
self.class.include(BEL::Gen::Evidence)
|
469
|
+
self.class.include(BEL::Gen::SampleResources) if options[:sample]
|
413
470
|
|
414
471
|
# create enumerator of random evidence
|
415
472
|
limit = options[:limit].to_i
|
data/lib/bel/completion_rule.rb
CHANGED
@@ -234,13 +234,13 @@ module BEL
|
|
234
234
|
:id => ns_value,
|
235
235
|
:type => :namespace_value,
|
236
236
|
:label => ns_value,
|
237
|
-
:value =>
|
237
|
+
:value => quote_if_needed(ns_value),
|
238
238
|
:offset => 0
|
239
239
|
}
|
240
240
|
end
|
241
241
|
|
242
242
|
def map_namespace_value_with_prefix(ns, ns_value)
|
243
|
-
quoted_value =
|
243
|
+
quoted_value = quote_if_needed(ns_value)
|
244
244
|
|
245
245
|
if ns
|
246
246
|
ns_prefix = ns.prefix.to_s.upcase
|
data/lib/bel/evidence_model.rb
CHANGED
@@ -8,3 +8,8 @@ require_relative 'evidence_model/citation'
|
|
8
8
|
require_relative 'evidence_model/summary_text'
|
9
9
|
require_relative 'evidence_model/experiment_context'
|
10
10
|
require_relative 'evidence_model/metadata'
|
11
|
+
|
12
|
+
require_relative 'evidence_model/buffering_evidence_combiner'
|
13
|
+
require_relative 'evidence_model/map_references_combiner'
|
14
|
+
require_relative 'evidence_model/streaming_evidence_combiner'
|
15
|
+
require_relative 'evidence_model/util'
|
@@ -17,11 +17,6 @@ module BEL
|
|
17
17
|
attr_accessor :ns, :value, :enc
|
18
18
|
|
19
19
|
def initialize(ns, value, enc=nil)
|
20
|
-
if !enc && ns.is_a?(BEL::Namespace::NamespaceDefinition)
|
21
|
-
lookup = ns[value]
|
22
|
-
enc = lookup && lookup.enc
|
23
|
-
end
|
24
|
-
|
25
20
|
@enc = enc
|
26
21
|
@ns = ns
|
27
22
|
@value = value
|
@@ -53,7 +48,7 @@ module BEL
|
|
53
48
|
else
|
54
49
|
prefix = ''
|
55
50
|
end
|
56
|
-
%Q{#{prefix}#{
|
51
|
+
%Q{#{prefix}#{quote_if_needed(@value)}}
|
57
52
|
end
|
58
53
|
alias_method :to_s, :to_bel
|
59
54
|
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require_relative 'hash_map_references'
|
2
|
+
|
3
|
+
module BEL
|
4
|
+
module Model
|
5
|
+
|
6
|
+
# EvidenceReferenceCombiner is responsible for disambiguating evidence
|
7
|
+
# with overlapping sets of annotation/namespace references. This can occur
|
8
|
+
# when documents use the same keyword to refer to more than one reference.
|
9
|
+
#
|
10
|
+
# For example, evidence A may be annotated with:
|
11
|
+
#
|
12
|
+
# {
|
13
|
+
# :keyword => :Species,
|
14
|
+
# :type => :uri,
|
15
|
+
# :domain => 'file:///20131211/annotation/species-taxonomy-id.belanno'
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# while evidence B may be annotated with:
|
19
|
+
#
|
20
|
+
# {
|
21
|
+
# :keyword => :Species,
|
22
|
+
# :type => :uri,
|
23
|
+
# :domain => 'file:///20150611/annotation/species-taxonomy-id.belanno'
|
24
|
+
# }
|
25
|
+
#
|
26
|
+
# It is the job of this class to remap references to disambiguate the
|
27
|
+
# keywords.
|
28
|
+
#
|
29
|
+
# @abstract Subclass and override {#map_namespace_reference} to implement
|
30
|
+
# mapping of namespaces.
|
31
|
+
class BufferingEvidenceCombiner
|
32
|
+
|
33
|
+
attr_reader :annotation_references, :namespace_references
|
34
|
+
|
35
|
+
def initialize(evidence_collection)
|
36
|
+
@evidence_collection = evidence_collection
|
37
|
+
end
|
38
|
+
|
39
|
+
def each
|
40
|
+
if block_given?
|
41
|
+
evidence_array, map_references =
|
42
|
+
combine_references(@evidence_collection)
|
43
|
+
@annotation_references = map_references.annotation_references
|
44
|
+
@namespace_references = map_references.namespace_references
|
45
|
+
|
46
|
+
evidence_array.each do |evidence|
|
47
|
+
if evidence.bel_statement.is_a?(String)
|
48
|
+
evidence.bel_statement = BEL::Model::Evidence.parse_statement(evidence)
|
49
|
+
end
|
50
|
+
yield rewrite_evidence!(evidence, map_references)
|
51
|
+
end
|
52
|
+
else
|
53
|
+
to_enum(:each)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
|
59
|
+
def combine_references(evidence_collection)
|
60
|
+
annotation_reference_map = {}
|
61
|
+
namespace_reference_map = {}
|
62
|
+
annotations = []
|
63
|
+
namespaces = []
|
64
|
+
buffered_evidence = evidence_collection.each.map { |evidence|
|
65
|
+
annotations, remap =
|
66
|
+
BEL::Model.union_annotation_references(
|
67
|
+
annotations,
|
68
|
+
evidence.references.annotations,
|
69
|
+
'incr'
|
70
|
+
)
|
71
|
+
annotation_reference_map.merge!(remap)
|
72
|
+
|
73
|
+
namespaces, remap =
|
74
|
+
BEL::Model.union_namespace_references(
|
75
|
+
namespaces,
|
76
|
+
evidence.references.namespaces,
|
77
|
+
'incr'
|
78
|
+
)
|
79
|
+
namespace_reference_map.merge!(remap)
|
80
|
+
|
81
|
+
evidence
|
82
|
+
}.to_a
|
83
|
+
|
84
|
+
[
|
85
|
+
buffered_evidence,
|
86
|
+
HashMapReferences.new(
|
87
|
+
annotation_reference_map,
|
88
|
+
namespace_reference_map
|
89
|
+
)
|
90
|
+
]
|
91
|
+
end
|
92
|
+
|
93
|
+
def rewrite_evidence!(evidence, map_references)
|
94
|
+
rewrite_experiment_context!(
|
95
|
+
evidence.experiment_context,
|
96
|
+
evidence.references.annotations,
|
97
|
+
map_references
|
98
|
+
)
|
99
|
+
|
100
|
+
rewrite_statement!(
|
101
|
+
evidence.bel_statement,
|
102
|
+
evidence.references.namespaces,
|
103
|
+
map_references
|
104
|
+
)
|
105
|
+
|
106
|
+
evidence
|
107
|
+
end
|
108
|
+
|
109
|
+
def rewrite_statement!(statement, namespace_references, map_references)
|
110
|
+
keyword_to_reference = Hash[
|
111
|
+
namespace_references.map { |reference|
|
112
|
+
[reference[:keyword], reference]
|
113
|
+
}
|
114
|
+
]
|
115
|
+
|
116
|
+
sub = statement.subject
|
117
|
+
if sub
|
118
|
+
rewrite_term!(sub, keyword_to_reference, map_references)
|
119
|
+
end
|
120
|
+
|
121
|
+
obj = statement.object
|
122
|
+
if obj
|
123
|
+
case obj
|
124
|
+
when ::BEL::Model::Statement
|
125
|
+
rewrite_statement!(obj, namespace_references, map_references)
|
126
|
+
when ::BEL::Model::Term
|
127
|
+
rewrite_term!(obj, keyword_to_reference, map_references)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def rewrite_term!(term, keyword_to_reference, map_references)
|
133
|
+
return unless term
|
134
|
+
|
135
|
+
term.arguments.each do |arg|
|
136
|
+
case arg
|
137
|
+
when ::BEL::Model::Parameter
|
138
|
+
if arg.ns
|
139
|
+
prefix =
|
140
|
+
if arg.ns.respond_to?(:prefix)
|
141
|
+
arg.ns.prefix
|
142
|
+
else
|
143
|
+
arg.ns[:prefix]
|
144
|
+
end
|
145
|
+
reference = keyword_to_reference[prefix.to_sym]
|
146
|
+
new_reference = map_references.map_namespace_reference(reference)
|
147
|
+
if new_reference
|
148
|
+
arg.ns = BEL::Namespace::NamespaceDefinition.new(
|
149
|
+
new_reference[:keyword],
|
150
|
+
new_reference[:uri]
|
151
|
+
)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
when ::BEL::Model::Term
|
155
|
+
rewrite_term!(arg, keyword_to_reference, map_references)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def rewrite_experiment_context!(
|
161
|
+
experiment_context,
|
162
|
+
annotation_references,
|
163
|
+
map_references
|
164
|
+
)
|
165
|
+
references = Hash[
|
166
|
+
annotation_references.map { |reference|
|
167
|
+
[reference[:keyword], reference]
|
168
|
+
}
|
169
|
+
]
|
170
|
+
experiment_context.values.each do |annotation|
|
171
|
+
new_reference = map_references.map_annotation_reference(
|
172
|
+
references[annotation[:name].to_sym]
|
173
|
+
)
|
174
|
+
|
175
|
+
if new_reference
|
176
|
+
annotation[:name] = new_reference[:keyword]
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -101,6 +101,27 @@ module BEL
|
|
101
101
|
)
|
102
102
|
hash
|
103
103
|
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def parse_statement(bel_statement)
|
108
|
+
namespaces = self.references.namespaces
|
109
|
+
::BEL::Script.parse(
|
110
|
+
"#{bel_statement}\n",
|
111
|
+
Hash[
|
112
|
+
namespaces.map { |ns|
|
113
|
+
keyword, uri = ns.values_at(:keyword, :uri)
|
114
|
+
sym = keyword.to_sym
|
115
|
+
[
|
116
|
+
sym,
|
117
|
+
::BEL::Namespace::NamespaceDefinition.new(sym, uri, uri)
|
118
|
+
]
|
119
|
+
}
|
120
|
+
]
|
121
|
+
).select { |obj|
|
122
|
+
obj.is_a? ::BEL::Model::Statement
|
123
|
+
}.first
|
124
|
+
end
|
104
125
|
end
|
105
126
|
end
|
106
127
|
end
|