flipper 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +12 -1
  3. data/README.md +0 -2
  4. data/docs/Adapters.md +1 -2
  5. data/docs/Optimization.md +0 -5
  6. data/docs/read-only/README.md +0 -1
  7. data/examples/basic.rb +0 -1
  8. data/examples/configuring_default.rb +0 -1
  9. data/examples/dsl.rb +0 -1
  10. data/examples/enabled_for_actor.rb +0 -1
  11. data/examples/group.rb +0 -1
  12. data/examples/group_dynamic_lookup.rb +0 -1
  13. data/examples/group_with_members.rb +0 -1
  14. data/examples/individual_actor.rb +0 -1
  15. data/examples/instrumentation.rb +0 -1
  16. data/examples/percentage_of_actors.rb +0 -1
  17. data/examples/percentage_of_actors_enabled_check.rb +0 -1
  18. data/examples/percentage_of_actors_group.rb +0 -1
  19. data/examples/percentage_of_time.rb +0 -1
  20. data/flipper.gemspec +2 -0
  21. data/lib/flipper.rb +15 -2
  22. data/lib/flipper/adapter.rb +2 -0
  23. data/lib/flipper/adapters/instrumented.rb +0 -1
  24. data/lib/flipper/adapters/pstore.rb +1 -0
  25. data/lib/flipper/adapters/read_only.rb +2 -0
  26. data/lib/flipper/adapters/sync.rb +0 -1
  27. data/lib/flipper/adapters/sync/interval_synchronizer.rb +7 -6
  28. data/lib/flipper/adapters/sync/synchronizer.rb +0 -1
  29. data/lib/flipper/dsl.rb +10 -3
  30. data/lib/flipper/feature.rb +8 -2
  31. data/lib/flipper/gate_values.rb +1 -0
  32. data/lib/flipper/metadata.rb +5 -0
  33. data/lib/flipper/type.rb +0 -7
  34. data/lib/flipper/typecast.rb +2 -0
  35. data/lib/flipper/types/boolean.rb +2 -0
  36. data/lib/flipper/types/percentage.rb +2 -0
  37. data/lib/flipper/version.rb +1 -1
  38. data/spec/flipper/adapter_spec.rb +0 -1
  39. data/spec/flipper/adapters/instrumented_spec.rb +0 -1
  40. data/spec/flipper/adapters/memoizable_spec.rb +0 -1
  41. data/spec/flipper/adapters/memory_spec.rb +0 -1
  42. data/spec/flipper/adapters/operation_logger_spec.rb +0 -1
  43. data/spec/flipper/adapters/sync/interval_synchronizer_spec.rb +4 -4
  44. data/spec/flipper/adapters/sync_spec.rb +0 -1
  45. data/spec/flipper/dsl_spec.rb +11 -1
  46. data/spec/flipper/feature_spec.rb +22 -1
  47. data/spec/flipper/instrumentation/log_subscriber_spec.rb +0 -1
  48. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +0 -1
  49. data/spec/flipper/instrumenters/noop_spec.rb +0 -1
  50. data/spec/flipper/middleware/memoizer_spec.rb +0 -2
  51. data/spec/flipper_spec.rb +4 -0
  52. data/spec/integration_spec.rb +0 -1
  53. data/spec/support/spec_helpers.rb +0 -1
  54. data/test/adapters/memory_test.rb +0 -1
  55. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e763a777dcfe1cdd82ce50066de8634e364050ca
4
- data.tar.gz: 6ca538b415aba3638eb2ec2ffa713d964c2b8011
3
+ metadata.gz: 49607173763cd256cdb8f6a9ef1ada1fb213092a
4
+ data.tar.gz: 123bcd59f941d0a4673526132bab358c75ada4ae
5
5
  SHA512:
6
- metadata.gz: af7780249550d2d8a332de8b78715b1db2f0652699a010231292ffc2b8efed5b2059329fe3f8f191bc5cfbfffd145bb2f62697bf0e842a909c950f0f82c14022
7
- data.tar.gz: 7fd80434279dd6e51f9084855ea9c892db1dac7cb839731b1775a42bc03c0b69b649adca3a88db3fc74f37a53127a7d759d67a9f7acdf50e9a02eb1cc1ae6f4e
6
+ metadata.gz: bf6951c97102685c5222c8b096133857b0a7a3251190cd3e6cf8885b0260463c341b8bb9f02e100e2ea2f541999ff6c7c53e6d4f73abed1cea09c8327f70acd4
7
+ data.tar.gz: 10ecb72720e4b8a58956d025351118810baa6c20c82ec629ea6c5117b870cf2ef499958ba6efd6e924ecfadc86776a73be66a11c200251e39d08c64897452c72
@@ -1,4 +1,15 @@
1
- ## master (to be 0.15.0)
1
+ ## 0.16.0
2
+
3
+ ### Bug Fixes
4
+
5
+ * Support slashes in feature names (https://github.com/jnunemaker/flipper/pull/362).
6
+
7
+ ### Additions/Changes
8
+
9
+ * Re-order gates for improved performance in some cases (https://github.com/jnunemaker/flipper/pull/370).
10
+ * Add Feature#exist?, DSL#exist? and Flipper#exist? (https://github.com/jnunemaker/flipper/pull/371).
11
+
12
+ ## 0.15.0
2
13
 
3
14
  * Move Flipper::UI configuration options to Flipper::UI::Configuration (https://github.com/jnunemaker/flipper/pull/345).
4
15
  * Bug fix in adapter synchronizing and switched DSL#import to use Synchronizer (https://github.com/jnunemaker/flipper/pull/347).
data/README.md CHANGED
@@ -39,7 +39,6 @@ The goal of the API for flipper was to have everything revolve around features a
39
39
 
40
40
  ```ruby
41
41
  require 'flipper'
42
- require 'flipper/adapters/memory'
43
42
 
44
43
  Flipper.configure do |config|
45
44
  config.default do
@@ -105,4 +104,3 @@ Of course there are more [examples for you to peruse](examples/). You could also
105
104
  | ![@alexwheeler](https://avatars3.githubusercontent.com/u/3260042?s=64) | [@alexwheeler](https://github.com/alexwheeler) | api |
106
105
  | ![@thetimbanks](https://avatars1.githubusercontent.com/u/471801?s=64) | [@thetimbanks](https://github.com/thetimbanks) | ui |
107
106
  | ![@lazebny](https://avatars1.githubusercontent.com/u/6276766?s=64) | [@lazebny](https://github.com/lazebny) | docker |
108
-
@@ -9,6 +9,7 @@ I plan on supporting the adapters in the flipper repo. Other adapters are welcom
9
9
  * [Cassanity adapter](https://github.com/jnunemaker/flipper-cassanity)
10
10
  * [Http adapter](https://github.com/jnunemaker/flipper/blob/master/docs/http)
11
11
  * [memory adapter](https://github.com/jnunemaker/flipper/blob/master/lib/flipper/adapters/memory.rb) – great for tests
12
+ * [Moneta adapter](https://github.com/jnunemaker/flipper/blob/master/docs/moneta)
12
13
  * [Mongo adapter](https://github.com/jnunemaker/flipper/blob/master/docs/mongo)
13
14
  * [PStore adapter](https://github.com/jnunemaker/flipper/blob/master/lib/flipper/adapters/pstore.rb) – great for when a local file is enough
14
15
  * [read-only adapter](https://github.com/jnunemaker/flipper/blob/master/docs/read-only)
@@ -43,7 +44,6 @@ For example, here is what the in-memory adapter spec looks like:
43
44
 
44
45
  ```ruby
45
46
  require 'helper'
46
- require 'flipper/adapters/memory'
47
47
 
48
48
  # The shared specs are included with the flipper gem so you can use them in
49
49
  # separate adapter specific gems.
@@ -67,7 +67,6 @@ Here is what an in-memory adapter MiniTest looks like:
67
67
 
68
68
  ```ruby
69
69
  require 'test_helper'
70
- require 'flipper/adapters/memory'
71
70
 
72
71
  class MemoryTest < MiniTest::Test
73
72
  prepend SharedAdapterTests
@@ -15,7 +15,6 @@ Flipper.configure do |config|
15
15
  end
16
16
 
17
17
  # This assumes you setup a default flipper instance using configure.
18
- require 'flipper/middleware/memoizer'
19
18
  config.middleware.use Flipper::Middleware::Memoizer
20
19
  ```
21
20
 
@@ -24,8 +23,6 @@ config.middleware.use Flipper::Middleware::Memoizer
24
23
  **Also Note**: If you haven't setup a default instance, you can pass the instance to `SetupEnv` as `Memoizer` uses whatever is setup in the `env`:
25
24
 
26
25
  ```ruby
27
- require 'flipper/middleware/setup_env'
28
- require 'flipper/middleware/memoizer'
29
26
  config.middleware.use Flipper::Middleware::SetupEnv, -> { Flipper.new(...) }
30
27
  config.middleware.use Flipper::Middleware::Memoizer
31
28
  ```
@@ -78,7 +75,6 @@ Initialize `RedisCache` with a flipper [adapter](https://github.com/jnunemaker/
78
75
  Example using the RedisCache adapter with the Memory adapter and a TTL of 4800 seconds:
79
76
 
80
77
  ```ruby
81
- require 'flipper/adapters/memory'
82
78
  require 'flipper/adapters/redis_cache'
83
79
 
84
80
  redis = Redis.new(url: ENV['REDIS_URL'])
@@ -107,7 +103,6 @@ Example using the ActiveSupportCacheStore adapter with ActiveSupport's [MemorySt
107
103
 
108
104
  ```ruby
109
105
  require 'active_support/cache'
110
- require 'flipper/adapters/memory'
111
106
  require 'flipper/adapters/active_support_cache_store'
112
107
 
113
108
  memory_adapter = Flipper::Adapters::Memory.new
@@ -8,7 +8,6 @@ Any attempted write raises `Flipper::Adapters::ReadOnly::WriteAttempted` with m
8
8
  ## Usage
9
9
  ```ruby
10
10
  # example wrapping memory adapter
11
- require 'flipper/adapters/memory'
12
11
  require 'flipper/adapters/read_only'
13
12
 
14
13
  memory_adapter = Flipper::Adapters::Memory.new
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  Flipper.configure do |config|
7
6
  config.default do
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  # sets up default adapter so Flipper works like Flipper::DSL
7
6
  Flipper.configure do |config|
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  # Some class that represents what will be trying to do something
7
6
  class User
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -13,7 +13,6 @@ class FlipperSubscriber
13
13
  end
14
14
 
15
15
  require 'flipper'
16
- require 'flipper/adapters/memory'
17
16
  require 'flipper/adapters/instrumented'
18
17
 
19
18
  # pick an adapter
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -5,7 +5,6 @@
5
5
  # plucked from memcached, redis, mysql or whatever.
6
6
  require File.expand_path('../example_setup', __FILE__)
7
7
  require 'flipper'
8
- require 'flipper/adapters/memory'
9
8
 
10
9
  adapter = Flipper::Adapters::Memory.new
11
10
  flipper = Flipper.new(adapter)
@@ -1,7 +1,6 @@
1
1
  require File.expand_path('../example_setup', __FILE__)
2
2
 
3
3
  require 'flipper'
4
- require 'flipper/adapters/memory'
5
4
 
6
5
  adapter = Flipper::Adapters::Memory.new
7
6
  flipper = Flipper.new(adapter)
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require File.expand_path('../lib/flipper/version', __FILE__)
3
+ require File.expand_path('../lib/flipper/metadata', __FILE__)
3
4
 
4
5
  plugin_files = []
5
6
  plugin_test_files = []
@@ -34,4 +35,5 @@ Gem::Specification.new do |gem|
34
35
  gem.name = 'flipper'
35
36
  gem.require_paths = ['lib']
36
37
  gem.version = Flipper::VERSION
38
+ gem.metadata = Flipper::METADATA
37
39
  end
@@ -64,7 +64,7 @@ module Flipper
64
64
  :enable_percentage_of_time, :disable_percentage_of_time,
65
65
  :time, :percentage_of_time,
66
66
  :features, :feature, :[], :preload, :preload_all,
67
- :adapter, :add, :remove, :import,
67
+ :adapter, :add, :exist?, :remove, :import,
68
68
  :memoize=, :memoizing?
69
69
 
70
70
  # Public: Use this to register a group by name.
@@ -140,12 +140,25 @@ module Flipper
140
140
  end
141
141
 
142
142
  require 'flipper/actor'
143
- require 'flipper/configuration'
144
143
  require 'flipper/adapter'
144
+ require 'flipper/adapters/memoizable'
145
+ require 'flipper/adapters/memory'
146
+ require 'flipper/adapters/instrumented'
147
+ require 'flipper/configuration'
145
148
  require 'flipper/dsl'
146
149
  require 'flipper/errors'
147
150
  require 'flipper/feature'
148
151
  require 'flipper/gate'
152
+ require 'flipper/instrumenters/memory'
153
+ require 'flipper/instrumenters/noop'
154
+ require 'flipper/middleware/memoizer'
155
+ require 'flipper/middleware/setup_env'
149
156
  require 'flipper/registry'
150
157
  require 'flipper/type'
158
+ require 'flipper/types/actor'
159
+ require 'flipper/types/boolean'
160
+ require 'flipper/types/group'
161
+ require 'flipper/types/percentage'
162
+ require 'flipper/types/percentage_of_actors'
163
+ require 'flipper/types/percentage_of_time'
151
164
  require 'flipper/typecast'
@@ -1,3 +1,5 @@
1
+ require "set"
2
+ require "flipper/feature"
1
3
  require "flipper/adapters/sync/synchronizer"
2
4
 
3
5
  module Flipper
@@ -1,5 +1,4 @@
1
1
  require 'delegate'
2
- require 'flipper/instrumenters/noop'
3
2
 
4
3
  module Flipper
5
4
  module Adapters
@@ -1,5 +1,6 @@
1
1
  require 'pstore'
2
2
  require 'set'
3
+ require 'flipper'
3
4
 
4
5
  module Flipper
5
6
  module Adapters
@@ -1,3 +1,5 @@
1
+ require 'flipper'
2
+
1
3
  module Flipper
2
4
  module Adapters
3
5
  # Public: Adapter that wraps another adapter and raises for any writes.
@@ -1,4 +1,3 @@
1
- require "flipper/instrumenters/noop"
2
1
  require "flipper/adapters/sync/synchronizer"
3
2
  require "flipper/adapters/sync/interval_synchronizer"
4
3
 
@@ -8,8 +8,8 @@ module Flipper
8
8
  DEFAULT_INTERVAL = 10
9
9
 
10
10
  # Private
11
- def self.now_ms
12
- Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
11
+ def self.now
12
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
13
13
  end
14
14
 
15
15
  # Public: The Float or Integer number of seconds between invocations of
@@ -32,7 +32,7 @@ module Flipper
32
32
  def call
33
33
  return unless time_to_sync?
34
34
 
35
- @last_sync_at = now_ms
35
+ @last_sync_at = now
36
36
  @synchronizer.call
37
37
 
38
38
  nil
@@ -41,11 +41,12 @@ module Flipper
41
41
  private
42
42
 
43
43
  def time_to_sync?
44
- ((now_ms - @last_sync_at) / 1_000.0) >= @interval
44
+ seconds_since_last_sync = now - @last_sync_at
45
+ seconds_since_last_sync >= @interval
45
46
  end
46
47
 
47
- def now_ms
48
- self.class.now_ms
48
+ def now
49
+ self.class.now
49
50
  end
50
51
  end
51
52
  end
@@ -1,6 +1,5 @@
1
1
  require "flipper/feature"
2
2
  require "flipper/gate_values"
3
- require "flipper/instrumenters/noop"
4
3
  require "flipper/adapters/sync/feature_synchronizer"
5
4
 
6
5
  module Flipper
@@ -1,6 +1,4 @@
1
1
  require 'forwardable'
2
- require 'flipper/adapters/memoizable'
3
- require 'flipper/instrumenters/noop'
4
2
 
5
3
  module Flipper
6
4
  class DSL
@@ -153,6 +151,15 @@ module Flipper
153
151
  feature(name).add
154
152
  end
155
153
 
154
+ # Public: Has a feature been added in the adapter.
155
+ #
156
+ # name - The String or Symbol name of the feature.
157
+ #
158
+ # Returns true if added else false.
159
+ def exist?(name)
160
+ feature(name).exist?
161
+ end
162
+
156
163
  # Public: Remove a feature.
157
164
  #
158
165
  # name - The String or Symbol name of the feature.
@@ -210,7 +217,7 @@ module Flipper
210
217
  Types::Boolean.new(value)
211
218
  end
212
219
 
213
- # Public: Event shorter shortcut for getting a boolean type instance.
220
+ # Public: Even shorter shortcut for getting a boolean type instance.
214
221
  #
215
222
  # value - The true or false value for the boolean.
216
223
  #
@@ -3,7 +3,6 @@ require 'flipper/type'
3
3
  require 'flipper/gate'
4
4
  require 'flipper/feature_check_context'
5
5
  require 'flipper/gate_values'
6
- require 'flipper/instrumenters/noop'
7
6
 
8
7
  module Flipper
9
8
  # rubocop:disable Metrics/ClassLength
@@ -77,6 +76,13 @@ module Flipper
77
76
  instrument(:add) { adapter.add(self) }
78
77
  end
79
78
 
79
+ # Public: Does this feature exist in the adapter.
80
+ #
81
+ # Returns true if exists in adapter else false.
82
+ def exist?
83
+ instrument(:exist?) { adapter.features.include?(key) }
84
+ end
85
+
80
86
  # Public: Removes this feature.
81
87
  #
82
88
  # Returns the result of Adapter#remove.
@@ -336,10 +342,10 @@ module Flipper
336
342
  def gates
337
343
  @gates ||= [
338
344
  Gates::Boolean.new,
339
- Gates::Group.new,
340
345
  Gates::Actor.new,
341
346
  Gates::PercentageOfActors.new,
342
347
  Gates::PercentageOfTime.new,
348
+ Gates::Group.new,
343
349
  ]
344
350
  end
345
351
 
@@ -1,4 +1,5 @@
1
1
  require 'set'
2
+ require 'flipper/typecast'
2
3
 
3
4
  module Flipper
4
5
  class GateValues
@@ -0,0 +1,5 @@
1
+ module Flipper
2
+ METADATA = {
3
+ 'changelog_uri' => 'https://github.com/jnunemaker/flipper/blob/master/Changelog.md',
4
+ }.freeze
5
+ end
@@ -14,10 +14,3 @@ module Flipper
14
14
  alias_method :==, :eql?
15
15
  end
16
16
  end
17
-
18
- require 'flipper/types/actor'
19
- require 'flipper/types/boolean'
20
- require 'flipper/types/group'
21
- require 'flipper/types/percentage'
22
- require 'flipper/types/percentage_of_actors'
23
- require 'flipper/types/percentage_of_time'
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module Flipper
2
4
  module Typecast
3
5
  TruthMap = {
@@ -1,3 +1,5 @@
1
+ require 'flipper/typecast'
2
+
1
3
  module Flipper
2
4
  module Types
3
5
  class Boolean < Type
@@ -1,3 +1,5 @@
1
+ require 'flipper/typecast'
2
+
1
3
  module Flipper
2
4
  module Types
3
5
  class Percentage < Type
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.15.0'.freeze
2
+ VERSION = '0.16.0'.freeze
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require 'helper'
2
- require 'flipper/adapters/memory'
3
2
 
4
3
  RSpec.describe Flipper::Adapter do
5
4
  let(:source_flipper) { build_flipper }
@@ -1,5 +1,4 @@
1
1
  require 'helper'
2
- require 'flipper/adapters/memory'
3
2
  require 'flipper/adapters/instrumented'
4
3
  require 'flipper/instrumenters/memory'
5
4
  require 'flipper/spec/shared_adapter_specs'
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/adapters/memoizable'
3
- require 'flipper/adapters/memory'
4
3
  require 'flipper/adapters/operation_logger'
5
4
  require 'flipper/spec/shared_adapter_specs'
6
5
 
@@ -1,5 +1,4 @@
1
1
  require 'helper'
2
- require 'flipper/adapters/memory'
3
2
  require 'flipper/spec/shared_adapter_specs'
4
3
 
5
4
  RSpec.describe Flipper::Adapters::Memory do
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/adapters/operation_logger'
3
- require 'flipper/adapters/memory'
4
3
  require 'flipper/spec/shared_adapter_specs'
5
4
 
6
5
  RSpec.describe Flipper::Adapters::OperationLogger do
@@ -3,7 +3,7 @@ require "flipper/adapters/sync/interval_synchronizer"
3
3
 
4
4
  RSpec.describe Flipper::Adapters::Sync::IntervalSynchronizer do
5
5
  let(:events) { [] }
6
- let(:synchronizer) { -> { events << described_class.now_ms } }
6
+ let(:synchronizer) { -> { events << described_class.now } }
7
7
  let(:interval) { 10 }
8
8
 
9
9
  subject { described_class.new(synchronizer, interval: interval) }
@@ -15,19 +15,19 @@ RSpec.describe Flipper::Adapters::Sync::IntervalSynchronizer do
15
15
  end
16
16
 
17
17
  it "only invokes wrapped synchronizer every interval seconds" do
18
- now = described_class.now_ms
18
+ now = described_class.now
19
19
  subject.call
20
20
  events.clear
21
21
 
22
22
  # move time to one millisecond less than last sync + interval
23
23
  1.upto(interval) do |i|
24
- allow(described_class).to receive(:now_ms).and_return(now + (i * 1_000) - 1)
24
+ allow(described_class).to receive(:now).and_return(now + i - 1)
25
25
  subject.call
26
26
  end
27
27
  expect(events.size).to be(0)
28
28
 
29
29
  # move time to last sync + interval in milliseconds
30
- allow(described_class).to receive(:now_ms).and_return(now + (interval * 1_000))
30
+ allow(described_class).to receive(:now).and_return(now + interval)
31
31
  subject.call
32
32
  expect(events.size).to be(1)
33
33
  end
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/adapters/sync'
3
- require 'flipper/adapters/memory'
4
3
  require 'flipper/adapters/operation_logger'
5
4
  require 'flipper/spec/shared_adapter_specs'
6
5
  require 'active_support/notifications'
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/dsl'
3
- require 'flipper/adapters/memory'
4
3
 
5
4
  RSpec.describe Flipper::DSL do
6
5
  subject { described_class.new(adapter) }
@@ -313,6 +312,17 @@ RSpec.describe Flipper::DSL do
313
312
  end
314
313
  end
315
314
 
315
+ describe '#exist?' do
316
+ it 'returns true if the feature is added in adapter' do
317
+ subject.add(:stats)
318
+ expect(subject.exist?(:stats)).to be(true)
319
+ end
320
+
321
+ it 'returns false if the feature is NOT added in adapter' do
322
+ expect(subject.exist?(:stats)).to be(false)
323
+ end
324
+ end
325
+
316
326
  describe '#remove' do
317
327
  it 'removes the feature' do
318
328
  subject.adapter.add(subject[:stats])
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/feature'
3
- require 'flipper/adapters/memory'
4
3
  require 'flipper/instrumenters/memory'
5
4
 
6
5
  RSpec.describe Flipper::Feature do
@@ -97,6 +96,17 @@ RSpec.describe Flipper::Feature do
97
96
  end
98
97
  end
99
98
 
99
+ describe '#exist?' do
100
+ it 'returns true if feature is added in adapter' do
101
+ subject.add
102
+ expect(subject.exist?).to be(true)
103
+ end
104
+
105
+ it 'returns false if feature is NOT added in adapter' do
106
+ expect(subject.exist?).to be(false)
107
+ end
108
+ end
109
+
100
110
  describe '#remove' do
101
111
  it 'removes feature from adapter' do
102
112
  adapter.add(subject)
@@ -232,6 +242,17 @@ RSpec.describe Flipper::Feature do
232
242
  expect(event.payload[:result]).not_to be_nil
233
243
  end
234
244
 
245
+ it 'is recorded for exist?' do
246
+ subject.exist?
247
+
248
+ event = instrumenter.events.last
249
+ expect(event).not_to be_nil
250
+ expect(event.name).to eq('feature_operation.flipper')
251
+ expect(event.payload[:feature_name]).to eq(:search)
252
+ expect(event.payload[:operation]).to eq(:exist?)
253
+ expect(event.payload[:result]).not_to be_nil
254
+ end
255
+
235
256
  it 'is recorded for remove' do
236
257
  subject.remove
237
258
 
@@ -1,7 +1,6 @@
1
1
  require 'logger'
2
2
  require 'helper'
3
3
  require 'flipper/adapters/instrumented'
4
- require 'flipper/adapters/memory'
5
4
  require 'flipper/instrumentation/log_subscriber'
6
5
 
7
6
  RSpec.describe Flipper::Instrumentation::LogSubscriber do
@@ -1,5 +1,4 @@
1
1
  require 'helper'
2
- require 'flipper/adapters/memory'
3
2
  require 'flipper/adapters/instrumented'
4
3
  require 'flipper/instrumentation/statsd'
5
4
  require 'statsd'
@@ -1,5 +1,4 @@
1
1
  require 'helper'
2
- require 'flipper/instrumenters/noop'
3
2
 
4
3
  RSpec.describe Flipper::Instrumenters::Noop do
5
4
  describe '.instrument' do
@@ -2,10 +2,8 @@ require 'helper'
2
2
  require 'rack/test'
3
3
  require 'active_support/cache'
4
4
  require 'active_support/cache/dalli_store'
5
- require 'flipper/middleware/memoizer'
6
5
  require 'flipper/adapters/active_support_cache_store'
7
6
  require 'flipper/adapters/operation_logger'
8
- require 'flipper/adapters/memory'
9
7
 
10
8
  RSpec.describe Flipper::Middleware::Memoizer do
11
9
  include Rack::Test::Methods
@@ -187,6 +187,10 @@ RSpec.describe Flipper do
187
187
  expect(described_class.add(:search)).to eq(described_class.instance.add(:search))
188
188
  end
189
189
 
190
+ it 'delegates exist? to instance' do
191
+ expect(described_class.exist?(:search)).to eq(described_class.instance.exist?(:search))
192
+ end
193
+
190
194
  it 'delegates remove to instance' do
191
195
  expect(described_class.remove(:search)).to eq(described_class.instance.remove(:search))
192
196
  end
@@ -1,6 +1,5 @@
1
1
  require 'helper'
2
2
  require 'flipper/feature'
3
- require 'flipper/adapters/memory'
4
3
 
5
4
  RSpec.describe Flipper do
6
5
  let(:adapter) { Flipper::Adapters::Memory.new }
@@ -1,5 +1,4 @@
1
1
  require 'json'
2
- require 'flipper/adapters/memory'
3
2
  require 'rack/test'
4
3
 
5
4
  module SpecHelpers
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
- require 'flipper/adapters/memory'
3
2
 
4
3
  class MemoryTest < MiniTest::Test
5
4
  prepend Flipper::Test::SharedAdapterTests
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-12 00:00:00.000000000 Z
11
+ date: 2018-08-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Feature flipper is the act of enabling/disabling features in your application,
14
14
  ideally without re-deploying or changing anything in your code base. Flipper makes
@@ -89,6 +89,7 @@ files:
89
89
  - lib/flipper/instrumentation/subscriber.rb
90
90
  - lib/flipper/instrumenters/memory.rb
91
91
  - lib/flipper/instrumenters/noop.rb
92
+ - lib/flipper/metadata.rb
92
93
  - lib/flipper/middleware/memoizer.rb
93
94
  - lib/flipper/middleware/setup_env.rb
94
95
  - lib/flipper/registry.rb
@@ -154,7 +155,8 @@ files:
154
155
  homepage: https://github.com/jnunemaker/flipper
155
156
  licenses:
156
157
  - MIT
157
- metadata: {}
158
+ metadata:
159
+ changelog_uri: https://github.com/jnunemaker/flipper/blob/master/Changelog.md
158
160
  post_install_message:
159
161
  rdoc_options: []
160
162
  require_paths: