flipper-cloud 0.20.0.beta3 → 0.20.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6117cc953e569df240b187815f80b55a4c91014916e98fd9b0e2c0fa9ad45cf1
4
- data.tar.gz: 9bcdb028730c3f5376316b3f3536df24463e6aa8c1e09b515ad472015147a1ec
3
+ metadata.gz: 4a7975de45022ee964e72588441cebfcbb2381feb4657342c7423064a709d239
4
+ data.tar.gz: 0d707e5f5ecda9181a6673df0537696d9c8046fe3a01956bee5091e72c39e58f
5
5
  SHA512:
6
- metadata.gz: 3bc8e410bc84697b17ddaa0d5afc6fb4e9fd7ae2e775375e3b7b03a31c4fee2628d2fe964aeba93e00ae512d6df1d9338037b667f71907ed1453e0bedb8d0fa0
7
- data.tar.gz: 711c266fbc227fa51bc37bff2b3d2cca8ae6c5fc595d7ae1121fce9876cae05974dcae56a259d2f380f2712908f6fe02bcafba8b8b3a1754fb72fd1aa10de288
6
+ metadata.gz: 1833dab42fd2c96295317d99061a90b1e38b592bea66b4c7b672f013cd915cb09f476984545a244741cac62f37054a66e09e00eb1a0a287fd4b689153098baaa
7
+ data.tar.gz: 00a7ade548bf735d0cd9ca2fbca6a74e1beb6b15c4719a34b06923db6ff9a56b8a43387a6810ec5ee204fd32dab0a916cd5d3f245176473b658dad75a31eb4f9
Binary file
@@ -1,8 +1,7 @@
1
1
  # Usage (from the repo root):
2
- # env FLIPPER_CLOUD_TOKEN=<token> FLIPPER_CLOUD_SYNC_SECRET=<secret> FLIPPER_CLOUD_SYNC_METHOD=webhook bundle exec rackup examples/ui/basic.ru -p 9999
3
- # env FLIPPER_CLOUD_TOKEN=<token> FLIPPER_CLOUD_SYNC_SECRET=<secret> FLIPPER_CLOUD_SYNC_METHOD=webhook bundle exec shotgun examples/ui/basic.ru -p 9999
2
+ # env FLIPPER_CLOUD_TOKEN=<token> FLIPPER_CLOUD_SYNC_SECRET=<secret> FLIPPER_CLOUD_SYNC_METHOD=webhook bundle exec rackup examples/cloud/app.ru -p 9999
3
+ # env FLIPPER_CLOUD_TOKEN=<token> FLIPPER_CLOUD_SYNC_SECRET=<secret> FLIPPER_CLOUD_SYNC_METHOD=webhook bundle exec shotgun examples/cloud/app.ru -p 9999
4
4
  # http://localhost:9999/
5
- # http://localhost:9999/webhooks
6
5
 
7
6
  require 'pathname'
8
7
  root_path = Pathname(__FILE__).dirname.join('..').expand_path
@@ -1,5 +1,5 @@
1
1
  # Usage (from the repo root):
2
- # env TOKEN=<token> bundle exec ruby examples/cloud/basic.rb
2
+ # env FLIPPER_CLOUD_TOKEN=<token> bundle exec ruby examples/cloud/basic.rb
3
3
  require 'pathname'
4
4
  require 'logger'
5
5
  root_path = Pathname(__FILE__).dirname.join('..').expand_path
@@ -7,7 +7,7 @@ lib_path = root_path.join('lib')
7
7
  $:.unshift(lib_path)
8
8
 
9
9
  require 'flipper/cloud'
10
- flipper = Flipper::Cloud.new(ENV.fetch('TOKEN'))
10
+ flipper = Flipper::Cloud.new
11
11
 
12
12
  flipper[:stats].enable
13
13
 
@@ -1,3 +1,4 @@
1
+ # env FLIPPER_CLOUD_TOKEN=<token> bundle exec ruby examples/cloud/cached_in_memory.rb
1
2
  require File.expand_path('../../example_setup', __FILE__)
2
3
 
