Module: RareMap::SchemaParser

Included in:
Mapper
Defined in:
lib/rare_map/schema_parser.rb

Overview

RareMap::SchemaParser parses schema.rb into Table.

Author:

  • Wei-Ming Wu

Instance Method Summary collapse

Instance Method Details

#parse_schema(schema) ⇒ Array

Parses schema.rb into an Array of Table.

Returns:

  • (Array)

    an Array of Table



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 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