flipper 0.15.0 → 0.16.0

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.
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: