ehbrs-tools 0.19.0 → 0.20.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ehbrs/cooking_book/project.rb +8 -2
  3. data/lib/ehbrs/music.rb +9 -0
  4. data/lib/ehbrs/music/album.rb +42 -0
  5. data/lib/ehbrs/observers/base.rb +1 -1
  6. data/lib/ehbrs/observers/with_persistence.rb +1 -1
  7. data/lib/ehbrs/runner/music.rb +16 -0
  8. data/lib/ehbrs/runner/music/selected.rb +63 -0
  9. data/lib/ehbrs/runner/web_utils/videos/upload.rb +1 -1
  10. data/lib/ehbrs/tools/version.rb +1 -1
  11. data/vendor/eac_cli/lib/eac_cli/core_ext.rb +2 -0
  12. data/vendor/eac_cli/lib/eac_cli/definition/alternative.rb +4 -7
  13. data/vendor/eac_cli/lib/eac_cli/definition/argument_option.rb +8 -0
  14. data/vendor/eac_cli/lib/eac_cli/definition/base_option.rb +21 -9
  15. data/vendor/eac_cli/lib/eac_cli/definition/base_option/initialize_args_parser.rb +47 -0
  16. data/vendor/eac_cli/lib/eac_cli/definition/boolean_option.rb +8 -0
  17. data/vendor/eac_cli/lib/eac_cli/definition/positional_argument.rb +12 -0
  18. data/vendor/eac_cli/lib/eac_cli/docopt/doc_builder.rb +15 -1
  19. data/vendor/eac_cli/lib/eac_cli/parser/collector.rb +3 -17
  20. data/vendor/eac_cli/lib/eac_cli/patches/object/runner_with.rb +2 -1
  21. data/vendor/eac_cli/lib/eac_cli/runner.rb +0 -48
  22. data/vendor/eac_cli/lib/eac_cli/runner/after_class_methods.rb +29 -0
  23. data/vendor/eac_cli/lib/eac_cli/runner/instance_methods.rb +31 -0
  24. data/vendor/eac_cli/lib/eac_cli/runner_with/subcommands.rb +1 -1
  25. data/vendor/eac_cli/lib/eac_cli/runner_with_set.rb +50 -0
  26. data/vendor/eac_cli/lib/eac_cli/version.rb +1 -1
  27. data/vendor/eac_cli/spec/lib/eac_cli/definition/alternative_spec.rb +4 -0
  28. data/vendor/eac_cli/spec/lib/eac_cli/runner_spec.rb +21 -3
  29. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/jobs_runner.rb +31 -0
  30. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/patches.rb +4 -0
  31. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/class.rb +4 -0
  32. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/class/jobs_runner.rb +10 -0
  33. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/object.rb +5 -0
  34. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/object/runner_with.rb +5 -0
  35. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with.rb +9 -0
  36. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with/confirmable.rb +21 -0
  37. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with/filesystem_traverser.rb +52 -0
  38. data/vendor/eac_ruby_base0/lib/eac_ruby_base0/version.rb +1 -1
  39. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/local_time_zone.rb +12 -2
  40. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class/settings_provider.rb +10 -0
  41. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_nil.rb +17 -0
  42. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/time/required_zone.rb +11 -0
  43. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  44. metadata +26 -7
  45. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/time/default_time_zone_set.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e80d8d25f5c713908af2432c8f80f63c4f4de6f292c4bc915bf33951e998a1cd
4
- data.tar.gz: ac9156efaa3625fcc64f0268231cc07756ce5ba37309ec44029559389a06bbd0
3
+ metadata.gz: 9197f68f8849f5b939a2209bd1b5659aa2aa9544286e80b5290a06620f680628
4
+ data.tar.gz: 75f0b60d3f0971aa33913374932630dfa101378698f0210f28619f59f0a63aaa
5
5
  SHA512:
6
- metadata.gz: de0930f5a26438deef43bbfb5a2245d30ed1d929ed28763fd8f7801f58f9ed813016d22c5c9bba61da8b3f1fcb801b0923381488b92b1279f536b0d8301eddba
7
- data.tar.gz: 1f36ef925ce34f15f228d69f73ec277b6a56fb0545f19a43dc986516a1ac4c81db389645f6fd7d0cf720d56b1ca1d0150d189a8aec43b853a24e94f8bd622fc3
6
+ metadata.gz: 6e675d639a57fc2f6d4d14ab8733cdb9cc96be6818d18252443e575eb3b21c2f1d25139a1c237720c1473b6b369f7c47c5fe1ba547ad49319d9cd1411fdc70f7
7
+ data.tar.gz: 25b77dab28684229355feb9295073fadaf42ed78c4ef27d347e907cf959fa5ff2c822ba96f99a955a6b2adc561b138d241fc9ce3f31026b9b3fdfb398d4c1d36
@@ -6,6 +6,8 @@ require 'ehbrs/cooking_book/recipe'
6
6
  module Ehbrs
