class SchemaComments::SchemaComment::SortedStore

Public Class Methods

sort_yaml_content!(root) click to toggle source
# File lib/schema_comments/schema_comment.rb, line 157
def self.sort_yaml_content!(root)
  self.validate_yaml!(root)
  table_comments = (root['table_comments'] ||= {})
  column_comments = (root['column_comments'] ||= {})
  # 大元は
  # table_comments:
  #   ...
  # column_comments:
  #   ...
  # その他
  #   ...
  # の順番です。
  root.extend(HashKeyOrderable)
  root.key_order = %w(table_comments column_comments)
  # table_comments はテーブル名のアルファベット順
  table_names = ActiveRecord::Base.connection.tables.sort - ['schema_migrations']
  table_comments.extend(HashKeyOrderable)
  table_comments.key_order = table_names
  # column_comments もテーブル名のアルファベット順
  column_comments.extend(HashKeyOrderable)
  column_comments.key_order = table_names
  # column_comments の各値はテーブルのカラム順
  conn = ActiveRecord::Base.connection
  columns_method = conn.respond_to?(:columns_without_schema_comments) ? :columns_without_schema_comments : :columns
  column_comments.each do |table_name, column_hash|
    column_hash ||= {}
    column_names = nil
    begin
      columns = conn.send(columns_method, table_name)
      column_names = columns.map(&:name)
    rescue ActiveRecord::ActiveRecordError
      column_names = column_hash.keys.sort
    end
    column_names.delete('id')
    raise YamlError, "Broken schame_comments.yml" unless column_hash.is_a?(Hash)
    column_hash.extend(HashKeyOrderable)
    column_hash.key_order = column_names
  end
end
validate_yaml!(root) click to toggle source
# File lib/schema_comments/schema_comment.rb, line 145
def self.validate_yaml!(root)
  table_comments = (root['table_comments'] ||= {})
  column_comments = (root['column_comments'] ||= {})
  # raise YamlError, "Broken schame_comments.yml by invalid root: #{root.inspect}" unless root.is_a?(Hash)
  raise YamlError, "Broken schame_comments.yml by invalid table_comments" unless table_comments.is_a?(Hash)
  raise YamlError, "Broken schame_comments.yml by invalid_column_comments" unless column_comments.is_a?(Hash)
  column_comments.each do |table_name, value|
    next if value.nil?
    raise YamlError, "Broken schame_comments.yml by invalid column_comments for #{table_name}" unless value.is_a?(Hash)
  end
end

Public Instance Methods

dump(table) click to toggle source
# File lib/schema_comments/schema_comment.rb, line 134
def dump(table)
  root = nil
  StringIO.open do |io|
    YAML.dump(@table, io)
    io.rewind
    root = YAML.load(io)
  end
  SortedStore.sort_yaml_content!(root)
  root.to_yaml(@opt)
end