{"id":26430425,"url":"https://github.com/synvert-hq/synvert-core-ruby","last_synced_at":"2026-03-27T04:04:42.959Z","repository":{"id":16662655,"uuid":"19418254","full_name":"synvert-hq/synvert-core-ruby","owner":"synvert-hq","description":"write snippet code to rewrite your project code","archived":false,"fork":false,"pushed_at":"2024-04-07T08:19:08.000Z","size":1603,"stargazers_count":46,"open_issues_count":3,"forks_count":7,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-04-07T10:35:15.756Z","etag":null,"topics":["ruby","synvert"],"latest_commit_sha":null,"homepage":"https://synvert.net","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/synvert-hq.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2014-05-04T03:42:48.000Z","updated_at":"2024-04-07T08:06:54.000Z","dependencies_parsed_at":"2023-09-28T23:52:29.854Z","dependency_job_id":"342194f1-4065-4b52-9b74-98e0efd3afba","html_url":"https://github.com/synvert-hq/synvert-core-ruby","commit_stats":{"total_commits":673,"total_committers":5,"mean_commits":134.6,"dds":"0.10698365527488851","last_synced_commit":"8f6173b6401b6b6612d74c26a6dc62fad6127604"},"previous_names":["synvert-hq/synvert-core-ruby","xinminlabs/synvert-core-ruby"],"tags_count":204,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synvert-hq%2Fsynvert-core-ruby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synvert-hq%2Fsynvert-core-ruby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synvert-hq%2Fsynvert-core-ruby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synvert-hq%2Fsynvert-core-ruby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/synvert-hq","download_url":"https://codeload.github.com/synvert-hq/synvert-core-ruby/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244164875,"owners_count":20409004,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ruby","synvert"],"created_at":"2025-03-18T05:31:12.264Z","updated_at":"2026-03-27T04:04:37.927Z","avatar_url":"https://github.com/synvert-hq.png","language":"Ruby","readme":"# synvert-core-ruby\n\n\u003cimg src=\"https://synvert.net/img/logo_96.png\" alt=\"logo\" width=\"32\" height=\"32\" /\u003e\n\n[![AwesomeCode Status for synvert-hq/synvert-core-ruby](https://awesomecode.io/projects/033f7f02-7b22-41c3-a902-fca37f1ec72a/status)](https://awesomecode.io/repos/synvert-hq/synvert-core-ruby)\n[![Build Status](https://github.com/synvert-hq/synvert-core-ruby/actions/workflows/main.yml/badge.svg)](https://github.com/synvert-hq/synvert-core-ruby/actions/workflows/main.yml)\n[![Gem Version](https://img.shields.io/gem/v/synvert-core.svg)](https://rubygems.org/gems/synvert-core)\n\nSynvert core provides a set of DSLs to rewrite (find and replace) ruby code. e.g.\n\n```ruby\nSynvert::Rewriter.new 'ruby', 'map_and_flatten_to_flat_map' do\n  configure(parser: Synvert::PARSER_PARSER)\n\n  description \u003c\u003c~EOS\n    It converts `map` and `flatten` to `flat_map`\n\n    ```ruby\n    enum.map do\n      # do something\n    end.flatten\n    ```\n\n    =\u003e\n\n    ```ruby\n    enum.flat_map do\n      # do something\n    end\n    ```\n  EOS\n\n  within_files Synvert::ALL_RUBY_FILES + Synvert::ALL_RAKE_FILES do\n    find_node '.send [receiver=.block [caller=.send[message=map]]] [message=flatten] [arguments.size=0]' do\n      group do\n        delete :message, :dot\n        replace 'receiver.caller.message', with: 'flat_map'\n      end\n    end\n  end\nend\n```\n\nIt also supports to add callbacks to visit ast nodes.\n\n```ruby\nSynvert::Helper.new 'ruby/parse' do |options|\n  configure(parser: Synvert::PRISM_PARSER)\n\n  with_configurations(number_of_workers: 1) do\n    class_names = []\n    within_file Synvert::ALL_RUBY_FILES do\n      add_callback :class_node, at: 'start' do |node|\n        class_names \u003c\u003c node.name.to_source\n      end\n    end\n    # class_names is an array of class names\n  end\nend\n\n```\n\nWant to see more examples, check out [synvert-snippets-ruby](https://github.com/synvert-hq/synvert-snippets-ruby).\n\nWant to use the CLI, check out [synvert-ruby](https://github.com/synvert-hq/synvert-ruby).\n\nDSLs are as follows\n\n* [configure](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#configure-instance_method) - configure the rewriter\n* [description](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#description-instance_method) - describe what the rewriter does\n* [if_ruby](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#if_ruby-instance_method) - check if ruby version is greater than or equal to the specified ruby version\n* [if_gem](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#if_gem-instance_method) - compare version of specified gem\n* [within_files](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#within_files-instance_method) - find specified files\n* [within_file](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#within_file-instance_method) - alias to within_files\n* [add_file](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#add_file-instance_method) - add a new file\n* [remove_file](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#remove_file-instance_method) - remove a file\n* [helper_method](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#helper_method-instance_method) - define a helper method\n* [add_snippet](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#add_snippet-instance_method) - call another rewriter\n* [call_helper](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#call_helper-instance_method) - call a shared rewriter\n* [with_configurations](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#with_configurations-instance_method) - execute a block of code with temporary configurations\n\nScopes:\n\n* [within_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#within_node-instance_method) - recursively find matching ast nodes\n* [with_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#with_node-instance_method) - alias to within_node\n* [find_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#find_node-instance_method) - alias to within_node\n* [goto_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#goto_node-instance_method) - go to a child node\n\nConditions:\n\n* [if_exist_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#if_exist_node-instance_method) - check if matching node exist in the child nodes\n* [unless_exist_node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#unless_exist_node-instance_method) - check if matching node doesn't exist in the child nodes\n\nActions:\n\n* [append](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#append-instance_method) - append the code to the bottom of current node body\n* [prepend](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#prepend-instance_method) - prepend the code to the bottom of current node body\n* [insert](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#insert-instance_method) - insert code\n* [insert_after](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#insert_after-instance_method) - insert the code next to the current node\n* [insert_before](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#insert_before-instance_method) - insert the code previous to the current node\n* [replace](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#replace-instance_method) - replace the code of specified child nodes\n* [delete](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#delete-instance_method) - delete the code in specified child nodes\n* [remove](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#remove-instance_method) - remove the whole code of current node\n* [wrap](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#wrap-instance_method) - wrap the current node with prefix and suffix code\n* [replace_with](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#replace_with-instance_method) - replace the whole code of current node\n* [warn](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#warn-instance_method) - warn message\n* [replace_erb_stmt_with_expr](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#replace_erb_stmt_with_expr-instance_method) - replace erb stmt code to expr code\n* [noop](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#noop-instance_method) - no operation\n* [group](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#group-instance_method) - group actions\n* [add_action](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#add_action-instance_method) - add custom action\n\nCallbacks:\n\n* [add_callback](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#add_callback-instance_method) - add callback when visiting ast nodes\n\nOthers:\n\n* [wrap_with_quotes](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#wrap_with_quotes-instance_method) - wrap string code with single or double quotes\n* [add_leading_spaces](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#add_leading_spaces-instance_method) - add leading spaces before the string code\n\n\nAttributes:\n\n* [file_path](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#file_path-instance_method) - current file path\n* [node](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#node-instance_method) - current ast node\n* [mutation_adapter](https://synvert-hq.github.io/synvert-core-ruby/Synvert/Core/Rewriter/Instance.html#mutation_adapter-instance_method) - [mutation adapter](https://synvert-hq.github.io/node-mutation-ruby/NodeMutation/Adapter.html) to get some helper methods\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynvert-hq%2Fsynvert-core-ruby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsynvert-hq%2Fsynvert-core-ruby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynvert-hq%2Fsynvert-core-ruby/lists"}