bel_parser 1.0.0.alpha.12 → 1.0.0.alpha.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.gemspec +1 -1
  3. data/VERSION +1 -1
  4. data/bin/bel2_validator +35 -8
  5. data/lib/bel_parser/expression/validator.rb +3 -2
  6. data/lib/bel_parser/language/apply_namespace_encoding.rb +96 -0
  7. data/lib/bel_parser/language/base_specification.rb +82 -0
  8. data/lib/bel_parser/language/expression_validator.rb +6 -2
  9. data/lib/bel_parser/language/relationship.rb +1 -1
  10. data/lib/bel_parser/language/semantics/signature_mapping.rb +26 -32
  11. data/lib/bel_parser/language/semantics_ast.rb +285 -149
  12. data/lib/bel_parser/language/semantics_ast_warnings.rb +180 -0
  13. data/lib/bel_parser/language/semantics_result.rb +11 -2
  14. data/lib/bel_parser/language/semantics_type_warning.rb +22 -0
  15. data/lib/bel_parser/language/semantics_warning.rb +8 -0
  16. data/lib/bel_parser/language/specification.rb +38 -55
  17. data/lib/bel_parser/language/syntax/undefined_namespace_value.rb +43 -0
  18. data/lib/bel_parser/language/syntax_error.rb +8 -0
  19. data/lib/bel_parser/language/syntax_result.rb +8 -0
  20. data/lib/bel_parser/language/syntax_warning.rb +9 -4
  21. data/lib/bel_parser/language/version1_0/functions/abundance.rb +5 -6
  22. data/lib/bel_parser/language/version1_0/functions/biological_process.rb +5 -6
  23. data/lib/bel_parser/language/version1_0/functions/complex_abundance.rb +6 -7
  24. data/lib/bel_parser/language/version1_0/functions/fusion.rb +39 -60
  25. data/lib/bel_parser/language/version1_0/functions/gene_abundance.rb +9 -12
  26. data/lib/bel_parser/language/version1_0/functions/list.rb +5 -6
  27. data/lib/bel_parser/language/version1_0/functions/micro_rna_abundance.rb +5 -6
  28. data/lib/bel_parser/language/version1_0/functions/pathology.rb +5 -6
  29. data/lib/bel_parser/language/version1_0/functions/protein_abundance.rb +16 -30
  30. data/lib/bel_parser/language/version1_0/functions/protein_modification.rb +15 -27
  31. data/lib/bel_parser/language/version1_0/functions/rna_abundance.rb +8 -11
  32. data/lib/bel_parser/language/version1_0/functions/substitution.rb +6 -12
  33. data/lib/bel_parser/language/version1_0/functions/translocation.rb +9 -12
  34. data/lib/bel_parser/language/version1_0/functions/truncation.rb +2 -4
  35. data/lib/bel_parser/language/version1_0/value_encodings/abundance.rb +21 -0
  36. data/lib/bel_parser/language/version1_0/value_encodings/any.rb +74 -0
  37. data/lib/bel_parser/language/version1_0/value_encodings/biological_process.rb +21 -0
  38. data/lib/bel_parser/language/version1_0/value_encodings/complex_abundance.rb +21 -0
  39. data/lib/bel_parser/language/version1_0/value_encodings/gene_abundance.rb +21 -0
  40. data/lib/bel_parser/language/version1_0/value_encodings/micro_rna_abundance.rb +21 -0
  41. data/lib/bel_parser/language/version1_0/value_encodings/pathology.rb +21 -0
  42. data/lib/bel_parser/language/version1_0/value_encodings/protein_abundance.rb +21 -0
  43. data/lib/bel_parser/language/version1_0/value_encodings/rna_abundance.rb +21 -0
  44. data/lib/bel_parser/language/version1_0.rb +6 -87
  45. data/lib/bel_parser/language/version2_0/functions/abundance.rb +13 -18
  46. data/lib/bel_parser/language/version2_0/functions/biological_process.rb +5 -6
  47. data/lib/bel_parser/language/version2_0/functions/complex_abundance.rb +9 -12
  48. data/lib/bel_parser/language/version2_0/functions/fragment.rb +4 -9
  49. data/lib/bel_parser/language/version2_0/functions/from_location.rb +5 -6
  50. data/lib/bel_parser/language/version2_0/functions/fusion.rb +39 -66
  51. data/lib/bel_parser/language/version2_0/functions/gene_abundance.rb +13 -18
  52. data/lib/bel_parser/language/version2_0/functions/list.rb +5 -6
  53. data/lib/bel_parser/language/version2_0/functions/location.rb +5 -6
  54. data/lib/bel_parser/language/version2_0/functions/micro_rna_abundance.rb +13 -18
  55. data/lib/bel_parser/language/version2_0/functions/molecular_activity.rb +6 -5
  56. data/lib/bel_parser/language/version2_0/functions/pathology.rb +5 -6
  57. data/lib/bel_parser/language/version2_0/functions/protein_abundance.rb +21 -30
  58. data/lib/bel_parser/language/version2_0/functions/protein_modification.rb +11 -17
  59. data/lib/bel_parser/language/version2_0/functions/rna_abundance.rb +13 -18
  60. data/lib/bel_parser/language/version2_0/functions/to_location.rb +5 -6
  61. data/lib/bel_parser/language/version2_0/functions/variant.rb +1 -4
  62. data/lib/bel_parser/language/version2_0/value_encodings/abundance.rb +21 -0
  63. data/lib/bel_parser/language/version2_0/value_encodings/activity.rb +21 -0
  64. data/lib/bel_parser/language/version2_0/value_encodings/any.rb +74 -0
  65. data/lib/bel_parser/language/version2_0/value_encodings/biological_process.rb +21 -0
  66. data/lib/bel_parser/language/version2_0/value_encodings/complex_abundance.rb +21 -0
  67. data/lib/bel_parser/language/version2_0/value_encodings/gene_abundance.rb +21 -0
  68. data/lib/bel_parser/language/version2_0/value_encodings/location.rb +21 -0
  69. data/lib/bel_parser/language/version2_0/value_encodings/micro_rna_abundance.rb +21 -0
  70. data/lib/bel_parser/language/version2_0/value_encodings/pathology.rb +21 -0
  71. data/lib/bel_parser/language/version2_0/value_encodings/protein_abundance.rb +21 -0
  72. data/lib/bel_parser/language/version2_0/value_encodings/protein_modification.rb +21 -0
  73. data/lib/bel_parser/language/version2_0/value_encodings/rna_abundance.rb +21 -0
  74. data/lib/bel_parser/language/version2_0.rb +6 -60
  75. data/lib/bel_parser/language.rb +3 -4
  76. data/lib/bel_parser/parsers/ast/node.rb +14 -2
  77. data/lib/bel_parser/{language/quoting.rb → quoting.rb} +0 -56
  78. data/lib/bel_parser/resource/concept.rb +56 -0
  79. data/lib/bel_parser/resource/concept_scheme.rb +35 -0
  80. data/lib/bel_parser/resource/dataset.rb +34 -0
  81. data/lib/bel_parser/resource/eager_reader.rb +75 -0
  82. data/lib/bel_parser/resource/eager_sparql_reader.rb +51 -0
  83. data/lib/bel_parser/resource/http_cache.rb +71 -0
  84. data/lib/bel_parser/resource/jena_tdb_reader.rb +246 -0
  85. data/lib/bel_parser/resource/lru_cache.rb +111 -0
  86. data/lib/bel_parser/resource/lru_reader.rb +38 -0
  87. data/lib/bel_parser/resource/reader.rb +18 -0
  88. data/lib/bel_parser/resource/resource_file_reader.rb +134 -0
  89. data/lib/bel_parser/resource/sparql_reader.rb +178 -0
  90. data/lib/bel_parser/resource/value.rb +31 -0
  91. metadata +42 -4
  92. data/lib/bel_parser/language/version1_0/syntax/function.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b28b03b903a5a3a1a62f4c36063c81292714cbd6
