lib/synvert/cli.rb in synvert-0.11.1 vs lib/synvert/cli.rb in synvert-0.12.0
- old
+ new
@@ -39,10 +39,12 @@
when 'show'
load_rewriters
show_rewriter
when 'sync'
sync_snippets
+ when 'generate'
+ generate_snippet
else
# run
load_rewriters
@options[:snippet_names].each do |snippet_name|
puts "===== #{snippet_name} started ====="
@@ -110,12 +112,18 @@
opts.on '-r',
'--run SNIPPET_NAMES',
'run specified snippets, each SNIPPET_NAME is combined by group and name, e.g. ruby/new_hash_syntax,ruby/new_lambda_syntax' do |snippet_names|
@options[:snippet_names] = snippet_names.split(',').map(&:strip)
end
+ opts.on '-g',
+ '--generate NEW_SNIPPET_NAME',
+ 'generate a new snippet' do |name|
+ @options[:command] = 'generate'
+ @options[:snippet_name] = name
+ end
opts.on '-v', '--version', 'show this version' do
- puts VERSION
+ puts "#{VERSION} (with synvert-core #{Core::VERSION} and parser #{Parser::VERSION})"
exit
end
end
paths = optparse.parse(args)
Core::Configuration.path = paths.first || Dir.pwd
@@ -239,9 +247,57 @@
puts 'synvert snippets are synced'
core_version = Snippet.fetch_core_version
if Gem::Version.new(core_version) > Gem::Version.new(Synvert::Core::VERSION)
puts "synvert-core is updated, please install synvert-core #{core_version}"
end
+ end
+
+ # generate a new snippet
+ def generate_snippet
+ group, name = @options[:snippet_name].split('/')
+ FileUtils.mkdir_p("lib/#{group}")
+ FileUtils.mkdir_p("spec/#{group}")
+ lib_content = <<~EOF
+ # frozen_string_literal: true
+
+ Synvert::Rewriter.new '#{group}', '#{name}' do
+ description <<~EOS
+ It convert Foo to Bar
+
+ ```ruby
+ Foo
+ ```
+
+ =>
+
+ ```ruby
+ Bar
+ ```
+ EOS
+
+ within_files '**/*.rb' do
+ with_node type: 'const', to_source: 'Foo' do
+ replace_with 'Bar'
+ end
+ end
+ end
+ EOF
+ spec_content = <<~EOF
+ # frozen_string_literal: true
+
+ require 'spec_helper'
+
+ RSpec.describe 'Convert Foo to Bar' do
+ let(:rewriter_name) { '#{group}/#{name}' }
+ let(:fake_file_path) { 'foobar.rb' }
+ let(:test_content) { 'Foo' }
+ let(:test_rewritten_content) { 'Bar' }
+
+ include_examples 'convertable'
+ end
+ EOF
+ File.write("lib/#{group}/#{name}.rb", lib_content)
+ File.write("spec/#{group}/#{name}_spec.rb", spec_content)
end
def default_snippets_path
File.join(ENV['HOME'], '.synvert')
end