Factor some stuff down in corpus.rb / checker.rb

pull/303/head
Rick Carlino 2016-12-20 12:37:36 -06:00
parent 4e359ab0ab
commit b0ca9f1a69
4 changed files with 65 additions and 11 deletions

View File

@ -16,8 +16,7 @@ module CeleryScript
end
def run!
cb = method(:validate)
CeleryScript::TreeClimber.travel(tree, cb.to_proc)
CeleryScript::TreeClimber.travel(tree, method(:validate).to_proc)
tree
end
@ -45,10 +44,8 @@ module CeleryScript
def validate_body(node)
(node.body || []).each_with_index do |inner_node, i|
allowed = corpus.fetchNode(node.kind).allowed_body_types
body_ok = Array(allowed)
.map(&:to_sym)
.include?(inner_node.kind.to_sym)
allowed = corpus.bodies(node)
body_ok = allowed.include?(inner_node.kind.to_sym)
bad_body_kind(node, inner_node, i, allowed) unless body_ok
end
end
@ -56,8 +53,7 @@ module CeleryScript
def validate_node(node)
check_arity(node)
node.args.map do |array|
should_be = array.first
node = array.last
should_be, node = array
check_arg_validity(should_be, node)
end
end
@ -76,7 +72,7 @@ module CeleryScript
end
end
has = node.args.keys.map(&:to_sym) # Either bigger or equal.
required = corpus.fetchNode(node.kind).allowed_args # Always smallest.
required = corpus.args(node) # Always smallest.
if !(has.length === required.length)
extras = has - required
raise TypeCheckError, (EXTRA_ARGS % [node.kind, extras, allowed])
@ -90,7 +86,6 @@ module CeleryScript
allowed = corpus
.fetchArg(node.kind)
.allowed_values
.select { |d| d.is_a?(Class) }
actual = node.value.class
unless allowed.include?(actual)
raise TypeCheckError, (BAD_LEAF % [node.kind, node.parent.kind,

View File

@ -30,6 +30,21 @@ module CeleryScript
self
end
# List of allowed arg types for a node.
def args(node)
fetchNode(node.kind).allowed_args
end
# List of allowed values for a node
def values(node)
fetchArg(node.kind).allowed_values
end
# List of allowed body node types within a node
def bodies(node)
Array(fetchNode(node.kind).allowed_body_types).map(&:to_sym)
end
def as_json(optns)
{ "tag": SequenceMigration::Base.latest_version,
"args": @arg_def_list.to_a.map(&:last).map{|x| x.as_json({}) },

View File

@ -67,7 +67,7 @@ module CeleryScriptSettingsBag
.defineArg(:rhs, [Fixnum])
.defineArg(:data_label, [String])
.defineArg(:message, [String])
.defineArg(:location, [String])
.defineArg(:location, [:tool, :coordinate])
.defineNode(:tool, [:tool_id])
.defineNode(:coordinate, [:x, :y, :z])
.defineNode(:move_absolute, [:location, :speed])

View File

@ -3,6 +3,50 @@ require 'spec_helper'
describe CeleryScript::Corpus do
let (:corpus) { Sequence::Corpus }
it "handles valid move_absolute blocks" do
ok1 = CeleryScript::AstNode.new({
kind: "move_absolute",
args: {
location: {
kind: "coordinate",
args: {
x: 1,
y: 2,
z: 3
}
},
speed: 100
}
})
check1 = CeleryScript::Checker.new(ok1, Sequence::Corpus)
expect(check1.valid?).to be_truthy
ok2 = CeleryScript::AstNode.new({
kind: "move_absolute",
args: {
location: {
kind: "tool",
args: { tool_id: FactoryGirl.create(:tool).id }
},
speed: 100
}
})
check2 = CeleryScript::Checker.new(ok2, Sequence::Corpus)
expect(check2.valid?).to be_truthy
end
it "kicks back invalid move_absolute nodes" do
bad = CeleryScript::AstNode.new({
kind: "move_absolute",
args: {
location: 42,
speed: 100
}
})
check = CeleryScript::Checker.new(bad, Sequence::Corpus)
expect(check.valid?).to be_falsey
end
it "serializes into JSON" do
result = JSON.parse(corpus.to_json)