striuct 0.4.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +20 -41
  4. data/lib/striuct.rb +3 -3
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +15 -13
  7. data/lib/striuct/classmethods/attributes.rb +93 -91
  8. data/lib/striuct/classmethods/conflict_management.rb +109 -106
  9. data/lib/striuct/classmethods/constructor.rb +47 -54
  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 +14 -16
  15. data/lib/striuct/classmethods/inner.rb +57 -64
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +109 -111
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -138
  20. data/lib/striuct/classmethods/requirements.rb +3 -1
  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 +36 -32
  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/keyvalidatable.rb +8 -6
  33. data/lib/striuct/instancemethods/lock.rb +46 -44
  34. data/lib/striuct/instancemethods/object.rb +50 -48
  35. data/lib/striuct/instancemethods/requirements.rb +11 -9
  36. data/lib/striuct/instancemethods/safety.rb +11 -9
  37. data/lib/striuct/instancemethods/setter.rb +46 -49
  38. data/lib/striuct/instancemethods/to_s.rb +39 -37
  39. data/lib/striuct/instancemethods/validation.rb +31 -29
  40. data/lib/striuct/instancemethods/values.rb +52 -33
  41. data/lib/striuct/requirements.rb +3 -1
  42. data/lib/striuct/singleton_class.rb +12 -17
  43. data/lib/striuct/structs.rb +3 -3
  44. metadata +48 -186
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -20
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/History.old(~0.3.n).rdoc +0 -289
  50. data/MIT-LICENSE +0 -22
  51. data/Rakefile +0 -10
  52. data/benchmark/basics.rb +0 -56
  53. data/example/README.rb +0 -53
  54. data/example/example1.rb +0 -235
  55. data/example/example2.rb +0 -22
  56. data/example/see_trace.rb +0 -32
  57. data/striuct.gemspec +0 -36
  58. data/test/helper.rb +0 -5
  59. data/test/test_sglc-constructor.rb +0 -36
  60. data/test/test_subc-c-add_members.rb +0 -13
  61. data/test/test_subc-c-close_member.rb +0 -36
  62. data/test/test_subc-c-constructor.rb +0 -92
  63. data/test/test_subc-c-copy.rb +0 -71
  64. data/test/test_subc-c-freeze.rb +0 -36
  65. data/test/test_subc-c-inheritable.rb +0 -58
  66. data/test/test_subc-c-safety_naming.rb +0 -73
  67. data/test/test_subc-f-alias_member.rb +0 -54
  68. data/test/test_subc-f-enum.rb +0 -139
  69. data/test/test_subc-f-predicate.rb +0 -711
  70. data/test/test_subc-f-to_struct.rb +0 -61
  71. data/test/test_subc-f-validation_util.rb +0 -59
  72. data/test/test_subc-f_debug.rb +0 -39
  73. data/test/test_subc-f_name.rb +0 -525
  74. data/test/test_subc-i-accessor.rb +0 -138
  75. data/test/test_subc-i-adjuster.rb +0 -95
  76. data/test/test_subc-i-assign.rb +0 -53
  77. data/test/test_subc-i-basic.rb +0 -32
  78. data/test/test_subc-i-cast.rb +0 -27
  79. data/test/test_subc-i-compare.rb +0 -52
  80. data/test/test_subc-i-copy.rb +0 -23
  81. data/test/test_subc-i-default_value.rb +0 -129
  82. data/test/test_subc-i-freeze.rb +0 -19
  83. data/test/test_subc-i-hashlike.rb +0 -144
  84. data/test/test_subc-i-keyvalidatable.rb +0 -25
  85. data/test/test_subc-i-lock.rb +0 -40
  86. data/test/test_subc-i-must.rb +0 -30
  87. data/test/test_subc-i-to_s_family.rb +0 -26
  88. data/test/test_subc-i-validation_inference.rb +0 -51
  89. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  90. data/test/test_subc-i-validation_with_getter.rb +0 -33
  91. data/test/test_version.rb +0 -13
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c59316edafe027980857f258404996caaee0be26a0ad3265acee3cb067477db6
4
+ data.tar.gz: '086afe2f12bb06050cd7964a774fd087e6a7a710f0d54fe6bb3c4e647490e2d7'
5
+ SHA512:
6
+ metadata.gz: 86c436676285e90dbafd4e1f9293b5cccfda99ce060e07a38893f4f0979c4c9f0b7c1c41da63e10ee479ff1323fa0f585c92113929bce766b072e577dc95b8cb
7
+ data.tar.gz: 0fca1e67d31013254edeb00043cf42699a3845b83bd4979db8623d0ef2786daff07db0ced0dcda068f297e1d577fca063703592f65242c26d793a3e17e9fb786
data/MIT-LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2011 Kenichi Kamiya
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  striuct
2
2
  =======
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/kachick/striuct.png)](http://travis-ci.org/kachick/striuct)
4
+ ![Build Status](https://github.com/kachick/striuct/actions/workflows/test_behaviors.yml/badge.svg?branch=main)
5
5
  [![Gem Version](https://badge.fury.io/rb/striuct.png)](http://badge.fury.io/rb/striuct)
6
6
 
7
7
  Description
@@ -25,7 +25,7 @@ Features
25
25
  * Member aliasing
26
26
  * Inheritable
27
27
  * Handling between nil <-> unassigned
28
- * More flendly API for Hash
28
+ * Similar API for Hash
29
29
 
30
30
  ### Onepoint
31
31
 
@@ -35,17 +35,26 @@ Features
35
35
  Usage
36
36
  -----
37
37
 
38
+ Require Ruby 2.6 or later
39
+
40
+ Add this line to your `Gemfile`
41
+
42
+ ```ruby
43
+ gem 'striuct', '>= 0.7.0', '< 0.8.0'
44
+ ```
45
+
38
46
  ### Overview - Case 1
39
47
 
40
48
  ```ruby
41
49
  require 'striuct'
42
50
 
43
51
  class Person < Striuct
44
- member :fullname, AND(String, /\A.+\z/) # Flexible Validation
45
- alias_member :name, :fullname # Use other name
52
+ member :full_name, AND(String, /\A.+\z/) # Flexible Validation
53
+ alias_member :name, :full_name # Use other name
46
54
  end
47
55
 
48
- class User < Person # Inheritable
56
+ # Inheritable
57
+ class User < Person
49
58
  member :id, Integer, # Looks typed validation
50
59
  default_proc: ->{User.next_id} # With default value
51
60
 
@@ -56,26 +65,26 @@ class User < Person # Inheritable
56
65
  end
57
66
 
58
67
  john = User.new 'john'
59
- john[:name] #=> 'john'
68
+ john[:name] #=> 'john'
60
69
  john.name = '' #=> Exception # Validate with setter
61
70
  john.id #=> 1
62
71
  ken = User[name: 'ken'] # Construct from hash
63
72
  ken.id #=> 2
64
73
  ```
74
+
65
75
  ### Overview - Case 2
66
76
 
67
77
  ```ruby
68
78
  class Foo < Striuct
69
79
  member :foo
70
- member :bar, Numeric, # First validation under Numeric
71
- inference: true # And use inference Validation
80
+ member :bar, Numeric
72
81
  member :with_adjuster, Integer,
73
82
  &->v{Integer v} # Use adjuster before a setter
74
83
  end
75
84
 
76
85
  foo = Foo.new
77
86
 
78
- # nil <-> unaasigned
87
+ # nil <-> unassigned
79
88
  foo.foo #=> nil
80
89
  foo.assigned?(:foo) #=> false
81
90
  foo.foo = nil
@@ -85,7 +94,6 @@ foo.assigned?(:foo) #=> true
85
94
  foo.lock(:foo)
86
95
  foo.foo = nil #=> error
87
96
 
88
- # Inference Validation
89
97
  foo.bar = 1.2 #=> pass # memorize 1.2's class is Float
90
98
  foo.bar = 1 #=> error # 1 is not Float
91
99
 
@@ -104,37 +112,8 @@ end
104
112
  UseMustOption.new #=> InvalidOperationError "`foo` require a value under `must` option "
105
113
  ```
106
114
 
107
-
108
- ### How to build flexible conditions ?
109
-
110
- * That from validation library.
111
- See the [validation-API](http://kachick.github.com/validation/yard/frames.html)
112
-
113
- Requirements
114
- -------------
115
-
116
- * Ruby - [1.9.2 or later](http://travis-ci.org/#!/kachick/striuct)
117
-
118
- Install
119
- -------
120
-
121
- ```bash
122
- gem install striuct
123
- ```
124
-
125
115
  Link
126
116
  ----
127
117
 
128
- * [code](https://github.com/kachick/striuct)
129
- * [wiki](https://github.com/kachick/striuct/wiki)
130
- * [API](http://kachick.github.com/striuct/yard/frames.html)
131
- * [issues](https://github.com/kachick/striuct/issues)
132
- * [CI](http://travis-ci.org/#!/kachick/striuct)
133
- * [gem](https://rubygems.org/gems/striuct)
134
-
135
- License
136
- --------
137
-
138
- The MIT X11 License
139
- Copyright (c) 2011 Kenichi Kamiya
140
- See MIT-LICENSE for further details.
118
+ * [Repository](https://github.com/kachick/striuct)
119
+ * [API documents](https://kachick.github.io/striuct/)
data/lib/striuct.rb CHANGED
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # striuct - Struct++
2
4
  # Copyright (c) 2011-2012 Kenichi Kamiya
3
5
 
4
6
  # @abstract
5
7
  class Striuct
6
-
7
8
  class Error < StandardError; end
8
9
  class InvalidOperationError < Error; end
9
-
10
10
  end
11
11
 
12
- require_relative 'striuct/requirements'
12
+ require_relative 'striuct/requirements'
@@ -1,10 +1,10 @@
1
1
  Note
2
2
  =====
3
3
 
4
- This dir's tree is diveded under roles/features.
4
+ This dir's tree is divided under roles/features.
5
5
  Not only divided by CONSTANT names.
6
6
 
7
7
  CONSTANT
8
8
  --------
9
9
 
10
- * attributes - Attributes
10
+ * attributes - Attributes
@@ -1,15 +1,17 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Adjuster
4
-
5
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
6
- def adjuster_for(key)
7
- autonym = autonym_for_key key
8
- raise KeyError unless with_adjuster? autonym
9
-
10
- _attributes_for(autonym).adjuster
11
- end
1
+ # frozen_string_literal: true
2
+
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Adjuster
12
6
 
13
- # @endgroup
7
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
8
+ def adjuster_for(key)
9
+ autonym = autonym_for_key(key)
10
+ raise KeyError unless with_adjuster?(autonym)
14
11
 
15
- end; end
12
+ _attributes_for(autonym).adjuster
13
+ end
14
+
15
+ # @endgroup
16
+ end
17
+ end
@@ -1,114 +1,116 @@
1
- class Striuct; module ClassMethods
2
-
3
- # Attributes for autonym of each member
4
- class Attributes
5
-
6
- VALUES = [ :condition,
7
- :adjuster ].freeze
8
-
9
- BOOLEANS = [ :inference,
10
- :must,
11
- :safety_setter,
12
- :safety_getter ].freeze
13
-
14
- def initialize
15
- @hash = { inference: false,
16
- must: false,
17
- safety_setter: false,
18
- safety_getter: false }
19
- end
20
-
21
- VALUES.each do |role|
22
- define_method :"with_#{role}?" do
23
- @hash.has_key? role
1
+ # frozen_string_literal: true
2
+
3
+ class Striuct
4
+ module ClassMethods
5
+ # Attributes for autonym of each member
6
+ class Attributes
7
+ VALUES = [:condition,
8
+ :adjuster].freeze
9
+
10
+ BOOLEANS = [
11
+ :must,
12
+ :safety_setter,
13
+ :safety_getter
14
+ ].freeze
15
+
16
+ def initialize
17
+ @hash = {
18
+ must: false,
19
+ safety_setter: false,
20
+ safety_getter: false
21
+ }
24
22
  end
25
-
26
- define_method role do
27
- @hash.fetch role
23
+
24
+ VALUES.each do |role|
25
+ define_method :"with_#{role}?" do
26
+ @hash.key?(role)
27
+ end
28
+
29
+ define_method role do
30
+ @hash.fetch(role)
31
+ end
28
32
  end
29
- end
30
33
 
31
- def condition=(condition)
32
- unless ::Validation.conditionable? condition
33
- raise TypeError, 'wrong object for condition'
34
+ def condition=(condition)
35
+ unless ::Validation.conditionable?(condition)
36
+ raise TypeError, 'wrong object for condition'
37
+ end
38
+
39
+ @hash[:condition] = condition
34
40
  end
35
41
 
36
- @hash[:condition] = condition
37
- end
42
+ def adjuster=(adjuster)
43
+ unless ::Validation.adjustable?(adjuster)
44
+ raise ArgumentError, 'wrong object for adjuster'
45
+ end
38
46
 
39
- def adjuster=(adjuster)
40
- unless ::Validation.adjustable? adjuster
41
- raise ArgumentError, 'wrong object for adjuster'
47
+ @hash[:adjuster] = adjuster
42
48
  end
43
49
 
44
- @hash[:adjuster] = adjuster
45
- end
50
+ BOOLEANS.each do |role|
51
+ define_method :"with_#{role}?" do
52
+ @hash.fetch(role)
53
+ end
54
+
55
+ define_method :"#{role}=" do |arg|
56
+ raise TypeError unless arg.equal?(true) || arg.equal?(false)
46
57
 
47
- BOOLEANS.each do |role|
48
- define_method :"with_#{role}?" do
49
- @hash.fetch role
58
+ @hash[role] = arg
59
+ end
50
60
  end
51
-
52
- define_method :"#{role}=" do |arg|
53
- raise TypeError unless arg.equal?(true) or arg.equal?(false)
54
61
 
55
- @hash[role] = arg
56
- end
57
- end
62
+ def with_default?
63
+ @hash.key?(:default_value)
64
+ end
58
65
 
59
- def with_default?
60
- @hash.has_key? :default_value
61
- end
66
+ def default_value
67
+ @hash.fetch(:default_value)
68
+ end
62
69
 
63
- def default_value
64
- @hash.fetch :default_value
65
- end
70
+ def default_type
71
+ @hash.fetch(:default_type)
72
+ end
66
73
 
67
- def default_type
68
- @hash.fetch :default_type
69
- end
74
+ # @param [Symbol] type - :value / :lazy
75
+ def set_default(value, type)
76
+ raise TypeError unless type.equal?(:value) || type.equal?(:lazy)
70
77
 
71
- # @param [Symbol] type - :value / :lazy
72
- def set_default(value, type)
73
- raise TypeError unless type.equal?(:value) or type.equal?(:lazy)
74
- check_default_lazy_proc value if type.equal?(:lazy)
75
-
76
- @hash[:default_type] = type
77
- @hash[:default_value] = value
78
- end
78
+ check_default_lazy_proc(value) if type.equal?(:lazy)
79
79
 
80
- def check_default_lazy_proc(_proc)
81
- raise TypeError unless _proc.respond_to? :call
82
- arity = _proc.arity
83
- unless arity <= 2
84
- raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
80
+ @hash[:default_type] = type
81
+ @hash[:default_value] = value
85
82
  end
86
- end
87
83
 
88
- def freeze
89
- ret = super
90
- @hash.freeze
91
- ret
92
- end
84
+ def check_default_lazy_proc(proc)
85
+ raise TypeError unless proc.respond_to?(:call)
93
86
 
94
- def dup
95
- ret = super
96
- @hash = @hash.dup
97
- ret
98
- end
99
-
100
- private
101
-
102
- def initialize_copy(original)
103
- ret = super original
104
- @hash = @hash.dup
105
- ret
106
- end
87
+ arity = proc.arity
88
+ unless arity <= 2
89
+ raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
90
+ end
91
+ end
107
92
 
108
- end
93
+ def freeze
94
+ ret = super
95
+ @hash.freeze
96
+ ret
97
+ end
98
+
99
+ def dup
100
+ ret = super
101
+ @hash = @hash.dup
102
+ ret
103
+ end
104
+
105
+ private
106
+
107
+ def initialize_copy(original)
108
+ ret = super(original)
109
+ @hash = @hash.dup
110
+ ret
111
+ end
112
+ end
109
113
 
110
- if respond_to? :private_constant
111
114
  private_constant :Attributes
112
115
  end
113
-
114
- end; end
116
+ end
@@ -1,112 +1,115 @@
1
- class Striuct; module ClassMethods
2
-
3
- # @group Member Conflict Management
4
-
5
- # @return [Hash] Symbol => Fixnum
6
- NAMING_RISKS = {
7
- conflict: 10,
8
- no_identifier: 9,
9
- bad_manners: 5,
10
- no_ascii: 3,
11
- strict: 0
12
- }.freeze
13
-
14
- # @return [Hash] Symbol => Hash
15
- CONFLICT_MANAGEMENT_LEVELS = {
16
- struct: {error: 99, warn: 99},
17
- warning: {error: 99, warn: 5},
18
- error: {error: 9, warn: 5},
19
- prevent: {error: 5, warn: 1},
20
- nervous: {error: 1, warn: 1}
21
- }.each(&:freeze).freeze
22
-
23
- # @return [Symbol]
24
- DEFAULT_CONFLICT_MANAGEMENT_LEVEL = :prevent
25
-
26
- # @param [Object] name
27
- # accpeptable the name into own member, under protect level of runtime
28
- def cname?(name)
29
- _check_safety_naming(name.to_sym){|r|r}
30
- rescue Exception
31
- false
32
- end
33
-
34
- attr_reader :conflict_management_level
35
-
36
- private
37
-
38
- # @param [Symbol, String, #to_sym] level
39
- # @return [Symbol] level
40
- # change level of management conflict member names
41
- def set_conflict_management_level(level)
42
- level = level.to_sym
43
- raise NameError unless CONFLICT_MANAGEMENT_LEVELS.has_key? level
44
-
45
- @conflict_management_level = level
46
- end
1
+ # frozen_string_literal: true
47
2
 
48
- # @param [Symbol, String, #to_sym] level
49
- # @see [#set_conflict_management_level]
50
- # @yieldreturn [self]
51
- # @return [void]
52
- # @raise [ArgumentError] if no block given
53
- # temp scope of a conflict_management_level
54
- def conflict_management(level=DEFAULT_CONFLICT_MANAGEMENT_LEVEL)
55
- before = @conflict_management_level
56
- set_conflict_management_level level
57
-
58
- yield
59
- ensure
60
- @conflict_management_level = before
61
- self
62
- end
63
-
64
- # @param [Symbol] name
65
- # @return [void]
66
- # @yieldreturn [Boolean]
67
- def _check_safety_naming(name)
68
- estimation = _estimate_naming name
69
- risk = NAMING_RISKS.fetch estimation
70
- plevels = CONFLICT_MANAGEMENT_LEVELS.fetch @conflict_management_level
71
- caution = "undesirable naming '#{name}', because #{estimation}"
72
-
73
- r = (
74
- case
75
- when risk >= plevels.fetch(:error)
76
- raise NameError, caution unless block_given?
77
- false
78
- when risk >= plevels.fetch(:warn)
79
- warn caution unless block_given?
80
- false
81
- else
82
- true
83
- end
84
- )
3
+ class Striuct
4
+ module ClassMethods
5
+ # @group Member Conflict Management
85
6
 
86
- yield r if block_given?
87
- end
88
-
89
- # @param [Symbol] name
90
- # @return [Symbol]
91
- def _estimate_naming(name)
92
- if (instance_methods + private_instance_methods).include? name
93
- return :conflict
7
+ # @return [Hash] Symbol => Fixnum
8
+ NAMING_RISKS = {
9
+ conflict: 10,
10
+ no_identifier: 9,
11
+ bad_manners: 5,
12
+ no_ascii: 3,
13
+ strict: 0
14
+ }.freeze
15
+
16
+ # @return [Hash] Symbol => Hash
17
+ CONFLICT_MANAGEMENT_LEVELS = {
18
+ struct: { error: 99, warn: 99 },
19
+ warning: { error: 99, warn: 5 },
20
+ error: { error: 9, warn: 5 },
21
+ prevent: { error: 5, warn: 1 },
22
+ nervous: { error: 1, warn: 1 }
23
+ }.each(&:freeze).freeze
24
+
25
+ # @return [Symbol]
26
+ DEFAULT_CONFLICT_MANAGEMENT_LEVEL = :prevent
27
+
28
+ # @param [Object] name
29
+ # acceptable the name into own member, under protect level of runtime
30
+ def cname?(name)
31
+ _check_safety_naming(name.to_sym) { |r| r }
32
+ rescue Exception
33
+ false
94
34
  end
95
35
 
96
- return :no_ascii unless name.encoding.equal? Encoding::ASCII
97
-
98
- case name
99
- when /[\W]/, /\A[^a-zA-Z_]/, :''
100
- :no_identifier
101
- when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
102
- :bad_manners
103
- when /\A[a-zA-Z_]\w*\z/
104
- :strict
105
- else
106
- raise 'must not happen'
36
+ attr_reader :conflict_management_level
37
+
38
+ private
39
+
40
+ # @param [Symbol, String, #to_sym] level
41
+ # @return [Symbol] level
42
+ # change level of management conflict member names
43
+ def set_conflict_management_level(level)
44
+ level = level.to_sym
45
+ raise NameError unless CONFLICT_MANAGEMENT_LEVELS.key?(level)
46
+
47
+ @conflict_management_level = level
107
48
  end
108
- end
109
-
110
- # @endgroup
111
49
 
112
- end; end
50
+ # @param [Symbol, String, #to_sym] level
51
+ # @see [#set_conflict_management_level]
52
+ # @yieldreturn [self]
53
+ # @return [void]
54
+ # @raise [ArgumentError] if no block given
55
+ # temp scope of a conflict_management_level
56
+ def conflict_management(level=DEFAULT_CONFLICT_MANAGEMENT_LEVEL)
57
+ before = @conflict_management_level
58
+ set_conflict_management_level(level)
59
+
60
+ yield
61
+ ensure
62
+ @conflict_management_level = before
63
+ self
64
+ end
65
+
66
+ # @param [Symbol] name
67
+ # @return [void]
68
+ # @yieldreturn [Boolean]
69
+ def _check_safety_naming(name)
70
+ estimation = _estimate_naming(name)
71
+ risk = NAMING_RISKS.fetch(estimation)
72
+ plevels = CONFLICT_MANAGEMENT_LEVELS.fetch(@conflict_management_level)
73
+ caution = "undesirable naming '#{name}', because #{estimation}"
74
+
75
+ r = (
76
+ case
77
+ when risk >= plevels.fetch(:error)
78
+ raise NameError, caution unless block_given?
79
+
80
+ false
81
+ when risk >= plevels.fetch(:warn)
82
+ warn(caution) unless block_given?
83
+ false
84
+ else
85
+ true
86
+ end
87
+ )
88
+
89
+ yield r if block_given?
90
+ end
91
+
92
+ # @param [Symbol] name
93
+ # @return [Symbol]
94
+ def _estimate_naming(name)
95
+ if (instance_methods + private_instance_methods).include?(name)
96
+ return :conflict
97
+ end
98
+
99
+ return :no_ascii unless name.encoding.equal?(Encoding::ASCII)
100
+
101
+ case name
102
+ when /\W/, /\A[^a-zA-Z_]/, :''
103
+ :no_identifier
104
+ when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
105
+ :bad_manners
106
+ when /\A[a-zA-Z_]\w*\z/
107
+ :strict
108
+ else
109
+ raise 'must not happen'
110
+ end
111
+ end
112
+
113
+ # @endgroup
114
+ end
115
+ end