locasms 0.1.7 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,50 +1,26 @@
1
- require 'spec_helper'
2
-
3
- describe LocaSMS::Helpers::DateTimeHelper do
4
- subject { LocaSMS::Helpers::DateTimeHelper }
5
-
6
- describe '#parse' do
7
- it 'Should call the class method' do
8
- expect(subject).to receive(:parse)
9
- .once
10
- .with(:value)
11
-
12
- subject.new.parse(:value)
13
- end
14
- end
1
+ # frozen_string_literal: true
15
2
 
16
- describe '#split' do
17
- it 'Should call the class method' do
18
- expect(subject).to receive(:split)
19
- .once
20
- .with(:value)
3
+ require 'spec_helper'
21
4
 
22
- subject.new.split(:value)
23
- end
24
- end
5
+ describe LocaSMS::Helpers::DateTimeHelper do # rubocop:disable RSpec/FilePath
6
+ subject(:helper) { described_class }
25
7
 
26
8
  describe '.parse' do
27
9
  let(:expected) { Time.parse '1977-03-14 14:12:00' }
28
10
 
29
11
  def try_for(value)
30
- subject.parse(value) == expected
12
+ helper.parse(value) == expected
31
13
  end
32
14
 
33
15
  it { try_for DateTime.parse('1977-03-14 14:12:00') }
34
- it { try_for Time.parse('1977-03-14 14:12:00') }
35
- it { try_for '1977-03-14 14:12:00' }
36
- it { try_for 227207520 }
16
+ it { try_for Time.parse('1977-03-14 14:12:00') }
17
+ it { try_for '1977-03-14 14:12:00' }
18
+ it { try_for 227_207_520 }
37
19
  end
38
20
 
39
21
  describe '.split' do
40
- it 'Should break a date into date and time' do
41
- expect(subject).to receive(:parse)
42
- .once
43
- .with(:datetime)
44
- .and_return(Time.parse('1977-03-14 14:12:00'))
45
-
46
- expect(subject.split(:datetime)).to eq(%w(14/03/1977 14:12))
22
+ it 'breaks a date into date and time' do
23
+ expect(helper.split('1977-03-14 14:12:00')).to eq(%w[14/03/1977 14:12])
47
24
  end
48
25
  end
49
-
50
- end
26
+ end
@@ -1,106 +1,92 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe LocaSMS::Numbers do
4
- subject { LocaSMS::Numbers.new }
5
-
6
- describe '.initialize' do
7
- subject do
8
- expect_any_instance_of(LocaSMS::Numbers).
9
- to receive(:evaluate).
10
- once.
11
- with([:numbers]).
12
- and_return(good: [1, 3], bad: [2, 4])
13
- LocaSMS::Numbers.new :numbers
14
- end
5
+ describe LocaSMS::Numbers do # rubocop:disable RSpec/FilePath
6
+ subject(:number_sanitizer) { described_class.new numbers }
15
7
 
16
- it { expect(subject.good).to eq([1, 3]) }
17
- it { expect(subject.bad).to eq([2, 4]) }
18
- end
8
+ let(:numbers) { '1188889999' }
19
9
 
20
10
  describe '#normalize' do
