striuct 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/.gitignore +35 -34
  2. data/.travis.yml +6 -6
  3. data/Gemfile +12 -12
  4. data/History.rdoc +279 -273
  5. data/LICENSE +21 -21
  6. data/Manifest.txt +91 -90
  7. data/README.ja.old.rdoc +297 -297
  8. data/README.md +128 -128
  9. data/Rakefile +11 -11
  10. data/benchmark/basics.rb +56 -56
  11. data/example/README.rb +44 -44
  12. data/example/example.old.rdoc +187 -187
  13. data/example/example1.rb +233 -233
  14. data/example/example2.rb +22 -22
  15. data/example/see_trace.rb +32 -32
  16. data/lib/striuct/classmethods/README.md +5 -5
  17. data/lib/striuct/classmethods/adjustment.rb +32 -32
  18. data/lib/striuct/classmethods/constructor.rb +63 -63
  19. data/lib/striuct/classmethods/default.rb +27 -27
  20. data/lib/striuct/classmethods/enum.rb +48 -48
  21. data/lib/striuct/classmethods/inner.rb +91 -91
  22. data/lib/striuct/classmethods/length.rb +14 -14
  23. data/lib/striuct/classmethods/macro.rb +144 -144
  24. data/lib/striuct/classmethods/named.rb +113 -113
  25. data/lib/striuct/classmethods/object.rb +54 -54
  26. data/lib/striuct/classmethods/prevent_conflicts.rb +89 -89
  27. data/lib/striuct/classmethods/requiremnets.rb +11 -11
  28. data/lib/striuct/classmethods/to_struct.rb +23 -25
  29. data/lib/striuct/classmethods/validation.rb +55 -55
  30. data/lib/striuct/classmethods.rb +1 -1
  31. data/lib/striuct/instancemethods/README.md +5 -5
  32. data/lib/striuct/instancemethods/assign.rb +30 -30
  33. data/lib/striuct/instancemethods/cast.rb +34 -34
  34. data/lib/striuct/instancemethods/compare.rb +30 -30
  35. data/lib/striuct/instancemethods/default.rb +13 -13
  36. data/lib/striuct/instancemethods/delegate_class_methods.rb +28 -28
  37. data/lib/striuct/instancemethods/enum.rb +103 -103
  38. data/lib/striuct/instancemethods/hashy.rb +121 -121
  39. data/lib/striuct/instancemethods/inner.rb +60 -60
  40. data/lib/striuct/instancemethods/keyvalidatable.rb +14 -14
  41. data/lib/striuct/instancemethods/lock.rb +61 -61
  42. data/lib/striuct/instancemethods/object.rb +52 -52
  43. data/lib/striuct/instancemethods/requirements.rb +14 -14
  44. data/lib/striuct/instancemethods/safety.rb +11 -11
  45. data/lib/striuct/instancemethods/subscript.rb +55 -55
  46. data/lib/striuct/instancemethods/validation.rb +29 -25
  47. data/lib/striuct/instancemethods/values.rb +57 -57
  48. data/lib/striuct/instancemethods.rb +1 -1
  49. data/lib/striuct/requirements.rb +5 -5
  50. data/lib/striuct/singleton_class.rb +66 -66
  51. data/lib/striuct/specificcontainer.rb +19 -19
  52. data/lib/striuct/structs.rb +7 -7
  53. data/lib/striuct/version.rb +5 -5
  54. data/lib/striuct.rb +13 -13
  55. data/striuct.gemspec +24 -24
  56. data/test/helper.rb +5 -5
  57. data/test/test_striuct-singleton_class-define.rb +19 -19
  58. data/test/test_striuct-subclass-class-cloning.rb +20 -20
  59. data/test/test_striuct-subclass-class-close.rb +36 -36
  60. data/test/test_striuct-subclass-class-constructor.rb +82 -82
  61. data/test/test_striuct-subclass-class-freeze.rb +36 -36
  62. data/test/test_striuct-subclass-class-inheritable.rb +57 -57
  63. data/test/test_striuct-subclass-class-macro.rb +13 -13
  64. data/test/test_striuct-subclass-class-safety_naming.rb +72 -72
  65. data/test/test_striuct-subclass-class-validation.rb +26 -26
  66. data/test/test_striuct-subclass-feature-alias_member.rb +53 -53
  67. data/test/test_striuct-subclass-feature-to_struct.rb +61 -25
  68. data/test/test_striuct-subclass-feature-validation_util.rb +57 -0
  69. data/test/test_striuct-subclass-instance-accessor.rb +137 -137
  70. data/test/test_striuct-subclass-instance-adjuster.rb +94 -94
  71. data/test/test_striuct-subclass-instance-assign.rb +30 -30
  72. data/test/test_striuct-subclass-instance-basic.rb +32 -32
  73. data/test/test_striuct-subclass-instance-cloning.rb +22 -22
  74. data/test/test_striuct-subclass-instance-compare.rb +51 -51
  75. data/test/test_striuct-subclass-instance-default_value.rb +128 -128
  76. data/test/test_striuct-subclass-instance-enum.rb +92 -92
  77. data/test/test_striuct-subclass-instance-freeze.rb +19 -19
  78. data/test/test_striuct-subclass-instance-hashlike.rb +153 -153
  79. data/test/test_striuct-subclass-instance-keyvalidatable.rb +24 -24
  80. data/test/test_striuct-subclass-instance-lock.rb +39 -39
  81. data/test/test_striuct-subclass-instance-to_s_family.rb +25 -25
  82. data/test/test_striuct-subclass-instance-validation_functional_condition.rb +50 -50
  83. data/test/test_striuct-subclass-instance-validation_inference.rb +50 -50
  84. data/test/test_striuct-subclass-instance-validation_specific_conditions.rb +247 -247
  85. data/test/test_striuct-subclass-instance-validation_with_getter.rb +33 -33
  86. data/test/test_striuct-subclass-instance_names.rb +18 -18
  87. data/test/test_striuct-version.rb +10 -10
  88. metadata +4 -2
data/example/example1.rb CHANGED
@@ -1,234 +1,234 @@
1
- #/usr/bin/ruby -w
2
-
3
- require_relative '../lib/striuct'
4
-
5
- def debug(message)
6
- puts "line: #{caller.first.slice(/:(\w+)/, 1)}"
7
- puts message.inspect, '-' * 80
8
- end
9
-
10
-
11
- # 1. Struct+ "Secure"
12
-
13
- # macro "member" provides to use condtions
14
- class User < Striuct.new
15
- member :id, Integer
16
- member :age, (20..140)
17
- member :name, OR(/\A\w+\z/, /\A\w+ \w+\z/)
18
- end
19
-
20
- user = User.new 128381, 20
21
- debug user
22
-
23
- user.age = 30
24
- user[2] = 'taro yamada'
25
- debug user
26
-
27
- # fail (Exception Striuct::ConditionError)
28
- begin
29
- user[:id] = 10.0
30
- rescue
31
- debug $!
32
- end
33
-
34
- begin
35
- user.age = 19
36
- rescue
37
- debug $!
38
- end
39
-
40
- begin
41
- user[2] = 'typo! name'
42
- rescue
43
- debug $!
44
- end
45
-
46
- # more detail checker do you need, use functional object
47
- module Game
48
- class Character
49
- end
50
-
51
- class DB < Striuct.new
52
- member :monsters, ->list{(list - characters).empty?}
53
- member :characters, GENERICS(Character)
54
- end
55
-
56
- monster = Character.new
57
- db = DB.new
58
-
59
- begin
60
- db.characters = [1, 2]
61
- rescue
62
- debug $!
63
- end
64
-
65
- db.characters = [monster, Character.new]
66
- debug db
67
-
68
- begin
69
- db.monsters = [Character.new]
70
- rescue
71
- debug $!
72
- end
73
-
74
- db.monsters = [monster]
75
- debug db
76
- end
77
-
78
- # through "inference", and check under first passed object class
79
- class FlexibleContainer < Striuct.new
80
- member :anything, ANYTHING?, inference: true
81
- member :number, Numeric, inference: true
82
- end
83
-
84
- fc1, fc2 = FlexibleContainer.new, FlexibleContainer.new
85
- fc1.anything = 'str'
86
- debug fc1
87
- begin
88
- fc1.anything = :sym
89
- rescue
90
- debug $!
91
- end
92
-
93
- begin
94
- fc2.anything = :sym
95
- rescue
96
- debug $!
97
- end
98
-
99
- fc2.anything = 'string too'
100
-
101
- debug fc2
102
-
103
- begin
104
- fc1.number = 'str'
105
- rescue
106
- debug $!
107
- end
108
-
109
- fc1.number = 1.0
110
- debug fc1
111
-
112
- begin
113
- fc2.number = 1
114
- rescue
115
- debug $!
116
- end
117
-
118
- # Standard Struct not check member name.
119
- NoGuard = Struct.new :__send__, :'? !'
120
- noguard = NoGuard.new false
121
- debug noguard.__send__
122
- debug noguard.methods.include?(:'? !') # lost!!
123
-
124
- # Striuct provides safety levels for naming.
125
- class SafetyNaming < Striuct.new
126
- begin
127
- member :__send__
128
- rescue
129
- debug $!
130
- end
131
-
132
- begin
133
- member :'? !'
134
- rescue
135
- debug $!
136
- end
137
-
138
- # set lower
139
- protect_level :struct
140
-
141
- member :__send__, :'? !'
142
- end
143
-
144
- # 2. Struct+ "Handy"
145
-
146
- # to through block called "flavor"
147
- # below case for type cast
148
- class User2 < Striuct.new
149
- member :age, OR(/\A\d+\z/, Numeric) do |arg|
150
- Integer arg
151
- end
152
-
153
- member :name, ->v{v.respond_to? :to_s} do |v|
154
- v.to_s.to_sym
155
- end
156
- end
157
-
158
- user2 = User2.new
159
- user2.age = 9
160
- debug user2
161
-
162
- user2.age = 10.1
163
- debug user2
164
-
165
- user2.age = '10'
166
- debug user2
167
-
168
- user2.name = 10
169
- debug user2
170
- user2.name = Class
171
- debug user2
172
-
173
- # Default value
174
-
175
- class User3 < Striuct.new
176
- member :lank, Fixnum
177
- default :lank, 3
178
- member :name
179
- end
180
-
181
- user3 = User3.new
182
- user3
183
- debug user3
184
-
185
- # Standard Struct always define "nil is default". ...realy?
186
- debug user3.assign?(:name)
187
- user3.name = nil
188
- debug user3.assign?(:name)
189
-
190
- # Alias
191
-
192
- class User3
193
- alias_member :position, :lank
194
- end
195
-
196
- debug user3.lank.equal?(user3.position)
197
- debug user3[:lank].equal?(user3[:position])
198
- user3[:position] = 4
199
- debug user3.lank
200
-
201
- # New Constructors
202
-
203
- # Subclass.define reject floating object
204
- # * except if no finished assign each members
205
- # * return object is frozen
206
- user3 = User3.define do |r|
207
- r.lank = 10
208
- r.name = 'foo'
209
- end
210
-
211
- debug user3
212
-
213
- # Subclass.load_pairs easy make from Hash and like Hash
214
- user3 = User3[lank:10, name: 'foo']
215
-
216
- debug user3
217
-
218
- # 3. Keeping Struct's good interface
219
-
220
- Sth1 = Striuct.new do
221
- def my_special_method
222
- end
223
- end
224
-
225
- debug Sth1.new.respond_to?(:my_special_method)
226
-
227
- # to_struct
228
- MyC = Striuct.new :a, :b
229
- a = MyC.to_struct_class
230
- p a
231
-
232
- p MyC.new.to_struct
233
- myc = Striuct.new :a, :b
1
+ #/usr/bin/ruby -w
2
+
3
+ require_relative '../lib/striuct'
4
+
5
+ def debug(message)
6
+ puts "line: #{caller.first.slice(/:(\w+)/, 1)}"
7
+ puts message.inspect, '-' * 80
8
+ end
9
+
10
+
11
+ # 1. Struct+ "Secure"
12
+
13
+ # macro "member" provides to use condtions
14
+ class User < Striuct.new
15
+ member :id, Integer
16
+ member :age, (20..140)
17
+ member :name, OR(/\A\w+\z/, /\A\w+ \w+\z/)
18
+ end
19
+
20
+ user = User.new 128381, 20
21
+ debug user
22
+
23
+ user.age = 30
24
+ user[2] = 'taro yamada'
25
+ debug user
26
+
27
+ # fail (Exception Striuct::ConditionError)
28
+ begin
29
+ user[:id] = 10.0
30
+ rescue
31
+ debug $!
32
+ end
33
+
34
+ begin
35
+ user.age = 19
36
+ rescue
37
+ debug $!
38
+ end
39
+
40
+ begin
41
+ user[2] = 'typo! name'
42
+ rescue
43
+ debug $!
44
+ end
45
+
46
+ # more detail checker do you need, use functional object
47
+ module Game
48
+ class Character
49
+ end
50
+
51
+ class DB < Striuct.new
52
+ member :monsters, ->list{(list - characters).empty?}
53
+ member :characters, GENERICS(Character)
54
+ end
55
+
56
+ monster = Character.new
57
+ db = DB.new
58
+
59
+ begin
60
+ db.characters = [1, 2]
61
+ rescue
62
+ debug $!
63
+ end
64
+
65
+ db.characters = [monster, Character.new]
66
+ debug db
67
+
68
+ begin
69
+ db.monsters = [Character.new]
70
+ rescue
71
+ debug $!
72
+ end
73
+
74
+ db.monsters = [monster]
75
+ debug db
76
+ end
77
+
78
+ # through "inference", and check under first passed object class
79
+ class FlexibleContainer < Striuct.new
80
+ member :anything, ANYTHING?, inference: true
81
+ member :number, Numeric, inference: true
82
+ end
83
+
84
+ fc1, fc2 = FlexibleContainer.new, FlexibleContainer.new
85
+ fc1.anything = 'str'
86
+ debug fc1
87
+ begin
88
+ fc1.anything = :sym
89
+ rescue
90
+ debug $!
91
+ end
92
+
93
+ begin
94
+ fc2.anything = :sym
95
+ rescue
96
+ debug $!
97
+ end
98
+
99
+ fc2.anything = 'string too'
100
+
101
+ debug fc2
102
+
103
+ begin
104
+ fc1.number = 'str'
105
+ rescue
106
+ debug $!
107
+ end
108
+
109
+ fc1.number = 1.0
110
+ debug fc1
111
+
112
+ begin
113
+ fc2.number = 1
114
+ rescue
115
+ debug $!
116
+ end
117
+
118
+ # Standard Struct not check member name.
119
+ NoGuard = Struct.new :__send__, :'? !'
120
+ noguard = NoGuard.new false
121
+ debug noguard.__send__
122
+ debug noguard.methods.include?(:'? !') # lost!!
123
+
124
+ # Striuct provides safety levels for naming.
125
+ class SafetyNaming < Striuct.new
126
+ begin
127
+ member :__send__
128
+ rescue
129
+ debug $!
130
+ end
131
+
132
+ begin
133
+ member :'? !'
134
+ rescue
135
+ debug $!
136
+ end
137
+
138
+ # set lower
139
+ protect_level :struct
140
+
141
+ member :__send__, :'? !'
142
+ end
143
+
144
+ # 2. Struct+ "Handy"
145
+
146
+ # to through block called "flavor"
147
+ # below case for type cast
148
+ class User2 < Striuct.new
149
+ member :age, OR(/\A\d+\z/, Numeric) do |arg|
150
+ Integer arg
151
+ end
152
+
153
+ member :name, ->v{v.respond_to? :to_s} do |v|
154
+ v.to_s.to_sym
155
+ end
156
+ end
157
+
158
+ user2 = User2.new
159
+ user2.age = 9
160
+ debug user2
161
+
162
+ user2.age = 10.1
163
+ debug user2
164
+
165
+ user2.age = '10'
166
+ debug user2
167
+
168
+ user2.name = 10
169
+ debug user2
170
+ user2.name = Class
171
+ debug user2
172
+
173
+ # Default value
174
+
175
+ class User3 < Striuct.new
176
+ member :lank, Fixnum
177
+ default :lank, 3
178
+ member :name
179
+ end
180
+
181
+ user3 = User3.new
182
+ user3
183
+ debug user3
184
+
185
+ # Standard Struct always define "nil is default". ...realy?
186
+ debug user3.assign?(:name)
187
+ user3.name = nil
188
+ debug user3.assign?(:name)
189
+
190
+ # Alias
191
+
192
+ class User3
193
+ alias_member :position, :lank
194
+ end
195
+
196
+ debug user3.lank.equal?(user3.position)
197
+ debug user3[:lank].equal?(user3[:position])
198
+ user3[:position] = 4
199
+ debug user3.lank
200
+
201
+ # New Constructors
202
+
203
+ # Subclass.define reject floating object
204
+ # * except if no finished assign each members
205
+ # * return object is frozen
206
+ user3 = User3.define do |r|
207
+ r.lank = 10
208
+ r.name = 'foo'
209
+ end
210
+
211
+ debug user3
212
+
213
+ # Subclass.load_pairs easy make from Hash and like Hash
214
+ user3 = User3[lank:10, name: 'foo']
215
+
216
+ debug user3
217
+
218
+ # 3. Keeping Struct's good interface
219
+
220
+ Sth1 = Striuct.new do
221
+ def my_special_method
222
+ end
223
+ end
224
+
225
+ debug Sth1.new.respond_to?(:my_special_method)
226
+
227
+ # to_struct
228
+ MyC = Striuct.new :a, :b
229
+ a = MyC.to_struct_class
230
+ p a
231
+
232
+ p MyC.new.to_struct
233
+ myc = Striuct.new :a, :b
234
234
  p myc.new.to_struct
data/example/example2.rb CHANGED
@@ -1,22 +1,22 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- $VERBOSE = true
4
-
5
- require_relative '../lib/striuct'
6
-
7
- User = Striuct.define do # other way "class User < Striuct.new"
8
- member :firstname, /\w+/ # look like case syntax in Ruby
9
- member :lank, AND(Fixnum, 1..10) # easy build multiple validation
10
- default :lank, 3 # set a normal default value
11
- member :registered, Time # look like type variable
12
- default :registered, &->{Time.now} # evaluate with construction
13
- p members #=> [firstname, lank, registered]
14
- end
15
-
16
- class MyUser < User
17
- p members #=> [firstname, lank, registered]
18
- member :foo # no validation, just an accessor
19
- p members #=> [firstname, lank, registered, :foo]
20
- end
21
-
22
- user = MyUser.new
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ $VERBOSE = true
4
+
5
+ require_relative '../lib/striuct'
6
+
7
+ User = Striuct.define do # other way "class User < Striuct.new"
8
+ member :firstname, /\w+/ # look like case syntax in Ruby
9
+ member :lank, AND(Fixnum, 1..10) # easy build multiple validation
10
+ default :lank, 3 # set a normal default value
11
+ member :registered, Time # look like type variable
12
+ default :registered, &->{Time.now} # evaluate with construction
13
+ p members #=> [firstname, lank, registered]
14
+ end
15
+
16
+ class MyUser < User
17
+ p members #=> [firstname, lank, registered]
18
+ member :foo # no validation, just an accessor
19
+ p members #=> [firstname, lank, registered, :foo]
20
+ end
21
+
22
+ user = MyUser.new
data/example/see_trace.rb CHANGED
@@ -1,32 +1,32 @@
1
- #/usr/bin/ruby -w
2
-
3
- require_relative '../lib/striuct'
4
-
5
- class User < Striuct.new
6
- member :id, Integer
7
- member :age, (20..140)
8
- end
9
-
10
- user = User.new
11
-
12
- begin
13
- user[:id] = 10.0
14
- rescue
15
- puts $!.backtrace
16
- end
17
-
18
- puts '-' * 80
19
-
20
- $stdout.flush
21
-
22
- begin
23
- user.age = 19
24
- rescue
25
- puts $!.backtrace
26
- end
27
-
28
- puts '-' * 80
29
-
30
- $stdout.flush
31
-
32
- user.age = 19
1
+ #/usr/bin/ruby -w
2
+
3
+ require_relative '../lib/striuct'
4
+
5
+ class User < Striuct.new
6
+ member :id, Integer
7
+ member :age, (20..140)
8
+ end
9
+
10
+ user = User.new
11
+
12
+ begin
13
+ user[:id] = 10.0
14
+ rescue
15
+ puts $!.backtrace
16
+ end
17
+
18
+ puts '-' * 80
19
+
20
+ $stdout.flush
21
+
22
+ begin
23
+ user.age = 19
24
+ rescue
25
+ puts $!.backtrace
26
+ end
27
+
28
+ puts '-' * 80
29
+
30
+ $stdout.flush
31
+
32
+ user.age = 19
@@ -1,5 +1,5 @@
1
- For developer
2
- ==============
3
-
4
- * This dir's tree is diveded under roles/features.
5
- Not under CONSTANT names.
1
+ For developer
2
+ ==============
3
+
4
+ * This dir's tree is diveded under roles/features.
5
+ Not under CONSTANT names.
@@ -1,33 +1,33 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Adjuster
4
-
5
- # @param [Symbol, String] name
6
- def has_adjuster?(name)
7
- autonym = autonym_for name
8
-
9
- ! adjuster_for(autonym).nil?
10
- end
11
-
12
- alias_method :has_flavor?, :has_adjuster?
13
-
14
- # @param [Symbol, String] name
15
- def adjuster_for(name)
16
- autonym = autonym_for name
17
-
18
- _adjuster_for autonym
19
- end
20
-
21
- alias_method :flavor_for, :adjuster_for
22
-
23
- private
24
-
25
- def _adjuster_for(autonym)
26
- @adjusters[autonym]
27
- end
28
-
29
- alias_method :_flavor_for, :_adjuster_for
30
-
31
- # @endgroup
32
-
1
+ class Striuct; module ClassMethods
2
+
3
+ # @group Adjuster
4
+
5
+ # @param [Symbol, String] name
6
+ def has_adjuster?(name)
7
+ autonym = autonym_for name
8
+
9
+ ! adjuster_for(autonym).nil?
10
+ end
11
+
12
+ alias_method :has_flavor?, :has_adjuster?
13
+
14
+ # @param [Symbol, String] name
15
+ def adjuster_for(name)
16
+ autonym = autonym_for name
17
+
18
+ _adjuster_for autonym
19
+ end
20
+
21
+ alias_method :flavor_for, :adjuster_for
22
+
23
+ private
24
+
25
+ def _adjuster_for(autonym)
26
+ @adjusters[autonym]
27
+ end
28
+
29
+ alias_method :_flavor_for, :_adjuster_for
30
+
31
+ # @endgroup
32
+
33
33
  end; end