striuct 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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