7
7
  module CookingBook
8
8
  class Project
9
+ RECIPES_ROOT_SUBPATH = 'recipes'
10
+
9
11
  enable_simple_cache
10
12
  common_constructor :root do
11
13
  self.root = root.to_pathname
@@ -15,9 +17,13 @@ module Ehbrs
15
17
 
16
18
  private
17
19
 
20
+ def recipes_root_uncached
21
+ root.join(RECIPES_ROOT_SUBPATH)
22
+ end
23
+
18
24
  def recipes_uncached
19
- ::Dir.glob(File.join('**', '*.{yml,yaml}'), base: root.to_path).map do |subpath|
20
- ::Ehbrs::CookingBook::Recipe.from_file(root.join(subpath))
25
+ ::Dir.glob(File.join('**', '*.{yml,yaml}'), base: recipes_root.to_path).map do |subpath|
26
+ ::Ehbrs::CookingBook::Recipe.from_file(recipes_root.join(subpath))
21
27
  end
22
28
  end
23
29
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Ehbrs
6
+ module Music
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Ehbrs
6
+ module Music
7
+ class Album
8
+ include ::Comparable
9
+ common_constructor :path do
10
+ self.path = path.to_pathname.expand_path
11
+ end
12
+
13
+ def <=>(other)
14
+ to_a <=> other.to_a
15
+ end
16
+
17
+ def to_a
18
+ [category, artist, name]
19
+ end
20
+
21
+ def to_label
22
+ (to_a + [id]).map(&:light_white).join(' | '.blue)
23
+ end
24
+
25
+ def id
26
+ [artist, name].join('_').variableize
27
+ end
28
+
29
+ def name
30
+ path.basename.to_s
31
+ end
32
+
33
+ def artist
34
+ path.parent.basename.to_s
35
+ end
36
+
37
+ def category
38
+ path.parent.parent.basename.to_s
39
+ end
40
+ end
41
+ end
42
+ end
@@ -21,7 +21,7 @@ module Ehbrs
21
21
  end
22
22
  end
23
23
 
24
- def check(value, date = ::Time.zone.now)
24
+ def check(value, date = ::Time.required_zone.now)
25
25
  @last_check_time = date
26
26
  send("check_with_blank_value_#{blank_value}", value, date)
27
27
  end
@@ -14,7 +14,7 @@ module Ehbrs
14
14
  load
15
15
  end
16
16
 
17
- def check(value, date = ::Time.zone.now)
17
+ def check(value, date = ::Time.required_zone.now)
18
18
  save if super(value, date)
19
19
  end
20
20
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/core_ext'
4
+
5
+ module Ehbrs
6
+ class Runner
7
+ class Music
8
+ require_sub __FILE__
9
+
10
+ runner_with :help, :subcommands do
11
+ desc 'Ferramentas para músicas.'
12
+ subcommands
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_base0/patches'
4
+ require 'eac_ruby_utils/fs/clearable_directory'
5
+ require 'ehbrs/music/album'
6
+
7
+ module Ehbrs
8
+ class Runner
9
+ class Music
10
+ class Selected
11
+ DEFAULT_TRAVERSER_RECURSIVE = true
12
+
13
+ enable_jobs_runner
14
+ runner_with :help, :filesystem_traverser do
15
+ desc 'Seleciona álbuns de música.'
16
+ arg_opt '-b', '--build-dir', 'Constrói diretório de músicas selecionadas.'
17
+ end
18
+
19
+ def run
20
+ infov 'Recursive', traverser_recursive
21
+ run_jobs :show, :build
22
+ end
23
+
24
+ private
25
+
26
+ def build
27
+ infom 'Building...'
28
+ build_dir.clear
29
+ selected_albums.each do |album|
30
+ ::EacRubyUtils::Envs.local.command('ln', '-s', album.path,
31
+ build_dir.join(album.id)).system!
32
+ end
33
+ end
34
+
35
+ def build_dir_uncached
36
+ parsed.build_dir.if_present { |v| ::EacRubyUtils::Fs::ClearableDirectory.new(v) }
37
+ end
38
+
39
+ def run_build?
40
+ build_dir.present?
41
+ end
42
+
43
+ def selected_albums_uncached
44
+ infom 'Searching selected albums...'
45
+ @selected = []
46
+ run_filesystem_traverser
47
+ @selected.sort
48
+ end
49
+
50
+ def show
51
+ infov 'Albums found', selected_albums.count
52
+ selected_albums.each do |album|
53
+ puts album.to_label
54
+ end
55
+ end
56
+
57
+ def traverser_check_directory(path)
58
+ @selected << ::Ehbrs::Music::Album.new(path) if path.join('.selected').exist?
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -42,7 +42,7 @@ module Ehbrs
42
42
  def process_response(response)
43
43
  infov 'Response status', response.status
