Sha256: 4797fd6ac1ed9a0a4aba70467ff8c60a51356a6b6771716b74d6211096a761bb

Contents?: true

Size: 1.92 KB

Versions: 9

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

module AnnotateRb
  module ModelAnnotator
    module ForeignKeyAnnotation
      class AnnotationBuilder
        def initialize(model, options)
          @model = model
          @options = options
        end

        def build
          fk_info = if @options[:format_markdown]
            "#\n# ### Foreign Keys\n#\n"
          else
            "#\n# Foreign Keys\n#\n"
          end

          return "" unless @model.connection.respond_to?(:supports_foreign_keys?) &&
            @model.connection.supports_foreign_keys? && @model.connection.respond_to?(:foreign_keys)

          foreign_keys = @model.connection.foreign_keys(@model.table_name)
          return "" if foreign_keys.empty?

          format_name = lambda do |fk|
            return fk.options[:column] if fk.name.blank?

            @options[:show_complete_foreign_keys] ? fk.name : fk.name.gsub(/(?<=^fk_rails_)[0-9a-f]{10}$/, "...")
          end

          max_size = foreign_keys.map(&format_name).map(&:size).max + 1
          foreign_keys.sort_by { |fk| [format_name.call(fk), fk.column] }.each do |fk|
            ref_info = "#{fk.column} => #{fk.to_table}.#{fk.primary_key}"
            constraints_info = ""
            constraints_info += "ON DELETE => #{fk.on_delete} " if fk.on_delete
            constraints_info += "ON UPDATE => #{fk.on_update} " if fk.on_update
            constraints_info = constraints_info.strip

            fk_info += if @options[:format_markdown]
              format("# * `%s`%s:\n#     * **`%s`**\n",
                format_name.call(fk),
                constraints_info.blank? ? "" : " (_#{constraints_info}_)",
                ref_info)
            else
              format("#  %-#{max_size}.#{max_size}s %s %s",
                format_name.call(fk),
                "(#{ref_info})",
                constraints_info).rstrip + "\n"
            end
          end

          fk_info
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
annotaterb-4.9.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.7.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.6.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.5.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.4.1 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.4.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.3.1 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.3.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
annotaterb-4.2.0 lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb