https://github.com/baweaver/refactor Skip to content Navigation Menu Toggle navigation Sign in * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} baweaver / refactor Public * Notifications * Fork 0 * Star 58 * Utilities for refactoring and upgrading Ruby code based on ASTs. License MIT license 58 stars 0 forks Branches Tags Activity Star Notifications * Code * Issues 1 * Pull requests 0 * Discussions * Actions * Projects 0 * Security * Insights Additional navigation options * Code * Issues * Pull requests * Discussions * Actions * Projects * Security * Insights baweaver/refactor This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. main BranchesTags Go to file Code Folders and files Name Name Last commit Last commit message date Latest commit History 4 Commits .github/workflows .github/workflows bin bin lib lib refactor_rules refactor_rules sandbox sandbox sig sig spec spec .gitignore .gitignore .rspec .rspec .rubocop.yml .rubocop.yml .ruby-version .ruby-version CHANGELOG.md CHANGELOG.md CODE_OF_CONDUCT.md CODE_OF_CONDUCT.md Gemfile Gemfile Gemfile.lock Gemfile.lock Guardfile Guardfile LICENSE.txt LICENSE.txt README.md README.md Rakefile Rakefile refactor.gemspec refactor.gemspec View all files Repository files navigation * README * Code of conduct * MIT license Refactor Utilities for refactoring and upgrading Ruby code based on ASTs. Consider reading ASTs in Ruby - Pattern Matching as a primer for using this gem, as it will introduce concepts of pattern matching and ASTs in more detail. Original Attribution This gem is a continuation of the work by @afeld and their Refactor gem here: https://github.com/afeld/refactor Usage Refactor works via rules, similar to RuboCop: # Inherits from base rule, which provides a lot of utilities # to match and replace with. class ShorthandRule < Refactor::Rule # The code we're trying to work with here is: # # [1, 2, 3].select { |v| v.even? } # # ...and we want to make it into: # # [1, 2, 3].select(&:even?) # def on_block(node) return unless node in [:block, receiver, [[:arg, arg_name]], [:send, [:lvar, ^arg_name], method_name] ] replace(node, "#{receiver.source}(&:#{method_name})") end end ShorthandRule.process("[1, 2, 3].select { |v| v.even? }") # => [1, 2, 3].select(&:even?) If we add multiple rules we'll want to use a Rewriter instead to apply all of them without the potential for collision: class BigDecimalRule < Refactor::Rule def on_send(node) return unless node in [:send, _, :BigDecimal, [:float | :int, value] ] replace(node, "BigDecimal('#{value}')") end end class HashRefDefaultRule < Refactor::Rule def on_send(node) return unless node in [:send, [:const, nil, :Hash], :new, [:array | :hash] => reference_value ] replace(node, "Hash.new { |h, k| h[k] = #{reference_value.source} }") end end rewriter = Refactor::Rewriter.new(rules: [ShorthandRule, BigDecimalRule, HashRefDefaultRule]) rewriter.process <<~RUBY [1, 2, 3].select { |v| v.even? } value = BigDecimal(5.3) groups = Hash.new({}) RUBY # => <<~RUBY # [1, 2, 3].select(&:even?) # # value = BigDecimal('5.3') # groups = Hash.new { |h, k| h[k] = {} } # RUBY Why Not RuboCop? In most cases you likely want to use RuboCop as it has more robust support and testing. This gem is currently more experimental and focused exclusively on refactoring and AST manipulations in a more minimal sense. Installation Install the gem and add to the application's Gemfile by executing: bundle add refactor If bundler is not being used to manage dependencies, install the gem by executing: gem install refactor Development After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org. Contributing Bug reports and pull requests are welcome on GitHub at https:// github.com/baweaver/refactor. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct. License The gem is available as open source under the terms of the MIT License. Code of Conduct Everyone interacting in the Refactor project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct. About Utilities for refactoring and upgrading Ruby code based on ASTs. Resources Readme License MIT license Code of conduct Code of conduct Activity Stars 58 stars Watchers 2 watching Forks 0 forks Report repository Releases No releases published Packages 0 No packages published Languages * Ruby 99.4% * Shell 0.6% Footer (c) 2024 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact * Manage cookies * Do not share my personal information You can't perform that action at this time.