44
44
  if response.status == 200
45
- pp ::JSON.parse(response.body) # rubocop:disable Rails/Output
45
+ pp ::JSON.parse(response.body)
46
46
  else
47
47
  error_file = '/tmp/ehbrsutils.html'
48
48
  ::File.write(error_file, response.body)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ehbrs
4
4
  module Tools
5
- VERSION = '0.19.0'
5
+ VERSION = '0.20.0'
6
6
  end
7
7
  end
@@ -2,3 +2,5 @@
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
4
  require 'eac_cli/patches'
5
+
6
+ ::EacCli::RunnerWithSet.default.add_namespace(::EacCli::RunnerWith)
@@ -10,15 +10,12 @@ module EacCli
10
10
  SUBCOMMAND_NAME_ARG = :subcommand
11
11
  SUBCOMMAND_ARGS_ARG = :subcommand_args
12
12
 
13
- def arg_opt(short, long, description, option_options = {})
14
- options_set << ::EacCli::Definition::ArgumentOption.new(
15
- short, long, description, option_options
16
- )
13
+ def arg_opt(*args)
14
+ options_set << ::EacCli::Definition::ArgumentOption.from_args(args)
17
15
  end
18
16
 
19
- def bool_opt(short, long, description, option_options = {})
20
- options_set << ::EacCli::Definition::BooleanOption.new(short, long, description,
21
- option_options)
17
+ def bool_opt(*args)
18
+ options_set << ::EacCli::Definition::BooleanOption.from_args(args)
22
19
  end
23
20
 
24
21
  def options
@@ -8,6 +8,14 @@ module EacCli
8
8
  def argument?
9
9
  true
10
10
  end
11
+
12
+ def build_value(new_value, previous_value)
13
+ repeat? ? previous_value + [new_value] : new_value
14
+ end
15
+
16
+ def default_value
17
+ repeat? ? [] : nil
18
+ end
11
19
  end
12
20
  end
13
21
  end
@@ -5,24 +5,36 @@ require 'eac_ruby_utils/core_ext'
5
5
  module EacCli
6
6
  class Definition
7
7
  class BaseOption
8
+ require_sub __FILE__
9
+
10
+ class << self
11
+ def from_args(args)
12
+ p = ::EacCli::Definition::BaseOption::InitializeArgsParser.new(args)
13
+ new(p.short, p.long, p.description, p.options)
14
+ end
15
+ end
16
+
8
17
  DEFAULT_REQUIRED = false
9
18
 
10
19
  enable_listable
11
- lists.add_symbol :option, :optional, :usage, :required
12
- attr_reader :short, :long, :description, :options
13
-
14
- def initialize(short, long, description, options = {})
15
- @short = short
16
- @long = long
17
- @description = description
18
- @options = options.symbolize_keys
19
- @options.assert_valid_keys(::EacCli::Definition::BaseOption.lists.option.values)
20
+ enable_abstract_methods :build_value, :default_value
21
+ lists.add_symbol :option, :optional, :usage, :repeat, :required
22
+ common_constructor :short, :long, :description, :options, default: [{}] do
23
+ raise 'Nor short neither long selector was set' if short.blank? && long.blank?
24
+
25
+ self.options = ::EacCli::Definition::BaseOption.lists.option.hash_keys_validate!(
26
+ options.symbolize_keys
27
+ )
20
28
  end
21
29
 
22
30
  def identifier
23
31
  long.to_s.variableize.to_sym
24
32
  end
25
33
 
34
+ def repeat?
35
+ options[OPTION_REPEAT]
36
+ end
37
+
26
38
  def required?
27
39
  return true if options.key?(:required) && options.fetch(:required)
28
40
  return false if options.key?(:optional) && options.fetch(:optional)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacCli
4
+ class Definition
5
+ class BaseOption
6
+ class InitializeArgsParser
7
+ PROPERTIES = %i[short long description options].freeze
8
+ attr_reader(*PROPERTIES)
9
+
10
+ def initialize(args)
11
+ self.options = args.extract_options!.freeze
12
+ args.each { |arg| absorb_arg(arg) }
13
+ end
14
+
15
+ private
16
+
17
+ attr_writer(*PROPERTIES)
18
+
19
+ def absorb_arg(arg)
20
+ arg_ext = ArgumentParser.new(arg)
21
+ send("#{arg_ext.type}=", arg_ext.value)
22
+ end
23
+
24
+ class ArgumentParser
25
+ TYPES = %i[short long description].freeze
26
+ common_constructor :value
27
+
28
+ def type
29
+ TYPES.find { |type| send("#{type}?") } || raise("Unknown type for \"#{value}\"")
30
+ end
31
+
32
+ def short?
33
+ value.start_with?('-') && !long?
34
+ end
35
+
36
+ def long?
37
+ value.start_with?('--')
38
+ end
39
+
40
+ def description?
41
+ !short? || !long?
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -8,6 +8,14 @@ module EacCli
8
8
  def argument?
9
9
  false
10
10
  end
11
+
12
+ def build_value(_new_value, previous_value)
13
+ repeat? ? previous_value + 1 : true
14
+ end
15
+
16
+ def default_value
17
+ repeat? ? 0 : false
18
+ end
11
19
  end
12
20
  end
13
21
  end
@@ -13,6 +13,18 @@ module EacCli
13
13
  options.assert_valid_keys(self.class.lists.option.values)
14
14
  end
15
15
 
16
+ def build_value(new_value, previous_value)
17
+ if previous_value.is_a?(::Array)
18
+ previous_value + [new_value]
19
+ else
20
+ new_value
21
+ end
22
+ end
23
+
24
+ def default_value
25
+ repeat? ? [] : nil
26
+ end
27
+
16
28
  def identifier
17
29
  name.to_s.variableize.to_sym
18
30
  end
@@ -19,10 +19,24 @@ module EacCli
19
19
  b += '=<value>' if option.argument?
20
20
  b
21
21
  end
22
+
23
+ def option_short(option)
24
+ b = option.short
25
+ b += '=<value>' if option.argument?
26
+ b
27
+ end
28
+
29
+ def option_usage_full(option)
30
+ if option.long.present?
31
+ [option.short, option_long(option)].reject(&:blank?).join(SEP)
32
+ else
33
+ option_short(option)
34
+ end
35
+ end
22
36
  end
23
37
 
24
38
  def option_definition(option)
25
- option.short + SEP + self.class.option_long(option) + OPTION_DESC_SEP + option.description
39
+ self.class.option_usage_full(option) + OPTION_DESC_SEP + option.description
26
40
  end
27
41
 
28
42
  def section(header, include_header = true)
@@ -24,11 +24,7 @@ module EacCli
24
24
  end
25
25
 
26
26
  def collect(option, value)
27
- if data[option].is_a?(::Array)
28
- data[option] << value
29
- else
30
- data[option] = value
31
- end
27
+ data[option] = option.build_value(value, data[option])
32
28
  end
33
29
 
34
30
  def supplied?(option)
@@ -42,18 +38,8 @@ module EacCli
42
38
  end
43
39
 
44
40
  def default_values
45
- definition.options.each { |option| data[option] = option_default_value(option) }
46
- definition.positional.each do |positional|
47
- data[positional] = positional_default_value(positional)
48
- end
49
- end
50
-
51
- def option_default_value(option)
52
- option.argument? ? nil : false
53
- end
54
-
55
- def positional_default_value(positional)
56
- positional.repeat? ? [] : nil
41
+ definition.options.each { |option| data[option] = option.default_value }
42
+ definition.positional.each { |positional| data[positional] = positional.default_value }
57
43
  end
58
44
  end
59
45
  end
@@ -3,6 +3,7 @@
3
3
  require 'eac_ruby_utils/core_ext'
4
4
  require 'eac_cli/runner'
5
5
  require 'eac_cli/runner_with'
6
+ require 'eac_cli/runner_with_set'
6
7
 
7
8
  class Object
8
9
  def runner_with(*runners, &block)
@@ -10,7 +11,7 @@ class Object
10
11
  enable_simple_cache
11
12
  enable_console_speaker
12
13
  runners.each do |runner|
13
- include runner_with_to_module(runner)
14
+ include ::EacCli::RunnerWithSet.default.item_to_module(runner)
14
15
  end
15
16
  runner_definition(&block) if block
16
17
  end
@@ -47,53 +47,5 @@ module EacCli
47
47
  include ActiveSupport::Callbacks
48
48
  define_callbacks :run
49
49
  end
50
-
51
- module AfterClassMethods
52
- def create(*runner_context_args)
53
- r = new
54
- r.runner_context = ::EacCli::Runner::Context.new(r, *runner_context_args)
55
- r
56
- end
57
-
58
- def run(*runner_context_args)
59
- r = create(*runner_context_args)
60
- r.run_run
61
- r
62
- end
63
-
64
- def runner_definition(&block)
65
- @runner_definition ||= super_runner_definition
66
- @runner_definition.instance_eval(&block) if block
67
- @runner_definition
68
- end
69
-
70
- def super_runner_definition
71
- superclass.try(:runner_definition).if_present(&:dup) || ::EacCli::Definition.new
72
- end
73
- end
74
-
75
- module InstanceMethods
76
- def run_run
77
- parsed
78
- run_callbacks(:run) { run }
79
- rescue ::EacCli::Runner::Exit # rubocop:disable Lint/SuppressedException
80
- # Do nothing
81
- end
82
-
83
- def runner_context
84
- return @runner_context if @runner_context
85
-
86
- raise 'Context was required, but was not set yet'
87
- end
88
-
89
- def runner_context=(new_runner_context)
90
- @runner_context = new_runner_context
91
- @parsed = nil
92
- end
93
-
94
- def parsed
95
- @parsed ||= ::EacCli::Parser.new(self.class.runner_definition, runner_context.argv).parsed
96
- end
97
- end
98
50
  end
