Commit e315405c by Alexander Belozerov Committed by Cuong Tran

Do not remove magic comments (AnnotateRoutes) (#520)

parent fd67ed46
...@@ -38,7 +38,13 @@ module AnnotateRoutes ...@@ -38,7 +38,13 @@ module AnnotateRoutes
def header(options = {}) def header(options = {})
routes_map = app_routes_map(options) routes_map = app_routes_map(options)
magic_comments_map, routes_map = extract_magic_comments_from_array(routes_map)
out = [] out = []
magic_comments_map.each do |magic_comment|
out << magic_comment
end
out += ["# #{options[:wrapper_open]}"] if options[:wrapper_open] out += ["# #{options[:wrapper_open]}"] if options[:wrapper_open]
out += ["# #{options[:format_markdown] ? PREFIX_MD : PREFIX}" + (options[:timestamp] ? " (Updated #{Time.now.strftime('%Y-%m-%d %H:%M')})" : '')] out += ["# #{options[:format_markdown] ? PREFIX_MD : PREFIX}" + (options[:timestamp] ? " (Updated #{Time.now.strftime('%Y-%m-%d %H:%M')})" : '')]
...@@ -82,6 +88,28 @@ module AnnotateRoutes ...@@ -82,6 +88,28 @@ module AnnotateRoutes
end end
end end
def self.magic_comment_matcher
Regexp.new(/(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/)
end
# @param [Array<String>] content
# @return [Array<String>] all found magic comments
# @return [Array<String>] content without magic comments
def self.extract_magic_comments_from_array(content_array)
magic_comments = []
new_content = []
content_array.map do |row|
if row =~ magic_comment_matcher
magic_comments << row.strip
else
new_content << row
end
end
[magic_comments, new_content]
end
def self.app_routes_map(options) def self.app_routes_map(options)
routes_map = `rake routes`.chomp("\n").split(/\n/, -1) routes_map = `rake routes`.chomp("\n").split(/\n/, -1)
...@@ -143,9 +171,10 @@ module AnnotateRoutes ...@@ -143,9 +171,10 @@ module AnnotateRoutes
end end
def self.annotate_routes(header, content, where_header_found, options = {}) def self.annotate_routes(header, content, where_header_found, options = {})
magic_comments_map, content = extract_magic_comments_from_array(content)
if %w(before top).include?(options[:position_in_routes]) if %w(before top).include?(options[:position_in_routes])
header = header << '' if content.first != '' header = header << '' if content.first != ''
new_content = header + content new_content = magic_comments_map + header + content
else else
# Ensure we have adequate trailing newlines at the end of the file to # Ensure we have adequate trailing newlines at the end of the file to
# ensure a blank line separating the content from the annotation. # ensure a blank line separating the content from the annotation.
...@@ -155,7 +184,7 @@ module AnnotateRoutes ...@@ -155,7 +184,7 @@ module AnnotateRoutes
# the spacer we put in the first time around. # the spacer we put in the first time around.
content.shift if where_header_found == :before && content.first == '' content.shift if where_header_found == :before && content.first == ''
new_content = content + header new_content = magic_comments_map + content + header
end end
new_content new_content
......
...@@ -11,6 +11,22 @@ describe AnnotateRoutes do ...@@ -11,6 +11,22 @@ describe AnnotateRoutes do
@mock_file ||= double(File, stubs) @mock_file ||= double(File, stubs)
end end
def magic_comments_list_each
[
'# encoding: UTF-8',
'# coding: UTF-8',
'# -*- coding: UTF-8 -*-',
'#encoding: utf-8',
'# encoding: utf-8',
'# -*- encoding : utf-8 -*-',
"# encoding: utf-8\n# frozen_string_literal: true",
"# frozen_string_literal: true\n# encoding: utf-8",
'# frozen_string_literal: true',
'#frozen_string_literal: false',
'# -*- frozen_string_literal : true -*-'
].each { |magic_comment| yield magic_comment }
end
it 'should check if routes.rb exists' do it 'should check if routes.rb exists' do
expect(File).to receive(:exists?).with(ROUTE_FILE).and_return(false) expect(File).to receive(:exists?).with(ROUTE_FILE).and_return(false)
expect(AnnotateRoutes).to receive(:puts).with("Can't find routes.rb") expect(AnnotateRoutes).to receive(:puts).with("Can't find routes.rb")
...@@ -18,21 +34,29 @@ describe AnnotateRoutes do ...@@ -18,21 +34,29 @@ describe AnnotateRoutes do
end end
describe 'Annotate#example' do describe 'Annotate#example' do
before(:each) do let(:rake_routes_content) do
expect(File).to receive(:exists?).with(ROUTE_FILE).and_return(true) " Prefix Verb URI Pattern Controller#Action
expect(File).to receive(:read).with(ROUTE_FILE).and_return("")
expect(AnnotateRoutes).to receive(:`).with('rake routes').and_return(" Prefix Verb URI Pattern Controller#Action
myaction1 GET /url1(.:format) mycontroller1#action myaction1 GET /url1(.:format) mycontroller1#action
myaction2 POST /url2(.:format) mycontroller2#action myaction2 POST /url2(.:format) mycontroller2#action
myaction3 DELETE|GET /url3(.:format) mycontroller3#action\n") myaction3 DELETE|GET /url3(.:format) mycontroller3#action\n"
end
expect(AnnotateRoutes).to receive(:puts).with(ANNOTATION_ADDED) before(:each) do
expect(File).to receive(:exists?).with(ROUTE_FILE).and_return(true).at_least(:once)
expect(File).to receive(:read).with(ROUTE_FILE).and_return("").at_least(:once)
expect(AnnotateRoutes).to receive(:puts).with(ANNOTATION_ADDED).at_least(:once)
end end
it 'annotate normal' do context 'without magic comments' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file) before(:each) do
expect(@mock_file).to receive(:puts).with(" expect(AnnotateRoutes).to receive(:`).with('rake routes').and_return(rake_routes_content)
end
it 'annotate normal' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with("
# == Route Map # == Route Map
# #
# Prefix Verb URI Pattern Controller#Action # Prefix Verb URI Pattern Controller#Action
...@@ -40,12 +64,12 @@ describe AnnotateRoutes do ...@@ -40,12 +64,12 @@ describe AnnotateRoutes do
# myaction2 POST /url2(.:format) mycontroller2#action # myaction2 POST /url2(.:format) mycontroller2#action
# myaction3 DELETE|GET /url3(.:format) mycontroller3#action\n") # myaction3 DELETE|GET /url3(.:format) mycontroller3#action\n")
AnnotateRoutes.do_annotations AnnotateRoutes.do_annotations
end end
it 'annotate markdown' do it 'annotate markdown' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file) expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with(" expect(@mock_file).to receive(:puts).with("
# ## Route Map # ## Route Map
# #
# Prefix | Verb | URI Pattern | Controller#Action # Prefix | Verb | URI Pattern | Controller#Action
...@@ -54,12 +78,72 @@ describe AnnotateRoutes do ...@@ -54,12 +78,72 @@ describe AnnotateRoutes do
# myaction2 | POST | /url2(.:format) | mycontroller2#action # myaction2 | POST | /url2(.:format) | mycontroller2#action
# myaction3 | DELETE-GET | /url3(.:format) | mycontroller3#action\n") # myaction3 | DELETE-GET | /url3(.:format) | mycontroller3#action\n")
AnnotateRoutes.do_annotations(format_markdown: true) AnnotateRoutes.do_annotations(format_markdown: true)
end
it 'wraps annotation if wrapper is specified' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with("
# START
# == Route Map
#
# Prefix Verb URI Pattern Controller#Action
# myaction1 GET /url1(.:format) mycontroller1#action
# myaction2 POST /url2(.:format) mycontroller2#action
# myaction3 DELETE|GET /url3(.:format) mycontroller3#action
# END\n")
AnnotateRoutes.do_annotations(wrapper_open: 'START', wrapper_close: 'END')
end
end end
it 'wraps annotation if wrapper is specified' do context 'file with magic comments' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file) it 'should not remove magic comments' do
expect(@mock_file).to receive(:puts).with(" magic_comments_list_each do |magic_comment|
expect(AnnotateRoutes).to receive(:`).with('rake routes')
.and_return("#{magic_comment}\n#{rake_routes_content}")
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with("
#{magic_comment}
# == Route Map
#
# Prefix Verb URI Pattern Controller#Action
# myaction1 GET /url1(.:format) mycontroller1#action
# myaction2 POST /url2(.:format) mycontroller2#action
# myaction3 DELETE|GET /url3(.:format) mycontroller3#action\n")
AnnotateRoutes.do_annotations
end
end
it 'annotate markdown' do
magic_comments_list_each do |magic_comment|
expect(AnnotateRoutes).to receive(:`).with('rake routes')
.and_return("#{magic_comment}\n#{rake_routes_content}")
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with("
#{magic_comment}
# ## Route Map
#
# Prefix | Verb | URI Pattern | Controller#Action
# --------- | ---------- | --------------- | --------------------
# myaction1 | GET | /url1(.:format) | mycontroller1#action
# myaction2 | POST | /url2(.:format) | mycontroller2#action
# myaction3 | DELETE-GET | /url3(.:format) | mycontroller3#action\n")
AnnotateRoutes.do_annotations(format_markdown: true)
end
end
it 'wraps annotation if wrapper is specified' do
magic_comments_list_each do |magic_comment|
expect(AnnotateRoutes).to receive(:`).with('rake routes')
.and_return("#{magic_comment}\n#{rake_routes_content}")
expect(File).to receive(:open).with(ROUTE_FILE, 'wb').and_yield(mock_file)
expect(@mock_file).to receive(:puts).with("
#{magic_comment}
# START # START
# == Route Map # == Route Map
# #
...@@ -69,14 +153,18 @@ describe AnnotateRoutes do ...@@ -69,14 +153,18 @@ describe AnnotateRoutes do
# myaction3 DELETE|GET /url3(.:format) mycontroller3#action # myaction3 DELETE|GET /url3(.:format) mycontroller3#action
# END\n") # END\n")
AnnotateRoutes.do_annotations(wrapper_open: 'START', wrapper_close: 'END') AnnotateRoutes.do_annotations(wrapper_open: 'START', wrapper_close: 'END')
end
end
end end
end end
describe 'When adding' do describe 'When adding' do
before(:each) do before(:each) do
expect(File).to receive(:exists?).with(ROUTE_FILE).and_return(true) expect(File).to receive(:exists?).with(ROUTE_FILE)
expect(AnnotateRoutes).to receive(:`).with('rake routes').and_return('') .and_return(true).at_least(:once)
expect(AnnotateRoutes).to receive(:`).with('rake routes')
.and_return('').at_least(:once)
end end
it 'should insert annotations if file does not contain annotations' do it 'should insert annotations if file does not contain annotations' do
...@@ -112,6 +200,42 @@ describe AnnotateRoutes do ...@@ -112,6 +200,42 @@ describe AnnotateRoutes do
AnnotateRoutes.do_annotations AnnotateRoutes.do_annotations
end end
context 'file with magic comments' do
it 'leaves magic comment on top, adds an empty line between magic comment and annotation (position_in_routes :top)' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb')
.and_yield(mock_file).at_least(:once)
magic_comments_list_each do |magic_comment|
expect(File).to receive(:read).with(ROUTE_FILE).and_return("#{magic_comment}\nSomething")
expect(@mock_file).to receive(:puts).with("#{magic_comment}\n# == Route Map\n#\n\nSomething\n")
expect(AnnotateRoutes).to receive(:puts).with(ANNOTATION_ADDED)
AnnotateRoutes.do_annotations(position_in_routes: 'top')
end
end
it 'leaves magic comment on top, adds an empty line between magic comment and annotation (position_in_routes :bottom)' do
expect(File).to receive(:open).with(ROUTE_FILE, 'wb')
.and_yield(mock_file).at_least(:once)
magic_comments_list_each do |magic_comment|
expect(File).to receive(:read).with(ROUTE_FILE).and_return("#{magic_comment}\nSomething")
expect(@mock_file).to receive(:puts).with("#{magic_comment}\nSomething\n\n# == Route Map\n#\n")
expect(AnnotateRoutes).to receive(:puts).with(ANNOTATION_ADDED)
AnnotateRoutes.do_annotations(position_in_routes: 'bottom')
end
end
it 'skips annotations if file does already contain annotation' do
magic_comments_list_each do |magic_comment|
expect(File).to receive(:read).with(ROUTE_FILE)
.and_return("#{magic_comment}\n\n# == Route Map\n#\n")
expect(AnnotateRoutes).to receive(:puts).with(FILE_UNCHANGED)
AnnotateRoutes.do_annotations
end
end
end
end end
describe 'When adding with older Rake versions' do describe 'When adding with older Rake versions' do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment