eac_ruby_utils 0.78.0 → 0.81.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: 04265a77c385833952f4e144e1384702799030c28add480973ac925d1042bde7
4
- data.tar.gz: bdb7856467fd1d77f75a468c2a2c3c292231a3387c40281da5325d098eda76cd
3
+ metadata.gz: 117028f86bd05a2b0ac4c20a34e486ce524241a85031992e22ba4afa596ca56c
4
+ data.tar.gz: 3a41859f48637bbf64a7846741d50e56d91df95f87906a256ac4332fd3ba9b85
5
5
  SHA512:
6
- metadata.gz: 70556b9064c0cf84e202e3f65c2f172c60e79304263abe596a1d7ec7a46753f4f58f81565ebeeaa644035f5fbb45f12cb2a5158a3084cd3fac634a0448c1953d
7
- data.tar.gz: 9c664e92bcefc75aac89e85016c8b8007bd14a061e46409b5c4b20cb36b8a80707046cb16302a8b1b26bd154cbb28c09027599e7494839abc707b6fe531a65f3
6
+ metadata.gz: 03140e219584a5544f3972cdcdb3050ec179ea7c2dd5dfcf0a1bbcb91b2dd20c077dd1be1c9a24e33c18937fecb0060b5b5126873b37e72efad2068ae217b121
7
+ data.tar.gz: 9d4c7245ef22cf5c160d5c56451ce0e25c8faa0f1a230cd6acdcb72ae507a8fc0fdef335fa2fab1268498d975513d966fdab72a2fd5aa046f1d53c9686f47e7f
@@ -60,7 +60,8 @@ module EacRubyUtils
60
60
  end
61
61
 
62
62
  def raise_abstract_method(method_name)
63
- raise ::NoMethodError, "Abstract method \"#{method_name}\" hit in \"#{self}\""
63
+ raise ::NoMethodError, "Abstract method \"#{method_name}\" hit in \"#{self}\"" \
64
+ " (Class: #{self.class})"
64
65
  end
65
66
  end
66
67
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/common_concern/module_setup'
4
+
5
+ module EacRubyUtils
6
+ class CompareBy
7
+ attr_reader :fields
8
+
9
+ def initialize(fields)
10
+ @fields = fields
11
+ end
12
+
13
+ def apply(klass)
14
+ pself = self
15
+ klass.include(::Comparable)
16
+ %i[<=> eql?].each do |cmp_method|
17
+ klass.define_method(cmp_method) do |other|
18
+ pself.object_values(self).send(cmp_method, pself.object_values(other))
19
+ end
20
+ end
21
+ klass.define_method(:hash) { pself.object_values(self).hash }
22
+ end
23
+
24
+ def object_values(object)
25
+ fields.map { |field| object.send(field) }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/inflector'
4
+
5
+ module EacRubyUtils
6
+ # Similar to Java's enum type (https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).
7
+ class Enum
8
+ class << self
9
+ def enum(key, *args, &block)
10
+ value = Value.new(self, key, args, &block)
11
+ raise ::ArgumentError, "#{self} already has a value with key=#{value.key}" if
12
+ value_set.include?(value)
13
+
14
+ value_set << value.apply
15
+
16
+ self
17
+ end
18
+
19
+ def values
20
+ value_set.map(&:value)
21
+ end
22
+
23
+ private
24
+
25
+ def value_set
26
+ @value_set ||= []
27
+ end
28
+ end
29
+
30
+ attr_reader :key
31
+
32
+ protected
33
+
34
+ def initialize(key)
35
+ @key = key
36
+ end
37
+
38
+ class Value
39
+ include ::Comparable
40
+
41
+ attr_reader :klass, :key, :args, :block
42
+
43
+ def initialize(klass, key, args, &block)
44
+ @klass = klass
45
+ @key = ::EacRubyUtils::Inflector.variableize(key.to_s).to_sym
46
+ @args = args
47
+ @block = block
48
+ end
49
+
50
+ def <=>(other)
51
+ key <=> other.key
52
+ end
53
+
54
+ def apply
55
+ define_constant
56
+ define_class_method
57
+
58
+ self
59
+ end
60
+
61
+ # @return [String]
62
+ def class_method_name
63
+ key.to_s
64
+ end
65
+
66
+ # @return [String]
67
+ def constant_name
68
+ class_method_name.upcase
69
+ end
70
+
71
+ def value
72
+ @value ||= uncached_value
73
+ end
74
+
75
+ private
76
+
77
+ def define_class_method
78
+ the_value = self
79
+ klass.define_singleton_method(class_method_name) { the_value.value }
80
+ end
81
+
82
+ def define_constant
83
+ klass.const_set(constant_name, value)
84
+ end
85
+
86
+ def uncached_value
87
+ klass.new(key, *value_args)
88
+ end
89
+
90
+ def value_args
91
+ r = if block
92
+ block.call
93
+ elsif args.count == 1 && args.first.is_a?(::Enumerable)
94
+ args.first
95
+ else
96
+ args
97
+ end
98
+ r.is_a?(::Enumerable) ? r : [r]
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/compare_by'
4
+
5
+ class Module
6
+ def compare_by(*fields)
7
+ ::EacRubyUtils::CompareBy.new(fields).apply(self)
8
+ end
9
+ end
@@ -8,7 +8,7 @@ class Object
8
8
  end
