bel 0.5.0 → 0.6.0
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.
- 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
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'map_references'
|
2
|
+
|
3
|
+
module BEL
|
4
|
+
module Model
|
5
|
+
class HashMapReferences
|
6
|
+
include MapReferences
|
7
|
+
|
8
|
+
def initialize(annotation_reference_map, namespace_reference_map)
|
9
|
+
@annotation_reference_map = annotation_reference_map
|
10
|
+
@namespace_reference_map = namespace_reference_map
|
11
|
+
|
12
|
+
@annotation_references = annotation_reference_map.values.uniq
|
13
|
+
@namespace_references = namespace_reference_map.values.uniq
|
14
|
+
end
|
15
|
+
|
16
|
+
def annotation_references
|
17
|
+
@annotation_references
|
18
|
+
end
|
19
|
+
|
20
|
+
def namespace_references
|
21
|
+
@namespace_references
|
22
|
+
end
|
23
|
+
|
24
|
+
def map_annotation_reference(reference)
|
25
|
+
@annotation_reference_map[reference]
|
26
|
+
end
|
27
|
+
|
28
|
+
def map_namespace_reference(reference)
|
29
|
+
@namespace_reference_map[reference]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module BEL
|
2
|
+
module Model
|
3
|
+
module MapReferences
|
4
|
+
|
5
|
+
def annotation_references
|
6
|
+
raise NotImplementedError.new(
|
7
|
+
"#{__method__} is not implemented for class #{self.class}"
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
def namespace_references
|
12
|
+
raise NotImplementedError.new(
|
13
|
+
"#{__method__} is not implemented for class #{self.class}"
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def map_annotation_reference(reference)
|
18
|
+
raise NotImplementedError.new(
|
19
|
+
"#{__method__} is not implemented for class #{self.class}"
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def map_namespace_reference(reference)
|
24
|
+
raise NotImplementedError.new(
|
25
|
+
"#{__method__} is not implemented for class #{self.class}"
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module BEL
|
2
|
+
module Model
|
3
|
+
|
4
|
+
class MapReferencesCombiner < BufferingEvidenceCombiner
|
5
|
+
|
6
|
+
def initialize(evidence_collection, map_references)
|
7
|
+
@evidence_collection = evidence_collection
|
8
|
+
@map_references = map_references
|
9
|
+
end
|
10
|
+
|
11
|
+
def annotation_references
|
12
|
+
@map_references.annotation_references
|
13
|
+
end
|
14
|
+
|
15
|
+
def namespace_references
|
16
|
+
@map_references.namespace_references
|
17
|
+
end
|
18
|
+
|
19
|
+
def each
|
20
|
+
if block_given?
|
21
|
+
@evidence_collection.each do |evidence|
|
22
|
+
yield rewrite_evidence!(evidence, @map_references)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
to_enum(:each)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module BEL
|
2
|
+
module Model
|
3
|
+
|
4
|
+
class StreamingEvidenceCombiner
|
5
|
+
|
6
|
+
attr_reader :annotation_references, :namespace_references
|
7
|
+
|
8
|
+
def initialize(evidence_collection)
|
9
|
+
@evidence_collection = evidence_collection
|
10
|
+
end
|
11
|
+
|
12
|
+
def each
|
13
|
+
if block_given?
|
14
|
+
@evidence_collection.each do |evidence|
|
15
|
+
once {
|
16
|
+
@annotation_references = evidence.references.annotations
|
17
|
+
@namespace_references = evidence.references.namespaces
|
18
|
+
}
|
19
|
+
|
20
|
+
yield evidence
|
21
|
+
end
|
22
|
+
else
|
23
|
+
to_enum(:each)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def once(*block_args, &block)
|
30
|
+
unless @_once_switch
|
31
|
+
block.call(*block_args)
|
32
|
+
@_once_switch = 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module BEL
|
2
|
+
module Model
|
3
|
+
|
4
|
+
def self.union_namespace_references(destination, source, suffix = 'incr')
|
5
|
+
BEL::Model.union_by_keyword(
|
6
|
+
destination,
|
7
|
+
source,
|
8
|
+
suffix
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.union_annotation_references(destination, source, suffix = 'incr')
|
13
|
+
BEL::Model.union_by_keyword(
|
14
|
+
destination,
|
15
|
+
source,
|
16
|
+
suffix
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Combines annotation/namespace references together by disambiguating
|
21
|
+
# the keywords. The references in @source@ are combined into
|
22
|
+
# @destination@.
|
23
|
+
#
|
24
|
+
# @param [Array<Hash>] destination existing references to merge with; may
|
25
|
+
# be an empty @[]@ array
|
26
|
+
# @param [Array<Hash>] source references to union with @destination@
|
27
|
+
# @param [String] suffix the suffix to apply to reference keywords
|
28
|
+
# in @source@ for disambiguation
|
29
|
+
# @return [Array<Array<Hash>,Hash>] array where the first item is and
|
30
|
+
# Array of combined references and the second item is a Hash that
|
31
|
+
# remaps references from source
|
32
|
+
def self.union_by_keyword(destination, source, suffix = 'incr')
|
33
|
+
# find new
|
34
|
+
new = source - destination
|
35
|
+
suffix_pattern = /#{Regexp.escape(suffix)}([0-9]+)$/
|
36
|
+
remap_result = {}
|
37
|
+
|
38
|
+
combined = destination + new.map { |new_obj|
|
39
|
+
new_key = new_obj[:keyword].to_s
|
40
|
+
|
41
|
+
# find a match where the keyword differs
|
42
|
+
new_value = new_obj.reject { |key, value| key == :keyword }
|
43
|
+
match_by_value = destination.find { |dest|
|
44
|
+
new_value == dest.reject { |key, value| key == :keyword }
|
45
|
+
}
|
46
|
+
|
47
|
+
rewrite_key =
|
48
|
+
if match_by_value
|
49
|
+
match_by_value[:keyword]
|
50
|
+
else
|
51
|
+
# find max suffix match
|
52
|
+
max_suffix = destination.map { |dest|
|
53
|
+
key, suffix_number = dest[:keyword].to_s.split(suffix_pattern)
|
54
|
+
if new_key == key
|
55
|
+
suffix_number
|
56
|
+
else
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
}.compact.max { |suffix_number|
|
60
|
+
suffix_number.to_i
|
61
|
+
}
|
62
|
+
|
63
|
+
if max_suffix
|
64
|
+
new_key + suffix + max_suffix.next
|
65
|
+
else
|
66
|
+
if destination.any? { |dest| dest[:keyword] == new_key }
|
67
|
+
"#{new_key}#{suffix}1"
|
68
|
+
else
|
69
|
+
new_key
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
rewrite_obj = new_obj.merge({:keyword => rewrite_key})
|
75
|
+
remap_result[new_obj] = rewrite_obj
|
76
|
+
rewrite_obj
|
77
|
+
}
|
78
|
+
combined.uniq!
|
79
|
+
|
80
|
+
[combined, remap_result]
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
data/lib/bel/gen.rb
CHANGED
@@ -38,11 +38,15 @@ module BEL
|
|
38
38
|
end
|
39
39
|
|
40
40
|
# Load generators after {BEL::Gen#soft_require} is available.
|
41
|
-
require_relative 'gen/
|
41
|
+
require_relative 'gen/document_header'
|
42
42
|
require_relative 'gen/annotation'
|
43
43
|
require_relative 'gen/citation'
|
44
|
-
require_relative 'gen/
|
45
|
-
require_relative 'gen/
|
44
|
+
require_relative 'gen/namespace'
|
45
|
+
require_relative 'gen/parameter'
|
46
|
+
require_relative 'gen/term'
|
47
|
+
require_relative 'gen/statement'
|
48
|
+
require_relative 'gen/evidence'
|
49
|
+
require_relative 'gen/sample_resources'
|
46
50
|
|
47
51
|
# vim: ts=2 sw=2:
|
48
52
|
# encoding: utf-8
|
data/lib/bel/gen/annotation.rb
CHANGED
@@ -7,7 +7,6 @@ module BEL
|
|
7
7
|
# The {Annotation} module defines methods that generate random annotations
|
8
8
|
# to be used in an evidence's {BEL::Model::ExperimentContext}.
|
9
9
|
module Annotation
|
10
|
-
include BEL::Quoting
|
11
10
|
|
12
11
|
# Array of the latest OpenBEL {BEL::Annotation::AnnotationDefinition}.
|
13
12
|
ANNOTATIONS =
|
@@ -38,7 +37,11 @@ module BEL
|
|
38
37
|
|
39
38
|
{
|
40
39
|
:name => anno.keyword,
|
41
|
-
:value =>
|
40
|
+
:value => Rantly {
|
41
|
+
sized(range(5, 20)) {
|
42
|
+
string(/[[:alnum:]]|[[:blank:]]|[[:punct:]]/)
|
43
|
+
}
|
44
|
+
}
|
42
45
|
}
|
43
46
|
end
|
44
47
|
end
|
data/lib/bel/gen/evidence.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'bel'
|
2
|
+
require_relative 'document_header'
|
2
3
|
require_relative 'annotation'
|
3
4
|
require_relative 'citation'
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
5
|
+
require_relative 'namespace'
|
6
|
+
require_relative 'parameter'
|
7
|
+
require_relative 'term'
|
8
|
+
require_relative 'statement'
|
6
9
|
|
7
10
|
require_relative '../gen'
|
8
11
|
BEL::Gen.soft_require('rantly')
|
@@ -15,10 +18,13 @@ module BEL
|
|
15
18
|
module Evidence
|
16
19
|
|
17
20
|
# Include other generators needed to create {BEL::Model::Evidence}.
|
21
|
+
include BEL::Gen::DocumentHeader
|
18
22
|
include BEL::Gen::Annotation
|
19
23
|
include BEL::Gen::Citation
|
20
|
-
include BEL::Gen::
|
21
|
-
include BEL::Gen::
|
24
|
+
include BEL::Gen::Namespace
|
25
|
+
include BEL::Gen::Parameter
|
26
|
+
include BEL::Gen::Statement
|
27
|
+
include BEL::Gen::Term
|
22
28
|
|
23
29
|
# Returns a random {BEL::Model::Evidence}.
|
24
30
|
#
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'bel'
|
2
|
+
require_relative '../gen'
|
3
|
+
BEL::Gen.soft_require('rantly')
|
4
|
+
|
5
|
+
module BEL
|
6
|
+
module Gen
|
7
|
+
|
8
|
+
# The {Namespace} module defines methods that generate random
|
9
|
+
# {BEL::Namespace::NamespaceDefinition}. The generated namespace are saved
|
10
|
+
# and can be accessed from {Namespace#referenced_namespaces}.
|
11
|
+
module Namespace
|
12
|
+
|
13
|
+
# Array of the latest OpenBEL {BEL::Namespace::NamespaceDefinition}.
|
14
|
+
NAMESPACES = BEL::Namespace::NAMESPACE_LATEST.map { |prefix, (url, rdf_uri)|
|
15
|
+
BEL::Namespace::NamespaceDefinition.new(prefix, url, rdf_uri)
|
16
|
+
}
|
17
|
+
|
18
|
+
# Retrieve the namespaces chosen during use of {#namespace}.
|
19
|
+
# @return [Hash] hash of namespace prefix => {BEL::Namespace::NamespaceDefinition}
|
20
|
+
def referenced_namespaces
|
21
|
+
@referenced_namespaces ||= Hash[
|
22
|
+
NAMESPACES.map { |ns| [ns.prefix, ns] }
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns a randomly chosen namespace.
|
27
|
+
# @return [BEL::Namespace::NamespaceDefinition] a random namespace
|
28
|
+
def namespace
|
29
|
+
ns = Rantly {
|
30
|
+
choose(*NAMESPACES)
|
31
|
+
}
|
32
|
+
referenced_namespaces[ns.prefix] = ns
|
33
|
+
ns
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'bel'
|
2
|
+
require_relative '../gen'
|
3
|
+
BEL::Gen.soft_require('rantly')
|
4
|
+
|
5
|
+
module BEL
|
6
|
+
module Gen
|
7
|
+
|
8
|
+
# The {Parameter} module defines methods that generate random BEL
|
9
|
+
# {BEL::Model::Parameter parameters}.
|
10
|
+
module Parameter
|
11
|
+
include BEL::Gen::Namespace
|
12
|
+
|
13
|
+
# Returns a BEL parameter from a random namespace. The value will be
|
14
|
+
# a random string and not necessarily part of the namespace.
|
15
|
+
#
|
16
|
+
# @return [BEL::Model::Parameter] a randomly generated parameter with
|
17
|
+
# a namespace
|
18
|
+
def bel_parameter_with_namespace
|
19
|
+
ns = namespace
|
20
|
+
value = Rantly.value {
|
21
|
+
sized(range(3,10)) {
|
22
|
+
string(/[[:alnum:]]|[[:blank:]]|[[:punct:]]/)
|
23
|
+
}
|
24
|
+
}
|
25
|
+
BEL::Model::Parameter.new(
|
26
|
+
ns,
|
27
|
+
value,
|
28
|
+
:A
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns a BEL parameter without a namespace. The value will be
|
33
|
+
# a random string.
|
34
|
+
#
|
35
|
+
# @return [BEL::Model::Parameter] a randomly generated parameter
|
36
|
+
# without a namespace
|
37
|
+
def bel_parameter_without_namespace
|
38
|
+
value = Rantly.value {
|
39
|
+
sized(range(3,10)) {
|
40
|
+
string(/[[:alnum:]]|[[:blank:]]|[[:punct:]]/)
|
41
|
+
}
|
42
|
+
}
|
43
|
+
BEL::Model::Parameter.new(
|
44
|
+
nil,
|
45
|
+
value,
|
46
|
+
:A
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a BEL parameter that may or may not have a namespace.
|
51
|
+
#
|
52
|
+
# Note: This method has a better chance of selecting a BEL parameter
|
53
|
+
# with a namespace.
|
54
|
+
#
|
55
|
+
# @see #bel_parameter_with_namespace
|
56
|
+
# @see #bel_parameter_without_namespace
|
57
|
+
# @return [BEL::Model::Parameter] a parameter that may or may not have
|
58
|
+
# a namespace
|
59
|
+
def bel_parameter
|
60
|
+
with_namespace = bel_parameter_with_namespace
|
61
|
+
without_namespace = bel_parameter_without_namespace
|
62
|
+
Rantly {
|
63
|
+
freq(
|
64
|
+
[5, :literal, with_namespace],
|
65
|
+
[1, :literal, without_namespace],
|
66
|
+
)
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../gen'
|
2
|
+
BEL::Gen.soft_require('rantly')
|
3
|
+
|
4
|
+
module BEL
|
5
|
+
module Gen
|
6
|
+
|
7
|
+
# The {SampleResources} module defines methods that sample data from actual
|
8
|
+
# resources.
|
9
|
+
#
|
10
|
+
# {BEL::Model::Parameter BEL parameters} are sampled from a
|
11
|
+
# {BEL::Namespace::NamespaceDefinition}.
|
12
|
+
#
|
13
|
+
# Annotations are sampled from a {BEL::Annotation::AnnotationDefinition}.
|
14
|
+
module SampleResources
|
15
|
+
include BEL::Gen::Annotation
|
16
|
+
|
17
|
+
# Returns a sampled annotation as a hash of +:name+ and +:value+. These
|
18
|
+
# can be added directly to an evidence's {BEL::Model::ExperimentContext}.
|
19
|
+
#
|
20
|
+
# @return [Hash] sampled annotation; hash of +:name+ and +:value+
|
21
|
+
def annotation
|
22
|
+
# pick annotation definition
|
23
|
+
anno = Rantly {
|
24
|
+
choose(*ANNOTATIONS)
|
25
|
+
}
|
26
|
+
|
27
|
+
# track annotation definitions
|
28
|
+
referenced_annotations[anno.keyword] = anno
|
29
|
+
|
30
|
+
{
|
31
|
+
:name => anno.keyword,
|
32
|
+
:value => anno.values.keys.sample
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns a BEL parameter with a value sampled from a random namespace.
|
37
|
+
#
|
38
|
+
# @return [BEL::Model::Parameter] a parameter with value sampled from a
|
39
|
+
# random namespace
|
40
|
+
def bel_parameter_with_namespace
|
41
|
+
ns = namespace
|
42
|
+
value = ns.values.keys.sample
|
43
|
+
enc = ns.values[value]
|
44
|
+
BEL::Model::Parameter.new(
|
45
|
+
ns,
|
46
|
+
value,
|
47
|
+
enc
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|