From 212291fd333332745218a7bc64edfe440e51d5ac Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 10:17:23 +0900 Subject: [PATCH 01/10] Ignore non ActiveRecord sub classes - fixes #44, #47, #48 --- lib/active_mocker/generate.rb | 41 +++++++++++++------ spec/lib/active_mocker/generate_spec.rb | 27 +++++++++++- spec/lib/models/non_active_record_model.rb | 2 + spec/lib/models/some_namespace/some_module.rb | 7 ++++ 4 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 spec/lib/models/non_active_record_model.rb create mode 100644 spec/lib/models/some_namespace/some_module.rb diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index f6182038..5c52c97a 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -12,9 +12,10 @@ def initialize def call clean_up progress_init - models_paths.each do |file| - model_name = model_name(file) - model = get_model_const(model_name) + + active_record_models_with_files.each do |model, file| + model_name = model.name + mock_file_name = "#{model_name.underscore}_#{config.mock_append_name.underscore}.rb" mock_file_path = File.join(Config.mock_dir, mock_file_name) assure_dir_path_exists(mock_file_path) @@ -28,21 +29,30 @@ def call rescue_clean_up(e, file_out, model_name) end end + progress.increment end + display_errors.display_errors self end def get_model_const(model_name) - model_name.constantize + constant = model_name.constantize + return unless constant.ancestors.include?(ActiveRecord::Base) + constant rescue StandardError, LoadError => e display_errors.wrap_an_exception(e, model_name) + nil + end + + def active_record_models + @active_record_models ||= active_record_models_with_files.map(&:first) end private - attr_reader :display_errors + attr_reader :display_errors, :progress def create_mock(file, file_out, schema_scrapper) MockCreator.new(file: File.open(file), @@ -54,9 +64,11 @@ def create_mock(file, file_out, schema_scrapper) end OtherErrors = Struct.new(:successful?) + def collect_errors(mock_file_path, create_mock_errors, schema_scrapper, model_name) display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) + if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } display_errors.failed_models << model_name File.delete(mock_file_path) if File.exist?(mock_file_path) @@ -74,24 +86,29 @@ def rescue_clean_up(e, file_out, model_name) display_errors.wrap_an_exception(e, model_name) end - def model_name(file) - FilePathToRubyClass.new(base_path: config.model_dir, class_path: file).to_s + def progress_init + @progress = config.progress_class.create(active_record_models.count) end def model_names - @model_names ||= models_paths.map { |p| model_name(p) } + @model_names ||= active_record_models.map(&:name) end - attr_reader :progress - - def progress_init - @progress = config.progress_class.create(models_paths.count) + def active_record_models_with_files + @active_record_models_with_files ||= models_paths.map do |file| + model = get_model_const(model_name_for(file)) + [model, file] if model + end.compact end def models_paths @models_paths ||= Dir.glob(config.single_model_path || File.join(config.model_dir, "**/*.rb")) end + def model_name_for(file) + FilePathToRubyClass.new(base_path: config.model_dir, class_path: file).to_s + end + def assure_dir_path_exists(file) unless File.exist?(File.dirname(file)) FileUtils.mkdir_p(File.dirname(file)) diff --git a/spec/lib/active_mocker/generate_spec.rb b/spec/lib/active_mocker/generate_spec.rb index eba26c6e..8fbed2da 100644 --- a/spec/lib/active_mocker/generate_spec.rb +++ b/spec/lib/active_mocker/generate_spec.rb @@ -8,11 +8,14 @@ before do ActiveMocker::Config.set do |config| - config.model_dir = File.join(File.expand_path("../", __FILE__)) + config.model_dir = File.expand_path("../", __FILE__) config.mock_dir = not_found_dir config.error_verbosity = 0 config.progress_bar = false end + stub_const("ActiveRecord::Base", class_double("ActiveRecord::Base")) + stub_const("Model", class_double("Model", ancestors: [ActiveRecord::Base])) + stub_const("SomeNamespace::SomeModule", class_double("SomeNamespace::SomeModule", ancestors: [Module])) end before do @@ -71,7 +74,6 @@ let(:models_dir) { File.join(File.expand_path("../../", __FILE__), "models") } before do - stub_const("ActiveRecord::Base", class_double("ActiveRecord::Base")) FileUtils.mkdir_p(not_found_dir) File.open(old_mock_path, "w") { |w| w.write "" } File.open(current_mock_path, "w") { |w| w.write "" } @@ -93,10 +95,30 @@ end end + describe "#active_record_models" do + let(:models_dir) { File.join(File.expand_path("../../", __FILE__), "models") } + + before do + ActiveMocker::Config.model_dir = models_dir + end + + context "with some non ActiveRecord subclasses" do + before do + stub_const("NonActiveRecordModel", class_double("NonActiveRecordModel", ancestors: [Object])) + end + + it "ignores non ActiveRecord subclasses" do + result = described_class.new.call + expect(result.active_record_models).to eq [Model] + end + end + end + describe "ActiveMocker::Config.disable_modules_and_constants" do before do ActiveMocker::Config.disable_modules_and_constants = set_to ActiveMocker::Config.progress_bar = false + ActiveMocker::Config.model_dir = File.join(File.expand_path("../../", __FILE__), "models") ActiveMocker::Config.single_model_path = File.join(File.expand_path("../../", __FILE__), "models/model.rb") end @@ -122,6 +144,7 @@ describe "ActiveMocker::Config.mock_append_name" do before do ActiveMocker::Config.progress_bar = false + ActiveMocker::Config.model_dir = File.join(File.expand_path("../../", __FILE__), "models") ActiveMocker::Config.single_model_path = File.join(File.expand_path("../../models", __FILE__), "model.rb") end diff --git a/spec/lib/models/non_active_record_model.rb b/spec/lib/models/non_active_record_model.rb new file mode 100644 index 00000000..f97d498c --- /dev/null +++ b/spec/lib/models/non_active_record_model.rb @@ -0,0 +1,2 @@ +class NonActiveRecordModel +end diff --git a/spec/lib/models/some_namespace/some_module.rb b/spec/lib/models/some_namespace/some_module.rb new file mode 100644 index 00000000..160505b6 --- /dev/null +++ b/spec/lib/models/some_namespace/some_module.rb @@ -0,0 +1,7 @@ +module SomeNamespace + module SomeModule + def some_method + "some return value" + end + end +end From 011979cf69a5cf7305b1647a8e721677c32d6b44 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 10:46:19 +0900 Subject: [PATCH 02/10] extract class refactor --- lib/active_mocker/generate.rb | 154 ++++++++++++++++++++-------------- 1 file changed, 93 insertions(+), 61 deletions(-) diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index 5c52c97a..0a15ce90 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -14,21 +14,8 @@ def call progress_init active_record_models_with_files.each do |model, file| - model_name = model.name - - mock_file_name = "#{model_name.underscore}_#{config.mock_append_name.underscore}.rb" - mock_file_path = File.join(Config.mock_dir, mock_file_name) - assure_dir_path_exists(mock_file_path) - schema_scrapper = ActiveRecordSchemaScrapper.new(model: model) - File.open(mock_file_path, "w") do |file_out| - begin - result = create_mock(file, file_out, schema_scrapper) - status = collect_errors(mock_file_path, result.errors, schema_scrapper, model_name) - display_errors.success_count += 1 if result.completed? && status.successful? - rescue => e - rescue_clean_up(e, file_out, model_name) - end - end + writer = FileWriter.new(model: model, file: file, display_errors: display_errors, config: config, model_names: model_names) + writer.write! progress.increment end @@ -54,38 +41,6 @@ def active_record_models attr_reader :display_errors, :progress - def create_mock(file, file_out, schema_scrapper) - MockCreator.new(file: File.open(file), - file_out: file_out, - schema_scrapper: schema_scrapper, - klasses_to_be_mocked: model_names, - enabled_partials: enabled_partials, - mock_append_name: config.mock_append_name).create - end - - OtherErrors = Struct.new(:successful?) - - def collect_errors(mock_file_path, create_mock_errors, schema_scrapper, model_name) - display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) - display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) - - if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } - display_errors.failed_models << model_name - File.delete(mock_file_path) if File.exist?(mock_file_path) - display_errors.add(create_mock_errors) - OtherErrors.new(false) - else - OtherErrors.new(true) - end - end - - def rescue_clean_up(e, file_out, model_name) - display_errors.failed_models << model_name - file_out.close unless file_out.closed? - File.delete(file_out.path) if File.exist?(file_out.path) - display_errors.wrap_an_exception(e, model_name) - end - def progress_init @progress = config.progress_class.create(active_record_models.count) end @@ -109,12 +64,6 @@ def model_name_for(file) FilePathToRubyClass.new(base_path: config.model_dir, class_path: file).to_s end - def assure_dir_path_exists(file) - unless File.exist?(File.dirname(file)) - FileUtils.mkdir_p(File.dirname(file)) - end - end - def config ActiveMocker::Config end @@ -123,14 +72,6 @@ def create_mock_dir FileUtils.mkdir_p(config.mock_dir) unless Dir.exist?(config.mock_dir) end - def enabled_partials - if config.disable_modules_and_constants - MockCreator.enabled_partials_default - [*:modules_constants] - else - MockCreator.enabled_partials_default - end - end - def clean_up delete_mocks unless config.single_model_path end @@ -138,5 +79,96 @@ def clean_up def delete_mocks FileUtils.rm Dir.glob(File.join(config.mock_dir, "/**/*_#{config.mock_append_name.underscore}.rb")) end + + class FileWriter + include Virtus.model + delegate :name, to: :model, prefix: true + + attribute :model, Object + attribute :file, String + attribute :display_errors + attribute :config + attribute :model_names, Array + + def write! + assure_dir_path_exists! + + safe_write do |file_out| + result = create_mock(file_out) + status = collect_errors(result.errors) + display_errors.success_count += 1 if result.completed? && status.successful? + end + end + + private + + def safe_write + File.open(mock_file_path, 'w') do |file_out| + begin + yield file_out + rescue StandardError => e + rescue_clean_up(e, file_out) + end + end + end + + def rescue_clean_up(e, file_out) + display_errors.failed_models << model_name + file_out.close unless file_out.closed? + File.delete(file_out.path) if File.exists?(file_out.path) + display_errors.wrap_an_exception(e, model_name) + end + + def schema_scrapper + @schema_scrapper ||= ActiveRecordSchemaScrapper.new(model: model) + end + + def mock_file_path + File.join(Config.mock_dir, mock_file_name) + end + + def mock_file_name + "#{model_name.underscore}_#{config.mock_append_name.underscore}.rb" + end + + def assure_dir_path_exists! + unless File.exists?(File.dirname(mock_file_path)) + FileUtils::mkdir_p(File.dirname(mock_file_path)) + end + end + + def create_mock(file_out) + MockCreator.new(file: File.open(file), + file_out: file_out, + schema_scrapper: schema_scrapper, + klasses_to_be_mocked: model_names, + enabled_partials: enabled_partials, + mock_append_name: config.mock_append_name).create + end + + OtherErrors = Struct.new(:successful?) + + def collect_errors(create_mock_errors) + display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) + display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) + + if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } + display_errors.failed_models << model_name + File.delete(mock_file_path) if File.exists?(mock_file_path) + display_errors.add(create_mock_errors) + OtherErrors.new(false) + else + OtherErrors.new(true) + end + end + + def enabled_partials + if config.disable_modules_and_constants + MockCreator.enabled_partials_default - [*:modules_constants] + else + MockCreator.enabled_partials_default + end + end + end end end From 4054285f45dcf07d65805624f37a4b734ebb52e8 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 10:57:02 +0900 Subject: [PATCH 03/10] fix some hound suggestions --- lib/active_mocker/generate.rb | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index 0a15ce90..f4b42648 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -14,8 +14,7 @@ def call progress_init active_record_models_with_files.each do |model, file| - writer = FileWriter.new(model: model, file: file, display_errors: display_errors, config: config, model_names: model_names) - writer.write! + write_file(model, file) progress.increment end @@ -41,6 +40,17 @@ def active_record_models attr_reader :display_errors, :progress + def write_file(model, file) + writer = FileWriter.new( + model: model, + file: file, + display_errors: display_errors, + config: config, + model_names: model_names) + + writer.write! + end + def progress_init @progress = config.progress_class.create(active_record_models.count) end @@ -103,7 +113,7 @@ def write! private def safe_write - File.open(mock_file_path, 'w') do |file_out| + File.open(mock_file_path, "w") do |file_out| begin yield file_out rescue StandardError => e @@ -115,7 +125,7 @@ def safe_write def rescue_clean_up(e, file_out) display_errors.failed_models << model_name file_out.close unless file_out.closed? - File.delete(file_out.path) if File.exists?(file_out.path) + File.delete(file_out.path) if File.exist?(file_out.path) display_errors.wrap_an_exception(e, model_name) end @@ -132,8 +142,8 @@ def mock_file_name end def assure_dir_path_exists! - unless File.exists?(File.dirname(mock_file_path)) - FileUtils::mkdir_p(File.dirname(mock_file_path)) + unless File.exist?(File.dirname(mock_file_path)) + FileUtils.mkdir_p(File.dirname(mock_file_path)) end end @@ -154,7 +164,7 @@ def collect_errors(create_mock_errors) if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } display_errors.failed_models << model_name - File.delete(mock_file_path) if File.exists?(mock_file_path) + File.delete(mock_file_path) if File.exist?(mock_file_path) display_errors.add(create_mock_errors) OtherErrors.new(false) else From d3a5c2f1a621c14dffff01a1130eef79a8011482 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 11:53:03 +0900 Subject: [PATCH 04/10] make get_model_const private, rename to constant_from --- lib/active_mocker/generate.rb | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index f4b42648..a100f677 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -23,15 +23,6 @@ def call self end - def get_model_const(model_name) - constant = model_name.constantize - return unless constant.ancestors.include?(ActiveRecord::Base) - constant - rescue StandardError, LoadError => e - display_errors.wrap_an_exception(e, model_name) - nil - end - def active_record_models @active_record_models ||= active_record_models_with_files.map(&:first) end @@ -40,6 +31,7 @@ def active_record_models attr_reader :display_errors, :progress + def write_file(model, file) writer = FileWriter.new( model: model, @@ -61,7 +53,7 @@ def model_names def active_record_models_with_files @active_record_models_with_files ||= models_paths.map do |file| - model = get_model_const(model_name_for(file)) + model = constant_from(model_name_from(file)) [model, file] if model end.compact end @@ -70,7 +62,16 @@ def models_paths @models_paths ||= Dir.glob(config.single_model_path || File.join(config.model_dir, "**/*.rb")) end - def model_name_for(file) + def constant_from(model_name) + constant = model_name.constantize + return unless constant.ancestors.include?(ActiveRecord::Base) + constant + rescue StandardError, LoadError => e + display_errors.wrap_an_exception(e, model_name) + nil + end + + def model_name_from(file) FilePathToRubyClass.new(base_path: config.model_dir, class_path: file).to_s end From 9c94f170986f545f927651b3899b7311827ed3ff Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 12:58:46 +0900 Subject: [PATCH 05/10] fix hound suggestion --- lib/active_mocker/generate.rb | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index a100f677..4a491aab 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -104,15 +104,21 @@ class FileWriter def write! assure_dir_path_exists! - safe_write do |file_out| - result = create_mock(file_out) - status = collect_errors(result.errors) - display_errors.success_count += 1 if result.completed? && status.successful? - end + safe_write { |f| process!(f)} end private + def process!(file_out) + result = create_mock(file_out) + status = collect_errors(result.errors) + + ok = result.completed? && status.successful? + return unless ok + + display_errors.success_count += 1 + end + def safe_write File.open(mock_file_path, "w") do |file_out| begin From da7e169725972b456e9e612a0db7b3d4b41c4a79 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 13:09:27 +0900 Subject: [PATCH 06/10] fix hound error --- lib/active_mocker/generate.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index 4a491aab..1337aebf 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -2,9 +2,11 @@ module ActiveMocker class Generate def initialize - raise ArgumentError, "mock_dir is missing a valued value!" if config.mock_dir.nil? || config.mock_dir.empty? + check_directory!(:mock_dir) create_mock_dir - raise ArgumentError, "model_dir is missing a valued value!" if config.model_dir.nil? || config.model_dir.empty? || !Dir.exist?(config.model_dir) + check_directory!(:model_dir) + raise_missing_arg(:model_dir) if !Dir.exists?(config.model_dir) + @display_errors = DisplayErrors.new(models_paths.count) end @@ -31,6 +33,17 @@ def active_record_models attr_reader :display_errors, :progress + def check_directory!(type) + value = config.send(type) + + if value.nil? || value.empty? + raise_missing_arg(type) + end + end + + def raise_missing_arg(type) + raise ArgumentError, "#{type} is missing a valued value!" + end def write_file(model, file) writer = FileWriter.new( From b6bfd2e2c7b4e84d0dca5519b5fa1b65fdeedd83 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 13:12:36 +0900 Subject: [PATCH 07/10] move extracted class into own file --- lib/active_mocker/file_writer.rb | 99 +++++++++++++++++++++++++++++ lib/active_mocker/generate.rb | 106 ++----------------------------- 2 files changed, 106 insertions(+), 99 deletions(-) create mode 100644 lib/active_mocker/file_writer.rb diff --git a/lib/active_mocker/file_writer.rb b/lib/active_mocker/file_writer.rb new file mode 100644 index 00000000..0e213adf --- /dev/null +++ b/lib/active_mocker/file_writer.rb @@ -0,0 +1,99 @@ +module ActiveMocker + class FileWriter + include Virtus.model + delegate :name, to: :model, prefix: true + + attribute :model, Object + attribute :file, String + attribute :display_errors + attribute :config + attribute :model_names, Array + + def write! + assure_dir_path_exists! + + safe_write { |f| process!(f)} + end + + private + + def process!(file_out) + result = create_mock(file_out) + status = collect_errors(result.errors) + + ok = result.completed? && status.successful? + return unless ok + + display_errors.success_count += 1 + end + + def safe_write + File.open(mock_file_path, "w") do |file_out| + begin + yield file_out + rescue StandardError => e + rescue_clean_up(e, file_out) + end + end + end + + def rescue_clean_up(e, file_out) + display_errors.failed_models << model_name + file_out.close unless file_out.closed? + File.delete(file_out.path) if File.exist?(file_out.path) + display_errors.wrap_an_exception(e, model_name) + end + + def schema_scrapper + @schema_scrapper ||= ActiveRecordSchemaScrapper.new(model: model) + end + + def mock_file_path + File.join(Config.mock_dir, mock_file_name) + end + + def mock_file_name + "#{model_name.underscore}_#{config.mock_append_name.underscore}.rb" + end + + def assure_dir_path_exists! + unless File.exist?(File.dirname(mock_file_path)) + FileUtils.mkdir_p(File.dirname(mock_file_path)) + end + end + + def create_mock(file_out) + MockCreator.new(file: File.open(file), + file_out: file_out, + schema_scrapper: schema_scrapper, + klasses_to_be_mocked: model_names, + enabled_partials: enabled_partials, + mock_append_name: config.mock_append_name).create + end + + OtherErrors = Struct.new(:successful?) + + def collect_errors(create_mock_errors) + display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) + display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) + + if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } + display_errors.failed_models << model_name + File.delete(mock_file_path) if File.exist?(mock_file_path) + display_errors.add(create_mock_errors) + OtherErrors.new(false) + else + OtherErrors.new(true) + end + end + + def enabled_partials + if config.disable_modules_and_constants + MockCreator.enabled_partials_default - [*:modules_constants] + else + MockCreator.enabled_partials_default + end + end + end + +end diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index 1337aebf..ba28bffa 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -1,11 +1,13 @@ # frozen_string_literal: true +require_relative "file_writer" + module ActiveMocker class Generate def initialize check_directory!(:mock_dir) create_mock_dir check_directory!(:model_dir) - raise_missing_arg(:model_dir) if !Dir.exists?(config.model_dir) + raise_missing_arg(:model_dir) if !Dir.exist?(config.model_dir) @display_errors = DisplayErrors.new(models_paths.count) end @@ -85,7 +87,10 @@ def constant_from(model_name) end def model_name_from(file) - FilePathToRubyClass.new(base_path: config.model_dir, class_path: file).to_s + FilePathToRubyClass.new( + base_path: config.model_dir, + class_path: file + ).to_s end def config @@ -103,102 +108,5 @@ def clean_up def delete_mocks FileUtils.rm Dir.glob(File.join(config.mock_dir, "/**/*_#{config.mock_append_name.underscore}.rb")) end - - class FileWriter - include Virtus.model - delegate :name, to: :model, prefix: true - - attribute :model, Object - attribute :file, String - attribute :display_errors - attribute :config - attribute :model_names, Array - - def write! - assure_dir_path_exists! - - safe_write { |f| process!(f)} - end - - private - - def process!(file_out) - result = create_mock(file_out) - status = collect_errors(result.errors) - - ok = result.completed? && status.successful? - return unless ok - - display_errors.success_count += 1 - end - - def safe_write - File.open(mock_file_path, "w") do |file_out| - begin - yield file_out - rescue StandardError => e - rescue_clean_up(e, file_out) - end - end - end - - def rescue_clean_up(e, file_out) - display_errors.failed_models << model_name - file_out.close unless file_out.closed? - File.delete(file_out.path) if File.exist?(file_out.path) - display_errors.wrap_an_exception(e, model_name) - end - - def schema_scrapper - @schema_scrapper ||= ActiveRecordSchemaScrapper.new(model: model) - end - - def mock_file_path - File.join(Config.mock_dir, mock_file_name) - end - - def mock_file_name - "#{model_name.underscore}_#{config.mock_append_name.underscore}.rb" - end - - def assure_dir_path_exists! - unless File.exist?(File.dirname(mock_file_path)) - FileUtils.mkdir_p(File.dirname(mock_file_path)) - end - end - - def create_mock(file_out) - MockCreator.new(file: File.open(file), - file_out: file_out, - schema_scrapper: schema_scrapper, - klasses_to_be_mocked: model_names, - enabled_partials: enabled_partials, - mock_append_name: config.mock_append_name).create - end - - OtherErrors = Struct.new(:successful?) - - def collect_errors(create_mock_errors) - display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) - display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) - - if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } - display_errors.failed_models << model_name - File.delete(mock_file_path) if File.exist?(mock_file_path) - display_errors.add(create_mock_errors) - OtherErrors.new(false) - else - OtherErrors.new(true) - end - end - - def enabled_partials - if config.disable_modules_and_constants - MockCreator.enabled_partials_default - [*:modules_constants] - else - MockCreator.enabled_partials_default - end - end - end end end From 8fecabd5fb9c0b426399364aa6abe6c2a95cf883 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Thu, 28 Apr 2016 13:24:20 +0900 Subject: [PATCH 08/10] fix hound suggestions --- lib/active_mocker/file_writer.rb | 39 ++++++++++++++++++++++++++------ lib/active_mocker/generate.rb | 2 +- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/active_mocker/file_writer.rb b/lib/active_mocker/file_writer.rb index 0e213adf..fae5f979 100644 --- a/lib/active_mocker/file_writer.rb +++ b/lib/active_mocker/file_writer.rb @@ -44,8 +44,8 @@ def rescue_clean_up(e, file_out) display_errors.wrap_an_exception(e, model_name) end - def schema_scrapper - @schema_scrapper ||= ActiveRecordSchemaScrapper.new(model: model) + def scrapper + @scrapper ||= ActiveRecordSchemaScrapper.new(model: model) end def mock_file_path @@ -65,7 +65,7 @@ def assure_dir_path_exists! def create_mock(file_out) MockCreator.new(file: File.open(file), file_out: file_out, - schema_scrapper: schema_scrapper, + schema_scrapper: scrapper, klasses_to_be_mocked: model_names, enabled_partials: enabled_partials, mock_append_name: config.mock_append_name).create @@ -74,10 +74,9 @@ def create_mock(file_out) OtherErrors = Struct.new(:successful?) def collect_errors(create_mock_errors) - display_errors.wrap_errors(schema_scrapper.associations.errors, model_name, type: :associations) - display_errors.wrap_errors(schema_scrapper.attributes.errors, model_name, type: :attributes) + add_errors! - if create_mock_errors.present? || schema_scrapper.attributes.errors.any? { |e| e.level == :error } + if create_mock_errors.present? || schema.attribute_errors? display_errors.failed_models << model_name File.delete(mock_file_path) if File.exist?(mock_file_path) display_errors.add(create_mock_errors) @@ -87,6 +86,15 @@ def collect_errors(create_mock_errors) end end + def add_errors! + add_error(schema.association_errors, :associations) + add_error(schema.attribute_errors, :attributes) + end + + def add_error(error, type) + display_errors.wrap_errors(error, model_name, type: type) + end + def enabled_partials if config.disable_modules_and_constants MockCreator.enabled_partials_default - [*:modules_constants] @@ -94,6 +102,23 @@ def enabled_partials MockCreator.enabled_partials_default end end - end + def schema + @schema ||= Schema.new(ActiveRecordSchemaScrapper.new(model: model)) + end + + class Schema < SimpleDelegator + def attribute_errors? + attribute_errors.any? { |e| e.level == :error } + end + + def association_errors + associations.errors + end + + def attribute_errors + attributes.errors + end + end + end end diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index ba28bffa..7c6751b0 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -7,7 +7,7 @@ def initialize check_directory!(:mock_dir) create_mock_dir check_directory!(:model_dir) - raise_missing_arg(:model_dir) if !Dir.exist?(config.model_dir) + raise_missing_arg(:model_dir) unless Dir.exist?(config.model_dir) @display_errors = DisplayErrors.new(models_paths.count) end From 7a082adf329607163ac4bd12ce0e09323a10aab8 Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Sun, 1 May 2016 16:08:08 +0900 Subject: [PATCH 09/10] address stylistic issues --- lib/active_mocker/file_writer.rb | 2 +- lib/active_mocker/generate.rb | 2 +- spec/lib/active_mocker/generate_spec.rb | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/active_mocker/file_writer.rb b/lib/active_mocker/file_writer.rb index fae5f979..e4edc176 100644 --- a/lib/active_mocker/file_writer.rb +++ b/lib/active_mocker/file_writer.rb @@ -12,7 +12,7 @@ class FileWriter def write! assure_dir_path_exists! - safe_write { |f| process!(f)} + safe_write { |f| process!(f) } end private diff --git a/lib/active_mocker/generate.rb b/lib/active_mocker/generate.rb index 7c6751b0..6744e07c 100644 --- a/lib/active_mocker/generate.rb +++ b/lib/active_mocker/generate.rb @@ -81,7 +81,7 @@ def constant_from(model_name) constant = model_name.constantize return unless constant.ancestors.include?(ActiveRecord::Base) constant - rescue StandardError, LoadError => e + rescue NameError, LoadError => e display_errors.wrap_an_exception(e, model_name) nil end diff --git a/spec/lib/active_mocker/generate_spec.rb b/spec/lib/active_mocker/generate_spec.rb index 8fbed2da..ddf679cc 100644 --- a/spec/lib/active_mocker/generate_spec.rb +++ b/spec/lib/active_mocker/generate_spec.rb @@ -4,7 +4,7 @@ RSpec.describe ActiveMocker::Generate do describe ".new" do - let(:not_found_dir) { File.join(File.expand_path("../test_mock_dir", __FILE__)) } + let(:not_found_dir) { File.expand_path("../test_mock_dir", __FILE__) } before do ActiveMocker::Config.set do |config| @@ -71,7 +71,7 @@ context "when old mock exist" do let(:current_mock_path) { File.join(not_found_dir, "model_mock.rb") } let(:old_mock_path) { File.join(not_found_dir, "old_mock_from_deleted_model_mock.rb") } - let(:models_dir) { File.join(File.expand_path("../../", __FILE__), "models") } + let(:models_dir) { File.expand_path("../../models", __FILE__) } before do FileUtils.mkdir_p(not_found_dir) @@ -96,7 +96,7 @@ end describe "#active_record_models" do - let(:models_dir) { File.join(File.expand_path("../../", __FILE__), "models") } + let(:models_dir) { File.expand_path("../../models", __FILE__) } before do ActiveMocker::Config.model_dir = models_dir @@ -118,8 +118,8 @@ before do ActiveMocker::Config.disable_modules_and_constants = set_to ActiveMocker::Config.progress_bar = false - ActiveMocker::Config.model_dir = File.join(File.expand_path("../../", __FILE__), "models") - ActiveMocker::Config.single_model_path = File.join(File.expand_path("../../", __FILE__), "models/model.rb") + ActiveMocker::Config.model_dir = File.expand_path("../../models", __FILE__) + ActiveMocker::Config.single_model_path = File.expand_path("../../models/model.rb", __FILE__) end context "when true" do @@ -144,8 +144,8 @@ describe "ActiveMocker::Config.mock_append_name" do before do ActiveMocker::Config.progress_bar = false - ActiveMocker::Config.model_dir = File.join(File.expand_path("../../", __FILE__), "models") - ActiveMocker::Config.single_model_path = File.join(File.expand_path("../../models", __FILE__), "model.rb") + ActiveMocker::Config.model_dir = File.expand_path("../../models", __FILE__) + ActiveMocker::Config.single_model_path = File.expand_path("../../models/model.rb", __FILE__) end context "defaults" do From 6f83d71740a3875b712e54d085ddc64fd37437cd Mon Sep 17 00:00:00 2001 From: Mark Burns Date: Mon, 2 May 2016 08:50:23 +0900 Subject: [PATCH 10/10] run rake integration: update gemfiles in test rails app --- test_rails_4_app/gemfiles/rails_4.0.gemfile.lock | 2 +- test_rails_4_app/gemfiles/rails_4.1.gemfile.lock | 2 +- test_rails_4_app/gemfiles/rails_4.2.gemfile.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test_rails_4_app/gemfiles/rails_4.0.gemfile.lock b/test_rails_4_app/gemfiles/rails_4.0.gemfile.lock index c1ed4847..a4592687 100644 --- a/test_rails_4_app/gemfiles/rails_4.0.gemfile.lock +++ b/test_rails_4_app/gemfiles/rails_4.0.gemfile.lock @@ -162,13 +162,13 @@ GEM rspec-mocks (~> 3.4.0) rspec-support (~> 3.4.0) rspec-support (3.4.0) - ruby-progressbar (1.8.0) rubocop (0.38.0) parser (>= 2.3.0.6, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.8.0) sprockets (3.4.0) rack (> 1, < 3) sprockets-rails (2.3.3) diff --git a/test_rails_4_app/gemfiles/rails_4.1.gemfile.lock b/test_rails_4_app/gemfiles/rails_4.1.gemfile.lock index 23a2f891..57c8dbf7 100644 --- a/test_rails_4_app/gemfiles/rails_4.1.gemfile.lock +++ b/test_rails_4_app/gemfiles/rails_4.1.gemfile.lock @@ -162,13 +162,13 @@ GEM rspec-mocks (~> 3.4.0) rspec-support (~> 3.4.0) rspec-support (3.4.0) - ruby-progressbar (1.8.0) rubocop (0.38.0) parser (>= 2.3.0.6, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.8.0) sprockets (3.4.0) rack (> 1, < 3) sprockets-rails (2.3.3) diff --git a/test_rails_4_app/gemfiles/rails_4.2.gemfile.lock b/test_rails_4_app/gemfiles/rails_4.2.gemfile.lock index 86530e46..d084c5ee 100644 --- a/test_rails_4_app/gemfiles/rails_4.2.gemfile.lock +++ b/test_rails_4_app/gemfiles/rails_4.2.gemfile.lock @@ -162,13 +162,13 @@ GEM rspec-mocks (~> 3.4.0) rspec-support (~> 3.4.0) rspec-support (3.4.0) - ruby-progressbar (1.8.0) rubocop (0.38.0) parser (>= 2.3.0.6, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.8.0) sprockets (3.4.0) rack (> 1, < 3) sprockets-rails (2.3.3)