9
9
 
10
10
  def to_debug
11
- "|#{self.class}|#{self}|"
11
+ "|#{::Object.instance_method(:to_s).bind(self).call}|#{self}|"
12
12
  end
13
13
 
14
14
  def raise_debug
@@ -20,7 +20,7 @@ module EacRubyUtils
20
20
  end
21
21
 
22
22
  def method_missing(method, *args, &block)
23
- if respond_to?(::EacRubyUtils::SimpleCache.uncached_method_name(method), true)
23
+ if respond_to?(uncached_method_name(method), true)
24
24
  call_method_with_cache(method, args, &block)
25
25
  else
26
26
  super
@@ -37,27 +37,37 @@ module EacRubyUtils
37
37
 
38
38
  def reset_cache(*keys)
39
39
  if keys.any?
40
- keys.each { |key| cache_keys.delete(key) }
40
+ keys.each { |key| cache_keys.delete(sanitize_cache_key(key)) }
41
41
  else
42
42
  @cache_keys = nil
43
43
  end
44
44
  end
45
45
 
46
+ def sanitize_cache_key(key)
47
+ key.to_s.to_sym
48
+ end
49
+
50
+ protected
51
+
52
+ def uncached_method_name(original_method_name)
53
+ ::EacRubyUtils::SimpleCache.uncached_method_name(original_method_name)
54
+ end
55
+
46
56
  private
47
57
 
48
58
  def call_method_with_cache(method, args, &block)
49
59
  raise 'Não é possível realizar o cache de métodos com bloco' if block
50
60
 
51
61
  key = ([method] + args).join('@@@')
52
- unless cache_keys.key?(key)
62
+ unless cache_keys.key?(sanitize_cache_key(key))
53
63
  uncached_value = call_uncached_method(method, args)
54
- cache_keys[key] = uncached_value
64
+ cache_keys[sanitize_cache_key(key)] = uncached_value
55
65
  end
56
- cache_keys[key]
66
+ cache_keys[sanitize_cache_key(key)]
57
67
  end
58
68
 
59
69
  def call_uncached_method(method, args)
60
- send(::EacRubyUtils::SimpleCache.uncached_method_name(method), *args)
70
+ send(uncached_method_name(method), *args)
61
71
  end
62
72
 
