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
@@ -1,89 +1,89 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Prevent Naming Conflicts
4
-
5
- NAMING_RISKS = {
6
- conflict: 10,
7
- no_identifier: 9,
8
- bad_manners: 5,
9
- no_ascii: 3,
10
- strict: 0
11
- }.freeze
12
-
13
- PROTECT_LEVELS = {
14
- struct: {error: 99, warn: 99},
15
- warning: {error: 99, warn: 5},
16
- error: {error: 9, warn: 5},
17
- prevent: {error: 5, warn: 1},
18
- nervous: {error: 1, warn: 1}
19
- }.each(&:freeze).freeze
20
-
21
- # @param [Object] name
22
- # accpeptable the name into own member, under protect level of runtime
23
- def cname?(name)
24
- _check_safety_naming(keyable_for name){|r|r}
25
- rescue Exception
26
- false
27
- end
28
-
29
- private
30
-
31
- # @param [Symbol] level
32
- # @return [nil]
33
- # change protect level for risk of naming members
34
- def protect_level(level)
35
- raise NameError unless PROTECT_LEVELS.has_key? level
36
-
37
- @protect_level = level
38
- nil
39
- end
40
-
41
- # @param [Symbol] name
42
- # @return [void]
43
- # @yieldreturn [Boolean]
44
- def _check_safety_naming(name)
45
- estimation = _estimate_naming name
46
- risk = NAMING_RISKS[estimation]
47
- plevels = PROTECT_LEVELS[@protect_level]
48
- caution = "undesirable naming '#{name}', because #{estimation}"
49
-
50
- r = (
51
- case
52
- when risk >= plevels[:error]
53
- raise NameError, caution unless block_given?
54
- false
55
- when risk >= plevels[:warn]
56
- warn caution unless block_given?
57
- false
58
- else
59
- true
60
- end
61
- )
62
-
63
- yield r if block_given?
64
- end
65
-
66
- # @param [Symbol] name
67
- # @return [Symbol]
68
- def _estimate_naming(name)
69
- if (instance_methods + private_instance_methods).include? name
70
- return :conflict
71
- end
72
-
73
- return :no_ascii unless name.encoding.equal? Encoding::ASCII
74
-
75
- case name
76
- when /[\W]/, /\A[^a-zA-Z_]/, :''
77
- :no_identifier
78
- when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
79
- :bad_manners
80
- when /\A[a-zA-Z_]\w*\z/
81
- :strict
82
- else
83
- raise 'must not happen'
84
- end
85
- end
86
-
87
- # @endgroup
88
-
89
- end; end
1
+ class Striuct; module ClassMethods
2
+
3
+ # @group Prevent Naming Conflicts
4
+
5
+ NAMING_RISKS = {
6
+ conflict: 10,
7
+ no_identifier: 9,
8
+ bad_manners: 5,
9
+ no_ascii: 3,
10
+ strict: 0
11
+ }.freeze
12
+
13
+ PROTECT_LEVELS = {
14
+ struct: {error: 99, warn: 99},
15
+ warning: {error: 99, warn: 5},
16
+ error: {error: 9, warn: 5},
17
+ prevent: {error: 5, warn: 1},
18
+ nervous: {error: 1, warn: 1}
19
+ }.each(&:freeze).freeze
20
+
21
+ # @param [Object] name
22
+ # accpeptable the name into own member, under protect level of runtime
23
+ def cname?(name)
24
+ _check_safety_naming(keyable_for name){|r|r}
25
+ rescue Exception
26
+ false
27
+ end
28
+
29
+ private
30
+
31
+ # @param [Symbol] level
32
+ # @return [nil]
33
+ # change protect level for risk of naming members
34
+ def protect_level(level)
35
+ raise NameError unless PROTECT_LEVELS.has_key? level
36
+
37
+ @protect_level = level
38
+ nil
39
+ end
40
+
41
+ # @param [Symbol] name
42
+ # @return [void]
43
+ # @yieldreturn [Boolean]
44
+ def _check_safety_naming(name)
45
+ estimation = _estimate_naming name
46
+ risk = NAMING_RISKS[estimation]
47
+ plevels = PROTECT_LEVELS[@protect_level]
48
+ caution = "undesirable naming '#{name}', because #{estimation}"
49
+
50
+ r = (
51
+ case
52
+ when risk >= plevels[:error]
53
+ raise NameError, caution unless block_given?
54
+ false
55
+ when risk >= plevels[:warn]
56
+ warn caution unless block_given?
57
+ false
58
+ else
59
+ true
60
+ end
61
+ )
62
+
63
+ yield r if block_given?
64
+ end
65
+
66
+ # @param [Symbol] name
67
+ # @return [Symbol]
68
+ def _estimate_naming(name)
69
+ if (instance_methods + private_instance_methods).include? name
70
+ return :conflict
71
+ end
72
+
73
+ return :no_ascii unless name.encoding.equal? Encoding::ASCII
74
+
75
+ case name
76
+ when /[\W]/, /\A[^a-zA-Z_]/, :''
77
+ :no_identifier
78
+ when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
79
+ :bad_manners
80
+ when /\A[a-zA-Z_]\w*\z/
81
+ :strict
82
+ else
83
+ raise 'must not happen'
84
+ end
85
+ end
86
+
87
+ # @endgroup
88
+
89
+ end; end
@@ -1,12 +1,12 @@
1
- require_relative 'inner'
2
- require_relative 'named'
3
- require_relative 'object'
4
- require_relative 'length'
5
- require_relative 'to_struct'
6
- require_relative 'constructor'
7
- require_relative 'enum'
8
- require_relative 'default'
9
- require_relative 'adjustment'
10
- require_relative 'macro'
11
- require_relative 'prevent_conflicts'
1
+ require_relative 'inner'
2
+ require_relative 'named'
3
+ require_relative 'object'
4
+ require_relative 'length'
5
+ require_relative 'to_struct'
6
+ require_relative 'constructor'
7
+ require_relative 'enum'
8
+ require_relative 'default'
9
+ require_relative 'adjustment'
10
+ require_relative 'macro'
11
+ require_relative 'prevent_conflicts'
12
12
  require_relative 'validation'
@@ -1,26 +1,24 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group To Ruby's Struct Class
4
-
5
- # @return [Class]
6
- def to_struct_class
7
- raise 'No defined members' if autonyms.empty?
8
-
9
- struct_klass = Struct.new(*names)
10
-
11
- if name
12
- tail_name = name.slice(/[^:]+\z/)
13
- if ::Striuct::Structs.const_defined?(tail_name) &&
14
- ((already = ::Striuct::Structs.const_get(tail_name)).members == members)
15
- already
16
- else
17
- ::Striuct::Structs.const_set tail_name, struct_klass
18
- end
19
- else
20
- struct_klass
21
- end
22
- end
23
-
24
- # @endgroup
25
-
1
+ class Striuct; module ClassMethods
2
+
3
+ # @group To Ruby's Struct Class
4
+
5
+ # @return [Class]
6
+ def to_struct_class
7
+ raise 'No defined members' if autonyms.empty?
8
+
9
+ struct_cls = ::Struct.new(*autonyms)
10
+ return struct_cls unless name
11
+
12
+ const_suffix = name.slice(/[^:]+\z/).to_sym
13
+ if ::Striuct::Structs.const_defined?(const_suffix, false) &&
14
+ (already_cls = ::Striuct::Structs.const_get(const_suffix, false)).members == autonyms
15
+ raise unless already_cls.superclass.equal? Struct
16
+ already_cls
17
+ else
18
+ ::Striuct::Structs.const_set const_suffix, struct_cls
19
+ end
20
+ end
21
+
22
+ # @endgroup
23
+
26
24
  end; end
