Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 3 additions & 15 deletions lib/arpaka/ruby_grammar.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ def self.load_upstream(ruby_source)
actual = Digest::SHA256.file(File.join(vendor, path)).hexdigest
next if actual == digest

raise ::Arpaka::Error, "Unsupported Ruby source change: #{path}; " \
"expected SHA256 #{digest}, got #{actual}. " \
"Update the Action mappings and source profile before regenerating."
warn "Arpaka: Ruby source differs from the recorded profile: #{path}; " \
"expected SHA256 #{digest}, got #{actual}."
end
source, error, result = Open3.capture3(RbConfig.ruby,
File.join(vendor, "tool/id2token.rb"), File.join(vendor, "parse.y"))
Expand All @@ -48,19 +47,8 @@ def self.load_upstream(ruby_source)
"midrule_position" => rule.position_in_original_rule_rhs,
"precedence" => rule.precedence_sym&.id&.s_value }
end
expected = JSON.parse(File.read(File.join(__dir__, "upstream_rules.json")))
unless inventory == expected
changed = (0...[inventory.length, expected.length].max).select { |i| inventory[i] != expected[i] }
details = changed.first(5).map do |i|
before, after = expected[i], inventory[i]
"rule #{before&.fetch('id') || after.fetch('id')}: " \
"#{before&.fetch('lhs') || '(absent)'} -> #{after&.fetch('lhs') || '(absent)'}"
end
raise ::Arpaka::Error, "Upstream rules changed (#{changed.length} entries); " \
"review Action mappings: #{details.join('; ')}"
end
unknown = ::Arpaka::RubyGrammarActions::ACTIONS.keys - inventory.map { |rule| rule.fetch("id") }
raise ::Arpaka::Error, "Unknown action IDs: #{unknown.inspect}" unless unknown.empty?
warn "Arpaka: Unknown action IDs: #{unknown.inspect}" unless unknown.empty?
[grammar, inventory]
end

Expand Down
2 changes: 1 addition & 1 deletion lib/lrama/ruby/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

module Lrama
module Ruby
VERSION = "0.1.0"
VERSION = "0.1.1"
end
end
6 changes: 2 additions & 4 deletions test/lrama/frontend_generator_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,11 @@ def generated_source
end
end

test "changed upstream input is rejected before actions are applied" do
test "changed upstream input is accepted when actions still match" do
Dir.mktmpdir do |directory|
FileUtils.cp_r(File.join(RUBY_SOURCE, "."), directory)
File.open(File.join(directory, "parse.y"), "a") { |file| file.puts("/* changed */") }
error = assert_raise(Arpaka::Error) { Arpaka.generate(ruby_source: directory) }
assert_include(error.message, "Unsupported Ruby source change: parse.y")
assert_include(error.message, "SHA256")
assert_nothing_raised { Arpaka.generate(ruby_source: directory) }
end
end

Expand Down