lib/synvert/cli.rb in synvert-0.0.13 vs lib/synvert/cli.rb in synvert-0.0.14

- old
+ new

@@ -1,57 +1,126 @@ # coding: utf-8 require 'optparse' -require 'find' require 'open-uri' module Synvert + # Synvert command line interface. class CLI + # Initialize the cli and run. + # + # @param args [Array] arguments, default is ARGV. + # @return [Boolean] true if command runs successfully. def self.run(args = ARGV) new.run(args) end + # Initialize a CLI. + def initialize + @options = {command: 'run', snippet_paths: [], snippet_names: []} + end + + # Run the CLI. + # @param args [Array] arguments. + # @return [Boolean] true if command runs successfully. def run(args) - Configuration.instance.set 'snippet_paths', [] - Configuration.instance.set 'snippet_names', [] + run_option_parser(args) + load_rewriters - command = :run + case @options[:command] + when 'list' then list_available_rewriters + when 'query' then query_available_rewriters + when 'show' then show_rewriter + else + @options[:snippet_names].each do |snippet_name| + puts "===== #{snippet_name} started =====" + rewriter = Rewriter.call snippet_name + puts rewriter.todo if rewriter.todo + puts "===== #{snippet_name} done =====" + end + end + true + rescue SystemExit + true + rescue Exception => e + puts "Error: " + e.message + false + end + + private + + # Run OptionParser to parse arguments. + def run_option_parser(args) optparse = OptionParser.new do |opts| opts.banner = "Usage: synvert [project_path]" opts.on '-d', '--load SNIPPET_PATHS', 'load additional snippets, snippet paths can be local file path or remote http url' do |snippet_paths| - Configuration.instance.set 'snippet_paths', snippet_paths.split(',') + @options[:snippet_paths] = snippet_paths.split(',').map(&:strip) end opts.on '-l', '--list', 'list all available snippets' do - command = :list + @options[:command] = 'list' end + opts.on '-q', '--query QUERY', 'query specified snippets' do |query| + @options[:command] = 'query' + @options[:query] = query + end + opts.on '-s', '--show SNIPPET_NAME', 'show specified snippet description' do |snippet_name| + @options[:command] = 'show' + @options[:snippet_name] = snippet_name + end opts.on '-r', '--run SNIPPET_NAMES', 'run specified snippets' do |snippet_names| - Configuration.instance.set 'snippet_names', snippet_names.split(',') + @options[:snippet_names] = snippet_names.split(',').map(&:strip) end end paths = optparse.parse(args) Configuration.instance.set :path, paths.first || Dir.pwd + end + # Load all rewriters. + def load_rewriters Dir.glob(File.join(File.dirname(__FILE__), 'snippets/**/*.rb')).each { |file| eval(File.read(file)) } - Configuration.instance.get('snippet_paths').each do |snippet_path| + + @options[:snippet_paths].each do |snippet_path| if snippet_path =~ /^http/ uri = URI.parse snippet_path eval(uri.read) else eval(File.read(snippet_path)) end end - Configuration.instance.get('snippet_names').each do |snippet_name| - puts "===== #{snippet_name} started =====" - rewriter = Rewriter.call snippet_name - puts rewriter.todo_list if rewriter.todo_list - puts "===== #{snippet_name} done =====" + end + + # List and print all available rewriters. + def list_available_rewriters + Rewriter.availables.each do |rewriter| + print rewriter.name + " " end + puts + end - if :list == command - puts "%-40s %s" % ['name', 'description'] - puts "%-40s %s" % ['----', '-----------'] - Rewriter.availables.each do |rewriter| - puts "%-40s %s" % [rewriter.name, rewriter.description] + # Query and print available rewriters. + def query_available_rewriters + Rewriter.availables.each do |rewriter| + if rewriter.name.include? @options[:query] + print rewriter.name + " " end + end + puts + end + + # Show and print one rewriter. + def show_rewriter + rewriter = Rewriter.fetch(@options[:snippet_name]) + if rewriter + rewriter.process_with_sandbox + puts rewriter.description + rewriter.sub_snippets.each do |sub_rewriter| + puts + puts "=" * 80 + puts "snippet: #{sub_rewriter.name}" + puts "=" * 80 + puts sub_rewriter.description + end + else + puts "snippet #{@options[:snippet_name]} not found" end end end end