synvert-core-ruby
Synvert core provides a set of DSLs to rewrite ruby code. e.g.
Synvert::Rewriter.new 'factory_bot', 'convert_factory_girl_to_factory_bot' do
description <<~EOS
It converts FactoryGirl to FactoryBot
```ruby
require 'factory_girl'
require 'factory_girl_rails'
```
=>
```ruby
require 'factory_bot'
require 'factory_bot_rails'
```
```ruby
FactoryGirl.create(:user)
FactoryGirl.build(:user)
```
=>
```ruby
FactoryBot.create(:user)
FactoryBot.build(:user)
```
EOS
within_files Synvert::RAILS_TEST_FILES do
find_node '.const[name=FactoryGirl]' do
replace_with 'FactoryBot'
end
find_node ".send[receiver=nil][message=require][arguments.size=1][arguments.first='factory_girl']" do
replace :arguments, with: "'factory_bot'"
end
with_node type: 'send', receiver: nil, message: 'require', arguments: { size: 1, first: "'factory_girl_rails'" } do
replace :arguments, with: "'factory_bot_rails'"
end
end
end
Want to see more examples, check out synvert-snippets-ruby.
Want to use the CLI, check out synvert-ruby.
DSLs are as follows
- description - set description of the rewriter
- if_ruby - check if ruby version is greater than or equal to the specified ruby version
- if_gem - compare version of specified gem
- within_files - find specified files
- within_file - alias to within_files
- add_file - add a new file
- remove_file - remove a file
- helper_method - define a helper method
- add_snippet - call another rewriter
- todo - set todo
- redo_until_no_change - run the snippet until no change
Scopes:
- find_node - recursively find matching ast nodes by node query language
- within_node - recursively find matching ast nodes
- with_node - alias to within_node
- goto_node - go to a child node
Conditions:
- if_exist_node - check if matching node exist in the child nodes
- unless_exist_node - check if matching node doesn't exist in the child nodes
- if_only_exist_node - check if current node has only one child node and the child node matches rules
Actions:
- append - append the code to the bottom of current node body
- prepend - prepend the code to the bottom of current node body
- insert - insert code
- insert_after - insert the code next to the current node
- replace - replace the code of specified child nodes
- delete - delete the code specified child nodes
- wrap - wrap the current node with code
- replace_with - replace the whole code of current node
- warn - warn message
- replace_erb_stmt_with_expr - replace erb stmt code to expr code
- noop - no operation