4
- data.tar.gz: 631a26bb0628a77abc19f4c35a028b6851939838
3
+ metadata.gz: a431be1d3646bca92e1e4df5371f3d8bf8865c3f
4
+ data.tar.gz: ca8bd4846cbfb847efff3ba22840df28e2d222d7
5
5
  SHA512:
6
- metadata.gz: cb71fff841dfba8b106cd03e5929fd7ff353796c17155b18703f481a142d2c67886c1322cca1a6d9443f278a104e0fcc57dc5205249624482ef6a47a080d3c81
7
- data.tar.gz: 2349ecf4f921f28c9b9431cd9b6f66369b46e94aa3dc27eb27c0f95f5945ce1e98eb686bd4538bf85fbc2c7c65de66292b10b82afb38d0068723bf7d68e240f6
6
+ metadata.gz: 621944ea9d667b47e61b017fdbdf05632355c25dc7d214ec5515ce872faee31ea84e2cf47147daf82c28a278be31c4116d2ce12b1ad87339fb6765621e979b12
7
+ data.tar.gz: a2102f77e4bc6419c7d28fdfea8c12005f08588c91b854b6a5b30d9987b70235af5ef0d00df8ec538af3423661e7d92e28c89304a7efee858591f272f5242f85
data/.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  'Anthony Bargnesi',
12
12
  'Nick Bargnesi',
