eac_ruby_utils 0.57.1 → 0.60.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6469a891b6aa484b994c98c3617fc63508607703f7eeb85106d543bdfb5a17e2
4
- data.tar.gz: 8724c432235e501b3e3a645caee3ac3eb42ba2d0430d870db8b06dcd5c5b2afc
3
+ metadata.gz: 70fe181d734d1e97b9467b44302604bb7b2a61ef3102e08aeddd1a9dd9a5d6be
4
+ data.tar.gz: d04e61f84fd5c9fa22bca11be939732c23e352eb019ba7a2260c5ef3012b339d
5
5
  SHA512:
6
- metadata.gz: 7138140617aba1656eeaf68cce2a3a1895d9cc7f6bf9702c2d5630d71d4ca20022cb63c97bdefaae31815aaf7bfbb35d40ee2c139093c097c43f1f5819703bf8
7
- data.tar.gz: f509f49102ff7360aa6d368a2558876d808d5cd78f419886304acfcadb219a54ec9a4ecaad988fad7c38f992e77d087d6b8580cb80df9a8b59ad9fc55ca30314
6
+ metadata.gz: ce2f14b7c8cc05f34337212a54cf4ae4d33a44fb1cfb83c1365e5c86a08e4d4bd3395c29bc4cf4a09969d25760c0340094939c804956b4a5e586caeffdfaf4e7
7
+ data.tar.gz: 8b243bf7a7de4cadadbd3497df8ecf8ac97fbc16bbc084d9459e12f72244963c878043eaeb95c180cee10b6ead01c044530732196cdaf13a55997431f74e2816
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/object/blank'
4
+ require 'active_support/values/time_zone'
5
+
6
+ module EacRubyUtils
7
+ module LocalTimeZone
8
+ DEBIAN_CONFIG_PATH = '/etc/timezone'
9
+
10
+ class << self
11
+ TIMEDATECTL_TIMEZONE_LINE_PATTERN = %r{\s*Time zone:\s*(\S+/\S+)\s}.freeze
12
+
13
+ # @return [ActiveSupport::TimeZone]
14
+ def auto
15
+ %w[tz_env debian_config offset].lazy.map { |s| send("by_#{s}") }.find(&:present?)
16
+ end
17
+
18
+ def auto_set
19
+ ::Time.zone = auto
20
+ end
21
+
22
+ # @return [ActiveSupport::TimeZone]
23
+ def by_debian_config
24
+ path = ::Pathname.new(DEBIAN_CONFIG_PATH)
25
+ path.exist? ? path.read.strip.if_present { |v| ::ActiveSupport::TimeZone[v] } : nil
26
+ end
27
+
28
+ # @return [ActiveSupport::TimeZone]
29
+ def by_offset
30
+ ::ActiveSupport::TimeZone[::Time.now.getlocal.gmt_offset]
31
+ end
32
+
33
+ # @return [ActiveSupport::TimeZone]
34
+ def by_timedatectl
35
+ executable = ::EacRubyUtils::Envs.local.executable('timedatectl', '--version')
36
+ return nil unless executable.exist?
37
+
38
+ TIMEDATECTL_TIMEZONE_LINE_PATTERN.if_match(executable.command.execute!) { |m| m[1] }
39
+ .if_present { |v| ::ActiveSupport::TimeZone[v] }
40
+ end
41
+
42
+ # @return [ActiveSupport::TimeZone]
43
+ def by_tz_env
44
+ ENV['TZ'].presence
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patch'
4
+ require 'eac_ruby_utils/settings_provider'
5
+
6
+ class Class
7
+ def enable_settings_provider
8
+ ::EacRubyUtils.patch(self, ::EacRubyUtils::SettingsProvider)
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kernel
4
+ # Raise exception with text "Not yet implemented".
5
+ def nyi
6
+ raise "Not yet implemented (Called in #{caller.first})"
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Object
4
+ # @return +block.call(self)+ if +self+ is not nil, +default_value+ otherwise.
5
+ def if_not_nil(default_value = nil)
6
+ return default_value if nil?
7
+
8
+ block_given? ? yield(self) : self
9
+ end
10
+
11
+ # @return +yield+ if +self+ is nil, +self+ otherwise.
12
+ def if_nil
13
+ return yield if nil? && block_given?
14
+
15
+ self
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/local_time_zone'
4
+
5
+ class Time
6
+ class << self
7
+ def required_zone
8
+ zone || ::EacRubyUtils::LocalTimeZone.auto || raise('No zone set or discovered')
9
+ end
10
+ end
11
+ end
@@ -1,15 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/string/inflections'
4
- require 'eac_ruby_utils/options_consumer'
3
+ require 'eac_ruby_utils/require_sub'
5
4
 
6
5
  module EacRubyUtils
7
6
  # Provide a option by constant, method or options object.
8
7
  module SettingsProvider
8
+ ::EacRubyUtils.require_sub __FILE__, base: self
9
+
9
10
  def setting_constant_name(key, fullname = false)
10
- name = key.to_s.underscore.upcase
11
- name = "#{self.class.name}::#{name}" if fullname
12
- name
11
+ setting_value_instance(key).constant_name(fullname)
13
12
  end
14
13
 
15
14
  def setting_search_order
@@ -25,41 +24,23 @@ module EacRubyUtils
25
24
  end
26
25
 
27
26
  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."
27
+ setting_value_instance(key, options).value
37
28
  end
38
29
 
39
30
  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
31
+ setting_value_instance(key).value_by_constant
46
32
  end
47
33
 
48
34
  def setting_value_by_method(key)
49
- respond_to?(key) ? send(key) : nil
35
+ setting_value_instance(key).value_by_method
50
36
  end
51
37
 
52
38
  def setting_value_by_settings_object(key)
53
- settings_object[key.to_s] || settings_object[key.to_sym]
39
+ setting_value_instance(key).value_by_settings_object
54
40
  end
55
41
 
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
42
+ def setting_value_instance(key, options = {})
43
+ ::EacRubyUtils::SettingsProvider::SettingValue.new(self, key, options)
63
44
  end
64
45
  end
65
46
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/string/inflections'
4
+ require 'eac_ruby_utils/listable'
5
+ require 'eac_ruby_utils/simple_cache'
6
+ require 'eac_ruby_utils/struct'
7
+
8
+ module EacRubyUtils
9
+ module SettingsProvider
10
+ class SettingValue
11
+ include ::EacRubyUtils::Listable
12
+ include ::EacRubyUtils::SimpleCache
13
+
14
+ attr_reader :source, :key, :options
15
+ lists.add_symbol :option, :default, :order, :required
16
+
17
+ def initialize(source, key, options)
18
+ @source = source
19
+ @key = key
20
+ @options = options
21
+ end
22
+
23
+ def constant_name(fullname = false)
24
+ name = key.to_s.underscore.upcase
25
+ name = "#{source.class.name}::#{name}" if fullname
26
+ name
27
+ end
28
+
29
+ def value
30
+ parsed_options.order.each do |method|
31
+ value = send("value_by_#{method}")
32
+ return value if value
33
+ end
34
+ return parsed_options.default if parsed_options.respond_to?(OPTION_DEFAULT)
35
+ return nil unless parsed_options.required
36
+
37
+ raise_key_not_found
38
+ end
39
+
40
+ def value_by_constant
41
+ source.class.const_get(constant_name)
42
+ rescue NameError
43
+ nil
44
+ end
45
+
46
+ def value_by_method
47
+ source.respond_to?(key, true) ? source.send(key) : nil
48
+ end
49
+
50
+ def value_by_settings_object
51
+ source.settings_object[key.to_s] || source.settings_object[key.to_sym]
52
+ end
53
+
54
+ private
55
+
56
+ def parsed_options_uncached
57
+ r = self.class.lists.option.hash_keys_validate!(options.symbolize_keys)
58
+ r[:required] = true unless r.key?(OPTION_REQUIRED)
59
+ r[:order] = source.setting_search_order if r[OPTION_ORDER].nil?
60
+ ::EacRubyUtils::Struct.new(r)
61
+ end
62
+
63
+ def raise_key_not_found
64
+ raise "Setting \"#{key}\" not found. Supply in #{source.settings_object_name}, implement "\
65
+ "a \"#{key}\" method or declare a #{constant_name(true)} constant."
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.57.1'
4
+ VERSION = '0.60.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.57.1
4
+ version: 0.60.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-01-06 00:00:00.000000000 Z
11
+ date: 2021-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -186,12 +186,14 @@ files:
186
186
  - lib/eac_ruby_utils/listable/string_list.rb
187
187
  - lib/eac_ruby_utils/listable/symbol_list.rb
188
188
  - lib/eac_ruby_utils/listable/value.rb
