diff --git a/crystalball.gemspec b/crystalball.gemspec index 5069d505..5c09e58c 100644 --- a/crystalball.gemspec +++ b/crystalball.gemspec @@ -41,7 +41,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'parser' spec.add_development_dependency 'pry' spec.add_development_dependency 'pry-byebug' - spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency 'psych', '~> 4.0.0' + spec.add_development_dependency "rake" spec.add_development_dependency "rspec", "~> 3.0" spec.add_development_dependency 'rubocop', ">= 0.56" spec.add_development_dependency 'rubocop-rspec' diff --git a/lib/crystalball/extensions/git/lib.rb b/lib/crystalball/extensions/git/lib.rb index 4c45ee9d..6092c10d 100644 --- a/lib/crystalball/extensions/git/lib.rb +++ b/lib/crystalball/extensions/git/lib.rb @@ -12,7 +12,7 @@ def merge_base(*args) arg_opts = opts.map { |k, v| "--#{k}" if v }.compact + args - command('merge-base', arg_opts) + command('merge-base', arg_opts.each { |opt| return opt }) end end end diff --git a/lib/crystalball/map_generator/factory_bot_strategy/factory_runner_patch.rb b/lib/crystalball/map_generator/factory_bot_strategy/factory_runner_patch.rb index cc7c18ed..d040f6d2 100644 --- a/lib/crystalball/map_generator/factory_bot_strategy/factory_runner_patch.rb +++ b/lib/crystalball/map_generator/factory_bot_strategy/factory_runner_patch.rb @@ -15,7 +15,7 @@ def apply! # Overrides `FactoryBot::FactoryRunner#run`. Pushes factory name to # `FactoryBotStrategy.used_factories` and calls original `run` def run(*) - factory = FactoryBotStrategy.factory_bot_constant.factory_by_name(@name) + factory = FactoryBotStrategy.factory_bot_constant::Internal.factory_by_name(@name) FactoryBotStrategy.used_factories << factory.name.to_s super end diff --git a/lib/crystalball/map_storage/yaml_storage.rb b/lib/crystalball/map_storage/yaml_storage.rb index 473cc09d..df54995d 100644 --- a/lib/crystalball/map_storage/yaml_storage.rb +++ b/lib/crystalball/map_storage/yaml_storage.rb @@ -33,7 +33,7 @@ def read_files(path) paths.map do |file| metadata, *example_groups = file.read.split("---\n").reject(&:empty?).map do |yaml| - YAML.safe_load(yaml, [Symbol]) + YAML.safe_load(yaml, permitted_classes: [Symbol]) end example_groups = example_groups.inject(&:merge!) @@ -42,7 +42,8 @@ def read_files(path) end def guard_metadata_consistency(metadata) - uniq = metadata.uniq + # check for consistency except for timestamp - to enable parallel map generation + uniq = metadata.uniq{ |m| m.keys.concat(m.values_at(:type, :commit, :version)) } raise "Can't load execution maps with different metadata. Metadata: #{uniq}" if uniq.size > 1 end end diff --git a/lib/crystalball/rails/map_generator/i18n_strategy/simple_patch.rb b/lib/crystalball/rails/map_generator/i18n_strategy/simple_patch.rb index 7b77bbbe..21721705 100644 --- a/lib/crystalball/rails/map_generator/i18n_strategy/simple_patch.rb +++ b/lib/crystalball/rails/map_generator/i18n_strategy/simple_patch.rb @@ -37,15 +37,16 @@ def revert! # Will replace original `I18n::Backend::Simple#load_file`. # Stores filename in current thread def cb_patched_load_file(filename, *args) - Thread.current[:cb_locale_file_name] = filename + set_cb_locale_file_name(filename) cb_original_load_file(filename, *args) end # Will replace original `I18n::Backend::Simple#store_translations`. # Adds filename for each value def cb_patched_store_translations(locale, data, *args) - cb_add_filename_to_values(data, Thread.current[:cb_locale_file_name]) - cb_original_store_translations(locale, data, *args) + data_unfreeze = data.dup + cb_add_filename_to_values(data_unfreeze, get_cb_locale_file_name) + cb_original_store_translations(locale, data_unfreeze, *args) end # Will replace original `I18n::Backend::Simple#lookup`. @@ -57,6 +58,14 @@ def cb_patched_lookup(*args) private + def set_cb_locale_file_name(filename) + Thread.current[:cb_locale_file_name] = filename + end + + def get_cb_locale_file_name + Thread.current[:cb_locale_file_name] + end + def cb_add_filename_to_values(data, filename) data.each do |key, value| case value diff --git a/lib/crystalball/rspec/runner.rb b/lib/crystalball/rspec/runner.rb index e124f735..920fb74a 100644 --- a/lib/crystalball/rspec/runner.rb +++ b/lib/crystalball/rspec/runner.rb @@ -41,7 +41,7 @@ def config @config ||= begin config_src = if config_file require 'yaml' - YAML.safe_load(config_file.read) + YAML.safe_load(config_file.read, permitted_classes: [Symbol]) else {} end diff --git a/spec/map_generator/factory_bot_strategy/factory_runner_patch_spec.rb b/spec/map_generator/factory_bot_strategy/factory_runner_patch_spec.rb index 57f5e722..da0ca105 100644 --- a/spec/map_generator/factory_bot_strategy/factory_runner_patch_spec.rb +++ b/spec/map_generator/factory_bot_strategy/factory_runner_patch_spec.rb @@ -42,8 +42,9 @@ def run(*); end let(:used_factories) { [] } before do + class_double('FactoryBotConstant::Internal', factory_by_name: nil).as_stubbed_const allow(Crystalball::MapGenerator::FactoryBotStrategy).to receive(:used_factories).and_return(used_factories) - allow(FactoryBotConstant).to receive(:factory_by_name).with(:bad_dummy) { double(name: :dummy) } + allow(FactoryBotConstant::Internal).to receive(:factory_by_name).with(:bad_dummy) { double(name: :dummy) } instance.instance_variable_set(:@name, :bad_dummy) end diff --git a/spec/map_generator_spec.rb b/spec/map_generator_spec.rb index d3da2127..12db104b 100644 --- a/spec/map_generator_spec.rb +++ b/spec/map_generator_spec.rb @@ -87,7 +87,7 @@ def s.call(example_group_map, _example) end it 'dump new map metadata to storage' do - expect(storage).to receive(:dump).with(type: map_class.to_s, commit: 'abc', timestamp: 1234, version: 1.0) + expect(storage).to receive(:dump).with({ type: map_class.to_s, commit: 'abc', timestamp: 1234, version: 1.0 }) subject.start! end @@ -181,7 +181,7 @@ def example_map(uid) allow(configuration.strategies).to receive(:run).with(kind_of(Crystalball::ExampleGroupMap), any_args) .and_return(example_map('1'), example_map('2'), example_map('3')) - expect(storage).to receive(:dump).with('1' => [], '2' => []).once + expect(storage).to receive(:dump).with({ '1' => [], '2' => [] }).once expect_any_instance_of(map_class).to receive(:clear!).once.and_call_original subject.refresh_for_case(rspec_example('1')) subject.refresh_for_case(rspec_example('2')) diff --git a/spec/rails/map_generator/i18n_strategy/simple_patch_spec.rb b/spec/rails/map_generator/i18n_strategy/simple_patch_spec.rb index e9b641dc..4d812a40 100644 --- a/spec/rails/map_generator/i18n_strategy/simple_patch_spec.rb +++ b/spec/rails/map_generator/i18n_strategy/simple_patch_spec.rb @@ -67,11 +67,12 @@ def lookup; end let(:locale) { :en } let(:data) { {user: {name: 'John'}} } let(:filename) { 'locale/foo.yml' } + let(:thread) { class_double(Thread) } - before { allow(Thread.current).to receive(:[]).with(:cb_locale_file_name) { filename } } + before { allow_any_instance_of(described_class).to receive(:get_cb_locale_file_name).and_return(filename) } it do - expect(instance).to receive(:cb_original_store_translations).with(locale, user: {name: {cb_filename: filename, cb_value: 'John'}}) + expect(instance).to receive(:cb_original_store_translations).with(locale, { user: {name: {cb_filename: filename, cb_value: 'John'}} }) subject end diff --git a/spec/rails/tables_map_generator_spec.rb b/spec/rails/tables_map_generator_spec.rb index 77667f46..195d5cd2 100644 --- a/spec/rails/tables_map_generator_spec.rb +++ b/spec/rails/tables_map_generator_spec.rb @@ -74,7 +74,7 @@ end it 'dump new map metadata to storage' do - expect(storage).to receive(:dump).with(type: map_class.to_s, commit: 'abc', version: 1.0) + expect(storage).to receive(:dump).with({ type: map_class.to_s, commit: 'abc', version: 1.0 }) subject.start! end end @@ -101,7 +101,7 @@ end specify do - expect(storage).to receive(:dump).with('Dummy' => ['file1']) + expect(storage).to receive(:dump).with({ 'Dummy' => ['file1'] }) subject.finalize! end end diff --git a/spec/rspec/runner_spec.rb b/spec/rspec/runner_spec.rb index d5c1c17a..d47670f4 100644 --- a/spec/rspec/runner_spec.rb +++ b/spec/rspec/runner_spec.rb @@ -24,7 +24,7 @@ end context 'with CRYSTALBALL_CONFIG env variable set' do - let(:expected_config) { YAML.safe_load(Pathname('spec/fixtures/crystalball.yml').read) } + let(:expected_config) { YAML.safe_load(Pathname('spec/fixtures/crystalball.yml').read, permitted_classes: [Symbol]) } around do |example| ENV['CRYSTALBALL_CONFIG'] = 'spec/fixtures/crystalball.yml'