13
13
  ]
14
- spec.date = %q{2016-04-15}
14
+ spec.date = %q{2016-04-27}
15
15
  spec.email = %q{abargnesi@selventa.com}
16
16
  spec.files = [
17
17
  Dir.glob('lib/**/*.{rb,rl}'),
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.alpha.12
1
+ 1.0.0.alpha.13
data/bin/bel2_validator CHANGED
@@ -11,17 +11,44 @@ unless ARGV.first
11
11
  end
12
12
  namespaces = Hash[ARGV[1..-1].map { |ns| ns.split('=') }]
13
13
 
14
+ def syntax_results(results)
15
+ results.select do |res|
16
+ res.is_a? BELParser::Language::Syntax::SyntaxResult
17
+ end
18
+ end
19
+
20
+ def semantics_results(results)
21
+ results.select do |res|
22
+ res.is_a? BELParser::Language::Semantics::SemanticsResult
23
+ end
24
+ end
25
+
14
26
  require 'bel_parser'
15
27
  require 'bel_parser/expression/validator'
28
+ require 'bel_parser/resource/resource_file_reader'
29
+
30
+ resource_reader = BELParser::Resource::ResourceFileReader.new
16
31
  BELParser::Expression::Validator
17
- .new(ARGV.first, namespaces)
18
- .each($stdin) do |(line_number, line, ast, messages)|
32
+ .new(ARGV.first, namespaces, resource_reader)
33
+ .each($stdin) do |(line_number, line, ast, results)|
19
34
  puts "#{line_number}: #{line}"
20
35
  puts " AST Type: #{ast.type}"
21
- puts messages
22
- .map { |r| "#{r}\n" }
23
- .join
24
- .each_line
25
- .map { |l| " #{l}" }
26
- .join
36
+
37
+ puts " Syntax results:"
38
+ syntax_results(results).each do |res|
39
+ puts " #{res}"
40
+ end
41
+
42
+ puts " Semantics results:"
43
+ semantics_results(results).each do |res|
44
+ if res.is_a?(BELParser::Language::Semantics::SignatureMappingSuccess)
45
+ puts " Matched signature: #{res.signature.string_form}"
46
+ end
47
+ if res.is_a?(BELParser::Language::Semantics::SignatureMappingWarning)
48
+ puts " Failed signature: #{res.signature.string_form}"
49
+ res.results.select(&:failure?).each do |warning|
50
+ puts " #{warning}"
51
+ end
52
+ end
53
+ end
27
54
  end
@@ -18,10 +18,10 @@ module BELParser
18
18
  :simple_statement,
19
19
  :nested_statement)
20
20
 
21
- def initialize(specification_version, namespaces)
21
+ def initialize(specification_version, namespaces, resource_reader)
22
22
  @spec = BELParser::Language.specification(specification_version)
23
23
  @validator = BELParser::Language::ExpressionValidator.new(
24
- @spec, namespaces)
24
+ @spec, namespaces, resource_reader)
25
25
  end