189
+ - lib/eac_ruby_utils/local_time_zone.rb
189
190
  - lib/eac_ruby_utils/on_clean_ruby_environment.rb
190
191
  - lib/eac_ruby_utils/options_consumer.rb
191
192
  - lib/eac_ruby_utils/patch.rb
192
193
  - lib/eac_ruby_utils/patches.rb
193
194
  - lib/eac_ruby_utils/patches/class.rb
194
195
  - lib/eac_ruby_utils/patches/class/common_constructor.rb
196
+ - lib/eac_ruby_utils/patches/class/settings_provider.rb
195
197
  - lib/eac_ruby_utils/patches/enumerable.rb
196
198
  - lib/eac_ruby_utils/patches/enumerable/boolean_combinations.rb
197
199
  - lib/eac_ruby_utils/patches/enumerator.rb
@@ -200,6 +202,8 @@ files:
200
202
  - lib/eac_ruby_utils/patches/hash.rb
201
203
  - lib/eac_ruby_utils/patches/hash/options_consumer.rb
202
204
  - lib/eac_ruby_utils/patches/hash/sym_keys_hash.rb
205
+ - lib/eac_ruby_utils/patches/kernel.rb
206
+ - lib/eac_ruby_utils/patches/kernel/nyi.rb
203
207
  - lib/eac_ruby_utils/patches/module.rb
204
208
  - lib/eac_ruby_utils/patches/module/abstract_methods.rb
205
209
  - lib/eac_ruby_utils/patches/module/common_concern.rb
@@ -213,6 +217,7 @@ files:
213
217
  - lib/eac_ruby_utils/patches/object.rb
214
218
  - lib/eac_ruby_utils/patches/object/asserts.rb
215
219
  - lib/eac_ruby_utils/patches/object/debug.rb
220
+ - lib/eac_ruby_utils/patches/object/if_nil.rb
216
221
  - lib/eac_ruby_utils/patches/object/if_present.rb
217
222
  - lib/eac_ruby_utils/patches/object/if_respond.rb
218
223
  - lib/eac_ruby_utils/patches/object/template.rb
@@ -224,8 +229,7 @@ files:
224
229
  - lib/eac_ruby_utils/patches/string.rb
225
230
  - lib/eac_ruby_utils/patches/string/inflector.rb
226
231
  - lib/eac_ruby_utils/patches/time.rb
227
- - lib/eac_ruby_utils/patches/time/default_time_zone_set.rb
228
- - lib/eac_ruby_utils/patches/time/local_time_zone.rb
232
+ - lib/eac_ruby_utils/patches/time/required_zone.rb
229
233
  - lib/eac_ruby_utils/paths_hash.rb
230
234
  - lib/eac_ruby_utils/paths_hash/entry_key_error.rb
231
235
  - lib/eac_ruby_utils/paths_hash/node.rb
@@ -238,6 +242,7 @@ files:
238
242
  - lib/eac_ruby_utils/ruby/command.rb
239
243
  - lib/eac_ruby_utils/ruby/on_clean_environment.rb
240
244
  - lib/eac_ruby_utils/settings_provider.rb
245
+ - lib/eac_ruby_utils/settings_provider/setting_value.rb
241
246
  - lib/eac_ruby_utils/simple_cache.rb
242
247
  - lib/eac_ruby_utils/struct.rb
243
248
  - lib/eac_ruby_utils/templates.rb
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/patches/time/local_time_zone'
4
-
5
- ::Time.zone = ::Time.local_time_zone
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/time/zones'
4
- require 'eac_ruby_utils/envs'
5
-
6
- class Time
7
- class << self
8
- TIMEDATECTL_TIMEZONE_LINE_PATTERN = %r{\s*Time zone:\s*(\S+/\S+)\s}.freeze
9
-
10
- def local_time_zone
11
- local_time_zone_by_timedatectl || local_time_zone_by_offset
12
- end
13
-
14
- def local_time_zone_by_timedatectl
15
- executable = ::EacRubyUtils::Envs.local.executable('timedatectl', '--version')
16
- return nil unless executable.exist?
17
-
18
- TIMEDATECTL_TIMEZONE_LINE_PATTERN.if_match(executable.command.execute!) { |m| m[1] }
19
- end
20
-
21
- def local_time_zone_by_offset
22
- ::ActiveSupport::TimeZone[::Time.now.getlocal.gmt_offset].name
23
- end
24
- end
25
- end