striuct 0.6.1 → 0.9.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 +44 -60
  4. data/lib/striuct/{requirements.rb → bootstrap.rb} +6 -2
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +77 -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 +55 -65
  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 +99 -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 +2 -2
  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/lock.rb +46 -44
  33. data/lib/striuct/instancemethods/object.rb +50 -48
  34. data/lib/striuct/instancemethods/requirements.rb +9 -13
  35. data/lib/striuct/instancemethods/safety.rb +11 -9
  36. data/lib/striuct/instancemethods/setter.rb +46 -45
  37. data/lib/striuct/instancemethods/to_s.rb +39 -37
  38. data/lib/striuct/instancemethods/validation.rb +46 -29
  39. data/lib/striuct/instancemethods/values.rb +50 -48
  40. data/lib/striuct/singleton_class.rb +25 -18
  41. data/lib/striuct/structs.rb +3 -3
  42. data/lib/striuct.rb +7 -3
  43. metadata +18 -209
  44. data/.gitignore +0 -35
  45. data/.travis.yml +0 -17
  46. data/.yardopts +0 -1
  47. data/Gemfile +0 -11
  48. data/MIT-LICENSE +0 -22
  49. data/Rakefile +0 -11
  50. data/benchmark/basics.rb +0 -56
  51. data/example/README.rb +0 -50
  52. data/example/example1.rb +0 -195
  53. data/example/example2.rb +0 -20
  54. data/example/see_trace.rb +0 -32
  55. data/lib/striuct/instancemethods/keyvalidatable.rb +0 -9
  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,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
@@ -1,14 +1,16 @@
1
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Length/Size
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Length/Size
4
6
 
5
- # @return [Integer]
6
- def length
7
- @autonyms.length
8
- end
9
-
10
- alias_method :size, :length
7
+ # @return [Integer]
8
+ def length
9
+ @autonyms.length
10
+ end
11
11
 
12
- # @endgroup
12
+ alias_method :size, :length
13
13
 
14
- end; end
14
+ # @endgroup
15
+ end
16
+ end
@@ -1,116 +1,109 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Macro for Member Definition
4
-
5
- ANYTHING = ::Validation::Condition::ANYTHING
6
-
7
- # @return [Class]
8
- ADD_MEMBER_OptArg = OptionalArgument.define {
9
- opt :default_value, aliases: [:default]
10
- opt :default_proc, aliases: [:lazy_default]
11
- conflict :default_value, :default_proc
12
- opt :must, default: false
13
- opt :setter_validation, aliases: [:writer_validation], default: true
14
- opt :getter_validation, aliases: [:reader_validation], default: false
15
- }
16
-
17
- private
18
-
19
- # @param [Symbol, String, #to_sym] autonym
20
- # @param [#===, Proc, Method, ANYTHING] condition
21
- # @param [Hash] options
22
- # @option options [BasicObject] :default
23
- # @option options [Proc] :default_proc
24
- # @option options [Boolean] :must
25
- # @option options [Boolean] :reader_validation
26
- # @option options [Boolean] :getter_validation
27
- # @option options [Boolean] :writer_validation
28
- # @option options [Boolean] :setter_validation
29
- # @return [nil]
30
- def add_member(autonym, condition=ANYTHING, options={}, &adjuster)
31
- _check_frozen
32
- _check_closed
33
-
34
- options = ADD_MEMBER_OptArg.parse options
35
- autonym = autonym.to_sym # First difinition for an autonym
36
-
37
- raise ArgumentError, %Q!already exist name "#{autonym}"! if member? autonym
38
- _check_safety_naming autonym
39
- _add_autonym autonym
40
-
41
- _attributes_for(autonym).safety_setter = !!options.setter_validation
42
- _attributes_for(autonym).safety_getter = !!options.getter_validation
43
-
44
- if options.must
45
- _attributes_for(autonym).must = true
1
+ # frozen_string_literal: true
2
+
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Macro for Member Definition
6
+
7
+ ANYTHING = Eqq.ANYTHING()
8
+
9
+ # @return [Class]
10
+
11
+ private
12
+
13
+ # @param [Symbol, String, #to_sym] autonym
14
+ # @param [#===, Proc, Method] pattern
15
+ # @param [Proc] default_proc
16
+ # @param [Boolean] must
17
+ # @param [Boolean] writer_validation
18
+ # @param [Boolean] reader_validation
19
+ # @return [void]
20
+ def add_member(autonym, pattern=ANYTHING, default_value: nil, default_proc: nil, must: false, writer_validation: true, reader_validation: false, &adjuster)
21
+ _check_frozen
22
+ _check_closed
23
+
24
+ raise ArgumentError if !default_value.nil? && default_proc
25
+
26
+ autonym = autonym.to_sym # First definition for an autonym
27
+
28
+ raise ArgumentError, %Q!already exist name "#{autonym}"! if member?(autonym)
29
+
30
+ _check_safety_naming(autonym)
31
+ _add_autonym(autonym)
32
+
33
+ _attributes_for(autonym).safety_setter = writer_validation
34
+ _attributes_for(autonym).safety_getter = reader_validation
35
+
36
+ if must
37
+ _attributes_for(autonym).must = true
38
+ end
39
+
40
+ _def_getter(autonym)
41
+ _def_setter(autonym, pattern, &adjuster)
42
+
43
+ case
44
+ when !default_value.nil?
45
+ set_default_value(autonym, default_value)
46
+ when default_proc
47
+ set_default_value(autonym, &default_proc)
48
+ end
49
+
50
+ nil
46
51
  end
47
52
 
48
- _def_getter autonym
49
- _def_setter autonym, condition, &adjuster
50
-
51
- case
52
- when options.default_value?
53
- set_default_value autonym, options.default_value
54
- when options.default_proc?
55
- set_default_value autonym, &options.default_proc
53
+ alias_method :member, :add_member
54
+
55
+ # @param [Symbol, String, #to_sym] autonym
56
+ # @param [Symbol, String, #to_sym] autonyms
57
+ # @return [nil]
58
+ def add_members(autonym, *autonyms)
59
+ _check_frozen
60
+ _check_closed
61
+
62
+ [autonym, *autonyms].each { |name| add_member(name) }
63
+ nil
56
64
  end
57
-
58
- nil
59
- end
60
65
 
61
- alias_method :member, :add_member
62
-
63
- # @param [Symbol, String, #to_sym] autonym
64
- # @param [Symbol, String, #to_sym] autonyms
65
- # @return [nil]
66
- def add_members(autonym, *autonyms)
67
- _check_frozen
68
- _check_closed
69
-
70
- [autonym, *autonyms].each {|_autonym|add_member _autonym}
71
- nil
72
- end
66
+ # @param [Symbol, String, #to_sym] aliased
67
+ # @param [Symbol, String, #to_sym] autonym
68
+ # @return [nil]
69
+ def alias_member(aliased, autonym)
70
+ _check_frozen
71
+ _check_closed
72
+ autonym = autonym_for_member(autonym)
73
+ aliased = aliased.to_sym
74
+ raise ArgumentError, %Q!already exist name "#{aliased}"! if member?(aliased)
75
+
76
+ _check_safety_naming(aliased)
77
+
78
+ alias_method(aliased, autonym)
79
+ alias_method(:"#{aliased}=", :"#{autonym}=")
80
+ @aliases[aliased] = autonym
81
+ nil
82
+ end
73
83
 
74
- # @param [Symbol, String, #to_sym] aliased
75
- # @param [Symbol, String, #to_sym] autonym
76
- # @return [nil]
77
- def alias_member(aliased, autonym)
78
- _check_frozen
79
- _check_closed
80
- autonym = autonym_for_member autonym
81
- aliased = aliased.to_sym
82
- raise ArgumentError, %Q!already exist name "#{aliased}"! if member? aliased
83
- _check_safety_naming aliased
84
-
85
- alias_method aliased, autonym
86
- alias_method :"#{aliased}=", :"#{autonym}="
87
- @aliases[aliased] = autonym
88
- nil
89
- end
90
-
91
- # @param [Symbol, String, #to_sym] name
92
- # @return [nil]
93
- def set_default_value(name, value=nil, &block)
94
- _check_frozen
95
- _check_closed
96
- autonym = autonym_for_member name
97
- raise "already settled default value for #{name}" if with_default? autonym
98
-
99
- if block_given?
100
- unless value.nil?
101
- raise ArgumentError, 'can not use default-value with default-proc'
84
+ # @param [Symbol, String, #to_sym] name
85
+ # @return [nil]
86
+ def set_default_value(name, value=nil, &block)
87
+ _check_frozen
88
+ _check_closed
89
+ autonym = autonym_for_member(name)
90
+ raise "already settled default value for #{name}" if with_default?(autonym)
91
+
92
+ if block
93
+ unless value.nil?
94
+ raise ArgumentError, 'can not use default-value with default-proc'
95
+ end
96
+
97
+ _attributes_for(autonym).set_default(block, :lazy)
98
+ else
99
+ _attributes_for(autonym).set_default(value, :value)
102
100
  end
103
101
 
104
- _attributes_for(autonym).set_default block, :lazy
105
- else
106
- _attributes_for(autonym).set_default value, :value
102
+ nil
107
103
  end
108
-
109
- nil
110
- end
111
-
112
- alias_method :default, :set_default_value
113
104
 
114
- # @endgroup
105
+ alias_method :default, :set_default_value
115
106
 
116
- end; end
107
+ # @endgroup
108
+ end
109
+ end
@@ -1,75 +1,79 @@
1
- class Striuct; module ClassMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Named
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Named
4
6
 
5
- # @return [Array<Symbol>]
6
- def autonyms
7
- @autonyms.dup
8
- end
7
+ # @return [Array<Symbol>]
8
+ def autonyms
9
+ @autonyms.dup
10
+ end
9
11
 
10
- alias_method :members, :autonyms
11
-
12
- # @return [Array<Symbol>]
13
- def all_members
14
- @autonyms + @aliases.keys
15
- end
16
-
17
- # @param [Symbol, String, #to_sym] als
18
- # @return [Symbol]
19
- def autonym_for_alias(als)
20
- @aliases.fetch als.to_sym
21
- rescue NoMethodError
22
- raise TypeError
23
- rescue KeyError
24
- raise NameError
25
- end
12
+ alias_method :members, :autonyms
26
13
 
27
- # @param [Symbol, String, #to_sym] name - autonym / aliased
28
- # @return [Symbol]
29
- def autonym_for_member(name)
30
- raise TypeError unless name.respond_to? :to_sym
31
- name = name.to_sym
32
-
33
- @autonyms.include?(name) ? name : autonym_for_alias(name)
34
- end
14
+ # @return [Array<Symbol>]
15
+ def all_members
16
+ @autonyms + @aliases.keys
17
+ end
35
18
 
36
- # @param [Index, #to_int] index
37
- # @return [Symbol] autonym
38
- def autonym_for_index(index)
39
- @autonyms.fetch index
40
- end
19
+ # @param [Symbol, String, #to_sym] als
20
+ # @return [Symbol]
21
+ def autonym_for_alias(als)
22
+ @aliases.fetch(als.to_sym)
23
+ rescue NoMethodError
24
+ raise TypeError
25
+ rescue KeyError
26
+ raise NameError
27
+ end
41
28
 
42
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
43
- # @return [Symbol] autonym
44
- def autonym_for_key(key)
45
- key.respond_to?(:to_sym) ? autonym_for_member(key) : autonym_for_index(key)
46
- rescue NameError, IndexError, TypeError
47
- raise KeyError
48
- end
29
+ # @param [Symbol, String, #to_sym] name - autonym / aliased
30
+ # @return [Symbol]
31
+ def autonym_for_member(name)
32
+ raise TypeError unless name.respond_to?(:to_sym)
49
33
 
50
- # @param [Symbol, String, #to_sym] autonym
51
- # @return [Array<Symbol>]
52
- def aliases_for_autonym(autonym)
53
- raise TypeError unless autonym.respond_to?(:to_sym)
54
- autonym = autonym.to_sym
55
- raise NameError unless with_aliases? autonym
34
+ name = name.to_sym
56
35
 
57
- @aliases.select{|als, aut|autonym == aut}.keys
58
- end
59
-
60
- # @return [Hash] alias => autonym
61
- def aliases
62
- @aliases.dup
63
- end
64
-
65
- private
36
+ @autonyms.include?(name) ? name : autonym_for_alias(name)
37
+ end
66
38
 
67
- # for direct access inner data from own instance
68
- # @return [Hash] alias => autonym
69
- def _autonyms
70
- @autonyms
71
- end
72
-
73
- # @endgroup
39
+ # @param [Index, #to_int] index
40
+ # @return [Symbol] autonym
41
+ def autonym_for_index(index)
42
+ @autonyms.fetch(index)
43
+ end
74
44
 
75
- end; end
45
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
46
+ # @return [Symbol] autonym
47
+ def autonym_for_key(key)
48
+ key.respond_to?(:to_sym) ? autonym_for_member(key) : autonym_for_index(key)
49
+ rescue NameError, IndexError, TypeError
50
+ raise KeyError
51
+ end
52
+
53
+ # @param [Symbol, String, #to_sym] autonym
54
+ # @return [Array<Symbol>]
55
+ def aliases_for_autonym(autonym)
56
+ raise TypeError unless autonym.respond_to?(:to_sym)
57
+
58
+ autonym = autonym.to_sym
59
+ raise NameError unless with_aliases?(autonym)
60
+
61
+ @aliases.select { |_als, aut| autonym == aut }.keys
62
+ end
63
+
64
+ # @return [Hash] alias => autonym
65
+ def aliases
66
+ @aliases.dup
67
+ end
68
+
69
+ private
70
+
71
+ # for direct access inner data from own instance
72
+ # @return [Hash] alias => autonym
73
+ def _autonyms
74
+ @autonyms
75
+ end
76
+
77
+ # @endgroup
78
+ end
79
+ end