Module: DBCode

Extended by:
DBCode
Includes:
ActiveRecord
Included in:
DBCode
Defined in:
lib/dbcode.rb,
lib/dbcode/graph.rb,
lib/dbcode/schema.rb,
lib/dbcode/railtie.rb,
lib/dbcode/version.rb,
lib/dbcode/sql_file.rb

Defined Under Namespace

Classes: Graph, Railtie, SQLFile, Schema, SearchPath

Constant Summary collapse

LoadError =
Class.new RuntimeError
VERSION =
'0.0.2'

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#code_schema_nameObject



12
13
14
# File 'lib/dbcode.rb', line 12

def code_schema_name
  @code_schema_name || 'code'
end

#envObject



30
31
32
# File 'lib/dbcode.rb', line 30

def env
  @env ||= 'development'
end

#loggerObject



24
25
26
# File 'lib/dbcode.rb', line 24

def logger
  @logger ||= Logger.new(STDOUT)
end

#sql_file_pathObject



18
19
20
# File 'lib/dbcode.rb', line 18

def sql_file_path
  @sql_file_path or raise "Configure sql file path. eg: #{self}.#{__method__} = Rails.root"
end

Instance Method Details

#build_graphObject



59
60
61
# File 'lib/dbcode.rb', line 59

def build_graph
  Graph.new files.map &SQLFile.method(:new)
end

#filesObject



63
64
65
66
67
68
69
70
71
# File 'lib/dbcode.rb', line 63

def files
  Dir[sql_file_path.join('**/*.sql').expand_path].sort.map do |file_name|
    path = Pathname(file_name)
    {
      name: path.relative_path_from(sql_file_path).sub(/.sql$/,'').to_s,
      contents: path.read
    }
  end
end

#prepareObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/dbcode.rb', line 36

def prepare
  code = Schema.new connection: Base.connection, name: code_schema_name
  code.append_path!(Base.connection_config)

  return if Migrator.needs_migration?

  code.within_schema do
    graph = build_graph

    if code.digest != graph.digest
      if env == 'production'
        return logger.error "[dbcode] out of date, but refusing to reset #{code.name} in production."
      end
      logger.warn "[dbcode] Resetting schema #{code.name}"
      code.reset!
      code.execute graph.to_sql
      code.digest = graph.digest
    else
      logger.info "[dbcode] Schema #{code.name} is up to date"
    end
  end
end