tataru 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/bin/console +15 -0
  4. data/bin/setup +8 -0
  5. data/lib/tataru.rb +70 -12
  6. data/lib/tataru/base_resource.rb +49 -0
  7. data/lib/tataru/base_resource_desc.rb +35 -0
  8. data/lib/tataru/compiler.rb +100 -0
  9. data/lib/tataru/create_subroutines.rb +31 -0
  10. data/lib/tataru/delete_subroutines.rb +42 -0
  11. data/lib/tataru/flattener.rb +81 -0
  12. data/lib/tataru/init_hash_compiler.rb +41 -0
  13. data/lib/tataru/instruction.rb +52 -7
  14. data/lib/tataru/instruction_hash.rb +54 -0
  15. data/lib/tataru/instructions/call_instruction.rb +19 -0
  16. data/lib/tataru/instructions/check_create_instruction.rb +27 -0
  17. data/lib/tataru/instructions/check_delete_instruction.rb +20 -0
  18. data/lib/tataru/instructions/check_instruction.rb +26 -0
  19. data/lib/tataru/instructions/check_update_instruction.rb +27 -0
  20. data/lib/tataru/instructions/clear_instruction.rb +12 -0
  21. data/lib/tataru/instructions/compare_instruction.rb +16 -0
  22. data/lib/tataru/instructions/create_instruction.rb +20 -0
  23. data/lib/tataru/instructions/delete_instruction.rb +14 -0
  24. data/lib/tataru/instructions/end_instruction.rb +12 -0
  25. data/lib/tataru/instructions/goto_if_instruction.rb +26 -0
  26. data/lib/tataru/instructions/immediate_mode_instruction.rb +12 -0
  27. data/lib/tataru/instructions/init_instruction.rb +27 -0
  28. data/lib/tataru/instructions/key_instruction.rb +12 -0
  29. data/lib/tataru/instructions/mark_deletable_instruction.rb +13 -0
  30. data/lib/tataru/instructions/read_instruction.rb +28 -0
  31. data/lib/tataru/instructions/rescmp_instruction.rb +34 -0
  32. data/lib/tataru/instructions/resource_instruction.rb +15 -0
  33. data/lib/tataru/instructions/return_instruction.rb +16 -0
  34. data/lib/tataru/instructions/update_instruction.rb +16 -0
  35. data/lib/tataru/instructions/value_instruction.rb +15 -0
  36. data/lib/tataru/instructions/value_rom_instruction.rb +23 -0
  37. data/lib/tataru/instructions/value_update_instruction.rb +18 -0
  38. data/lib/tataru/memory.rb +16 -0
  39. data/lib/tataru/quest.rb +43 -0
  40. data/lib/tataru/representation.rb +22 -0
  41. data/lib/tataru/representations/array_representation.rb +18 -0
  42. data/lib/tataru/representations/hash_representation.rb +20 -0
  43. data/lib/tataru/representations/literal_representation.rb +9 -0
  44. data/lib/tataru/representations/output_representation.rb +19 -0
  45. data/lib/tataru/representations/resource_representation.rb +49 -0
  46. data/lib/tataru/resolver.rb +39 -0
  47. data/lib/tataru/resource_dsl.rb +21 -71
  48. data/lib/tataru/resource_type_pool.rb +22 -0
  49. data/lib/tataru/rom_reader.rb +47 -0
  50. data/lib/tataru/runner.rb +48 -0
  51. data/lib/tataru/sub_planner.rb +41 -0
  52. data/lib/tataru/subroutine_compiler.rb +52 -0
  53. data/lib/tataru/top_dsl.rb +35 -0
  54. data/lib/tataru/update_subroutines.rb +111 -0
  55. data/lib/tataru/version.rb +1 -1
  56. data/spec/compiler_spec.rb +181 -0
  57. data/spec/flattener_spec.rb +88 -0
  58. data/spec/init_hash_compiler_spec.rb +85 -0
  59. data/spec/instruction_hash_spec.rb +63 -0
  60. data/spec/instruction_spec.rb +36 -0
  61. data/spec/instructions/call_instruction_spec.rb +28 -0
  62. data/spec/instructions/check_create_instruction_spec.rb +67 -0
  63. data/spec/instructions/check_delete_instruction_spec.rb +47 -0
  64. data/spec/instructions/check_update_instruction_spec.rb +67 -0
  65. data/spec/instructions/clear_instruction_spec.rb +16 -0
  66. data/spec/instructions/compare_instruction_spec.rb +29 -0
  67. data/spec/instructions/create_instruction_spec.rb +62 -0
  68. data/spec/instructions/delete_instruction_spec.rb +20 -0
  69. data/spec/instructions/end_instruction_spec.rb +15 -0
  70. data/spec/instructions/goto_if_instruction_spec.rb +42 -0
  71. data/spec/instructions/init_instruction_spec.rb +16 -0
  72. data/spec/instructions/key_instruction_spec.rb +15 -0
  73. data/spec/instructions/mark_deletable_instruction_spec.rb +20 -0
  74. data/spec/instructions/read_instruction_spec.rb +34 -0
  75. data/spec/instructions/rescmp_instruction_spec.rb +113 -0
  76. data/spec/instructions/return_instruction_spec.rb +28 -0
  77. data/spec/instructions/update_instruction_spec.rb +39 -0
  78. data/spec/instructions/value_instruction_spec.rb +27 -0
  79. data/spec/instructions/value_rom_instruction_spec.rb +170 -0
  80. data/spec/instructions/value_update_instruction_spec.rb +35 -0
  81. data/spec/quest_spec.rb +9 -0
  82. data/spec/representations/array_representation_spec.rb +29 -0
  83. data/spec/representations/hash_representation_spec.rb +29 -0
  84. data/spec/representations/literal_representation_spec.rb +10 -0
  85. data/spec/representations/output_representation_spec.rb +11 -0
  86. data/spec/representations/resource_representation_spec.rb +50 -0
  87. data/spec/resource_dsl_spec.rb +71 -0
  88. data/spec/runner_spec.rb +99 -0
  89. data/spec/spec_helper.rb +401 -0
  90. data/spec/subroutine_compiler_spec.rb +39 -0
  91. data/spec/taru_spec.rb +616 -0
  92. data/spec/top_dsl_spec.rb +68 -0
  93. data/tataru.gemspec +45 -0
  94. metadata +145 -27
  95. data/Rakefile +0 -8
  96. data/lib/tataru/default_resource_finder.rb +0 -10
  97. data/lib/tataru/execution_step.rb +0 -79
  98. data/lib/tataru/planner.rb +0 -93
  99. data/lib/tataru/requirements.rb +0 -67
  100. data/lib/tataru/requirements_dsl.rb +0 -33
  101. data/lib/tataru/resource.rb +0 -52
  102. data/lib/tataru/state.rb +0 -64
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Instructions::ValueInstruction do
6
+ it 'set a value' do
7
+ mem = Tataru::Memory.new
8
+ instr = Tataru::Instructions::ValueInstruction.new('something')
9
+
10
+ mem.hash[:temp] = { _key: :somefield }
11
+ instr.memory = mem
12
+ instr.run
13
+
14
+ expect(mem.hash[:temp]).to eq(somefield: 'something')
15
+ end
16
+
17
+ it 'returns an error if no key' do
18
+ mem = Tataru::Memory.new
19
+ instr = Tataru::Instructions::ValueInstruction.new('something')
20
+
21
+ mem.hash[:temp] = {}
22
+ instr.memory = mem
23
+ instr.run
24
+
25
+ expect(mem.error).to eq 'No key set'
26
+ end
27
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Instructions::ValueRomInstruction do
6
+ it 'returns an error if no key' do
7
+ mem = Tataru::Memory.new
8
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
9
+
10
+ mem.hash[:rom] = {}
11
+ mem.hash[:temp] = {}
12
+ instr.memory = mem
13
+ instr.run
14
+
15
+ expect(mem.error).to eq 'No key set'
16
+ end
17
+
18
+ it 'returns an error if no such thing' do
19
+ mem = Tataru::Memory.new
20
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
21
+
22
+ mem.hash[:rom] = {}
23
+ mem.hash[:temp] = { _key: :somefield }
24
+ instr.memory = mem
25
+ expect { instr.run }.to raise_error 'Not found'
26
+ end
27
+
28
+ it 'sets a literal' do
29
+ mem = Tataru::Memory.new
30
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
31
+
32
+ mem.hash[:rom] = {
33
+ 'something' => {
34
+ type: :literal,
35
+ value: 'somevalue'
36
+ }
37
+ }
38
+ mem.hash[:temp] = { _key: :somefield }
39
+ instr.memory = mem
40
+ instr.run
41
+
42
+ expect(mem.hash[:temp]).to eq(somefield: 'somevalue')
43
+ end
44
+
45
+ it 'sets an array' do
46
+ mem = Tataru::Memory.new
47
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
48
+
49
+ mem.hash[:rom] = {
50
+ 'something' => {
51
+ type: :array,
52
+ references: {
53
+ 0 => 'a',
54
+ 1 => 'b'
55
+ }
56
+ },
57
+ 'a' => {
58
+ type: :literal,
59
+ value: 'meow'
60
+ },
61
+ 'b' => {
62
+ type: :literal,
63
+ value: 'woof'
64
+ }
65
+ }
66
+ mem.hash[:temp] = { _key: :somefield }
67
+ instr.memory = mem
68
+ instr.run
69
+
70
+ expect(mem.hash[:temp]).to eq(somefield: ['meow', 'woof'])
71
+ end
72
+
73
+ it 'sets a hash' do
74
+ mem = Tataru::Memory.new
75
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
76
+
77
+ mem.hash[:rom] = {
78
+ 'something' => {
79
+ type: :hash,
80
+ references: {
81
+ 'x' => 'aaa',
82
+ 'y' => 'bbbb'
83
+ }
84
+ },
85
+ 'aaa' => {
86
+ type: :literal,
87
+ value: 100
88
+ },
89
+ 'bbbb' => {
90
+ type: :literal,
91
+ value: 200
92
+ }
93
+ }
94
+ mem.hash[:temp] = { _key: :somefield }
95
+ instr.memory = mem
96
+ instr.run
97
+
98
+ expect(mem.hash[:temp]).to eq(somefield: {
99
+ 'x' => 100,
100
+ 'y' => 200
101
+ })
102
+ end
103
+
104
+ it 'sets an output' do
105
+ mem = Tataru::Memory.new
106
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
107
+
108
+ mem.hash[:outputs] = {
109
+ 'someresource' => {
110
+ name: 'somename'
111
+ }
112
+ }
113
+
114
+ mem.hash[:rom] = {
115
+ 'something' => {
116
+ type: :output,
117
+ resource: 'someresource',
118
+ output: :name
119
+ }
120
+ }
121
+ mem.hash[:temp] = { _key: :somefield }
122
+ instr.memory = mem
123
+ instr.run
124
+
125
+ expect(mem.hash[:temp]).to eq(somefield: 'somename')
126
+ end
127
+
128
+ it 'sets inner values' do
129
+ mem = Tataru::Memory.new
130
+ instr = Tataru::Instructions::ValueRomInstruction.new('something')
131
+
132
+ mem.hash[:rom] = {
133
+ 'something' => {
134
+ type: :hash,
135
+ references: {
136
+ 'x' => 'literal',
137
+ 'y' => 'array'
138
+ }
139
+ },
140
+ 'literal' => {
141
+ type: :literal,
142
+ value: 'something'
143
+ },
144
+ 'array' => {
145
+ type: :array,
146
+ references: {
147
+ 0 => 'value1',
148
+ 1 => 'value2'
149
+ }
150
+ },
151
+ 'value1' => {
152
+ type: :literal,
153
+ value: 'v1'
154
+ },
155
+ 'value2' => {
156
+ type: :literal,
157
+ value: 'v2'
158
+ }
159
+ }
160
+ mem.hash[:temp] = { _key: :somefield }
161
+ instr.memory = mem
162
+ instr.run
163
+
164
+ expect(mem.hash[:temp]).to eq(somefield: {
165
+ 'x' => 'something',
166
+ 'y' => ['v1', 'v2']
167
+ })
168
+ end
169
+
170
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Instructions::ValueUpdateInstruction do
6
+ it 'sets temp with update action of resource' do
7
+ mem = Tataru::Memory.new
8
+ instr = Tataru::Instructions::ValueUpdateInstruction.new('thething')
9
+
10
+ mem.hash[:update_action] = {
11
+ 'thething' => :hello
12
+ }
13
+
14
+ mem.hash[:temp] = {}
15
+
16
+ instr.memory = mem
17
+ instr.run
18
+
19
+ expect(mem.hash[:temp]).to eq(
20
+ result: :hello
21
+ )
22
+ end
23
+
24
+ it 'throws if no such resource' do
25
+ mem = Tataru::Memory.new
26
+ instr = Tataru::Instructions::ValueUpdateInstruction.new('thething')
27
+
28
+ mem.hash[:update_action] = {}
29
+
30
+ mem.hash[:temp] = {}
31
+
32
+ instr.memory = mem
33
+ expect { instr.run }.to raise_error "No value set for 'thething'"
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Quest do
6
+
7
+
8
+
9
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Representations::ArrayRepresentation do
6
+ it 'has no dependencies for empty array' do
7
+ rep = Tataru::Representations::ArrayRepresentation.new([])
8
+ expect(rep.dependencies).to eq []
9
+ end
10
+
11
+ it 'has no dependencies for array with only literals' do
12
+ rep = Tataru::Representations::ArrayRepresentation.new(['hi'])
13
+ expect(rep.dependencies).to eq []
14
+ end
15
+
16
+ it 'has dependencies for each resource' do
17
+ rr = Tataru::Representations::ResourceRepresentation.new('file', Tataru::BaseResourceDesc.new, {})
18
+ rep = Tataru::Representations::ArrayRepresentation.new([rr])
19
+ expect(rep.dependencies).to eq ['file']
20
+ end
21
+
22
+ it 'has dependencies for every resource' do
23
+ rr1 = Tataru::Representations::ResourceRepresentation.new('file1', Tataru::BaseResourceDesc.new, {})
24
+ rr2 = Tataru::Representations::ResourceRepresentation.new('file2', Tataru::BaseResourceDesc.new, {})
25
+ rep = Tataru::Representations::ArrayRepresentation.new([rr1, rr2, 'awd'])
26
+
27
+ expect(rep.dependencies).to eq ['file1', 'file2']
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Representations::HashRepresentation do
6
+ it 'has no dependencies for empty array' do
7
+ rep = Tataru::Representations::HashRepresentation.new({})
8
+ expect(rep.dependencies).to eq []
9
+ end
10
+
11
+ it 'has no dependencies for array with only literals' do
12
+ rep = Tataru::Representations::HashRepresentation.new({'greeting' => 'hi'})
13
+ expect(rep.dependencies).to eq []
14
+ end
15
+
16
+ it 'has dependencies for each resource' do
17
+ rr = Tataru::Representations::ResourceRepresentation.new('file', Tataru::BaseResourceDesc.new, {})
18
+ rep = Tataru::Representations::HashRepresentation.new(thing: rr)
19
+ expect(rep.dependencies).to eq ['file']
20
+ end
21
+
22
+ it 'has dependencies for every resource' do
23
+ rr1 = Tataru::Representations::ResourceRepresentation.new('file1', Tataru::BaseResourceDesc.new, {})
24
+ rr2 = Tataru::Representations::ResourceRepresentation.new('file2', Tataru::BaseResourceDesc.new, {})
25
+ rep = Tataru::Representations::HashRepresentation.new(thing1: rr1, thing2: rr2, text: 'hello')
26
+
27
+ expect(rep.dependencies).to eq ['file1', 'file2']
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Representation do
6
+ it 'has no dependencies' do
7
+ rep = Tataru::Representations::LiteralRepresentation.new('hello')
8
+ expect(rep.dependencies).to eq []
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Representations::OutputRepresentation do
6
+ it 'has a dependency on itself' do
7
+ rr = Tataru::Representations::OutputRepresentation.new('file', 'created_at')
8
+
9
+ expect(rr.dependencies).to eq ['file']
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Representations::ResourceRepresentation do
6
+ it 'has a dependency on itself' do
7
+ rr = Tataru::Representations::ResourceRepresentation.new('file', Tataru::BaseResourceDesc.new, {})
8
+
9
+ expect(rr.dependencies).to eq ['file']
10
+ end
11
+
12
+ it 'releases outputs' do
13
+ desc = Tataru::BaseResourceDesc.new
14
+ rr = Tataru::Representations::ResourceRepresentation.new('file', desc, {})
15
+
16
+ allow(desc).to receive(:output_fields) { [:created_at] }
17
+
18
+ expect(rr.created_at).to be_a(Tataru::Representations::OutputRepresentation)
19
+ expect(rr.created_at.resource_name).to eq 'file'
20
+ expect(rr.created_at.output_field_name).to eq :created_at
21
+ end
22
+
23
+ it 'throws error if required field not filled' do
24
+ desc = Tataru::BaseResourceDesc.new
25
+ rr = Tataru::Representations::ResourceRepresentation.new('file', desc, {})
26
+ allow(desc).to receive(:immutable_fields) { [:filename] }
27
+ allow(desc).to receive(:required_fields) { [:filename] }
28
+
29
+ expect { rr.check_required_fields! }.to raise_error "Required field 'filename' not provided in 'file'"
30
+ end
31
+
32
+ it 'throws error when no such output' do
33
+ desc = Tataru::BaseResourceDesc.new
34
+ rr = Tataru::Representations::ResourceRepresentation.new('file', desc, {})
35
+
36
+ allow(desc).to receive(:output_fields) { [:created_at] }
37
+
38
+ expect { rr.updated_at }.to raise_error NoMethodError
39
+ end
40
+
41
+ it 'throws error when no such output' do
42
+ desc = Tataru::BaseResourceDesc.new
43
+ allow(desc).to receive(:needs_remote_id?) { false }
44
+ allow(desc).to receive(:delete_at_end?) { true }
45
+
46
+ expect { Tataru::Representations::ResourceRepresentation.new('file', desc, {}) }.to raise_error(
47
+ 'must need remote id if deletes at end'
48
+ )
49
+ end
50
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::ResourceDsl do
6
+ it 'validates mutable fields' do
7
+ resource_desc = Tataru::BaseResourceDesc.new
8
+ allow(resource_desc).to receive(:mutable_fields) { [:filename] }
9
+
10
+ dsl = Tataru::ResourceDsl.new('somefile', resource_desc)
11
+ dsl.filename 'thing'
12
+
13
+ expect(dsl.representation).to be_a Tataru::Representations::ResourceRepresentation
14
+ expect(dsl.representation.properties[:filename]).to be_a Tataru::Representations::LiteralRepresentation
15
+ end
16
+
17
+ it 'validates immutable fields' do
18
+ resource_desc = Tataru::BaseResourceDesc.new
19
+ allow(resource_desc).to receive(:immutable_fields) { [:filename] }
20
+
21
+ dsl = Tataru::ResourceDsl.new('somefile', resource_desc)
22
+ dsl.filename 'thing'
23
+
24
+ expect(dsl.representation).to be_a Tataru::Representations::ResourceRepresentation
25
+ expect(dsl.representation.properties[:filename]).to be_a Tataru::Representations::LiteralRepresentation
26
+ end
27
+
28
+ it 'returns an output representation when given an output' do
29
+ resource_desc = Tataru::BaseResourceDesc.new
30
+ allow(resource_desc).to receive(:immutable_fields) { [:filename] }
31
+
32
+ desc = Tataru::BaseResourceDesc.new
33
+ rr = Tataru::Representations::ResourceRepresentation.new('other_resource', desc, {})
34
+ allow(desc).to receive(:output_fields) { [:created_at] }
35
+
36
+ dsl = Tataru::ResourceDsl.new('somefile', resource_desc)
37
+ dsl.filename rr.created_at
38
+
39
+ expect(dsl.representation).to be_a Tataru::Representations::ResourceRepresentation
40
+ expect(dsl.representation.properties[:filename]).to be_a Tataru::Representations::OutputRepresentation
41
+ expect(dsl.representation.properties[:filename].resource_name).to eq 'other_resource'
42
+ expect(dsl.representation.properties[:filename].output_field_name).to eq :created_at
43
+ end
44
+
45
+ it 'returns an output representation of remote ID' do
46
+ resource_desc = Tataru::BaseResourceDesc.new
47
+ allow(resource_desc).to receive(:immutable_fields) { [:filename] }
48
+
49
+
50
+ desc = Tataru::BaseResourceDesc.new
51
+ rr = Tataru::Representations::ResourceRepresentation.new('other_resource', desc, {})
52
+ allow(desc).to receive(:output_fields) { [:created_at] }
53
+
54
+
55
+ dsl = Tataru::ResourceDsl.new('somefile', resource_desc)
56
+ dsl.filename rr
57
+
58
+ expect(dsl.representation).to be_a Tataru::Representations::ResourceRepresentation
59
+ expect(dsl.representation.properties[:filename]).to be_a Tataru::Representations::OutputRepresentation
60
+ expect(dsl.representation.properties[:filename].resource_name).to eq 'other_resource'
61
+ expect(dsl.representation.properties[:filename].output_field_name).to eq :remote_id
62
+ end
63
+
64
+ it 'throws error if nonexistent field' do
65
+ resource_desc = Tataru::BaseResourceDesc.new
66
+ allow(resource_desc).to receive(:immutable_fields) { [:filename] }
67
+
68
+ dsl = Tataru::ResourceDsl.new('somefile', resource_desc)
69
+ expect { dsl.age 'thing' }.to raise_error NoMethodError
70
+ end
71
+ end