bel_parser 1.0.0.alpha.13 → 1.0.0.alpha.14

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/bel_parser/language/apply_namespace_encoding.rb +5 -2
  4. data/lib/bel_parser/language/expression_validator.rb +25 -7
  5. data/lib/bel_parser/language/syntax/undefined_namespace_value.rb +5 -6
  6. data/lib/bel_parser/language.rb +8 -0
  7. data/lib/bel_parser/parsers/ast/node.rb +30 -3
  8. data/lib/bel_parser/parsers/bel_script/define_annotation.rb +1732 -1288
  9. data/lib/bel_parser/parsers/bel_script/set.rb +1424 -972
  10. data/lib/bel_parser/parsers/bel_script/set_document.rb +2735 -2100
  11. data/lib/bel_parser/parsers/common/list.rb +708 -462
  12. data/lib/bel_parser/parsers/common/list.rl +6 -4
  13. data/lib/bel_parser/resource/eager_reader.rb +9 -9
  14. data/lib/bel_parser/resource/http_cache.rb +26 -8
  15. data/lib/bel_parser/resource/resource_file_reader.rb +1 -0
  16. data/lib/bel_parser/resource/sparql_reader.rb +1 -0
  17. data/lib/bel_parser/script/state/annotation_definition.rb +62 -0
  18. data/lib/bel_parser/script/state/bel_version.rb +35 -0
  19. data/lib/bel_parser/script/state/document_property.rb +29 -0
  20. data/lib/bel_parser/script/state/namespace_definition.rb +32 -0
  21. data/lib/bel_parser/script/state/set.rb +57 -0
  22. data/lib/bel_parser/script/state/unset.rb +43 -0
  23. data/lib/bel_parser/script/state_function.rb +10 -0
  24. data/lib/bel_parser/script/syntax/expression_validation.rb +46 -0
  25. data/lib/bel_parser/script/syntax/invalid_regex_pattern.rb +49 -0
  26. data/lib/bel_parser/script/syntax/undefined_annotation.rb +60 -0
  27. data/lib/bel_parser/script/syntax/undefined_annotation_value.rb +83 -0
  28. data/lib/bel_parser/script/syntax/unresolvable_namespace.rb +55 -0
  29. data/lib/bel_parser/script/syntax/unsupported_bel_version.rb +58 -0
  30. data/lib/bel_parser/script/validator.rb +153 -0
  31. metadata +15 -1
