module RareMap::SchemaParser

RareMap::SchemaParser parses schema.rb into Table. @author Wei-Ming Wu

Public Instance Methods

parse_schema(schema) click to toggle source

Parses schema.rb into an Array of Table.

@return [Array] an Array of Table

# File lib/rare_map/schema_parser.rb, line 11
def parse_schema(schema)
  tables = []
  
  schema.split(/\n/).each do |line|
    case line.strip!
    when /^create_table/
      name = line.match(/create_table\s+['"]([^'"]+)['"]/)[1]
      id = line.match(/(:id\s*=>|id:)\s*false/) ? false : true
      pk = line.match(/(:primary_key\s*=>|primary_key:)\s*['"](.+)['"]/)
      primary_key = pk[2] if pk
      tables << Table.new(name, :id => id, :primary_key => primary_key)
    when /^t\./
      name = line.match(/t\.\w+\s+['"]([^'"]+)['"]/)[1]
      type = line.match(/t\.(\w+)\s+/)[1]
      tables.last.columns << Column.new(name, type)
    when /^add_index\s+.*\[\s*['"]([^'"]+)['"]\s*\].*(:unique\s*=>|unique:)\s*true/
      unique_column = line.match(/add_index\s+.*\[\s*['"]([^'"]+)['"]\s*\].*(:unique\s*=>|unique:)\s*true/)[1]
      column = tables.last.columns.find { |col| col.name == unique_column }
      column.unique = true
    end
  end
  
  tables
end