3
4
  require 'flipper/cloud'
@@ -5,12 +6,11 @@ require 'flipper/adapters/active_support_cache_store'
5
6
  require 'active_support/cache'
6
7
  require 'active_support/cache/memory_store'
7
8
 
8
- token = ENV.fetch("TOKEN") { abort "TOKEN environment variable not set." }
9
9
  feature_name = ENV.fetch("FEATURE") { "testing" }.to_sym
10
10
 
11
11
  Flipper.configure do |config|
12
12
  config.default do
13
- Flipper::Cloud.new(token) do |cloud|
13
+ Flipper::Cloud.new do |cloud|
14
14
  cloud.debug_output = STDOUT
15
15
  cloud.adapter do |adapter|
16
16
  Flipper::Adapters::ActiveSupportCacheStore.new(adapter,
@@ -1,5 +1,5 @@
1
1
  # Usage (from the repo root):
2
- # env TOKEN=<token> bundle exec ruby examples/cloud/basic.rb
2
+ # env FLIPPER_CLOUD_TOKEN=<token> bundle exec ruby examples/cloud/import.rb
3
3
  require 'pathname'
4
4
  require 'logger'
5
5
  root_path = Pathname(__FILE__).dirname.join('..').expand_path
@@ -10,14 +10,14 @@ require 'flipper'
10
10
  require 'flipper/cloud'
11
11
 
12
12
  memory_adapter = Flipper::Adapters::Memory.new
13
- memory_flipper = Flipper.new(memory_adapter)
13
+ flipper = Flipper.new(memory_adapter)
14
14
 
15
- memory_flipper.enable(:test)
16
- memory_flipper.enable(:search)
17
- memory_flipper.enable_actor(:stats, Flipper::Actor.new("jnunemaker"))
18
- memory_flipper.enable_percentage_of_time(:logging, 5)
15
+ flipper.enable(:test)
16
+ flipper.enable(:search)
17
+ flipper.enable_actor(:stats, Flipper::Actor.new("jnunemaker"))
18
+ flipper.enable_percentage_of_time(:logging, 5)
19
19
 
20
- flipper = Flipper::Cloud.new(ENV.fetch('TOKEN'))
20
+ cloud = Flipper::Cloud.new
21
21
 
22
- # wipes cloud clean and makes it identical to memory flipper
23
- flipper.import(memory_flipper)
22
+ # makes cloud identical to memory flipper
23
+ cloud.import(flipper)
@@ -5,13 +5,13 @@
5
5
  # never raise. You could get a slow request every now and then if cloud is
6
6
  # unavailable, but we are hoping to fix that soon by doing the cloud update in a
7
7
  # background thread.
8
+ # env FLIPPER_CLOUD_TOKEN=<token> bundle exec ruby examples/cloud/local_adapter.rb
8
9
  require File.expand_path('../../example_setup', __FILE__)
9
10
 
10
11
  require 'logger'
11
12
  require 'flipper/cloud'
12
13
  require 'flipper/adapters/redis'
13
14
 
14
- token = ENV.fetch("TOKEN") { abort "TOKEN environment variable not set." }
15
15
  feature_name = ENV.fetch("FEATURE") { "testing" }.to_sym
16
16
 
17
17
  redis = Redis.new(logger: Logger.new(STDOUT))
@@ -19,7 +19,7 @@ redis.flushdb
19
19
 
20
20
  Flipper.configure do |config|
21
21
  config.default do
22
- Flipper::Cloud.new(token) do |cloud|
22
+ Flipper::Cloud.new do |cloud|
23
23
  cloud.debug_output = STDOUT
24
24
  cloud.local_adapter = Flipper::Adapters::Redis.new(redis)
25
25
  cloud.sync_interval = 10
@@ -1,3 +1,4 @@
1
+ require "socket"
1
2
  require "flipper/adapters/http"
2
3
  require "flipper/adapters/memory"
3
4
  require "flipper/adapters/dual_write"
@@ -68,7 +69,7 @@ module Flipper
68
69
  @token = options.fetch(:token) { ENV["FLIPPER_CLOUD_TOKEN"] }
69
70
 
70
71
  if @token.nil?
71
- raise ArgumentError, "Flipper::Cloud token is missing. Please set FLIPPER_CLOUD_TOKEN or provide the token used to validate webhooks (e.g. Flipper::Cloud.new('token'))."
72
+ raise ArgumentError, "Flipper::Cloud token is missing. Please set FLIPPER_CLOUD_TOKEN or provide the token (e.g. Flipper::Cloud.new('token'))."
72
73
  end
73
74
 
74
75
  @instrumenter = options.fetch(:instrumenter, Instrumenters::Noop)
@@ -153,6 +154,11 @@ module Flipper
153
154
  headers: {
154
155
  "Flipper-Cloud-Token" => @token,
155
156
  "Feature-Flipper-Token" => @token,
157
+ "Client-Lang" => "ruby",
158
+ "Client-Lang-Version" => "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})",
159
+ "Client-Platform" => RUBY_PLATFORM,
160
+ "Client-Engine" => defined?(RUBY_ENGINE) ? RUBY_ENGINE : "",
161
+ "Client-Hostname" => Socket.gethostname,
156
162
  },
157
163
  })
