Method: AnnotateModels.annotate_one_file
- Defined in:
- lib/annotate/annotate_models.rb
.annotate_one_file(file_name, info_block, position, options = {}) ⇒ Object
Add a schema block to a file. If the file already contains a schema info block (a comment starting with “== Schema Information”), check if it matches the block that is already there. If so, leave it be. If not, remove the old info block and write a new one.
Returns:
true or false depending on whether the file was modified.
Options (opts)
:force<Symbol>:: whether to update the file even if it doesn't seem to need it.
:position_in_*<Symbol>:: where to place the annotated section in fixture or model file,
:before, :top, :after or :bottom. Default is :before.
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 |
# File 'lib/annotate/annotate_models.rb', line 508 def annotate_one_file(file_name, info_block, position, = {}) return false unless File.exist?(file_name) old_content = File.read(file_name) return false if old_content =~ /#{SKIP_ANNOTATION_PREFIX}.*\n/ # Ignore the Schema version line because it changes with each migration header_pattern = /(^# Table name:.*?\n(#.*[\r]?\n)*[\r]?)/ old_header = old_content.match(header_pattern).to_s new_header = info_block.match(header_pattern).to_s column_pattern = /^#[\t ]+[\w\*`]+[\t ]+.+$/ old_columns = old_header && old_header.scan(column_pattern).sort new_columns = new_header && new_header.scan(column_pattern).sort return false if old_columns == new_columns && ![:force] abort "annotate error. #{file_name} needs to be updated, but annotate was run with `--frozen`." if [:frozen] # Replace inline the old schema info with the new schema info wrapper_open = [:wrapper_open] ? "# #{[:wrapper_open]}\n" : "" wrapper_close = [:wrapper_close] ? "# #{[:wrapper_close]}\n" : "" wrapped_info_block = "#{wrapper_open}#{info_block}#{wrapper_close}" old_annotation = old_content.match(annotate_pattern()).to_s # if there *was* no old schema info or :force was passed, we simply # need to insert it in correct position if old_annotation.empty? || [:force] magic_comments_block = magic_comments_as_string(old_content) old_content.gsub!(magic_comment_matcher, '') old_content.sub!(annotate_pattern(), '') new_content = if %w(after bottom).include?([position].to_s) magic_comments_block + (old_content.rstrip + "\n\n" + wrapped_info_block) elsif magic_comments_block.empty? magic_comments_block + wrapped_info_block + "\n" + old_content else magic_comments_block + "\n" + wrapped_info_block + "\n" + old_content end else # replace the old annotation with the new one # keep the surrounding whitespace the same space_match = old_annotation.match(/\A(?<start>\s*).*?\n(?<end>\s*)\z/m) new_annotation = space_match[:start] + wrapped_info_block + space_match[:end] new_content = old_content.sub(annotate_pattern(), new_annotation) end File.open(file_name, 'wb') { |f| f.puts new_content } true end |