@@ -1,56 +1,56 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Validation
4
-
5
- # @param [Symbol, String] name
6
- # inference checker is waiting yet
7
- def inference?(name)
8
- autonym = autonym_for name
9
-
10
- @inferences.has_key? autonym
11
- end
12
-
13
- # @param [Symbol, String] name
14
- def has_validator?(name)
15
- autonym = autonym_for name
16
-
17
- @conditions.has_key? autonym
18
- end
19
-
20
- alias_method :has_condition?, :has_validator?
21
- alias_method :restrict?, :has_validator?
22
-
23
- # @param [Symbol, String] name
24
- def validator_for(name)
25
- _condition_for autonym_for(name)
26
- end
27
-
28
- alias_method :condition_for, :validator_for
29
-
30
- # @param [Symbol, String] name
31
- def safety_getter?(name)
32
- autonym = autonym_for name
33
-
34
- @getter_validations.has_key? autonym
35
- end
36
-
37
- alias_method :safety_reader?, :safety_getter?
38
-
39
- # @param [Symbol, String] name
40
- def safety_setter?(name)
41
- autonym = autonym_for name
42
-
43
- @setter_validations.has_key? autonym
44
- end
45
-
46
- alias_method :safety_writer?, :safety_setter?
47
-
48
- private
49
-
50
- def _condition_for(name)
51
- @conditions[name]
52
- end
53
-
54
- # @endgroup
55
-
1
+ class Striuct; module ClassMethods
2
+
3
+ # @group Validation
4
+
5
+ # @param [Symbol, String] name
6
+ # inference checker is waiting yet
7
+ def inference?(name)
8
+ autonym = autonym_for name
9
+
10
+ @inferences.has_key? autonym
11
+ end
12
+
13
+ # @param [Symbol, String] name
14
+ def has_validator?(name)
15
+ autonym = autonym_for name
16
+
17
+ @conditions.has_key? autonym
18
+ end
19
+
20
+ alias_method :has_condition?, :has_validator?
21
+ alias_method :restrict?, :has_validator?
22
+
23
+ # @param [Symbol, String] name
24
+ def validator_for(name)
25
+ _condition_for autonym_for(name)
26
+ end
27
+
28
+ alias_method :condition_for, :validator_for
29
+
30
+ # @param [Symbol, String] name
31
+ def safety_getter?(name)
32
+ autonym = autonym_for name
33
+
34
+ @getter_validations.has_key? autonym
35
+ end
36
+
37
+ alias_method :safety_reader?, :safety_getter?
38
+
39
+ # @param [Symbol, String] name
40
+ def safety_setter?(name)
41
+ autonym = autonym_for name
42
+
43
+ @setter_validations.has_key? autonym
44
+ end
45
+
46
+ alias_method :safety_writer?, :safety_setter?
47
+
48
+ private
49
+
50
+ def _condition_for(name)
51
+ @conditions[name]
52
+ end
53
+
54
+ # @endgroup
55
+
56
56
  end; end
@@ -1 +1 @@
1
- require_relative 'classmethods/requiremnets'
1
+ require_relative 'classmethods/requiremnets'
@@ -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,31 +1,31 @@
1
- require_relative 'subscript'
2
-
3
- class Striuct; module InstanceMethods
4
-
5
- # @group Assign
6
-
7
- alias_method :assign, :[]=
8
-
9
- # @param [Symbol, String] name
10
- def assign?(name)
11
- autonym = autonym_for name
12
-
13
- @db.has_key? autonym
14
- end
15
-
16
- # @param [Symbol, String, Fixnum] key
17
- def clear_at(key)
18
- __subscript__(key){|autonym|__clear__ autonym}
19
- end
20
-
21
- alias_method :unassign, :clear_at
22
- alias_method :reset_at, :clear_at
23
-
24
- # all members aren't assigned
25
- def empty?
26
- _autonyms.none?{|autonym|assign? autonym}
27
- end
28
-
29
- # @endgroup
30
-
1
+ require_relative 'subscript'
2
+
3
+ class Striuct; module InstanceMethods
4
+
5
+ # @group Assign
6
+
7
+ alias_method :assign, :[]=
8
+
9
+ # @param [Symbol, String] name
10
+ def assign?(name)
11
+ autonym = autonym_for name
12
+
13
+ @db.has_key? autonym
14
+ end
15
+
16
+ # @param [Symbol, String, Fixnum] key
17
+ def clear_at(key)
18
+ __subscript__(key){|autonym|__clear__ autonym}
19
+ end
20
+
21
+ alias_method :unassign, :clear_at
22
+ alias_method :reset_at, :clear_at
23
+
24
+ # all members aren't assigned
25
+ def empty?
26
+ _autonyms.none?{|autonym|assign? autonym}
27
+ end
28
+
29
+ # @endgroup
30
+
31
31
  end; end
@@ -1,35 +1,35 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Cast
4
-
5
- # @return [self]
6
- def to_striuct
7
- self
8
- end
9
-
10
- # @return [Struct]
11
- def to_struct
12
- self.class.to_struct_class.new(*values)
13
- end
14
-
15
- # @return [Hash]
16
- def to_h(reject_no_assign=false)
17
- return @db.dup if reject_no_assign
18
-
19
- {}.tap {|h|
20
- each_pair do |autonym, val|
21
- h[autonym] = val
22
- end
23
- }
24
- end
25
-
26
- # @return [Array]
27
- def values
28
- each_value.to_a
29
- end
30
-
31
- alias_method :to_a, :values
32
-
33
- # @endgroup
34
-
1
+ class Striuct; module InstanceMethods
2
+
3
+ # @group Cast
4
+
5
+ # @return [self]
6
+ def to_striuct
7
+ self
8
+ end
9
+
10
+ # @return [Struct]
11
+ def to_struct
12
+ self.class.to_struct_class.new(*values)
13
+ end
14
+
15
+ # @return [Hash]
16
+ def to_h(reject_no_assign=false)
17
+ return @db.dup if reject_no_assign
18
+
19
+ {}.tap {|h|
20
+ each_pair do |autonym, val|
21
+ h[autonym] = val
22
+ end
23
+ }
24
+ end
25
+
26
+ # @return [Array]
27
+ def values
28
+ each_value.to_a
29
+ end
30
+
31
+ alias_method :to_a, :values
32
+
33
+ # @endgroup
34
+
35
35
  end; end
@@ -1,30 +1,30 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Compare with other
4
-
5
- # @return [Boolean]
6
- def ==(other)
7
- __compare_all__? other, :==
8
- end
9
-
10
- alias_method :===, :==
11
-
12
- def eql?(other)
13
- __compare_all__? other, :eql?
14
- end
15
-
16
- # @return [Integer]
17
- def hash
18
- @db.hash
19
- end
20
-
21
- private
22
-
23
- # @param [Symbol] method
24
- def __compare_all__?(other, method)
25
- other.instance_of?(self.class) && each_pair.all?{|k, v|v.__send__ method, other[k]}
26
- end
27
-
28
- # @endgroup
29
-
30
- end; end
1
+ class Striuct; module InstanceMethods
2
+
3
+ # @group Compare with other
4
+
5
+ # @return [Boolean]
6
+ def ==(other)
7
+ __compare_all__? other, :==
8
+ end
9
+
10
+ alias_method :===, :==
11
+
12
+ def eql?(other)
13
+ __compare_all__? other, :eql?
14
+ end
15
+
16
+ # @return [Integer]
17
+ def hash
18
+ @db.hash
19
+ end
20
+
21
+ private
22
+
23
+ # @param [Symbol] method
24
+ def __compare_all__?(other, method)
25
+ other.instance_of?(self.class) && each_pair.all?{|k, v|v.__send__ method, other[k]}
26
+ end
27
+
28
+ # @endgroup
29
+
30
+ end; end
@@ -1,14 +1,14 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Default Value
4
-
5
- # @param [Symbol, String] name
6
- def default?(name)
7
- autonym = autonym_for name
8
-
9
- default_for(autonym) == self[autonym]
10
- end
11
-
12
- # @endgroup
13
-
1
+ class Striuct; module InstanceMethods
2
+
3
+ # @group Default Value
4
+
5
+ # @param [Symbol, String] name
6
+ def default?(name)
7
+ autonym = autonym_for name
8
+
9
+ default_for(autonym) == self[autonym]
10
+ end
11
+
12
+ # @endgroup
13
+
14
14
  end; end
@@ -1,28 +1,28 @@
1
- require 'forwardable'
2
-
3
- class Striuct; module InstanceMethods
4
-
5
- extend Forwardable
6
-
7
- # Forwardable has public/protected class_macro
8
- private_class_method(*Forwardable.instance_methods)
9
-
10
- # @group Delegate Class Methods
11
-
12
- def_delegators :'self.class',
13
- :_autonyms,
14
- :keyable_for, :autonym_for, :aliases_for,
15
- :validator_for, :condition_for,
16
- :adjuster_for, :flavor_for,
17
- :members, :keys, :names, :autonyms, :all_members, :aliases,
18
- :has_member?, :member?, :has_key?, :key?,
19
- :length, :size,
20
- :restrict?, :has_validator?, :has_condition?,
21
- :safety_getter?, :safety_reader?, :safety_setter?, :safty_writer?, :inference?,
22
- :has_default?, :default_for, :has_adjuster?, :has_flavor?
23
-
24
- private :_autonyms
25
-
26
- # @endgroup
27
-
28
- end; end
1
+ require 'forwardable'
2
+
3
+ class Striuct; module InstanceMethods
4
+
5
+ extend Forwardable
6
+
7
+ # Forwardable has public/protected class_macro
8
+ private_class_method(*Forwardable.instance_methods)
9
+
10
+ # @group Delegate Class Methods
11
+
12
+ def_delegators :'self.class',
13
+ :_autonyms,
14
+ :keyable_for, :autonym_for, :aliases_for,
15
+ :validator_for, :condition_for,
16
+ :adjuster_for, :flavor_for,
17
+ :members, :keys, :names, :autonyms, :all_members, :aliases,
18
+ :has_member?, :member?, :has_key?, :key?,
19
+ :length, :size,
20
+ :restrict?, :has_validator?, :has_condition?,
21
+ :safety_getter?, :safety_reader?, :safety_setter?, :safty_writer?, :inference?,
22
+ :has_default?, :default_for, :has_adjuster?, :has_flavor?
23
+
24
+ private :_autonyms
25
+
26
+ # @endgroup
27
+
28
+ end; end