158
164
  end
@@ -7,6 +7,8 @@ module Flipper
7
7
  class Middleware
8
8
  # Internal: The path to match for webhook requests.
9
9
  WEBHOOK_PATH = %r{\A/webhooks\/?\Z}
10
+ # Internal: The root path to match for requests.
11
+ ROOT_PATH = %r{\A/\Z}
10
12
 
11
13
  def initialize(app, options = {})
12
14
  @app = app
@@ -19,7 +21,7 @@ module Flipper
19
21
 
20
22
  def call!(env)
21
23
  request = Rack::Request.new(env)
22
- if request.post? && request.path_info.match(WEBHOOK_PATH)
24
+ if request.post? && (request.path_info.match(ROOT_PATH) || request.path_info.match(WEBHOOK_PATH))
23
25
  status = 200
24
26
  headers = {
25
27
  "Content-Type" => "application/json",
@@ -32,10 +34,20 @@ module Flipper
32
34
  begin
33
35
  message_verifier = MessageVerifier.new(secret: flipper.sync_secret)
34
36
  if message_verifier.verify(payload, signature)
35
- flipper.sync
36
- body = JSON.generate({
37
- groups: Flipper.group_names.map { |name| {name: name}}
38
- })
37
+ begin
38
+ flipper.sync
39
+ body = JSON.generate({
40
+ groups: Flipper.group_names.map { |name| {name: name}}
41
+ })
42
+ rescue Flipper::Adapters::Http::Error => error
43
+ status = error.response.code.to_i == 402 ? 402 : 500
44
+ headers["Flipper-Cloud-Response-Error-Class"] = error.class.name
45
+ headers["Flipper-Cloud-Response-Error-Message"] = error.message
46
+ rescue => error
47
+ status = 500
48
+ headers["Flipper-Cloud-Response-Error-Class"] = error.class.name
49
+ headers["Flipper-Cloud-Response-Error-Message"] = error.message
50
+ end
39
51
  end
40
52
  rescue MessageVerifier::InvalidSignature
41
53
  status = 400
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.20.0.beta3'.freeze
2
+ VERSION = '0.20.4'.freeze
3
3
  end
@@ -53,7 +53,7 @@ RSpec.describe Flipper::Cloud::Middleware do
53
53
  env = {
54
54
  "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
55
55
  }
56
- post '/webhooks', request_body, env
56
+ post '/', request_body, env
57
57
 
58
58
  expect(last_response.status).to eq(200)
59
59
  expect(JSON.parse(last_response.body)).to eq({
@@ -80,13 +80,82 @@ RSpec.describe Flipper::Cloud::Middleware do
80
80
  env = {
81
81
  "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
82
82
  }
83
- post '/webhooks', request_body, env
83
+ post '/', request_body, env
84
84
 
85
85
  expect(last_response.status).to eq(400)
86
86
  expect(stub).not_to have_been_requested
87
87
  end
88
88
  end
89
89
 
90
+ context "when flipper cloud responds with 402" do
91
+ let(:app) { Flipper::Cloud.app(flipper) }
92
+
93
+ it "results in 402" do
94
+ Flipper.register(:admins) { |*args| false }
95
+ Flipper.register(:staff) { |*args| false }
96
+ Flipper.register(:basic) { |*args| false }
97
+ Flipper.register(:plus) { |*args| false }
98
+ Flipper.register(:premium) { |*args| false }
99
+
100
+ stub = stub_request_for_token('regular', status: 402)
101
+ env = {
102
+ "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
103
+ }
104
+ post '/', request_body, env
105
+
106
+ expect(last_response.status).to eq(402)
107
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Class"]).to eq("Flipper::Adapters::Http::Error")
108
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Message"]).to eq("Failed with status: 402")
109
+ expect(stub).to have_been_requested
110
+ end
111
+ end
112
+
113
+ context "when flipper cloud responds with non-402 and non-2xx code" do
114
+ let(:app) { Flipper::Cloud.app(flipper) }
115
+
116
+ it "results in 500" do
117
+ Flipper.register(:admins) { |*args| false }
118
+ Flipper.register(:staff) { |*args| false }
119
+ Flipper.register(:basic) { |*args| false }
120
+ Flipper.register(:plus) { |*args| false }
121
+ Flipper.register(:premium) { |*args| false }
122
+
123
+ stub = stub_request_for_token('regular', status: 503)
124
+ env = {
125
+ "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
126
+ }
127
+ post '/', request_body, env
128
+
129
+ expect(last_response.status).to eq(500)
130
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Class"]).to eq("Flipper::Adapters::Http::Error")
131
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Message"]).to eq("Failed with status: 503")
132
+ expect(stub).to have_been_requested
133
+ end
134
+ end
135
+
136
+ context "when flipper cloud responds with timeout" do
137
+ let(:app) { Flipper::Cloud.app(flipper) }
138
+
139
+ it "results in 500" do
140
+ Flipper.register(:admins) { |*args| false }
141
+ Flipper.register(:staff) { |*args| false }
142
+ Flipper.register(:basic) { |*args| false }
143
+ Flipper.register(:plus) { |*args| false }
144
+ Flipper.register(:premium) { |*args| false }
145
+
146
+ stub = stub_request_for_token('regular', status: :timeout)
147
+ env = {
148
+ "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
149
+ }
150
+ post '/', request_body, env
151
+
152
+ expect(last_response.status).to eq(500)
153
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Class"]).to eq("Net::OpenTimeout")
154
+ expect(last_response.headers["Flipper-Cloud-Response-Error-Message"]).to eq("execution expired")
155
+ expect(stub).to have_been_requested
156
+ end
157
+ end
158
+
90
159
  context 'when initialized with flipper instance and flipper instance in env' do
91
160
  let(:app) { Flipper::Cloud.app(flipper) }
92
161
  let(:signature) {
@@ -99,7 +168,7 @@ RSpec.describe Flipper::Cloud::Middleware do
99
168
  "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
100
169
  'flipper' => env_flipper,
101
170
  }
102
- post '/webhooks', request_body, env
171
+ post '/', request_body, env
103
172
 
104
173
  expect(last_response.status).to eq(200)
105
174
  expect(stub).to have_been_requested
@@ -118,7 +187,7 @@ RSpec.describe Flipper::Cloud::Middleware do
118
187
  "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
119
188
  'flipper' => env_flipper,
120
189
  }
121
- post '/webhooks', request_body, env
190
+ post '/', request_body, env
122
191
 
123
192
  expect(last_response.status).to eq(200)
124
193
  expect(stub).to have_been_requested
@@ -138,7 +207,7 @@ RSpec.describe Flipper::Cloud::Middleware do
138
207
  'flipper' => flipper,
139
208
  'flipper_cloud' => env_flipper,
140
209
  }
141
- post '/webhooks', request_body, env
210
+ post '/', request_body, env
142
211
 
143
212
  expect(last_response.status).to eq(200)
144
213
  expect(stub).to have_been_requested
@@ -149,6 +218,27 @@ RSpec.describe Flipper::Cloud::Middleware do
149
218
  let(:app) { Flipper::Cloud.app(-> { flipper }) }
150
219
 
151
220
  it 'works' do
221
+ stub = stub_request_for_token('regular')
222
+ env = {
223
+ "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
224
+ }
225
+ post '/', request_body, env
226
+
227
+ expect(last_response.status).to eq(200)
228
+ expect(stub).to have_been_requested
229
+ end
230
+ end
231
+
232
+ context 'when using older /webhooks path' do
233
+ let(:app) { Flipper::Cloud.app(flipper) }
234
+
235
+ it 'uses instance to sync' do
236
+ Flipper.register(:admins) { |*args| false }
237
+ Flipper.register(:staff) { |*args| false }
238
+ Flipper.register(:basic) { |*args| false }
239
+ Flipper.register(:plus) { |*args| false }
240
+ Flipper.register(:premium) { |*args| false }
241
+
152
242
  stub = stub_request_for_token('regular')
153
243
  env = {
154
244
  "HTTP_FLIPPER_CLOUD_SIGNATURE" => signature_header_value,
@@ -156,13 +246,22 @@ RSpec.describe Flipper::Cloud::Middleware do
156
246
  post '/webhooks', request_body, env
157
247
 
158
248
  expect(last_response.status).to eq(200)
249
+ expect(JSON.parse(last_response.body)).to eq({
250
+ "groups" => [
251
+ {"name" => "admins"},
252
+ {"name" => "staff"},
253
+ {"name" => "basic"},
254
+ {"name" => "plus"},
255
+ {"name" => "premium"},
256
+ ],
257
+ })
159
258
  expect(stub).to have_been_requested
160
259
  end
161
260
  end
162
261
 
163
262
  describe 'Request method unsupported' do
164
263
  it 'skips middleware' do
165
- get '/webhooks'
264
+ get '/'
166
265
  expect(last_response.status).to eq(404)
167
266
  expect(last_response.content_type).to eq("application/json")
168
267
  expect(last_response.body).to eq("{}")
@@ -177,12 +276,17 @@ RSpec.describe Flipper::Cloud::Middleware do
177
276
 
178
277
  private
179
278
 
180
- def stub_request_for_token(token)
181
- stub_request(:get, "https://www.flippercloud.io/adapter/features").
279
+ def stub_request_for_token(token, status: 200)
280
+ stub = stub_request(:get, "https://www.flippercloud.io/adapter/features").
182
281
  with({
183
282
  headers: {
184
283
  'Flipper-Cloud-Token' => token,
185
284
  },
186
- }).to_return(status: 200, body: response_body, headers: {})
285
+ })
286
+ if status == :timeout
287
+ stub.to_timeout
288
+ else
289
+ stub.to_return(status: status, body: response_body, headers: {})
290
+ end
187
291
  end
