striuct 0.4.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE.txt +21 -0
- data/README.md +20 -41
- data/lib/striuct.rb +3 -3
- data/lib/striuct/classmethods/README.md +2 -2
- data/lib/striuct/classmethods/adjustment.rb +15 -13
- data/lib/striuct/classmethods/attributes.rb +93 -91
- data/lib/striuct/classmethods/conflict_management.rb +109 -106
- data/lib/striuct/classmethods/constructor.rb +47 -54
- data/lib/striuct/classmethods/copy.rb +45 -43
- data/lib/striuct/classmethods/default.rb +23 -21
- data/lib/striuct/classmethods/enum.rb +46 -44
- data/lib/striuct/classmethods/fix.rb +23 -21
- data/lib/striuct/classmethods/hashdeepdupulicatable.rb +14 -16
- data/lib/striuct/classmethods/inner.rb +57 -64
- data/lib/striuct/classmethods/length.rb +12 -10
- data/lib/striuct/classmethods/macro.rb +109 -111
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -138
- data/lib/striuct/classmethods/requirements.rb +3 -1
- data/lib/striuct/classmethods/to_struct.rb +21 -18
- data/lib/striuct/classmethods/validation.rb +15 -13
- data/lib/striuct/instancemethods/README.md +2 -2
- data/lib/striuct/instancemethods/assign.rb +29 -27
- data/lib/striuct/instancemethods/cast.rb +28 -26
- data/lib/striuct/instancemethods/compare.rb +26 -24
- data/lib/striuct/instancemethods/default.rb +31 -29
- data/lib/striuct/instancemethods/delegate_class_methods.rb +36 -32
- data/lib/striuct/instancemethods/enum.rb +86 -84
- data/lib/striuct/instancemethods/getter.rb +39 -37
- data/lib/striuct/instancemethods/hashy.rb +99 -97
- data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
- data/lib/striuct/instancemethods/lock.rb +46 -44
- data/lib/striuct/instancemethods/object.rb +50 -48
- data/lib/striuct/instancemethods/requirements.rb +11 -9
- data/lib/striuct/instancemethods/safety.rb +11 -9
- data/lib/striuct/instancemethods/setter.rb +46 -49
- data/lib/striuct/instancemethods/to_s.rb +39 -37
- data/lib/striuct/instancemethods/validation.rb +31 -29
- data/lib/striuct/instancemethods/values.rb +52 -33
- data/lib/striuct/requirements.rb +3 -1
- data/lib/striuct/singleton_class.rb +12 -17
- data/lib/striuct/structs.rb +3 -3
- metadata +48 -186
- data/.gitignore +0 -35
- data/.travis.yml +0 -20
- data/.yardopts +0 -1
- data/Gemfile +0 -11
- data/History.old(~0.3.n).rdoc +0 -289
- data/MIT-LICENSE +0 -22
- data/Rakefile +0 -10
- data/benchmark/basics.rb +0 -56
- data/example/README.rb +0 -53
- data/example/example1.rb +0 -235
- data/example/example2.rb +0 -22
- data/example/see_trace.rb +0 -32
- data/striuct.gemspec +0 -36
- data/test/helper.rb +0 -5
- data/test/test_sglc-constructor.rb +0 -36
- data/test/test_subc-c-add_members.rb +0 -13
- data/test/test_subc-c-close_member.rb +0 -36
- data/test/test_subc-c-constructor.rb +0 -92
- data/test/test_subc-c-copy.rb +0 -71
- data/test/test_subc-c-freeze.rb +0 -36
- data/test/test_subc-c-inheritable.rb +0 -58
- data/test/test_subc-c-safety_naming.rb +0 -73
- data/test/test_subc-f-alias_member.rb +0 -54
- data/test/test_subc-f-enum.rb +0 -139
- data/test/test_subc-f-predicate.rb +0 -711
- data/test/test_subc-f-to_struct.rb +0 -61
- data/test/test_subc-f-validation_util.rb +0 -59
- data/test/test_subc-f_debug.rb +0 -39
- data/test/test_subc-f_name.rb +0 -525
- data/test/test_subc-i-accessor.rb +0 -138
- data/test/test_subc-i-adjuster.rb +0 -95
- data/test/test_subc-i-assign.rb +0 -53
- data/test/test_subc-i-basic.rb +0 -32
- data/test/test_subc-i-cast.rb +0 -27
- data/test/test_subc-i-compare.rb +0 -52
- data/test/test_subc-i-copy.rb +0 -23
- data/test/test_subc-i-default_value.rb +0 -129
- data/test/test_subc-i-freeze.rb +0 -19
- data/test/test_subc-i-hashlike.rb +0 -144
- data/test/test_subc-i-keyvalidatable.rb +0 -25
- data/test/test_subc-i-lock.rb +0 -40
- data/test/test_subc-i-must.rb +0 -30
- data/test/test_subc-i-to_s_family.rb +0 -26
- data/test/test_subc-i-validation_inference.rb +0 -51
- data/test/test_subc-i-validation_specific_conditions.rb +0 -297
- data/test/test_subc-i-validation_with_getter.rb +0 -33
- data/test/test_version.rb +0 -13
| @@ -1,66 +1,59 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'keyvalidatable'
         | 
| 2 | 
            -
            require 'optionalargument'
         | 
| 3 4 |  | 
| 4 | 
            -
            class Striuct | 
| 5 | 
            +
            class Striuct
         | 
| 6 | 
            +
              module ClassMethods
         | 
| 7 | 
            +
                # @group Constructor
         | 
| 5 8 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                new_instance(*values)
         | 
| 11 | 
            -
              end
         | 
| 9 | 
            +
                # @return [Striuct]
         | 
| 10 | 
            +
                def for_values(*values)
         | 
| 11 | 
            +
                  new_instance(*values)
         | 
| 12 | 
            +
                end
         | 
| 12 13 |  | 
| 13 | 
            -
             | 
| 14 | 
            +
                alias_method :new, :for_values
         | 
| 14 15 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                KeyValidatable.validate_array KeyValidatable.keys_for(pairs).map(&:to_sym),
         | 
| 20 | 
            -
                                              let: all_members
         | 
| 16 | 
            +
                # @param [Hash, Struct, Striuct, #each_pair] pairs
         | 
| 17 | 
            +
                # @return [Striuct]
         | 
| 18 | 
            +
                def for_pairs(pairs)
         | 
| 19 | 
            +
                  raise TypeError, 'no pairs object' unless pairs.respond_to?(:each_pair)
         | 
| 21 20 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
                instance.__send__ :initialize_for_pairs, pairs
         | 
| 24 | 
            -
                instance
         | 
| 25 | 
            -
              end
         | 
| 21 | 
            +
                  KeyValidatable.validate_array(KeyValidatable.keys_for(pairs).map(&:to_sym), let: all_members)
         | 
| 26 22 |  | 
| 27 | 
            -
             | 
| 23 | 
            +
                  instance = allocate
         | 
| 24 | 
            +
                  instance.__send__(:initialize_for_pairs, pairs)
         | 
| 25 | 
            +
                  instance
         | 
| 26 | 
            +
                end
         | 
| 28 27 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
              DEFINE_OptArg = OptionalArgument.define {
         | 
| 31 | 
            -
                opt :lock, default: true, condition: BOOLEAN?
         | 
| 32 | 
            -
                opt :strict, default: true, condition: BOOLEAN?
         | 
| 33 | 
            -
              }
         | 
| 28 | 
            +
                alias_method :[], :for_pairs
         | 
| 34 29 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                raise ArgumentError, 'must with block' unless block_given?
         | 
| 44 | 
            -
                opts = DEFINE_OptArg.parse options
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                new.tap {|instance|
         | 
| 47 | 
            -
                  yield instance
         | 
| 48 | 
            -
              
         | 
| 49 | 
            -
                  yets = autonyms.select{|autonym|! instance.assigned?(autonym)}
         | 
| 50 | 
            -
                  unless yets.empty?
         | 
| 51 | 
            -
                    raise "not assigned members are, yet '#{yets.inspect} in #{self}'"
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
                  
         | 
| 54 | 
            -
                  invalids = autonyms.select{|autonym|! instance.valid?(autonym)}
         | 
| 55 | 
            -
                  if opts.strict && !invalids.empty?
         | 
| 56 | 
            -
                    raise Validation::InvalidWritingError,
         | 
| 57 | 
            -
                           "invalids members are, yet '#{invalids.inspect} in #{self}'"
         | 
| 58 | 
            -
                  end
         | 
| 30 | 
            +
                # for build the fixed object
         | 
| 31 | 
            +
                # @param [Boolean] lock
         | 
| 32 | 
            +
                # @param [Boolean] strict
         | 
| 33 | 
            +
                # @yieldparam [Striuct] instance
         | 
| 34 | 
            +
                # @yieldreturn [Striuct] instance
         | 
| 35 | 
            +
                # @return [void]
         | 
| 36 | 
            +
                def define(lock: true, strict: true)
         | 
| 37 | 
            +
                  raise ArgumentError, 'must with block' unless block_given?
         | 
| 59 38 |  | 
| 60 | 
            -
                   | 
| 61 | 
            -
             | 
| 62 | 
            -
              end
         | 
| 39 | 
            +
                  new.tap { |instance|
         | 
| 40 | 
            +
                    yield instance
         | 
| 63 41 |  | 
| 64 | 
            -
             | 
| 42 | 
            +
                    yets = autonyms.select { |autonym| !instance.assigned?(autonym) }
         | 
| 43 | 
            +
                    unless yets.empty?
         | 
| 44 | 
            +
                      raise "not assigned members are, yet '#{yets.inspect} in #{self}'"
         | 
| 45 | 
            +
                    end
         | 
| 65 46 |  | 
| 66 | 
            -
             | 
| 47 | 
            +
                    invalids = autonyms.select { |autonym| !instance.valid?(autonym) }
         | 
| 48 | 
            +
                    if strict && !invalids.empty?
         | 
| 49 | 
            +
                      raise Validation::InvalidWritingError,
         | 
| 50 | 
            +
                            "invalids members are, yet '#{invalids.inspect} in #{self}'"
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    instance.lock_all if lock
         | 
| 54 | 
            +
                  }
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                # @endgroup
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| @@ -1,52 +1,54 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                # @group Basic Methods for Ruby's Object
         | 
| 4 6 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 7 | 
            +
                # @return [Class]
         | 
| 8 | 
            +
                def clone
         | 
| 9 | 
            +
                  ret = super
         | 
| 10 | 
            +
                  ret.__send__(:close_member) if closed?
         | 
| 11 | 
            +
                  ret
         | 
| 12 | 
            +
                end
         | 
| 11 13 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 14 | 
            +
                # @return [Class]
         | 
| 15 | 
            +
                def dup
         | 
| 16 | 
            +
                  copy_variables!(super)
         | 
| 17 | 
            +
                end
         | 
| 16 18 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
              
         | 
| 19 | 
            -
              def inherited(subclass)
         | 
| 20 | 
            -
                ret = super subclass
         | 
| 21 | 
            -
                copy_variables! subclass
         | 
| 22 | 
            -
                ret
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
                 
         | 
| 25 | 
            -
              def initialize_copy(original)
         | 
| 26 | 
            -
                ret = super original
         | 
| 27 | 
            -
                @autonyms = @autonyms.dup
         | 
| 28 | 
            -
                @aliases = @aliases.dup
         | 
| 29 | 
            -
                @attributes = @attributes.deep_dup
         | 
| 30 | 
            -
                ret
         | 
| 31 | 
            -
              end
         | 
| 19 | 
            +
                private
         | 
| 32 20 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                attributes = @attributes.deep_dup
         | 
| 38 | 
            -
                conflict_management = @conflict_management_level
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                familar_class.class_eval do      
         | 
| 41 | 
            -
                  @autonyms = autonyms
         | 
| 42 | 
            -
                  @aliases = aliases
         | 
| 43 | 
            -
                  @attributes = attributes
         | 
| 44 | 
            -
                  @conflict_management_level = conflict_management
         | 
| 21 | 
            +
                def inherited(subclass)
         | 
| 22 | 
            +
                  ret = super(subclass)
         | 
| 23 | 
            +
                  copy_variables!(subclass)
         | 
| 24 | 
            +
                  ret
         | 
| 45 25 | 
             
                end
         | 
| 46 26 |  | 
| 47 | 
            -
                 | 
| 48 | 
            -
             | 
| 27 | 
            +
                def initialize_copy(original)
         | 
| 28 | 
            +
                  ret = super(original)
         | 
| 29 | 
            +
                  @autonyms = @autonyms.dup
         | 
| 30 | 
            +
                  @aliases = @aliases.dup
         | 
| 31 | 
            +
                  @attributes = @attributes.deep_dup
         | 
| 32 | 
            +
                  ret
         | 
| 33 | 
            +
                end
         | 
| 49 34 |  | 
| 50 | 
            -
             | 
| 35 | 
            +
                # @return [familiar_class]
         | 
| 36 | 
            +
                def copy_variables!(familiar_class)
         | 
| 37 | 
            +
                  autonyms = @autonyms.dup
         | 
| 38 | 
            +
                  aliases  = @aliases.dup
         | 
| 39 | 
            +
                  attributes = @attributes.deep_dup
         | 
| 40 | 
            +
                  conflict_management = @conflict_management_level
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  familiar_class.class_eval do
         | 
| 43 | 
            +
                    @autonyms = autonyms
         | 
| 44 | 
            +
                    @aliases = aliases
         | 
| 45 | 
            +
                    @attributes = attributes
         | 
| 46 | 
            +
                    @conflict_management_level = conflict_management
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  familiar_class
         | 
| 50 | 
            +
                end
         | 
| 51 51 |  | 
| 52 | 
            -
             | 
| 52 | 
            +
                # @endgroup
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -1,24 +1,26 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
              def default_value_for(key)
         | 
| 7 | 
            -
                autonym = autonym_for_key key
         | 
| 8 | 
            -
                raise KeyError unless with_default? autonym
         | 
| 9 | 
            -
             
         | 
| 10 | 
            -
                _attributes_for(autonym).default_value
         | 
| 11 | 
            -
              end
         | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                # @group With default value
         | 
| 12 6 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                 | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
              
         | 
| 22 | 
            -
              # @endgroup
         | 
| 7 | 
            +
                # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
         | 
| 8 | 
            +
                def default_value_for(key)
         | 
| 9 | 
            +
                  autonym = autonym_for_key(key)
         | 
| 10 | 
            +
                  raise KeyError unless with_default?(autonym)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  _attributes_for(autonym).default_value
         | 
| 13 | 
            +
                end
         | 
| 23 14 |  | 
| 24 | 
            -
             | 
| 15 | 
            +
                # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
         | 
| 16 | 
            +
                # @return [Symbol] :value / :proc
         | 
| 17 | 
            +
                def default_type_for(key)
         | 
| 18 | 
            +
                  autonym = autonym_for_key(key)
         | 
| 19 | 
            +
                  raise KeyError unless with_default?(autonym)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  _attributes_for(autonym).default_type
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # @endgroup
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| @@ -1,45 +1,47 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                return  | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                # @group Enumerative
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # @yield [autonym]
         | 
| 8 | 
            +
                # @yieldparam [Symbol] autonym - sequential under defined
         | 
| 9 | 
            +
                # @yieldreturn [Class] self
         | 
| 10 | 
            +
                # @return [Enumerator]
         | 
| 11 | 
            +
                def each_autonym
         | 
| 12 | 
            +
                  return to_enum(__callee__) { size } unless block_given?
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  @autonyms.each { |autonym| yield autonym }
         | 
| 15 | 
            +
                  self
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                alias_method :each_member, :each_autonym
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # @yield [index]
         | 
| 21 | 
            +
                # @yieldparam [Integer] Index
         | 
| 22 | 
            +
                # @yieldreturn [Class] self
         | 
| 23 | 
            +
                # @return [Enumerator]
         | 
| 24 | 
            +
                def each_index
         | 
| 25 | 
            +
                  return to_enum(__callee__) { size } unless block_given?
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  @autonyms.each_index { |index| yield index }
         | 
| 28 | 
            +
                  self
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                # @yield [autonym, index]
         | 
| 32 | 
            +
                # @yieldparam [Symbol] autonym
         | 
| 33 | 
            +
                # @yieldparam [Integer] index
         | 
| 34 | 
            +
                # @yieldreturn [Class] self
         | 
| 35 | 
            +
                # @return [Enumerator]
         | 
| 36 | 
            +
                def each_autonym_with_index
         | 
| 37 | 
            +
                  return to_enum(__callee__) { size } unless block_given?
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  @autonyms.each_with_index { |autonym, index| yield autonym, index }
         | 
| 40 | 
            +
                  self
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                alias_method :each_member_with_index, :each_autonym_with_index
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # @endgroup
         | 
| 14 46 | 
             
              end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              alias_method :each_member, :each_autonym
         | 
| 17 | 
            -
              
         | 
| 18 | 
            -
              # @yield [index] 
         | 
| 19 | 
            -
              # @yieldparam [Integer] Index
         | 
| 20 | 
            -
              # @yieldreturn [Class] self
         | 
| 21 | 
            -
              # @return [Enumerator]
         | 
| 22 | 
            -
              def each_index
         | 
| 23 | 
            -
                return to_enum(__callee__) unless block_given?
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                @autonyms.each_index{|index|yield index}
         | 
| 26 | 
            -
                self
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              # @yield [autonym, index]
         | 
| 30 | 
            -
              # @yieldparam [Symbol] autonym
         | 
| 31 | 
            -
              # @yieldparam [Integer] index
         | 
| 32 | 
            -
              # @yieldreturn [Class] self
         | 
| 33 | 
            -
              # @return [Enumerator]
         | 
| 34 | 
            -
              def each_autonym_with_index
         | 
| 35 | 
            -
                return to_enum(__callee__) unless block_given?
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                @autonyms.each_with_index{|autonym, index|yield autonym, index}
         | 
| 38 | 
            -
                self
         | 
| 39 | 
            -
              end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
              alias_method :each_member_with_index, :each_autonym_with_index
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              # @endgroup
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            end; end
         | 
| 47 | 
            +
            end
         | 
| @@ -1,28 +1,30 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                # @group Fix inner data structures
         | 
| 4 6 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 7 | 
            +
                # @return [self]
         | 
| 8 | 
            +
                def freeze
         | 
| 9 | 
            +
                  [@autonyms, @attributes, @aliases].each(&:freeze)
         | 
| 10 | 
            +
                  super
         | 
| 11 | 
            +
                end
         | 
| 10 12 |  | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 13 | 
            +
                def closed?
         | 
| 14 | 
            +
                  [@autonyms, @attributes, @aliases].any?(&:frozen?)
         | 
| 15 | 
            +
                end
         | 
| 14 16 |  | 
| 15 | 
            -
             | 
| 17 | 
            +
                private
         | 
| 16 18 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
              
         | 
| 23 | 
            -
              alias_method :fix_structural, :close_member
         | 
| 24 | 
            -
              alias_method :close, :close_member
         | 
| 19 | 
            +
                # @return [self]
         | 
| 20 | 
            +
                def close_member
         | 
| 21 | 
            +
                  [@autonyms, @attributes, @aliases].each(&:freeze)
         | 
| 22 | 
            +
                  self
         | 
| 23 | 
            +
                end
         | 
| 25 24 |  | 
| 26 | 
            -
             | 
| 25 | 
            +
                alias_method :fix_structural, :close_member
         | 
| 26 | 
            +
                alias_method :close, :close_member
         | 
| 27 27 |  | 
| 28 | 
            -
             | 
| 28 | 
            +
                # @endgroup
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -1,21 +1,19 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 7 | 
            -
                   | 
| 8 | 
            -
                     | 
| 9 | 
            -
                       | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                module HashDeepDupulicatable
         | 
| 6 | 
            +
                  # @return [Hash]
         | 
| 7 | 
            +
                  def deep_dup
         | 
| 8 | 
            +
                    dup.tap { |h|
         | 
| 9 | 
            +
                      each_pair do |key, value|
         | 
| 10 | 
            +
                        h[key] = value.dup
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                      h.extend HashDeepDupulicatable
         | 
| 13 | 
            +
                    }
         | 
| 14 | 
            +
                  end
         | 
| 13 15 | 
             
                end
         | 
| 14 16 |  | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              if respond_to? :private_constant
         | 
| 18 17 | 
             
                private_constant :HashDeepDupulicatable
         | 
| 19 18 | 
             
              end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            end; end
         | 
| 19 | 
            +
            end
         | 
| @@ -1,80 +1,73 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                   | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
              def _init
         | 
| 19 | 
            -
                @autonyms      = []
         | 
| 20 | 
            -
                @attributes    = {}.extend HashDeepDupulicatable # autonym => Attributes
         | 
| 21 | 
            -
                @aliases       = {} # aliased => autonym
         | 
| 22 | 
            -
                @conflict_management_level = DEFAULT_CONFLICT_MANAGEMENT_LEVEL
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              def _add_autonym(autonym)
         | 
| 26 | 
            -
                autonym = autonym.to_sym
         | 
| 27 | 
            -
                raise NameError, 'already defined' if member? autonym
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Striuct
         | 
| 4 | 
            +
              module ClassMethods
         | 
| 5 | 
            +
                # @group Inner Methods
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # for debug
         | 
| 8 | 
            +
                # @return [Hash]
         | 
| 9 | 
            +
                def attributes
         | 
| 10 | 
            +
                  {
         | 
| 11 | 
            +
                    autonyms: @autonyms.dup,
         | 
| 12 | 
            +
                    aliases: @aliases.dup,
         | 
| 13 | 
            +
                    conflict_management_level: @conflict_management_level,
         | 
| 14 | 
            +
                    attributes_each_autonym: @attributes.dup
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
                end
         | 
| 28 17 |  | 
| 29 | 
            -
                 | 
| 30 | 
            -
                @autonyms << autonym
         | 
| 31 | 
            -
              end
         | 
| 18 | 
            +
                private
         | 
| 32 19 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 20 | 
            +
                def _init
         | 
| 21 | 
            +
                  @autonyms      = []
         | 
| 22 | 
            +
                  @attributes    = {}.extend HashDeepDupulicatable # autonym => Attributes
         | 
| 23 | 
            +
                  @aliases       = {} # aliased => autonym
         | 
| 24 | 
            +
                  @conflict_management_level = DEFAULT_CONFLICT_MANAGEMENT_LEVEL
         | 
| 25 | 
            +
                end
         | 
| 36 26 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 27 | 
            +
                def _add_autonym(autonym)
         | 
| 28 | 
            +
                  autonym = autonym.to_sym
         | 
| 29 | 
            +
                  raise NameError, 'already defined' if member?(autonym)
         | 
| 40 30 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 31 | 
            +
                  @attributes[autonym] = Attributes.new
         | 
| 32 | 
            +
                  @autonyms << autonym
         | 
| 33 | 
            +
                end
         | 
| 44 34 |  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
                  _get autonym
         | 
| 35 | 
            +
                def _attributes_for(autonym)
         | 
| 36 | 
            +
                  @attributes.fetch(autonym)
         | 
| 48 37 | 
             
                end
         | 
| 49 | 
            -
                
         | 
| 50 | 
            -
                nil
         | 
| 51 | 
            -
              end
         | 
| 52 38 |  | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
                  _attributes_for(autonym).condition = condition
         | 
| 39 | 
            +
                def _check_frozen
         | 
| 40 | 
            +
                  raise "can't modify frozen Class" if frozen?
         | 
| 56 41 | 
             
                end
         | 
| 57 42 |  | 
| 58 | 
            -
                 | 
| 59 | 
            -
                   | 
| 43 | 
            +
                def _check_closed
         | 
| 44 | 
            +
                  raise "can't modify closed member attributes in #{self}" if closed?
         | 
| 60 45 | 
             
                end
         | 
| 61 46 |  | 
| 62 | 
            -
                 | 
| 63 | 
            -
                   | 
| 47 | 
            +
                def _def_getter(autonym)
         | 
| 48 | 
            +
                  define_method(autonym) do
         | 
| 49 | 
            +
                    _get(autonym)
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  nil
         | 
| 64 53 | 
             
                end
         | 
| 65 | 
            -
             
         | 
| 66 | 
            -
                nil
         | 
| 67 | 
            -
              end
         | 
| 68 54 |  | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 55 | 
            +
                def _def_setter(autonym, condition, &adjuster)
         | 
| 56 | 
            +
                  unless ANYTHING.equal?(condition)
         | 
| 57 | 
            +
                    _attributes_for(autonym).condition = condition
         | 
| 58 | 
            +
                  end
         | 
| 71 59 |  | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 60 | 
            +
                  if adjuster
         | 
| 61 | 
            +
                    _attributes_for(autonym).adjuster = adjuster
         | 
| 62 | 
            +
                  end
         | 
| 74 63 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 64 | 
            +
                  define_method(:"#{autonym}=") do |value|
         | 
| 65 | 
            +
                    _set(autonym, value)
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  nil
         | 
| 69 | 
            +
                end
         | 
| 79 70 |  | 
| 80 | 
            -
             | 
| 71 | 
            +
                # @endgroup
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         |