|
#!/usr/bin/env ruby |
|
require 'digest' |
|
require 'colorize' |
|
|
|
def marker_templates |
|
[ |
|
{param_key: 'rb', extension_regexp: '\.rb', marker: -> (digest){digest}}, |
|
{param_key: 'haml', extension_regexp: '\.html\.haml', marker: -> (digest){"#hook-#{digest}"}}, |
|
{param_key: 'erb', extension_regexp: '\.html\.erb', marker: -> (digest){"<div id=\"hook-#{digest}\"></div>"}}, |
|
{param_key: 'coffee', extension_regexp: '\.js\.coffee', marker: -> (digest){"i_#{digest} = null"}}, |
|
{param_key: 'js', extension_regexp: '\.js', marker: -> (digest){"var i_#{digest} = null;"}} |
|
] |
|
end |
|
|
|
def mark_file(full_filename, file_content, hook_tag, digest, delete_markers_mode, key_format_regexp, marker_template) |
|
mark_exist = file_content[Regexp.new digest] |
|
digest_filename = "#{digest} #{full_filename}".white |
|
puts "delete marks: #{delete_markers_mode}, file #{full_filename}".yellow + " - complies to extension_regexp".white + " #{key_format_regexp}".green |
|
if delete_markers_mode && mark_exist |
|
marker_regexp = Regexp.new("^[^\x0d\x0a]*?#{digest}[^\x0d\x0a]*?(\x0d?\x0a)", Regexp::MULTILINE) |
|
File.write(full_filename, file_content.gsub(marker_regexp, "")) |
|
puts "hook_tag = #{marker_regexp} unmarked - ".red + digest_filename |
|
true |
|
elsif delete_markers_mode && !mark_exist |
|
puts " not yet marked - ".cyan + digest_filename |
|
false |
|
elsif !delete_markers_mode && !mark_exist |
|
if marker_template[:param_key] == 'rb' |
|
replace_regexp = /^([ \x09]*)(def [^\x0d\x0a]+)(\x0d?\x0a)/m |
|
replacement = "\\1\\2\\3\\1 Rails.logger.debug anchor: '#{hook_tag.gsub("'", '"')}: \\2'\\3" |
|
replaced_content = file_content.gsub(replace_regexp, replacement) |
|
File.write(full_filename, replaced_content) |
|
else |
|
new_line = file_content[/\x0d\x0a/] ? "\x0d\x0a" : "\n" |
|
File.write(full_filename, "#{hook_tag}#{new_line}#{file_content}") |
|
end |
|
puts " marked - ".green + digest_filename |
|
true |
|
elsif mark_exist |
|
puts " already marked - ".cyan + digest_filename |
|
false |
|
end |
|
end |
|
|
|
puts '============== This id a code marker for Rails ==============' |
|
files = Dir.glob("#{Dir.pwd}/**/*") |
|
filenames = [] |
|
filehashes = [] |
|
argv_string = ARGV.join(',') |
|
marker_template_keys_regexp = Regexp.new( marker_templates.map { |template| |
|
template[:param_key] |
|
}.join('|')) |
|
key_format_regexp = Regexp.new "#{argv_string.gsub(',', '|')}$" |
|
arguments_has_format_keys = argv_string[marker_template_keys_regexp] |
|
enabled_formats_regexps = [] |
|
marker_templates.each do |template| |
|
if argv_string[template[:param_key]] || !arguments_has_format_keys |
|
enabled_formats_regexps << template[:extension_regexp] |
|
end |
|
end |
|
enabled_formats_regexp = Regexp.new enabled_formats_regexps.join('|') + '$' |
|
marker_tempate_filenames_regexp = Regexp.new( marker_templates.map { |template| |
|
template[:extension_regexp] |
|
}.join('|')+'$') |
|
|
|
delete_markers_mode = argv_string[/\boff\b/] |
|
files.each do |full_filename| |
|
if full_filename[enabled_formats_regexp] |
|
filenames << full_filename |
|
digest = Digest::SHA256.hexdigest(full_filename)[0..9] |
|
filehashes << digest |
|
marker_templates.each do |marker_template| |
|
file_content = File.read(full_filename) |
|
hook_tag = marker_template[:marker].call(digest) |
|
that_template = full_filename[Regexp.new marker_template[:extension_regexp]] |
|
if that_template |
|
puts "that_template: #{that_template}" |
|
if mark_file(full_filename, file_content, hook_tag, digest, delete_markers_mode, key_format_regexp, marker_template) |
|
break |
|
end |
|
end |
|
end |
|
end |
|
end |
|
filehashes = filehashes.uniq |
|
puts filenames.length == filehashes.length |
|
|