striuct 0.6.1 → 0.7.0

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