ehbrs-tools 0.9.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ehbrs/gems.rb +37 -0
  3. data/lib/ehbrs/google.rb +9 -0
  4. data/lib/ehbrs/google/translate.rb +11 -0
  5. data/lib/ehbrs/google/translate/session.rb +61 -0
  6. data/lib/ehbrs/runner.rb +9 -13
  7. data/lib/ehbrs/runner/finances.rb +19 -0
  8. data/lib/ehbrs/runner/finances/bb_browser.rb +40 -0
  9. data/lib/ehbrs/runner/fs/used_space.rb +4 -4
  10. data/lib/ehbrs/runner/google.rb +19 -0
  11. data/lib/ehbrs/runner/google/translate.rb +92 -0
  12. data/lib/ehbrs/runner/self.rb +19 -0
  13. data/lib/ehbrs/runner/self/test.rb +30 -0
  14. data/lib/ehbrs/runner/videos/series.rb +21 -0
  15. data/lib/ehbrs/runner/videos/series/rename.rb +75 -0
  16. data/lib/ehbrs/tools/version.rb +1 -1
  17. data/lib/ehbrs/videos/series.rb +11 -0
  18. data/lib/ehbrs/videos/series/rename.rb +13 -0
  19. data/lib/ehbrs/videos/series/rename/directory_group.rb +28 -0
  20. data/lib/ehbrs/videos/series/rename/file.rb +114 -0
  21. data/lib/ehbrs/videos/series/rename/file/basename_parser.rb +44 -0
  22. data/lib/ehbrs/videos/series/rename/file/options.rb +30 -0
  23. data/lib/ehbrs/videos/series/rename/line_result.rb +26 -0
  24. data/lib/ehbrs/videos/series/rename/line_result_group.rb +39 -0
  25. data/lib/ehbrs/videos/series/rename/results_builder.rb +32 -0
  26. data/lib/ehbrs/videos/series/rename/season_group.rb +39 -0
  27. data/vendor/aranha-selenium/Gemfile +5 -0
  28. data/vendor/aranha-selenium/aranha-selenium.gemspec +19 -0
  29. data/vendor/aranha-selenium/lib/aranha/selenium.rb +8 -0
  30. data/vendor/aranha-selenium/lib/aranha/selenium/driver_factory.rb +47 -0
  31. data/vendor/aranha-selenium/lib/aranha/selenium/driver_factory/base.rb +76 -0
  32. data/vendor/aranha-selenium/lib/aranha/selenium/driver_factory/chrome.rb +28 -0
  33. data/vendor/aranha-selenium/lib/aranha/selenium/driver_factory/firefox.rb +54 -0
  34. data/vendor/aranha-selenium/lib/aranha/selenium/driver_factory/firefox_auto_download_mime_types +685 -0
  35. data/vendor/aranha-selenium/lib/aranha/selenium/session.rb +78 -0
  36. data/vendor/aranha-selenium/lib/aranha/selenium/version.rb +7 -0
  37. data/vendor/aranha-selenium/spec/rubocop_check_spec.rb +7 -0
  38. data/vendor/aranha-selenium/spec/spec_helper.rb +100 -0
  39. data/vendor/eac_cli/eac_cli.gemspec +3 -3
  40. data/vendor/eac_cli/lib/eac_cli/definition.rb +72 -0
  41. data/vendor/eac_cli/lib/eac_cli/definition/argument_option.rb +13 -0
  42. data/vendor/eac_cli/lib/eac_cli/{runner → definition}/base_option.rb +5 -1
  43. data/vendor/eac_cli/lib/eac_cli/definition/boolean_option.rb +13 -0
  44. data/vendor/eac_cli/lib/eac_cli/{runner → definition}/positional_argument.rb +5 -1
  45. data/vendor/eac_cli/lib/eac_cli/{runner/docopt_doc.rb → docopt/doc_builder.rb} +15 -8
  46. data/vendor/eac_cli/lib/eac_cli/docopt/runner_extension.rb +51 -0
  47. data/vendor/eac_cli/lib/eac_cli/parser.rb +14 -0
  48. data/vendor/eac_cli/lib/eac_cli/parser/collector.rb +56 -0
  49. data/vendor/eac_cli/lib/eac_cli/parser/error.rb +15 -0
  50. data/vendor/eac_cli/lib/eac_cli/parser/options_collection.rb +105 -0
  51. data/vendor/eac_cli/lib/eac_cli/parser/parse_result.rb +21 -0
  52. data/vendor/eac_cli/lib/eac_cli/parser/positional_collection.rb +49 -0
  53. data/vendor/eac_cli/lib/eac_cli/runner.rb +25 -5
  54. data/vendor/eac_cli/lib/eac_cli/runner/context.rb +18 -0
  55. data/vendor/eac_cli/lib/eac_cli/version.rb +1 -1
  56. data/vendor/eac_cli/spec/lib/eac_cli/runner_spec.rb +70 -0
  57. data/vendor/eac_docker/Gemfile +5 -0
  58. data/vendor/eac_docker/eac_docker.gemspec +18 -0
  59. data/vendor/eac_docker/lib/eac_docker.rb +7 -0
  60. data/vendor/eac_docker/lib/eac_docker/container.rb +50 -0
  61. data/vendor/eac_docker/lib/eac_docker/executables.rb +18 -0
  62. data/vendor/eac_docker/lib/eac_docker/images.rb +9 -0
  63. data/vendor/eac_docker/lib/eac_docker/images/base.rb +14 -0
  64. data/vendor/eac_docker/lib/eac_docker/images/named.rb +30 -0
  65. data/vendor/eac_docker/lib/eac_docker/rspec.rb +17 -0
  66. data/vendor/eac_docker/lib/eac_docker/version.rb +5 -0
  67. data/vendor/eac_docker/spec/lib/eac_docker/executables_spec.rb +9 -0
  68. data/vendor/eac_docker/spec/rubocop_spec.rb +7 -0
  69. data/vendor/eac_docker/spec/spec_helper.rb +103 -0
  70. data/vendor/eac_ruby_utils/eac_ruby_utils.gemspec +1 -1
  71. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/boolean.rb +31 -0
  72. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/common_concern.rb +68 -0
  73. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/configs.rb +4 -12
  74. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/configs.rb +1 -1
  75. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner.rb +6 -0
  76. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_class_methods.rb +3 -3
  77. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_subcommands.rb +8 -2
  78. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/speaker.rb +1 -1
  79. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/command.rb +1 -0
  80. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/command/extra_options.rb +8 -0
  81. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env.rb +12 -9
  82. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env/dasho_options.rb +53 -0
  83. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env/identity_file.rb +25 -0
  84. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env/quiet.rb +24 -0
  85. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env/terminal.rb +34 -0
  86. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/extname.rb +30 -0
  87. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs_cache.rb +1 -0
  88. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable.rb +15 -0
  89. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/array_accessor.rb +32 -0
  90. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/base_accessor.rb +23 -0
  91. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/boolean_accessor.rb +16 -0
  92. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/class_methods.rb +20 -0
  93. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/common_accessor.rb +30 -0
  94. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/hash_accessor.rb +46 -0
  95. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/immutable/instance_methods.rb +21 -0
  96. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/inflector.rb +18 -0
  97. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/list.rb +9 -0
  98. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/lists.rb +10 -12
  99. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/symbol_list.rb +19 -0
  100. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/common_concern.rb +10 -0
  101. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/immutable.rb +10 -0
  102. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/patch.rb +1 -1
  103. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/require_sub.rb +2 -2
  104. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_present.rb +1 -1
  105. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_respond.rb +22 -0
  106. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/string.rb +4 -0
  107. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/string/inflector.rb +9 -0
  108. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/paths_hash.rb +1 -3
  109. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/require_sub.rb +72 -2
  110. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/struct.rb +47 -0
  111. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/directory.rb +7 -1
  112. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/file.rb +8 -59
  113. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_not_found_error.rb +7 -0
  114. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_providers.rb +25 -0
  115. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_providers/base.rb +23 -0
  116. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_providers/entries_reader.rb +25 -0
  117. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_providers/generic.rb +25 -0
  118. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/variable_providers/hash.rb +29 -0
  119. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  120. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/yaml.rb +85 -2
  121. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/common_concern_spec.rb +42 -0
  122. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/common_constructor_spec.rb +1 -0
  123. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/console/docopt_runner_spec.rb +5 -5
  124. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/console/speaker_spec.rb +1 -1
  125. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/envs/executable_spec.rb +4 -0
  126. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/fs/extname_spec.rb +18 -0
  127. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/fs/temp/temp_spec.rb +1 -1
  128. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/inflector_spec.rb +15 -0
  129. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/listable_spec.rb +32 -0
  130. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/options_consumer_spec.rb +1 -1
  131. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/hash/sym_keys_hash_spec.rb +1 -1
  132. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/object/if_present_spec.rb +1 -1
  133. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/object/template_spec.rb +1 -1
  134. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/pathname/basename_sub_spec.rb +4 -4
  135. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/require_sub_spec.rb +19 -0
  136. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/require_sub_spec/stubbed_module_a.rb +6 -0
  137. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/require_sub_spec/stubbed_not_module.rb +6 -0
  138. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/ruby_spec.rb +22 -0
  139. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/struct_spec.rb +46 -0
  140. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/file_spec.rb +1 -0
  141. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/searcher_spec.rb +1 -1
  142. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/yaml_spec.rb +75 -0
  143. data/vendor/eac_ruby_utils/spec/locales/pt-BR.yml +17 -0
  144. metadata +103 -10
  145. data/vendor/eac_cli/lib/eac_cli/runner/argument_option.rb +0 -13
  146. data/vendor/eac_cli/lib/eac_cli/runner/boolean_option.rb +0 -13
  147. data/vendor/eac_cli/lib/eac_cli/runner/definition.rb +0 -64
@@ -54,6 +54,7 @@ module EacRubyUtils
54
54
  end
55
55
 
56
56
  def execute!(options = {})
57
+ options[:exit_outputs] = status_results.merge(options[:exit_outputs].presence || {})
57
58
  er = ExecuteResult.new(execute(options), options)
58
59
  return er.result if er.success?
59
60
 
@@ -16,6 +16,10 @@ module EacRubyUtils
16
16
  duplicate_by_extra_options(envvars: envvars.merge(name => value))
17
17
  end
18
18
 
19
+ def status_result(status_code, result)
20
+ duplicate_by_extra_options(status_results: status_results.merge(status_code => result))
21
+ end
22
+
19
23
  def pipe(other_command)
20
24
  duplicate_by_extra_options(pipe: other_command)
21
25
  end
@@ -28,6 +32,10 @@ module EacRubyUtils
28
32
  extra_options[:envvars] ||= {}.with_indifferent_access
29
33
  end
30
34
 
35
+ def status_results
36
+ extra_options[:status_results] ||= {}.with_indifferent_access
37
+ end
38
+
31
39
  def append_envvars(command)
32
40
  e = envvars.map { |k, v| "#{Shellwords.escape(k)}=#{Shellwords.escape(v)}" }.join(' ')
33
41
  e.present? ? "#{e} #{command}" : command
@@ -2,12 +2,16 @@
2
2
 
3
3
  require 'addressable'
4
4
  require 'eac_ruby_utils/envs/base_env'
5
+ require 'eac_ruby_utils/patches/object/if_present'
6
+ require 'eac_ruby_utils/patches/module/require_sub'
5
7
  require 'net/ssh'
6
8
  require 'shellwords'
7
9
 
8
10
  module EacRubyUtils
9
11
  module Envs
10
12
  class SshEnv < ::EacRubyUtils::Envs::BaseEnv
13
+ require_sub __FILE__, include_modules: true
14
+
11
15
  USER_PATTERN = /[a-z_][a-z0-9_-]*/.freeze
12
16
  HOSTNAME_PATTERN = /[^@]+/.freeze
13
17
  USER_HOSTNAME_PATTERN = /\A(?:(#{USER_PATTERN})@)?(#{HOSTNAME_PATTERN})\z/.freeze
@@ -49,17 +53,16 @@ module EacRubyUtils
49
53
  private
50
54
 
51
55
  def ssh_command_line
52
- r = %w[ssh]
53
- r += ['-p', uri.port] if uri.port.present?
54
- r += ssh_command_line_options
55
- r << user_hostname_uri
56
- r.map { |a| Shellwords.escape(a) }.join(' ')
56
+ (%w[ssh] +
57
+ %w[nodasho dasho port].flat_map { |m| send("ssh_command_line_#{m}_args") } +
58
+ [user_hostname_uri])
59
+ .map { |a| Shellwords.escape(a) }.join(' ')
57
60
  end
58
61
 
59
- def ssh_command_line_options
60
- r = []
61
- uri.query_values&.each { |k, v| r += ['-o', "#{k}=#{v}"] }
62
- r
62
+ def ssh_command_line_port_args
63
+ uri.port.if_present([]) do |v|
64
+ ['-p', v]
65
+ end
63
66
  end
64
67
 
65
68
  def user_hostname_uri
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/module/common_concern'
4
+ require 'eac_ruby_utils/patches/module/simple_cache'
5
+
6
+ module EacRubyUtils
7
+ module Envs
8
+ class SshEnv < ::EacRubyUtils::Envs::BaseEnv
9
+ module DashoOptions
10
+ common_concern
11
+
12
+ module ClassMethods
13
+ def add_nodasho_option(name)
14
+ return if nodasho_options.include?(name)
15
+
16
+ nodasho_options << name
17
+ const_set("#{name.underscore}_option".upcase, name)
18
+ end
19
+
20
+ def nodasho_options
21
+ @nodasho_options ||= []
22
+ end
23
+ end
24
+
25
+ module InstanceMethods
26
+ def ssh_command_line_dasho_args
27
+ r = []
28
+ uri.query_values&.each do |k, v|
29
+ r += ['-o', "#{k}=#{v}"] unless nodasho_options.include?(k)
30
+ end
31
+ r
32
+ end
33
+
34
+ def ssh_command_line_nodasho_args
35
+ nodasho_options.flat_map do |option_name|
36
+ uri_query_value(option_name).if_present([]) do |option_value|
37
+ send("ssh_command_line_#{option_name.underscore}_args", option_value)
38
+ end
39
+ end
40
+ end
41
+
42
+ def nodasho_options
43
+ self.class.nodasho_options
44
+ end
45
+
46
+ def uri_query_value(name)
47
+ uri.query_values.if_present { |v| v[name] }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'eac_ruby_utils/envs/ssh_env/dasho_options'
5
+ require 'eac_ruby_utils/listable'
6
+ require 'eac_ruby_utils/patches/object/if_present'
7
+
8
+ module EacRubyUtils
9
+ module Envs
10
+ class SshEnv < ::EacRubyUtils::Envs::BaseEnv
11
+ module IdentityFile
12
+ extend ::ActiveSupport::Concern
13
+
14
+ included do
15
+ include ::EacRubyUtils::Envs::SshEnv::DashoOptions
16
+ add_nodasho_option('IdentityFile')
17
+ end
18
+
19
+ def ssh_command_line_identity_file_args(value)
20
+ ['-i', value]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'eac_ruby_utils/boolean'
5
+ require 'eac_ruby_utils/envs/ssh_env/dasho_options'
6
+
7
+ module EacRubyUtils
8
+ module Envs
9
+ class SshEnv < ::EacRubyUtils::Envs::BaseEnv
10
+ module Quiet
11
+ extend ::ActiveSupport::Concern
12
+
13
+ included do
14
+ include ::EacRubyUtils::Envs::SshEnv::DashoOptions
15
+ add_nodasho_option('Quiet')
16
+ end
17
+
18
+ def ssh_command_line_quiet_args(value)
19
+ ::EacRubyUtils::Boolean.parse(value) ? ['-q'] : []
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'eac_ruby_utils/envs/ssh_env/dasho_options'
5
+ require 'eac_ruby_utils/listable'
6
+ require 'eac_ruby_utils/patches/object/if_present'
7
+
8
+ module EacRubyUtils
9
+ module Envs
10
+ class SshEnv < ::EacRubyUtils::Envs::BaseEnv
11
+ module Terminal
12
+ extend ::ActiveSupport::Concern
13
+
14
+ included do
15
+ include ::EacRubyUtils::Envs::SshEnv::DashoOptions
16
+ add_nodasho_option('Terminal')
17
+ include ::EacRubyUtils::Listable
18
+ lists.add_string :terminal_option, :auto, :disable, :enable, :force
19
+ end
20
+
21
+ def ssh_command_line_terminal_args(value)
22
+ self.class.lists.terminal_option.value_validate!(value)
23
+ case value
24
+ when TERMINAL_OPTION_AUTO then ENV['TERM'].present? ? %w[-t] : []
25
+ when TERMINAL_OPTION_DISABLE then ['-T']
26
+ when TERMINAL_OPTION_ENABLE then ['-t']
27
+ when TERMINAL_OPTION_FORCE then ['-tt']
28
+ else raise "Invalid conditional branch: #{value}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ module Fs
5
+ class << self
6
+ # A [File.extname] which find multiple extensions (Ex.: .tar.gz).
7
+ def extname(path, limit = -1)
8
+ recursive_extension(::File.basename(path), limit)
9
+ end
10
+
11
+ # Shortcut to +extname(2)+.
12
+ def extname2(path)
13
+ extname(path, 2)
14
+ end
15
+
16
+ private
17
+
18
+ def recursive_extension(basename, limit)
19
+ return '' if limit.zero?
20
+
21
+ m = /\A(.+)(\.[a-z][a-z0-9]*)\z/i.match(basename)
22
+ if m
23
+ "#{recursive_extension(m[1], limit - 1)}#{m[2]}"
24
+ else
25
+ ''
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/filesystem_cache'
4
+ require 'tmpdir'
4
5
 
5
6
  module EacRubyUtils
6
7
  class << self
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/module/common_concern'
4
+ require 'eac_ruby_utils/require_sub'
5
+
6
+ module EacRubyUtils
7
+ module Immutable
8
+ ::EacRubyUtils.require_sub __FILE__
9
+
10
+ common_concern do
11
+ include ::EacRubyUtils::Listable
12
+ lists.add_symbol :type, :array, :boolean, :common, :hash
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/inflector'
4
+ require 'eac_ruby_utils/immutable/base_accessor'
5
+ require 'eac_ruby_utils/patches/class/common_constructor'
6
+
7
+ module EacRubyUtils
8
+ module Immutable
9
+ class ArrayAccessor < ::EacRubyUtils::Immutable::BaseAccessor
10
+ def apply(klass)
11
+ accessor = self
12
+ klass.send(:define_method, name) do |value|
13
+ accessor.immutable_value_set(self, value)
14
+ end
15
+
16
+ klass.send(:define_method, ::ActiveSupport::Inflector.pluralize(name)) do
17
+ accessor.immutable_value_get(self)
18
+ end
19
+ end
20
+
21
+ def immutable_value_get(object)
22
+ super || []
23
+ end
24
+
25
+ def immutable_value_set(object, value)
26
+ duplicate_object(object) do |old_value|
27
+ (old_value || []) + [value]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ module Immutable
5
+ class BaseAccessor
6
+ common_constructor :name do
7
+ self.name = name.to_sym
8
+ end
9
+
10
+ def duplicate_object(object)
11
+ accessor_new_value = yield(immutable_value_get(object))
12
+ new_values = object.send(:immutable_values_get).merge(name => accessor_new_value)
13
+ r = object.class.new(*object.immutable_constructor_args)
14
+ r.send(:immutable_values_set, new_values)
15
+ r
16
+ end
17
+
18
+ def immutable_value_get(object)
19
+ object.send(:immutable_values_get)[name]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/immutable/common_accessor'
4
+ require 'eac_ruby_utils/patches/class/common_constructor'
5
+
6
+ module EacRubyUtils
7
+ module Immutable
8
+ class BooleanAccessor < ::EacRubyUtils::Immutable::CommonAccessor
9
+ def apply(klass)
10
+ super
11
+ accessor = self
12
+ klass.send(:define_method, "#{name}?") { send(accessor.name) }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ module Immutable
5
+ module ClassMethods
6
+ def immutable_accessor(*accessors)
7
+ options = accessors.extract_options!
8
+ options[:type] ||= const_get('TYPE_COMMON')
9
+ accessors.each do |name|
10
+ class_name = options.fetch(:type).to_s.camelize + 'Accessor'
11
+ ::EacRubyUtils::Immutable.const_get(class_name).new(name).apply(self)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def imutable_single_accessor(name, options); end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/immutable/base_accessor'
4
+ require 'eac_ruby_utils/patches/class/common_constructor'
5
+
6
+ module EacRubyUtils
7
+ module Immutable
8
+ class CommonAccessor < ::EacRubyUtils::Immutable::BaseAccessor
9
+ def apply(klass)
10
+ accessor = self
11
+ klass.send(:define_method, name) do |*args|
12
+ case args.count
13
+ when 0 then next accessor.immutable_value_get(self)
14
+ when 1 then next accessor.immutable_value_set(self, args.first)
15
+ else
16
+ raise ::ArgumentError, "wrong number of arguments (given #{args.count}, expected 0..1)"
17
+ end
18
+ end
19
+ end
20
+
21
+ def immutable_value_get(object)
22
+ object.send(:immutable_values_get)[name]
23
+ end
24
+
25
+ def immutable_value_set(object, value)
26
+ duplicate_object(object) { |_old_value| value }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/immutable/base_accessor'
4
+ require 'eac_ruby_utils/patches/class/common_constructor'
5
+
6
+ module EacRubyUtils
7
+ module Immutable
8
+ class HashAccessor < ::EacRubyUtils::Immutable::BaseAccessor
9
+ def apply(klass)
10
+ apply_get(klass)
11
+ apply_set(klass)
12
+ end
13
+
14
+ def immutable_value_get(object)
15
+ super || {}
16
+ end
17
+
18
+ def immutable_value_set(object, key, value)
19
+ duplicate_object(object) do |old_value|
20
+ (old_value || {}).merge(key => value)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def apply_get(klass)
27
+ accessor = self
28
+ klass.send(:define_method, ::ActiveSupport::Inflector.pluralize(name)) do
29
+ accessor.immutable_value_get(self)
30
+ end
31
+ end
32
+
33
+ def apply_set(klass)
34
+ accessor = self
35
+ klass.send(:define_method, name) do |*args|
36
+ case args.count
37
+ when 1 then next accessor.immutable_value_get(self, args[0])
38
+ when 2 then next accessor.immutable_value_set(self, *args[0..1])
39
+ else
40
+ raise ::ArgumentError, "wrong number of arguments (given #{args.count}, expected 1..2)"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end