class Bricolage::JobFile
Attributes
class_id[R]
path[R]
values[R]
Public Class Methods
load(ctx, path)
click to toggle source
# File lib/bricolage/jobfile.rb, line 8 def JobFile.load(ctx, path) values = case path.to_s when /\.sql\.job\z/ load_embedded_definition(ctx, path) when /\.(?:rb|py|sh)\.job\z/ load_program_embedded_definition(ctx, path) else ctx.parameter_file_loader.load_yaml(path) end parse(values, path) end
new(class_id, values, path)
click to toggle source
# File lib/bricolage/jobfile.rb, line 112 def initialize(class_id, values, path) @class_id = class_id @values = values @path = Pathname(path) end
parse(values, path)
click to toggle source
# File lib/bricolage/jobfile.rb, line 105 def JobFile.parse(values, path) values = values.dup class_id = values.delete('class') or raise ParameterError, "missing job class: #{path}" new(class_id, values, path) end
Private Class Methods
load_embedded_definition(ctx, path)
click to toggle source
For .sql.job
# File lib/bricolage/jobfile.rb, line 25 def load_embedded_definition(ctx, path) sql = ctx.parameter_file_loader.load_eruby(path) block = sql.slice(%r{\A/\*.*?^\*/}m) or raise ParameterError, "missing embedded job definition block: #{path}" yaml = block.sub(%r{\A/\*}, '').sub(%r{^\*/\s*\z}, '') begin values = YAML.load(yaml) rescue => err raise ParameterError, "#{path}: embedded job definition syntax error: #{err.message}" end # avoid changing line number stripped_sql = sql.sub(%r{\A/\*.*?^\*/}m, "\n" * block.count("\n")) decls = make_sql_declarations(stripped_sql, values, path) stmt = SQLStatement.new(StringResource.new(sql, path), decls) set_value values, 'sql-file', stmt, path values end
load_program_embedded_definition(ctx, path)
click to toggle source
For .rb.job, .py.job, .sh.job (“#” comment style files) This method does NOT expand variables of parameter files.
# File lib/bricolage/jobfile.rb, line 82 def load_program_embedded_definition(ctx, path) script = StringIO.new(ctx.parameter_file_loader.load_file(path)) first_line = script.gets if first_line.start_with?('#!') yaml_lines = [] else yaml_lines = [first_line] end script.each_line do |line| break unless line.start_with?('#') yaml_lines.push line[1..-1] end yaml = yaml_lines.join begin values = YAML.load(yaml) rescue => err raise ParameterError, "#{path}: embedded job definition syntax error: #{err.message}" end values end
make_sql_declarations(sql, values, path)
click to toggle source
# File lib/bricolage/jobfile.rb, line 48 def make_sql_declarations(sql, values, path) decls = Declarations.new vars = Variable.list(sql) if dest = vars.delete('dest_table') decls.declare 'dest_table', nil end if values['src-tables'] srcs = values['src-tables'] case srcs when String decls.declare srcs, nil vars.delete srcs when Array srcs.each do |table| decls.declare table, nil vars.delete table end when Hash srcs.each_key do |table| decls.declare table, nil vars.delete table end else raise ParameterError, "unknown src-tables value type: #{srcs.class}" end end vars.each do |name| decls.declare name, name end decls end
set_value(values, name, value, path)
click to toggle source
# File lib/bricolage/jobfile.rb, line 43 def set_value(values, name, value, path) raise ParameterError, "#{path}: #{name} parameter and embedded SQL script is exclusive" if values[name] values[name] = value end
Public Instance Methods
global_variables()
click to toggle source
# File lib/bricolage/jobfile.rb, line 131 def global_variables { 'script' => @path.to_s } end
job_id()
click to toggle source
# File lib/bricolage/jobfile.rb, line 122 def job_id base = @path.basename('.job').to_s File.basename(base, '.*') end
subsystem()
click to toggle source
# File lib/bricolage/jobfile.rb, line 127 def subsystem @path.parent.basename.to_s end