99
51
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacCli
4
+ module Runner
5
+ module AfterClassMethods
6
+ def create(*runner_context_args)
7
+ r = new
8
+ r.runner_context = ::EacCli::Runner::Context.new(r, *runner_context_args)
9
+ r
10
+ end
11
+
12
+ def run(*runner_context_args)
13
+ r = create(*runner_context_args)
14
+ r.run_run
15
+ r
16
+ end
17
+
18
+ def runner_definition(&block)
19
+ @runner_definition ||= super_runner_definition
20
+ @runner_definition.instance_eval(&block) if block
21
+ @runner_definition
22
+ end
23
+
24
+ def super_runner_definition
25
+ superclass.try(:runner_definition).if_present(&:dup) || ::EacCli::Definition.new
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacCli
4
+ module Runner
5
+ module InstanceMethods
6
+ def run_run
7
+ parsed
8
+ run_callbacks(:run) { run }
9
+ rescue ::EacCli::Parser::Error => e
10
+ $stderr.write("#{e}\n")
11
+ rescue ::EacCli::Runner::Exit # rubocop:disable Lint/SuppressedException
12
+ # Do nothing
13
+ end
14
+
15
+ def runner_context
16
+ return @runner_context if @runner_context
17
+
18
+ raise 'Context was required, but was not set yet'
19
+ end
20
+
21
+ def runner_context=(new_runner_context)
22
+ @runner_context = new_runner_context
23
+ @parsed = nil
24
+ end
25
+
26
+ def parsed
27
+ @parsed ||= ::EacCli::Parser.new(self.class.runner_definition, runner_context.argv).parsed
28
+ end
29
+ end
30
+ end
31
+ end
@@ -40,7 +40,7 @@ module EacCli
40
40
  end
41
41
 
42
42
  def help_extra_text
43
- (['Subcommands:'] + available_subcommands.keys.map { |s| " #{s}" })
43
+ (['Subcommands:'] + available_subcommands.keys.sort.map { |s| " #{s}" })
44
44
  .map { |v| "#{v}\n" }.join
45
45
  end
46
46
 
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacCli
4
+ class RunnerWithSet
5
+ class << self
6
+ def default
7
+ @default ||= new
8
+ end
9
+ end
10
+
11
+ def add_namespace(namespace)
12
+ namespace = sanitize_namespace(namespace)
13
+ raise "\"#{namespace}\" already was included" if namespace_set.include?(namespace)
14
+
15
+ namespace_set << namespace
16
+ self
17
+ end
18
+
19
+ def item_to_module(item)
20
+ item.is_a?(::Module) ? item : key_to_module(item)
21
+ end
22
+
23
+ def namespaces
24
+ namespace_set.dup
25
+ end
26
+
27
+ private
28
+
29
+ def namespace_set
30
+ @namespace_set ||= ::Array.new
31
+ end
32
+
33
+ def key_to_module(key)
34
+ namespace_set.lazy
35
+ .map { |namespace| key_to_module_in_namespace(namespace, key) }
36
+ .find(&:present?) ||
37
+ raise("Not module found with key \"#{key}\" (Namespaces: #{namespace_set})")
38
+ end
39
+
40
+ def key_to_module_in_namespace(namespace, key)
41
+ namespace.const_get(key.to_s.camelize)
42
+ rescue ::NameError
43
+ nil
44
+ end
45
+
46
+ def sanitize_namespace(source)
47
+ source.is_a?(::Module) ? source : source.to_s.constantize
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacCli
4
- VERSION = '0.12.5'
4
+ VERSION = '0.15.0'
5
5
  end
@@ -7,6 +7,10 @@ RSpec.describe ::EacCli::Definition::Alternative do
7
7
 
8
8
  it { expect { instance.arg_opt '-a', '--opt2', 'A argument option' }.not_to raise_error }
9
9
  it { expect { instance.bool_opt '-b', '--opt1', 'A boolean option' }.not_to raise_error }
10
+ it { expect { instance.bool_opt '-b', '--no-description' }.not_to raise_error }
11
+ it { expect { instance.bool_opt '--opt1', 'A option without short' }.not_to raise_error }
12
+ it { expect { instance.bool_opt '-b', 'A option without long' }.not_to raise_error }
13
+ it { expect { instance.bool_opt 'A option without selectors' }.to raise_error(::StandardError) }
10
14
  it { expect { instance.options_argument(true) }.not_to raise_error }
11
15
  it { expect { instance.pos_arg :pos1 }.not_to raise_error }
12
16
  it { expect { instance.pos_arg :pos2, optional: true, repeat: true }.not_to raise_error }
