striuct 0.6.1 → 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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +19 -39
  4. data/lib/striuct.rb +3 -3
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +15 -13
  7. data/lib/striuct/classmethods/attributes.rb +94 -92
  8. data/lib/striuct/classmethods/conflict_management.rb +109 -106
  9. data/lib/striuct/classmethods/constructor.rb +47 -54
  10. data/lib/striuct/classmethods/copy.rb +45 -43
  11. data/lib/striuct/classmethods/default.rb +23 -21
  12. data/lib/striuct/classmethods/enum.rb +46 -44
  13. data/lib/striuct/classmethods/fix.rb +23 -21
  14. data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
  15. data/lib/striuct/classmethods/inner.rb +57 -55
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +110 -106
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -129
  20. data/lib/striuct/classmethods/requirements.rb +3 -1
  21. data/lib/striuct/classmethods/to_struct.rb +21 -18
  22. data/lib/striuct/classmethods/validation.rb +15 -13
  23. data/lib/striuct/instancemethods/README.md +2 -2
  24. data/lib/striuct/instancemethods/assign.rb +29 -27
  25. data/lib/striuct/instancemethods/cast.rb +28 -26
  26. data/lib/striuct/instancemethods/compare.rb +26 -24
  27. data/lib/striuct/instancemethods/default.rb +31 -29
  28. data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
  29. data/lib/striuct/instancemethods/enum.rb +86 -84
  30. data/lib/striuct/instancemethods/getter.rb +39 -37
  31. data/lib/striuct/instancemethods/hashy.rb +99 -97
  32. data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
  33. data/lib/striuct/instancemethods/lock.rb +46 -44
  34. data/lib/striuct/instancemethods/object.rb +50 -48
  35. data/lib/striuct/instancemethods/requirements.rb +11 -9
  36. data/lib/striuct/instancemethods/safety.rb +11 -9
  37. data/lib/striuct/instancemethods/setter.rb +46 -45
  38. data/lib/striuct/instancemethods/to_s.rb +39 -37
  39. data/lib/striuct/instancemethods/validation.rb +31 -29
  40. data/lib/striuct/instancemethods/values.rb +50 -48
  41. data/lib/striuct/requirements.rb +3 -1
  42. data/lib/striuct/singleton_class.rb +12 -17
  43. data/lib/striuct/structs.rb +3 -3
  44. metadata +33 -178
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -17
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/MIT-LICENSE +0 -22
  50. data/Rakefile +0 -11
  51. data/benchmark/basics.rb +0 -56
  52. data/example/README.rb +0 -50
  53. data/example/example1.rb +0 -195
  54. data/example/example2.rb +0 -20
  55. data/example/see_trace.rb +0 -32
  56. data/striuct.gemspec +0 -45
  57. data/test/helper.rb +0 -3
  58. data/test/test_sglc-constructor.rb +0 -36
  59. data/test/test_subc-c-add_members.rb +0 -13
  60. data/test/test_subc-c-close_member.rb +0 -36
  61. data/test/test_subc-c-constructor.rb +0 -92
  62. data/test/test_subc-c-copy.rb +0 -71
  63. data/test/test_subc-c-freeze.rb +0 -36
  64. data/test/test_subc-c-inheritable.rb +0 -58
  65. data/test/test_subc-c-safety_naming.rb +0 -73
  66. data/test/test_subc-f-alias_member.rb +0 -54
  67. data/test/test_subc-f-enum.rb +0 -159
  68. data/test/test_subc-f-predicate.rb +0 -647
  69. data/test/test_subc-f-to_struct.rb +0 -61
  70. data/test/test_subc-f-validation_util.rb +0 -59
  71. data/test/test_subc-f_debug.rb +0 -39
  72. data/test/test_subc-f_name.rb +0 -525
  73. data/test/test_subc-i-accessor.rb +0 -138
  74. data/test/test_subc-i-adjuster.rb +0 -95
  75. data/test/test_subc-i-assign.rb +0 -53
  76. data/test/test_subc-i-basic.rb +0 -43
  77. data/test/test_subc-i-cast.rb +0 -27
  78. data/test/test_subc-i-compare.rb +0 -52
  79. data/test/test_subc-i-copy.rb +0 -23
  80. data/test/test_subc-i-default_value.rb +0 -129
  81. data/test/test_subc-i-freeze.rb +0 -19
  82. data/test/test_subc-i-hashlike.rb +0 -144
  83. data/test/test_subc-i-keyvalidatable.rb +0 -25
  84. data/test/test_subc-i-lock.rb +0 -40
  85. data/test/test_subc-i-must.rb +0 -30
  86. data/test/test_subc-i-to_s_family.rb +0 -26
  87. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  88. data/test/test_subc-i-validation_with_getter.rb +0 -33
  89. 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; module ClassMethods