63
73
  def cache_keys
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.78.0'
4
+ VERSION = '0.81.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.78.0
4
+ version: 0.81.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: 2021-11-06 00:00:00.000000000 Z
11
+ date: 2021-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -107,10 +107,12 @@ files:
107
107
  - lib/eac_ruby_utils/common_constructor/instance_initialize.rb
108
108
  - lib/eac_ruby_utils/common_constructor/super_args.rb
109
109
  - lib/eac_ruby_utils/compact.rb
110
+ - lib/eac_ruby_utils/compare_by.rb
110
111
  - lib/eac_ruby_utils/context.rb
111
112
  - lib/eac_ruby_utils/contextualizable.rb
112
113
  - lib/eac_ruby_utils/core_ext.rb
113
114
  - lib/eac_ruby_utils/custom_format.rb
115
+ - lib/eac_ruby_utils/enum.rb
114
116
  - lib/eac_ruby_utils/envs.rb
115
117
  - lib/eac_ruby_utils/envs/base_env.rb
116
118
  - lib/eac_ruby_utils/envs/command.rb
@@ -130,12 +132,9 @@ files:
130
132
  - lib/eac_ruby_utils/fs.rb
131
133
  - lib/eac_ruby_utils/fs/clearable_directory.rb
132
134
  - lib/eac_ruby_utils/fs/extname.rb
133
- - lib/eac_ruby_utils/fs/logs.rb
134
135
  - lib/eac_ruby_utils/fs/temp.rb
135
136
  - lib/eac_ruby_utils/fs/temp/directory.rb
136
137
  - lib/eac_ruby_utils/fs/temp/file.rb
137
- - lib/eac_ruby_utils/fs/traversable.rb
138
- - lib/eac_ruby_utils/fs/traverser.rb
139
138
  - lib/eac_ruby_utils/gems_registry.rb
140
139
  - lib/eac_ruby_utils/gems_registry/gem.rb
141
140
  - lib/eac_ruby_utils/immutable.rb
@@ -178,6 +177,7 @@ files:
178
177
  - lib/eac_ruby_utils/patches/module.rb
179
178
  - lib/eac_ruby_utils/patches/module/abstract_methods.rb
180
179
  - lib/eac_ruby_utils/patches/module/common_concern.rb
180
+ - lib/eac_ruby_utils/patches/module/compare_by.rb
181
181
  - lib/eac_ruby_utils/patches/module/context.rb
182
182
  - lib/eac_ruby_utils/patches/module/i18n_translate.rb
183
183
  - lib/eac_ruby_utils/patches/module/immutable.rb
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/string/filters'
4
- require 'eac_ruby_utils/fs/temp'
5
- require 'filesize'
6
-
7
- module EacRubyUtils
8
- module Fs
9
- class Logs
10
- TRUNCATE_DEFAULT_LENGTH = 1000
11
- TRUNCATE_APPEND_TEXT = '(...) '
12
-
13
- def [](label)
14
- log_set.fetch(sanitize_label(label))
15
- end
16
-
17
- def add(label)
18
- log_set[sanitize_label(label)] = ::EacRubyUtils::Fs::Temp.file
19
-
20
- self
21
- end
22
-
23
- def remove_all
24
- log_set.each_key { |label| remove(label) }
25
-
26
- self
27
- end
28
-
29
- def remove(label)
30
- log_set.fetch(sanitize_label(label)).remove
31
- log_set.delete(sanitize_label(label))
32
- end
33
-
34
- def truncate(label, length = TRUNCATE_DEFAULT_LENGTH)
35
- content = self[label].read.strip
36
- return content if content.length <= TRUNCATE_DEFAULT_LENGTH
37
-
38
- TRUNCATE_APPEND_TEXT + content[content.length - length + TRUNCATE_APPEND_TEXT.length,
39
- length - TRUNCATE_APPEND_TEXT.length]
40
- end
41
-
42
- def truncate_all(length = TRUNCATE_DEFAULT_LENGTH)
43
- s = "Files: #{log_set.length}\n"
44
- log_set.each do |label, path|
45
- x = truncate(label, length)
46
- y = [label, path, ::Filesize.from("#{path.size} B").pretty].join(' / ')
47
- s += x.blank? ? ">>> #{y} (Blank) <<<" : ">>> #{y}\n#{x}\n<<< #{y}\n"
48
- end
49
- s
50
- end
51
-
52
- private
53
-
54
- def sanitize_label(label)
55
- label.to_sym
56
- end
57
-
58
- def log_set
59
- @log_set ||= {}
60
- end
61
- end
62
- end
63
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/fs/traverser'
4
-
5
- module EacRubyUtils
6
- module Fs
7
- module Traversable
8
- PROP_METHOD_PREFIX = 'traverser_'
9
- BOOLEAN_PROPS = %i[hidden_directories recursive sort].freeze
10
- PATH_PROPS = %i[check_directory check_file].freeze
11
-
12
- class << self
13
- def prop_method_name(prop)
14
- "#{PROP_METHOD_PREFIX}#{prop}"
15
- end
16
- end
17
-
18
- PATH_PROPS.each do |method|
19
- define_method(::EacRubyUtils::Fs::Traversable.prop_method_name(method)) do |_path|
20
- nil
21
- end
22
- end
23
-
24
- BOOLEAN_PROPS.each do |method|
25
- define_method(::EacRubyUtils::Fs::Traversable.prop_method_name(method)) do
26
- false
27
- end
28
-
29
- define_method("#{::EacRubyUtils::Fs::Traversable.prop_method_name(method)}?") do
30
- send(method_name)
31
- end
32
- end
33
-
34
- def traverser_check_path(path)
35
- traverser_new.check_path(path)
36
- end
37
-
38
- def traverser_new
39
- r = ::EacRubyUtils::Fs::Traverser.new
40
- (BOOLEAN_PROPS + PATH_PROPS).each do |prop|
41
- r.send("#{prop}=", method(::EacRubyUtils::Fs::Traversable.prop_method_name(prop)))
42
- end
43
- r
44
- end
45
- end
46
- end
47
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacRubyUtils
4
- module Fs
5
- class Traverser
6
- attr_accessor :check_directory, :check_file, :recursive, :hidden_directories, :sort
7
-
8
- def check_path(path)
9
- path = ::Pathname.new(path.to_s) unless path.is_a?(::Pathname)
10
- internal_check_path(path, 0)
11
- end
12
-
13
- def hidden_directories?
14
- boolean_value(hidden_directories)
15
- end
16
-
17
- def recursive?
18
- boolean_value(recursive)
19
- end
20
-
21
- def sort?
22
- boolean_value(sort)
23
- end
24
-
25
- private
26
-
27
- def boolean_value(source_value)
28
- source_value = source_value.call if source_value.respond_to?(:call)
29
- source_value ? true : false
30
- end
31
-
32
- def each_child(dir, &block)
33
- if sort?
34
- dir.each_child.sort_by { |p| [p.to_s] }.each(&block)
35
- else
36
- dir.each_child(&block)
37
- end
38
- end
39
-
40
- def process_directory?(level)
41
- level.zero? || recursive?
42
- end
43
-
44
- def inner_check_directory(dir, level)
45
- return unless process_directory?(level)
46
-
47
- user_check_directory(dir)
48
- each_child(dir) do |e|
49
- next unless !e.basename.to_s.start_with?('.') || hidden_directories?
50
-
51
- internal_check_path(e, level + 1)
52
- end
53
- end
54
-
55
- def internal_check_path(path, level)
56
- if path.file?
57
- user_check_file(path)
58
- elsif path.directory?
59
- inner_check_directory(path, level)
60
- end
61
- end
62
-
63
- def user_check_file(path)
64
- check_file&.call(path)
65
- end
66
-
67
- def user_check_directory(path)
68
- check_directory&.call(path)
69
- end
70
- end
71
- end
72
- end