eac_ruby_utils 0.18.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/eac_ruby_utils.rb +7 -0
- data/lib/eac_ruby_utils/console/docopt_runner/_settings.rb +5 -32
- data/lib/eac_ruby_utils/envs/process.rb +4 -4
- data/lib/eac_ruby_utils/fs_cache.rb +11 -0
- data/lib/eac_ruby_utils/gem.rb +43 -0
- data/lib/eac_ruby_utils/gem/minitest_test.rb +21 -0
- data/lib/eac_ruby_utils/gem/rspec_test.rb +21 -0
- data/lib/eac_ruby_utils/gem/test.rb +63 -0
- data/lib/eac_ruby_utils/gem/test_all.rb +94 -0
- data/lib/eac_ruby_utils/on_clean_ruby_environment.rb +23 -0
- data/lib/eac_ruby_utils/settings_provider.rb +65 -0
- data/lib/eac_ruby_utils/version.rb +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35cad818d0449efc8f237c35d3d610481291074b374eec4172fa1ea01585da21
|
4
|
+
data.tar.gz: 6a2cb53075c922aad98fef9bdcc95ad0401cbbd23f3ff6465861bacb2b8f9833
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50329b46d50c97ce8dbe491367d3a1f33ecc8a347a8580d6a977847afd3eab450ca96918f5b3fb92d375031c1e6cc1fd9aeb48289447894898d25400e90c4353
|
7
|
+
data.tar.gz: 6c8fda13c7c6c5b6a0e7bd5e8260c0824c66e0c4786913ef7a262acb1596ab315a5a08ebdfc48ffb7ee8a1f946f293f40778dd4a987a826905cca5754a101edb
|
data/lib/eac_ruby_utils.rb
CHANGED
@@ -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
|
-
%
|
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
|
-
@
|
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
|
-
|
15
|
+
@data.dup
|
16
16
|
end
|
17
17
|
end
|
18
18
|
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
|
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.
|
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-
|
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
|