21
- it do
22
- expect(subject.normalize('+55 (11) 8888-9999')).to(
23
- eq(%w(551188889999))
11
+ it do
12
+ expect(number_sanitizer.normalize('+55 (11) 8888-9999')).to(
13
+ eq(%w[551188889999])
24
14
  )
25
15
  end
16
+
26
17
  it do
27
- expect(subject.normalize('55', ['11', '22'])).to(
28
- eq(%w(55 11 22))
18
+ expect(number_sanitizer.normalize('55', %w[11 22])).to(
19
+ eq(%w[55 11 22])
29
20
  )
30
21
  end
22
+
31
23
  it do
32
- expect(subject.normalize(['55', 'ZZ', '22'])).to(
33
- eq(%w(55 ZZ 22))
24
+ expect(number_sanitizer.normalize(%w[55 ZZ 22])).to(
25
+ eq(%w[55 ZZ 22])
34
26
  )
35
27
  end
28
+
36
29
  it do
37
- expect(subject.normalize('55,44,33', ['ZZ', '22,11'])).to(
38
- eq(%w(55 44 33 ZZ 22 11))
30
+ expect(number_sanitizer.normalize('55,44,33', ['ZZ', '22,11'])).to(
31
+ eq(%w[55 44 33 ZZ 22 11])
39
32
  )
40
33
  end
41
- it do
42
- expect(subject.normalize(55, [11, 22])).to(
43
- eq(%w(55 11 22))
34
+
35
+ it do
36
+ expect(number_sanitizer.normalize(55, [11, 22])).to(
37
+ eq(%w[55 11 22])
44
38
  )
45
39
  end
46
- it { expect(subject.normalize('Z')).to eq(['Z']) }
47
- it { expect(subject.normalize(nil)).to eq([]) }
40
+
41
+ it { expect(number_sanitizer.normalize('Z')).to eq(['Z']) }
42
+ it { expect(number_sanitizer.normalize(nil)).to eq([]) }
48
43
  end
49
44
 
50
45
  describe '#valid_number?' do
51
- it { expect(subject.valid_number?('+55 (11) 8888-9999')).to be_falsey }
52
- it { expect(subject.valid_number?('88889999')).to be_falsey }
53
- it { expect(subject.valid_number?('988889999')).to be_falsey }
54
- it { expect(subject.valid_number?('ABC')).to be_falsey }
55
- it { expect(subject.valid_number?('')).to be_falsey }
56
- it { expect(subject.valid_number?(nil)).to be_falsey }
57
-
58
- it { expect(subject.valid_number?('1188889999')).to be_truthy }
59
- it { expect(subject.valid_number?('11988889999')).to be_truthy }
46
+ it { is_expected.not_to be_valid_number('+55 (11) 8888-9999') }
47
+ it { is_expected.not_to be_valid_number('88889999') }
48
+ it { is_expected.not_to be_valid_number('988889999') }
49
+ it { is_expected.not_to be_valid_number('ABC') }
50
+ it { is_expected.not_to be_valid_number('') }
51
+ it { is_expected.not_to be_valid_number(nil) }
52
+
53
+ it { is_expected.to be_valid_number('1188889999') }
54
+ it { is_expected.to be_valid_number('11988889999') }
60
55
  end
61
56
 
62
57
  describe '#evaluate' do
63
- it 'Should separate numbers in good and bad' do
64
- expect(subject).to receive(:normalize).
65
- once.
66
- with([:numbers]).
67
- and_return([:good, :bad])
68
- expect(subject).to receive(:valid_number?).
69
- once.
70
- with(:good).
71
- and_return(true)
72
- expect(subject).to receive(:valid_number?).
73
- once.
74
- with(:bad).
75
- and_return(false)
76
- expect(subject.evaluate(:numbers)).to(
77
- eq(good: [:good], bad: [:bad])
78
- )
58
+ it 'separates numbers in good and bad' do
59
+ expect(number_sanitizer.evaluate('11988889999', 'abc')).to eq(good: ['11988889999'], bad: ['abc'])
79
60
  end
80
61
  end
81
62
 
82
63
  describe '#bad?' do
83
- it do
84
- expect(subject).to receive(:bad).once.and_return([ ])
85
- expect(subject.bad?).to be_falsey
64
+ subject(:number_sanitizer) { described_class.new numbers }
65
+
66
+ context 'when bad is empty' do
67
+ let(:numbers) { '11988889999' }
68
+
69
+ it { expect(number_sanitizer).not_to be_bad }
86
70
  end
87
- it do
88
- expect(subject).to receive(:bad).once.and_return([1])
89
- expect(subject.bad?).to be_truthy
71
+
72
+ context 'when bad has items' do
73
+ let(:numbers) { 'ABC' }
74
+
75
+ it { expect(number_sanitizer).to be_bad }
90
76
  end
91
77
  end
92
78
 
93
79
  describe '#to_s' do
94
- it 'Should return and empty string' do
95
- expect(subject.to_s).to eq('')
80
+ context 'when is empty returns empty string' do
81
+ let(:numbers) { '' }
82
+
83
+ it { expect(number_sanitizer.to_s).to eq('') }
96
84
  end
97
85
 
98
- it 'Should return all good numbers in a string comma separated' do
99
- expect(subject).to receive(:good).
100
- once.
101
- and_return([1, 2, 3, 4])
102
- expect(subject.to_s).to eq('1,2,3,4')
86
+ context 'when all good numbers returns in a string comma separated' do
87
+ let(:numbers) { %w[11988889991 11988889992 11988889993] }
88
+
89
+ it { expect(number_sanitizer.to_s).to eq('11988889991,11988889992,11988889993') }
103
90
  end
104
91
  end
105
-
106
92
  end
@@ -1,47 +1,79 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe LocaSMS::RestClient do
5
+ describe LocaSMS::RestClient do # rubocop:disable RSpec/FilePath
6
+ subject(:rest_client) { described_class.new(action, params) }
7
+
8
+ let(:action) { :url }
9
+ let(:callback) { 'http://example.com/callback' }
10
+ let(:params) { { lgn: 'LOGIN', pwd: 'PASSWORD', url_callback: callback } }
11
+
4
12
  describe '.initialize' do
5
- context 'When giving proper initialization parameters' do
6
- subject { LocaSMS::RestClient.new :url, :params }
7
- it { expect(subject.base_url).to be(:url) }
8
- it { expect(subject.base_params).to be(:params) }
13
+ context 'when giving proper initialization parameters' do
14
+ let(:action) { :url }
15
+ let(:params) { :params }
16
+
17
+ it { expect(rest_client.base_url).to be(:url) }
18
+ it { expect(rest_client.base_params).to be(:params) }
9
19
  end
10
20
  end
11
21
 
12
22
  describe '#get' do
13
- it 'Is missing tests for get'
23
+ let(:action) { 'sendsms' }
24
+ let(:body) { '{"status":1,"data":28,"msg":null}' }
25
+
26
+ it 'performs get request to url with parameters' do
27
+ allow(Net::HTTP)
28
+ .to receive(:get_response)
29
+ .and_return(OpenStruct.new(body: body))
30
+
31
+ rest_client.get(action, params)
32
+
33
+ expect(Net::HTTP).to have_received(:get_response)
34
+ end
14
35
  end
15
36
 
16
37
  describe '#params_for' do
17
- subject { LocaSMS::RestClient.new :url, { b1: 'X' } }
38
+ it { expect(rest_client.params_for(:action)).to eq({ action: :action }.merge(params)) }
39
+ it { expect(rest_client.params_for(:action, p1: 10)).to eq({ action: :action, p1: 10 }.merge(params)) }
18
40
 
19
- it { expect(subject.params_for(:action)).to eq({action: :action, b1: 'X'}) }
20
- it { expect(subject.params_for(:action, p1: 10)).to eq({action: :action, b1: 'X', p1: 10}) }
41
+ context 'when callback is nil' do
42
+ let(:callback) { nil }
43
+
44
+ it 'is not in params' do
45
+ expect(rest_client.params_for(:action)).to eq({ action: :action, lgn: 'LOGIN', pwd: 'PASSWORD' })
46
+ end
47
+ end
21
48
  end
22
49
 
23
50
  describe '#parse_response' do
24
- subject { LocaSMS::RestClient.new :url, :params }
25
-
26
- it 'Should raise exception on invalid operation' do
27
- expect { subject.parse_response(:action, '0:OPERACAO INVALIDA') }.to raise_error(LocaSMS::InvalidOperation)
51
+ it 'raises exception on invalid operation' do
52
+ expect { rest_client.parse_response(:action, '0:OPERACAO INVALIDA') }.to raise_error(LocaSMS::InvalidOperation)
28
53
  end
29
54
 
30
- it 'Should raise exception on a failed response' do
31
- expect { subject.parse_response(:action, '{"status":0,"data":null,"msg":"FALHA EPICA"}') }.to raise_error(LocaSMS::Exception, 'FALHA EPICA')
55
+ it 'raises exception on a failed response' do
56
+ response = '{"status":0,"data":null,"msg":"FALHA EPICA"}'
57
+
58
+ expect { rest_client.parse_response(:action, response) }.to raise_error(LocaSMS::Exception, 'FALHA EPICA')
32
59
  end
33
60
 
34
- it 'Should raise exception on a failed login attempt' do
35
- expect { subject.parse_response(:action, '{"status":0,"data":null,"msg":"FALHA AO REALIZAR LOGIN"}') }.to raise_error(LocaSMS::InvalidLogin)
61
+ it 'raises exception on a failed login attempt' do
62
+ response = '{"status":0,"data":null,"msg":"FALHA AO REALIZAR LOGIN"}'
63
+
64
+ expect { rest_client.parse_response(:action, response) }.to raise_error(LocaSMS::InvalidLogin)
36
65
  end
37
66
 
38
- it 'Should return the non-json value as a json' do
39
- expect(subject.parse_response(:action, 'non-json return')).to eq({'status' => 1, 'data' => 'non-json return', "msg" => nil})
67
+ it 'returns the non-json value as a json' do
68
+ response = { 'status' => 1, 'data' => 'non-json return', 'msg' => nil }
69
+
70
+ expect(rest_client.parse_response(:action, 'non-json return')).to eq(response)
40
71
  end
41
72
 
42
- it 'Should return a parsed json return' do
43
- expect(subject.parse_response(:action, '{"status":1,"data":28,"msg":null}')).to eq({'status' => 1, 'data' => 28, "msg" => nil})
73
+ it 'returns a parsed json return' do
74
+ response = { 'status' => 1, 'data' => 28, 'msg' => nil }
75
+
76
+ expect(rest_client.parse_response(:action, '{"status":1,"data":28,"msg":null}')).to eq(response)
44
77
  end
45
78
  end
46
-
47
- end
79
+ end
@@ -1,3 +1,2 @@
1
1
  --colour
2
- --format Fuubar
3
- --backtrace
2
+ --backtrace
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
 
3
5
  $LOAD_PATH.unshift(File.dirname(__FILE__))
4
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
7
 
6
- # require 'coveralls'
7
- # require 'simplecov'
8
+ require 'simplecov'
8
9
 
9
- # SimpleCov.start
10
+ SimpleCov.start
10
11
 
11
12
  require 'locasms'
12
13
  require 'rspec'
@@ -16,4 +17,4 @@ Timecop.safe_mode = true
16
17
 
17
18
  RSpec.configure do |config|
18
19
  # see spec.opts
19
- end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: locasms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adilson Carvalho
@@ -10,188 +10,163 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-29 00:00:00.000000000 Z
13
+ date: 2020-10-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: bundler
16
+ name: multi_json
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: '1.3'
22
- type: :development
21
+ version: '1.13'
22
+ type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: '1.3'
28
+ version: '1.13'
29
29
  - !ruby/object:Gem::Dependency
30
- name: rake
30
+ name: bundler
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - "~>"
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 10.4.2
35
+ version: '0'
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 10.4.2
42
+ version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
- name: rspec
44
+ name: rake
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '3.2'
49
+ version: '13.0'
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '3.2'
56
+ version: '13.0'
57
57
  - !ruby/object:Gem::Dependency
58
- name: fuubar
58
+ name: rspec
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: 2.0.0
63
+ version: '3.9'
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
- version: 2.0.0
70
+ version: '3.9'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: timecop
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - "~>"
76
76
  - !ruby/object:Gem::Version
77
- version: 0.7.3
77
+ version: '0.9'
78
78
  type: :development
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - "~>"
83
83
  - !ruby/object:Gem::Version
84
- version: 0.7.3
85
- - !ruby/object:Gem::Dependency
86
- name: guard
87
- requirement: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: '0'
92
- type: :development
93
- prerelease: false
94
- version_requirements: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: '0'
99
- - !ruby/object:Gem::Dependency
100
- name: guard-rspec
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- version: '0'
106
- type: :development
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: '0'
84
+ version: '0.9'
113
85
  - !ruby/object:Gem::Dependency
114
- name: growl
86
+ name: redcarpet
115
87
  requirement: !ruby/object:Gem::Requirement
116
88
  requirements:
117
- - - ">="
89
+ - - "~>"
118
90
  - !ruby/object:Gem::Version
119
- version: '0'
91
+ version: '3.5'
120
92
  type: :development
121
93
  prerelease: false
122
94
  version_requirements: !ruby/object:Gem::Requirement
123
95
  requirements:
124
- - - ">="
96
+ - - "~>"
125
97
  - !ruby/object:Gem::Version
126
- version: '0'
98
+ version: '3.5'
127
99
  - !ruby/object:Gem::Dependency
128
100
  name: yard
129
101
  requirement: !ruby/object:Gem::Requirement
130
102
  requirements:
131
- - - ">="
103
+ - - "~>"
132
104
  - !ruby/object:Gem::Version
133
- version: '0'
105
+ version: '0.9'
134
106
  type: :development
135
107
  prerelease: false
136
108
  version_requirements: !ruby/object:Gem::Requirement
137
109
  requirements:
138
- - - ">="
110
+ - - "~>"
139
111
  - !ruby/object:Gem::Version
140
- version: '0'
112
+ version: '0.9'
141
113
  - !ruby/object:Gem::Dependency
142
- name: redcarpet
114
+ name: simplecov
143
115
  requirement: !ruby/object:Gem::Requirement
144
116
  requirements:
145
- - - ">="
117
+ - - "~>"
146
118
  - !ruby/object:Gem::Version
147
- version: '0'
119
+ version: '0.18'
148
120
  type: :development
149
121
  prerelease: false
150
122
  version_requirements: !ruby/object:Gem::Requirement
151
123
  requirements:
152
- - - ">="
124
+ - - "~>"
153
125
  - !ruby/object:Gem::Version
154
- version: '0'
126
+ version: '0.18'
155
127
  - !ruby/object:Gem::Dependency
156
- name: simplecov
128
+ name: rubocop
157
129
  requirement: !ruby/object:Gem::Requirement
158
130
  requirements:
159
- - - ">="
131
+ - - "~>"
160
132
  - !ruby/object:Gem::Version
161
- version: '0'
133
+ version: '0.93'
162
134
  type: :development
163
135
  prerelease: false
164
136
  version_requirements: !ruby/object:Gem::Requirement
165
137
  requirements:
166
- - - ">="
138
+ - - "~>"
167
139
  - !ruby/object:Gem::Version
168
- version: '0'
140
+ version: '0.93'
169
141
  - !ruby/object:Gem::Dependency
170
- name: rest-client
142
+ name: rubocop-rspec
171
143
  requirement: !ruby/object:Gem::Requirement
172
144
  requirements:
173
145
  - - "~>"
174
146
  - !ruby/object:Gem::Version
175
- version: '1.6'
176
- type: :runtime
147
+ version: '1.43'
148
+ type: :development
177
149
  prerelease: false
178
150
  version_requirements: !ruby/object:Gem::Requirement
179
151
  requirements:
180
152
  - - "~>"
181
153
  - !ruby/object:Gem::Version
182
- version: '1.6'
183
- description: Cliente para o serviço de disparo de SMS da LocaSMS
154
+ version: '1.43'
155
+ description: |-
156
+ Cliente para o serviço de disparo de SMS da LocaSMS e de sua
157
+ versão para Short Code SMS (SMS Plataforma)
184
158
  email:
185
159
  - lc.adilson@gmail.com
186
160
  - vyper@maneh.org
187
161
  - marco.carvalho.swasthya@gmail.com
188
- executables: []
162
+ executables:
163
+ - console
189
164
  extensions: []
190
165
  extra_rdoc_files: []
191
166
  files:
192
167
  - ".gitignore"
193
- - ".hound.yml"
194
- - ".ruby-style.yml"
168
+ - ".rubocop.yml"
169
+ - ".rubocop_todo.yml"
195
170
  - ".travis.yml"
196
171
  - ".yardopts"
197
172
  - Gemfile
@@ -199,6 +174,7 @@ files:
199
174
  - LICENSE.txt
200
175
  - README.md
201
176
  - Rakefile
177
+ - bin/console
202
178
  - lib/locasms.rb
203
179
  - lib/locasms/client.rb
204
180
  - lib/locasms/exception.rb
@@ -223,20 +199,20 @@ require_paths:
223
199
  - lib
224
200
  required_ruby_version: !ruby/object:Gem::Requirement
225
201
  requirements:
226
- - - ">="
202
+ - - "~>"
227
203
  - !ruby/object:Gem::Version
228
- version: '0'
204
+ version: '2.4'
229
205
  required_rubygems_version: !ruby/object:Gem::Requirement
230
206
  requirements:
231
207
  - - ">="
232
208
  - !ruby/object:Gem::Version
233
209
  version: '0'
234
210
  requirements: []
235
- rubyforge_project:
236
- rubygems_version: 2.5.2
211
+ rubygems_version: 3.0.3
237
212
  signing_key:
238
213
  specification_version: 4
239
- summary: Cliente para o serviço de disparo de SMS da LocaSMS
214
+ summary: Cliente para disparo de SMS, regular e Short Code, através da LocaSMS/SMS
215
+ Plataforma
240
216
  test_files:
241
217
  - spec/lib/locasms/client_spec.rb
242
218
  - spec/lib/locasms/helpers/date_time_helper_spec.rb
@@ -244,4 +220,3 @@ test_files:
244
220
  - spec/lib/locasms/rest_client_spec.rb
245
221
  - spec/spec.opts
246
222
  - spec/spec_helper.rb
247
- has_rdoc: