eac_tools 0.66.0 → 0.67.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +28 -28
  3. data/lib/eac_tools/version.rb +1 -1
  4. data/sub/avm/avm.gemspec +2 -2
  5. data/sub/avm/lib/avm/data/clearer.rb +8 -6
  6. data/sub/avm/lib/avm/data/package/base_performer.rb +38 -0
  7. data/sub/avm/lib/avm/data/package/clear.rb +3 -4
  8. data/sub/avm/lib/avm/data/performer.rb +49 -0
  9. data/sub/avm/lib/avm/instances/runner.rb +1 -1
  10. data/sub/avm/lib/avm/sources/runner.rb +2 -0
  11. data/sub/avm/lib/avm/version.rb +1 -1
  12. data/sub/avm-eac_ubuntu_base0/avm-eac_ubuntu_base0.gemspec +3 -3
  13. data/sub/avm-eac_ubuntu_base0/lib/avm/eac_ubuntu_base0/runners/base.rb +2 -0
  14. data/sub/avm-eac_ubuntu_base0/lib/avm/eac_ubuntu_base0/version.rb +1 -1
  15. data/sub/avm-eac_webapp_base0/avm-eac_webapp_base0.gemspec +3 -3
  16. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/provider.rb +2 -2
  17. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/version.rb +1 -1
  18. data/sub/avm-tools/avm-tools.gemspec +2 -2
  19. data/sub/avm-tools/lib/avm/tools/runner/instance/data/clear.rb +1 -1
  20. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit/dump.rb +2 -2
  21. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit/load.rb +1 -1
  22. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit.rb +2 -5
  23. data/sub/avm-tools/lib/avm/tools/runner/instance/data.rb +2 -0
  24. data/sub/avm-tools/lib/avm/tools/runner_with/include_exclude.rb +23 -0
  25. data/sub/avm-tools/lib/avm/tools/runner_with/instance_data_clear.rb +11 -1
  26. data/sub/avm-tools/lib/avm/tools/version.rb +1 -1
  27. data/sub/eac_cli/eac_cli.gemspec +1 -1
  28. data/sub/eac_cli/lib/eac_cli/definition/alternative.rb +11 -7
  29. data/sub/eac_cli/lib/eac_cli/definition/base_option/initialize_args_parser.rb +2 -1
  30. data/sub/eac_cli/lib/eac_cli/definition/base_option.rb +1 -1
  31. data/sub/eac_cli/lib/eac_cli/definition/boolean_option.rb +2 -1
  32. data/sub/eac_cli/lib/eac_cli/definition/error.rb +8 -0
  33. data/sub/eac_cli/lib/eac_cli/runner/after_class_methods.rb +6 -1
  34. data/sub/eac_cli/lib/eac_cli/runner/context.rb +22 -3
  35. data/sub/eac_cli/lib/eac_cli/runner/context_responders/base.rb +24 -0
  36. data/sub/eac_cli/lib/eac_cli/runner/context_responders/parent.rb +27 -0
  37. data/sub/eac_cli/lib/eac_cli/runner/context_responders/runner.rb +20 -0
  38. data/sub/eac_cli/lib/eac_cli/runner/context_responders/runner_missing_method.rb +32 -0
  39. data/sub/eac_cli/lib/eac_cli/runner/context_responders/set.rb +44 -0
  40. data/sub/eac_cli/lib/eac_cli/runner/context_responders.rb +11 -0
  41. data/sub/eac_cli/lib/eac_cli/runner/for_context.rb +40 -0
  42. data/sub/eac_cli/lib/eac_cli/runner/instance_methods.rb +5 -3
  43. data/sub/eac_cli/lib/eac_cli/runner.rb +1 -0
  44. data/sub/eac_cli/lib/eac_cli/version.rb +1 -1
  45. data/sub/eac_cli/spec/lib/eac_cli/runner/for_context_spec.rb +79 -0
  46. data/sub/eac_cli/spec/lib/eac_cli/runner_with/subcommands_spec.rb +1 -0
  47. data/sub/eac_ruby_base0/eac_ruby_base0.gemspec +3 -3
  48. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner/contexts.rb +52 -0
  49. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner/prepend.rb +17 -4
  50. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner.rb +1 -39
  51. data/sub/eac_ruby_base0/lib/eac_ruby_base0/version.rb +1 -1
  52. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_abstract.rb +17 -6
  53. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/array_accessor.rb +25 -0
  54. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/base_accessor.rb +57 -0
  55. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/boolean_accessor.rb +3 -3
  56. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/class_methods.rb +2 -2
  57. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/common_accessor.rb +5 -5
  58. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable/array_accessor.rb → acts_as_immutable/enumerable_accessor.rb} +11 -8
  59. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/hash_accessor.rb +5 -5
  60. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/instance_methods.rb +1 -1
  61. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/set_accessor.rb +25 -0
  62. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable.rb → acts_as_immutable.rb} +1 -1
  63. data/sub/eac_ruby_utils/lib/eac_ruby_utils/enumerables_methods.rb +42 -0
  64. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/base.rb +34 -0
  65. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/hash.rb +20 -0
  66. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/set.rb +19 -0
  67. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable.rb +9 -0
  68. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/module/acts_as_immutable.rb +10 -0
  69. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/module/immutable.rb +3 -2
  70. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/debug.rb +9 -0
  71. data/sub/eac_ruby_utils/lib/eac_ruby_utils/unimplemented_method_error.rb +6 -0
  72. data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  73. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_abstract_spec.rb +73 -7
  74. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/{immutable → acts_as_immutable}/array_accessor_spec.rb +11 -3
  75. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_immutable/common_accessor_spec.rb +57 -0
  76. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/{immutable → acts_as_immutable}/hash_accessor_spec.rb +3 -3
  77. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_immutable/set_accessor_spec.rb +43 -0
  78. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/enumerables_methods_spec.rb +50 -0
  79. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/module_ancestors_variable/hash_spec.rb +57 -0
  80. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/module_ancestors_variable/set_spec.rb +57 -0
  81. metadata +47 -20
  82. data/sub/eac_ruby_utils/lib/eac_ruby_utils/immutable/base_accessor.rb +0 -23
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/object/if_respond'
4
+
5
+ module EacRubyUtils
6
+ module ActsAsImmutable
7
+ class BaseAccessor
8
+ FILTER_GET_METHOD_NAME_FORMAT = '%s_get_filter'
9
+ FILTER_SET_METHOD_NAME_FORMAT = '%s_set_filter'
10
+
11
+ common_constructor :name do
12
+ self.name = name.to_sym
13
+ end
14
+
15
+ def duplicate_object(object)
16
+ accessor_new_value = yield(immutable_value_get(object))
17
+ new_values = object.send(:immutable_values_get).merge(name => accessor_new_value)
18
+ r = object.class.new(*object.immutable_constructor_args)
19
+ r.send(:immutable_values_set, new_values)
20
+ r
21
+ end
22
+
23
+ def immutable_value_get(object)
24
+ object.send(:immutable_values_get)[name]
25
+ end
26
+
27
+ # @param object [Object]
28
+ # @return [Object]
29
+ def immutable_value_get_filtered(object)
30
+ r = immutable_value_get(object)
31
+ if object.respond_to?(immutable_value_get_filtered_method_name, true)
32
+ r = object.send(immutable_value_get_filtered_method_name, r)
33
+ end
34
+ r
35
+ end
36
+
37
+ # @return [Symbol]
38
+ def immutable_value_get_filtered_method_name
39
+ format(FILTER_GET_METHOD_NAME_FORMAT, name)
40
+ end
41
+
42
+ # @param object [Object]
43
+ # @return [Object]
44
+ def immutable_value_set_filtered(object, value)
45
+ if object.respond_to?(immutable_value_set_filtered_method_name, true)
46
+ value = object.send(immutable_value_set_filtered_method_name, value)
47
+ end
48
+ immutable_value_set(object, value)
49
+ end
50
+
51
+ # @return [Symbol]
52
+ def immutable_value_set_filtered_method_name
53
+ format(FILTER_SET_METHOD_NAME_FORMAT, name)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable/common_accessor'
3
+ require 'eac_ruby_utils/acts_as_immutable/common_accessor'
4
4
  require 'eac_ruby_utils/patches/class/common_constructor'