188
292
  end
@@ -114,4 +114,89 @@ RSpec.describe Flipper::Cloud do
114
114
  described_class.new('asdf', open_timeout: 1)
115
115
  end
116
116
  end
117
+
118
+ it 'can import' do
119
+ stub_request(:post, /www\.flippercloud\.io\/adapter\/features.*/).
120
+ with(headers: {
121
+ 'Feature-Flipper-Token'=>'asdf',
122
+ 'Flipper-Cloud-Token'=>'asdf',
123
+ }).to_return(status: 200, body: "{}", headers: {})
124
+
125
+ flipper = Flipper.new(Flipper::Adapters::Memory.new)
126
+
127
+ flipper.enable(:test)
128
+ flipper.enable(:search)
129
+ flipper.enable_actor(:stats, Flipper::Actor.new("jnunemaker"))
130
+ flipper.enable_percentage_of_time(:logging, 5)
131
+
132
+ cloud_flipper = Flipper::Cloud.new("asdf")
133
+
134
+ get_all = {
135
+ "logging" => {actors: Set.new, boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: "5"},
136
+ "search" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
137
+ "stats" => {actors: Set["jnunemaker"], boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
138
+ "test" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
139
+ }
140
+
141
+ expect(flipper.adapter.get_all).to eq(get_all)
142
+ cloud_flipper.import(flipper)
143
+ expect(flipper.adapter.get_all).to eq(get_all)
144
+ expect(cloud_flipper.adapter.get_all).to eq(get_all)
145
+ end
146
+
147
+ it 'raises error for failure while importing' do
148
+ stub_request(:post, /www\.flippercloud\.io\/adapter\/features.*/).
149
+ with(headers: {
150
+ 'Feature-Flipper-Token'=>'asdf',
151
+ 'Flipper-Cloud-Token'=>'asdf',
152
+ }).to_return(status: 500, body: "{}")
153
+
154
+ flipper = Flipper.new(Flipper::Adapters::Memory.new)
155
+
156
+ flipper.enable(:test)
157
+ flipper.enable(:search)
158
+ flipper.enable_actor(:stats, Flipper::Actor.new("jnunemaker"))
159
+ flipper.enable_percentage_of_time(:logging, 5)
160
+
161
+ cloud_flipper = Flipper::Cloud.new("asdf")
162
+
163
+ get_all = {
164
+ "logging" => {actors: Set.new, boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: "5"},
165
+ "search" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
166
+ "stats" => {actors: Set["jnunemaker"], boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
167
+ "test" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
168
+ }
169
+
170
+ expect(flipper.adapter.get_all).to eq(get_all)
171
+ expect { cloud_flipper.import(flipper) }.to raise_error(Flipper::Adapters::Http::Error)
172
+ expect(flipper.adapter.get_all).to eq(get_all)
173
+ end
174
+
175
+ it 'raises error for timeout while importing' do
176
+ stub_request(:post, /www\.flippercloud\.io\/adapter\/features.*/).
177
+ with(headers: {
178
+ 'Feature-Flipper-Token'=>'asdf',
179
+ 'Flipper-Cloud-Token'=>'asdf',
180
+ }).to_timeout
181
+
182
+ flipper = Flipper.new(Flipper::Adapters::Memory.new)
183
+
184
+ flipper.enable(:test)
185
+ flipper.enable(:search)
186
+ flipper.enable_actor(:stats, Flipper::Actor.new("jnunemaker"))
187
+ flipper.enable_percentage_of_time(:logging, 5)
188
+
189
+ cloud_flipper = Flipper::Cloud.new("asdf")
190
+
191
+ get_all = {
192
+ "logging" => {actors: Set.new, boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: "5"},
193
+ "search" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
194
+ "stats" => {actors: Set["jnunemaker"], boolean: nil, groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
195
+ "test" => {actors: Set.new, boolean: "true", groups: Set.new, percentage_of_actors: nil, percentage_of_time: nil},
196
+ }
197
+
198
+ expect(flipper.adapter.get_all).to eq(get_all)
199
+ expect { cloud_flipper.import(flipper) }.to raise_error(Net::OpenTimeout)
200
+ expect(flipper.adapter.get_all).to eq(get_all)
201
+ end
117
202
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0.beta3
4
+ version: 0.20.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-17 00:00:00.000000000 Z
11
+ date: 2021-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: flipper
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.20.0.beta3
19
+ version: 0.20.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.20.0.beta3
26
+ version: 0.20.4
27
27
  description:
28
28
  email:
29
29
  - nunemaker@gmail.com
@@ -31,6 +31,7 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - docs/images/flipper_cloud.png
34
35
  - examples/cloud/app.ru
35
36
  - examples/cloud/basic.rb
36
37
  - examples/cloud/cached_in_memory.rb
@@ -65,9 +66,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
66
  version: '0'
66
67
  required_rubygems_version: !ruby/object:Gem::Requirement
67
68
  requirements:
68
- - - ">"
69
+ - - ">="
69
70
  - !ruby/object:Gem::Version
70
- version: 1.3.1
71
+ version: '0'
71
72
  requirements: []
72
73
  rubygems_version: 3.0.3
73
74
  signing_key: