eac_ruby_utils 0.62.0 → 0.66.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/eac_ruby_utils/context.rb +31 -0
  3. data/lib/eac_ruby_utils/contextualizable.rb +12 -7
  4. data/lib/eac_ruby_utils/envs/command.rb +10 -5
  5. data/lib/eac_ruby_utils/filesystem_cache.rb +6 -0
  6. data/lib/eac_ruby_utils/patches/module/common_concern.rb +0 -1
  7. data/lib/eac_ruby_utils/patches/module/context.rb +11 -0
  8. data/lib/eac_ruby_utils/patches/regexp/to_parser.rb +10 -0
  9. data/lib/eac_ruby_utils/regexp_parser.rb +34 -0
  10. data/lib/eac_ruby_utils/rspec/conditional.rb +1 -4
  11. data/lib/eac_ruby_utils/simple_cache.rb +18 -5
  12. data/lib/eac_ruby_utils/version.rb +1 -1
  13. metadata +8 -74
  14. data/lib/eac_ruby_utils/configs.rb +0 -74
  15. data/lib/eac_ruby_utils/configs/base.rb +0 -43
  16. data/lib/eac_ruby_utils/configs/file.rb +0 -47
  17. data/lib/eac_ruby_utils/console.rb +0 -5
  18. data/lib/eac_ruby_utils/console/configs.rb +0 -38
  19. data/lib/eac_ruby_utils/console/configs/entry_reader.rb +0 -81
  20. data/lib/eac_ruby_utils/console/configs/password_entry_reader.rb +0 -18
  21. data/lib/eac_ruby_utils/console/configs/read_entry_options.rb +0 -46
  22. data/lib/eac_ruby_utils/console/configs/store_passwords_entry_reader.rb +0 -27
  23. data/lib/eac_ruby_utils/console/docopt_runner.rb +0 -45
  24. data/lib/eac_ruby_utils/console/docopt_runner/_class_methods.rb +0 -18
  25. data/lib/eac_ruby_utils/console/docopt_runner/_doc.rb +0 -25
  26. data/lib/eac_ruby_utils/console/docopt_runner/_settings.rb +0 -19
  27. data/lib/eac_ruby_utils/console/docopt_runner/_subcommands.rb +0 -154
  28. data/lib/eac_ruby_utils/console/speaker.rb +0 -133
  29. data/lib/eac_ruby_utils/console/speaker/_class_methods.rb +0 -39
  30. data/lib/eac_ruby_utils/console/speaker/_constants.rb +0 -14
  31. data/lib/eac_ruby_utils/console/speaker/list.rb +0 -63
  32. data/lib/eac_ruby_utils/console/speaker/node.rb +0 -26
  33. data/lib/eac_ruby_utils/patches/module/console_speaker.rb +0 -10
  34. data/lib/eac_ruby_utils/patches/module/template.rb +0 -10
  35. data/lib/eac_ruby_utils/patches/object/template.rb +0 -9
  36. data/lib/eac_ruby_utils/paths_hash.rb +0 -56
  37. data/lib/eac_ruby_utils/paths_hash/entry_key_error.rb +0 -8
  38. data/lib/eac_ruby_utils/paths_hash/node.rb +0 -67
  39. data/lib/eac_ruby_utils/paths_hash/path_search.rb +0 -39
  40. data/lib/eac_ruby_utils/templates.rb +0 -9
  41. data/lib/eac_ruby_utils/templates/directory.rb +0 -110
  42. data/lib/eac_ruby_utils/templates/file.rb +0 -50
  43. data/lib/eac_ruby_utils/templates/searcher.rb +0 -55
  44. data/lib/eac_ruby_utils/templates/variable_not_found_error.rb +0 -7
  45. data/lib/eac_ruby_utils/templates/variable_providers.rb +0 -25
  46. data/lib/eac_ruby_utils/templates/variable_providers/base.rb +0 -23
  47. data/lib/eac_ruby_utils/templates/variable_providers/entries_reader.rb +0 -25
  48. data/lib/eac_ruby_utils/templates/variable_providers/generic.rb +0 -25
  49. data/lib/eac_ruby_utils/templates/variable_providers/hash.rb +0 -29
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'colorize'
4
- require 'io/console'
5
- require 'eac_ruby_utils/patches/hash/options_consumer'
6
- require 'eac_ruby_utils/require_sub'
7
- ::EacRubyUtils.require_sub __FILE__
8
-
9
- module EacRubyUtils
10
- module Console
11
- # https://github.com/fazibear/colorize
12
- module Speaker
13
- def on_speaker_node(&block)
14
- ::EacRubyUtils::Console::Speaker.on_node(&block)
15
- end
16
-
17
- def puts(string = '')
18
- string.to_s.each_line do |line|
19
- current_node.stderr.puts(current_node.stderr_line_prefix.to_s + line)
20
- end
21
- end
22
-
23
- def out(string = '')
24
- current_node.stdout.write(string.to_s)
25
- end
26
-
27
- def fatal_error(string)
28
- puts "ERROR: #{string}".white.on_red
29
- Kernel.exit 1 # rubocop:disable Rails/Exit
30
- end
31
-
32
- def title(string)
33
- string = string.to_s
34
- puts(('-' * (8 + string.length)).green)
35
- puts("--- #{string} ---".green)
36
- puts(('-' * (8 + string.length)).green)
37
- puts
38
- end
39
-
40
- def info(string)
41
- puts string.to_s.white
42
- end
43
-
44
- def infom(string)
45
- puts string.to_s.light_yellow
46
- end
47
-
48
- def warn(string)
49
- puts string.to_s.yellow
50
- end
51
-
52
- # Options:
53
- # +bool+ ([Boolean], default: +false+): requires a answer "yes" or "no".
54
- # +list+ ([Hash] or [Array], default: +nil+): requires a answer from a list.
55
- # +noecho+ ([Boolean], default: +false+): does not output answer.
56
- def request_input(question, options = {})
57
- bool, list, noecho = options.to_options_consumer.consume_all(:bool, :list, :noecho)
58
- if list
59
- request_from_list(question, list, noecho)
60
- elsif bool
61
- request_from_bool(question, noecho)
62
- else
63
- request_string(question, noecho)
64
- end
65
- end
66
-
67
- def infov(*args)
68
- r = []
69
- args.each_with_index do |v, i|
70
- if i.even?
71
- r << "#{v}: ".cyan
72
- else
73
- r.last << v.to_s
74
- end
75
- end
76
- puts r.join(', ')
77
- end
78
-
79
- def success(string)
80
- puts string.to_s.green
81
- end
82
-
83
- private
84
-
85
- def list_value(list, input)
86
- values = list_values(list)
87
- return input, true unless values
88
- return input, false unless values.include?(input)
89
- end
90
-
91
- def list_values(list)
92
- if list.is_a?(::Hash)
93
- list.keys.map(&:to_s)
94
- elsif list.is_a?(::Array)
95
- list.map(&:to_s)
96
- end
97
- end
98
-
99
- def request_from_bool(question, noecho)
100
- request_from_list(question, { yes: true, y: true, no: false, n: false }, noecho)
101
- end
102
-
103
- def request_from_list(question, list, noecho)
104
- list = ::EacRubyUtils::Console::Speaker::List.build(list)
105
- loop do
106
- input = request_string("#{question} [#{list.valid_labels.join('/')}]", noecho)
107
- return list.build_value(input) if list.valid_value?(input)
108
-
109
- warn "Invalid input: \"#{input}\" (Valid: #{list.valid_labels.join(', ')})"
110
- end
111
- end
112
-
113
- def request_string(question, noecho)
114
- current_node.stderr.write "#{question}: ".to_s.yellow
115
- noecho ? request_string_noecho : request_string_echo
116
- end
117
-
118
- def request_string_noecho
119
- r = current_node.stdin.noecho(&:gets).chomp.strip
120
- current_node.stderr.write("\n")
121
- r
122
- end
123
-
124
- def request_string_echo
125
- current_node.stdin.gets.chomp.strip
126
- end
127
-
128
- def current_node
129
- ::EacRubyUtils::Console::Speaker.current_node
130
- end
131
- end
132
- end
133
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/console/speaker/node'
4
-
5
- module EacRubyUtils
6
- module Console
7
- module Speaker
8
- class << self
9
- def current_node
10
- nodes_stack.last
11
- end
12
-
13
- def on_node(&block)
14
- push
15
- yield(*(block.arity.zero? ? [] : [current_node]))
16
- ensure
17
- pop
18
- end
19
-
20
- def push
21
- nodes_stack << ::EacRubyUtils::Console::Speaker::Node.new
22
- current_node
23
- end
24
-
25
- def pop
26
- return nodes_stack.pop if nodes_stack.count > 1
27
-
28
- raise "Cannot remove first node (nodes_stack.count: #{nodes_stack.count})"
29
- end
30
-
31
- private
32
-
33
- def nodes_stack
34
- @nodes_stack ||= [::EacRubyUtils::Console::Speaker::Node.new]
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/by_reference'
4
-
5
- module EacRubyUtils
6
- module Console
7
- # https://github.com/fazibear/colorize
8
- module Speaker
9
- STDERR = ::EacRubyUtils::ByReference.new { $stderr }
10
- STDIN = ::EacRubyUtils::ByReference.new { $stdin }
11
- STDOUT = ::EacRubyUtils::ByReference.new { $stdout }
12
- end
13
- end
14
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/hash_with_indifferent_access'
4
- require 'ostruct'
5
-
6
- module EacRubyUtils
7
- module Console
8
- module Speaker
9
- class List
10
- class << self
11
- def build(list)
12
- return List.new(hash_to_values(list)) if list.is_a?(::Hash)
13
- return List.new(array_to_values(list)) if list.is_a?(::Array)
14
-
15
- raise "Invalid list: #{list} (#{list.class})"
16
- end
17
-
18
- private
19
-
20
- def hash_to_values(list)
21
- list.map { |key, value| ::OpenStruct.new(key: key, label: key, value: value) }
22
- end
23
-
24
- def array_to_values(list)
25
- list.map { |value| ::OpenStruct.new(key: value, label: value, value: value) }
26
- end
27
- end
28
-
29
- attr_reader :values
30
-
31
- def initialize(values)
32
- @values = values.map do |v|
33
- ::OpenStruct.new(key: to_key(v.key), label: to_label(v.label), value: v.value)
34
- end
35
- end
36
-
37
- def valid_labels
38
- values.map(&:label)
39
- end
40
-
41
- def valid_value?(value)
42
- values.any? { |v| v.key == to_key(value) }
43
- end
44
-
45
- def to_key(value)
46
- to_label(value).downcase
47
- end
48
-
49
- def to_label(value)
50
- value.to_s.strip
51
- end
52
-
53
- def build_value(value)
54
- key = to_key(value)
55
- values.each do |v|
56
- return v.value if v.key == key
57
- end
58
- raise "Value not found: \"#{value}\" (#{values})"
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/patches/object/if_present'
4
- require 'eac_ruby_utils/console/speaker/_constants'
5
-
6
- module EacRubyUtils
7
- module Console
8
- module Speaker
9
- class Node
10
- attr_accessor :stdin, :stdout, :stderr, :stderr_line_prefix
11
-
12
- def initialize(parent = nil)
13
- self.stdin = parent.if_present(::EacRubyUtils::Console::Speaker::STDIN, &:stdin)
14
- self.stdout = parent.if_present(::EacRubyUtils::Console::Speaker::STDOUT, &:stdout)
15
- self.stderr = parent.if_present(::EacRubyUtils::Console::Speaker::STDERR, &:stderr)
16
- self.stderr_line_prefix = parent.if_present('', &:stderr_line_prefix)
17
- end
18
-
19
- def configure
20
- yield(self)
21
- self
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/patch'
4
- require 'eac_ruby_utils/console/speaker'
5
-
6
- class Module
7
- def enable_console_speaker
8
- ::EacRubyUtils.patch(self, ::EacRubyUtils::Console::Speaker)
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/string/inflections'
4
- require 'eac_ruby_utils/templates/searcher'
5
-
6
- class Module
7
- def template
8
- @template ||= ::EacRubyUtils::Templates::Searcher.default.template(name.underscore)
9
- end
10
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/patches/module/template'
4
-
5
- class Object
6
- def template
7
- self.class.template
8
- end
9
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module EacRubyUtils
6
- class PathsHash
7
- require_sub __FILE__
8
-
9
- class << self
10
- def parse_entry_key(entry_key)
11
- r = entry_key.to_s.strip
12
- raise ::EacRubyUtils::PathsHash::EntryKeyError, 'Entry key cannot start or end with dot' if
13
- r.start_with?('.') || r.end_with?('.')
14
-
15
- r = r.split('.').map(&:strip)
16
- if r.empty?
17
- raise ::EacRubyUtils::PathsHash::EntryKeyError, "Entry key \"#{entry_key}\" is empty"
18
- end
19
- return r.map(&:to_sym) unless r.any?(&:blank?)
20
-
21
- raise ::EacRubyUtils::PathsHash::EntryKeyError,
22
- "Entry key \"#{entry_key}\" has at least one blank part"
23
- end
24
- end
25
-
26
- attr_reader :root
27
-
28
- def initialize(source_hash = {})
29
- @root = Node.new(source_hash)
30
- end
31
-
32
- def [](entry_key)
33
- root.read_entry(::EacRubyUtils::PathsHash::PathSearch.parse_entry_key(entry_key))
34
- end
35
-
36
- def []=(entry_key, entry_value)
37
- root.write_entry(
38
- ::EacRubyUtils::PathsHash::PathSearch.parse_entry_key(entry_key), entry_value
39
- )
40
- end
41
-
42
- def fetch(entry_key)
43
- root.fetch(::EacRubyUtils::PathsHash::PathSearch.parse_entry_key(entry_key))
44
- end
45
-
46
- def key?(entry_key)
47
- root.entry?(::EacRubyUtils::PathsHash::PathSearch.parse_entry_key(entry_key))
48
- end
49
-
50
- delegate :to_h, to: :root
51
-
52
- private
53
-
54
- attr_reader :data
55
- end
56
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacRubyUtils
4
- class PathsHash
5
- class EntryKeyError < StandardError
6
- end
7
- end
8
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
- require 'eac_ruby_utils/paths_hash/entry_key_error'
5
-
6
- module EacRubyUtils
7
- class PathsHash
8
- class Node
9
- PATH_SEARCH_UNENDED_ERROR_MESSAGE = 'Path search is not a Node and is not ended'
10
-
11
- def initialize(source_hash)
12
- source_hash.assert_argument(Hash, 'source_hash')
13
- @data = source_hash.map { |k, v| [k.to_sym, v.is_a?(Hash) ? Node.new(v) : v] }.to_h
14
- end
15
-
16
- def entry?(path_search)
17
- return false unless data.key?(path_search.cursor)
18
- return true if path_search.ended?
19
- return data.fetch(path_search.cursor).entry?(path_search.succeeding) if
20
- data.fetch(path_search.cursor).is_a?(Node)
21
-
22
- false # Paths continue and there is not available nodes
23
- end
24
-
25
- def fetch(path_search)
26
- if data.key?(path_search.cursor)
27
- node = data.fetch(path_search.cursor)
28
- return (node.is_a?(Node) ? node.to_h : node) if path_search.ended?
29
- return nil if node.blank?
30
- return node.fetch(path_search.succeeding) if node.is_a?(Node)
31
- end
32
-
33
- path_search.raise_error(PATH_SEARCH_UNENDED_ERROR_MESSAGE)
34
- end
35
-
36
- def to_h
37
- data.map { |k, v| [k, v.is_a?(Node) ? v.to_h : v] }.to_h
38
- end
39
-
40
- def read_entry(path_search)
41
- node = data[path_search.cursor]
42
- return (node.is_a?(Node) ? node.to_h : node) if path_search.ended?
43
- return nil if node.blank?
44
- return node.read_entry(path_search.succeeding) if node.is_a?(Node)
45
-
46
- path_search.raise_error(PATH_SEARCH_UNENDED_ERROR_MESSAGE)
47
- end
48
-
49
- def write_entry(path_search, value)
50
- if path_search.ended?
51
- data[path_search.cursor] = value.is_a?(Hash) ? self.class.new(value) : value
52
- else
53
- assert_data_node(path_search.cursor).write_entry(path_search.succeeding, value)
54
- end
55
- end
56
-
57
- private
58
-
59
- attr_reader :data
60
-
61
- def assert_data_node(key)
62
- data[key] = self.class.new({}) unless data[key].is_a?(Node)
63
- data[key]
64
- end
65
- end
66
- end
67
- end