Module: ApplicationSeeds

Defined in:
lib/application_seeds.rb,
lib/application_seeds/version.rb,
lib/application_seeds/database.rb,
lib/application_seeds/attributes.rb,
lib/application_seeds/capistrano2.rb

Overview

A library for managing a standardized set of seed data for applications in a non-production environment.

See README.md for API documentation.

Defined Under Namespace

Modules: Capistrano Classes: Attributes, Database

Constant Summary collapse

VERSION =
"0.9.1"

Class Method Summary collapse

Class Method Details

.configObject

Fetch the configuration.



32
33
34
# File 'lib/application_seeds.rb', line 32

def config
  @_config ||= { :id_type => :integer }
end

.config=(config) ⇒ Object

Specify any configuration, such as the type of ids to generate (:integer or :uuid).



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

def config=(config)
  warn "WARNING!  Calling ApplicationSeeds.config= after dataset has been set (ApplicationSeeds.dataset=) may not produce expected results." unless @dataset.nil?
  @_config = config
end

.config_value(key) ⇒ Object

Fetch data from the _config.yml files.



39
40
41
# File 'lib/application_seeds.rb', line 39

def config_value(key)
  config_values[key.to_s]
end

.create_object!(clazz, id, attributes, options = {}) ⇒ Object

This call will create a new instance of the specified class, with the specified id and attributes.



104
105
106
107
108
109
110
111
112
# File 'lib/application_seeds.rb', line 104

def create_object!(clazz, id, attributes, options={})
  validate = options[:validate].nil? ? true : options[:validate]

  x = clazz.new
  x.attributes = attributes.reject { |k,v| !x.respond_to?("#{k}=") }
  x.id = id
  x.save!(:validate => validate)
  x
end

.data_directoryObject

Fetch the name of the directory where the application seed data is loaded from, if it was set using data_diretory=.



78
79
80
# File 'lib/application_seeds.rb', line 78

def data_directory
  @data_directory
end

.data_directory=(directory) ⇒ Object

Specify the name of the directory that contains the application seed data.



66
67
68
69
70
71
72
# File 'lib/application_seeds.rb', line 66

def data_directory=(directory)
  if Dir.exist?(directory)
    @data_directory = directory
  else
    raise "ERROR: The #{directory} directory does not appear to contain application seed data"
  end
end

.data_gem_nameObject

Fetch the name of the directory where the application seed data is loaded from. Defaults to "applicadtion_seed_data" if it was not set using data_gem_name=.



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

def data_gem_name
  @data_gem_name || "application_seed_data"
end

.data_gem_name=(gem_name) ⇒ Object

Specify the name of the gem that contains the application seed data.



46
47
48
49
50
51
52
53
# File 'lib/application_seeds.rb', line 46

def data_gem_name=(gem_name)
  spec = Gem::Specification.find_by_name(gem_name)
  if Dir.exist?(File.join(spec.gem_dir, "lib", "seeds"))
    @data_gem_name = gem_name
  else
    raise "ERROR: The #{gem_name} gem does not appear to contain application seed data"
  end
end

.dataset=(dataset) ⇒ Object

Specify the name of the dataset to use. An exception will be raised if the dataset could not be found.



86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/application_seeds.rb', line 86

def dataset=(dataset)
  clear_cached_data
  @dataset = dataset

  if dataset.nil? || dataset.strip.empty? || dataset_path(dataset).nil?
    datasets = Dir[File.join(seed_data_path, "**", "*")].select { |x| File.directory?(x) }.map { |x| File.basename(x) }.join(', ')

    error_message =  "\nERROR: A valid dataset is required!\n"
    error_message << "Usage: bundle exec rake application_seeds:load[your_data_set]\n\n"
    error_message << "Available datasets: #{datasets}\n\n"
    raise error_message
  end
end

.defer_referential_integrity_checksObject

Defer the enforcement of foreign key constraints while the block is being executed.



151
152
153
154
155
# File 'lib/application_seeds.rb', line 151

def defer_referential_integrity_checks
  Database.without_foreign_keys do
    yield
  end
end

.label_for_id(seed_type, id) ⇒ Object

Fetch the label for the associated seed type and ID.



160
161
162
163
# File 'lib/application_seeds.rb', line 160

def label_for_id(seed_type, id)
  x = seed_labels[seed_type.to_s].select { |label, ids| ids[:integer] == id || ids[:uuid] == id }
  x.keys.first.to_sym if x && x.keys.first
end

.reset_sequence_numbersObject

This method will reset the sequence numbers on id columns for all tables in the database with an id column. If you are having issues where you are unable to insert new data into the databse after your dataset has been imported, then this should correct them.



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/application_seeds.rb', line 131

def reset_sequence_numbers
  result = Database.connection.exec("SELECT table_name FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema')")
  table_names = result.map { |row| row.values_at('table_name')[0] }

  table_names_with_id_column = table_names.select do |table_name|
    result = Database.connection.exec("SELECT column_name FROM information_schema.columns WHERE table_name = '#{table_name}';")
    column_names = result.map { |row| row.values_at('column_name')[0] }
    column_names.include?('id')
  end

  table_names_with_id_column.each do |table_name|
    result = Database.connection.exec("SELECT pg_get_serial_sequence('#{table_name}', 'id');")
    sequence_name = result.getvalue(0, 0)
    Database.connection.exec("SELECT setval('#{sequence_name}', (select MAX(id) from #{table_name}));")
  end
end

.seed_data_exists?(type) ⇒ Boolean

Returns true if the specified data file exists in this dataset, false if it does not.

Examples:

ApplicationSeeds.seed_data_exists?(:campaigns)

Returns:

  • (Boolean)


121
122
123
# File 'lib/application_seeds.rb', line 121

def seed_data_exists?(type)
  !processed_seed_data[type.to_s].nil?
end