ensure_it 0.1.3 → 0.1.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.
@@ -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