3scale_client 2.4.2 → 2.5.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5238de4c88e0a7855f14b85f3fc667954a3c1d84
4
- data.tar.gz: dbaf66645cf58a69fb8af3126145bac76b7fe5f9
3
+ metadata.gz: ab7fb31122fd7138a87cb410914466949e6f7034
4
+ data.tar.gz: 077f77ad68034e85e57a32d529aaaffb0078b9fd
5
5
  SHA512:
6
- metadata.gz: 2ec89086c7ea68dd50f5c5aa86338bfa45b9e5c079ef0526743f0db772ccb79ec67b97261e9ea92d088a6ed94dcef8de10038aba6796cbbbb2a52e2a6581a03e
7
- data.tar.gz: efefcbfd4a99502127ee99dc0dddbec290d0216c0ce0e8f165a644d5967039db537570062db5161d2282fc5a71b2d8921a8f4ca6dc122cb474417ac1aeca2e65
6
+ metadata.gz: 1a987bb2bdc1cfcfa1472ca5c5180fa6211ac781bf8a264afbb01083a83ef7cfb1f64ab45e7753928790967f86144dd076a84fcb64c336bedff7c5a72ce30deb
7
+ data.tar.gz: ae03b5bac34c9da2b53d11445ecf795ead9ff875f6840e44234f3a09029405ee1cf6b00fae2c92883158d41db60e6e709b8f6d703e6a0b3de6f04f95d96d4515
data/.travis.yml CHANGED
@@ -3,8 +3,8 @@ cache: bundler
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
- - 2.1.1
7
- - 2.1.2
6
+ - 2.1
7
+ - 2.2
8
8
  - jruby
9
9
  matrix:
10
10
  include:
@@ -18,11 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rdoc"
24
24
  spec.add_development_dependency "fakeweb"
25
25
  spec.add_development_dependency "mocha"
26
26
  spec.add_development_dependency "net-http-persistent"
27
+ spec.add_development_dependency 'minitest'
28
+ spec.add_development_dependency 'rack'
27
29
  spec.add_dependency 'nokogiri'
28
30
  end
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [Unreleased][unreleased]
5
+ ### Fixed
6
+ ### Added
7
+
8
+ ## [2.5.0.pre1] - 2015-01-29
9
+ ### Added
10
+ - Native support for persistent connections (without net-http-persistent gem)
11
+ - `ThreeScale::Middleware` for Rack
data/Gemfile CHANGED
@@ -1,2 +1,7 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
+
4
+ # TODO: when travis bundler version is >= 1.7.11
5
+ # platform :mri_22 do
6
+ # gem 'minitest'
7
+ # end
data/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management. Includes a configurable API dashboard and developer portal CMS. More product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.
7
7
 
8
8
  ### Tutorials
9
- Plugin Setup: https://support.3scale.net/howtos/api-configuration/plugin-setup
10
- Rate Limiting: https://support.3scale.net/howtos/basics/provision-rate-limits
11
- Analytics Setup: https://support.3scale.net/quickstarts/3scale-api-analytics
9
+ Plugin Setup: https://support.3scale.net/howtos/api-configuration/plugin-setup
10
+ Rate Limiting: https://support.3scale.net/howtos/basics/provision-rate-limits
11
+ Analytics Setup: https://support.3scale.net/quickstarts/3scale-api-analytics
12
12
 
13
13
  ## Installation
14
14
 
