10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/opswalrus/ops_file_script.rb', line 10
def self.define_for(ops_file, ruby_script)
klass = Class.new(OpsFileScript)
methods_defined = Set.new
ops_file.local_symbol_table.each do |symbol_name, import_reference|
unless methods_defined.include? symbol_name
App.instance.trace "defining method for local symbol table entry: #{symbol_name}"
klass.define_method(symbol_name) do |*args, **kwargs, &block|
App.instance.trace "resolving local symbol table entry: #{symbol_name}"
namespace_or_ops_file = @runtime_env.resolve_import_reference(ops_file, import_reference)
App.instance.trace "namespace_or_ops_file=#{namespace_or_ops_file.to_s}"
invocation_context = LocalImportInvocationContext.new(@runtime_env, namespace_or_ops_file)
invocation_context._invoke(*args, **kwargs)
end
methods_defined << symbol_name
end
end
sibling_symbol_table_names = Set.new
sibling_symbol_table_names |= ops_file.dirname.glob("*.ops").map {|ops_file_path| ops_file_path.basename(".ops").to_s } sibling_symbol_table_names |= ops_file.dirname.glob("*").select(&:directory?).map {|dir_path| dir_path.basename.to_s } App.instance.trace "methods_defined=#{methods_defined}"
sibling_symbol_table_names.each do |symbol_name|
unless methods_defined.include? symbol_name
App.instance.trace "defining method for implicit imports: #{symbol_name}"
klass.define_method(symbol_name) do |*args, **kwargs, &block|
App.instance.trace "resolving implicit import: #{symbol_name}"
namespace_or_ops_file = @runtime_env.resolve_sibling_symbol(ops_file, symbol_name)
App.instance.trace "namespace_or_ops_file=#{namespace_or_ops_file.to_s}"
invocation_context = LocalImportInvocationContext.new(@runtime_env, namespace_or_ops_file)
invocation_context._invoke(*args, **kwargs)
end
methods_defined << symbol_name
end
end
invoke_method_definition = <<~INVOKE_METHOD
def _invoke(runtime_env, hashlike_params)
@runtime_env = runtime_env
@params = hashlike_params.easynav
@runtime_ops_file_path = __FILE__
_retval = begin
#{ruby_script}
end
case _retval
when Hash, Array
_retval.easynav
else
_retval
end
end
INVOKE_METHOD
invoke_method_line_count_prior_to_ruby_script_from_ops_file = 5
klass.module_eval(invoke_method_definition, ops_file.ops_file_path.to_s, ops_file.script_line_offset - invoke_method_line_count_prior_to_ruby_script_from_ops_file)
klass
end
|