class Prodder::Project

Constants

SeedConfigFileMissing

Attributes

name[R]
workspace[R]

Public Class Methods

new(name, workspace, definition) click to toggle source
# File lib/prodder/project.rb, line 19
def initialize(name, workspace, definition)
  @name = name
  @workspace = workspace
  @defn = definition
end

Public Instance Methods

commit() click to toggle source
# File lib/prodder/project.rb, line 61
def commit
  return unless git.dirty?
  git.add structure_file_name
  git.add seed_file_name
  git.add quality_check_file_name if separate_quality_checks?
  git.add permissions_file_name if dump_permissions?
  git.add settings_file_name
  git.commit "Auto-commit by prodder", @defn['git']['author']
end
db_credentials() click to toggle source
# File lib/prodder/project.rb, line 84
def db_credentials
  @defn['db']
end
dump() click to toggle source
# File lib/prodder/project.rb, line 29
def dump
  FileUtils.mkdir_p File.dirname(structure_file_name)
  pg.dump_structure db_credentials['name'], structure_file_name,
                    exclude_tables: excluded_tables, exclude_schemas: excluded_schemas

  FileUtils.mkdir_p File.dirname(settings_file_name)
  pg.dump_settings db_credentials['name'], settings_file_name

  FileUtils.mkdir_p File.dirname(seed_file_name)
  pg.dump_tables db_credentials['name'], seed_tables, seed_file_name

  # must split the structure file to allow data to be loaded after tables
  # being created but before triggers and foreign keys are created. this
  # facilitates validation during loading, yet avoids extra overhead and
  # false errors
  if separate_quality_checks?
    contents = File.readlines(structure_file_name)
    rgx = /^\-\- .* Type: INDEX; |^\-\- .* Type: TRIGGER; |^\-\- .* Type: FK CONSTRAINT; /
    structure, *quality = contents.slice_before(rgx).to_a

    File.open(quality_check_file_name, 'w') { |f| f.write(quality.join) }
    File.open(structure_file_name, 'w') { |f| f.write(structure.join) }
  end

  if dump_permissions?
    FileUtils.mkdir_p File.dirname(permissions_file_name)
    pg.dump_permissions db_credentials['name'], permissions_file_name, included_users: included_users,
                        exclude_tables: excluded_tables, exclude_schemas: excluded_schemas

  end
end
dump_permissions?() click to toggle source
# File lib/prodder/project.rb, line 124
def dump_permissions?
  @defn.key?('permissions') && permissions.key?('file')
end
excluded_schemas() click to toggle source
# File lib/prodder/project.rb, line 128
def excluded_schemas
  db_credentials['exclude_schemas'] || []
end
excluded_tables() click to toggle source
# File lib/prodder/project.rb, line 132
def excluded_tables
  db_credentials['exclude_tables'] || []
end
git_origin() click to toggle source
# File lib/prodder/project.rb, line 96
def git_origin
  @defn['git']['origin']
end
included_users() click to toggle source
# File lib/prodder/project.rb, line 136
def included_users
  permissions['included_users'] || []
end
init() click to toggle source
# File lib/prodder/project.rb, line 25
def init
  git.clone_or_remote_update
end
local_git_path() click to toggle source
# File lib/prodder/project.rb, line 92
def local_git_path
  workspace
end
nothing_to_push?() click to toggle source
# File lib/prodder/project.rb, line 79
def nothing_to_push?
  git.remote_update
  git.no_new_commits?
end
permissions() click to toggle source
# File lib/prodder/project.rb, line 88
def permissions
  @defn['permissions']
end
permissions_file_name() click to toggle source
# File lib/prodder/project.rb, line 116
def permissions_file_name
  File.join workspace, permissions['file']
end
push() click to toggle source
# File lib/prodder/project.rb, line 71
def push
  if git.fast_forward?
    git.push
  else
    raise Prodder::Git::NotFastForward.new(git_origin)
  end
end
quality_check_file_name() click to toggle source
# File lib/prodder/project.rb, line 112
def quality_check_file_name
  File.join workspace, @defn['quality_check_file']
end
seed_file_name() click to toggle source
# File lib/prodder/project.rb, line 108
def seed_file_name
  File.join workspace, @defn['seed_file']
end
seed_tables() click to toggle source
# File lib/prodder/project.rb, line 140
def seed_tables
  value = db_credentials['tables']
  return value unless value.is_a?(String)

  path = File.join(workspace, value)
  raise SeedConfigFileMissing.new(File.join(name, value)) unless File.exist?(path)
  YAML.load IO.read(path)
end
separate_quality_checks?() click to toggle source
# File lib/prodder/project.rb, line 120
def separate_quality_checks?
  @defn.key? 'quality_check_file'
end
settings_file_name() click to toggle source
# File lib/prodder/project.rb, line 104
def settings_file_name
  File.join workspace, 'db/settings.sql'
end
structure_file_name() click to toggle source
# File lib/prodder/project.rb, line 100
def structure_file_name
  File.join workspace, @defn['structure_file']
end