@@ -0,0 +1,55 @@
1
+ require 'bel_parser/language'
2
+ require 'bel_parser/language/syntax_function'
3
+ require 'bel_parser/language/syntax_error'
4
+ require 'bel_parser/quoting'
5
+ require 'bel_parser/parsers/ast/node'
6
+ require 'concurrent/hash'
7
+
8
+ module BELParser
9
+ module Script
10
+ module Syntax
11
+ class UnresolvableNamespace
12
+ extend BELParser::Language::Syntax::SyntaxFunction
13
+ extend BELParser::Quoting
14
+
15
+ TARGET_NODE = BELParser::Parsers::AST::NamespaceDefinition
16
+
17
+ def self.map(ast_node, script_context)
18
+ return nil unless ast_node.is_a?(TARGET_NODE)
19
+ resource_reader = script_context[:resource_reader]
20
+
21
+ keyword, domain = ast_node.children
22
+ if domain.url?
23
+ url = unquote(domain.child.string.string_literal)
24
+ puts resource_reader.retrieve_resource(url)
25
+ unless resource_reader.retrieve_resource(url)
26
+ prefix = keyword.identifier.string_literal
27
+ return UnresolvableNamespaceError.new(ast_node, prefix, url)
28
+ end
29
+ end
30
+
31
+ nil
32
+ end
33
+ end
34
+
35
+ # UnresolvableNamespaceError indicates that a namespace resource could
36
+ # not be resolved.
37
+ class UnresolvableNamespaceError < BELParser::Language::Syntax::SyntaxError
38
+ # Gets the unresolvable namespace prefix.
39
+ attr_reader :prefix
40
+ # Gets the unresolvable namespace identifier.
41
+ attr_reader :identifier
42
+
43
+ def initialize(define_namespace_node, prefix, identifier)
44
+ super(define_namespace_node, nil)
45
+ @prefix = prefix
46
+ @identifier = identifier
47
+ end
48
+
49
+ def msg
50
+ %(Could not resolve "#@prefix" with identifier "#@identifier".)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,58 @@
1
+ require 'bel_parser/language'
2
+ require 'bel_parser/language/syntax_function'
3
+ require 'bel_parser/language/syntax_error'
4
+ require 'bel_parser/quoting'
5
+ require 'bel_parser/parsers/ast/node'
6
+ require 'concurrent/hash'
7
+
8
+ module BELParser
9
+ module Script
10
+ module Syntax
11
+ class UnsupportedBELVersion
12
+ extend BELParser::Language::Syntax::SyntaxFunction
13
+ extend BELParser::Quoting
14
+
15
+ TARGET_NODE = BELParser::Parsers::AST::DocumentProperty
16
+ BEL_VERSION_REGEX = /#{Regexp.escape('bel_version')}/i
17
+
18
+ def self.map(ast_node, script_context)
19
+ return nil unless ast_node.is_a?(TARGET_NODE)
20
+ name, value = ast_node.children
21
+ name_string = name.identifier.string_literal
22
+ return nil unless name_string =~ BEL_VERSION_REGEX
23
+
24
+ value_string = unquote(value.children[0].string_literal)
25
+ begin
26
+ BELParser::Language.specification(value_string)
27
+ nil
28
+ rescue ArgumentError
29
+ latest_version = BELParser::Language.latest_supported_version
30
+ latest_spec = BELParser::Language.specification(latest_version)
31
+ script_context[:specification] = latest_spec
32
+ UnsupportedBELVersionWarning.new(ast_node, value_string)
33
+ end
34
+ end
35
+ end
36
+
37
+ # UnsupportedBELVersionError represents the use of an unsupported
38
+ # BEL version string.
39
+ class UnsupportedBELVersionWarning < BELParser::Language::Syntax::SyntaxWarning
40
+ # Gets the unsupported bel version.
41
+ attr_reader :unsupported_version
42
+
43
+ def initialize(document_property_node, unsupported_version)
44
+ super(document_property_node, nil)
45
+ @unsupported_version = unsupported_version
46
+ @latest = BELParser::Language.latest_supported_version
47
+ end
48
+
49
+ def msg
50
+ <<-MSG.gsub(/^ +/, '').delete("\n")
51
+ Unsupported BEL version "#@unsupported_version".
52
+ Setting BEL version to the latest supported version "#@latest".
53
+ MSG
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,153 @@
1
+ require 'concurrent/hash'
2
+
3
+ require_relative '../parsers/common'
4
+ require_relative '../parsers/expression'
5
+ require_relative '../parsers/bel_script'
6
+
7
+ require_relative '../ast_filter'
8
+ require_relative '../ast_generator'
9
+
10
+ require_relative 'state_function'
11
+ require_relative '../language/syntax_function'
12
+
13
+ module BELParser
14
+ module Script
15
+ class Validator
16
+ include BELParser::Parsers::Common
17
+ include BELParser::Parsers::Expression
18
+ include BELParser::Parsers::BELScript
19
+
20
+ FILTER = BELParser::ASTFilter.new(
21
+ :simple_statement,
22
+ :observed_term,
23
+ :nested_statement,
24
+ :annotation_definition,
25
+ :namespace_definition,
26
+ :set,
27
+ :document_property,
28
+ :unset,
29
+ :blank_line,
30
+ :comment_line
31
+ )
32
+
33
+ def initialize(options = {})
34
+ @script_context = Concurrent::Hash.new.merge(options)
35
+
36
+ Validator.require_script_path
37
+ @state_functions = Validator.state_constants(State)
38
+ @syntax_functions = Validator.syntax_constants(Syntax)
39
+ end
40
+
41
+ def each(io)
42
+ if block_given?
43
+ filtered_ast = FILTER.each(BELParser::ASTGenerator.new.each(io))
44
+ filtered_ast.each do |results|
45
+ line_number, line, ast_results = results
46
+ ast_node = ast_results.first
47
+
48
+ syntax_results =
49
+ ast_node.traverse.flat_map do |node|
50
+ @syntax_functions.flat_map do |func|
51
+ func.map(node, @script_context)
52
+ end
53
+ end.compact
54
+
55
+ if syntax_results.empty?
56
+ ast_node.traverse.each do |node|
57
+ @state_functions.each do |func|
58
+ func.consume(node, @script_context)
59
+ end
60
+ end
61
+ end
62
+
63
+ yield [line_number, line, ast_node, syntax_results, @script_context]
64
+ end
65
+ else
66
+ enum_for(:each, io)
67
+ end
68
+ end
69
+
70
+ def self.require_script_path
71
+ base_path = File.expand_path(File.dirname(__FILE__)) + File::SEPARATOR
72
+ ['state', 'syntax'].each do |set|
73
+ Dir[File.join(base_path, set, '*.rb')]
74
+ .each do |ruby_file|
75
+ ruby_file.sub!(/^#{Regexp.escape(base_path)}/, '')
76
+ require_relative ruby_file
77
+ end
78
+ end
79
+ end
80
+
81
+ def self.state_constants(mod)
82
+ mod.constants.collect do |symbol|
83
+ const = mod.const_get(symbol)
84
+ const if const.respond_to?(:consume)
85
+ end.compact
86
+ end
87
+
88
+ def self.syntax_constants(mod)
89
+ mod.constants.collect do |symbol|
90
+ const = mod.const_get(symbol)
91
+ const if const.respond_to?(:map)
92
+ end.compact
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ if __FILE__ == $PROGRAM_NAME
99
+ $LOAD_PATH.unshift(
100
+ File.join(File.expand_path(File.dirname(__FILE__)), '..', '..'))
101
+ require 'bel_parser/language'
102
+ require 'bel_parser/resource/resource_file_reader'
103
+ initial_state = {
104
+ resource_reader: BELParser::Resource::ResourceFileReader.new,
105
+ specification: BELParser::Language.specification(
106
+ BELParser::Language.latest_supported_version
107
+ )
108
+ }
109
+
110
+ BELParser::Script::Validator
111
+ .new(initial_state)
112
+ .each($stdin) do |(line_number, line, ast, syntax_results, state)|
113
+ puts "#{line_number}: #{line}"
114
+ puts ast.to_s(1)
115
+
116
+ puts "Syntax errors:"
117
+ syntax_results
118
+ .select do |res|
119
+ res.is_a?(BELParser::Language::Syntax::SyntaxError)
120
+ end
121
+ .each do |res|
122
+ puts " #{res}"
123
+ end
124
+
125
+ puts "Syntax warnings:"
126
+ syntax_results
127
+ .select do |res|
128
+ res.is_a?(BELParser::Language::Syntax::SyntaxWarning)
129
+ end
130
+ .each do |res|
131
+ puts " #{res}"
132
+ end
133
+
134
+ puts "Semantics warnings:"
135
+ syntax_results
136
+ .select do |res|
137
+ res.is_a?(BELParser::Language::Semantics::SemanticsWarning)
138
+ end
139
+ .each do |res|
140
+ puts " #{res}"
141
+ end
142
+
143
+ puts "State:"
144
+ state.each do |key, value|
145
+ case value
146
+ when Hash
147
+ puts " #{key}: #{value.keys}"
148
+ else
149
+ puts " #{key}: #{value}"
150
+ end
151
+ end
152
+ end
153
+ 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.13
4
+ version: 1.0.0.alpha.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Bargnesi
@@ -311,6 +311,20 @@ files:
311
311
  - lib/bel_parser/resource/sparql_reader.rb
312
312
  - lib/bel_parser/resource/value.rb
313
313
  - lib/bel_parser/script/parser.rb
314
+ - lib/bel_parser/script/state/annotation_definition.rb
315
+ - lib/bel_parser/script/state/bel_version.rb
316
+ - lib/bel_parser/script/state/document_property.rb
317
+ - lib/bel_parser/script/state/namespace_definition.rb
318
+ - lib/bel_parser/script/state/set.rb
319
+ - lib/bel_parser/script/state/unset.rb
320
+ - lib/bel_parser/script/state_function.rb
321
+ - lib/bel_parser/script/syntax/expression_validation.rb
322
+ - lib/bel_parser/script/syntax/invalid_regex_pattern.rb
323
+ - lib/bel_parser/script/syntax/undefined_annotation.rb
324
+ - lib/bel_parser/script/syntax/undefined_annotation_value.rb
325
+ - lib/bel_parser/script/syntax/unresolvable_namespace.rb
326
+ - lib/bel_parser/script/syntax/unsupported_bel_version.rb
327
+ - lib/bel_parser/script/validator.rb
314
328
  - lib/bel_parser/vendor/ast.rb
315
329
  - lib/bel_parser/vendor/ast/node.rb
316
330
  - lib/bel_parser/vendor/ast/processor.rb