Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

All fixes #68

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
ruby-2.5.3
3.1.3
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
language: ruby
rvm:
- 2.5.3
- 3.1.3
before_install:
- gem update --system
- gem update bundler
Expand Down
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

source 'http://rubygems.org'

gemspec
4 changes: 3 additions & 1 deletion Rakefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

require 'bundler'
include Rake::DSL if defined?(Rake::DSL)
Bundler::GemHelper.install_tasks
Expand All @@ -8,4 +10,4 @@ Rake::TestTask.new(:test) do |t|
t.verbose = false
end

task :default => :test
task default: :test
31 changes: 16 additions & 15 deletions fixture_builder.gemspec
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
# -*- encoding: utf-8 -*-
$:.push File.expand_path('../lib', __FILE__)
# frozen_string_literal: true

$LOAD_PATH.push File.expand_path('lib', __dir__)
require 'fixture_builder/version'

Gem::Specification.new do |s|
s.name = %q{fixture_builder}
s.name = 'fixture_builder'
s.version = FixtureBuilder::VERSION
s.platform = Gem::Platform::RUBY
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
s.authors = ['Ryan Dy', 'David Stevenson', 'Chad Woolley']
s.description = %q{FixtureBuilder allows testers to use their existing factories, like FactoryGirl, to generate high performance fixtures that can be shared across all your tests and development environment. The best of all worlds! Speed, Maintainability, Flexibility, Consistency, and Simplicity!}
s.email = %q{mail@ryandy.com}
s.description = 'FixtureBuilder allows testers to use their existing factories, like FactoryGirl, to generate high performance fixtures that can be shared across all your tests and development environment. The best of all worlds! Speed, Maintainability, Flexibility, Consistency, and Simplicity!'
s.email = 'mail@ryandy.com'
s.licenses = ['MIT']
s.extra_rdoc_files = [
'README.markdown'
Expand All @@ -19,15 +20,15 @@ Gem::Specification.new do |s|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.require_paths = ['lib']

s.homepage = %q{http://github.com/rdy/fixture_builder}
s.rubyforge_project = %q{fixture_builder}
s.summary = %q{Build Rails fixtures using object mother factories}
s.homepage = 'http://github.com/rdy/fixture_builder'
s.rubyforge_project = 'fixture_builder'
s.summary = 'Build Rails fixtures using object mother factories'

s.add_dependency %q{activerecord}, '>= 2'
s.add_dependency %q{activesupport}, '>= 2'
s.add_dependency %q{hashdiff}
s.add_development_dependency %q{rake}
s.add_development_dependency %q{rails}, '>= 2'
s.add_development_dependency %q{test-unit}
s.add_development_dependency %q{sqlite3}
s.add_dependency 'activerecord', '>= 2'
s.add_dependency 'activesupport', '>= 2'
s.add_dependency 'hashdiff'
s.add_development_dependency 'rails', '>= 2'
s.add_development_dependency 'rake'
s.add_development_dependency 'sqlite3'
s.add_development_dependency 'test-unit'
end
4 changes: 3 additions & 1 deletion lib/fixture_builder.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

require 'fixture_builder/delegations'
require 'fixture_builder/configuration'
require 'fixture_builder/namer'
Expand All @@ -18,7 +20,7 @@ def configure(opts = {})
begin
class Railtie < ::Rails::Railtie
rake_tasks do
load "tasks/fixture_builder.rake"
load 'tasks/fixture_builder.rake'
end
end
rescue LoadError, NameError
Expand Down
51 changes: 32 additions & 19 deletions lib/fixture_builder/builder.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

module FixtureBuilder
class Builder
include Delegations::Namer
Expand All @@ -10,19 +12,19 @@ def initialize(configuration, namer, builder_block)
end

def generate!
say "Building fixtures"
say 'Building fixtures'
clean_out_old_data
create_fixture_objects
names_from_ivars!
write_data_to_files
after_build.call if after_build
after_build&.call
end

protected

def create_fixture_objects
load_legacy_fixtures if legacy_fixtures.present?
surface_errors { instance_eval &@builder_block }
surface_errors { instance_eval(&@builder_block) }
end

def load_legacy_fixtures
Expand All @@ -45,11 +47,11 @@ def fixtures_class

def surface_errors
yield
rescue Object => error
rescue Object => e
puts
say "There was an error building fixtures", error.inspect
say 'There was an error building fixtures', e.inspect
puts
puts error.backtrace
puts e.backtrace
puts
exit!
end
Expand All @@ -73,12 +75,17 @@ def clean_out_old_data

def delete_tables
ActiveRecord::Base.connection.disable_referential_integrity do
tables.each { |t| ActiveRecord::Base.connection.delete(delete_sql % {table: ActiveRecord::Base.connection.quote_table_name(t)}) }
tables.each do |t|
ActiveRecord::Base.connection.delete(format(delete_sql,
table: ActiveRecord::Base.connection.quote_table_name(t)))
end
end
end

def delete_yml_files
FileUtils.rm(*tables.map { |t| fixture_file(t) }) rescue nil
FileUtils.rm(*tables.map { |t| fixture_file(t) })
rescue StandardError
nil
end

def say(*messages)
Expand All @@ -96,19 +103,27 @@ def dump_tables
Date::DATE_FORMATS[:default] = Date::DATE_FORMATS[:db]
begin
fixtures = tables.inject([]) do |files, table_name|
table_klass = table_name.classify.constantize rescue nil
table_klass = begin
table_name.classify.constantize
rescue StandardError
nil
end
if table_klass && table_klass < ActiveRecord::Base
rows = table_klass.unscoped do
table_klass.order(:id).all.collect do |obj|
attrs = obj.attributes.select { |attr_name| table_klass.column_names.include?(attr_name) }
attrs.inject({}) do |hash, (attr_name, value)|
table_klass.all.collect do |obj|
attrs = obj.attributes.select do |attr_name|
column = table_klass.columns.find { |c| c.name == attr_name }
!column.virtual? if column
end

attrs.each_with_object({}) do |(attr_name, value), hash|
hash[attr_name] = serialized_value_if_needed(table_klass, attr_name, value)
hash
end
end
end
else
rows = ActiveRecord::Base.connection.select_all(select_sql % {table: ActiveRecord::Base.connection.quote_table_name(table_name)})
rows = ActiveRecord::Base.connection.select_all(format(select_sql,
table: ActiveRecord::Base.connection.quote_table_name(table_name)))
end
next files if rows.empty?

Expand Down Expand Up @@ -138,12 +153,10 @@ def serialized_value_if_needed(table_klass, attr_name, value)
else
table_klass.type_for_attribute(attr_name).type_cast_for_schema(value)
end
elsif table_klass.serialized_attributes.key? attr_name
table_klass.serialized_attributes[attr_name].dump(value)
else
if table_klass.serialized_attributes.has_key? attr_name
table_klass.serialized_attributes[attr_name].dump(value)
else
value
end
value
end
end

Expand Down
60 changes: 34 additions & 26 deletions lib/fixture_builder/configuration.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
# frozen_string_literal: true

require 'active_support/core_ext'
require 'active_support/core_ext/string'
require 'digest'
require 'fileutils'
require 'hashdiff'

module FixtureBuilder
if Object.const_defined?(:Hashdiff)
# hashdiff version >= 1.0.0
Differ = Hashdiff
else
Differ = HashDiff
end
Differ = if Object.const_defined?(:Hashdiff)
# hashdiff version >= 1.0.0
Hashdiff
else
HashDiff
end

class Configuration
include Delegations::Namer

ACCESSIBLE_ATTRIBUTES = [:select_sql, :delete_sql, :skip_tables, :files_to_check, :record_name_fields,
:fixture_builder_file, :fixture_directory, :after_build, :legacy_fixtures, :model_name_procs,
:write_empty_files]
ACCESSIBLE_ATTRIBUTES = %i[select_sql delete_sql skip_tables files_to_check record_name_fields
fixture_builder_file fixture_directory after_build legacy_fixtures model_name_procs
write_empty_files].freeze
attr_accessor(*ACCESSIBLE_ATTRIBUTES)

SCHEMA_FILES = ['db/schema.rb', 'db/development_structure.sql', 'db/test_structure.sql', 'db/production_structure.sql']
SCHEMA_FILES = ['db/schema.rb', 'db/development_structure.sql', 'db/test_structure.sql',
'db/production_structure.sql'].freeze

def initialize(opts={})
def initialize(opts = {})
@namer = Namer.new(self)
@use_sha1_digests = opts[:use_sha1_digests] || false
@file_hashes = file_hashes
Expand All @@ -40,46 +43,48 @@ def include(*args)
def factory(&block)
self.files_to_check += @legacy_fixtures.to_a
return unless rebuild_fixtures?

@builder = Builder.new(self, @namer, block).generate!
write_config
end

def select_sql
@select_sql ||= "SELECT * FROM %{table}"
@select_sql ||= 'SELECT * FROM %<table>s'
end

def select_sql=(sql)
if sql =~ /%s/
ActiveSupport::Deprecation.warn("Passing '%s' into select_sql is deprecated. Please use '%{table}' instead.", caller)
sql = sql.sub(/%s/, '%{table}')
ActiveSupport::Deprecation.warn("Passing '%s' into select_sql is deprecated. Please use '%<table>s' instead.",
caller)
sql = sql.sub(/%s/, '%<table>s')
end
@select_sql = sql
end

def delete_sql
@delete_sql ||= "DELETE FROM %{table}"
@delete_sql ||= 'DELETE FROM %<table>s'
end

def delete_sql=(sql)
if sql =~ /%s/
ActiveSupport::Deprecation.warn("Passing '%s' into delete_sql is deprecated. Please use '%{table}' instead.", caller)
sql = sql.sub(/%s/, '%{table}')
ActiveSupport::Deprecation.warn("Passing '%s' into delete_sql is deprecated. Please use '%<table>s' instead.",
caller)
sql = sql.sub(/%s/, '%<table>s')
end
@delete_sql = sql
end

def skip_tables
@skip_tables ||= %w{ schema_migrations }
@skip_tables ||= %w[schema_migrations]
end

def files_to_check
@files_to_check ||= schema_definition_files
end

def schema_definition_files
Dir['db/*'].inject([]) do |result, file|
Dir['db/*'].each_with_object([]) do |file, result|
result << file if SCHEMA_FILES.include?(file)
result
end
end

Expand All @@ -90,7 +95,7 @@ def files_to_check=(files)
end

def record_name_fields
@record_name_fields ||= %w{ unique_name display_name name title username login }
@record_name_fields ||= %w[unique_name display_name name title username login]
end

def fixture_builder_file
Expand All @@ -117,14 +122,14 @@ def fixtures_dir(path = '')

def file_hashes
algorithm = @use_sha1_digests ? Digest::SHA1 : Digest::MD5
files_to_check.inject({}) do |hash, filename|
files_to_check.each_with_object({}) do |filename, hash|
hash[filename] = algorithm.hexdigest(File.read(filename))
hash
end
end

def read_config
return {} unless File.exist?(fixture_builder_file)

YAML.load_file(fixture_builder_file)
end

Expand All @@ -134,8 +139,8 @@ def write_config
end

def rebuild_fixtures?
file_hashes_from_disk= @file_hashes
file_hashes_from_config= read_config
file_hashes_from_disk = @file_hashes
file_hashes_from_config = read_config
if Dir.glob("#{fixture_directory}/*.yml").blank?
puts "=> rebuilding fixtures because fixture directory #{fixture_directory} has no *.yml files"
return true
Expand All @@ -144,7 +149,10 @@ def rebuild_fixtures?
return true
elsif file_hashes_from_disk != file_hashes_from_config
puts '=> rebuilding fixtures because one or more of the following files have changed (see http://www.rubydoc.info/gems/hashdiff for diff syntax):'
Differ.diff(file_hashes_from_disk, file_hashes_from_config).map {|diff| print ' '; p diff}
Differ.diff(file_hashes_from_disk, file_hashes_from_config).map do |diff|
print ' '
p diff
end
return true
end
false
Expand Down
11 changes: 7 additions & 4 deletions lib/fixture_builder/delegations.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
# frozen_string_literal: true

require 'active_support/core_ext/module/delegation'

module FixtureBuilder
module Delegations
module Configuration
def self.included(base)
methods_to_delegate = [:fixtures_dir, :tables, :legacy_fixtures].concat(::FixtureBuilder::Configuration::ACCESSIBLE_ATTRIBUTES).flatten
methods_to_delegate = %i[fixtures_dir tables
legacy_fixtures].concat(::FixtureBuilder::Configuration::ACCESSIBLE_ATTRIBUTES).flatten
methods_to_delegate.each do |meth|
base.delegate(meth, :to => :@configuration)
base.delegate(meth, to: :@configuration)
end
end
end

module Namer
def self.included(base)
base.delegate :record_name, :populate_custom_names, :name, :name_model_with, :to => :@namer
base.delegate :record_name, :populate_custom_names, :name, :name_model_with, to: :@namer
end
end
end
end
end
Loading