5
+ class Striuct
6
+ module ClassMethods
7
+ # @group Constructor
5
8
 
6
- # @group Constructor
7
-
8
- # @return [Striuct]
9
- def for_values(*values)
10
- new_instance(*values)
11
- end
9
+ # @return [Striuct]
10
+ def for_values(*values)
11
+ new_instance(*values)
12
+ end
12
13
 
13
- alias_method :new, :for_values
14
+ alias_method :new, :for_values
14
15
 
15
- # @param [Hash, Struct, Striuct, #each_pair] pairs
16
- # @return [Striuct]
17
- def for_pairs(pairs)
18
- raise TypeError, 'no pairs object' unless pairs.respond_to?(:each_pair)
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
- instance = allocate
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
- alias_method :[], :for_pairs
23
+ instance = allocate
24
+ instance.__send__(:initialize_for_pairs, pairs)
25
+ instance
26
+ end
28
27
 
29
- # @return [Class]
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
- # for build the fixed object
36
- # @param [Hash] options
37
- # @option options [Boolean] :lock
38
- # @option options [Boolean] :strict
39
- # @yieldparam [Striuct] instance
40
- # @yieldreturn [Striuct] instance
41
- # @return [void]
42
- def define(options={})
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
- instance.lock_all if opts.lock
61
- }
62
- end
39
+ new.tap { |instance|
40
+ yield instance
63
41
 
64
- # @endgroup
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
- end; end
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
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Basic Methods for Ruby's Object
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Basic Methods for Ruby's Object
4
6
 
5
- # @return [Class]
6
- def clone
7
- ret = super
8
- ret.__send__ :close_member if closed?
9
- ret
10
- end
7
+ # @return [Class]
8
+ def clone
9
+ ret = super
10
+ ret.__send__(:close_member) if closed?
11
+ ret
12
+ end
11
13
 
12
- # @return [Class]
13
- def dup
14
- copy_variables! super
15
- end
14
+ # @return [Class]
15
+ def dup
16
+ copy_variables!(super)
17
+ end
16
18
 
17
- private
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
- # @return [familar_class]
34
- def copy_variables!(familar_class)
35
- autonyms = @autonyms.dup
36
- aliases = @aliases.dup
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
- familar_class
48
- end
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
- # @endgroup
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
- end; end
52
+ # @endgroup
53
+ end
54
+ end
@@ -1,24 +1,26 @@
1
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group With default value
4
-
5
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
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
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
14
- # @return [Symbol] :value / :proc
15
- def default_type_for(key)
16
- autonym = autonym_for_key key
17
- raise KeyError unless with_default? autonym
18
-
19
- _attributes_for(autonym).default_type
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
- end; end
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
- class Striuct; module ClassMethods
2
-
3
- # @group Enumerative
4
-
5
- # @yield [autonym]
6
- # @yieldparam [Symbol] autonym - sequential under defined
7
- # @yieldreturn [Class] self
8
- # @return [Enumerator]
9
- def each_autonym
10
- return to_enum(__callee__) { size } unless block_given?
11
-
12
- @autonyms.each{|autonym|yield autonym}
13
- self
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__) { size } 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__) { size } 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
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Fix inner data structures
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Fix inner data structures
4
6
 
