From 3f371c268a49968004860e54d1c0aa08316af32a Mon Sep 17 00:00:00 2001 From: Weston Ganger Date: Mon, 9 May 2016 14:56:36 -0700 Subject: [PATCH 1/3] convert default_scopes, retain leading whitespace on converted lines, strip leading/trailing whitespace within parenthesis, remove first and all from finders to not match javascript methods, parse rb, erb, haml, & slim --- lib/arel_converter.rb | 2 ++ lib/arel_converter/active_record_finder.rb | 2 +- lib/arel_converter/base.rb | 7 +++++- lib/arel_converter/command.rb | 1 + lib/arel_converter/default_scope.rb | 22 +++++++++++++++++ lib/arel_converter/translators/base.rb | 20 ++++++++++++++-- .../translators/default_scope.rb | 24 +++++++++++++++++++ lib/arel_converter/translators/options.rb | 2 +- 8 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 lib/arel_converter/default_scope.rb create mode 100644 lib/arel_converter/translators/default_scope.rb diff --git a/lib/arel_converter.rb b/lib/arel_converter.rb index 72a2162..51b85d3 100644 --- a/lib/arel_converter.rb +++ b/lib/arel_converter.rb @@ -10,6 +10,7 @@ require File.join('arel_converter', 'formatter') require File.join('arel_converter', 'active_record_finder') require File.join('arel_converter', 'scope') +require File.join('arel_converter', 'default_scope') require File.join('arel_converter', 'association') require File.join('arel_converter', 'replacement') @@ -17,6 +18,7 @@ require File.join('arel_converter', 'translators', 'base') require File.join('arel_converter', 'translators', 'options') require File.join('arel_converter', 'translators', 'scope') +require File.join('arel_converter', 'translators', 'default_scope') require File.join('arel_converter', 'translators', 'finder') require File.join('arel_converter', 'translators', 'association') diff --git a/lib/arel_converter/active_record_finder.rb b/lib/arel_converter/active_record_finder.rb index 432bee4..444c862 100644 --- a/lib/arel_converter/active_record_finder.rb +++ b/lib/arel_converter/active_record_finder.rb @@ -3,7 +3,7 @@ class ActiveRecordFinder < Base def grep_matches_in_file(file) raw_ar_finders = '' - ["find(:all", "find(:first", "find.*:conditions =>", '\.all(', '\.first('].each do |v| + ["find(:all", "find(:first", "find.*:conditions =>"].each do |v| raw_ar_finders += `grep -hr '#{v}' #{file}` end diff --git a/lib/arel_converter/base.rb b/lib/arel_converter/base.rb index 9f53bbd..bc39c04 100644 --- a/lib/arel_converter/base.rb +++ b/lib/arel_converter/base.rb @@ -13,7 +13,12 @@ def run! end def parse_directory(path) - Dir[File.join(path, '**/*.rb')].each do |file| + [ + Dir[File.join(path, '**/*.haml')], + Dir[File.join(path, '**/*.erb')], + Dir[File.join(path, '**/*.slim')], + Dir[File.join(path, '**/*.rb')] + ].flatten.each do |file| begin parse_file(file) rescue => e diff --git a/lib/arel_converter/command.rb b/lib/arel_converter/command.rb index 43f34b6..c1bd320 100644 --- a/lib/arel_converter/command.rb +++ b/lib/arel_converter/command.rb @@ -22,6 +22,7 @@ def run! if @translators.include?('scope') puts "\n== Checking Scopes" ArelConverter::Scope.new(options[:path], options).run! + ArelConverter::DefaultScope.new(options[:path], options).run! end if @translators.include?('finder') diff --git a/lib/arel_converter/default_scope.rb b/lib/arel_converter/default_scope.rb new file mode 100644 index 0000000..e8c5088 --- /dev/null +++ b/lib/arel_converter/default_scope.rb @@ -0,0 +1,22 @@ +module ArelConverter + class DefaultScope < Base + + def grep_matches_in_file(file) + raw_named_scopes = `grep -h -r "^\s*default_scope" #{file}` + raw_named_scopes.split("\n") + end + + def process_line(line) + new_scope = ArelConverter::Translator::Scope.translate(line) + new_scope.gsub(/default_scope\((.*)\)$/, 'default_scope \1') + end + + def verify_line(line) + parser = RubyParser.new + sexp = parser.process(line) + sexp[0] == :call && sexp[2] == :default_scope + end + + end + +end diff --git a/lib/arel_converter/translators/base.rb b/lib/arel_converter/translators/base.rb index a44b464..16a78ec 100644 --- a/lib/arel_converter/translators/base.rb +++ b/lib/arel_converter/translators/base.rb @@ -2,13 +2,25 @@ module ArelConverter module Translator class Base < Ruby2Ruby + attr_accessor :leading_whitespace + LINE_LENGTH = 1_000 def self.translate(klass_or_str, method = nil) - sexp = klass_or_str.is_a?(String) ? self.parse(klass_or_str) : klass_or_str + leading_whitespace = nil + if klass_or_str.is_a?(String) + match = klass_or_str.match(/^(\s+)/) + if match[0] + leading_whitespace = match[0] + end + sexp = self.parse(klass_or_str) + else + sexp = klass_or_str + end processor = self.new + processor.leading_whitespace = leading_whitespace source = processor.process(sexp) - processor.post_processing(source) + processor.retain_leading_whitespace(processor.post_processing(source)) end def self.parse(code) @@ -23,6 +35,10 @@ def post_processing(source) source end + def retain_leading_whitespace(source) + leading_whitespace ? source.prepend(leading_whitespace) : source + end + def format_for_hash(key, value) key =~ /\A:/ ? "#{key.sub(':','')}: #{value}" : "#{key} => #{value}" end diff --git a/lib/arel_converter/translators/default_scope.rb b/lib/arel_converter/translators/default_scope.rb new file mode 100644 index 0000000..b273060 --- /dev/null +++ b/lib/arel_converter/translators/default_scope.rb @@ -0,0 +1,24 @@ +module ArelConverter + module Translator + class DefaultScope < Base + + def process_call(exp) + @options = Options.translate(exp.pop) if exp[1] == :default_scope + super + end + + def post_processing(new_scope) + new_scope.gsub!(/default_scope\((.*)\)$/, 'default_scope \1') + new_scope += format_options(@options) + end + + protected + + def format_options(options) + return if options.nil? || options.empty? + " { #{options.strip} }" + end + + end + end +end diff --git a/lib/arel_converter/translators/options.rb b/lib/arel_converter/translators/options.rb index 578045b..45f3b44 100644 --- a/lib/arel_converter/translators/options.rb +++ b/lib/arel_converter/translators/options.rb @@ -48,7 +48,7 @@ def hash_to_arel(lhs, rhs) when 'none', 'reverse_order' return key end - rhs = rhs.gsub(/\A\[(.*)\]\z/, '\1').gsub(/\A\{(.*)\}\z/, '\1') + rhs = rhs.gsub(/\A\[(.*)\]\z/, '\1').gsub(/\A\{(.*)\}\z/, '\1').strip "#{key}(#{rhs})" end From 1006276ffdfcf206eaa9d000f2fcc59051ede89f Mon Sep 17 00:00:00 2001 From: Weston Ganger Date: Tue, 10 May 2016 09:02:52 -0700 Subject: [PATCH 2/3] Update default_scope.rb --- lib/arel_converter/default_scope.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/arel_converter/default_scope.rb b/lib/arel_converter/default_scope.rb index e8c5088..5d45170 100644 --- a/lib/arel_converter/default_scope.rb +++ b/lib/arel_converter/default_scope.rb @@ -7,7 +7,7 @@ def grep_matches_in_file(file) end def process_line(line) - new_scope = ArelConverter::Translator::Scope.translate(line) + new_scope = ArelConverter::Translator::DefaultScope.translate(line) new_scope.gsub(/default_scope\((.*)\)$/, 'default_scope \1') end From 6037e4557a509d426fd990d7854d6df78f60a591 Mon Sep 17 00:00:00 2001 From: Weston Ganger Date: Tue, 10 May 2016 12:54:43 -0700 Subject: [PATCH 3/3] Update association.rb --- lib/arel_converter/association.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/arel_converter/association.rb b/lib/arel_converter/association.rb index d7a0577..5e3582a 100644 --- a/lib/arel_converter/association.rb +++ b/lib/arel_converter/association.rb @@ -2,7 +2,7 @@ module ArelConverter class Association < Base def grep_matches_in_file(file) - raw_named_scopes = `grep -hr "^\s*has_\\|belongs_to" #{file}` + raw_named_scopes = `grep -hr "^\s*has_one\\|has_many\\|has_and_belongs_to_many\\|belongs_to" #{file}` raw_named_scopes.split("\n") end