ensure_it 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,66 +4,73 @@ module EnsureIt
4
4
  default
5
5
  end
6
6
 
7
- def ensure_symbol!(default: nil, **opts)
8
- EnsureIt.raise_error(
9
- :ensure_symbol!,
10
- **EnsureIt.ensure_symbol_error_options(**opts)
11
- )
7
+ def ensure_symbol!(**opts)
8
+ EnsureIt.raise_error(:ensure_symbol!,
9
+ **EnsureIt.ensure_symbol_error(**opts))
12
10
  end
13
11
  end
14
12
 
15
13
  patch String do
16
- def ensure_symbol(default: nil, values: nil, downcase: nil, **opts)
17
- value = downcase == true ? self.downcase.to_sym : to_sym
18
- if values.nil? || values.is_a?(Array) && values.include?(value)
19
- value
20
- else
21
- default
14
+ def ensure_symbol(default: nil, **opts)
15
+ return to_sym if opts.empty?
16
+ catch :wrong do
17
+ return EnsureIt.ensure_symbol(to_sym, **opts)
22
18
  end
19
+ default
23
20
  end
24
21
 
25
- def ensure_symbol!(default: nil, values: nil, downcase: nil, **opts)
26
- value = downcase == true ? self.downcase.to_sym : to_sym
27
- if values.nil? || values.is_a?(Array) && values.include?(value)
28
- return value
22
+ def ensure_symbol!(**opts)
23
+ return to_sym if opts.empty?
24
+ catch :wrong do
25
+ return EnsureIt.ensure_symbol(to_sym, **opts)
29
26
  end
30
- EnsureIt.raise_error(
31
- :ensure_symbol!,
32
- **EnsureIt.ensure_symbol_error_options(**opts)
33
- )
27
+ EnsureIt.raise_error(:ensure_symbol!,
28
+ **EnsureIt.ensure_symbol_error(**opts))
34
29
  end
35
30
  end
36
31
 
37
32
  patch Symbol do
38
- def ensure_symbol(default: nil, values: nil, downcase: nil, **opts)
39
- value = downcase == true ? self.to_s.downcase.to_sym : self
40
- if values.nil? || values.is_a?(Array) && values.include?(value)
41
- value
42
- else
43
- default
33
+ def ensure_symbol(default: nil, **opts)
34
+ return self if opts.empty?
35
+ catch :wrong do
36
+ return EnsureIt.ensure_symbol(self, **opts)
44
37
  end
38
+ default
45
39
  end
46
40
 
47
- def ensure_symbol!(default: nil, values: nil, downcase: nil, **opts)
48
- value = downcase == true ? self.to_s.downcase.to_sym : self
49
- if values.nil? || values.is_a?(Array) && values.include?(value)
50
- return value
41
+ def ensure_symbol!(default: nil, **opts)
42
+ return self if opts.empty?
43
+ catch :wrong do
44
+ return EnsureIt.ensure_symbol(self, **opts)
51
45
  end
52
- EnsureIt.raise_error(
53
- :ensure_symbol!,
54
- **EnsureIt.ensure_symbol_error_options(**opts)
46
+ EnsureIt.raise_error(:ensure_symbol!,
47
+ **EnsureIt.ensure_symbol_error(**opts))
48
+ end
49
+ end
50
+
51
+ def self.ensure_symbol(sym, values: nil, downcase: nil, name_of: nil, **opts)
52
+ if name_of.nil?
53
+ value = downcase == true ? sym.to_s.downcase.to_sym : sym
54
+ else
55
+ value = EnsureIt::StringUtils.ensure_name(
56
+ sym.to_s, downcase: downcase, name_of: name_of, **opts
55
57
  )
58
+ throw :wrong if value.nil?
59
+ value = value.to_sym
56
60
  end
61
+ throw :wrong if values.is_a?(Array) && !values.include?(value)
62
+ value
57
63
  end
58
64
 
59
- def self.ensure_symbol_error_options(**opts)
60
- unless opts.key?(opts[:message])
61
- opts[:message] = '#{subject} should be' +
62
- if opts[:values].is_a?(Array)
63
- " one of #{opts[:values]}"
64
- else
65
- ' a Symbol or a String'
66
- end
65
+ def self.ensure_symbol_error(**opts)
66
+ unless opts.key?(:message)
67
+ opts[:message] = '#{subject} should be a Symbol or a String'
68
+ if opts.key?(:name_of)
69
+ opts[:message] << " and should be a name of #{opts[:name_of]}"
70
+ end
71
+ if opts[:values].is_a?(Array)
72
+ opts[:message] << " and should contained in #{opts[:values]}"
73
+ end
67
74
  end
68
75
  opts
69
76
  end
@@ -59,8 +59,8 @@ module EnsureIt
59
59
  end
60
60
  end
61
61
 
62
- def self.raise_error(method_name, message: nil, error: Error, **opts)
63
- error = Error unless error <= Exception
62
+ def self.raise_error(method_name, message: nil, error: nil, **opts)
63
+ error = EnsureIt.config.error_class if error.nil? || !(error <= Exception)
64
64
  error_msg = ErrorMessage.new(method_name, message, caller[1..-1])
65
65
  # save message in backtrace in variables to not call getter
66
66
  # methods of error_msg instance in raise call
@@ -0,0 +1,61 @@
1
+ module EnsureIt
2
+ module StringUtils
3
+ NAME_TYPES = %i(local instance_variable class_variable setter getter
4
+ checker bang method class)
5
+ NAME_REGEXP = /\A
6
+ (?<class_access>@{1,2})?
7
+ (?<name>[a-z_][a-zA-Z_0-9]*)
8
+ (?<modifier>[?!=])?
9
+ \z/x
10
+ CLASS_NAME_REGEXP = /\A
11
+ [A-Z][a-zA-Z_0-9]*(?:::[A-Z][a-zA-Z_0-9]*)*
12
+ \z/x
13
+ CLASS_NAME_DOWNCASE_REGEXP = /\A
14
+ [a-z][a-zA-Z_0-9]*(?:\/[a-z][a-zA-Z_0-9]*)*
15
+ \z/x
16
+
17
+ using EnsureIt if ENSURE_IT_REFINED
18
+
19
+ def self.ensure_name(str, name_of: nil, **opts)
20
+ str = str.ensure_string!
21
+ name_of = name_of.ensure_symbol(
22
+ downcase: true,
23
+ values: NAME_TYPES,
24
+ default: NAME_TYPES[0]
25
+ )
26
+ if name_of == :class
27
+ m = CLASS_NAME_REGEXP.match(str)
28
+ if m.nil?
29
+ return nil if opts[:downcase] != true
30
+ m = CLASS_NAME_DOWNCASE_REGEXP.match(str)
31
+ return nil if m.nil?
32
+ str = str
33
+ .split('/')
34
+ .map { |x| x.split('_').map(&:capitalize).join }
35
+ .join('::')
36
+ end
37
+ if opts[:exist] == true
38
+ begin
39
+ Object.const_get(str)
40
+ rescue NameError
41
+ return nil
42
+ end
43
+ end
44
+ str
45
+ else
46
+ m = NAME_REGEXP.match(str)
47
+ return nil if m.nil?
48
+ case name_of
49
+ when :local, :getter then m[:name]
50
+ when :instance_variable then '@' + m[:name]
51
+ when :class_variable then '@@' + m[:name]
52
+ when :setter then m[:name] + '='
53
+ when :checker then m[:name] + '?'
54
+ when :bang then m[:name] + '!'
55
+ when :method then m[:name] + (m[:modifier] || '')
56
+ else m[:name]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,3 +1,3 @@
1
1
  module EnsureIt
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe EnsureIt::Config do
4
- describe '::errors' do
4
+ describe '.errors' do
5
5
  after { described_class.instance_variable_set(:@errors, nil) }
6
6
 
7
7
  it 'gives :smart by default' do
@@ -14,7 +14,7 @@ describe EnsureIt::Config do
14
14
  end
15
15
  end
16
16
 
17
- describe '::errors=' do
17
+ describe '.errors=' do
18
18
  after { described_class.instance_variable_set(:@errors, nil) }
19
19
 
20
20
  it 'allows to change value' do
@@ -27,16 +27,45 @@ describe EnsureIt::Config do
27
27
  expect(described_class.errors).to eq :smart
28
28
  end
29
29
  end
30
+
31
+ describe '.error_class' do
32
+ after { described_class.instance_variable_set(:@error_class, nil) }
33
+
34
+ it 'gives EsnureIt::Error by default' do
35
+ expect(described_class.error_class).to eq EnsureIt::Error
36
+ end
37
+
38
+ it 'calls setter if value given' do
39
+ expect(described_class).to receive(:error_class=).with(ArgumentError)
40
+ described_class.error_class ArgumentError
41
+ end
42
+ end
43
+
44
+ describe '.error_class=' do
45
+ after { described_class.instance_variable_set(:@error_class, nil) }
46
+
47
+ it 'allows to change value' do
48
+ described_class.error_class = ArgumentError
49
+ expect(described_class.error_class).to eq ArgumentError
50
+ end
51
+
52
+ it "doesn't change value to wrong classes" do
53
+ described_class.error_class = ArgumentError
54
+ described_class.error_class = Object
55
+ expect(described_class.error_class).to eq ArgumentError
56
+ end
57
+ end
58
+
30
59
  end
31
60
 
32
61
  describe EnsureIt do
33
- describe '::config' do
62
+ describe '.config' do
34
63
  it 'returns Config module' do
35
64
  expect(described_class.config).to eq EnsureIt::Config
36
65
  end
37
66
  end
38
67
 
39
- describe '::configure' do
68
+ describe '.configure' do
40
69
  it 'returns Config module' do
41
70
  expect(described_class.config).to eq EnsureIt::Config
42
71
  end
@@ -19,29 +19,27 @@ describe EnsureIt do
19
19
  expect(call_for(obj)).to eq obj
20
20
  end
21
21
 
22
- it 'compacts array with compact option' do
23
- expect(call_for([1, nil, 2], compact: true)).to eq [1, 2]
22
+ it 'compacts array with compact argument' do
23
+ expect(call_for([1, nil, 2], :compact)).to eq [1, 2]
24
24
  end
25
25
 
26
- it 'flattens array with flatten option' do
27
- expect(call_for([1, [2, 3], 4], flatten: true)).to eq [1, 2, 3, 4]
26
+ it 'flattens array with flatten argument' do
27
+ expect(call_for([1, [2, 3], 4], :flatten)).to eq [1, 2, 3, 4]
28
28
  end
29
29
 
30
- [:sorted, :ordered].each do |o|
31
- it "flattens and then sorts array with flatten and #{o} options" do
32
- expect(
33
- call_for([1, [5, 6], 4], flatten: true, o => true)
34
- ).to eq [1, 4, 5, 6]
35
- end
30
+ it 'flattens and then sorts array with flatten and sort arguments' do
31
+ expect(
32
+ call_for([1, [5, 6], 4], :flatten, :sort)
33
+ ).to eq [1, 4, 5, 6]
34
+ end
36
35
 
37
- it "sorts descending with #{o}: :desc option" do
38
- expect(call_for([1, 5, 6, 4], o => :desc)).to eq [6, 5, 4, 1]
39
- end
36
+ it 'sorts descending with sort_desc argument' do
37
+ expect(call_for([1, 5, 6, 4], :sort_desc)).to eq [6, 5, 4, 1]
40
38
  end
41
39
 
42
40
  it 'calls :ensure_* for each element' do
43
41
  arr = ['s', nil, :v]
44
- expect(call_for(arr, :ensure_symbol, compact: true)).to eq [:s, :v]
42
+ expect(call_for(arr, :ensure_symbol, :compact)).to eq [:s, :v]
45
43
  end
46
44
 
47
45
  it 'calls standard method for each element' do
@@ -53,6 +51,12 @@ describe EnsureIt do
53
51
  arr = ['s', :v]
54
52
  expect(call_for(arr, :ensure_string, :to_sym)).to eq [:s, :v]
55
53
  end
54
+
55
+ it 'selects only values, specified in values option' do
56
+ expect(
57
+ call_for([1, 5, 6, 4], values: [1, 6, 8])
58
+ ).to eq [1, 6]
59
+ end
56
60
  end
57
61
 
58
62
  describe '#ensure_array' do
@@ -21,6 +21,10 @@ describe EnsureIt do
21
21
  it 'and checks for ancestors' do
22
22
  expect(call_for(Array, Enumerable, Array)).to eq Array
23
23
  end
24
+
25
+ it 'and converts string to class with string option' do
26
+ expect(call_for('Array', string: true)).to eq Array
27
+ end
24
28
  end
25
29
 
26
30
  describe '#ensure_class' do
@@ -33,6 +33,13 @@ describe EnsureIt do
33
33
  expect(call_for(:teST, downcase: true)).to eq 'test'
34
34
  expect(call_for('teST', downcase: true)).to eq 'test'
35
35
  end
36
+
37
+ it 'and calls ensure_name with name_of option' do
38
+ expect(EnsureIt::StringUtils).to receive(:ensure_name).with(
39
+ 'test', name_of: :setter, downcase: nil
40
+ ).and_call_original
41
+ expect(call_for('test', name_of: :setter)).to eq 'test='
42
+ end
36
43
  end
37
44
 
38
45
  describe '#ensure_string' do
@@ -53,7 +60,7 @@ describe EnsureIt do
53
60
  it 'raises correct error message with :numbers option' do
54
61
  expect { call_for(nil, numbers: true) }.to raise_error(
55
62
  EnsureIt::Error,
56
- /should be a String, Symbol, Numeric or Rational/
63
+ /should be a String or a Symbol or a Numeric/
57
64
  )
58
65
  end
59
66
  end
@@ -31,6 +31,13 @@ describe EnsureIt do
31
31
  expect(call_for(:teST, downcase: true)).to eq :test
32
32
  expect(call_for('teST', downcase: true)).to eq :test
33
33
  end
34
+
35
+ it 'and calls ensure_name with name_of option' do
36
+ expect(EnsureIt::StringUtils).to receive(:ensure_name).with(
37
+ 'test', name_of: :setter, downcase: nil
38
+ ).and_call_original
39
+ expect(call_for(:test, name_of: :setter)).to eq :test=
40
+ end
34
41
  end
35
42
 
36
43
  describe '#ensure_symbol' do
@@ -10,11 +10,14 @@ end
10
10
  describe EnsureIt do
11
11
  before do
12
12
  @errors = EnsureIt.config.errors
13
+ @error_class = EnsureIt.config.error_class
13
14
  EnsureIt::Config.instance_variable_set(:@errors, nil)
15
+ EnsureIt::Config.instance_variable_set(:@error_class, nil)
14
16
  end
15
17
 
16
18
  after do
17
19
  EnsureIt::Config.instance_variable_set(:@errors, @errors)
20
+ EnsureIt::Config.instance_variable_set(:@error_class, @error_class)
18
21
  end
19
22
 
20
23
  describe '.raise_error' do
@@ -30,6 +33,13 @@ describe EnsureIt do
30
33
  }.to raise_error ArgumentError, 'test'
31
34
  end
32
35
 
36
+ it 'raises error of class, specified with error_class=' do
37
+ EnsureIt.configure { |c| c.error_class = ArgumentError }
38
+ expect {
39
+ call_error(:test_method)
40
+ }.to raise_error ArgumentError
41
+ end
42
+
33
43
  it 'raises error with callers backtrace' do
34
44
  backtrace = nil
35
45
  begin
@@ -0,0 +1,164 @@
1
+ require 'spec_helper'
2
+
3
+ describe EnsureIt::StringUtils do
4
+ describe '.ensure_name' do
5
+ NAMES = %w(local @inst_var @@class_var setter= getter checker?
6
+ bang! Object)
7
+
8
+ if ENSURE_IT_REFINED != true
9
+ it 'checks str argument' do
10
+ str = 'str'
11
+ expect(str).to receive(:ensure_string!).and_call_original
12
+ described_class.ensure_name(str)
13
+ end
14
+
15
+ it 'checks name_of option' do
16
+ str = 'str'
17
+ expect(str).to receive(:ensure_symbol).with(
18
+ downcase: true,
19
+ values: EnsureIt::StringUtils::NAME_TYPES,
20
+ default: EnsureIt::StringUtils::NAME_TYPES[0]
21
+ ).and_call_original
22
+ described_class.ensure_name('str', name_of: str)
23
+ end
24
+ end
25
+
26
+ describe 'name_of: :class' do
27
+ it 'rejects non-class-name strings' do
28
+ expect(
29
+ described_class.ensure_name('just text', name_of: :class)
30
+ ).to be_nil
31
+ expect(
32
+ described_class.ensure_name('just_text', name_of: :class)
33
+ ).to be_nil
34
+ end
35
+
36
+ it 'accpets class-name strings' do
37
+ expect(
38
+ described_class.ensure_name('Namespace::SomeClass', name_of: :class)
39
+ ).to eq 'Namespace::SomeClass'
40
+ end
41
+
42
+ it 'accpets low-cased class-name strings with downcase option' do
43
+ expect(
44
+ described_class.ensure_name(
45
+ 'low/cased_class', name_of: :class, downcase: true
46
+ )
47
+ ).to eq 'Low::CasedClass'
48
+ end
49
+
50
+ it 'rejects non-existent class names with exist option' do
51
+ expect(Object.const_defined?(:UnknownClass)).to be_false
52
+ expect(
53
+ described_class.ensure_name(
54
+ 'UnknownClass', name_of: :class, exist: true
55
+ )
56
+ ).to be_nil
57
+ expect(
58
+ described_class.ensure_name(
59
+ 'unknown_class', name_of: :class, exist: true, downcase: true
60
+ )
61
+ ).to be_nil
62
+ end
63
+
64
+ it 'accepts exists classes with exist option' do
65
+ expect(
66
+ described_class.ensure_name('Object', name_of: :class, exist: true)
67
+ ).to eq 'Object'
68
+ expect(
69
+ described_class.ensure_name(
70
+ 'object', name_of: :class, exist: true, downcase: true
71
+ )
72
+ ).to eq 'Object'
73
+ end
74
+ end
75
+
76
+ describe 'name_of: :local' do
77
+ it 'converts names to local variable name' do
78
+ expect(NAMES.map { |x|
79
+ described_class.ensure_name(x, name_of: :local)
80
+ }).to match_array(
81
+ %w(local inst_var class_var setter getter checker
82
+ bang) + [nil]
83
+ )
84
+ end
85
+ end
86
+
87
+ describe 'name_of: :instance_variable' do
88
+ it 'converts names to instance variable name' do
89
+ expect(NAMES.map { |x|
90
+ described_class.ensure_name(x, name_of: :instance_variable)
91
+ }).to match_array(
92
+ %w(@local @inst_var @class_var @setter @getter @checker
93
+ @bang) + [nil]
94
+ )
95
+ end
96
+ end
97
+
98
+ describe 'name_of: :class_variable' do
99
+ it 'converts names to class variable name' do
100
+ expect(NAMES.map { |x|
101
+ described_class.ensure_name(x, name_of: :class_variable)
102
+ }).to match_array(
103
+ %w(@@local @@inst_var @@class_var @@setter @@getter @@checker
104
+ @@bang) + [nil]
105
+ )
106
+ end
107
+ end
108
+
109
+ describe 'name_of: :setter' do
110
+ it 'converts names to setter method name' do
111
+ expect(NAMES.map { |x|
112
+ described_class.ensure_name(x, name_of: :setter)
113
+ }).to match_array(
114
+ %w(local= inst_var= class_var= setter= getter= checker=
115
+ bang=) + [nil]
116
+ )
117
+ end
118
+ end
119
+
120
+ describe 'name_of: :getter' do
121
+ it 'converts names to getter method name' do
122
+ expect(NAMES.map { |x|
123
+ described_class.ensure_name(x, name_of: :getter)
124
+ }).to match_array(
125
+ %w(local inst_var class_var setter getter checker
126
+ bang) + [nil]
127
+ )
128
+ end
129
+ end
130
+
131
+ describe 'name_of: :checker' do
132
+ it 'converts names to checker method name' do
133
+ expect(NAMES.map { |x|
134
+ described_class.ensure_name(x, name_of: :checker)
135
+ }).to match_array(
136
+ %w(local? inst_var? class_var? setter? getter? checker?
137
+ bang?) + [nil]
138
+ )
139
+ end
140
+ end
141
+
142
+ describe 'name_of: :bang' do
143
+ it 'converts names to bang method name' do
144
+ expect(NAMES.map { |x|
145
+ described_class.ensure_name(x, name_of: :bang)
146
+ }).to match_array(
147
+ %w(local! inst_var! class_var! setter! getter! checker!
148
+ bang!) + [nil]
149
+ )
150
+ end
151
+ end
152
+
153
+ describe 'name_of: :method' do
154
+ it 'converts names to method name' do
155
+ expect(NAMES.map { |x|
156
+ described_class.ensure_name(x, name_of: :method)
157
+ }).to match_array(
158
+ %w(local inst_var class_var setter= getter checker?
159
+ bang!) + [nil]
160
+ )
161
+ end
162
+ end
163
+ end
164
+ end