5
- # @return [self]
6
- def freeze
7
- [@autonyms, @attributes, @aliases].each(&:freeze)
8
- super
9
- end
7
+ # @return [self]
8
+ def freeze
9
+ [@autonyms, @attributes, @aliases].each(&:freeze)
10
+ super
11
+ end
10
12
 
11
- def closed?
12
- [@autonyms, @attributes, @aliases].any?(&:frozen?)
13
- end
13
+ def closed?
14
+ [@autonyms, @attributes, @aliases].any?(&:frozen?)
15
+ end
14
16
 
15
- private
17
+ private
16
18
 
17
- # @return [self]
18
- def close_member
19
- [@autonyms, @attributes, @aliases].each(&:freeze)
20
- self
21
- end
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
- # @endgroup
25
+ alias_method :fix_structural, :close_member
26
+ alias_method :close, :close_member
27
27
 
28
- end; end
28
+ # @endgroup
29
+ end
30
+ end
@@ -1,19 +1,19 @@
1
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- module HashDeepDupulicatable
4
-
5
- # @return [Hash]
6
- def deep_dup
7
- dup.tap {|h|
8
- each_pair do |key, value|
9
- h[key] = value.dup
10
- end
11
- h.extend HashDeepDupulicatable
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
 
17
+ private_constant :HashDeepDupulicatable
15
18
  end
16
-
17
- private_constant :HashDeepDupulicatable
18
-
19
- end; end
19
+ end
@@ -1,71 +1,73 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Inner Methods
4
-
5
- # for debug
6
- # @return [Hash]
7
- def attributes
8
- {
9
- autonyms: @autonyms.dup,
10
- aliases: @aliases.dup,
11
- conflict_management_level: @conflict_management_level,
12
- attributes_each_autonym: @attributes.dup
13
- }
14
- end
15
-
16
- private
1
+ # frozen_string_literal: true
17
2
 
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
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Inner Methods
24
6
 
25
- def _add_autonym(autonym)
26
- autonym = autonym.to_sym
27
- raise NameError, 'already defined' if member? autonym
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
- @attributes[autonym] = Attributes.new
30
- @autonyms << autonym
31
- end
18
+ private
32
19
 
33
- def _attributes_for(autonym)
34
- @attributes.fetch autonym
35
- end
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
- def _check_frozen
38
- raise "can't modify frozen Class" if frozen?
39
- end
27
+ def _add_autonym(autonym)
28
+ autonym = autonym.to_sym
29
+ raise NameError, 'already defined' if member?(autonym)
40
30
 
41
- def _check_closed
42
- raise "can't modify closed member attributes in #{self}" if closed?
43
- end
31
+ @attributes[autonym] = Attributes.new
32
+ @autonyms << autonym
33
+ end
44
34
 
45
- def _def_getter(autonym)
46
- define_method autonym do
47
- _get autonym
35
+ def _attributes_for(autonym)
36
+ @attributes.fetch(autonym)
48
37
  end
49
-
50
- nil
51
- end
52
38
 
53
- def _def_setter(autonym, condition, &adjuster)
54
- unless ANYTHING.equal? condition
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
- if block_given?
59
- _attributes_for(autonym).adjuster = adjuster
43
+ def _check_closed
44
+ raise "can't modify closed member attributes in #{self}" if closed?
60
45
  end
61
46
 
62
- define_method :"#{autonym}=" do |value|
63
- _set autonym, value
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
- # @endgroup
55
+ def _def_setter(autonym, condition, &adjuster)
56
+ unless ANYTHING.equal?(condition)
57
+ _attributes_for(autonym).condition = condition
58
+ end
59
+
60
+ if adjuster
61
+ _attributes_for(autonym).adjuster = adjuster
62
+ end
70
63
 
71
- end; end
64
+ define_method(:"#{autonym}=") do |value|
65
+ _set(autonym, value)
66
+ end
67
+
68
+ nil
69
+ end
70
+
71
+ # @endgroup
72
+ end
73
+ end