@@ -12,6 +12,8 @@ RSpec.describe ::EacCli::Runner do
12
12
  runner_definition do
13
13
  arg_opt '-o', '--opt1', 'A arg option.'
14
14
  bool_opt '-p', '--opt2', 'A boolean option'
15
+ arg_opt '-q', '--opt4', 'A repeatable argument option.', repeat: true
16
+ bool_opt '-r', '--opt5', 'A repeatable boolean option', repeat: true
15
17
  pos_arg :pos1
16
18
  pos_arg :pos2, repeat: true, optional: true
17
19
  alt do
@@ -29,7 +31,7 @@ RSpec.describe ::EacCli::Runner do
29
31
  context 'when all args are supplied' do
30
32
  let(:argv) { %w[--opt1 aaa --opt2 bbb ccc ddd] }
31
33
  let(:parsed_expected) do
32
- { opt1: 'aaa', opt2: true, opt3: false, pos1: 'bbb',
34
+ { opt1: 'aaa', opt2: true, opt3: false, opt4: [], opt5: 0, pos1: 'bbb',
33
35
  pos2: %w[ccc ddd] }
34
36
  end
35
37
 
@@ -63,7 +65,10 @@ RSpec.describe ::EacCli::Runner do
63
65
 
64
66
  context 'when only required args are supplied' do
65
67
  let(:argv) { %w[bbb] }
66
- let(:parsed_expected) { { opt1: nil, opt2: false, opt3: false, pos1: 'bbb', pos2: [] } }
68
+ let(:parsed_expected) do
69
+ { opt1: nil, opt2: false, opt3: false, opt4: [], opt5: 0, pos1: 'bbb',
70
+ pos2: [] }
71
+ end
67
72
 
68
73
  it { expect(parsed_actual).to eq(parsed_expected) }
69
74
  it { expect(instance.parsed.opt1).to be_nil }
@@ -82,12 +87,25 @@ RSpec.describe ::EacCli::Runner do
82
87
 
83
88
  context 'when alternative args are supplied' do
84
89
  let(:argv) { %w[--opt3] }
85
- let(:parsed_expected) { { opt1: nil, opt2: false, opt3: true, pos1: nil, pos2: [] } }
90
+ let(:parsed_expected) do
91
+ { opt1: nil, opt2: false, opt3: true, opt4: [], opt5: 0, pos1: nil,
92
+ pos2: [] }
93
+ end
86
94
 
87
95
  it { expect(parsed_actual).to eq(parsed_expected) }
88
96
  it { expect(instance.parsed.opt3?).to eq(true) }
89
97
  end
90
98
 
99
+ context 'when repeated options are supplied' do
100
+ let(:argv) { %w[--opt5 -rrr --opt4=A -q B --opt4 C AAA] }
101
+ let(:parsed_expected) do
102
+ { opt1: nil, opt2: false, opt3: false, opt4: %w[A B C], opt5: 4, pos1: 'AAA',
103
+ pos2: [] }
104
+ end
105
+
106
+ it { expect(parsed_actual).to eq(parsed_expected) }
107
+ end
108
+
91
109
  context 'when extra args are not supplied' do
92
110
  let(:runner_class) do
93
111
  the_module = described_class
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/speaker'
4
+ require 'eac_ruby_utils/settings_provider'
5
+
6
+ module EacRubyBase0
7
+ module JobsRunner
8
+ common_concern do
9
+ include ::EacRubyUtils::Console::Speaker
10
+ include ::EacRubyUtils::SettingsProvider
11
+ end
12
+
13
+ def run_job(job)
14
+ return unless run_job?(job)
15
+
16
+ infom "Running job \"#{job}\"..."
17
+ send(job)
18
+ end
19
+
20
+ def run_job?(job)
21
+ the_method = "run_#{job}?"
22
+ respond_to?(the_method, true) ? send(the_method) : true
23
+ end
24
+
25
+ def run_jobs(*jobs)
26
+ jobs = setting_value(:jobs) if jobs.empty?
27
+ jobs.each { |job| run_job(job) }
28
+ success 'Done'
29
+ end
30
+ end
31
+ 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,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_base0/jobs_runner'
4
+ require 'eac_ruby_utils/patch'
5
+
6
+ class Class
7
+ def enable_jobs_runner
8
+ ::EacRubyUtils.patch(self, ::EacRubyBase0::JobsRunner)
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir["#{File.dirname(__FILE__)}/#{::File.basename(__FILE__, '.*')}/*.rb"].sort.each do |path|
4
+ require path
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/core_ext'
4
+ require 'eac_ruby_base0/runner_with'
5
+ ::EacCli::RunnerWithSet.default.add_namespace(::EacRubyBase0::RunnerWith)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRubyBase0
6
+ module RunnerWith
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/runner'
4
+ require 'eac_ruby_utils/fs/traversable'
5
+
6
+ module EacRubyBase0
7
+ module RunnerWith
8
+ module Confirmable
9
+ extend ::ActiveSupport::Concern
10
+
11
+ included do
12
+ include ::EacCli::Runner
13
+ runner_definition do
14
+ bool_opt '-c', '--confirm', 'Confirm changes.'
15
+ end
16
+ end
17
+
18
+ delegate :confirm?, to: :parsed
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/runner'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/fs/traversable'
6
+ require 'eac_ruby_utils/settings_provider'
7
+
8
+ module EacRubyBase0
9
+ module RunnerWith
10
+ module FilesystemTraverser
11
+ DEFAULT_DEFAULT_TRAVERSER_RECURSIVE = false
12
+
13
+ common_concern do
14
+ include ::EacCli::Runner
15
+ include ::EacRubyUtils::Fs::Traversable
16
+ enable_settings_provider
17
+ include TopMethods
18
+ runner_definition do
19
+ bool_opt '-R', '--recursive', 'Recursive.'
20
+ bool_opt '--no-recursive', 'No recursive.'
21
+ pos_arg :paths, optional: true, repeat: true
22
+ end
23
+ end
24
+
25
+ module TopMethods
26
+ def on_none_path_informed
27
+ infom 'Warning: none path informed'
28
+ end
29
+
30
+ def paths
31
+ parsed.paths.map(&:to_pathname)
32
+ end
33
+
34
+ def run_filesystem_traverser
35
+ if parsed.paths.any?
36
+ parsed.paths.each { |path| traverser_check_path(path) }
37
+ else
38
+ on_none_path_informed
39
+ end
40
+ end
41
+
42
+ def traverser_recursive
43
+ return false if parsed.no_recursive?
44
+ return true if parsed.recursive?
45
+
46
+ setting_value(:default_traverser_recursive, required: false)
47
+ .if_not_nil(DEFAULT_DEFAULT_TRAVERSER_RECURSIVE)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyBase0
4
- VERSION = '0.3.3'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -10,26 +10,36 @@ module EacRubyUtils
10
10
  class << self
11
11
  TIMEDATECTL_TIMEZONE_LINE_PATTERN = %r{\s*Time zone:\s*(\S+/\S+)\s}.freeze
12
12
 
13
+ # @return [ActiveSupport::TimeZone]
13
14
  def auto
14
15
  %w[tz_env debian_config offset].lazy.map { |s| send("by_#{s}") }.find(&:present?)
15
16
  end
16
17
 
18
+ def auto_set
19
+ ::Time.zone = auto
20
+ end
21
+
22
+ # @return [ActiveSupport::TimeZone]
17
23
  def by_debian_config
18
24
  path = ::Pathname.new(DEBIAN_CONFIG_PATH)
19
- path.exist? ? path.read.strip.presence : nil
25
+ path.exist? ? path.read.strip.if_present { |v| ::ActiveSupport::TimeZone[v] } : nil
20
26
  end
21
27
 
28
+ # @return [ActiveSupport::TimeZone]
22
29
  def by_offset
23
- ::ActiveSupport::TimeZone[::Time.now.getlocal.gmt_offset].name
30
+ ::ActiveSupport::TimeZone[::Time.now.getlocal.gmt_offset]
24
31
  end
25
32
 
33
+ # @return [ActiveSupport::TimeZone]
26
34
  def by_timedatectl
27
35
  executable = ::EacRubyUtils::Envs.local.executable('timedatectl', '--version')
28
36
  return nil unless executable.exist?
29
37
 
30
38
  TIMEDATECTL_TIMEZONE_LINE_PATTERN.if_match(executable.command.execute!) { |m| m[1] }
39
+ .if_present { |v| ::ActiveSupport::TimeZone[v] }
31
40
  end
32
41
 
42
+ # @return [ActiveSupport::TimeZone]
33
43
  def by_tz_env
34
44
  ENV['TZ'].presence
35
45
  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,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,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.58.0'
4
+ VERSION = '0.59.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esquilo Azul Company
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-17 00:00:00.000000000 Z
11
+ date: 2021-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avm-tools
@@ -37,9 +37,9 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0.12'
40
- - - "~>"
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 0.12.4
42
+ version: 0.12.5
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -47,9 +47,9 @@ dependencies:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0.12'
50
- - - "~>"
50
+ - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 0.12.4
52
+ version: 0.12.5
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: eac_ruby_utils
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -147,6 +147,8 @@ files:
147
147
  - lib/ehbrs/google.rb
148
148
  - lib/ehbrs/google/translate.rb
149
149
  - lib/ehbrs/google/translate/session.rb
150
+ - lib/ehbrs/music.rb
151
+ - lib/ehbrs/music/album.rb
150
152
  - lib/ehbrs/observers.rb
151
153
  - lib/ehbrs/observers/base.rb
152
154
  - lib/ehbrs/observers/with_persistence.rb
@@ -162,6 +164,8 @@ files:
162
164
  - lib/ehbrs/runner/fs/used_space.rb
163
165
  - lib/ehbrs/runner/google.rb
164
166
  - lib/ehbrs/runner/google/translate.rb
167
+ - lib/ehbrs/runner/music.rb
168
+ - lib/ehbrs/runner/music/selected.rb
165
169
  - lib/ehbrs/runner/self.rb
166
170
  - lib/ehbrs/runner/self/test.rb
167
171
  - lib/ehbrs/runner/telegram.rb
@@ -294,6 +298,7 @@ files:
294
298
  - vendor/eac_cli/lib/eac_cli/definition/alternative.rb
295
299
  - vendor/eac_cli/lib/eac_cli/definition/argument_option.rb
296
300
  - vendor/eac_cli/lib/eac_cli/definition/base_option.rb
301
+ - vendor/eac_cli/lib/eac_cli/definition/base_option/initialize_args_parser.rb
297
302
  - vendor/eac_cli/lib/eac_cli/definition/boolean_option.rb
298
303
  - vendor/eac_cli/lib/eac_cli/definition/help_formatter.rb
299
304
  - vendor/eac_cli/lib/eac_cli/definition/positional_argument.rb
@@ -316,12 +321,15 @@ files:
316
321
  - vendor/eac_cli/lib/eac_cli/patches/object.rb
317
322
  - vendor/eac_cli/lib/eac_cli/patches/object/runner_with.rb
318
323
  - vendor/eac_cli/lib/eac_cli/runner.rb
324
+ - vendor/eac_cli/lib/eac_cli/runner/after_class_methods.rb
319
325
  - vendor/eac_cli/lib/eac_cli/runner/context.rb
320
326
  - vendor/eac_cli/lib/eac_cli/runner/exit.rb
327
+ - vendor/eac_cli/lib/eac_cli/runner/instance_methods.rb
321
328
  - vendor/eac_cli/lib/eac_cli/runner_with.rb
322
329
  - vendor/eac_cli/lib/eac_cli/runner_with/help.rb
323
330
  - vendor/eac_cli/lib/eac_cli/runner_with/output_file.rb
324
331
  - vendor/eac_cli/lib/eac_cli/runner_with/subcommands.rb
332
+ - vendor/eac_cli/lib/eac_cli/runner_with_set.rb
325
333
  - vendor/eac_cli/lib/eac_cli/version.rb
326
334
  - vendor/eac_cli/spec/lib/eac_cli/definition/alternative_spec.rb
327
335
  - vendor/eac_cli/spec/lib/eac_cli/docopt/runner_extension_spec.rb
@@ -356,8 +364,17 @@ files:
356
364
  - vendor/eac_ruby_base0/eac_ruby_base0.gemspec
357
365
  - vendor/eac_ruby_base0/lib/eac_ruby_base0.rb
358
366
  - vendor/eac_ruby_base0/lib/eac_ruby_base0/application.rb
367
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/jobs_runner.rb
368
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/patches.rb
369
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/class.rb
370
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/class/jobs_runner.rb
371
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/object.rb
372
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/patches/object/runner_with.rb
359
373
  - vendor/eac_ruby_base0/lib/eac_ruby_base0/runner.rb
360
374
  - vendor/eac_ruby_base0/lib/eac_ruby_base0/runner/test_all.rb
375
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with.rb
376
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with/confirmable.rb
377
+ - vendor/eac_ruby_base0/lib/eac_ruby_base0/runner_with/filesystem_traverser.rb
361
378
  - vendor/eac_ruby_base0/lib/eac_ruby_base0/version.rb
362
379
  - vendor/eac_ruby_base0/spec/rubocop_spec.rb
363
380
  - vendor/eac_ruby_base0/spec/spec_helper.rb
@@ -451,6 +468,7 @@ files:
451
468
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches.rb
452
469
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class.rb
453
470
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class/common_constructor.rb
471
+ - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class/settings_provider.rb
454
472
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/enumerable.rb
455
473
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/enumerable/boolean_combinations.rb
456
474
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/enumerator.rb
@@ -474,6 +492,7 @@ files:
474
492
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object.rb
475
493
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/asserts.rb
476
494
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/debug.rb
495
+ - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_nil.rb
477
496
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_present.rb
478
497
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_respond.rb
479
498
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/template.rb
@@ -485,7 +504,7 @@ files:
485
504
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/string.rb
486
505
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/string/inflector.rb
487
506
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/time.rb
488
- - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/time/default_time_zone_set.rb
507
+ - vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/time/required_zone.rb
489
508
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/paths_hash.rb
490
509
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/paths_hash/entry_key_error.rb
491
510
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/paths_hash/node.rb
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/time/zones'
4
- require 'eac_ruby_utils/local_time_zone'
5
-
6
- ::Time.zone = ::EacRubyUtils::LocalTimeZone.auto