Skip to content

Commit 03a16d0

Browse files
authored
change WebValve.register to accept a class name instead of class (#35)
* change WebValve.register to accept a class name instead of class rails 6 autoloading emits a deprecation warning for class loading during app initialization. webvalve's register call is a culprit here, but it doesn't have to be. this changeset makes it so that webvalve accepts a stringified class name instead of a class and makes that all work properly with the internals. * update and correct changelog * fix CI, update version and fix changelog * add 2.6.1
1 parent ad2896c commit 03a16d0

19 files changed

+88
-52
lines changed

.ruby-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.3.1
1+
2.6.1

.travis.yml

+10
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@ language: ruby
22
rvm:
33
- 2.3.1
44
- 2.4.2
5+
- 2.5.1
6+
- 2.6.1
57
gemfile:
68
- gemfiles/rails_5_0.gemfile
79
- gemfiles/rails_5_1.gemfile
10+
- gemfiles/rails_5_2.gemfile
11+
- gemfiles/rails_6_0.gemfile
812
- gemfiles/ruby.gemfile
913
before_install:
1014
- gem update --system
1115
- gem update bundler
1216
- gem pristine bundler
1317
- gem cleanup bundler
1418
install: "bundle install --jobs 8"
19+
matrix:
20+
exclude:
21+
- rvm: 2.3.1
22+
gemfile: gemfiles/rails_6_0.gemfile
23+
- rvm: 2.4.2
24+
gemfile: gemfiles/rails_6_0.gemfile

Appraisals

+8
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,13 @@ appraise 'rails-5-1' do
66
gem 'rails', '~> 5.1.0'
77
end
88

9+
appraise 'rails-5-2' do
10+
gem 'rails', '~> 5.2.0'
11+
end
12+
13+
appraise 'rails-6-0' do
14+
gem 'rails', '~> 6.0.0'
15+
end
16+
917
appraise 'ruby' do
1018
end

CHANGELOG.md

+7-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ and this project aims to adhere to [Semantic Versioning](http://semver.org/spec/
99
### Added
1010
### Removed
1111

12+
## [0.10.0] - 2019-09-23
13+
### Changed
14+
- `Webvalve.register` no longer accepts classes; you must provide class names as strings. Fixes a Rails 6 deprecation warning. (https://github.com/Betterment/webvalve/pull/35)
15+
1216
## [0.9.10] - 2019-09-09
1317
### Changed
14-
- rename `whitelist_url` to `allow_url` (https://github.com/Betterment/retail/pull/4424)
18+
- rename `whitelist_url` to `allow_url` (https://github.com/Betterment/webvalve/pull/33)
1519

1620
## [0.9.9] - 2019-05-24
1721
### Changed
@@ -34,7 +38,8 @@ and this project aims to adhere to [Semantic Versioning](http://semver.org/spec/
3438
### Changed
3539
- WebMock 3+ support from @messanjah (https://github.com/Betterment/webvalve/pull/22)
3640

37-
[Unreleased]: https://github.com/Betterment/webvalve/compare/v0.9.9...HEAD
41+
[Unreleased]: https://github.com/Betterment/webvalve/compare/v0.10.0...HEAD
42+
[0.10.0]: https://github.com/Betterment/webvalve/compare/v0.9.10...v0.10.0
3843
[0.9.10]: https://github.com/Betterment/webvalve/compare/v0.9.9...v0.9.10
3944
[0.9.9]: https://github.com/Betterment/webvalve/compare/v0.9.8...v0.9.9
4045
[0.9.8]: https://github.com/Betterment/webvalve/compare/v0.9.7...v0.9.8

README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ is a warning that the requested URL was not mocked. This behavior comes
4040
straight outta WebMock.
4141

4242
```ruby
43-
irb(main):007:0> Net::HTTP.get(URI('http://bank.dev'))
43+
irb(main):007:0> Net::HTTP.get(URI('http://bank.test'))
4444

45-
WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. Unregistered request: GET http://bank.dev/ with headers {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}
45+
WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. Unregistered request: GET http://bank.test/ with headers {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}
4646

4747
You can stub this request with the following snippet:
4848

49-
stub_request(:get, "http://bank.dev/").
49+
stub_request(:get, "http://bank.test/").
5050
with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
5151
to_return(:status => 200, :body => "", :headers => {})
5252

@@ -68,12 +68,12 @@ This will drop a new file in your config directory.
6868

6969
# # register services
7070
#
71-
# WebValve.register FakeBank
72-
# WebValve.register FakeExample, url: 'https://api.example.org'
71+
# WebValve.register "FakeBank"
72+
# WebValve.register "FakeExample", url: "https://api.example.org"
7373
#
7474
# # add urls to allowlist
7575
#
76-
# WebValve.allow_url 'https://example.com'
76+
# WebValve.allow_url "https://example.com"
7777
```
7878

7979
If you're not using Rails, you can create this file for yourself.
@@ -113,7 +113,7 @@ And it will automatically register it in `config/webvalve.rb`
113113

114114
```ruby
115115
# config/webvalve.rb
116-
WebValve.register FakeBank
116+
WebValve.register "FakeBank"
117117
```
118118

119119
Again, if you're not using Rails, you'll have to create this file
@@ -123,7 +123,7 @@ You'll also want to define an environment variable for the base url of
123123
your service.
124124

125125
```bash
126-
export BANK_API_URL='http://bank.dev'
126+
export BANK_API_URL='http://bank.test'
127127
```
128128

129129
That's it. Now when you hit your service again, it will route your
@@ -189,10 +189,10 @@ endpoint in a test, we can just use WebMock™.
189189
# in an rspec test...
190190

191191
it 'handles 404s by returning nil' do
192-
fake_req = stub_request('http://bank.dev/some/url/1234')
192+
fake_req = stub_request('http://bank.test/some/url/1234')
193193
.to_return(status: 404, body: nil)
194194

195-
response = Faraday.get 'http://bank.dev/some/url/1234'
195+
response = Faraday.get 'http://bank.test/some/url/1234'
196196
expect(response.body).to be_nil
197197
expect(fake_req).to have_been_requested
198198
end

examples/sinatra/config/webvalve.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
require 'webvalve'
22
require_relative '../webvalve/fake_twitter'
33

4-
WebValve.register FakeTwitter, url: FakeTwitter::URL
4+
WebValve.register 'FakeTwitter', url: 'http://faketwitter.test'

examples/sinatra/webvalve/fake_twitter.rb

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
class FakeTwitter < WebValve::FakeService
2-
URL = 'http://faketwitter.test'.freeze
3-
42
get '/' do
53
json hello: 'world'
64
end

gemfiles/rails_5_2.gemfile

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
gem "rails", "~> 5.2.0"
6+
7+
gemspec path: "../"

gemfiles/rails_6_0.gemfile

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
gem "rails", "~> 6.0.0"
6+
7+
gemspec path: "../"

lib/generators/webvalve/fake_service_generator.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class #{fake_service_class_name} < WebValve::FakeService
3737

3838
def register_fake_in_config
3939
append_to_file config_file_path do <<~RUBY
40-
WebValve.register #{fake_service_class_name}
40+
WebValve.register "#{fake_service_class_name}"
4141
RUBY
4242
end
4343
end

lib/generators/webvalve/install_generator.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ def create_config_file
1616
create_file full_file_path, <<-FILE.strip_heredoc
1717
# # register services
1818
#
19-
# WebValve.register FakeThing
20-
# WebValve.register FakeExample, url: 'https://api.example.org'
19+
# WebValve.register "FakeThing"
20+
# WebValve.register "FakeExample", url: "https://api.example.org"
2121
#
2222
# # add urls to the allowlist
2323
#
24-
# WebValve.allow_url 'https://example.com'
24+
# WebValve.allow_url "https://example.com"
2525
FILE
2626
end
2727

lib/webvalve/fake_service_config.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
module WebValve
22
class FakeServiceConfig
3-
attr_reader :service
3+
attr_reader :service_class_name
44

5-
def initialize(service:, url: nil)
6-
@service = service
5+
def initialize(service_class_name:, url: nil)
6+
@service_class_name = service_class_name
77
@custom_service_url = url
88
end
99

@@ -26,9 +26,9 @@ def service_url
2626

2727
def missing_url_message
2828
<<~MESSAGE
29-
There is no URL defined for #{service.name}.
29+
There is no URL defined for #{service_class_name}.
3030
Configure one by setting the ENV variable "#{service_name.to_s.upcase}_API_URL"
31-
or by using WebValve.register #{service.name}, url: "http://something.dev"
31+
or by using WebValve.register "#{service_class_name}", url: "http://something.dev"
3232
MESSAGE
3333
end
3434

@@ -45,7 +45,7 @@ def default_service_url
4545
end
4646

4747
def service_name
48-
@service_name ||= service.name.demodulize.underscore.sub 'fake_', ''
48+
@service_name ||= service_class_name.demodulize.underscore.sub 'fake_', ''
4949
end
5050
end
5151
end

lib/webvalve/fake_service_wrapper.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module WebValve
22
class FakeServiceWrapper
33
# lazily resolve the app constant to leverage rails class reloading
4-
def initialize(app)
5-
@app_klass_name = app.name
4+
def initialize(app_class_name)
5+
@app_class_name = app_class_name
66
end
77

88
def call(env)
@@ -12,7 +12,7 @@ def call(env)
1212
private
1313

1414
def app
15-
@app_klass_name.constantize
15+
@app_class_name.constantize
1616
end
1717
end
1818
end

lib/webvalve/manager.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ module WebValve
77
class Manager
88
include Singleton
99

10-
def register(fake_service, **args)
11-
raise "#{fake_service.inspect} already registered" if fake_service_configs.any? { |c| c.service == fake_service }
12-
fake_service_configs << FakeServiceConfig.new(service: fake_service, **args)
10+
def register(fake_service_class_name, **args)
11+
raise "register must be called with a string to comply with Rails autoloading" unless fake_service_class_name.is_a?(String)
12+
raise "#{fake_service_class_name.inspect} already registered" if fake_service_configs.any? { |c| c.service_class_name == fake_service_class_name }
13+
fake_service_configs << FakeServiceConfig.new(service_class_name: fake_service_class_name, **args)
1314
end
1415

1516
def allow_url(url)
@@ -62,7 +63,7 @@ def webmock_service(config)
6263
WebMock.stub_request(
6364
:any,
6465
url_to_regexp(config.service_url)
65-
).to_rack(FakeServiceWrapper.new(config.service))
66+
).to_rack(FakeServiceWrapper.new(config.service_class_name))
6667
end
6768

6869
def allowlist_service(config)

lib/webvalve/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module WebValve
2-
VERSION = "0.9.10"
2+
VERSION = "0.10.0"
33
end

spec/webvalve/fake_service_config_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def self.name
1717
stub_const('FakeDummy', fake_service)
1818
end
1919

20-
subject { described_class.new service: fake_service }
20+
subject { described_class.new service_class_name: fake_service.name }
2121

2222
describe '.should_intercept?' do
2323
context 'in test env' do
@@ -136,7 +136,7 @@ def self.name
136136
expect { subject.service_url }.to raise_error <<~MESSAGE
137137
There is no URL defined for FakeDummy.
138138
Configure one by setting the ENV variable "DUMMY_API_URL"
139-
or by using WebValve.register FakeDummy, url: "http://something.dev"
139+
or by using WebValve.register "FakeDummy", url: "http://something.dev"
140140
MESSAGE
141141
end
142142

spec/webvalve/fake_service_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def self.name
2828

2929
it 'raise a useful error when an unmapped route is requested' do
3030
with_env 'DUMMY_API_URL' => 'http://dummy.dev' do
31-
WebValve.register subject
31+
WebValve.register subject.name
3232
WebValve.setup
3333

3434
expect { Net::HTTP.get(URI('http://dummy.dev/foos')) }.to raise_error(RuntimeError, /route not defined for GET/)
@@ -37,7 +37,7 @@ def self.name
3737

3838
it 'returns the result from the fake when a mapped route is requested' do
3939
with_env 'DUMMY_API_URL' => 'http://dummy.dev' do
40-
WebValve.register subject
40+
WebValve.register subject.name
4141
WebValve.setup
4242

4343
expect(Net::HTTP.get(URI('http://dummy.dev/widgets'))).to eq({ result: 'it works!' }.to_json)

spec/webvalve/manager_spec.rb

+10-10
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,22 @@
1717
end
1818
end
1919

20-
describe '#register(fake_service)' do
20+
describe '#register(fake_service_class_name)' do
2121
it 'raises on duplicates' do
22-
fake = class_double(WebValve::FakeService)
22+
fake = class_double(WebValve::FakeService, name: "FooService")
2323

24-
subject.register fake
25-
expect { subject.register fake }.to raise_error(/already registered/)
24+
subject.register fake.name
25+
expect { subject.register fake.name }.to raise_error(/already registered/)
2626
expect(subject.fake_service_configs.count).to eq 1
27-
expect(subject.fake_service_configs.first.service).to eq fake
27+
expect(subject.fake_service_configs.first.service_class_name).to eq fake.name
2828
end
2929
end
3030

31-
describe '#register(fake_service, url:)' do
31+
describe '#register(fake_service_class_name, url:)' do
3232
it 'stores the url' do
33-
fake = class_double(WebValve::FakeService)
33+
fake = class_double(WebValve::FakeService, name: "FooService")
3434

35-
subject.register fake, url: 'http://manual.dev'
35+
subject.register fake.name, url: 'http://manual.dev'
3636
expect(subject.fake_service_configs.first.service_url).to eq 'http://manual.dev'
3737
end
3838
end
@@ -109,7 +109,7 @@
109109
allow(WebMock).to receive(:stub_request).and_return(web_mock_stubble)
110110

111111
with_env 'SOMETHING_API_URL' => 'http://fake.dev' do
112-
subject.register disabled_service
112+
subject.register disabled_service.name
113113
subject.setup
114114
end
115115

@@ -121,7 +121,7 @@
121121
enabled_service = class_double(WebValve::FakeService, name: 'FakeSomething')
122122

123123
with_env 'SOMETHING_ENABLED' => '1', 'SOMETHING_API_URL' => 'http://real.dev' do
124-
subject.register enabled_service
124+
subject.register enabled_service.name
125125
subject.setup
126126
end
127127

webvalve.gemspec

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ Gem::Specification.new do |s|
1515
s.files = Dir["{lib}/**/*", "LICENSE", "Rakefile", "README.md", "CHANGELOG.md"]
1616
s.test_files = Dir["spec/**/*"]
1717

18-
s.add_dependency 'activesupport', '>= 4.2'
19-
s.add_dependency 'sinatra', '>= 1.4', '< 3'
20-
s.add_dependency 'sinatra-contrib', '>= 1.4', '< 3'
18+
s.add_dependency "activesupport", ">= 4.2"
19+
s.add_dependency "sinatra", ">= 1.4", "< 3"
20+
s.add_dependency "sinatra-contrib", ">= 1.4", "< 3"
2121
s.add_dependency "webmock", ">= 2.0"
2222

23-
s.add_development_dependency 'appraisal', '~> 2.2.0'
23+
s.add_development_dependency "appraisal", "~> 2.2.0"
2424
s.add_development_dependency "rspec"
2525
s.add_development_dependency "pry"
2626
s.add_development_dependency "yard"

0 commit comments

Comments
 (0)