tataru 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/tataru.rb +70 -12
- data/lib/tataru/base_resource.rb +49 -0
- data/lib/tataru/base_resource_desc.rb +35 -0
- data/lib/tataru/compiler.rb +100 -0
- data/lib/tataru/create_subroutines.rb +31 -0
- data/lib/tataru/delete_subroutines.rb +42 -0
- data/lib/tataru/flattener.rb +81 -0
- data/lib/tataru/init_hash_compiler.rb +41 -0
- data/lib/tataru/instruction.rb +52 -7
- data/lib/tataru/instruction_hash.rb +54 -0
- data/lib/tataru/instructions/call_instruction.rb +19 -0
- data/lib/tataru/instructions/check_create_instruction.rb +27 -0
- data/lib/tataru/instructions/check_delete_instruction.rb +20 -0
- data/lib/tataru/instructions/check_instruction.rb +26 -0
- data/lib/tataru/instructions/check_update_instruction.rb +27 -0
- data/lib/tataru/instructions/clear_instruction.rb +12 -0
- data/lib/tataru/instructions/compare_instruction.rb +16 -0
- data/lib/tataru/instructions/create_instruction.rb +20 -0
- data/lib/tataru/instructions/delete_instruction.rb +14 -0
- data/lib/tataru/instructions/end_instruction.rb +12 -0
- data/lib/tataru/instructions/goto_if_instruction.rb +26 -0
- data/lib/tataru/instructions/immediate_mode_instruction.rb +12 -0
- data/lib/tataru/instructions/init_instruction.rb +27 -0
- data/lib/tataru/instructions/key_instruction.rb +12 -0
- data/lib/tataru/instructions/mark_deletable_instruction.rb +13 -0
- data/lib/tataru/instructions/read_instruction.rb +28 -0
- data/lib/tataru/instructions/rescmp_instruction.rb +34 -0
- data/lib/tataru/instructions/resource_instruction.rb +15 -0
- data/lib/tataru/instructions/return_instruction.rb +16 -0
- data/lib/tataru/instructions/update_instruction.rb +16 -0
- data/lib/tataru/instructions/value_instruction.rb +15 -0
- data/lib/tataru/instructions/value_rom_instruction.rb +23 -0
- data/lib/tataru/instructions/value_update_instruction.rb +18 -0
- data/lib/tataru/memory.rb +16 -0
- data/lib/tataru/quest.rb +43 -0
- data/lib/tataru/representation.rb +22 -0
- data/lib/tataru/representations/array_representation.rb +18 -0
- data/lib/tataru/representations/hash_representation.rb +20 -0
- data/lib/tataru/representations/literal_representation.rb +9 -0
- data/lib/tataru/representations/output_representation.rb +19 -0
- data/lib/tataru/representations/resource_representation.rb +49 -0
- data/lib/tataru/resolver.rb +39 -0
- data/lib/tataru/resource_dsl.rb +21 -71
- data/lib/tataru/resource_type_pool.rb +22 -0
- data/lib/tataru/rom_reader.rb +47 -0
- data/lib/tataru/runner.rb +48 -0
- data/lib/tataru/sub_planner.rb +41 -0
- data/lib/tataru/subroutine_compiler.rb +52 -0
- data/lib/tataru/top_dsl.rb +35 -0
- data/lib/tataru/update_subroutines.rb +111 -0
- data/lib/tataru/version.rb +1 -1
- data/spec/compiler_spec.rb +181 -0
- data/spec/flattener_spec.rb +88 -0
- data/spec/init_hash_compiler_spec.rb +85 -0
- data/spec/instruction_hash_spec.rb +63 -0
- data/spec/instruction_spec.rb +36 -0
- data/spec/instructions/call_instruction_spec.rb +28 -0
- data/spec/instructions/check_create_instruction_spec.rb +67 -0
- data/spec/instructions/check_delete_instruction_spec.rb +47 -0
- data/spec/instructions/check_update_instruction_spec.rb +67 -0
- data/spec/instructions/clear_instruction_spec.rb +16 -0
- data/spec/instructions/compare_instruction_spec.rb +29 -0
- data/spec/instructions/create_instruction_spec.rb +62 -0
- data/spec/instructions/delete_instruction_spec.rb +20 -0
- data/spec/instructions/end_instruction_spec.rb +15 -0
- data/spec/instructions/goto_if_instruction_spec.rb +42 -0
- data/spec/instructions/init_instruction_spec.rb +16 -0
- data/spec/instructions/key_instruction_spec.rb +15 -0
- data/spec/instructions/mark_deletable_instruction_spec.rb +20 -0
- data/spec/instructions/read_instruction_spec.rb +34 -0
- data/spec/instructions/rescmp_instruction_spec.rb +113 -0
- data/spec/instructions/return_instruction_spec.rb +28 -0
- data/spec/instructions/update_instruction_spec.rb +39 -0
- data/spec/instructions/value_instruction_spec.rb +27 -0
- data/spec/instructions/value_rom_instruction_spec.rb +170 -0
- data/spec/instructions/value_update_instruction_spec.rb +35 -0
- data/spec/quest_spec.rb +9 -0
- data/spec/representations/array_representation_spec.rb +29 -0
- data/spec/representations/hash_representation_spec.rb +29 -0
- data/spec/representations/literal_representation_spec.rb +10 -0
- data/spec/representations/output_representation_spec.rb +11 -0
- data/spec/representations/resource_representation_spec.rb +50 -0
- data/spec/resource_dsl_spec.rb +71 -0
- data/spec/runner_spec.rb +99 -0
- data/spec/spec_helper.rb +401 -0
- data/spec/subroutine_compiler_spec.rb +39 -0
- data/spec/taru_spec.rb +616 -0
- data/spec/top_dsl_spec.rb +68 -0
- data/tataru.gemspec +45 -0
- metadata +145 -27
- data/Rakefile +0 -8
- data/lib/tataru/default_resource_finder.rb +0 -10
- data/lib/tataru/execution_step.rb +0 -79
- data/lib/tataru/planner.rb +0 -93
- data/lib/tataru/requirements.rb +0 -67
- data/lib/tataru/requirements_dsl.rb +0 -33
- data/lib/tataru/resource.rb +0 -52
- data/lib/tataru/state.rb +0 -64
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
# compiles the inithash
|
5
|
+
class InitHashCompiler
|
6
|
+
def initialize(dsl)
|
7
|
+
@dsl = dsl
|
8
|
+
end
|
9
|
+
|
10
|
+
def resolved_references(resource_name, references)
|
11
|
+
references.map do |field, refname|
|
12
|
+
[field, refname.to_s.sub(/^top/, resource_name)]
|
13
|
+
end.to_h
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_init_hash
|
17
|
+
rom = {}
|
18
|
+
@dsl.resources.each do |k, v|
|
19
|
+
# Expand all the values used to a big flat hash that
|
20
|
+
# is only one level deep for ease of use, then mark
|
21
|
+
# them for the vm to use
|
22
|
+
flattener = Flattener.new(v)
|
23
|
+
flattener.flattened.each do |key, value|
|
24
|
+
fixed = value.dup
|
25
|
+
if fixed[:references]
|
26
|
+
fixed[:references] = resolved_references(k, fixed[:references])
|
27
|
+
end
|
28
|
+
rom[key.to_s.sub(/^top/, k)] = fixed
|
29
|
+
end
|
30
|
+
end
|
31
|
+
{
|
32
|
+
rom: rom,
|
33
|
+
remote_ids: {}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def result
|
38
|
+
@result ||= generate_init_hash
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/tataru/instruction.rb
CHANGED
@@ -1,15 +1,60 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Tataru
|
4
|
-
#
|
4
|
+
# a thing to do
|
5
5
|
class Instruction
|
6
|
-
|
6
|
+
class << self
|
7
|
+
attr_accessor :expected_params
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
def expects(symbol)
|
10
|
+
@expected_params ||= []
|
11
|
+
@expected_params << symbol
|
12
|
+
|
13
|
+
define_method symbol do
|
14
|
+
return nil if @memory&.hash.nil?
|
15
|
+
|
16
|
+
memory.hash[:temp][symbol]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_accessor :memory
|
22
|
+
|
23
|
+
def execute(memory)
|
24
|
+
@memory = memory
|
25
|
+
self.class.expected_params&.each do |symbol|
|
26
|
+
unless memory.hash[:temp].key? symbol
|
27
|
+
raise "required param #{symbol} not found"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
run
|
13
32
|
end
|
33
|
+
|
34
|
+
def run; end
|
14
35
|
end
|
15
36
|
end
|
37
|
+
|
38
|
+
require 'tataru/instructions/immediate_mode_instruction'
|
39
|
+
require 'tataru/instructions/resource_instruction'
|
40
|
+
require 'tataru/instructions/check_instruction'
|
41
|
+
require 'tataru/instructions/check_delete_instruction'
|
42
|
+
require 'tataru/instructions/mark_deletable_instruction'
|
43
|
+
require 'tataru/instructions/clear_instruction'
|
44
|
+
require 'tataru/instructions/goto_if_instruction'
|
45
|
+
require 'tataru/instructions/key_instruction'
|
46
|
+
require 'tataru/instructions/value_rom_instruction'
|
47
|
+
require 'tataru/instructions/value_update_instruction'
|
48
|
+
require 'tataru/instructions/compare_instruction'
|
49
|
+
require 'tataru/instructions/delete_instruction'
|
50
|
+
require 'tataru/instructions/update_instruction'
|
51
|
+
require 'tataru/instructions/create_instruction'
|
52
|
+
require 'tataru/instructions/end_instruction'
|
53
|
+
require 'tataru/instructions/check_create_instruction'
|
54
|
+
require 'tataru/instructions/read_instruction'
|
55
|
+
require 'tataru/instructions/check_update_instruction'
|
56
|
+
require 'tataru/instructions/rescmp_instruction'
|
57
|
+
require 'tataru/instructions/call_instruction'
|
58
|
+
require 'tataru/instructions/value_instruction'
|
59
|
+
require 'tataru/instructions/return_instruction'
|
60
|
+
require 'tataru/instructions/init_instruction'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
# representation of a set of instructions
|
5
|
+
class InstructionHash
|
6
|
+
def initialize(thehash)
|
7
|
+
@thehash = thehash
|
8
|
+
end
|
9
|
+
|
10
|
+
def instruction_list
|
11
|
+
@instruction_list ||= instructions
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
@thehash
|
16
|
+
end
|
17
|
+
|
18
|
+
def instructions
|
19
|
+
return [] unless @thehash[:instructions]
|
20
|
+
|
21
|
+
@thehash[:instructions].map do |action|
|
22
|
+
if action == :init
|
23
|
+
init_instruction
|
24
|
+
elsif action.is_a? Hash
|
25
|
+
# immediate mode instruction
|
26
|
+
instruction_for(action.keys[0]).new(action.values[0])
|
27
|
+
else
|
28
|
+
instruction_for(action).new
|
29
|
+
end
|
30
|
+
end.to_a
|
31
|
+
end
|
32
|
+
|
33
|
+
def instruction_for(action)
|
34
|
+
instr_const = "#{action}_instruction".camelize
|
35
|
+
unless Tataru::Instructions.const_defined? instr_const
|
36
|
+
raise "Unknown instruction '#{action}'"
|
37
|
+
end
|
38
|
+
|
39
|
+
Tataru::Instructions.const_get(instr_const)
|
40
|
+
end
|
41
|
+
|
42
|
+
def init_instruction
|
43
|
+
init = Tataru::Instructions::InitInstruction.new
|
44
|
+
|
45
|
+
inithash = @thehash[:init]
|
46
|
+
if inithash
|
47
|
+
%i[remote_ids outputs deleted rom labels].each do |member|
|
48
|
+
init.send(:"#{member}=", inithash[member]) if inithash.key? member
|
49
|
+
end
|
50
|
+
end
|
51
|
+
init
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# pushes the callstack and branches
|
6
|
+
class CallInstruction < ImmediateModeInstruction
|
7
|
+
def run
|
8
|
+
labels = memory.hash[:labels]
|
9
|
+
unless labels.key? @param
|
10
|
+
memory.error = 'Label not found'
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
memory.call_stack.push(memory.program_counter)
|
15
|
+
memory.program_counter = labels[@param] - 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# instruction to check create
|
6
|
+
class CheckCreateInstruction < CheckInstruction
|
7
|
+
def initialize
|
8
|
+
super :create
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_complete
|
12
|
+
memory.hash[:outputs][resource_name] = outputs
|
13
|
+
end
|
14
|
+
|
15
|
+
def outputs
|
16
|
+
return {} unless desc.output_fields.count
|
17
|
+
|
18
|
+
resource_class = desc.resource_class
|
19
|
+
resource = resource_class.new(memory.hash[:remote_ids][resource_name])
|
20
|
+
o = resource.outputs
|
21
|
+
raise "Output for '#{resource_name}' is not a hash" unless o.is_a? Hash
|
22
|
+
|
23
|
+
resource.outputs
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# check that delete is completed
|
6
|
+
class CheckDeleteInstruction < CheckInstruction
|
7
|
+
def initialize
|
8
|
+
super :delete
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_complete
|
12
|
+
memory.hash[:deleted] << resource_name
|
13
|
+
|
14
|
+
return unless desc.needs_remote_id?
|
15
|
+
|
16
|
+
memory.hash[:remote_ids].delete(resource_name)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# General checking class
|
6
|
+
class CheckInstruction < ResourceInstruction
|
7
|
+
def initialize(check_type)
|
8
|
+
@check_type = check_type
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
resource_class = desc.resource_class
|
13
|
+
resource = resource_class.new(memory.hash[:remote_ids][resource_name])
|
14
|
+
|
15
|
+
if resource.send(:"#{@check_type}_complete?")
|
16
|
+
after_complete
|
17
|
+
else
|
18
|
+
# repeat this instruction until its done
|
19
|
+
memory.program_counter -= 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def after_complete(_memory); end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# check that update is completed
|
6
|
+
class CheckUpdateInstruction < CheckInstruction
|
7
|
+
def initialize
|
8
|
+
super :update
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_complete
|
12
|
+
memory.hash[:outputs][resource_name] = outputs
|
13
|
+
end
|
14
|
+
|
15
|
+
def outputs
|
16
|
+
return {} unless desc.output_fields.count
|
17
|
+
|
18
|
+
resource_class = desc.resource_class
|
19
|
+
resource = resource_class.new(memory.hash[:remote_ids][resource_name])
|
20
|
+
o = resource.outputs
|
21
|
+
raise "Output for '#{resource_name}' is not a hash" unless o.is_a? Hash
|
22
|
+
|
23
|
+
resource.outputs
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# compares whats in temp result to param
|
6
|
+
class CompareInstruction < ImmediateModeInstruction
|
7
|
+
def run
|
8
|
+
memory.hash[:temp][:result] = if memory.hash[:temp][:result] == @param
|
9
|
+
1
|
10
|
+
else
|
11
|
+
0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# instruction to create
|
6
|
+
class CreateInstruction < ResourceInstruction
|
7
|
+
expects :properties
|
8
|
+
|
9
|
+
def run
|
10
|
+
resource_class = desc.resource_class
|
11
|
+
resource = resource_class.new(nil)
|
12
|
+
resource.create(properties)
|
13
|
+
|
14
|
+
return unless desc.needs_remote_id?
|
15
|
+
|
16
|
+
memory.hash[:remote_ids][resource_name] = resource.remote_id
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# instruction to delete
|
6
|
+
class DeleteInstruction < ResourceInstruction
|
7
|
+
def run
|
8
|
+
resource_class = desc.resource_class
|
9
|
+
resource = resource_class.new(memory.hash[:remote_ids][resource_name])
|
10
|
+
resource.delete
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# goto if temp result is non zero
|
6
|
+
class GotoIfInstruction < ImmediateModeInstruction
|
7
|
+
def run
|
8
|
+
return if memory.hash[:temp][:result].zero?
|
9
|
+
|
10
|
+
memory.program_counter = if @param.is_a? Integer
|
11
|
+
@param - 1
|
12
|
+
else
|
13
|
+
label_branch!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def label_branch!
|
18
|
+
unless memory.hash[:labels]&.key?(@param)
|
19
|
+
raise "Label '#{@param}' not found"
|
20
|
+
end
|
21
|
+
|
22
|
+
memory.hash[:labels][@param] - 1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tataru
|
4
|
+
module Instructions
|
5
|
+
# instruction to initialize the memory
|
6
|
+
class InitInstruction < Instruction
|
7
|
+
attr_accessor :remote_ids, :outputs, :rom, :labels, :deleted
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@remote_ids = {}
|
11
|
+
@outputs = {}
|
12
|
+
@rom = {}
|
13
|
+
@labels = {}
|
14
|
+
@deleted = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
memory.hash[:remote_ids] = @remote_ids
|
19
|
+
memory.hash[:outputs] = @outputs
|
20
|
+
memory.hash[:labels] = @labels
|
21
|
+
memory.hash[:rom] = @rom.freeze
|
22
|
+
memory.hash[:deleted] = @deleted
|
23
|
+
memory.hash[:update_action] = {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|