26
26
 
27
27
  def each(io)
@@ -52,6 +52,7 @@ if __FILE__ == $PROGRAM_NAME
52
52
  BELParser::Expression::Validator
53
53
  .new(ARGV.first, namespaces)
54
54
  .each($stdin) do |(line_number, line, ast, messages)|
55
+ results.select { |res| res.is_a? BELParser::Language::Syntax::SyntaxError }
55
56
  puts "#{line_number}: #{line}"
56
57
  puts " AST Type: #{ast.type}"
57
58
  puts messages
@@ -0,0 +1,96 @@
1
+ require 'bel_parser/quoting'
2
+
3
+ module BELParser
4
+ module Language
5
+ # ApplyNamespaceEncoding applies _namespace_ and _encoding_ properties to
6
+ # {BELParser::Parsers::AST::Parameter} child nodes.
7
+ class ApplyNamespaceEncoding
8
+ include AST::Processor::Mixin
9
+ include BELParser::Quoting
10
+
11
+ def initialize(language_spec, identifier_hash, resource_reader)
12
+ @language_spec = language_spec
13
+ @identifier_hash = identifier_hash
14
+ @resource_reader = resource_reader
15
+ end
16
+
17
+ def on_observed_term(observed_term_node)
18
+ process(observed_term_node.statement)
19
+ end
20
+
21
+ def on_simple_statement(simple_statement_node)
22
+ process(simple_statement_node.statement)
23
+ end
24
+
25
+ def on_nested_statement(nested_statement_node)
26
+ process(nested_statement_node.statement)
27
+ end
28
+
29
+ def on_statement(statement_node)
30
+ process(statement_node.subject)
31
+ process(statement_node.object) if statement_node.object?
32
+ end
33
+
34
+ def on_subject(subject_node)
35
+ process(subject_node.term)
36
+ end
37
+
38
+ def on_object(object_node)
39
+ process(object_node.child)
40
+ end
41
+
42
+ # Called when visiting nodes of type +term+.
43
+ def on_term(term_node)
44
+ term_node.arguments.each do |argument_node|
45
+ process(argument_node)
46
+ end
47
+ end
48
+
49
+ def on_argument(argument_node)
50
+ process(argument_node.child)
51
+ end
52
+
53
+ def on_parameter(parameter_node)
54
+ @resolved_dataset = nil
55
+ process(parameter_node.prefix)
56
+ process(parameter_node.value)
57
+ end
58
+
59
+ def on_prefix(prefix_node)
60
+ return prefix_node unless prefix_node.identifier
61
+ prefix = prefix_node.identifier.string_literal
62
+
63
+ identifier = @identifier_hash[prefix]
64
+ return prefix_node unless identifier
65
+
66
+ dataset = @resource_reader.retrieve_resource(identifier)
67
+ @resolved_dataset = dataset
68
+ prefix_node.namespace = dataset
69
+
70
+ prefix_node
71
+ end
72
+
73
+ def on_value(value_node)
74
+ return value_node unless @resolved_dataset
75
+ value_node.namespace = @resolved_dataset
76
+ identifier = @resolved_dataset.identifier
77
+ value_literal = unquote(value_node.children[0].string_literal)
78
+
79
+ value =
80
+ @resource_reader
81
+ .retrieve_value_from_resource(identifier, value_literal)
82
+
83
+ if value
84
+ value_node.encoding =
85
+ value
86
+ .encodings
87
+ .map(&@language_spec.method(:value_encoding))
88
+ value_node.namespace_value = value
89
+ else
90
+ value_node.encoding = nil
91
+ value_node.namespace_value = nil
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,82 @@
1
+ require_relative 'specification'
2
+
3
+ module BELParser
4
+ module Language
5
+ # BaseSpecification defines behaviour for loading BEL version files.
6
+ class BaseSpecification
7
+ include Specification
8
+
9
+ def self.load_version_path(version_path)
10
+ base_path = File.expand_path(File.dirname(__FILE__)) + File::SEPARATOR
11
+ ['return_types', 'value_encodings', 'functions', 'relationships']
12
+ .each do |set|
13
+ Dir[File.join(base_path, version_path, set, '*.rb')]
14
+ .each do |ruby_file|
15
+ ruby_file.sub!(/^#{Regexp.escape(base_path)}/, '')
16
+ require_relative ruby_file
17
+ end
18
+ end
19
+ end
20
+
21
+ protected
22
+
23
+ def load_language_constants(version_module)
24
+ load_return_types(version_module)
25
+ load_value_encodings(version_module)
26
+ load_functions(version_module)
27
+ load_relationships(version_module)
28
+ end
29
+
30
+ private
31
+
32
+ def load_return_types(version_module)
33
+ # Collect return types
34
+ ret_classes =
35
+ version_module::ReturnTypes.constants.collect do |symbol|
36
+ const = version_module::ReturnTypes.const_get(symbol)
37
+ const if const.respond_to?(:subtypes)
38
+ end
39
+ @return_types = ret_classes.compact
40
+ @indexed_return_types = index_sym(@return_types)
41
+ end
42
+
43
+ def load_value_encodings(version_module)
44
+ # Collect value encodings
45
+ enc_classes =
46
+ version_module::ValueEncodings.constants.collect do |symbol|
47
+ const = version_module::ValueEncodings.const_get(symbol)
48
+ const if const.respond_to?(:subtypes)
49
+ end
50
+ @value_encodings = enc_classes.compact
51
+ @indexed_value_encodings = index_sym(@value_encodings)
52
+ end
53
+
54
+ def load_functions(version_module)
55
+ # Collect functions
56
+ function_classes =
57
+ version_module::Functions.constants.collect do |symbol|
58
+ const = version_module::Functions.const_get(symbol)
59
+ const if
60
+ const.respond_to?(:short) &&
61
+ const.respond_to?(:long)
62
+ end
63
+ @functions = function_classes.compact
64
+ @indexed_functions = index_long_short(@functions)
65
+ end
66
+
67
+ def load_relationships(version_module)
68
+ # Collect relationships
69
+ rel_classes =
70
+ version_module::Relationships.constants.collect do |symbol|
71
+ const = version_module::Relationships.const_get(symbol)
72
+ const if
73
+ const.respond_to?(:short) &&
74
+ const.respond_to?(:long)
75
+ end
76
+ @relationships = rel_classes.compact
77
+ @indexed_relationships = index_long_short(@relationships)
78
+ assign_relationship_categories(@relationships)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,6 @@
1
1
  require_relative 'syntax'
2
2
  require_relative 'semantics'
3
+ require_relative 'apply_namespace_encoding'
3
4
 
4
5
  module BELParser
5
6
  module Language
@@ -7,11 +8,13 @@ module BELParser
7
8
  # when supplied a {BELParser::Language::Specification} and Hash of
8
9
  # namespaces.
9
10
  class ExpressionValidator
10
- def initialize(spec, namespaces)
11
+ def initialize(spec, namespaces, resource_reader)
11
12
  @spec = spec
12
13
  @namespaces = namespaces
13
14
  @syntax_functions = Syntax.syntax_functions
14
15
  @semantics_functions = Semantics.semantics_functions
16
+ @transform =
17
+ ApplyNamespaceEncoding.new(@spec, @namespaces, resource_reader)
15
18
  end
16
19
 
17
20
  # Validate the syntax and semantics of
@@ -20,6 +23,7 @@ module BELParser
20
23
  # @param [BELParser::Parsers::AST::Node] expression_node to validate
21
24
  # @return [BELParser::Language::Syntax::SyntaxResult] syntax results
22
25
  def validate(expression_node)
26
+ @transform.process(expression_node)
23
27
  results = syntax(expression_node)
24
28
  if results.empty?
25
29
  results << Syntax::Valid.new(expression_node, @spec)
@@ -38,7 +42,7 @@ module BELParser
38
42
 
39
43
  def semantics(expression_node)
40
44
  expression_node.traverse.flat_map do |node|
41
- @semantics_functions.map { |func| func.map(node, @spec, @namespaces) }
45
+ @semantics_functions.flat_map { |func| func.map(node, @spec, @namespaces) }
42
46
  end.compact
43
47
  end
44
48
  end
@@ -70,7 +70,7 @@ module BELParser
70
70
  end
71
71
 
72
72
  def ==(other)
73
- return true if self.equal?(other)
73
+ return true if equal?(other)
74
74
  return false if other.nil?
75
75
  short == other || long == other
76
76
  end
@@ -20,45 +20,41 @@ module BELParser
20
20
  def self.map(term_node, spec, _namespaces)
21
21
  return nil unless term_node.is_a?(BELParser::Parsers::AST::Term)
22
22
 
23
- successes, failures = map_signatures(term_node, spec)
23
+ function_name = term_node.function.identifier.string_literal
24
+ function = spec.function(function_name.to_sym)
25
+ mapsig = method(:map_signature).to_proc.curry[term_node][spec]
24
26
 
25
- if successes.empty?
26
- SignatureMappingWarning.new(term_node, spec, failures)
27
- else
28
- SignatureMappingSuccess.new(term_node, spec, successes, failures)
29
- end
27
+ function.signatures.map(&mapsig)
30
28
  end
31
29
 
32
- def self.map_signatures(term_node, spec)
33
- function_name = term_node.function.identifier.string_literal
34
- function = spec.function(function_name.to_sym)
35
- match = BELParser::Language::Semantics.method(:match)
36
- function
37
- .signatures
38
- .map { |sig| [sig, match.call(term_node, sig.semantic_ast, spec)] }
39
- .partition { |(_sig, results)| results.all?(&:success?) }
30
+ def self.map_signature(term_node, spec, signature)
31
+ results = BELParser::Language::Semantics.match(
32
+ term_node,
33
+ signature.semantic_ast,
34
+ spec)
35
+ if results.all?(&:success?)
36
+ SignatureMappingSuccess.new(term_node, spec, signature, results)
37
+ else
38
+ SignatureMappingWarning.new(term_node, spec, signature, results)
39
+ end
40
40
  end
41
41
  end
42
42
 
43
43
  # SignatureMappingSuccess defines a {SemanticsResult} that indicates
44
44
  # a successful signature match.
45
45
  class SignatureMappingSuccess < SemanticsResult
46
- attr_reader :success_signatures
47
- attr_reader :failure_signatures
46
+ attr_reader :signature
47
+ attr_reader :results
48
48
 
49
- def initialize(term_node, spec, successes, failures)
49
+ def initialize(term_node, spec, signature, results)
50
50
  super(term_node, spec)
51
- @success_signatures = successes
52
- @failure_signatures = failures
51
+ @signature = signature
52
+ @results = results
53
53
  end
54
54
 
55
55
  def to_s
56
- sig_list = success_signatures
57
- .map { |(sig, _results)| sig.string_form }
58
- .join("\n ")
59
56
  <<-MSG.gsub(/ {12}/, '').gsub(/\n$/, '')
60
- Term matches function signatures:
61
- #{sig_list}
57
+ Term matched function signature: #{@signature.string_form}
62
58
  MSG
63
59
  end
64
60
  end
@@ -66,20 +62,18 @@ module BELParser
66
62
  # SignatureMappingWarning defines a {SemanticsWarning} that indicates
67
63
  # an unsuccessful signature match.
68
64
  class SignatureMappingWarning < SemanticsWarning
69
- attr_reader :failure_signatures
65
+ attr_reader :signature
66
+ attr_reader :results
70
67
 
71
- def initialize(term_node, spec, failure_signatures)
68
+ def initialize(term_node, spec, signature, results)
72
69
  super(term_node, spec)
73
- @failure_signatures = failure_signatures
70
+ @signature = signature
71
+ @results = results
74
72
  end
75
73
 
76
74
  def to_s
77
- sig_list = failure_signatures
78
- .map { |(sig, _results)| sig.string_form }
79
- .join("\n ")
80
75
  <<-MSG.gsub(/ {12}/, '').gsub(/\n$/, '')
81
- Term did not conform to function signatures:
82
- #{sig_list}
76
+ Term did not match function signature: #{@signature.string_form}
83
77
  MSG
84
78
  end
85
79
  end