ehbrs-tools 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
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