striuct 0.6.1 → 0.7.0

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +19 -39
  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 +94 -92
  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 +15 -15
  15. data/lib/striuct/classmethods/inner.rb +57 -55
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +110 -106
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -129
  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 +35 -33
  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 -45
  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 +50 -48
  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 +33 -178
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -17
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/MIT-LICENSE +0 -22
  50. data/Rakefile +0 -11
  51. data/benchmark/basics.rb +0 -56
  52. data/example/README.rb +0 -50
  53. data/example/example1.rb +0 -195
  54. data/example/example2.rb +0 -20
  55. data/example/see_trace.rb +0 -32
  56. data/striuct.gemspec +0 -45
  57. data/test/helper.rb +0 -3
  58. data/test/test_sglc-constructor.rb +0 -36
  59. data/test/test_subc-c-add_members.rb +0 -13
  60. data/test/test_subc-c-close_member.rb +0 -36
  61. data/test/test_subc-c-constructor.rb +0 -92
  62. data/test/test_subc-c-copy.rb +0 -71
  63. data/test/test_subc-c-freeze.rb +0 -36
  64. data/test/test_subc-c-inheritable.rb +0 -58
  65. data/test/test_subc-c-safety_naming.rb +0 -73
  66. data/test/test_subc-f-alias_member.rb +0 -54
  67. data/test/test_subc-f-enum.rb +0 -159
  68. data/test/test_subc-f-predicate.rb +0 -647
  69. data/test/test_subc-f-to_struct.rb +0 -61
  70. data/test/test_subc-f-validation_util.rb +0 -59
  71. data/test/test_subc-f_debug.rb +0 -39
  72. data/test/test_subc-f_name.rb +0 -525
  73. data/test/test_subc-i-accessor.rb +0 -138
  74. data/test/test_subc-i-adjuster.rb +0 -95
  75. data/test/test_subc-i-assign.rb +0 -53
  76. data/test/test_subc-i-basic.rb +0 -43
  77. data/test/test_subc-i-cast.rb +0 -27
  78. data/test/test_subc-i-compare.rb +0 -52
  79. data/test/test_subc-i-copy.rb +0 -23
  80. data/test/test_subc-i-default_value.rb +0 -129
  81. data/test/test_subc-i-freeze.rb +0 -19
  82. data/test/test_subc-i-hashlike.rb +0 -144
  83. data/test/test_subc-i-keyvalidatable.rb +0 -25
  84. data/test/test_subc-i-lock.rb +0 -40
  85. data/test/test_subc-i-must.rb +0 -30
  86. data/test/test_subc-i-to_s_family.rb +0 -26
  87. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  88. data/test/test_subc-i-validation_with_getter.rb +0 -33
  89. data/test/test_version.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a5238390f14805baa497d1cd3acec45fc10faa233ce94af4782aa5570606b56
4
- data.tar.gz: e703ea310209502b772938d9eee312e26fcfdec30189c41e071107b125574ebb
3
+ metadata.gz: c59316edafe027980857f258404996caaee0be26a0ad3265acee3cb067477db6
4
+ data.tar.gz: '086afe2f12bb06050cd7964a774fd087e6a7a710f0d54fe6bb3c4e647490e2d7'
5
5
  SHA512:
6
- metadata.gz: 4650584be9988e6f8ed9b1a58cfa5912d099aed4377e035750ee158216fa8bc06c46c53386bc5b1188dd302847112c337d750ac1a103810bd83ab25ae5f920c4
7
- data.tar.gz: 3edc0199746228322c017bf8eefc619352a53882cf908d9e525392faaa43a5314ec37529ce97cfc7b40917d2dbca5da393cb5580b3d8c1ae673cdeea22efdf42
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,9 +1,8 @@
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
- [![Dependency Status](https://gemnasium.com/kachick/striuct.svg)](https://gemnasium.com/kachick/striuct)
7
6
 
8
7
  Description
9
8
  -----------
@@ -26,7 +25,7 @@ Features
26
25
  * Member aliasing
27
26
  * Inheritable
28
27
  * Handling between nil <-> unassigned
29
- * More flendly API for Hash
28
+ * Similar API for Hash
30
29
 
31
30
  ### Onepoint
32
31
 
@@ -36,17 +35,26 @@ Features
36
35
  Usage
37
36
  -----
38
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
+
39
46
  ### Overview - Case 1
40
47
 
41
48
  ```ruby
42
49
  require 'striuct'
43
50
 
44
51
  class Person < Striuct
45
- member :fullname, AND(String, /\A.+\z/) # Flexible Validation
46
- 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
47
54
  end
48
55
 
49
- class User < Person # Inheritable
56
+ # Inheritable
57
+ class User < Person
50
58
  member :id, Integer, # Looks typed validation
51
59
  default_proc: ->{User.next_id} # With default value
52
60
 
@@ -57,12 +65,13 @@ class User < Person # Inheritable
57
65
  end
58
66
 
59
67
  john = User.new 'john'
60
- john[:name] #=> 'john'
68
+ john[:name] #=> 'john'
61
69
  john.name = '' #=> Exception # Validate with setter
62
70
  john.id #=> 1
63
71
  ken = User[name: 'ken'] # Construct from hash
64
72
  ken.id #=> 2
65
73
  ```
74
+
66
75
  ### Overview - Case 2
67
76
 
68
77
  ```ruby
@@ -75,7 +84,7 @@ 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
@@ -103,37 +112,8 @@ end
103
112
  UseMustOption.new #=> InvalidOperationError "`foo` require a value under `must` option "
104
113
  ```
105
114
 
106
-
107
- ### How to build flexible conditions ?
108
-
109
- * That from validation library.
110
- See the [validation-API](http://kachick.github.com/validation/yard/frames.html)
111
-
112
- Requirements
113
- -------------
114
-
115
- * Ruby - [2.2 or later](http://travis-ci.org/#!/kachick/striuct)
116
-
117
- Install
118
- -------
119
-
120
- ```bash
121
- gem install striuct
122
- ```
123
-
124
115
  Link
125
116
  ----
126
117
 
127
- * [Code](https://github.com/kachick/striuct)
128
- * [Wiki](https://github.com/kachick/striuct/wiki)
129
- * [API](http://www.rubydoc.info/github/kachick/striuct)
130
- * [Issues](https://github.com/kachick/striuct/issues)
131
- * [CI](http://travis-ci.org/#!/kachick/striuct)
132
- * [gem](https://rubygems.org/gems/striuct)
133
-
134
- License
135
- --------
136
-
137
- The MIT X11 License
138
- Copyright (c) 2011 Kenichi Kamiya
139
- 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 = [
10
- :must,
11
- :safety_setter,
12
- :safety_getter
13
- ].freeze
14
-
15
- def initialize
16
- @hash = {
17
- must: false,
18
- safety_setter: false,
19
- safety_getter: false
20
- }
21
- end
22
-
23
- VALUES.each do |role|
24
- define_method :"with_#{role}?" do
25
- @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
+ }
26
22
  end
27
-
28
- define_method role do
29
- @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
30
32
  end
31
- end
32
33
 
33
- def condition=(condition)
34
- unless ::Validation.conditionable? condition
35
- 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
36
40
  end
37
41
 
38
- @hash[:condition] = condition
39
- end
42
+ def adjuster=(adjuster)
43
+ unless ::Validation.adjustable?(adjuster)
44
+ raise ArgumentError, 'wrong object for adjuster'
45
+ end
40
46
 
41
- def adjuster=(adjuster)
42
- unless ::Validation.adjustable? adjuster
43
- raise ArgumentError, 'wrong object for adjuster'
47
+ @hash[:adjuster] = adjuster
44
48
  end
45
49
 
46
- @hash[:adjuster] = adjuster
47
- 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)
48
57
 
49
- BOOLEANS.each do |role|
50
- define_method :"with_#{role}?" do
51
- @hash.fetch role
58
+ @hash[role] = arg
59
+ end
52
60
  end
53
-
54
- define_method :"#{role}=" do |arg|
55
- raise TypeError unless arg.equal?(true) or arg.equal?(false)
56
61
 
57
- @hash[role] = arg
58
- end
59
- end
62
+ def with_default?
63
+ @hash.key?(:default_value)
64
+ end
60
65
 
61
- def with_default?
62
- @hash.has_key? :default_value
63
- end
66
+ def default_value
67
+ @hash.fetch(:default_value)
68
+ end
64
69
 
65
- def default_value
66
- @hash.fetch :default_value
67
- end
70
+ def default_type
71
+ @hash.fetch(:default_type)
72
+ end
68
73
 
69
- def default_type
70
- @hash.fetch :default_type
71
- end
74
+ # @param [Symbol] type - :value / :lazy
75
+ def set_default(value, type)
76
+ raise TypeError unless type.equal?(:value) || type.equal?(:lazy)
72
77
 
73
- # @param [Symbol] type - :value / :lazy
74
- def set_default(value, type)
75
- raise TypeError unless type.equal?(:value) or type.equal?(:lazy)
76
- check_default_lazy_proc value if type.equal?(:lazy)
77
-
78
- @hash[:default_type] = type
79
- @hash[:default_value] = value
80
- end
78
+ check_default_lazy_proc(value) if type.equal?(:lazy)
81
79
 
82
- def check_default_lazy_proc(_proc)
83
- raise TypeError unless _proc.respond_to? :call
84
- arity = _proc.arity
85
- unless arity <= 2
86
- raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
80
+ @hash[:default_type] = type
81
+ @hash[:default_value] = value
87
82
  end
88
- end
89
83
 
90
- def freeze
91
- ret = super
92
- @hash.freeze
93
- ret
94
- end
84
+ def check_default_lazy_proc(proc)
85
+ raise TypeError unless proc.respond_to?(:call)
95
86
 
96
- def dup
97
- ret = super
98
- @hash = @hash.dup
99
- ret
100
- end
101
-
102
- private
103
-
104
- def initialize_copy(original)
105
- ret = super original
106
- @hash = @hash.dup
107
- ret
108
- 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
109
92
 
110
- 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
111
104
 
112
- private_constant :Attributes
105
+ private
113
106
 
114
- end; end
107
+ def initialize_copy(original)
108
+ ret = super(original)
109
+ @hash = @hash.dup
110
+ ret
111
+ end
112
+ end
113
+
114
+ private_constant :Attributes
115
+ 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