Factor some stuff down in corpus.rb / checker.rb
parent
4e359ab0ab
commit
b0ca9f1a69
|
@ -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,
|
||||
|
|
|
@ -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({}) },
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue