flipper 0.16.0 → 1.4.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 (285) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +1 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/ci.yml +110 -0
  6. data/.github/workflows/examples.yml +105 -0
  7. data/.github/workflows/release.yml +54 -0
  8. data/.rspec +1 -0
  9. data/CLAUDE.md +87 -0
  10. data/Changelog.md +2 -215
  11. data/Dockerfile +1 -1
  12. data/Gemfile +28 -20
  13. data/README.md +72 -62
  14. data/Rakefile +13 -3
  15. data/benchmark/enabled_ips.rb +10 -0
  16. data/benchmark/enabled_multiple_actors_ips.rb +20 -0
  17. data/benchmark/enabled_profile.rb +20 -0
  18. data/benchmark/instrumentation_ips.rb +21 -0
  19. data/benchmark/typecast_ips.rb +27 -0
  20. data/docker-compose.yml +37 -34
  21. data/docs/DockerCompose.md +0 -1
  22. data/docs/README.md +1 -0
  23. data/docs/images/banner.jpg +0 -0
  24. data/docs/images/flipper_cloud.png +0 -0
  25. data/examples/api/basic.ru +18 -0
  26. data/examples/api/custom_memoized.ru +36 -0
  27. data/examples/api/memoized.ru +42 -0
  28. data/examples/basic.rb +1 -12
  29. data/examples/cloud/app.ru +12 -0
  30. data/examples/cloud/backoff_policy.rb +13 -0
  31. data/examples/cloud/basic.rb +22 -0
  32. data/examples/cloud/cloud_setup.rb +20 -0
  33. data/examples/cloud/forked.rb +36 -0
  34. data/examples/cloud/import.rb +17 -0
  35. data/examples/cloud/poll_interval/README.md +111 -0
  36. data/examples/cloud/poll_interval/client.rb +108 -0
  37. data/examples/cloud/poll_interval/server.rb +98 -0
  38. data/examples/cloud/threaded.rb +33 -0
  39. data/examples/configuring_default.rb +2 -5
  40. data/examples/dsl.rb +10 -35
  41. data/examples/enabled_for_actor.rb +10 -15
  42. data/examples/expressions.rb +237 -0
  43. data/examples/group.rb +3 -6
  44. data/examples/group_dynamic_lookup.rb +5 -19
  45. data/examples/group_with_members.rb +4 -14
  46. data/examples/importing.rb +1 -1
  47. data/examples/individual_actor.rb +2 -5
  48. data/examples/instrumentation.rb +2 -2
  49. data/examples/instrumentation_last_accessed_at.rb +38 -0
  50. data/examples/memoizing.rb +35 -0
  51. data/examples/mirroring.rb +59 -0
  52. data/examples/percentage_of_actors.rb +6 -16
  53. data/examples/percentage_of_actors_enabled_check.rb +7 -10
  54. data/examples/percentage_of_actors_group.rb +5 -18
  55. data/examples/percentage_of_time.rb +3 -6
  56. data/examples/strict.rb +18 -0
  57. data/exe/flipper +5 -0
  58. data/flipper-cloud.gemspec +19 -0
  59. data/flipper.gemspec +10 -7
  60. data/lib/flipper/actor.rb +10 -3
  61. data/lib/flipper/adapter.rb +50 -8
  62. data/lib/flipper/adapter_builder.rb +44 -0
  63. data/lib/flipper/adapters/actor_limit.rb +54 -0
  64. data/lib/flipper/adapters/cache_base.rb +161 -0
  65. data/lib/flipper/adapters/dual_write.rb +63 -0
  66. data/lib/flipper/adapters/failover.rb +85 -0
  67. data/lib/flipper/adapters/failsafe.rb +72 -0
  68. data/lib/flipper/adapters/http/client.rb +64 -7
  69. data/lib/flipper/adapters/http/error.rb +19 -1
  70. data/lib/flipper/adapters/http.rb +97 -43
  71. data/lib/flipper/adapters/instrumented.rb +47 -26
  72. data/lib/flipper/adapters/memoizable.rb +44 -40
  73. data/lib/flipper/adapters/memory.rb +75 -111
  74. data/lib/flipper/adapters/operation_logger.rb +22 -78
  75. data/lib/flipper/adapters/poll/poller.rb +2 -0
  76. data/lib/flipper/adapters/poll.rb +52 -0
  77. data/lib/flipper/adapters/pstore.rb +27 -17
  78. data/lib/flipper/adapters/read_only.rb +8 -41
  79. data/lib/flipper/adapters/strict.rb +45 -0
  80. data/lib/flipper/adapters/sync/feature_synchronizer.rb +14 -1
  81. data/lib/flipper/adapters/sync/interval_synchronizer.rb +2 -7
  82. data/lib/flipper/adapters/sync/synchronizer.rb +13 -6
  83. data/lib/flipper/adapters/sync.rb +23 -29
  84. data/lib/flipper/adapters/wrapper.rb +54 -0
  85. data/lib/flipper/cli.rb +314 -0
  86. data/lib/flipper/cloud/configuration.rb +271 -0
  87. data/lib/flipper/cloud/dsl.rb +27 -0
  88. data/lib/flipper/cloud/message_verifier.rb +95 -0
  89. data/lib/flipper/cloud/middleware.rb +63 -0
  90. data/lib/flipper/cloud/migrate.rb +71 -0
  91. data/lib/flipper/cloud/routes.rb +14 -0
  92. data/lib/flipper/cloud/telemetry/backoff_policy.rb +96 -0
  93. data/lib/flipper/cloud/telemetry/instrumenter.rb +22 -0
  94. data/lib/flipper/cloud/telemetry/metric.rb +39 -0
  95. data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
  96. data/lib/flipper/cloud/telemetry/submitter.rb +100 -0
  97. data/lib/flipper/cloud/telemetry.rb +191 -0
  98. data/lib/flipper/cloud.rb +54 -0
  99. data/lib/flipper/configuration.rb +54 -7
  100. data/lib/flipper/dsl.rb +58 -47
  101. data/lib/flipper/engine.rb +102 -0
  102. data/lib/flipper/errors.rb +3 -21
  103. data/lib/flipper/export.rb +24 -0
  104. data/lib/flipper/exporter.rb +17 -0
  105. data/lib/flipper/exporters/json/export.rb +32 -0
  106. data/lib/flipper/exporters/json/v1.rb +33 -0
  107. data/lib/flipper/expression/builder.rb +73 -0
  108. data/lib/flipper/expression/constant.rb +25 -0
  109. data/lib/flipper/expression.rb +71 -0
  110. data/lib/flipper/expressions/all.rb +9 -0
  111. data/lib/flipper/expressions/any.rb +9 -0
  112. data/lib/flipper/expressions/boolean.rb +9 -0
  113. data/lib/flipper/expressions/comparable.rb +13 -0
  114. data/lib/flipper/expressions/equal.rb +9 -0
  115. data/lib/flipper/expressions/feature_enabled.rb +34 -0
  116. data/lib/flipper/expressions/greater_than.rb +9 -0
  117. data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
  118. data/lib/flipper/expressions/less_than.rb +9 -0
  119. data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
  120. data/lib/flipper/expressions/not_equal.rb +9 -0
  121. data/lib/flipper/expressions/now.rb +9 -0
  122. data/lib/flipper/expressions/number.rb +9 -0
  123. data/lib/flipper/expressions/percentage.rb +9 -0
  124. data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
  125. data/lib/flipper/expressions/property.rb +9 -0
  126. data/lib/flipper/expressions/random.rb +9 -0
  127. data/lib/flipper/expressions/string.rb +9 -0
  128. data/lib/flipper/expressions/time.rb +16 -0
  129. data/lib/flipper/feature.rb +95 -28
  130. data/lib/flipper/feature_check_context.rb +10 -6
  131. data/lib/flipper/gate.rb +13 -11
  132. data/lib/flipper/gate_values.rb +5 -18
  133. data/lib/flipper/gates/actor.rb +10 -17
  134. data/lib/flipper/gates/boolean.rb +1 -1
  135. data/lib/flipper/gates/expression.rb +75 -0
  136. data/lib/flipper/gates/group.rb +5 -7
  137. data/lib/flipper/gates/percentage_of_actors.rb +10 -13
  138. data/lib/flipper/gates/percentage_of_time.rb +1 -2
  139. data/lib/flipper/identifier.rb +17 -0
  140. data/lib/flipper/instrumentation/log_subscriber.rb +35 -8
  141. data/lib/flipper/instrumentation/statsd.rb +4 -2
  142. data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
  143. data/lib/flipper/instrumentation/subscriber.rb +8 -5
  144. data/lib/flipper/instrumenters/memory.rb +6 -2
  145. data/lib/flipper/metadata.rb +8 -1
  146. data/lib/flipper/middleware/memoizer.rb +46 -27
  147. data/lib/flipper/middleware/setup_env.rb +13 -3
  148. data/lib/flipper/model/active_record.rb +23 -0
  149. data/lib/flipper/poller.rb +157 -0
  150. data/lib/flipper/serializers/gzip.rb +22 -0
  151. data/lib/flipper/serializers/json.rb +17 -0
  152. data/lib/flipper/spec/shared_adapter_specs.rb +122 -56
  153. data/lib/flipper/test/shared_adapter_test.rb +120 -52
  154. data/lib/flipper/test_help.rb +43 -0
  155. data/lib/flipper/typecast.rb +59 -18
  156. data/lib/flipper/types/actor.rb +19 -13
  157. data/lib/flipper/types/group.rb +12 -5
  158. data/lib/flipper/types/percentage.rb +1 -1
  159. data/lib/flipper/version.rb +11 -1
  160. data/lib/flipper.rb +71 -12
  161. data/lib/generators/flipper/setup_generator.rb +68 -0
  162. data/lib/generators/flipper/templates/initializer.rb +45 -0
  163. data/lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb +22 -0
  164. data/lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb +18 -0
  165. data/lib/generators/flipper/update_generator.rb +35 -0
  166. data/package-lock.json +41 -0
  167. data/package.json +10 -0
  168. data/spec/fixtures/environment.rb +1 -0
  169. data/spec/fixtures/flipper_pstore_1679087600.json +46 -0
  170. data/spec/flipper/actor_spec.rb +10 -2
  171. data/spec/flipper/adapter_builder_spec.rb +72 -0
  172. data/spec/flipper/adapter_spec.rb +52 -6
  173. data/spec/flipper/adapters/actor_limit_spec.rb +75 -0
  174. data/spec/flipper/adapters/dual_write_spec.rb +82 -0
  175. data/spec/flipper/adapters/failover_spec.rb +141 -0
  176. data/spec/flipper/adapters/failsafe_spec.rb +58 -0
  177. data/spec/flipper/adapters/http/client_spec.rb +61 -0
  178. data/spec/flipper/adapters/http_spec.rb +402 -65
  179. data/spec/flipper/adapters/instrumented_spec.rb +31 -13
  180. data/spec/flipper/adapters/memoizable_spec.rb +51 -33
  181. data/spec/flipper/adapters/memory_spec.rb +33 -5
  182. data/spec/flipper/adapters/operation_logger_spec.rb +38 -12
  183. data/spec/flipper/adapters/poll_spec.rb +41 -0
  184. data/spec/flipper/adapters/pstore_spec.rb +0 -2
  185. data/spec/flipper/adapters/read_only_spec.rb +32 -18
  186. data/spec/flipper/adapters/strict_spec.rb +64 -0
  187. data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +39 -1
  188. data/spec/flipper/adapters/sync/interval_synchronizer_spec.rb +4 -5
  189. data/spec/flipper/adapters/sync/synchronizer_spec.rb +87 -1
  190. data/spec/flipper/adapters/sync_spec.rb +17 -6
  191. data/spec/flipper/cli_spec.rb +217 -0
  192. data/spec/flipper/cloud/configuration_spec.rb +257 -0
  193. data/spec/flipper/cloud/dsl_spec.rb +90 -0
  194. data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
  195. data/spec/flipper/cloud/middleware_spec.rb +307 -0
  196. data/spec/flipper/cloud/migrate_spec.rb +160 -0
  197. data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +107 -0
  198. data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
  199. data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
  200. data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
  201. data/spec/flipper/cloud/telemetry_spec.rb +208 -0
  202. data/spec/flipper/cloud_spec.rb +186 -0
  203. data/spec/flipper/configuration_spec.rb +37 -3
  204. data/spec/flipper/dsl_spec.rb +67 -80
  205. data/spec/flipper/engine_spec.rb +374 -0
  206. data/spec/flipper/export_spec.rb +13 -0
  207. data/spec/flipper/exporter_spec.rb +16 -0
  208. data/spec/flipper/exporters/json/export_spec.rb +60 -0
  209. data/spec/flipper/exporters/json/v1_spec.rb +33 -0
  210. data/spec/flipper/expression/builder_spec.rb +248 -0
  211. data/spec/flipper/expression_spec.rb +188 -0
  212. data/spec/flipper/expressions/all_spec.rb +15 -0
  213. data/spec/flipper/expressions/any_spec.rb +15 -0
  214. data/spec/flipper/expressions/boolean_spec.rb +15 -0
  215. data/spec/flipper/expressions/equal_spec.rb +24 -0
  216. data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
  217. data/spec/flipper/expressions/greater_than_spec.rb +28 -0
  218. data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
  219. data/spec/flipper/expressions/less_than_spec.rb +32 -0
  220. data/spec/flipper/expressions/not_equal_spec.rb +15 -0
  221. data/spec/flipper/expressions/now_spec.rb +11 -0
  222. data/spec/flipper/expressions/number_spec.rb +21 -0
  223. data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
  224. data/spec/flipper/expressions/percentage_spec.rb +15 -0
  225. data/spec/flipper/expressions/property_spec.rb +13 -0
  226. data/spec/flipper/expressions/random_spec.rb +9 -0
  227. data/spec/flipper/expressions/string_spec.rb +11 -0
  228. data/spec/flipper/expressions/time_spec.rb +29 -0
  229. data/spec/flipper/feature_check_context_spec.rb +18 -20
  230. data/spec/flipper/feature_spec.rb +461 -48
  231. data/spec/flipper/gate_spec.rb +0 -2
  232. data/spec/flipper/gate_values_spec.rb +2 -34
  233. data/spec/flipper/gates/actor_spec.rb +0 -2
  234. data/spec/flipper/gates/boolean_spec.rb +1 -3
  235. data/spec/flipper/gates/expression_spec.rb +190 -0
  236. data/spec/flipper/gates/group_spec.rb +2 -5
  237. data/spec/flipper/gates/percentage_of_actors_spec.rb +61 -7
  238. data/spec/flipper/gates/percentage_of_time_spec.rb +2 -4
  239. data/spec/flipper/identifier_spec.rb +12 -0
  240. data/spec/flipper/instrumentation/log_subscriber_spec.rb +24 -7
  241. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +26 -3
  242. data/spec/flipper/instrumenters/memory_spec.rb +18 -1
  243. data/spec/flipper/instrumenters/noop_spec.rb +14 -8
  244. data/spec/flipper/middleware/memoizer_spec.rb +199 -62
  245. data/spec/flipper/middleware/setup_env_spec.rb +23 -5
  246. data/spec/flipper/model/active_record_spec.rb +72 -0
  247. data/spec/flipper/poller_spec.rb +390 -0
  248. data/spec/flipper/registry_spec.rb +0 -1
  249. data/spec/flipper/serializers/gzip_spec.rb +13 -0
  250. data/spec/flipper/serializers/json_spec.rb +13 -0
  251. data/spec/flipper/typecast_spec.rb +121 -7
  252. data/spec/flipper/types/actor_spec.rb +63 -47
  253. data/spec/flipper/types/boolean_spec.rb +0 -1
  254. data/spec/flipper/types/group_spec.rb +24 -3
  255. data/spec/flipper/types/percentage_of_actors_spec.rb +0 -1
  256. data/spec/flipper/types/percentage_of_time_spec.rb +0 -1
  257. data/spec/flipper/types/percentage_spec.rb +0 -1
  258. data/spec/{integration_spec.rb → flipper_integration_spec.rb} +301 -59
  259. data/spec/flipper_spec.rb +123 -29
  260. data/spec/{helper.rb → spec_helper.rb} +23 -21
  261. data/spec/support/actor_names.yml +1 -0
  262. data/spec/support/descriptions.yml +1 -0
  263. data/spec/support/fail_on_output.rb +8 -0
  264. data/spec/support/fake_backoff_policy.rb +15 -0
  265. data/spec/support/skippable.rb +18 -0
  266. data/spec/support/spec_helpers.rb +53 -6
  267. data/test/adapters/actor_limit_test.rb +20 -0
  268. data/test/test_helper.rb +2 -1
  269. data/test_rails/generators/flipper/setup_generator_test.rb +69 -0
  270. data/test_rails/generators/flipper/update_generator_test.rb +96 -0
  271. data/test_rails/helper.rb +31 -0
  272. data/test_rails/system/test_help_test.rb +52 -0
  273. metadata +200 -82
  274. data/.rubocop.yml +0 -54
  275. data/.rubocop_todo.yml +0 -199
  276. data/docs/Adapters.md +0 -124
  277. data/docs/Caveats.md +0 -4
  278. data/docs/Gates.md +0 -167
  279. data/docs/Instrumentation.md +0 -27
  280. data/docs/Optimization.md +0 -114
  281. data/docs/api/README.md +0 -849
  282. data/docs/http/README.md +0 -35
  283. data/docs/read-only/README.md +0 -21
  284. data/examples/example_setup.rb +0 -8
  285. data/test/helper.rb +0 -11
@@ -1,36 +1,42 @@
1
- require 'helper'
2
1
  require 'flipper/types/actor'
3
2
 
4
3
  RSpec.describe Flipper::Types::Actor do
5
4
  subject do
6
- thing = thing_class.new('2')
7
- described_class.new(thing)
5
+ actor = actor_class.new('2')
6
+ described_class.new(actor)
8
7
  end
9
8
 
10
- let(:thing_class) do
9
+ let(:actor_class) do
11
10
  Class.new do
12
11
  attr_reader :flipper_id
13
12
 
14
13
  def initialize(flipper_id)
15
- @flipper_id = flipper_id
14
+ @flipper_id = flipper_id.to_s
16
15
  end
17
16
 
18
17
  def admin?
19
18
  true
20
19
  end
20
+
21
+ def flipper_properties
22
+ {
23
+ "flipper_id" => flipper_id,
24
+ "admin" => admin?,
25
+ }
26
+ end
21
27
  end
22
28
  end
23
29
 
24
30
  describe '.wrappable?' do
25
31
  it 'returns true if actor' do
26
- thing = thing_class.new('1')
27
- actor = described_class.new(thing)
28
- expect(described_class.wrappable?(actor)).to eq(true)
32
+ actor = actor_class.new('1')
33
+ actor_type_instance = described_class.new(actor)
34
+ expect(described_class.wrappable?(actor_type_instance)).to eq(true)
29
35
  end
30
36
 
31
37
  it 'returns true if responds to flipper_id' do
32
- thing = thing_class.new(10)
33
- expect(described_class.wrappable?(thing)).to eq(true)
38
+ actor = actor_class.new(10)
39
+ expect(described_class.wrappable?(actor)).to eq(true)
34
40
  end
35
41
 
36
42
  it 'returns false if nil' do
@@ -39,27 +45,27 @@ RSpec.describe Flipper::Types::Actor do
39
45
  end
40
46
 
41
47
  describe '.wrap' do
42
- context 'for actor' do
43
- it 'returns actor' do
44
- actor = described_class.wrap(subject)
45
- expect(actor).to be_instance_of(described_class)
46
- expect(actor).to be(subject)
48
+ context 'for actor type instance' do
49
+ it 'returns actor type instance' do
50
+ actor_type_instance = described_class.wrap(subject)
51
+ expect(actor_type_instance).to be_instance_of(described_class)
52
+ expect(actor_type_instance).to be(subject)
47
53
  end
48
54
  end
49
55
 
50
- context 'for other thing' do
51
- it 'returns actor' do
52
- thing = thing_class.new('1')
53
- actor = described_class.wrap(thing)
54
- expect(actor).to be_instance_of(described_class)
56
+ context 'for other object' do
57
+ it 'returns actor type instance' do
58
+ actor = actor_class.new('1')
59
+ actor_type_instance = described_class.wrap(actor)
60
+ expect(actor_type_instance).to be_instance_of(described_class)
55
61
  end
56
62
  end
57
63
  end
58
64
 
59
- it 'initializes with thing that responds to id' do
60
- thing = thing_class.new('1')
61
- actor = described_class.new(thing)
62
- expect(actor.value).to eq('1')
65
+ it 'initializes with object that responds to flipper_id' do
66
+ actor = actor_class.new('1')
67
+ actor_type_instance = described_class.new(actor)
68
+ expect(actor_type_instance.value).to eq('1')
63
69
  end
64
70
 
65
71
  it 'raises error when initialized with nil' do
@@ -69,48 +75,58 @@ RSpec.describe Flipper::Types::Actor do
69
75
  end
70
76
 
71
77
  it 'raises error when initalized with non-wrappable object' do
72
- unwrappable_thing = Struct.new(:id).new(1)
78
+ unwrappable_object = Struct.new(:id).new(1)
73
79
  expect do
74
- described_class.new(unwrappable_thing)
80
+ described_class.new(unwrappable_object)
75
81
  end.to raise_error(ArgumentError,
76
- "#{unwrappable_thing.inspect} must respond to flipper_id, but does not")
82
+ "#{unwrappable_object.inspect} must respond to flipper_id, but does not")
77
83
  end
78
84
 
79
85
  it 'converts id to string' do
80
- thing = thing_class.new(2)
81
- actor = described_class.new(thing)
86
+ actor = actor_class.new(2)
87
+ actor = described_class.new(actor)
82
88
  expect(actor.value).to eq('2')
83
89
  end
84
90
 
85
- it 'proxies everything to thing' do
86
- thing = thing_class.new(10)
87
- actor = described_class.new(thing)
91
+ it 'proxies everything to actor' do
92
+ actor = actor_class.new(10)
93
+ actor = described_class.new(actor)
88
94
  expect(actor.admin?).to eq(true)
89
95
  end
90
96
 
91
- it 'exposes thing' do
92
- thing = thing_class.new(10)
93
- actor = described_class.new(thing)
94
- expect(actor.thing).to be(thing)
97
+ it 'proxies flipper_properties to actor' do
98
+ actor = actor_class.new(10)
99
+ actor = described_class.new(actor)
100
+ expect(actor.flipper_properties).to eq({
101
+ "flipper_id" => "10",
102
+ "admin" => true,
103
+ })
104
+ end
105
+
106
+ it 'exposes actor' do
107
+ actor = actor_class.new(10)
108
+ actor_type_instance = described_class.new(actor)
109
+ expect(actor_type_instance.actor).to be(actor)
95
110
  end
96
111
 
97
112
  describe '#respond_to?' do
98
113
  it 'returns true if responds to method' do
99
- thing = thing_class.new('1')
100
- actor = described_class.new(thing)
101
- expect(actor.respond_to?(:value)).to eq(true)
114
+ actor = actor_class.new('1')
115
+ actor_type_instance = described_class.new(actor)
116
+ expect(actor_type_instance.respond_to?(:value)).to eq(true)
102
117
  end
103
118
 
104
- it 'returns true if thing responds to method' do
105
- thing = thing_class.new(10)
106
- actor = described_class.new(thing)
107
- expect(actor.respond_to?(:admin?)).to eq(true)
119
+ it 'returns true if actor responds to method' do
120
+ actor = actor_class.new(10)
121
+ actor_type_instance = described_class.new(actor)
122
+ expect(actor_type_instance.respond_to?(:admin?)).to eq(true)
123
+ expect(actor_type_instance.respond_to?(:flipper_properties)).to eq(true)
108
124
  end
109
125
 
110
- it 'returns false if does not respond to method and thing does not respond to method' do
111
- thing = thing_class.new(10)
112
- actor = described_class.new(thing)
113
- expect(actor.respond_to?(:frankenstein)).to eq(false)
126
+ it 'returns false if does not respond to method and actor does not respond to method' do
127
+ actor = actor_class.new(10)
128
+ actor_type_instance = described_class.new(actor)
129
+ expect(actor_type_instance.respond_to?(:frankenstein)).to eq(false)
114
130
  end
115
131
  end
116
132
  end
@@ -1,4 +1,3 @@
1
- require 'helper'
2
1
  require 'flipper/types/boolean'
3
2
 
4
3
  RSpec.describe Flipper::Types::Boolean do
@@ -1,4 +1,3 @@
1
- require 'helper'
2
1
  require 'flipper/types/group'
3
2
 
4
3
  RSpec.describe Flipper::Types::Group do
@@ -65,11 +64,33 @@ RSpec.describe Flipper::Types::Group do
65
64
  expect(group.match?(double('Actor'), fake_context)).to be_falsey
66
65
  end
67
66
 
67
+ it 'returns true for truthy shortand block results' do
68
+ actor = Class.new do
69
+ def admin?
70
+ true
71
+ end
72
+ end.new
73
+
74
+ group = described_class.new(:admin, &:admin?)
75
+ expect(group.match?(actor, fake_context)).to be_truthy
76
+ end
77
+
78
+ it 'returns false for falsy shortand block results' do
79
+ actor = Class.new do
80
+ def admin?
81
+ false
82
+ end
83
+ end.new
84
+
85
+ group = described_class.new(:admin, &:admin?)
86
+ expect(group.match?(actor, fake_context)).to be_falsey
87
+ end
88
+
68
89
  it 'can yield without context as block argument' do
69
90
  context = Flipper::FeatureCheckContext.new(
70
91
  feature_name: :my_feature,
71
92
  values: Flipper::GateValues.new({}),
72
- thing: Flipper::Types::Actor.new(Flipper::Actor.new(1))
93
+ actors: [Flipper::Types::Actor.new(Flipper::Actor.new('1'))]
73
94
  )
74
95
  group = Flipper.register(:group_with_context) { |actor| actor }
75
96
  yielded_actor = group.match?(admin_actor, context)
@@ -80,7 +101,7 @@ RSpec.describe Flipper::Types::Group do
80
101
  context = Flipper::FeatureCheckContext.new(
81
102
  feature_name: :my_feature,
82
103
  values: Flipper::GateValues.new({}),
83
- thing: Flipper::Types::Actor.new(Flipper::Actor.new(1))
104
+ actors: [Flipper::Types::Actor.new(Flipper::Actor.new('1'))]
84
105
  )
85
106
  group = Flipper.register(:group_with_context) { |actor, context| [actor, context] }
86
107
  yielded_actor, yielded_context = group.match?(admin_actor, context)
@@ -1,4 +1,3 @@
1
- require 'helper'
2
1
  require 'flipper/types/percentage_of_actors'
3
2
 
4
3
  RSpec.describe Flipper::Types::PercentageOfActors do
@@ -1,4 +1,3 @@
1
- require 'helper'
2
1
  require 'flipper/types/percentage_of_time'
3
2
 
4
3
  RSpec.describe Flipper::Types::PercentageOfTime do
@@ -1,4 +1,3 @@
1
- require 'helper'
2
1
  require 'flipper/types/percentage_of_actors'
3
2
 
4
3
  RSpec.describe Flipper::Types::Percentage do