5
5
 
6
6
  module EacRubyUtils
7
- module Immutable
8
- class BooleanAccessor < ::EacRubyUtils::Immutable::CommonAccessor
7
+ module ActsAsImmutable
8
+ class BooleanAccessor < ::EacRubyUtils::ActsAsImmutable::CommonAccessor
9
9
  def apply(klass)
10
10
  super
11
11
  accessor = self
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- module Immutable
4
+ module ActsAsImmutable
5
5
  module ClassMethods
6
6
  def immutable_accessor(*accessors)
7
7
  options = accessors.extract_options!
8
8
  options[:type] ||= const_get('TYPE_COMMON')
9
9
  accessors.each do |name|
10
10
  class_name = options.fetch(:type).to_s.camelize + 'Accessor'
11
- ::EacRubyUtils::Immutable.const_get(class_name).new(name).apply(self)
11
+ ::EacRubyUtils::ActsAsImmutable.const_get(class_name).new(name).apply(self)
12
12
  end
13
13
  end
14
14
 
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable/base_accessor'
3
+ require 'eac_ruby_utils/acts_as_immutable/base_accessor'
4
4
  require 'eac_ruby_utils/patches/class/common_constructor'
5
5
 
6
6
  module EacRubyUtils
7
- module Immutable
8
- class CommonAccessor < ::EacRubyUtils::Immutable::BaseAccessor
7
+ module ActsAsImmutable
8
+ class CommonAccessor < ::EacRubyUtils::ActsAsImmutable::BaseAccessor
9
9
  def apply(klass)
10
10
  accessor = self
11
11
  klass.send(:define_method, name) do |*args|
12
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)
13
+ when 0 then next accessor.immutable_value_get_filtered(self)
14
+ when 1 then next accessor.immutable_value_set_filtered(self, args.first)
15
15
  else
16
16
  raise ::ArgumentError, "wrong number of arguments (given #{args.count}, expected 0..1)"
17
17
  end
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/inflector'
4
- require 'eac_ruby_utils/immutable/base_accessor'
4
+ require 'eac_ruby_utils/acts_as_immutable/base_accessor'
5
5
  require 'eac_ruby_utils/patches/class/common_constructor'
6
6
 
7
7
  module EacRubyUtils
8
- module Immutable
9
- class ArrayAccessor < ::EacRubyUtils::Immutable::BaseAccessor
8
+ module ActsAsImmutable
9
+ # Should implement in concrect classes:
10
+ # * immutable_value_set_assert(value)
11
+ # * initial_value()
12
+ class EnumerableAccessor < ::EacRubyUtils::ActsAsImmutable::BaseAccessor
10
13
  def apply(klass)
11
14
  apply_singular(klass)
12
15
  apply_plural(klass)
@@ -16,8 +19,8 @@ module EacRubyUtils
16
19
  accessor = self
17
20
  klass.send(:define_method, ::ActiveSupport::Inflector.pluralize(name)) do |*args|
18
21
  case args.count
19
- when 0 then next accessor.immutable_value_get(self)
20
- when 1 then next accessor.immutable_value_set(self, args.first)
22
+ when 0 then next accessor.immutable_value_get_filtered(self)
23
+ when 1 then next accessor.immutable_value_set_filtered(self, args.first)
21
24
  else
22
25
  raise ::ArgumentError, "wrong number of arguments (given #{args.count}, expected 0..1)"
23
26
  end
@@ -32,17 +35,17 @@ module EacRubyUtils
32
35
  end
33
36
 
34
37
  def immutable_value_get(object)
35
- super || []
38
+ super || initial_value.dup
36
39
  end
37
40
 
38
41
  def immutable_value_push(object, value)
39
42
  duplicate_object(object) do |old_value|
40
- (old_value || []) + [value]
43
+ (old_value || initial_value.dup) + [value]
41
44
  end
42
45
  end
43
46
 
44
47
  def immutable_value_set(object, value)
45
- duplicate_object(object) { |_old_value| value }
48
+ duplicate_object(object) { |_old_value| immutable_value_set_assert(value) }
46
49
  end
47
50
  end
48
51
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable/base_accessor'
3
+ require 'eac_ruby_utils/acts_as_immutable/base_accessor'
4
4
  require 'eac_ruby_utils/patches/class/common_constructor'
5
5
 
6
6
  module EacRubyUtils
7
- module Immutable
8
- class HashAccessor < ::EacRubyUtils::Immutable::BaseAccessor
7
+ module ActsAsImmutable
8
+ class HashAccessor < ::EacRubyUtils::ActsAsImmutable::BaseAccessor
9
9
  def apply(klass)
10
10
  apply_plural(klass)
11
11
  apply_singular(klass)
@@ -33,8 +33,8 @@ module EacRubyUtils
33
33
  accessor = self
34
34
  klass.send(:define_method, ::ActiveSupport::Inflector.pluralize(name)) do |*args|
35
35
  case args.count
36
- when 0 then next accessor.immutable_value_get(self)
37
- when 1 then next accessor.immutable_value_set(self, args[0])
36
+ when 0 then next accessor.immutable_value_get_filtered(self)
37
+ when 1 then next accessor.immutable_value_set_filtered(self, args[0])
38
38
  else
39
39
  raise ::ArgumentError, "wrong number of arguments (given #{args.count}, expected 0..1)"
40
40
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- module Immutable
4
+ module ActsAsImmutable
5
5
  module InstanceMethods
6
6
  def immutable_constructor_args
7
7
  []
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/acts_as_immutable/enumerable_accessor'
4
+
5
+ module EacRubyUtils
6
+ module ActsAsImmutable
7
+ class SetAccessor < ::EacRubyUtils::ActsAsImmutable::EnumerableAccessor
8
+ INITIAL_VALUE = ::Set.new.freeze
9
+
10
+ # @param value [Object]
11
+ # @return [Set]
12
+ def immutable_value_set_assert(value)
13
+ return value if value.is_a?(::Set)
14
+ return value.to_set if value.respond_to?(:to_set)
15
+
16
+ ::Set.new(value)
17
+ end
18
+
19
+ # @return [Set] A empty Set.
20
+ def initial_value
21
+ INITIAL_VALUE
22
+ end
23
+ end
24
+ end
25
+ end
@@ -4,7 +4,7 @@ require 'eac_ruby_utils/patches/module/common_concern'
4
4
  require 'eac_ruby_utils/require_sub'
5
5
 
6
6
  module EacRubyUtils
7
- module Immutable
7
+ module ActsAsImmutable
8
8
  ::EacRubyUtils.require_sub __FILE__
9
9
 
10
10
  common_concern do
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/object/debug'
4
+
5
+ module EacRubyUtils
6
+ module EnumerablesMethods
7
+ class << self
8
+ WRITE_METHOD_PATTERNS = [/\A[a-z].*[\!\=]\z/i] +
9
+ %i[\[\]= <<].map { |m| /\A#{::Regexp.quote(m)}\z/ } +
10
+ %i[add clear delete divide keep reset shift subtract]
11
+ .map { |m| /\A#{::Regexp.quote(m)}.*\z/ }
12
+
13
+ # @param klass [Klass]
14
+ # @return [Enumerable<Symbol>]
15
+ def self_methods_names(klass)
16
+ (klass.public_instance_methods - klass.superclass.public_instance_methods).sort
17
+ end
18
+
19
+ # @param method_name [Symbol]
20
+ # @return [Boolean]
21
+ def write_method?(method_name)
22
+ WRITE_METHOD_PATTERNS.any? { |pattern| pattern.match?(method_name.to_s) }
23
+ end
24
+ end
25
+
26
+ ARRAY_METHODS = self_methods_names(::Array)
27
+ ARRAY_WRITE_METHODS = ARRAY_METHODS.select { |m| write_method?(m) }
28
+ ARRAY_READ_METHODS = ARRAY_METHODS - ARRAY_WRITE_METHODS
29
+
30
+ ENUMERABLE_METHODS = ::Enumerable.public_instance_methods.sort
31
+ ENUMERABLE_WRITE_METHODS = ENUMERABLE_METHODS.select { |m| write_method?(m) }
32
+ ENUMERABLE_READ_METHODS = ENUMERABLE_METHODS - ENUMERABLE_WRITE_METHODS
33
+
34
+ HASH_METHODS = self_methods_names(::Hash)
35
+ HASH_WRITE_METHODS = HASH_METHODS.select { |m| write_method?(m) }
36
+ HASH_READ_METHODS = HASH_METHODS - HASH_WRITE_METHODS
37
+
38
+ SET_METHODS = self_methods_names(::Set)
39
+ SET_WRITE_METHODS = SET_METHODS.select { |m| write_method?(m) } + [:merge]
40
+ SET_READ_METHODS = SET_METHODS - SET_WRITE_METHODS
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/class/common_constructor'
4
+
5
+ module EacRubyUtils
6
+ module ModuleAncestorsVariable
7
+ class Base
8
+ common_constructor :the_module, :method_name, :initial_value
9
+
10
+ # @param current [Object]
11
+ # @param other [Object]
12
+ # @return [Object]
13
+ def merge_operation(current, other)
14
+ current.merge(other)
15
+ end
16
+
17
+ # return [Hash]
18
+ def ancestors_variable
19
+ the_module.ancestors.inject(initial_value.dup) do |a, e|
20
+ if e.respond_to?(method_name, true)
21
+ merge_operation(a, e.send(method_name).send(:self_variable))
22
+ else
23
+ a
24
+ end
25
+ end
26
+ end
27
+
28
+ # @return [Hash]
29
+ def self_variable
30
+ @self_variable ||= initial_value.dup
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/delegation'
4
+ require 'eac_ruby_utils/module_ancestors_variable/base'
5
+ require 'eac_ruby_utils/enumerables_methods'
6
+
7
+ module EacRubyUtils
8
+ module ModuleAncestorsVariable
9
+ class Hash < ::EacRubyUtils::ModuleAncestorsVariable::Base
10
+ INITIAL_VALUE = {}.freeze
11
+
12
+ def initialize(the_module, method_name)
13
+ super(the_module, method_name, INITIAL_VALUE)
14
+ end
15
+
16
+ delegate(*::EacRubyUtils::EnumerablesMethods::HASH_READ_METHODS, to: :ancestors_variable)
17
+ delegate(*::EacRubyUtils::EnumerablesMethods::HASH_WRITE_METHODS, to: :self_variable)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/delegation'
4
+ require 'eac_ruby_utils/module_ancestors_variable/base'
5
+
6
+ module EacRubyUtils
7
+ module ModuleAncestorsVariable
8
+ class Set < ::EacRubyUtils::ModuleAncestorsVariable::Base
9
+ INITIAL_VALUE = ::Set.new
10
+
11
+ def initialize(the_module, method_name)
12
+ super(the_module, method_name, INITIAL_VALUE)
13
+ end
14
+
15
+ delegate(*::EacRubyUtils::EnumerablesMethods::SET_READ_METHODS, to: :ancestors_variable)
16
+ delegate(*::EacRubyUtils::EnumerablesMethods::SET_WRITE_METHODS, to: :self_variable)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/module/require_sub'
4
+
5
+ module EacRubyUtils
6
+ class ModuleAncestorsHash
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patch'
4
+ require 'eac_ruby_utils/acts_as_immutable'
5
+
6
+ class Module
7
+ def acts_as_immutable
8
+ ::EacRubyUtils.patch(self, ::EacRubyUtils::ActsAsImmutable)
9
+ end
10
+ end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/patch'
4
- require 'eac_ruby_utils/immutable'
4
+ require 'eac_ruby_utils/acts_as_immutable'
5
5
 
6
6
  class Module
7
+ # @deprecated Use {#acts_as_immutable} instead.
7
8
  def enable_immutable
8
- ::EacRubyUtils.patch(self, ::EacRubyUtils::Immutable)
9
+ ::EacRubyUtils.patch(self, ::EacRubyUtils::ActsAsImmutable)
9
10
  end
10
11
  end
@@ -1,6 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/patches/object/if_present'
4
+ require 'pp'
5
+
3
6
  class Object
7
+ def compact_debug(*methods_names)
8
+ methods_names.each do |method_name|
9
+ send(method_name).print_debug(label: method_name)
10
+ end
11
+ end
12
+
4
13
  def pretty_debug(options = {})
5
14
  print_debug_options(options)
6
15
 
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ class UnimplementedMethodError < ::StandardError
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.116.0'
4
+ VERSION = '0.117.0'
5
5
  end
@@ -1,28 +1,94 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/acts_as_abstract'
4
+ require 'eac_ruby_utils/unimplemented_method_error'
4
5
 
5
- RSpec.describe(::EacRubyUtils::ActsAsAbstract) do
6
+ ::RSpec.describe(::EacRubyUtils::ActsAsAbstract) do
6
7
  let(:base_class) do
7
8
  the_module = described_class
8
9
  ::Class.new do
9
10
  include the_module
10
11
 
11
12
  abstract_methods :method1, :method2
13
+
14
+ def method3
15
+ 'base result'
16
+ end
12
17
  end
13
18
  end
14
- let(:base_instance) { base_class.new }
15
19
  let(:sub_class) do
16
20
  ::Class.new(base_class) do
17
21
  def method1
18
22
  'a result'
19
23
  end
24
+
25
+ def method4
26
+ 'sub result'
27
+ end
20
28
  end
21
29
  end
22
- let(:sub_instance) { sub_class.new }
23
30
 
24
- it { expect { base_instance.method1 }.to raise_error(::NoMethodError) }
25
- it { expect { base_instance.method2 }.to raise_error(::NoMethodError) }
26
- it { expect(sub_instance.method1).to eq('a result') }
27
- it { expect { sub_instance.method2 }.to raise_error(::NoMethodError) }
31
+ class << self
32
+ def specs_for_target(test_target, instances_hash)
33
+ describe "\##{test_target}" do # rubocop:disable RSpec/EmptyExampleGroup
34
+ specs_for_instances(test_target, instances_hash)
35
+ end
36
+ end
37
+
38
+ def specs_for_instances(test_target, instances_hash)
39
+ instances_hash.each do |instance_name, expected_values|
40
+ context "when instance is \"#{instance_name}\"" do # rubocop:disable RSpec/EmptyExampleGroup
41
+ let(:instance) { send("#{instance_name}_class").new }
42
+
43
+ specs_for_methods_values(test_target, expected_values)
44
+ end
45
+ end
46
+ end
47
+
48
+ def specs_for_methods_values(test_target, expected_values)
49
+ expected_values.each_with_index do |expected_value, method_index|
50
+ method_name = "method#{method_index + 1}"
51
+ context "when method is \"#{method_name}\"" do # rubocop:disable RSpec/EmptyExampleGroup
52
+ send("specs_for_#{test_target}", method_name, expected_value)
53
+ end
54
+ end
55
+ end
56
+
57
+ def specs_for_abstract_method(method_name, expected_value)
58
+ it { expect(instance.abstract_method?(method_name)).to eq(expected_value) }
59
+ end
60
+
61
+ def specs_for_method_missing(method_name, expected_value)
62
+ if expected_value.is_a?(::Class) && expected_value < ::Exception
63
+ it do
64
+ expect { instance.send(method_name) }.to raise_error(expected_value)
65
+ end
66
+ else
67
+ it do
68
+ expect(instance.send(method_name)).to eq(expected_value)
69
+ end
70
+ end
71
+ end
72
+
73
+ def specs_for_respond_to_missing(method_name, expected_value)
74
+ it { expect(instance.respond_to?(method_name)).to eq(expected_value) }
75
+ end
76
+ end
77
+ {
78
+ abstract_method: {
79
+ base: [true, true, false, false],
80
+ sub: [false, true, false, false]
81
+ },
82
+ method_missing: {
83
+ base: [::EacRubyUtils::UnimplementedMethodError, ::EacRubyUtils::UnimplementedMethodError,
84
+ 'base result', ::NoMethodError],
85
+ sub: ['a result', ::EacRubyUtils::UnimplementedMethodError, 'base result', 'sub result']
86
+ },
87
+ respond_to_missing: {
88
+ base: [true, true, true, false],
89
+ sub: [true, true, true, true]
90
+ }
91
+ }.each do |test_target, instances_hash|
92
+ specs_for_target(test_target, instances_hash)
93
+ end
28
94
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable'
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
4
 
5
- ::RSpec.describe ::EacRubyUtils::Immutable::ArrayAccessor do
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::ArrayAccessor do
6
6
  let(:stub_class) do
7
7
  ::Class.new do
8
- include ::EacRubyUtils::Immutable
8
+ include ::EacRubyUtils::ActsAsImmutable
9
9
 
10
10
  immutable_accessor :array_attr, type: :array
11
11
  end
@@ -31,5 +31,13 @@ require 'eac_ruby_utils/immutable'
31
31
  it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
32
32
  it { expect(change2_instance.array_attrs).to eq(%w[B]) }
33
33
  end
34
+
35
+ context 'when array_attrs sets for a non array' do
36
+ let(:change2_instance) { initial_instance.array_attrs('B') }
37
+
38
+ it { expect(change2_instance).to be_a(initial_instance.class) }
39
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
40
+ it { expect(change2_instance.array_attrs).to eq(%w[B]) }
41
+ end
34
42
  end
35
43
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
+
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::CommonAccessor do
6
+ let(:stub_class) do
7
+ ::Class.new do
8
+ include ::EacRubyUtils::ActsAsImmutable
9
+
10
+ immutable_accessor :attr1, :attr2, :attr3
11
+
12
+ def attr1_get_filter(value)
13
+ value || 'DEFAULT'
14
+ end
15
+
16
+ def attr2_set_filter(value)
17
+ "#{value}_FILTERED"
18
+ end
19
+ end
20
+ end
21
+
22
+ let(:initial_instance) { stub_class.new }
23
+
24
+ it { expect(initial_instance.attr1).to eq('DEFAULT') }
25
+ it { expect(initial_instance.attr2).to eq(nil) }
26
+ it { expect(initial_instance.attr3).to eq(nil) }
27
+
28
+ context 'when attr1 is set' do
29
+ let(:change1_instance) { initial_instance.attr1('A') }
30
+
31
+ it { expect(change1_instance).to be_a(initial_instance.class) }
32
+ it { expect(change1_instance.object_id).not_to eq(initial_instance.object_id) }
33
+ it { expect(change1_instance.attr1).to eq('A') }
34
+ it { expect(change1_instance.attr2).to eq(nil) }
35
+ it { expect(change1_instance.attr3).to eq(nil) }
36
+
37
+ context 'when attr2 is set' do
38
+ let(:change2_instance) { change1_instance.attr2('B') }
39
+
40
+ it { expect(change2_instance).to be_a(change1_instance.class) }
41
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
42
+ it { expect(change2_instance.attr1).to eq('A') }
43
+ it { expect(change2_instance.attr2).to eq('B_FILTERED') }
44
+ it { expect(change2_instance.attr3).to eq(nil) }
45
+ end
46
+
47
+ context 'when attr3 is set' do
48
+ let(:change2_instance) { change1_instance.attr3('C') }
49
+
50
+ it { expect(change2_instance).to be_a(change1_instance.class) }
51
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
52
+ it { expect(change2_instance.attr1).to eq('A') }
53
+ it { expect(change2_instance.attr2).to eq(nil) }
54
+ it { expect(change2_instance.attr3).to eq('C') }
55
+ end
56
+ end
57
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable'
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
4
 
5
- ::RSpec.describe ::EacRubyUtils::Immutable::HashAccessor do
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::HashAccessor do
6
6
  let(:stub_class) do
7
7
  ::Class.new do
8
- include ::EacRubyUtils::Immutable
8
+ include ::EacRubyUtils::ActsAsImmutable
9
9
 
10
10
  immutable_accessor :the_hash, type: :hash
11
11
  end