cauldron 0.1.0 → 0.1.1
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.
- data/Gemfile +2 -0
- data/Rakefile +7 -0
- data/VERSION +1 -1
- data/features/cauldron_generates_runtime_method.feature +3 -2
- data/features/step_definitions/cauldron_steps.rb +0 -1
- data/features/support/method_1.example +3 -0
- data/features/support/method_2.example +6 -0
- data/lib/Chain.rb +140 -264
- data/lib/CodeHandler.rb +0 -4
- data/lib/ScopeDependencies.rb +1 -0
- data/lib/Theory.rb +12 -15
- data/lib/UnifiedChain.rb +265 -8
- data/lib/cauldron.rb +1 -1
- data/lib/cauldron/demos.rb +280 -0
- data/lib/cauldron/pot.rb +56 -30
- data/lib/cauldron/sexp2cauldron.rb +109 -126
- data/lib/cauldron/terminal.rb +5 -74
- data/lib/core/ClassMethodCallContainer.rb +14 -0
- data/lib/core/Container.rb +12 -2
- data/lib/core/InstanceCallContainer.rb +30 -4
- data/lib/core/TheoryGenerator.rb +2 -9
- data/lib/core/assignment/Equal.rb +1 -1
- data/lib/core/assignment/Equivalent.rb +1 -1
- data/lib/core/assignment/NotEqual.rb +1 -1
- data/lib/core/call_container/CallContainer.rb +7 -1
- data/lib/core/instance_call/Chop.rb +0 -9
- data/lib/core/instance_call/instance_calls.rb +8 -0
- data/lib/core/instance_call/length_equal.rb +1 -1
- data/lib/core/requirement/Requirement.rb +1 -0
- data/lib/core/runtime_class/class_names.rb +12 -12
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -7
- data/lib/core/runtime_method/RuntimeMethod.rb +59 -45
- data/lib/core/statement/ActsAsStatement.rb +1 -1
- data/lib/core/statement/ArrayAccess.rb +28 -2
- data/lib/core/statement/OpenStatement.rb +7 -0
- data/lib/core/statement/Statement.rb +22 -18
- data/lib/core/statement/TheoryStatement.rb +8 -1
- data/lib/core/syntax/Addition.rb +3 -2
- data/lib/core/syntax/If.rb +8 -0
- data/lib/core/syntax/Return.rb +1 -1
- data/lib/core/variable/BaseVariable.rb +0 -2
- data/lib/core/variable/MethodParameter.rb +4 -31
- data/lib/core/variable/Unknown.rb +1 -5
- data/lib/implemented_chain.rb +3 -2
- data/lib/required.rb +0 -1
- data/lib/ruby_code/String.rb +0 -17
- data/lib/theories.rb +25 -1
- data/lib/theory/TheoryAction.rb +35 -5
- data/lib/theory/TheoryChainValidator.rb +10 -8
- data/lib/theory/TheoryComponent.rb +17 -0
- data/lib/theory/TheoryConnector.rb +76 -9
- data/lib/theory/TheoryDependent.rb +2 -2
- data/lib/theory/TheoryImplementation.rb +7 -7
- data/lib/util/ClassEvaluation.rb +2 -7
- data/lib/util/MethodValidation.rb +10 -6
- data/lib/util/Parser.rb +26 -20
- data/lib/util/StringToTheory.rb +27 -3
- data/spec/cauldron/chain_spec.rb +24 -0
- data/spec/cauldron/demos_spec.rb +30 -0
- data/spec/cauldron/pot_spec.rb +66 -0
- data/spec/cauldron/runtime_method_spec.rb +47 -5
- data/spec/cauldron/sexp_2_cauldron_spec.rb +92 -0
- data/spec/cauldron/terminal_spec.rb +1 -1
- data/spec/cauldron/theory_action_spec.rb +20 -0
- data/spec/cauldron/theory_connector_spec.rb +52 -0
- data/spec/cauldron/theory_spec.rb +59 -0
- data/spec/cauldron/unified_chain_spec.rb +102 -0
- data/spec/spec_helper.rb +10 -1
- data/tasks/theory_tasks.rake +274 -0
- data/test/fixtures/implementation_results/0/dump +0 -0
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/declaration.txt +1 -1
- data/test/fixtures/theories/13/desc +1 -1
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/declaration.txt +1 -1
- data/test/fixtures/theories/20/desc +1 -1
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/declaration.txt +1 -1
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/1/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/1/dump +0 -0
- data/test/fixtures/theory_implementations/2/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/output/simple_method.txt +0 -1
- data/test/tc_contextual_variables.rb +2 -41
- data/test/tc_describe.rb +1 -2
- data/test/tc_method.rb +2 -5
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +5 -3
- data/test/unit/core/runtime_method/tc_runtime_method.rb +34 -56
- data/test/unit/core/statement/tc_block_statement.rb +2 -0
- data/test/unit/core/statement/tc_open_statement.rb +15 -6
- data/test/unit/core/statement/tc_statement.rb +4 -5
- data/test/unit/core/statement/tc_statement_dependencies.rb +1 -0
- data/test/unit/core/statement/tc_theory_statement.rb +2 -0
- data/test/unit/core/syntax/tc_if_container.rb +5 -5
- data/test/unit/core/tc_theory_generator_heavy.rb +1 -1
- data/test/unit/core/tracking/tc_history.rb +3 -1
- data/test/unit/core/variable/tc_method_parameter_variable.rb +2 -2
- data/test/unit/tc_chain_with_case_1.rb +1 -1
- data/test/unit/tc_method_usage.rb +1 -1
- data/test/unit/tc_theory.rb +8 -2
- data/test/unit/theory/tc_theory_action.rb +37 -5
- data/test/unit/theory/tc_theory_chain_validator.rb +3 -3
- data/test/unit/theory/tc_theory_connector.rb +2 -37
- data/test/unit/theory/tc_theory_dependent.rb +2 -0
- data/test/unit/theory/tc_theory_implementation.rb +5 -1
- data/test/unit/theory/tc_theory_result.rb +3 -2
- data/test/unit/util/tc_method_validation.rb +4 -1
- data/test/unit/util/tc_parser.rb +2 -0
- data/test/unit/util/tc_string_to_theory.rb +3 -2
- data/tmp/runtime_method_evaluation.rb +7 -4
- metadata +59 -13
- data/lib/core/syntax/IfContainer.rb +0 -100
data/lib/cauldron/pot.rb
CHANGED
|
@@ -6,60 +6,86 @@ module Cauldron
|
|
|
6
6
|
VERSION = '0-01'
|
|
7
7
|
|
|
8
8
|
def initialize()
|
|
9
|
-
|
|
9
|
+
#StandardLogger.instance.level = Logger::FATAL
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def brew(test_cases)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
chains = complete_chains(test_cases)
|
|
15
|
+
if chains.empty?
|
|
16
|
+
raise StandardError.new('Failed to generate a chain for this problem')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# => TODO This probably shouldn't be needed
|
|
20
|
+
written_chains = chains.collect {|x| x.write}
|
|
21
|
+
unique_written_chains = written_chains.uniq
|
|
22
|
+
unique_chains = []
|
|
23
|
+
chains.each do |x|
|
|
24
|
+
unless unique_chains.any? {|y| y.write == x.write}
|
|
25
|
+
unique_chains << x
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
chains = unique_chains
|
|
29
|
+
|
|
30
|
+
runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
|
|
31
|
+
chains.each do |chain|
|
|
32
|
+
|
|
33
|
+
unified_chain = chain.unify_chain
|
|
34
|
+
implementation_permutations = unified_chain.implementation_permuatations(runtime_method.copy,test_cases.copy,Mapping.new)
|
|
35
|
+
|
|
36
|
+
# Go through each of the permutations and create the runtime method for the chain
|
|
37
|
+
validator = TheoryChainValidator.new
|
|
38
|
+
begin
|
|
39
|
+
result = validator.build(runtime_method.copy,test_cases.copy,implementation_permutations)
|
|
40
|
+
rescue StandardError => e
|
|
41
|
+
StandardLogger.instance.warning e
|
|
42
|
+
next
|
|
43
|
+
end
|
|
44
|
+
return result
|
|
45
|
+
end
|
|
46
|
+
return nil
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def complete_chains(test_cases)
|
|
51
|
+
|
|
52
|
+
theories = saved_theories
|
|
17
53
|
|
|
18
|
-
# Prepare the theory chain connector
|
|
19
54
|
runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
|
|
20
55
|
tc = Parser.run('test_cases')
|
|
21
56
|
tc_index_0 = IntrinsicLiteral.new(0)
|
|
22
57
|
tc_index_1 = IntrinsicLiteral.new(1)
|
|
23
58
|
param_0 = IntrinsicLiteral.new(0)
|
|
24
|
-
real_method = Parser.run('runtime_method')
|
|
25
|
-
|
|
26
|
-
# TODO Still need to include last_real_method
|
|
27
|
-
last_real_method = Parser.run('last_runtime_method')
|
|
59
|
+
real_method = Parser.run('runtime_method')
|
|
28
60
|
|
|
29
61
|
# Create the thoery connector and the values available
|
|
30
62
|
# TODO These values should actually be retreived progressively
|
|
31
|
-
potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
|
|
63
|
+
potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
|
|
32
64
|
connector = TheoryConnector.new(potential_values)
|
|
33
65
|
|
|
34
66
|
# Attempt to generate a complete chain for the solution
|
|
35
|
-
chains = connector.generate_chains(runtime_method,test_cases,theories)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# chain_permutations = chain.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
|
|
43
|
-
# end
|
|
44
|
-
# TEMP just concentrate of one implementation_permutation
|
|
45
|
-
implementation_permutations = chains.first.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
|
|
46
|
-
|
|
47
|
-
# Go through each of the permutations and create the runtime method for the chain
|
|
48
|
-
validator = TheoryChainValidator.new
|
|
49
|
-
result = validator.build(runtime_method,test_cases,implementation_permutations)
|
|
50
|
-
return result
|
|
51
|
-
|
|
67
|
+
chains = connector.generate_chains(runtime_method,test_cases,theories)
|
|
68
|
+
return chains
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def saved_theories
|
|
72
|
+
saved_theory_file_paths = Dir.glob(File.join(theory_repository_path,'*','dump'))
|
|
73
|
+
saved_theory_file_paths.collect {|x| Marshal.load(File.open(x,'r'))}
|
|
52
74
|
end
|
|
53
75
|
|
|
54
76
|
def simmer(demo)
|
|
55
77
|
raise StandardError.new('This demo does not work') unless demo_works?(demo)
|
|
56
78
|
|
|
57
79
|
# Generate a master theory for each stage of the runtime method when following the theory chains
|
|
58
|
-
generator = TheoryGenerator.new
|
|
59
|
-
master_theories = generator.master_theories(
|
|
80
|
+
# generator = TheoryGenerator.new
|
|
81
|
+
# master_theories = generator.master_theories(
|
|
82
|
+
# demo[:chain],
|
|
83
|
+
# demo[:initial_method],
|
|
84
|
+
# demo[:test_cases]
|
|
85
|
+
# )
|
|
60
86
|
|
|
61
87
|
# Add each of the theories in the chain to cauldron
|
|
62
|
-
master_theories.each {|x| save_theory(x,master_repository_path)}
|
|
88
|
+
#master_theories.each {|x| save_theory(x,master_repository_path)}
|
|
63
89
|
|
|
64
90
|
# Save each of the simple versions of the theory
|
|
65
91
|
demo[:chain].each {|x| save_theory(x,theory_repository_path)}
|
|
@@ -1,155 +1,138 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
|
+
require 'ruby2ruby'
|
|
2
3
|
require 'sexp_processor'
|
|
3
4
|
|
|
4
5
|
module Cauldron
|
|
5
6
|
|
|
6
7
|
class Sexp2Cauldron < SexpProcessor
|
|
7
8
|
|
|
9
|
+
VARIABLE_EXPRESSION = /var[|_]*(\d+)/
|
|
10
|
+
|
|
8
11
|
def initialize
|
|
9
12
|
super
|
|
10
|
-
self.strict = false
|
|
11
13
|
self.expected = Object
|
|
14
|
+
self.auto_shift_type = true
|
|
15
|
+
self.strict = true
|
|
12
16
|
@debug[:lasgn] = nil
|
|
13
17
|
@unsupported_checked = true
|
|
14
18
|
end
|
|
15
19
|
|
|
16
20
|
def process_lit(exp)
|
|
17
|
-
type = exp.shift
|
|
18
21
|
val = exp.shift
|
|
19
22
|
return Literal.new(val)
|
|
20
23
|
end
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
#
|
|
33
|
-
# yield
|
|
34
|
-
#
|
|
35
|
-
# self.context.shift
|
|
36
|
-
# end
|
|
37
|
-
|
|
38
|
-
# def process(exp)
|
|
39
|
-
# puts '--------------------------------calling process===================>'
|
|
40
|
-
# return nil if exp.nil?
|
|
41
|
-
# exp = self.rewrite(exp) if self.context.empty?
|
|
42
|
-
# puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
|
|
43
|
-
# puts @unsupported_checked
|
|
44
|
-
# puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
|
|
45
|
-
# unless @unsupported_checked then
|
|
46
|
-
# m = public_methods.grep(/^process_/) { |o| o.to_s.sub(/^process_/, '').to_sym }
|
|
47
|
-
# supported = m - (m - @unsupported)
|
|
48
|
-
#
|
|
49
|
-
# raise UnsupportedNodeError, "#{supported.inspect} shouldn't be in @unsupported" unless supported.empty?
|
|
50
|
-
#
|
|
51
|
-
# @unsupported_checked = true
|
|
52
|
-
# end
|
|
53
|
-
#
|
|
54
|
-
# result = self.expected.new
|
|
55
|
-
#
|
|
56
|
-
# type = exp.first
|
|
57
|
-
# raise "type should be a Symbol, not: #{exp.first.inspect}" unless
|
|
58
|
-
# Symbol === type
|
|
59
|
-
#
|
|
60
|
-
# in_context type do
|
|
61
|
-
#
|
|
62
|
-
# puts '==============================IN COTEXT('+exp.to_s+') ====================== '
|
|
63
|
-
#
|
|
64
|
-
# if @debug.has_key? type then
|
|
65
|
-
# str = exp.inspect
|
|
66
|
-
# puts "// DEBUG: #{str}" if str =~ @debug[type]
|
|
67
|
-
# end
|
|
68
|
-
#
|
|
69
|
-
# exp_orig = nil
|
|
70
|
-
# exp_orig = exp.deep_clone if $DEBUG or
|
|
71
|
-
# @debug.has_key? type or @exceptions.has_key?(type)
|
|
72
|
-
#
|
|
73
|
-
# raise UnsupportedNodeError, "'#{type}' is not a supported node type" if
|
|
74
|
-
# @unsupported.include? type
|
|
75
|
-
#
|
|
76
|
-
# if @debug.has_key? type then
|
|
77
|
-
# str = exp.inspect
|
|
78
|
-
# puts "// DEBUG (rewritten): #{str}" if str =~ @debug[type]
|
|
79
|
-
# end
|
|
80
|
-
#
|
|
81
|
-
# # now do a pass with the real processor (or generic)
|
|
82
|
-
# meth = @processors[type] || @default_method
|
|
83
|
-
# if meth then
|
|
84
|
-
#
|
|
85
|
-
# if @warn_on_default and meth == @default_method then
|
|
86
|
-
# warn "WARNING: Using default method #{meth} for #{type}"
|
|
87
|
-
# end
|
|
88
|
-
#
|
|
89
|
-
# exp.shift if @auto_shift_type and meth != @default_method
|
|
90
|
-
#
|
|
91
|
-
# puts 'Calling method ----------'+meth.to_s
|
|
92
|
-
# result = error_handler(type, exp_orig) do
|
|
93
|
-
# self.send(meth, exp)
|
|
94
|
-
# end
|
|
95
|
-
#
|
|
96
|
-
# raise SexpTypeError, "Result must be a #{@expected}, was #{result.class}:#{result.inspect}" unless @expected === result
|
|
97
|
-
#
|
|
98
|
-
# self.assert_empty(meth, exp, exp_orig) if @require_empty
|
|
99
|
-
# else
|
|
100
|
-
# unless @strict then
|
|
101
|
-
# until exp.empty? do
|
|
102
|
-
# sub_exp = exp.shift
|
|
103
|
-
# sub_result = nil
|
|
104
|
-
# if Array === sub_exp then
|
|
105
|
-
# sub_result = error_handler(type, exp_orig) do
|
|
106
|
-
# process(sub_exp)
|
|
107
|
-
# end
|
|
108
|
-
# raise "Result is a bad type" unless Array === sub_exp
|
|
109
|
-
# raise "Result does not have a type in front: #{sub_exp.inspect}" unless Symbol === sub_exp.first unless sub_exp.empty?
|
|
110
|
-
# else
|
|
111
|
-
# sub_result = sub_exp
|
|
112
|
-
# end
|
|
113
|
-
# result << sub_result
|
|
114
|
-
# end
|
|
115
|
-
#
|
|
116
|
-
# # NOTE: this is costly, but we are in the generic processor
|
|
117
|
-
# # so we shouldn't hit it too much with RubyToC stuff at least.
|
|
118
|
-
# #if Sexp === exp and not exp.sexp_type.nil? then
|
|
119
|
-
# begin
|
|
120
|
-
# result.sexp_type = exp.sexp_type
|
|
121
|
-
# rescue Exception
|
|
122
|
-
# # nothing to do, on purpose
|
|
123
|
-
# end
|
|
124
|
-
# else
|
|
125
|
-
# msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}"
|
|
126
|
-
# msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG
|
|
127
|
-
# raise UnknownNodeError, msg
|
|
128
|
-
# end
|
|
129
|
-
# end
|
|
130
|
-
#
|
|
131
|
-
# puts '--------------------------------DONE ---------------------- context'
|
|
132
|
-
#
|
|
133
|
-
# end
|
|
134
|
-
#
|
|
135
|
-
# result
|
|
136
|
-
# end
|
|
137
|
-
#
|
|
25
|
+
def in_context type, &block
|
|
26
|
+
self.context.unshift type
|
|
27
|
+
yield
|
|
28
|
+
self.context.shift
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def process_str(exp)
|
|
32
|
+
Literal.new(exp.shift)
|
|
33
|
+
end
|
|
34
|
+
|
|
138
35
|
# => Overwritten method
|
|
139
36
|
def process_lasgn(exp)
|
|
140
|
-
exp.shift
|
|
141
37
|
next_exp = exp.shift
|
|
142
|
-
if next_exp.to_s.match(
|
|
143
|
-
s = Statement.new(
|
|
38
|
+
if next_exp.to_s.match(VARIABLE_EXPRESSION)
|
|
39
|
+
s = Statement.new(convert_to_variable(next_exp),Equal.new)
|
|
144
40
|
end
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
41
|
+
a = process(exp.shift)
|
|
42
|
+
s.add a
|
|
43
|
+
return s
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def process_if(exp)
|
|
47
|
+
inner_statement_sexp = exp.shift
|
|
48
|
+
scope = process(exp.shift) # => The content of the if statement
|
|
49
|
+
exp.shift
|
|
50
|
+
open_statement = OpenStatement.new(Statement.new(If.new,Container.new(process(inner_statement_sexp))))
|
|
51
|
+
open_statement << scope unless scope.nil?
|
|
52
|
+
return open_statement
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def process_return(exp)
|
|
56
|
+
return Statement.new(Return.new,process(exp.shift))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def process_call(exp)
|
|
60
|
+
results = []
|
|
61
|
+
until exp.empty?
|
|
62
|
+
atom = exp.shift
|
|
63
|
+
if atom.to_s.match(VARIABLE_EXPRESSION)
|
|
64
|
+
results << convert_to_variable(atom)
|
|
65
|
+
next
|
|
66
|
+
end
|
|
67
|
+
if atom == :==
|
|
68
|
+
results << Equivalent.new
|
|
69
|
+
next
|
|
70
|
+
end
|
|
71
|
+
next if atom.nil?
|
|
72
|
+
res = process(atom)
|
|
73
|
+
next if res.nil?
|
|
74
|
+
results << res
|
|
149
75
|
end
|
|
150
|
-
|
|
76
|
+
return Statement.new(*results)
|
|
151
77
|
end
|
|
152
78
|
|
|
79
|
+
def process_arglist(exp)
|
|
80
|
+
return process exp.shift
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def process_defn(exp)
|
|
84
|
+
type = exp.shift
|
|
85
|
+
args = exp.shift
|
|
86
|
+
scope = exp.shift
|
|
87
|
+
|
|
88
|
+
usage = (args.length==2) ? process(args) : MethodUsage.new
|
|
89
|
+
method_id = type.to_s.match(/method_(\d)+/)[1]
|
|
90
|
+
method = RuntimeMethod.new(usage,method_id)
|
|
91
|
+
statements = process(scope)
|
|
92
|
+
unless statements.nil?
|
|
93
|
+
statements.each do |statement|
|
|
94
|
+
method << statement unless statement.nil?
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
return method
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def process_args(exp)
|
|
102
|
+
atom = exp.shift
|
|
103
|
+
variable_id = atom.to_s.match(VARIABLE_EXPRESSION)[1]
|
|
104
|
+
param = MethodParameter.new()
|
|
105
|
+
param.variable_id = variable_id
|
|
106
|
+
return MethodUsage.new(param)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def process_scope(exp)
|
|
110
|
+
block = exp.shift
|
|
111
|
+
res = process(block)
|
|
112
|
+
return res
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def process_block(exp)
|
|
116
|
+
result = []
|
|
117
|
+
until exp.empty?
|
|
118
|
+
atom = exp.shift
|
|
119
|
+
next if atom.first == :nil
|
|
120
|
+
result << process(atom)
|
|
121
|
+
end
|
|
122
|
+
return result
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def process_lvar(exp)
|
|
126
|
+
var = exp.shift
|
|
127
|
+
return convert_to_variable(var)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def convert_to_variable(variable)
|
|
133
|
+
return Unknown.new(variable.to_s.match(VARIABLE_EXPRESSION)[1])
|
|
134
|
+
end
|
|
135
|
+
|
|
153
136
|
end
|
|
154
137
|
|
|
155
138
|
|
data/lib/cauldron/terminal.rb
CHANGED
|
@@ -3,11 +3,12 @@ module Cauldron
|
|
|
3
3
|
class Terminal
|
|
4
4
|
|
|
5
5
|
include Cauldron::Conversion
|
|
6
|
+
include Cauldron::Demos
|
|
6
7
|
|
|
7
8
|
attr_reader :cases
|
|
8
9
|
|
|
9
10
|
def initialize(output,auto=true)
|
|
10
|
-
@output, @cases
|
|
11
|
+
@output, @cases, @auto = output, [], auto
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def start
|
|
@@ -15,7 +16,8 @@ module Cauldron
|
|
|
15
16
|
@pot = Cauldron::Pot.new
|
|
16
17
|
@pot.clear
|
|
17
18
|
@output.puts '* Adding example case'
|
|
18
|
-
|
|
19
|
+
#@pot.simmer(demo('1'))
|
|
20
|
+
@pot.simmer(demo_two)
|
|
19
21
|
|
|
20
22
|
@output.puts "Thanks for trying Cauldron - it's at really early stage right now"
|
|
21
23
|
@output.puts "in fact it can only generate a method that returns the parameter passed through"
|
|
@@ -42,78 +44,7 @@ module Cauldron
|
|
|
42
44
|
else
|
|
43
45
|
@cases << convert_to_example(separate_values(input))
|
|
44
46
|
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# => ==========================================================================
|
|
48
|
-
|
|
49
|
-
def convert_to_cauldron_test_cases(cases)
|
|
50
|
-
cases.inject([]) do |total,x|
|
|
51
|
-
cauldron_case = CTestCase.new
|
|
52
|
-
cauldron_case[:params] = x[0]
|
|
53
|
-
cauldron_case[:output] = x[1]
|
|
54
|
-
total << cauldron_case
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def demo(id)
|
|
59
|
-
|
|
60
|
-
@demo_1_test_cases = convert_to_cauldron_test_cases(
|
|
61
|
-
[
|
|
62
|
-
[['sparky'],'sparky'],
|
|
63
|
-
[['kel'],'kel']
|
|
64
|
-
]
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
# Create demonstration #2
|
|
68
|
-
demo_2_test_case_1 = CTestCase.new
|
|
69
|
-
demo_2_test_case_1[:params] = ['something']
|
|
70
|
-
demo_2_test_case_1[:output] = 'exists'
|
|
71
|
-
demo_2_test_case_2 = CTestCase.new
|
|
72
|
-
demo_2_test_case_2[:params] = ['my willpower']
|
|
73
|
-
demo_2_test_case_2[:output] = 'does not exist'
|
|
74
|
-
demo_2_test_cases = [
|
|
75
|
-
demo_2_test_case_1,demo_2_test_case_2
|
|
76
|
-
]
|
|
77
|
-
|
|
78
|
-
# Create demo #1 chain
|
|
79
|
-
# Create the head for the chain
|
|
80
|
-
head = Theory.new([],nil,[])
|
|
81
|
-
|
|
82
|
-
link_one_action = TheoryAction.new(
|
|
83
|
-
TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2.params[var3])')),
|
|
84
|
-
StringToTheory.run('var1.statement_id')
|
|
85
|
-
)
|
|
86
|
-
# NOTE: I need to add one result so the theory can be flagged as complete - I might not need it
|
|
87
|
-
# to be complete -
|
|
88
|
-
link_one_result = TheoryResult.new(StringToTheory.run("if(var1.all_pass?(var2))\nreturn true\nend"))
|
|
89
|
-
link_one = Theory.new([],link_one_action,[link_one_result])
|
|
90
|
-
chain = Chain.new
|
|
91
|
-
chain = chain.add_link(head).first
|
|
92
|
-
chain = chain.add_link(
|
|
93
|
-
link_one,
|
|
94
|
-
{
|
|
95
|
-
1=>IntrinsicRuntimeMethod.new,
|
|
96
|
-
2=>IntrinsicTestCases.new,
|
|
97
|
-
3=>IntrinsicLiteral.new(0)
|
|
98
|
-
}
|
|
99
|
-
).first
|
|
100
|
-
|
|
101
|
-
# Now implement the chain
|
|
102
|
-
implemented_chain = chain.implement
|
|
103
|
-
|
|
104
|
-
# TODO It should generate the values too.(TheoryGenerator)
|
|
105
|
-
@demo_1 = {
|
|
106
|
-
:initial_method=>RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
|
|
107
|
-
:test_cases=>@demo_1_test_cases,
|
|
108
|
-
:chain=>chain,
|
|
109
|
-
:values=>{}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if id == '1'
|
|
113
|
-
return @demo_1
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
end
|
|
47
|
+
end
|
|
117
48
|
|
|
118
49
|
end
|
|
119
50
|
|