Commit 1d8e273f by Alex Buijs

UTF-8 encoding hack

parent 3fae3291
module AnnotateModels
class << self
UTF8 = "-*- encoding: utf-8 -*-"
# Annotate Models plugin use this header
COMPAT_PREFIX = "== Schema Info"
PREFIX = "== Schema Information"
......@@ -117,6 +119,7 @@ module AnnotateModels
def annotate_one_file(file_name, info_block, options={})
if File.exist?(file_name)
old_content = File.read(file_name)
old_content.sub!(/^#.*encoding.*utf-8.*\n/, '')
# Ignore the Schema version line because it changes with each migration
header = Regexp.new(/(^# Table name:.*?\n(#.*\n)*\n)/)
......@@ -126,12 +129,11 @@ module AnnotateModels
if old_header == new_header
false
else
# Replace the old schema info with the new schema info
new_content = old_content.sub(/^# #{COMPAT_PREFIX}.*?\n(#.*\n)*\n/, info_block)
# But, if there *was* no old schema info, we simply need to insert it
if new_content == old_content
new_content = options[:position] == 'before' ? (info_block + old_content) : (old_content + "\n" + info_block)
end
# Remove old schema info
old_content.sub!(/^# #{COMPAT_PREFIX}.*?\n(#.*\n)*\n/, '')
# Write it back
new_content = options[:position] == 'before' ? (info_block + old_content) : (old_content + "\n" + info_block)
File.open(file_name, "wb") { |f| f.puts new_content }
true
......@@ -164,12 +166,12 @@ module AnnotateModels
if annotate_one_file(model_file_name, info, options_with_position(options, :position_in_class))
annotated = true
end
unless ENV['exclude_tests']
[
File.join(UNIT_TEST_DIR, "#{model_name}_test.rb"), # test
File.join(SPEC_MODEL_DIR, "#{model_name}_spec.rb"), # spec
].each do |file|
].each do |file|
# todo: add an option "position_in_test" -- or maybe just ask if anyone ever wants different positions for model vs. test vs. fixture
annotate_one_file(file, info, options_with_position(options, :position_in_fixture))
end
......@@ -180,21 +182,21 @@ module AnnotateModels
File.join(EXEMPLARS_TEST_DIR, "#{model_name}_exemplar.rb"), # Object Daddy
File.join(EXEMPLARS_SPEC_DIR, "#{model_name}_exemplar.rb"), # Object Daddy
File.join(BLUEPRINTS_DIR, "#{model_name}_blueprint.rb"), # Machinist Blueprints
].each do |file|
].each do |file|
annotate_one_file(file, info, options_with_position(options, :position_in_fixture))
end
FIXTURE_DIRS.each do |dir|
fixture_file_name = File.join(dir,klass.table_name + ".yml")
if File.exist?(fixture_file_name)
annotate_one_file(fixture_file_name, info, options_with_position(options, :position_in_fixture))
annotate_one_file(fixture_file_name, info, options_with_position(options, :position_in_fixture))
end
end
end
annotated
end
# position = :position_in_fixture or :position_in_class
def options_with_position(options, position_in)
options.merge(:position=>(options[position_in] || options[:position]))
......@@ -249,7 +251,7 @@ module AnnotateModels
end
end
header = PREFIX.dup
header = "#{UTF8.dup}\n# #{PREFIX.dup}"
if options[:include_version]
version = ActiveRecord::Migrator.current_version rescue 0
......@@ -275,7 +277,7 @@ module AnnotateModels
puts "Unable to annotate #{file}: #{e.inspect}"
puts ""
# todo: check if all backtrace lines are in "gems" -- if so, it's an annotate bug, so print the whole stack trace.
# puts e.backtrace.join("\n\t")
# puts e.backtrace.join("\n\t")
end
end
if annotated.empty?
......@@ -304,12 +306,12 @@ module AnnotateModels
fixture_file_name = File.join(dir,klass.table_name + ".yml")
remove_annotation_of_file(fixture_file_name) if File.exist?(fixture_file_name)
end
[ File.join(UNIT_TEST_DIR, "#{klass.name.underscore}_test.rb"),
File.join(SPEC_MODEL_DIR,"#{klass.name.underscore}_spec.rb")].each do |file|
remove_annotation_of_file(file) if File.exist?(file)
end
end
rescue Exception => e
puts "Unable to annotate #{file}: #{e.message}"
......@@ -328,4 +330,4 @@ module ::ActiveRecord
# ignore this, so unknown/unloaded macros won't cause parsing to fail
end
end
end
end
\ No newline at end of file
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