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

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.
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