bel_parser 1.0.0.alpha.20 → 1.0.0.alpha.21
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/.gemspec +1 -1
- data/VERSION +1 -1
- data/lib/bel/translator/plugins/bel_script/bel_citation_serialization.rb +125 -0
- data/lib/bel/translator/plugins/bel_script/bel_discrete_serialization.rb +109 -0
- data/lib/bel/translator/plugins/bel_script/bel_top_down_serialization.rb +100 -0
- data/lib/bel/translator/plugins/bel_script/evidence_serialization.rb +79 -0
- data/lib/bel/translator/plugins/bel_script/reader.rb +34 -0
- data/lib/bel/translator/plugins/bel_script/translator.rb +18 -16
- data/lib/bel/translator/plugins/bel_script/writer.rb +180 -0
- data/lib/bel_parser/resource/resource_url_reader.rb +29 -16
- data/lib/bel_parser/script/keywords.rb +15 -1
- data/lib/bel_parser/script/nanopub_mapper.rb +85 -15
- data/lib/bel_parser/script/state/annotation_definition.rb +1 -1
- data/lib/bel_parser/script/state/set.rb +26 -1
- data/lib/bel_parser/script/state/unset.rb +4 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6a168817ba0f0cede0a3b4c7fdd078514a8ee6f
|
4
|
+
data.tar.gz: 84bb8cded6070abe5f02e93703c149cbb3adfd88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6960ba1eb867c53e98ea37be80617c7521773bd8676e348b1165a7ecf598acf9b6d005147423601b449c446638644cc130afec39856714b4ff70ac92b848f5e
|
7
|
+
data.tar.gz: 516482702677227cfdcb88aa44de29ea0a6ca3f00f1da74ad7e4ca3cfd6773d7df765e715b18e72a5e9a92845e05b1c5a2fdac1e52362d0a374073e75c24eff4
|
data/.gemspec
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.alpha.
|
1
|
+
1.0.0.alpha.21
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require_relative 'evidence_serialization.rb'
|
2
|
+
|
3
|
+
# BEL Script evidence serialization that groups evidence by citation scoped to
|
4
|
+
# individual statement groups (i.e. BEL Script's +SET STATEMENT_GROUP+ and
|
5
|
+
# +UNSET STATEMENT_GROUP+).
|
6
|
+
#
|
7
|
+
# @example Citation serialization for a group of evidence
|
8
|
+
# SET STATEMENT_GROUP = 12857727
|
9
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
10
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
11
|
+
# SET CellLine = "MCF 10A"
|
12
|
+
# SET TextLocation = Abstract
|
13
|
+
# complex(p(HGNC:USF1),g(HGNC:IGF2R))
|
14
|
+
#
|
15
|
+
# complex(p(HGNC:USF2),g(HGNC:IGF2R))
|
16
|
+
#
|
17
|
+
# tscript(p(HGNC:USF2)) directlyIncreases r(HGNC:IGF2R)
|
18
|
+
#
|
19
|
+
# tscript(p(HGNC:USF1)) causesNoChange r(HGNC:IGF2R)
|
20
|
+
#
|
21
|
+
# SET Evidence = "c-Myc was present on the CDK4 promoter to the ..."
|
22
|
+
# complex(p(HGNC:MYC),g(HGNC:CDK4))
|
23
|
+
# UNSET STATEMENT_GROUP
|
24
|
+
module BEL::Translator::Plugins::BelScript::BelCitationSerialization
|
25
|
+
include BEL::Translator::Plugins::BelScript::EvidenceSerialization
|
26
|
+
|
27
|
+
# Serialize the {BEL::Model::Evidence evidence} to a BEL Script string.
|
28
|
+
#
|
29
|
+
# Includes +SET AnnotationName+ and +UNSET AnnotationName+ where needed in
|
30
|
+
# order to remove duplicating annotations.
|
31
|
+
#
|
32
|
+
# @param [BEL::Model::Evidence] evidence the evidence to serialize
|
33
|
+
# @return [String] the BEL Script string
|
34
|
+
def to_bel(evidence)
|
35
|
+
bel = ''
|
36
|
+
|
37
|
+
citation = citation_value(evidence)
|
38
|
+
summary_text = summary_text_value(evidence)
|
39
|
+
annotations = annotation_values(evidence)
|
40
|
+
|
41
|
+
current_annotations = {}.merge(annotations)
|
42
|
+
current_annotations[:Citation] = citation if citation
|
43
|
+
current_annotations[:Evidence] = summary_text if summary_text
|
44
|
+
|
45
|
+
if !evidence.citation.id || evidence.citation.id.empty?
|
46
|
+
citation_id = quote('')
|
47
|
+
else
|
48
|
+
citation_id = quote_if_needed(evidence.citation.id)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Reset cumulative annotations if new citation.
|
52
|
+
if cumulative_citation == nil
|
53
|
+
bel << %Q{SET STATEMENT_GROUP = #{citation_id}\n}
|
54
|
+
cumulative_annotations.clear
|
55
|
+
elsif evidence.citation != cumulative_citation
|
56
|
+
bel << %Q{UNSET STATEMENT_GROUP\n}
|
57
|
+
bel << "\n\n"
|
58
|
+
bel << %Q{SET STATEMENT_GROUP = #{citation_id}\n}
|
59
|
+
cumulative_annotations.clear
|
60
|
+
end
|
61
|
+
|
62
|
+
# Hang on to the last citation.
|
63
|
+
self.cumulative_citation = evidence.citation
|
64
|
+
|
65
|
+
# UNSET unused annotations from previous evidence.
|
66
|
+
(cumulative_annotations.keys - current_annotations.keys).each do |unset_key|
|
67
|
+
bel << "UNSET #{unset_key}\n"
|
68
|
+
cumulative_annotations.delete(unset_key)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Remove annotation if key/value was SET by a previous evidence.
|
72
|
+
Hash[
|
73
|
+
cumulative_annotations.to_a & current_annotations.to_a
|
74
|
+
].each do |same_k, _|
|
75
|
+
current_annotations.delete(same_k)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Retain the current evidence's annotation in cumulative set.
|
79
|
+
cumulative_annotations.merge!(current_annotations)
|
80
|
+
|
81
|
+
# SET Citation
|
82
|
+
citation = current_annotations.delete(:Citation)
|
83
|
+
if citation
|
84
|
+
bel << "SET Citation = {#{citation}}\n"
|
85
|
+
end
|
86
|
+
|
87
|
+
# SET Evidence
|
88
|
+
summary_text = current_annotations.delete(:Evidence)
|
89
|
+
if summary_text
|
90
|
+
bel << %Q{SET Evidence = "#{summary_text}"\n}
|
91
|
+
end
|
92
|
+
|
93
|
+
# SET new or modified annotations
|
94
|
+
current_annotations.sort.each do |(name, value)|
|
95
|
+
bel << "SET #{name} = #{value}\n"
|
96
|
+
end
|
97
|
+
|
98
|
+
# Assert BEL statement
|
99
|
+
bel << "#{evidence.bel_statement}\n"
|
100
|
+
|
101
|
+
# Separate evidence by new line.
|
102
|
+
bel << "\n"
|
103
|
+
|
104
|
+
bel
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
# The cumulative citation that is active for the current evidence. This is
|
110
|
+
# tracked in order to decide when to begin a new statement group.
|
111
|
+
attr_accessor :cumulative_citation
|
112
|
+
|
113
|
+
# Returns the cumulative +Hash+ of annotations. This *state* is used to keep
|
114
|
+
# track of the active, scoped annotations as evidence is serialized.
|
115
|
+
def cumulative_annotations
|
116
|
+
@cumulative_annotations ||= {}
|
117
|
+
end
|
118
|
+
|
119
|
+
# Return BEL Script syntax that should completes the BEL Script document.
|
120
|
+
# For Citation serialization we will always end with the unset of a
|
121
|
+
# statement group.
|
122
|
+
def epilogue
|
123
|
+
%Q{UNSET STATEMENT_GROUP\n}
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require_relative 'evidence_serialization'
|
2
|
+
|
3
|
+
# BEL Script evidence serialization that writes each evidence with their full
|
4
|
+
# set of annotations (i.e. includes all `SET` and necessary `UNSET` records).
|
5
|
+
# This style is more readable because it groups all set annotations near the
|
6
|
+
# BEL statement.
|
7
|
+
#
|
8
|
+
# @example Discrete serialization for a group of evidence
|
9
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
10
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
11
|
+
# SET CellLine = "MCF 10A"
|
12
|
+
# SET TextLocation = Abstract
|
13
|
+
# complex(p(HGNC:USF1),g(HGNC:IGF2R))
|
14
|
+
#
|
15
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
16
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
17
|
+
# SET CellLine = "MCF 10A"
|
18
|
+
# SET TextLocation = Abstract
|
19
|
+
# complex(p(HGNC:USF2),g(HGNC:IGF2R))
|
20
|
+
#
|
21
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
22
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
23
|
+
# SET CellLine = "MCF 10A"
|
24
|
+
# SET TextLocation = Abstract
|
25
|
+
# tscript(p(HGNC:USF2)) directlyIncreases r(HGNC:IGF2R)
|
26
|
+
#
|
27
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
28
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
29
|
+
# SET CellLine = "MCF 10A"
|
30
|
+
# SET TextLocation = Abstract
|
31
|
+
# tscript(p(HGNC:USF1)) causesNoChange r(HGNC:IGF2R)
|
32
|
+
#
|
33
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
34
|
+
# SET Evidence = "c-Myc was present on the CDK4 promoter to the ..."
|
35
|
+
# SET CellLine = "MCF 10A"
|
36
|
+
# SET TextLocation = Abstract
|
37
|
+
# complex(p(HGNC:MYC),g(HGNC:CDK4))
|
38
|
+
#
|
39
|
+
# UNSET CellLine
|
40
|
+
module BEL::Translator::Plugins::BelScript::BelDiscreteSerialization
|
41
|
+
include BEL::Translator::Plugins::BelScript::EvidenceSerialization
|
42
|
+
|
43
|
+
# Serialize the {BEL::Model::Evidence evidence} to a BEL Script string.
|
44
|
+
# Includes all necessary +SET AnnotationName+ and +UNSET AnnotationName+
|
45
|
+
# records around the BEL statement.
|
46
|
+
#
|
47
|
+
# @param [BEL::Model::Evidence] evidence the evidence to serialize
|
48
|
+
# @return [String] the BEL Script string
|
49
|
+
def to_bel(evidence)
|
50
|
+
bel = ''
|
51
|
+
|
52
|
+
citation = citation_value(evidence)
|
53
|
+
summary_text = summary_text_value(evidence)
|
54
|
+
annotations = annotation_values(evidence)
|
55
|
+
|
56
|
+
current_annotations = {}.merge(annotations)
|
57
|
+
current_annotations[:Citation] = citation if citation
|
58
|
+
current_annotations[:Evidence] = summary_text if summary_text
|
59
|
+
|
60
|
+
# UNSET unused annotations from previous evidence.
|
61
|
+
(cumulative_annotations.keys - current_annotations.keys).each do |unset_key|
|
62
|
+
bel << "UNSET #{unset_key}\n"
|
63
|
+
cumulative_annotations.delete(unset_key)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Retain the current evidence's annotation in cumulative set.
|
67
|
+
cumulative_annotations.merge!(current_annotations)
|
68
|
+
|
69
|
+
# SET Citation
|
70
|
+
citation = current_annotations.delete(:Citation)
|
71
|
+
if citation
|
72
|
+
bel << "SET Citation = {#{citation}}\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
# SET Evidence
|
76
|
+
summary_text = current_annotations.delete(:Evidence)
|
77
|
+
if summary_text
|
78
|
+
bel << %Q{SET Evidence = "#{summary_text}"\n}
|
79
|
+
end
|
80
|
+
|
81
|
+
# SET new or modified annotations
|
82
|
+
current_annotations.sort.each do |(name, value)|
|
83
|
+
bel << "SET #{name} = #{value}\n"
|
84
|
+
end
|
85
|
+
|
86
|
+
# Assert BEL statement
|
87
|
+
bel << "#{evidence.bel_statement}\n"
|
88
|
+
|
89
|
+
# Separate evidence by new line.
|
90
|
+
bel << "\n"
|
91
|
+
|
92
|
+
bel
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
# Returns the cumulative +Hash+ of annotations. This *state* is used to keep
|
98
|
+
# track of the active, scoped annotations as evidence is serialized.
|
99
|
+
def cumulative_annotations
|
100
|
+
@cumulative_annotations ||= {}
|
101
|
+
end
|
102
|
+
|
103
|
+
# Return BEL Script syntax that completes the BEL Script document.
|
104
|
+
# The empty string is returned since no ending syntax is necessary when
|
105
|
+
# serializing each evidence discretely.
|
106
|
+
def epilogue
|
107
|
+
""
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative 'evidence_serialization.rb'
|
2
|
+
|
3
|
+
# BEL Script evidence serialization that writes evidence sequentially while
|
4
|
+
# including only the necessary unsetting of annotations (i.e. BEL Script's
|
5
|
+
# +UNSET AnnotationName+ syntax).
|
6
|
+
#
|
7
|
+
# @example Top-down serialization for a group of evidence
|
8
|
+
# SET Citation = {"PubMed", "Journal...", "12857727", "2003-08-11", "", ""}
|
9
|
+
# SET Evidence = "USF1 and USF2 bound the IGF2R promoter in vitro, ..."
|
10
|
+
# SET CellLine = "MCF 10A"
|
11
|
+
# SET TextLocation = Abstract
|
12
|
+
# complex(p(HGNC:USF1),g(HGNC:IGF2R))
|
13
|
+
#
|
14
|
+
# complex(p(HGNC:USF2),g(HGNC:IGF2R))
|
15
|
+
#
|
16
|
+
# tscript(p(HGNC:USF2)) directlyIncreases r(HGNC:IGF2R)
|
17
|
+
#
|
18
|
+
# tscript(p(HGNC:USF1)) causesNoChange r(HGNC:IGF2R)
|
19
|
+
#
|
20
|
+
# SET Evidence = "c-Myc was present on the CDK4 promoter to the ..."
|
21
|
+
# complex(p(HGNC:MYC),g(HGNC:CDK4))
|
22
|
+
#
|
23
|
+
# UNSET CellLine
|
24
|
+
module BEL::Translator::Plugins::BelScript::BelTopDownSerialization
|
25
|
+
include BEL::Translator::Plugins::BelScript::EvidenceSerialization
|
26
|
+
|
27
|
+
# Serialize the {BEL::Model::Evidence evidence} to a BEL Script string.
|
28
|
+
# Includes all necessary +SET AnnotationName+ and +UNSET AnnotationName+
|
29
|
+
# records within the scope of a citation's statement group.
|
30
|
+
#
|
31
|
+
# @param [BEL::Model::Evidence] evidence the evidence to serialize
|
32
|
+
# @return [String] the BEL Script string
|
33
|
+
def to_bel(evidence)
|
34
|
+
bel = ''
|
35
|
+
|
36
|
+
citation = citation_value(evidence)
|
37
|
+
summary_text = summary_text_value(evidence)
|
38
|
+
annotations = annotation_values(evidence)
|
39
|
+
|
40
|
+
current_annotations = {}.merge(annotations)
|
41
|
+
current_annotations[:Citation] = citation if citation
|
42
|
+
current_annotations[:Evidence] = summary_text if summary_text
|
43
|
+
|
44
|
+
# UNSET unused annotations from previous evidence.
|
45
|
+
(cumulative_annotations.keys - current_annotations.keys).each do |unset_key|
|
46
|
+
bel << "UNSET #{unset_key}\n"
|
47
|
+
cumulative_annotations.delete(unset_key)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Remove annotation if key/value was SET by a previous evidence.
|
51
|
+
Hash[
|
52
|
+
cumulative_annotations.to_a & current_annotations.to_a
|
53
|
+
].each do |same_k, _|
|
54
|
+
current_annotations.delete(same_k)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Retain the current evidence's annotation in cumulative set.
|
58
|
+
cumulative_annotations.merge!(current_annotations)
|
59
|
+
|
60
|
+
# SET Citation
|
61
|
+
citation = current_annotations.delete(:Citation)
|
62
|
+
if citation
|
63
|
+
bel << "SET Citation = {#{citation}}\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
# SET Evidence
|
67
|
+
summary_text = current_annotations.delete(:Evidence)
|
68
|
+
if summary_text
|
69
|
+
bel << %Q{SET Evidence = "#{summary_text}"\n}
|
70
|
+
end
|
71
|
+
|
72
|
+
# SET new or modified annotations
|
73
|
+
current_annotations.sort.each do |(name, value)|
|
74
|
+
bel << "SET #{name} = #{value}\n"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Assert BEL statement
|
78
|
+
bel << "#{evidence.bel_statement}\n"
|
79
|
+
|
80
|
+
# Separate evidence by new line.
|
81
|
+
bel << "\n"
|
82
|
+
|
83
|
+
bel
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Returns the cumulative +Hash+ of annotations. This *state* is used to keep
|
89
|
+
# track of the active, scoped annotations as evidence is serialized.
|
90
|
+
def cumulative_annotations
|
91
|
+
@cumulative_annotations ||= {}
|
92
|
+
end
|
93
|
+
|
94
|
+
# Return BEL Script syntax that completes the BEL Script document.
|
95
|
+
# The empty string is returned since no ending syntax is necessary when
|
96
|
+
# serializing in a top-down manner.
|
97
|
+
def epilogue
|
98
|
+
""
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'bel/quoting'
|
2
|
+
|
3
|
+
# Serializing of common {BEL::Model::Evidence evidence} components to BEL
|
4
|
+
# Script syntax.
|
5
|
+
#
|
6
|
+
# @abstract
|
7
|
+
module BEL::Translator::Plugins::BelScript::EvidenceSerialization
|
8
|
+
include BEL::Quoting
|
9
|
+
|
10
|
+
# Serialize the {BEL::Model::Evidence evidence} to a BEL Script string.
|
11
|
+
#
|
12
|
+
# @param [BEL::Model::Evidence] evidence the evidence to serialize
|
13
|
+
# @return [String] the BEL Script string
|
14
|
+
# @abstract Include and override {#to_bel} to implement serialization
|
15
|
+
# {BEL::Model::Evidence evidence} to BEL Script
|
16
|
+
def to_bel(evidence)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Return BEL Script syntax that completes the BEL Script document.
|
20
|
+
#
|
21
|
+
# @abstract
|
22
|
+
def epilogue
|
23
|
+
raise NotImplementedError.new("#{self.class}#epilogue")
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def citation_value(evidence)
|
29
|
+
citation = evidence.citation
|
30
|
+
|
31
|
+
return nil unless citation && citation.valid?
|
32
|
+
|
33
|
+
values = citation.to_a
|
34
|
+
values.map! { |v|
|
35
|
+
v ||= ""
|
36
|
+
if v.respond_to?(:each)
|
37
|
+
%Q{"#{v.join('|')}"}
|
38
|
+
else
|
39
|
+
%Q{"#{v}"}
|
40
|
+
end
|
41
|
+
}
|
42
|
+
values.join(', ')
|
43
|
+
end
|
44
|
+
|
45
|
+
def summary_text_value(evidence)
|
46
|
+
summary_text = evidence.summary_text
|
47
|
+
|
48
|
+
return nil unless summary_text && summary_text.value
|
49
|
+
|
50
|
+
value = summary_text.value
|
51
|
+
value.gsub!("\n", "")
|
52
|
+
value.gsub!('"', %Q{\\"})
|
53
|
+
value
|
54
|
+
end
|
55
|
+
|
56
|
+
def annotation_values(evidence)
|
57
|
+
experiment_context = evidence.experiment_context
|
58
|
+
|
59
|
+
return {} unless experiment_context
|
60
|
+
|
61
|
+
Hash[
|
62
|
+
experiment_context.
|
63
|
+
sort_by { |obj| obj[:name].to_sym }.
|
64
|
+
map { |obj|
|
65
|
+
name = obj[:name].to_sym
|
66
|
+
value = obj[:value]
|
67
|
+
|
68
|
+
value_s =
|
69
|
+
if value.respond_to? :map
|
70
|
+
"{#{value.map { |v| quote(v) }.join(', ')}}"
|
71
|
+
else
|
72
|
+
quote(value)
|
73
|
+
end
|
74
|
+
|
75
|
+
[name, value_s]
|
76
|
+
}
|
77
|
+
]
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'bel_parser'
|
2
|
+
require 'bel_parser/resource/resource_url_reader'
|
3
|
+
require 'bel/evidence_model'
|
4
|
+
|
5
|
+
module BEL::Translator::Plugins
|
6
|
+
module BelScript
|
7
|
+
class Reader
|
8
|
+
include ::BELParser::Script
|
9
|
+
|
10
|
+
def initialize(io)
|
11
|
+
@io = io
|
12
|
+
@state = {
|
13
|
+
resource_reader: BELParser::Resource::ResourceURLReader.new(true),
|
14
|
+
specification: BELParser::Language.specification('2.0'),
|
15
|
+
namespace_definitions: {}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def each
|
20
|
+
if block_given?
|
21
|
+
NanopubMapper.new(
|
22
|
+
Validator.new(
|
23
|
+
StateAggregator.new(
|
24
|
+
FirstNode.new(Filter.new(BELParser::ASTGenerator.new(@io))),
|
25
|
+
@state))).each do |hash|
|
26
|
+
yield ::BEL::Model::Evidence.create(hash)
|
27
|
+
end
|
28
|
+
else
|
29
|
+
enum_for(:each)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# Requires the "bel" gem.
|
2
2
|
# This is for the BelScript translator intended to be plugged into bel.rb.
|
3
3
|
require 'bel/translator'
|
4
|
+
require_relative 'reader'
|
5
|
+
require_relative 'writer'
|
4
6
|
|
5
7
|
module BEL::Translator::Plugins
|
6
8
|
module BelScript
|
@@ -10,25 +12,25 @@ module BEL::Translator::Plugins
|
|
10
12
|
include ::BEL::Translator
|
11
13
|
|
12
14
|
def read(data, options = {})
|
13
|
-
|
15
|
+
Reader.new(data)
|
14
16
|
end
|
15
17
|
|
16
18
|
def write(objects, writer = StringIO.new, options = {})
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
19
|
+
if block_given?
|
20
|
+
Writer.new(objects, options).each { |bel_part|
|
21
|
+
yield bel_part
|
22
|
+
}
|
23
|
+
else
|
24
|
+
if writer
|
25
|
+
Writer.new(objects, options).each { |bel_part|
|
26
|
+
writer << "#{bel_part}"
|
27
|
+
writer.flush
|
28
|
+
}
|
29
|
+
writer
|
30
|
+
else
|
31
|
+
Writer.new(objects, options)
|
32
|
+
end
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require_relative 'bel_citation_serialization'
|
2
|
+
require_relative 'bel_discrete_serialization'
|
3
|
+
require_relative 'bel_top_down_serialization'
|
4
|
+
require 'bel'
|
5
|
+
|
6
|
+
module BEL::Translator::Plugins
|
7
|
+
|
8
|
+
module BelScript
|
9
|
+
|
10
|
+
class Writer
|
11
|
+
|
12
|
+
# Create a {Writer} object that serializes {BEL::Model::Evidence} to
|
13
|
+
# BEL Script.
|
14
|
+
#
|
15
|
+
# @param [Enumerator<BEL::Model::Evidence>] data evidence data iterated
|
16
|
+
# using +each+
|
17
|
+
# @option options [Boolean] :write_header +true+ to write the BEL Script
|
18
|
+
# document header; +false+ to not write the BEL Script document
|
19
|
+
# header
|
20
|
+
# @option options [Symbol,Module] :serialization the serialization
|
21
|
+
# technique to use for evidence; a +Module+ type will be used as
|
22
|
+
# is; a +Symbol+ type will be mapped as
|
23
|
+
# +:discrete+ => {BelDiscreteSerialization},
|
24
|
+
# +:topdown+ => {BelTopDownSerialization},
|
25
|
+
# +:citation+ => {BelCitationSerialization}; otherwise the default
|
26
|
+
# of {BelCitationSerialization} is used
|
27
|
+
def initialize(data, options = {})
|
28
|
+
@data = data
|
29
|
+
@streaming = options.fetch(:streaming, false)
|
30
|
+
@write_header = options.fetch(:write_header, true)
|
31
|
+
@annotation_reference_map = options.fetch(:annotation_reference_map, nil)
|
32
|
+
@namespace_reference_map = options.fetch(:namespace_reference_map, nil)
|
33
|
+
|
34
|
+
# augment self with BEL serialization stategy.
|
35
|
+
serialization = options[:serialization]
|
36
|
+
serialization_module =
|
37
|
+
case serialization
|
38
|
+
when Module
|
39
|
+
serialization
|
40
|
+
when String, Symbol
|
41
|
+
serialization_refs = {
|
42
|
+
:discrete => BelDiscreteSerialization,
|
43
|
+
:topdown => BelTopDownSerialization,
|
44
|
+
:citation => BelCitationSerialization,
|
45
|
+
}
|
46
|
+
serialization_module = serialization_refs[serialization.to_sym]
|
47
|
+
unless serialization_module
|
48
|
+
raise %Q{No BEL serialization strategy for "#{serialization}"}
|
49
|
+
end
|
50
|
+
serialization_module
|
51
|
+
else
|
52
|
+
# Default to citation serialization.
|
53
|
+
BelCitationSerialization
|
54
|
+
end
|
55
|
+
|
56
|
+
self_eigenclass = (class << self; self; end)
|
57
|
+
self_eigenclass.send(:include, serialization_module)
|
58
|
+
end
|
59
|
+
|
60
|
+
def each
|
61
|
+
if block_given?
|
62
|
+
combiner =
|
63
|
+
if @streaming
|
64
|
+
BEL::Model::StreamingEvidenceCombiner.new(@data)
|
65
|
+
elsif @annotation_reference_map && @namespace_reference_map
|
66
|
+
BEL::Model::MapReferencesCombiner.new(
|
67
|
+
@data,
|
68
|
+
BEL::Model::HashMapReferences.new(
|
69
|
+
@annotation_reference_map,
|
70
|
+
@namespace_reference_map
|
71
|
+
)
|
72
|
+
)
|
73
|
+
else
|
74
|
+
BEL::Model::BufferingEvidenceCombiner.new(@data)
|
75
|
+
end
|
76
|
+
|
77
|
+
header_flag = true
|
78
|
+
combiner.each { |evidence|
|
79
|
+
|
80
|
+
# serialize evidence
|
81
|
+
bel = to_bel(evidence)
|
82
|
+
|
83
|
+
if @write_header && header_flag
|
84
|
+
yield document_header(evidence.metadata.document_header)
|
85
|
+
yield namespaces(combiner.namespace_references)
|
86
|
+
yield annotations(combiner.annotation_references)
|
87
|
+
|
88
|
+
yield <<-COMMENT.gsub(/^\s+/, '')
|
89
|
+
###############################################
|
90
|
+
# Statements Section
|
91
|
+
COMMENT
|
92
|
+
header_flag = false
|
93
|
+
end
|
94
|
+
|
95
|
+
yield bel
|
96
|
+
}
|
97
|
+
|
98
|
+
yield epilogue
|
99
|
+
else
|
100
|
+
to_enum(:each)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def document_header(header)
|
107
|
+
return "" unless header
|
108
|
+
|
109
|
+
bel = <<-COMMENT.gsub(/^\s+/, '')
|
110
|
+
###############################################
|
111
|
+
# Document Properties Section
|
112
|
+
COMMENT
|
113
|
+
|
114
|
+
header.each { |name, value|
|
115
|
+
name_s = name.to_s
|
116
|
+
value_s =
|
117
|
+
if value.respond_to?(:each)
|
118
|
+
value.join('|')
|
119
|
+
else
|
120
|
+
value.to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
# handle casing for document properties (special case, contactinfo)
|
124
|
+
name_s = (name_s.downcase == 'contactinfo') ?
|
125
|
+
'ContactInfo' :
|
126
|
+
name_s.capitalize
|
127
|
+
|
128
|
+
bel << %Q{SET DOCUMENT #{name_s} = "#{value_s}"\n}
|
129
|
+
}
|
130
|
+
|
131
|
+
bel << "\n"
|
132
|
+
bel
|
133
|
+
end
|
134
|
+
|
135
|
+
def annotations(annotation_references)
|
136
|
+
bel = <<-COMMENT.gsub(/^\s+/, '')
|
137
|
+
###############################################
|
138
|
+
# Annotation Definitions Section
|
139
|
+
COMMENT
|
140
|
+
|
141
|
+
return bel unless annotation_references
|
142
|
+
|
143
|
+
annotation_references.reduce(bel) { |bel, ref|
|
144
|
+
keyword, type, domain = ref.values_at(:keyword, :type, :domain)
|
145
|
+
bel << "DEFINE ANNOTATION #{keyword} AS "
|
146
|
+
|
147
|
+
case type.to_sym
|
148
|
+
when :uri
|
149
|
+
bel << %Q{URL "#{domain}"\n}
|
150
|
+
when :pattern
|
151
|
+
regex = domain.respond_to?(:source) ? domain.source : domain
|
152
|
+
bel << %Q{PATTERN "#{regex}"\n}
|
153
|
+
when :list
|
154
|
+
bel << %Q|LIST {#{domain.inspect[1...-1]}}\n|
|
155
|
+
end
|
156
|
+
bel
|
157
|
+
}
|
158
|
+
bel << "\n"
|
159
|
+
bel
|
160
|
+
end
|
161
|
+
|
162
|
+
def namespaces(namespace_references)
|
163
|
+
bel = <<-COMMENT.gsub(/^\s+/, '')
|
164
|
+
###############################################
|
165
|
+
# Namespace Definitions Section
|
166
|
+
COMMENT
|
167
|
+
|
168
|
+
return bel unless namespace_references
|
169
|
+
|
170
|
+
namespace_references.reduce(bel) { |bel, ref|
|
171
|
+
keyword, url = ref.values_at(:keyword, :uri)
|
172
|
+
bel << %Q{DEFINE NAMESPACE #{keyword} AS URL "#{url}"\n}
|
173
|
+
bel
|
174
|
+
}
|
175
|
+
bel << "\n"
|
176
|
+
bel
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -19,12 +19,16 @@ module BELParser
|
|
19
19
|
class ResourceURLReader
|
20
20
|
include Reader
|
21
21
|
|
22
|
+
# Class ivars for tracking open {GDBM} databases.
|
23
|
+
@dataset_file = nil
|
24
|
+
@resource_files = {}
|
25
|
+
|
22
26
|
DEFAULT_RESOURCE_VALUE_DELIMITER = '|'
|
23
27
|
private_constant :DEFAULT_RESOURCE_VALUE_DELIMITER
|
24
28
|
|
25
29
|
def initialize(reuse_database_files = false)
|
26
30
|
@resources = {}
|
27
|
-
@datasets =
|
31
|
+
@datasets = ResourceURLReader.open_datasets_file
|
28
32
|
@reuse = reuse_database_files
|
29
33
|
end
|
30
34
|
|
@@ -67,15 +71,14 @@ module BELParser
|
|
67
71
|
def create_resource(url, line_enum)
|
68
72
|
delimiter = DEFAULT_RESOURCE_VALUE_DELIMITER
|
69
73
|
dataset = @datasets[url]
|
70
|
-
|
71
|
-
values = ::GDBM.new(value_database_file)
|
74
|
+
values = ResourceURLReader.open_resource_file(url)
|
72
75
|
|
73
76
|
if @reuse && dataset && values.size > 0
|
74
77
|
warn(
|
75
78
|
<<-MSG.gsub(/^ {14}/, '')
|
76
79
|
Warning - Reusing value database.
|
77
80
|
URL: #{url}
|
78
|
-
File: #{
|
81
|
+
File: #{ResourceURLReader._temporary_resource_file(url)}
|
79
82
|
MSG
|
80
83
|
)
|
81
84
|
return {
|
@@ -130,31 +133,41 @@ module BELParser
|
|
130
133
|
end
|
131
134
|
end
|
132
135
|
|
133
|
-
|
134
|
-
|
135
|
-
def _get(url, &block)
|
136
|
-
Net::HTTP.start(url.host, url.port) do |http|
|
137
|
-
http.request(Net::HTTP::Get.new(url)) do |response|
|
138
|
-
return response.read_body
|
139
|
-
end
|
140
|
-
end
|
136
|
+
def self.open_datasets_file
|
137
|
+
@dataset_file ||= ::GDBM.new(_temporary_datasets_file)
|
141
138
|
end
|
142
139
|
|
143
|
-
def
|
144
|
-
|
140
|
+
def self.open_resource_file(url)
|
141
|
+
@resource_files[url] ||= ::GDBM.new(_temporary_resource_file(url))
|
145
142
|
end
|
146
143
|
|
147
|
-
def _temporary_datasets_file
|
144
|
+
def self._temporary_datasets_file
|
148
145
|
resource_directory = File.join(Dir.tmpdir, 'belresources')
|
149
146
|
FileUtils.mkdir_p(resource_directory)
|
150
147
|
File.join(resource_directory, 'datasets.gdbm')
|
151
148
|
end
|
152
149
|
|
153
|
-
def
|
150
|
+
def self._temporary_resource_file(url)
|
154
151
|
resource_directory = File.join(Dir.tmpdir, 'belresources')
|
155
152
|
FileUtils.mkdir_p(resource_directory)
|
156
153
|
File.join(resource_directory, "#{_hash_url(url)}.gdbm")
|
157
154
|
end
|
155
|
+
|
156
|
+
def self._hash_url(url)
|
157
|
+
Base64.encode64(Digest::SHA1.digest(url)).delete("/=\n")
|
158
|
+
end
|
159
|
+
private_class_method :_hash_url
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def _get(url, &block)
|
164
|
+
Net::HTTP.start(url.host, url.port) do |http|
|
165
|
+
http.request(Net::HTTP::Get.new(url)) do |response|
|
166
|
+
return response.read_body
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
158
171
|
end
|
159
172
|
end
|
160
173
|
end
|
@@ -4,8 +4,22 @@ module BELParser
|
|
4
4
|
BEL_VERSION_STRING = 'BELVersion'.freeze
|
5
5
|
BEL_VERSION_REGEX = /\A#{BEL_VERSION_STRING}\Z/i
|
6
6
|
|
7
|
+
CITATION = 'Citation'.freeze
|
8
|
+
CITATION_REGEX = /\A#{CITATION}\Z/i
|
9
|
+
|
10
|
+
SUPPORT = 'Support'.freeze
|
11
|
+
SUPPORT_REGEX = /\A#{SUPPORT}\Z/i
|
12
|
+
|
7
13
|
def is_bel_version?(string)
|
8
|
-
string
|
14
|
+
string =~ BEL_VERSION_REGEX
|
15
|
+
end
|
16
|
+
|
17
|
+
def is_citation?(string)
|
18
|
+
string =~ CITATION_REGEX
|
19
|
+
end
|
20
|
+
|
21
|
+
def is_support?(string)
|
22
|
+
string =~ SUPPORT_REGEX
|
9
23
|
end
|
10
24
|
end
|
11
25
|
end
|
@@ -1,32 +1,93 @@
|
|
1
|
+
require 'bel_parser/quoting'
|
2
|
+
require_relative '../parsers/serializer'
|
3
|
+
|
1
4
|
module BELParser
|
2
5
|
module Script
|
3
|
-
# NanopubMapper maps BEL Script AST nodes to
|
6
|
+
# NanopubMapper maps BEL Script AST nodes and state to aggregated
|
7
|
+
# nanopub hash objects.
|
4
8
|
class NanopubMapper
|
9
|
+
include BELParser::Parsers
|
10
|
+
include BELParser::Quoting
|
11
|
+
|
5
12
|
STATEMENT_TYPES = [
|
6
13
|
:simple_statement,
|
7
14
|
:nested_statement,
|
8
15
|
:observed_term
|
9
16
|
]
|
10
17
|
|
18
|
+
DEFINITIONS = [:annotation_definitions, :namespace_definitions]
|
19
|
+
|
11
20
|
def initialize(ast_enum)
|
12
21
|
@ast_enum = ast_enum
|
13
22
|
end
|
14
23
|
|
15
|
-
def each
|
24
|
+
def each(&block)
|
16
25
|
if block_given?
|
17
26
|
@ast_enum.each do |(line_nunber, line, ast_node, state)|
|
18
27
|
next unless STATEMENT_TYPES.include?(ast_node.type)
|
28
|
+
yield nanopub(ast_node, state, &block)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
enum_for(:each)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def nanopub(ast_node, state, &block)
|
36
|
+
{
|
37
|
+
bel_statement: serialize(ast_node),
|
38
|
+
citation: citation(state[:citation]),
|
39
|
+
support: support(state[:support]),
|
40
|
+
experiment_context: experiment_context(state[:annotations]),
|
41
|
+
references: references(*state.values_at(*DEFINITIONS)),
|
42
|
+
metadata: nil
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def citation(citation)
|
47
|
+
citation.each do |field, value|
|
48
|
+
citation[field] = unquote(value)
|
49
|
+
end
|
50
|
+
end
|
19
51
|
|
20
|
-
|
21
|
-
|
22
|
-
|
52
|
+
def support(support)
|
53
|
+
unquote(support)
|
54
|
+
end
|
23
55
|
|
24
|
-
|
56
|
+
def experiment_context(annotations)
|
57
|
+
(annotations || []).map do |name, value|
|
58
|
+
{
|
59
|
+
name: name,
|
60
|
+
value: value
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
25
64
|
|
26
|
-
|
65
|
+
def references(anno_defs, ns_defs)
|
66
|
+
{
|
67
|
+
annotations: (anno_defs || []).map do |keyword, (type, domain)|
|
68
|
+
{
|
69
|
+
keyword: keyword,
|
70
|
+
type: type,
|
71
|
+
domain: domain_value(type, domain)
|
72
|
+
}
|
73
|
+
end,
|
74
|
+
namespaces: (ns_defs || []).map do |keyword, uri|
|
75
|
+
{
|
76
|
+
keyword: keyword,
|
77
|
+
uri: domain_value(:uri, uri)
|
78
|
+
}
|
27
79
|
end
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def domain_value(type, domain)
|
84
|
+
case type
|
85
|
+
when :uri
|
86
|
+
domain.identifier
|
87
|
+
when :list
|
88
|
+
domain
|
28
89
|
else
|
29
|
-
|
90
|
+
domain.to_s
|
30
91
|
end
|
31
92
|
end
|
32
93
|
end
|
@@ -38,7 +99,9 @@ if __FILE__ == $PROGRAM_NAME
|
|
38
99
|
File.join(File.expand_path(File.dirname(__FILE__)), '..', '..', '..', 'lib'))
|
39
100
|
|
40
101
|
require 'json'
|
102
|
+
require 'bel_parser'
|
41
103
|
require 'bel_parser/language'
|
104
|
+
require 'bel_parser/parsers/serializer'
|
42
105
|
require 'bel_parser/script'
|
43
106
|
require 'bel_parser/resource/resource_url_reader'
|
44
107
|
include BELParser::Script
|
@@ -58,11 +121,18 @@ if __FILE__ == $PROGRAM_NAME
|
|
58
121
|
namespace_definitions: namespaces
|
59
122
|
}
|
60
123
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
124
|
+
io =
|
125
|
+
if ARGV.first
|
126
|
+
File.open(ARGV.first)
|
127
|
+
else
|
128
|
+
$stdin
|
129
|
+
end
|
130
|
+
|
131
|
+
nanopubs =
|
132
|
+
NanopubMapper.new(
|
133
|
+
Validator.new(
|
134
|
+
StateAggregator.new(
|
135
|
+
FirstNode.new(Filter.new(BELParser::ASTGenerator.new(io))),
|
136
|
+
initial_state))).each.to_a
|
137
|
+
puts JSON.dump(nanopubs)
|
68
138
|
end
|
@@ -53,7 +53,7 @@ module BELParser
|
|
53
53
|
url = unquote(url_node.string.string_literal)
|
54
54
|
dataset = script_context[:resource_reader].retrieve_resource(url)
|
55
55
|
script_context[:annotation_definitions] ||= Concurrent::Hash.new
|
56
|
-
script_context[:annotation_definitions][prefix] = [:
|
56
|
+
script_context[:annotation_definitions][prefix] = [:uri, dataset]
|
57
57
|
end
|
58
58
|
private_class_method :handle_url
|
59
59
|
end
|
@@ -2,6 +2,7 @@ require 'bel_parser/language'
|
|
2
2
|
require 'bel_parser/quoting'
|
3
3
|
require 'bel_parser/parsers/ast/node'
|
4
4
|
require 'concurrent/hash'
|
5
|
+
require_relative '../keywords'
|
5
6
|
require_relative '../state_function'
|
6
7
|
|
7
8
|
module BELParser
|
@@ -9,17 +10,24 @@ module BELParser
|
|
9
10
|
module State
|
10
11
|
class Set
|
11
12
|
extend StateFunction
|
13
|
+
extend BELParser::Script::Keyword
|
12
14
|
extend BELParser::Quoting
|
13
15
|
|
14
16
|
TARGET_NODE = BELParser::Parsers::AST::Set
|
15
17
|
LIST_NODE = BELParser::Parsers::AST::List
|
18
|
+
FIELDS = %w(type name id date authors comment)
|
16
19
|
|
17
20
|
def self.consume(ast_node, script_context)
|
18
21
|
return nil unless ast_node.is_a?(TARGET_NODE)
|
19
22
|
name, value = ast_node.children
|
20
23
|
name_string = name.identifier.string_literal
|
21
24
|
value_node = ast_node.value.children[0]
|
22
|
-
|
25
|
+
case
|
26
|
+
when is_citation?(name_string)
|
27
|
+
handle_citation(value_node, script_context)
|
28
|
+
when is_support?(name_string)
|
29
|
+
handle_support(value_node, script_context)
|
30
|
+
when value_node.is_a?(LIST_NODE)
|
23
31
|
value_node
|
24
32
|
.list_items.map { |li| li.children[0].string_literal }
|
25
33
|
.each do |string|
|
@@ -36,6 +44,22 @@ module BELParser
|
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
47
|
+
def self.handle_citation(value_node, script_context)
|
48
|
+
if value_node.is_a?(LIST_NODE)
|
49
|
+
script_context[:citation] =
|
50
|
+
Hash[
|
51
|
+
FIELDS.zip(
|
52
|
+
value_node
|
53
|
+
.list_items
|
54
|
+
.map { |li| li.children[0].string_literal })
|
55
|
+
]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.handle_support(value_node, script_context)
|
60
|
+
script_context[:support] = value_node.string_literal
|
61
|
+
end
|
62
|
+
|
39
63
|
def self.handle_annotation(name, value, script_context)
|
40
64
|
# add to annotation state
|
41
65
|
script_context[:annotations] ||= Concurrent::Hash.new
|
@@ -49,6 +73,7 @@ module BELParser
|
|
49
73
|
# clear annotation state
|
50
74
|
script_context[:annotations] ||= Concurrent::Hash.new
|
51
75
|
script_context[:annotations].clear
|
76
|
+
script_context[:citation] = nil
|
52
77
|
end
|
53
78
|
private_class_method :handle_statement_group
|
54
79
|
end
|
@@ -2,6 +2,7 @@ require 'bel_parser/language'
|
|
2
2
|
require 'bel_parser/quoting'
|
3
3
|
require 'bel_parser/parsers/ast/node'
|
4
4
|
require 'concurrent/hash'
|
5
|
+
require_relative '../keywords'
|
5
6
|
require_relative '../state_function'
|
6
7
|
|
7
8
|
module BELParser
|
@@ -9,6 +10,7 @@ module BELParser
|
|
9
10
|
module State
|
10
11
|
class Unset
|
11
12
|
extend StateFunction
|
13
|
+
extend BELParser::Script::Keyword
|
12
14
|
extend BELParser::Quoting
|
13
15
|
|
14
16
|
TARGET_NODE = BELParser::Parsers::AST::Unset
|
@@ -27,14 +29,15 @@ module BELParser
|
|
27
29
|
def self.handle_annotation(name, script_context)
|
28
30
|
script_context[:annotations] ||= Concurrent::Hash.new
|
29
31
|
script_context[:annotations].delete(name)
|
32
|
+
script_context[:citation] = nil if is_citation?(name)
|
30
33
|
end
|
31
34
|
private_class_method :handle_annotation
|
32
35
|
|
33
36
|
def self.handle_statement_group(script_context)
|
34
37
|
script_context.delete(:statement_group)
|
35
|
-
|
36
38
|
script_context[:annotations] ||= Concurrent::Hash.new
|
37
39
|
script_context[:annotations].clear
|
40
|
+
script_context[:citation] = nil
|
38
41
|
end
|
39
42
|
private_class_method :handle_statement_group
|
40
43
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bel_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.alpha.
|
4
|
+
version: 1.0.0.alpha.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Bargnesi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-05-
|
12
|
+
date: 2016-05-02 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Implements language versions 1.0 and 2.0.
|
15
15
|
email: abargnesi@selventa.com
|
@@ -27,7 +27,13 @@ files:
|
|
27
27
|
- bin/bel2_validator
|
28
28
|
- bin/bel_script_reader
|
29
29
|
- lib/bel/translator/plugins/bel_script.rb
|
30
|
+
- lib/bel/translator/plugins/bel_script/bel_citation_serialization.rb
|
31
|
+
- lib/bel/translator/plugins/bel_script/bel_discrete_serialization.rb
|
32
|
+
- lib/bel/translator/plugins/bel_script/bel_top_down_serialization.rb
|
33
|
+
- lib/bel/translator/plugins/bel_script/evidence_serialization.rb
|
34
|
+
- lib/bel/translator/plugins/bel_script/reader.rb
|
30
35
|
- lib/bel/translator/plugins/bel_script/translator.rb
|
36
|
+
- lib/bel/translator/plugins/bel_script/writer.rb
|
31
37
|
- lib/bel_parser.rb
|
32
38
|
- lib/bel_parser/ast_filter.rb
|
33
39
|
- lib/bel_parser/ast_generator.rb
|