@@ -252,5 +252,13 @@ human readable error description:
252
252
  ```ruby
253
253
  response.error_code # "provider_key_invalid"
254
254
  response.error_message # "provider key \"foo\" is invalid"
255
- ```
256
-
255
+ ```
256
+
257
+
258
+ ## Rack Middleware
259
+
260
+ You can use our Rack middleware to automatically authenticate your Rack applications.
261
+
262
+ ```ruby
263
+ use ThreeScale::Middleware, provider_key, :user_key # or :app_id
264
+ ```
@@ -8,31 +8,43 @@ module ThreeScale
8
8
  def_delegators :@http, :get, :post, :use_ssl?, :active?
9
9
  USER_CLIENT_HEADER = ['X-3scale-User-Agent', "plugin-ruby-v#{VERSION}"]
10
10
 
11
- def initialize(options)
11
+ class PersistenceNotAvailable < LoadError
12
+ def initialize(*)
13
+ super 'persistence is available only on Ruby 2.0 or with net-http-persistent gem'.freeze
14
+ end
15
+ end
12
16
 
17
+ def initialize(options)
13
18
  @secure = !!options[:secure]
14
19
  @host = options.fetch(:host)
15
20
  @persistent = options[:persistent]
16
21
 
17
- backend_class = @persistent ? Persistent : NetHttp
22
+ backend_class = @persistent ? self.class.persistent_backend : NetHttp or raise PersistenceNotAvailable
23
+ backend_class.prepare
18
24
 
19
25
  @http = backend_class.new(@host)
20
26
  @http.ssl! if @secure
21
27
  end
22
28
 
23
29
  class BaseClient
30
+ def self.available?
31
+ end
32
+
33
+ def self.prepare
34
+ end
35
+
24
36
  def initialize(host)
25
37
  @host = host
26
38
  end
27
39
 
28
- def get(path)
40
+ def get_request(path)
29
41
  get = Net::HTTP::Get.new(path)
30
42
  get.add_field(*USER_CLIENT_HEADER)
31
43
  get.add_field('Host', @host)
32
44
  get
33
45
  end
34
46
 
35
- def post(path, payload)
47
+ def post_request(path, payload)
36
48
  post = Net::HTTP::Post.new(path)
37
49
  post.add_field(*USER_CLIENT_HEADER)
38
50
  post.add_field('Host', @host)
@@ -41,10 +53,20 @@ module ThreeScale
41
53
  end
42
54
  end
43
55
 
44
- class Persistent < BaseClient
56
+ class NetHttpPersistent < BaseClient
57
+ def self.available?
58
+ prepare
59
+ true
60
+ rescue LoadError
61
+ false
62
+ end
63
+
64
+ def self.prepare
65
+ require 'net/http/persistent'
66
+ end
67
+
45
68
  def initialize(host)
46
69
  super
47
- require 'net/http/persistent'
48
70
  @http = ::Net::HTTP::Persistent.new
49
71
  @protocol = 'http'
50
72
  end
@@ -55,13 +77,13 @@ module ThreeScale
55
77
 
56
78
  def get(path)
57
79
  uri = full_uri(path)
58
- @http.request(uri, super)
80
+ @http.request(uri, get_request(path))
59
81
  end
60
82
 
61
83
 
62
84
  def post(path, payload)
63
85
  uri = full_uri(path)
64
- @http.request(uri, super)
86
+ @http.request(uri, post_request(path, payload))
65
87
  end
66
88
 
67
89
  def full_uri(path)
@@ -84,13 +106,54 @@ module ThreeScale
84
106
  end
85
107
 
86
108
  def get(path)
87
- @http.request(super)
109
+ @http.request get_request(path)
88
110
  end
89
111
 
90
112
  def post(path, payload)
91
- @http.request(super)
113
+ @http.request post_request(path, payload)
114
+ end
115
+ end
116
+
117
+ class NetHttpKeepAlive < NetHttp
118
+ HTTP_CONNECTION = 'connection'.freeze
119
+ HTTP_KEEPALIVE = 'keep-alive'.freeze
120
+
121
+ MARK_KEEPALIVE = ->(req) { req[HTTP_CONNECTION] ||= HTTP_KEEPALIVE }
122
+
123
+ private_constant :MARK_KEEPALIVE
124
+ private_constant :HTTP_CONNECTION
125
+ private_constant :HTTP_KEEPALIVE
126
+
127
+ def self.available?
128
+ Net::HTTP.instance_method(:keep_alive_timeout)
129
+ rescue NameError
130
+ false
131
+ end
132
+
133
+ def initialize(*)
134
+ super
135
+ @http.start
136
+ end
137
+
138
+ def ssl!
139
+ super
140
+ @http.start
92
141
  end
142
+
143
+ def get_request(*)
144
+ super.tap(&MARK_KEEPALIVE)
145
+ end
146
+
147
+ def post_request(*)
148
+ super.tap(&MARK_KEEPALIVE)
149
+ end
150
+ end
151
+
152
+ class << self
153
+ attr_accessor :persistent_backend
93
154
  end
155
+
156
+ self.persistent_backend = [NetHttpKeepAlive, NetHttpPersistent].find(&:available?)
94
157
  end
95
158
  end
96
159
  end
@@ -1,5 +1,5 @@
1
1
  module ThreeScale
2
2
  class Client
3
- VERSION = '2.4.2'
3
+ VERSION = '2.5.0.pre1'
4
4
  end
5
5
  end
@@ -0,0 +1,88 @@
1
+ require '3scale_client'
2
+
3
+ require 'rack/utils'
4
+ require 'rack/auth/basic'
5
+
6
+ module ThreeScale
7
+ class Middleware < Rack::Auth::Basic
8
+ attr_reader :client, :authenticator
9
+
10
+ DEFAULT_OPTIONS = { secure: true, persistent: true }
11
+
12
+ def initialize(app, provider_key, mode, options = {})
13
+ options = DEFAULT_OPTIONS.merge(options).merge(provider_key: provider_key)
14
+ @client = ThreeScale::Client.new(options)
15
+
16
+ super(app, '3scale Authentication', &authenticator_for(mode))
17
+ end
18
+
19
+ private
20
+
21
+ def authenticator_for(mode)
22
+ klass = case mode
23
+ when :user_key then UserKeyAuthenticator
24
+ when :app_id then AppIdAuthenticator
25
+ when nil then NilAuthenticator
26
+ else raise "Unknown auth mode #{mode}"
27
+ end
28
+
29
+ klass.new(@client)
30
+ end
31
+
32
+ class BaseAuthenticator
33
+ attr_accessor :client
34
+
35
+ def initialize(client)
36
+ @client = client
37
+ end
38
+
39
+ def provided?(username, password)
40
+ username && !username.empty? && password && !password.empty?
41
+ end
42
+
43
+ def credentials(*)
44
+ nil
45
+ end
46
+
47
+ def to_proc
48
+ lambda { |username, password|
49
+ return false unless provided?(username, password)
50
+
51
+ auth = credentials(username, password)
52
+ # Do not do authrep for now, as rate limitin requires more work:
53
+ # we would need to send headers with remaining limits & proper codes
54
+ response = @client.authorize(auth)
55
+ response.success?
56
+ }
57
+ end
58
+ end
59
+
60
+ private_constant :BaseAuthenticator
61
+
62
+ class UserKeyAuthenticator < BaseAuthenticator
63
+ def provided?(username, *)
64
+ username && !username.empty?
65
+ end
66
+
67
+ def credentials(username, *)
68
+ { user_key: username }
69
+ end
70
+ end
71
+
72
+ class AppIdAuthenticator < BaseAuthenticator
73
+ def credentials(username, password)
74
+ { app_id: username, app_key: password }
75
+ end
76
+ end
77
+
78
+ class NilAuthenticator < BaseAuthenticator
79
+ def provided?(*)
80
+ true
81
+ end
82
+
83
+ def to_proc
84
+ proc { true }
85
+ end
86
+ end
87
+ end
88
+ end
data/test/client_test.rb CHANGED
@@ -1,10 +1,11 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
+
2
3
  require 'fakeweb'
3
4
  require 'mocha/setup'
4
5
 
5
6
  require '3scale/client'
6
7
 
7
- class ThreeScale::ClientTest < Test::Unit::TestCase
8
+ class ThreeScale::ClientTest < MiniTest::Unit::TestCase
8
9
 
9
10
  def client(options = {})
10
11
  ThreeScale::Client.new({:provider_key => '1234abcd'}.merge(options))
@@ -19,7 +20,7 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
19
20
  end
20
21
 
21
22
  def test_raises_exception_if_provider_key_is_missing
22
- assert_raise ArgumentError do
23
+ assert_raises ArgumentError do
23
24
  ThreeScale::Client.new({})
24
25
  end
25
26
  end
@@ -206,7 +207,7 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
206
207
  def test_authorize_with_server_error
207
208
  FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['500', 'Internal Server Error'], :body => 'OMG! WTF!')
208
209
 
209
- assert_raise ThreeScale::ServerError do
210
+ assert_raises ThreeScale::ServerError do
210
211
  @client.authorize(:app_id => 'foo')
211
212
  end
212
213
  end
@@ -311,13 +312,13 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
311
312
  def test_oauth_authorize_with_server_error
312
313
  FakeWeb.register_uri(:get, "http://#{@host}/transactions/oauth_authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['500', 'Internal Server Error'], :body => 'OMG! WTF!')
313
314
 
314
- assert_raise ThreeScale::ServerError do
315
+ assert_raises ThreeScale::ServerError do
315
316
  @client.oauth_authorize(:app_id => 'foo')
316
317
  end
317
318
  end
318
319
 
319
320
  def test_report_raises_an_exception_if_no_transactions_given
320
- assert_raise ArgumentError do
321
+ assert_raises ArgumentError do
321
322
  @client.report
322
323
  end
323
324
  end
@@ -380,7 +381,7 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
380
381
  :status => ['500', 'Internal Server Error'],
381
382
  :body => 'OMG! WTF!')
382
383
 
383
- assert_raise ThreeScale::ServerError do
384
+ assert_raises ThreeScale::ServerError do
384
385
  @client.report({:app_id => 'foo', :usage => {'hits' => 1}})
385
386
  end
386
387
  end
@@ -457,8 +458,16 @@ class ThreeScale::ClientTest < Test::Unit::TestCase
457
458
  end
458
459
  end
459
460
 
460
- class ThreeScale::PersistentClientTest < ThreeScale::ClientTest
461
+ class ThreeScale::NetHttpPersistentClientTest < ThreeScale::ClientTest
461
462
  def client(options = {})
463
+ ThreeScale::Client::HTTPClient.persistent_backend = ThreeScale::Client::HTTPClient::NetHttpPersistent
462
464
  ThreeScale::Client.new({:provider_key => '1234abcd', :persistent => true}.merge(options))
463
465
  end
464
- end
466
+ end
467
+
468
+ class ThreeScale::NetHttpKeepAliveClientTest < ThreeScale::NetHttpPersistentClientTest
469
+ def client(options = {})
470
+ ThreeScale::Client::HTTPClient.persistent_backend = ThreeScale::Client::HTTPClient::NetHttpKeepAlive
471
+ super
472
+ end
473
+ end
@@ -0,0 +1,45 @@
1
+ require 'minitest/autorun'
2
+ require '3scale/middleware'
3
+ require 'mocha/setup'
4
+
5
+ class ThreeScale::MiddlewareTest < MiniTest::Unit::TestCase
6
+
7
+ def setup
8
+ @app = ->(_env) { [ 200, {}, ['']] }
9
+ @provider_key = 'fake-provider-key'
10
+ end
11
+
12
+ def client(credentials, response = success)
13
+ mock('client') do
14
+ expects(:authorize).with(credentials).returns(response)
15
+ end
16
+ end
17
+
18
+ def success
19
+ mock('response', success?: true)
20
+ end
21
+
22
+ def test_user_key_authenticator
23
+ credentials = { user_key: 'user' }
24
+ authenticator = ThreeScale::Middleware::UserKeyAuthenticator.new(client(credentials))
25
+ assert authenticator.provided?('user', nil)
26
+ assert_equal credentials, authenticator.credentials('user')
27
+ assert authenticator.to_proc.call('user', nil)
28
+ end
29
+
30
+ def test_app_id_authenticator
31
+ credentials = { app_id: 'app', app_key: 'key' }
32
+ authenticator = ThreeScale::Middleware::AppIdAuthenticator.new(client(credentials))
33
+
34
+ assert authenticator.provided?('app', 'key')
35
+ assert_equal credentials, authenticator.credentials('app', 'key')
36
+ assert authenticator.to_proc.call('app', 'key')
37
+ end
38
+
39
+ def test_nil_authenticator
40
+ authenticator = ThreeScale::Middleware::NilAuthenticator.new(mock)
41
+ assert authenticator.provided?
42
+ assert_equal(nil, authenticator.credentials)
43
+ assert authenticator.to_proc.call(nil, nil)
44
+ end
45
+ end
@@ -1,15 +1,19 @@
1
+ require 'minitest/autorun'
2
+
1
3
  require '3scale/client'
2
- require 'test/unit'
4
+ require 'mocha/setup'
3
5
 
4
6
  if ENV['TEST_3SCALE_PROVIDER_KEY'] && ENV['TEST_3SCALE_APP_IDS'] && ENV['TEST_3SCALE_APP_KEYS']
5
- class ThreeScale::PersistenceTest < Test::Unit::TestCase
7
+ class ThreeScale::NetHttpPersistenceTest < MiniTest::Unit::TestCase
6
8
  def setup
9
+ ThreeScale::Client::HTTPClient.persistent_backend = ThreeScale::Client::HTTPClient::NetHttpPersistent
10
+
7
11
  provider_key = ENV['TEST_3SCALE_PROVIDER_KEY']
8
12
 
9
13
  @app_id = ENV['TEST_3SCALE_APP_IDS']
10
14
  @app_key = ENV['TEST_3SCALE_APP_KEYS']
11
15
 
12
- @client = ThreeScale::Client.new(:provider_key => provider_key, :persistence => true)
16
+ @client = ThreeScale::Client.new(provider_key: provider_key, persistence: true)
13
17
 
14
18
  if defined?(FakeWeb)
15
19
  FakeWeb.allow_net_connect = true
@@ -26,5 +30,13 @@ if ENV['TEST_3SCALE_PROVIDER_KEY'] && ENV['TEST_3SCALE_APP_IDS'] && ENV['TEST_3S
26
30
  assert @client.authorize(:app_id => @app_id, :app_key => @app_key).success?
27
31
  end
28
32
  end
33
+
34
+
35
+ class ThreeScale::NetHttpKeepaliveTest < ThreeScale::NetHttpPersistenceTest
36
+ def setup
37
+ ThreeScale::Client::HTTPClient.persistent_backend = ThreeScale::Client::HTTPClient::NetHttpKeepAlive
38
+ super
39
+ end
40
+ end
29
41
  end
30
42
 
data/test/remote_test.rb CHANGED
@@ -1,10 +1,10 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require '3scale/client'
3
3
 
4
4
  if ENV['TEST_3SCALE_PROVIDER_KEY'] &&
5
5
  ENV['TEST_3SCALE_APP_IDS'] &&
6
6
  ENV['TEST_3SCALE_APP_KEYS']
7
- class ThreeScale::RemoteTest < Test::Unit::TestCase
7
+ class ThreeScale::RemoteTest < MiniTest::Unit::TestCase
8
8
  def setup
9
9
  @provider_key = ENV['TEST_3SCALE_PROVIDER_KEY']
10
10
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: 3scale_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.2
4
+ version: 2.5.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Cichra
@@ -12,104 +12,132 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-09-01 00:00:00.000000000 Z
15
+ date: 2015-01-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: bundler
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - ~>
21
+ - - "~>"
22
22
  - !ruby/object:Gem::Version
23
- version: '1.3'
23
+ version: '1.7'
24
24
  type: :development
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - ~>
28
+ - - "~>"
29
29
  - !ruby/object:Gem::Version
30
- version: '1.3'
30
+ version: '1.7'
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: rake
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  requirements:
35
- - - '>='
35
+ - - ">="
36
36
  - !ruby/object:Gem::Version
37
37
  version: '0'
38
38
  type: :development
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
- - - '>='
42
+ - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: rdoc
47
47
  requirement: !ruby/object:Gem::Requirement
48
48
  requirements:
49
- - - '>='
49
+ - - ">="
50
50
  - !ruby/object:Gem::Version
51
51
  version: '0'
52
52
  type: :development
53
53
  prerelease: false
54
54
  version_requirements: !ruby/object:Gem::Requirement
55
55
  requirements:
56
- - - '>='
56
+ - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: fakeweb
61
61
  requirement: !ruby/object:Gem::Requirement
62
62
  requirements:
63
- - - '>='
63
+ - - ">="
64
64
  - !ruby/object:Gem::Version
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
68
  version_requirements: !ruby/object:Gem::Requirement
69
69
  requirements:
70
- - - '>='
70
+ - - ">="
71
71
  - !ruby/object:Gem::Version
72
72
  version: '0'
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: mocha
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
- - - '>='
77
+ - - ">="
78
78
  - !ruby/object:Gem::Version
79
79
  version: '0'
80
80
  type: :development
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - '>='
84
+ - - ">="
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: net-http-persistent
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - '>='
91
+ - - ">="
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  type: :development
95
95
  prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
- - - '>='
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: minitest
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rack
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
99
127
  - !ruby/object:Gem::Version
100
128
  version: '0'
101
129
  - !ruby/object:Gem::Dependency
102
130
  name: nokogiri
103
131
  requirement: !ruby/object:Gem::Requirement
104
132
  requirements:
105
- - - '>='
133
+ - - ">="
106
134
  - !ruby/object:Gem::Version
107
135
  version: '0'
108
136
  type: :runtime
109
137
  prerelease: false
110
138
  version_requirements: !ruby/object:Gem::Requirement
111
139
  requirements:
112
- - - '>='
140
+ - - ">="
113
141
  - !ruby/object:Gem::Version
114
142
  version: '0'
115
143
  description: This gem allows to easily connect an application that provides a Web
@@ -121,9 +149,10 @@ executables: []
121
149
  extensions: []
122
150
  extra_rdoc_files: []
123
151
  files:
124
- - .gitignore
125
- - .travis.yml
152
+ - ".gitignore"
153
+ - ".travis.yml"
126
154
  - 3scale_client.gemspec
155
+ - CHANGELOG.md
127
156
  - Gemfile
128
157
  - LICENCE
129
158
  - README.md
@@ -133,10 +162,12 @@ files:
133
162
  - lib/3scale/client.rb
134
163
  - lib/3scale/client/http_client.rb
135
164
  - lib/3scale/client/version.rb
165
+ - lib/3scale/middleware.rb
136
166
  - lib/3scale/response.rb
137
167
  - lib/3scale_client.rb
138
168
  - test/benchmark.rb
139
169
  - test/client_test.rb
170
+ - test/middleware_test.rb
140
171
  - test/persistence_test.rb
141
172
  - test/remote_test.rb
142
173
  homepage: http://www.3scale.net
@@ -149,22 +180,23 @@ require_paths:
149
180
  - lib
150
181
  required_ruby_version: !ruby/object:Gem::Requirement
151
182
  requirements:
152
- - - '>='
183
+ - - ">="
153
184
  - !ruby/object:Gem::Version
154
185
  version: '0'
155
186
  required_rubygems_version: !ruby/object:Gem::Requirement
156
187
  requirements:
157
- - - '>='
188
+ - - ">"
158
189
  - !ruby/object:Gem::Version
159
- version: '0'
190
+ version: 1.3.1
160
191
  requirements: []
161
192
  rubyforge_project:
162
- rubygems_version: 2.2.2
193
+ rubygems_version: 2.4.5
163
194
  signing_key:
164
195
  specification_version: 4
165
196
  summary: Client for 3scale Web Service Management System API
166
197
  test_files:
167
198
  - test/benchmark.rb
168
199
  - test/client_test.rb
200
+ - test/middleware_test.rb
169
201
  - test/persistence_test.rb
170
202
  - test/remote_test.rb