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/README.md CHANGED
@@ -1,128 +1,128 @@
1
- striuct
2
- =======
3
-
4
- Description
5
- -----------
6
-
7
- Struct++
8
-
9
- Features
10
- --------
11
-
12
- ### Strict
13
-
14
- * Easy and Flexible Validations
15
- * Prevent to conflict member names
16
- * Lock setters for each member
17
-
18
- ### Useful
19
-
20
- * Hook just before setters
21
- * Default value
22
- * Member aliasing
23
- * Inheritable
24
- * Handling between nil <-> unassigned
25
- * More flendly API for Hash
26
-
27
- ### Onepoint
28
-
29
- * Base API looks like Struct
30
- * Pure Ruby :)
31
-
32
- Usage
33
- -----
34
-
35
- ### Overview - Case 1
36
-
37
- ```ruby
38
- require 'striuct'
39
-
40
- class Person < Striuct
41
- member :fullname, AND(String, /\A.+\z/) # Flexible Validation
42
- alias_member :name, :fullname # Use other name
43
- end
44
-
45
- class User < Person # Inheritable
46
- member :id, Integer, # Looks typed validation
47
- default_proc: ->{User.next_id} # With default value
48
-
49
- def self.next_id
50
- @id ||= 0
51
- @id += 1
52
- end
53
- end
54
-
55
- john = User.new 'john'
56
- john[:name] #=> 'john'
57
- john.name = '' #=> Exception # Validate with setter
58
- john.id #=> 1
59
- ken = User[name: 'ken'] # Construct from hash
60
- ken.id #=> 2
61
- ```
62
- ### Overview - Case 2
63
-
64
- ```ruby
65
- class Foo < Striuct
66
- member :foo
67
- member :bar, Numeric, inference: true
68
- member :with_adjuster, Integer, &->v{Integer v}
69
- end
70
-
71
- foo = Foo.new
72
-
73
- # nil <-> unaasigned
74
- foo.foo #=> nil
75
- foo.assign?(:foo) #=> false
76
- foo.foo = nil
77
- foo.assign?(:foo) #=> true
78
-
79
- # Lock to a member
80
- foo.lock(:foo)
81
- foo.foo = nil #=> error
82
-
83
- # Inference Validation
84
- foo.bar = 1.2 #=> pass # memorize 1.2's class is Float
85
- foo.bar = 1 #=> error # 1 is not Float
86
-
87
- # With adjuster
88
- foo.with_adjuster = '5'
89
- foo.with_adjuster #=> 5 # Casted via adjuster
90
- ```
91
-
92
-
93
- ### More Examples
94
-
95
- #### Basics
96
-
97
- example/*
98
-
99
- Requirements
100
- -------------
101
-
102
- * Ruby 1.9.2 or later [MRI/YARV, Rubinius](http://travis-ci.org/#!/kachick/striuct)
103
- * validation - 0.0.3
104
- * keyvalidatable - 0.0.3
105
-
106
- Install
107
- -------
108
-
109
- ```shell
110
- $ gem install striuct
111
- ```
112
-
113
- Link
114
- ----
115
-
116
- * [code](https://github.com/kachick/striuct)
117
- * [API](http://kachick.github.com/docs/striuct/api/frames.html)
118
- * [issues](https://github.com/kachick/striuct/issues)
119
- * [CI](http://travis-ci.org/#!/kachick/striuct)
120
- * [gem](https://rubygems.org/gems/striuct)
121
-
122
- License
123
- --------
124
-
125
- The MIT X11 License
126
- Copyright (c) 2011 Kenichi Kamiya
127
- See the file LICENSE for further details.
128
-
1
+ striuct
2
+ =======
3
+
4
+ Description
5
+ -----------
6
+
7
+ Struct++
8
+
9
+ Features
10
+ --------
11
+
12
+ ### Strict
13
+
14
+ * Easy and Flexible Validations
15
+ * Prevent to conflict member names
16
+ * Lock setters for each member
17
+
18
+ ### Useful
19
+
20
+ * Hook just before setters
21
+ * Default value
22
+ * Member aliasing
23
+ * Inheritable
24
+ * Handling between nil <-> unassigned
25
+ * More flendly API for Hash
26
+
27
+ ### Onepoint
28
+
29
+ * Base API looks like Struct
30
+ * Pure Ruby :)
31
+
32
+ Usage
33
+ -----
34
+
35
+ ### Overview - Case 1
36
+
37
+ ```ruby
38
+ require 'striuct'
39
+
40
+ class Person < Striuct
41
+ member :fullname, AND(String, /\A.+\z/) # Flexible Validation
42
+ alias_member :name, :fullname # Use other name
43
+ end
44
+
45
+ class User < Person # Inheritable
46
+ member :id, Integer, # Looks typed validation
47
+ default_proc: ->{User.next_id} # With default value
48
+
49
+ def self.next_id
50
+ @id ||= 0
51
+ @id += 1
52
+ end
53
+ end
54
+
55
+ john = User.new 'john'
56
+ john[:name] #=> 'john'
57
+ john.name = '' #=> Exception # Validate with setter
58
+ john.id #=> 1
59
+ ken = User[name: 'ken'] # Construct from hash
60
+ ken.id #=> 2
61
+ ```
62
+ ### Overview - Case 2
63
+
64
+ ```ruby
65
+ class Foo < Striuct
66
+ member :foo
67
+ member :bar, Numeric, inference: true
68
+ member :with_adjuster, Integer, &->v{Integer v}
69
+ end
70
+
71
+ foo = Foo.new
72
+
73
+ # nil <-> unaasigned
74
+ foo.foo #=> nil
75
+ foo.assign?(:foo) #=> false
76
+ foo.foo = nil
77
+ foo.assign?(:foo) #=> true
78
+
79
+ # Lock to a member
80
+ foo.lock(:foo)
81
+ foo.foo = nil #=> error
82
+
83
+ # Inference Validation
84
+ foo.bar = 1.2 #=> pass # memorize 1.2's class is Float
85
+ foo.bar = 1 #=> error # 1 is not Float
86
+
87
+ # With adjuster
88
+ foo.with_adjuster = '5'
89
+ foo.with_adjuster #=> 5 # Casted via adjuster
90
+ ```
91
+
92
+
93
+ ### More Examples
94
+
95
+ #### Basics
96
+
97
+ example/*
98
+
99
+ Requirements
100
+ -------------
101
+
102
+ * Ruby 1.9.2 or later [MRI/YARV, Rubinius](http://travis-ci.org/#!/kachick/striuct)
103
+ * validation - 0.0.3
104
+ * keyvalidatable - 0.0.3
105
+
106
+ Install
107
+ -------
108
+
109
+ ```shell
110
+ $ gem install striuct
111
+ ```
112
+
113
+ Link
114
+ ----
115
+
116
+ * [code](https://github.com/kachick/striuct)
117
+ * [API](http://kachick.github.com/docs/striuct/api/frames.html)
118
+ * [issues](https://github.com/kachick/striuct/issues)
119
+ * [CI](http://travis-ci.org/#!/kachick/striuct)
120
+ * [gem](https://rubygems.org/gems/striuct)
121
+
122
+ License
123
+ --------
124
+
125
+ The MIT X11 License
126
+ Copyright (c) 2011 Kenichi Kamiya
127
+ See the file LICENSE for further details.
128
+
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
- #!/usr/bin/env rake
2
- require 'bundler/gem_tasks'
3
-
4
- require 'rake/testtask'
5
-
6
- task default: [:test]
7
-
8
- Rake::TestTask.new do |tt|
9
- tt.verbose = true
10
- end
11
-
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'rake/testtask'
5
+
6
+ task default: [:test]
7
+
8
+ Rake::TestTask.new do |tt|
9
+ tt.verbose = true
10
+ end
11
+
data/benchmark/basics.rb CHANGED
@@ -1,56 +1,56 @@
1
- #/usr/bin/ruby -w
2
-
3
- require 'benchmark'
4
- require_relative '../lib/striuct'
5
-
6
- XStruct = Struct.new :any, :no_use1, :no_use2
7
-
8
- XStriuct = Striuct.define do
9
- member :any
10
- member :int, Integer
11
- member :truthy, ->v{v}
12
- end
13
-
14
- xstruct = XStruct.new
15
- xstriuct = XStriuct.new
16
-
17
- TIMES = 100000
18
- OBJ = 123
19
-
20
- Benchmark.bm do |bm|
21
- bm.report 'Struct(equal Noguard): Setter' do
22
- TIMES.times do
23
- xstruct.any = OBJ
24
- end
25
- end
26
-
27
- bm.report 'Struct: Reader' do
28
- TIMES.times do
29
- xstruct.any
30
- end
31
- end
32
-
33
- bm.report 'Striuct(when Noguard): Setter' do
34
- TIMES.times do
35
- xstriuct.any = OBJ
36
- end
37
- end
38
-
39
- bm.report 'Striuct(guard under class): Setter' do
40
- TIMES.times do
41
- xstriuct.int = OBJ
42
- end
43
- end
44
-
45
- bm.report 'Striuct(guard under function)' do
46
- TIMES.times do
47
- xstriuct.truthy = OBJ
48
- end
49
- end
50
-
51
- bm.report 'Striuct: Reader' do
52
- TIMES.times do
53
- xstriuct.any
54
- end
55
- end
56
- end
1
+ #/usr/bin/ruby -w
2
+
3
+ require 'benchmark'
4
+ require_relative '../lib/striuct'
5
+
6
+ XStruct = Struct.new :any, :no_use1, :no_use2
7
+
8
+ XStriuct = Striuct.define do
9
+ member :any
10
+ member :int, Integer
11
+ member :truthy, ->v{v}
12
+ end
13
+
14
+ xstruct = XStruct.new
15
+ xstriuct = XStriuct.new
16
+
17
+ TIMES = 100000
18
+ OBJ = 123
19
+
20
+ Benchmark.bm do |bm|
21
+ bm.report 'Struct(equal Noguard): Setter' do
22
+ TIMES.times do
23
+ xstruct.any = OBJ
24
+ end
25
+ end
26
+
27
+ bm.report 'Struct: Reader' do
28
+ TIMES.times do
29
+ xstruct.any
30
+ end
31
+ end
32
+
33
+ bm.report 'Striuct(when Noguard): Setter' do
34
+ TIMES.times do
35
+ xstriuct.any = OBJ
36
+ end
37
+ end
38
+
39
+ bm.report 'Striuct(guard under class): Setter' do
40
+ TIMES.times do
41
+ xstriuct.int = OBJ
42
+ end
43
+ end
44
+
45
+ bm.report 'Striuct(guard under function)' do
46
+ TIMES.times do
47
+ xstriuct.truthy = OBJ
48
+ end
49
+ end
50
+
51
+ bm.report 'Striuct: Reader' do
52
+ TIMES.times do
53
+ xstriuct.any
54
+ end
55
+ end
56
+ end
data/example/README.rb CHANGED
@@ -1,44 +1,44 @@
1
- $VERBOSE = true
2
-
3
- require '../lib/striuct'
4
-
5
- class Person < Striuct
6
- member :fullname, AND(String, /\A.+\z/) # Flexible Validation
7
- alias_member :name, :fullname # Use other name
8
- end
9
-
10
- class User < Person # Inheritable
11
- member :id, Integer, # Looks typed validation
12
- default_proc: ->{User.next_id} # With default value
13
-
14
- def self.next_id
15
- @id ||= 0
16
- @id += 1
17
- end
18
- end
19
-
20
- john = User.new 'john'
21
- p john[:name] #=> 'john'
22
- #~ p john.name = '' #=> error
23
- p john.id #=> 1
24
- ken = User[name: 'ken'] # Construct from hash
25
- p ken.id #=> 2
26
-
27
- class Foo < Striuct
28
- member :foo
29
- member :bar, Numeric, inference: true
30
- member :with_adjuster, Integer, &->v{Integer v}
31
- end
32
-
33
- foo = Foo.new
34
- p foo.foo #=> nil
35
- p foo.assign?(:foo) #=> false
36
- foo.foo = nil
37
- p foo.assign?(:foo) #=> true
38
- foo.lock(:foo)
39
- #~ foo.foo = nil #=> error
40
- foo.bar = 1.2
41
- #~ foo.bar = 1 #=> error
42
-
43
- foo.with_adjuster = '5'
44
- p foo.with_adjuster
1
+ $VERBOSE = true
2
+
3
+ require_relative '../lib/striuct'
4
+
5
+ class Person < Striuct
6
+ member :fullname, AND(String, /\A.+\z/) # Flexible Validation
7
+ alias_member :name, :fullname # Use other name
8
+ end
9
+
10
+ class User < Person # Inheritable
11
+ member :id, Integer, # Looks typed validation
12
+ default_proc: ->{User.next_id} # With default value
13
+
14
+ def self.next_id
15
+ @id ||= 0
16
+ @id += 1
17
+ end
18
+ end
19
+
20
+ john = User.new 'john'
21
+ p john[:name] #=> 'john'
22
+ #~ p john.name = '' #=> error
23
+ p john.id #=> 1
24
+ ken = User[name: 'ken'] # Construct from hash
25
+ p ken.id #=> 2
26
+
27
+ class Foo < Striuct
28
+ member :foo
29
+ member :bar, Numeric, inference: true
30
+ member :with_adjuster, Integer, &->v{Integer v}
31
+ end
32
+
33
+ foo = Foo.new
34
+ p foo.foo #=> nil
35
+ p foo.assign?(:foo) #=> false
36
+ foo.foo = nil
37
+ p foo.assign?(:foo) #=> true
38
+ foo.lock(:foo)
39
+ #~ foo.foo = nil #=> error
40
+ foo.bar = 1.2
41
+ #~ foo.bar = 1 #=> error
42
+
43
+ foo.with_adjuster = '5'
44
+ p foo.with_adjuster