eac_ruby_utils 0.18.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 756eb69d3a1307a39239c2640d0976ca21d82bbcab84bcc17237c83b65efd3f3
4
- data.tar.gz: 6231ab9073aec9b7989d700af8b1098173f662adf53dfb323b554ce125ddd19b
3
+ metadata.gz: 35cad818d0449efc8f237c35d3d610481291074b374eec4172fa1ea01585da21
4
+ data.tar.gz: 6a2cb53075c922aad98fef9bdcc95ad0401cbbd23f3ff6465861bacb2b8f9833
5
5
  SHA512:
6
- metadata.gz: d95f14f0bdcb4dacc15bb69b78d862b7eda60c73b2d0b6616b1a29d974f4d981c37b5dcff958a2ab6ba2378f2c6daa89c1c876abf56efeab2ddca367673ec576
7
- data.tar.gz: ba6472d7a7831f55da514677a4cc088c132ff91ce50e4317b18aab0b7870724e23eede3aef543ef6d3e11606fe270b53aefe02c8d0da135fe84b3c9f54a3dafa
6
+ metadata.gz: 50329b46d50c97ce8dbe491367d3a1f33ecc8a347a8580d6a977847afd3eab450ca96918f5b3fb92d375031c1e6cc1fd9aeb48289447894898d25400e90c4353
7
+ data.tar.gz: 6c8fda13c7c6c5b6a0e7bd5e8260c0824c66e0c4786913ef7a262acb1596ab315a5a08ebdfc48ffb7ee8a1f946f293f40778dd4a987a826905cca5754a101edb
@@ -8,8 +8,15 @@ module EacRubyUtils
8
8
  require 'eac_ruby_utils/core_ext'
9
9
  require 'eac_ruby_utils/envs'
10
10
  require 'eac_ruby_utils/filesystem_cache'
11
+ require 'eac_ruby_utils/fs_cache'
11
12
  require 'eac_ruby_utils/listable'
13
+ require 'eac_ruby_utils/gem'
14
+ require 'eac_ruby_utils/gem/minitest_test'
15
+ require 'eac_ruby_utils/gem/rspec_test'
16
+ require 'eac_ruby_utils/gem/test'
17
+ require 'eac_ruby_utils/gem/test_all'
12
18
  require 'eac_ruby_utils/options_consumer'
19
+ require 'eac_ruby_utils/settings_provider'
13
20
  require 'eac_ruby_utils/patch'
14
21
  require 'eac_ruby_utils/patches'
15
22
  require 'eac_ruby_utils/paths_hash'
@@ -1,45 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/settings_provider'
4
+
3
5
  module EacRubyUtils
4
6
  module Console
5
7
  class DocoptRunner
8
+ include ::EacRubyUtils::SettingsProvider
9
+
6
10
  attr_reader :settings
7
11
 
8
12
  private
9
13
 
10
14
  def setting_value(key, required = true)
11
- %i[setting_from_method setting_from_argument setting_from_constant].each do |method|
12
- value = send(method, key)
13
- return value if value
14
- end
15
- return nil unless required
16
-
17
- raise "Setting \"#{key}\" not found. Implement a \"#{key}\" method" \
18
- ", declare a #{setting_constant(key, true)} constant" \
19
- "or pass a #{key.to_sym} option to #{self.class.name}.new() method."
20
- end
21
-
22
- def setting_from_argument(key)
23
- settings[key]
24
- end
25
-
26
- def setting_from_constant(key)
27
- constant_name = setting_constant(key)
28
- begin
29
- self.class.const_get(constant_name)
30
- rescue NameError
31
- nil
32
- end
33
- end
34
-
35
- def setting_from_method(key)
36
- respond_to?(key) ? send(key) : nil
37
- end
38
-
39
- def setting_constant(key, fullname = false)
40
- name = key.to_s.underscore.upcase
41
- name = "#{self.class.name}::#{name}" if fullname
42
- name
15
+ super(key, required: required, order: %w[method settings_object constant])
43
16
  end
44
17
  end
45
18
  end
@@ -6,13 +6,13 @@ module EacRubyUtils
6
6
  module Envs
7
7
  class Process
8
8
  def initialize(command)
9
- @command = command
10
- @stdout, @stderr, exit_code = Open3.capture3(command)
11
- @exit_code = exit_code.to_i
9
+ @data = { command: command }
10
+ @data[:stdout], @data[:stderr], @data[:exit_code] = Open3.capture3(command)
11
+ @data[:exit_code] = @data[:exit_code].to_i
12
12
  end
13
13
 
14
14
  def to_h
15
- { exit_code: @exit_code, stdout: @stdout, stderr: @stderr, command: @command }
15
+ @data.dup
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/filesystem_cache'
4
+
5
+ module EacRubyUtils
6
+ class << self
7
+ def fs_cache
8
+ @fs_cache ||= ::EacRubyUtils::FilesystemCache.new(::Dir.tmpdir, 'eac_ruby_utils', '.cache')
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_ruby_utils/envs'
5
+
6
+ module EacRubyUtils
7
+ class Gem
8
+ enable_simple_cache
9
+
10
+ common_constructor :root
11
+ set_callback :initialize, :after do
12
+ @root = ::Pathname.new(root).expand_path
13
+ end
14
+
15
+ def to_s
16
+ root.basename.to_s
17
+ end
18
+
19
+ def bundle(*args)
20
+ ::EacRubyUtils::Envs.local.command('bundle', *args)
21
+ .envvar('BUNDLE_GEMFILE', gemfile_path)
22
+ .chdir(root)
23
+ end
24
+
25
+ def gemfile_lock_gem_version(gem_name)
26
+ gemfile_lock_content.specs.find { |gem| gem.name == gem_name }.if_present(&:version)
27
+ end
28
+
29
+ def gemfile_lock_content
30
+ ::Bundler::LockfileParser.new(::Bundler.read_file(gemfile_lock_path))
31
+ end
32
+
33
+ private
34
+
35
+ def gemfile_path_uncached
36
+ root.join('Gemfile')
37
+ end
38
+
39
+ def gemfile_lock_path_uncached
40
+ root.join('Gemfile.lock')
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/gem/test'
4
+
5
+ module EacRubyUtils
6
+ class Gem
7
+ class MinitestTest < ::EacRubyUtils::Gem::Test
8
+ def bundle_exec_args
9
+ %w[rake test]
10
+ end
11
+
12
+ def dependency_gem
13
+ 'minitest'
14
+ end
15
+
16
+ def test_directory
17
+ 'test'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/gem/test'
4
+
5
+ module EacRubyUtils
6
+ class Gem
7
+ class RspecTest < ::EacRubyUtils::Gem::Test
8
+ def bundle_exec_args
9
+ %w[rspec]
10
+ end
11
+
12
+ def dependency_gem
13
+ 'rspec-core'
14
+ end
15
+
16
+ def test_directory
17
+ 'spec'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_ruby_utils/fs_cache'
5
+ require 'eac_ruby_utils/listable'
6
+ require 'eac_ruby_utils/on_clean_ruby_environment'
7
+
8
+ module EacRubyUtils
9
+ class Gem
10
+ class Test
11
+ include ::EacRubyUtils::Listable
12
+
13
+ enable_simple_cache
14
+ lists.add_string :result, :failed, :nonexistent, :successful
15
+
16
+ common_constructor :gem
17
+
18
+ def elegible?
19
+ dependency_present? && gem.root.join(test_directory).exist?
20
+ end
21
+
22
+ def dependency_present?
23
+ gem.gemfile_path.exist? && gem.gemfile_lock_gem_version(dependency_gem).present?
24
+ end
25
+
26
+ def name
27
+ self.class.name.demodulize.gsub(/Test\z/, '')
28
+ end
29
+
30
+ def stdout_cache
31
+ root_cache.child('stdout')
32
+ end
33
+
34
+ def stderr_cache
35
+ root_cache.child('stderr')
36
+ end
37
+
38
+ def to_s
39
+ "#{gem}[#{name}]"
40
+ end
41
+
42
+ private
43
+
44
+ def result_uncached
45
+ return RESULT_NONEXISTENT unless elegible?
46
+ bundle_run ? RESULT_SUCCESSFUL : RESULT_FAILED
47
+ end
48
+
49
+ def bundle_run
50
+ r = ::EacRubyUtils.on_clean_ruby_environment do
51
+ gem.bundle('exec', *bundle_exec_args).execute
52
+ end
53
+ stdout_cache.write(r[:stdout])
54
+ stderr_cache.write(r[:stderr])
55
+ r[:exit_code].zero?
56
+ end
57
+
58
+ def root_cache
59
+ ::EacRubyUtils.fs_cache.child(gem.root.to_s.parameterize, self.class.name.parameterize)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/gem/minitest_test'
4
+ require 'eac_ruby_utils/gem/rspec_test'
5
+
6
+ module EacRubyUtils
7
+ class Gem
8
+ class TestAll
9
+ enable_console_speaker
10
+ enable_simple_cache
11
+ common_constructor :gems
12
+ set_callback :initialize, :after, :run
13
+
14
+ private
15
+
16
+ def all_tests_uncached
17
+ decorated_gems.flat_map(&:tests)
18
+ end
19
+
20
+ def bundle_all_gems
21
+ infom 'Bundling all gems...'
22
+ decorated_gems.each do |gem|
23
+ next unless gem.gemfile_path.exist?
24
+ infov 'Bundle install', gem
25
+ gem.bundle.execute!
26
+ end
27
+ end
28
+
29
+ def decorated_gems_uncached
30
+ gems.map { |gem| DecoratedGem.new(gem) }
31
+ end
32
+
33
+ def failed_tests_uncached
34
+ all_tests.select { |r| r.result == ::EacRubyUtils::Gem::Test::RESULT_FAILED }
35
+ end
36
+
37
+ def final_results_banner
38
+ if failed_tests.any?
39
+ warn 'Some test did not pass:'
40
+ failed_tests.each do |test|
41
+ infov ' * Test', test
42
+ infov ' * STDOUT', test.stdout_cache.content_path
43
+ infov ' * STDERR', test.stderr_cache.content_path
44
+ end
45
+ else
46
+ success 'All tests passed'
47
+ end
48
+ end
49
+
50
+ def run
51
+ start_banner
52
+ bundle_all_gems
53
+ test_all_gems
54
+ final_results_banner
55
+ end
56
+
57
+ def start_banner
58
+ infov 'Gems to test', decorated_gems.count
59
+ end
60
+
61
+ def test_all_gems
62
+ infom 'Running tests...'
63
+ all_tests.each do |test|
64
+ infov test, Result.new(test.result).tag
65
+ end
66
+ end
67
+
68
+ class DecoratedGem < ::SimpleDelegator
69
+ def tests
70
+ [::EacRubyUtils::Gem::MinitestTest.new(__getobj__),
71
+ ::EacRubyUtils::Gem::RspecTest.new(__getobj__)]
72
+ end
73
+ end
74
+
75
+ class Result
76
+ common_constructor :result
77
+
78
+ COLORS = {
79
+ ::EacRubyUtils::Gem::Test::RESULT_FAILED => :red,
80
+ ::EacRubyUtils::Gem::Test::RESULT_NONEXISTENT => :white,
81
+ ::EacRubyUtils::Gem::Test::RESULT_SUCCESSFUL => :green
82
+ }.freeze
83
+
84
+ def tag
85
+ result.to_s.send(color)
86
+ end
87
+
88
+ def color
89
+ COLORS.fetch(result)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ class << self
5
+ def on_clean_ruby_environment
6
+ on_clean_envvars('BUNDLE', 'RUBY') { yield }
7
+ end
8
+
9
+ private
10
+
11
+ def on_clean_envvars(*start_with_vars)
12
+ old_values = envvars_starting_with(start_with_vars)
13
+ old_values.keys.each { |k| ENV.delete(k) }
14
+ yield
15
+ ensure
16
+ old_values&.each { |k, v| ENV[k] = v }
17
+ end
18
+
19
+ def envvars_starting_with(start_with_vars)
20
+ ENV.select { |k, _v| start_with_vars.any? { |var| k.start_with?(var) } }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/string/inflections'
4
+ require 'eac_ruby_utils/options_consumer'
5
+
6
+ module EacRubyUtils
7
+ # Provide a option by constant, method or options object.
8
+ module SettingsProvider
9
+ def setting_constant_name(key, fullname = false)
10
+ name = key.to_s.underscore.upcase
11
+ name = "#{self.class.name}::#{name}" if fullname
12
+ name
13
+ end
14
+
15
+ def setting_search_order
16
+ %w[settings_object method constant]
17
+ end
18
+
19
+ def settings_object
20
+ respond_to?(settings_object_name) ? send(settings_object_name) : {}
21
+ end
22
+
23
+ def settings_object_name
24
+ 'settings'
25
+ end
26
+
27
+ def setting_value(key, options = {})
28
+ options = parse_setting_value_options(options)
29
+ options.order.each do |method|
30
+ value = send("setting_value_by_#{method}", key)
31
+ return value if value
32
+ end
33
+ return nil unless options.required
34
+
35
+ raise "Setting \"#{key}\" not found. Supply in #{settings_object_name}, implement a " \
36
+ "\"#{key}\" method or declare a #{setting_constant_name(key, true)} constant."
37
+ end
38
+
39
+ def setting_value_by_constant(key)
40
+ constant_name = setting_constant_name(key)
41
+ begin
42
+ self.class.const_get(constant_name)
43
+ rescue NameError
44
+ nil
45
+ end
46
+ end
47
+
48
+ def setting_value_by_method(key)
49
+ respond_to?(key) ? send(key) : nil
50
+ end
51
+
52
+ def setting_value_by_settings_object(key)
53
+ settings_object[key.to_s] || settings_object[key.to_sym]
54
+ end
55
+
56
+ private
57
+
58
+ def parse_setting_value_options(options)
59
+ r = ::EacRubyUtils::OptionsConsumer.new(options).consume_all(:required, :order, ostruct: true)
60
+ r.required = true if r.required.nil?
61
+ r.order = setting_search_order if r.order.nil?
62
+ r
63
+ end
64
+ end
65
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.18.1'
4
+ VERSION = '0.19.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_ruby_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esquilo Azul Company
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-07 00:00:00.000000000 Z
11
+ date: 2020-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -143,6 +143,12 @@ files:
143
143
  - lib/eac_ruby_utils/envs/process.rb
144
144
  - lib/eac_ruby_utils/envs/ssh_env.rb
145
145
  - lib/eac_ruby_utils/filesystem_cache.rb
146
+ - lib/eac_ruby_utils/fs_cache.rb
147
+ - lib/eac_ruby_utils/gem.rb
148
+ - lib/eac_ruby_utils/gem/minitest_test.rb
149
+ - lib/eac_ruby_utils/gem/rspec_test.rb
150
+ - lib/eac_ruby_utils/gem/test.rb
151
+ - lib/eac_ruby_utils/gem/test_all.rb
146
152
  - lib/eac_ruby_utils/listable.rb
147
153
  - lib/eac_ruby_utils/listable/class_methods.rb
148
154
  - lib/eac_ruby_utils/listable/instance_methods.rb
@@ -151,6 +157,7 @@ files:
151
157
  - lib/eac_ruby_utils/listable/lists.rb
152
158
  - lib/eac_ruby_utils/listable/string_list.rb
153
159
  - lib/eac_ruby_utils/listable/value.rb
160
+ - lib/eac_ruby_utils/on_clean_ruby_environment.rb
154
161
  - lib/eac_ruby_utils/options_consumer.rb
155
162
  - lib/eac_ruby_utils/patch.rb
156
163
  - lib/eac_ruby_utils/patches.rb
@@ -173,6 +180,7 @@ files:
173
180
  - lib/eac_ruby_utils/rspec.rb
174
181
  - lib/eac_ruby_utils/rspec/conditional.rb
175
182
  - lib/eac_ruby_utils/rspec/stubbed_ssh.rb
183
+ - lib/eac_ruby_utils/settings_provider.rb
176
184
  - lib/eac_ruby_utils/simple_cache.rb
177
185
  - lib/eac_ruby_utils/templates.rb
178
186
  - lib/eac_ruby_utils/templates/directory.rb