lib/chronicle/etl/cli/jobs.rb in chronicle-etl-0.2.4 vs lib/chronicle/etl/cli/jobs.rb in chronicle-etl-0.3.0
- old
+ new
@@ -5,59 +5,55 @@
# CLI commands for working with ETL jobs
class Jobs < SubcommandBase
default_task "start"
namespace :jobs
- class_option :extractor, aliases: '-e', desc: 'Extractor class (available: stdin, csv, file)', default: 'stdin', banner: 'extractor-name'
+ class_option :extractor, aliases: '-e', desc: "Extractor class. Default: stdin", banner: 'extractor-name'
class_option :'extractor-opts', desc: 'Extractor options', type: :hash, default: {}
- class_option :transformer, aliases: '-t', desc: 'Transformer class (available: null)', default: 'null', banner: 'transformer-name'
+ class_option :transformer, aliases: '-t', desc: 'Transformer class. Default: null', banner: 'transformer-name'
class_option :'transformer-opts', desc: 'Transformer options', type: :hash, default: {}
- class_option :loader, aliases: '-l', desc: 'Loader class (available: stdout, csv, table)', default: 'stdout', banner: 'loader-name'
+ class_option :loader, aliases: '-l', desc: 'Loader class. Default: stdout', banner: 'loader-name'
class_option :'loader-opts', desc: 'Loader options', type: :hash, default: {}
class_option :name, aliases: '-j', desc: 'Job configuration name'
map run: :start # Thor doesn't like `run` as a command name
desc "run", "Start a job"
+ option :log_level, desc: 'Log level (debug, info, warn, error, fatal)', default: 'info'
+ option :verbose, aliases: '-v', desc: 'Set log level to verbose', type: :boolean
+ option :dry_run, desc: 'Only run the extraction and transform steps, not the loading', type: :boolean
long_desc <<-LONG_DESC
This will run an ETL job. Each job needs three parts:
1. #{'Extractor'.underline}: pulls data from an external source. By default, this is stdout. Other common options including pulling data from an API or reading JSON from a file.
2. #{'Transformer'.underline}: transforms data into a new format. If none is specified, we use the `null` transformer which does nothing to the data.
- 3. #{'Loader'.underline}: takes that transformed data and loads it externally. This can be an API, flat files, (or by default), stdout.
+ 3. #{'Loader'.underline}: takes that transformed data and loads it externally. This can be an API, flat files, (or by default), stdout. With the --dry-run option, this step won't be run.
If you do not want to use the command line flags, you can also configure a job with a .yml config file. You can either specify the path to this file or use the filename and place the file in ~/.config/chronicle/etl/jobs/NAME.yml and call it with `--job NAME`
LONG_DESC
# Run an ETL job
def start
+ setup_log_level
job_definition = build_job_definition(options)
job = Chronicle::ETL::Job.new(job_definition)
runner = Chronicle::ETL::Runner.new(job)
runner.run!
- rescue Chronicle::ETL::ProviderNotAvailableError => e
- warn(e.message.red)
- warn(" Perhaps you haven't installed it yet: `$ gem install chronicle-#{e.provider}`")
- exit(false)
- rescue Chronicle::ETL::ConnectorNotAvailableError => e
- warn(e.message.red)
- exit(false)
end
desc "create", "Create a job"
# Create an ETL job
def create
job_definition = build_job_definition(options)
path = File.join('chronicle', 'etl', 'jobs', options[:name])
- Chronicle::ETL::Config.write(path, job_definition)
+ Chronicle::ETL::Config.write(path, job_definition.definition)
end
desc "show", "Show details about a job"
# Show an ETL job
def show
- job_config = build_job_definition(options)
- pp job_config
+ puts Chronicle::ETL::Job.new(build_job_definition(options))
end
desc "list", "List all available jobs"
# List available ETL jobs
def list
@@ -79,36 +75,46 @@
puts table.render(indent: 0, padding: [0, 2])
end
private
+ def setup_log_level
+ if options[:verbose]
+ Chronicle::ETL::Logger.log_level = Chronicle::ETL::Logger::DEBUG
+ elsif options[:log_level]
+ level = Chronicle::ETL::Logger.const_get(options[:log_level].upcase)
+ Chronicle::ETL::Logger.log_level = level
+ end
+ end
+
# Create job definition by reading config file and then overwriting with flag options
def build_job_definition(options)
definition = Chronicle::ETL::JobDefinition.new
- definition.add_config(process_flag_options(options))
definition.add_config(load_job_config(options[:name]))
+ definition.add_config(process_flag_options(options))
definition
end
def load_job_config name
Chronicle::ETL::Config.load_job_from_config(name)
end
# Takes flag options and turns them into a runner config
def process_flag_options options
{
+ dry_run: options[:dry_run],
extractor: {
name: options[:extractor],
options: options[:'extractor-opts']
- },
+ }.compact,
transformer: {
name: options[:transformer],
options: options[:'transformer-opts']
- },
+ }.compact,
loader: {
name: options[:loader],
options: options[:'loader-opts']
- }
+ }.compact
}
end
end
end
end