simple_flag 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f2041da22824b405194cc6203aa275e474ee4055f733d4959c60256d0984d51
4
- data.tar.gz: d5c4f449cadb4febda25719c8653eeff8d1f4fc65c42c72f9f0d1661cae3eac1
3
+ metadata.gz: 18fd6ddd2543f859954f77dbb4d2a64554371199ce04c0077ce8959ae0686b6c
4
+ data.tar.gz: f84e73174f51d979c5472e627bc3dabc7f52842cadb432b644db65303a235faf
5
5
  SHA512:
6
- metadata.gz: d95d77afd1ee6c44acf335e977034920f7f70eba17f52577823489240bfa3089ee5348a762fd7f2a192ed7ac29b93a1aca52d35567fc4e80363d751bf2602a47
7
- data.tar.gz: 440b21b9616ff41ff02597088ec1da841224cbfa513c6c3f5c309ef576e5480fac001399715a316edc7929c6aa76385609327fdea6f5b3b357d2ace469e1f223
6
+ metadata.gz: d17a746f61b88cf9379133f45de57bf51ed0cfa991fb6e5fdf71eb0c61e6caf22cca57cefd77b2d9d26a12150af251c867568f2a2298e43f377aace9a8c8fb7e
7
+ data.tar.gz: 5b8c4fd26b55ea4b34a51bca29b0aca56730e3d1fd24c8131a2b26335dc026c3ffa8f75f4d25ad4fe02eeb076e93134597f18e5cc0c75c9d2f719863cb081ad0
@@ -0,0 +1,47 @@
1
+ class SimpleFlag
2
+ module Overrides
3
+
4
+ def override(name, result = true, &block)
5
+ raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
6
+
7
+ # We are using proc, not lambda, because proc does not check for number of arguments
8
+ original_block = overridden?(name) ? @overrides[name] : @flags[name]
9
+ @overrides[name] = original_block
10
+ @flags[name] =
11
+ if block_given?
12
+ validate_flag_arity(name, original_block.arity, block.arity)
13
+ block
14
+ else
15
+ proc { |*_args| result }
16
+ end
17
+
18
+ original_block
19
+ end
20
+
21
+ def override_with(name, result = true, &block)
22
+ raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
23
+
24
+ original_block = @flags[name]
25
+ @flags[name] = proc { |*_args| result }
26
+ block.call
27
+ ensure
28
+ @flags[name] = original_block
29
+ end
30
+
31
+ def reset_override(name)
32
+ raise FlagNotOverridden, "Feature flag `#{name}` was not overridden" unless overridden?(name)
33
+
34
+ original_block = @overrides.delete(name)
35
+ @flags[name] = original_block
36
+ end
37
+
38
+ def reset_all_overrides
39
+ @overrides.each_key { |name| reset_override(name) }
40
+ end
41
+
42
+ def overridden?(name)
43
+ @overrides.key?(name)
44
+ end
45
+
46
+ end
47
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class SimpleFlag
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/simple_flag.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'simple_flag/version'
4
+ require 'simple_flag/overrides'
4
5
 
5
6
  # Class FeatureFlag defines and stores feature flags
6
7
  #
@@ -48,6 +49,8 @@ require 'simple_flag/version'
48
49
  # @see http://blog.arkency.com/2015/11/simple-feature-toggle-for-rails-app/
49
50
  #
50
51
  class SimpleFlag
52
+ include Overrides
53
+
51
54
  FlagAlreadyDefined = Class.new(StandardError)
52
55
  FlagNotDefined = Class.new(StandardError)
53
56
  FlagNotOverridden = Class.new(StandardError)
@@ -80,64 +83,38 @@ class SimpleFlag
80
83
  block.call if active?(name, *args)
81
84
  end
82
85
 
83
- def override(name, result = true, &block)
84
- raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
85
- raise FlagAlreadyDefined, "Feature flag `#{name}` is already overridden" if overridden?(name)
86
-
87
- # We are using proc, not lambda, because proc does not check for number of arguments
88
- original_block = @flags[name]
89
- @overrides[name] = original_block
90
- @flags[name] =
91
- if block_given?
92
- validate_flag_arity(name, original_block.arity, block.arity)
93
- block
94
- else
95
- proc { |*_args| result }
96
- end
97
-
98
- original_block
99
- end
100
-
101
- def reset_override(name)
102
- raise FlagNotOverridden, "Feature flag `#{name}` was not overridden" unless overridden?(name)
103
-
104
- original_block = @overrides.delete(name)
105
- @flags[name] = original_block
106
- end
107
-
108
- def reset_all_overrides
109
- @overrides.each_key { |name| reset_override(name) }
110
- end
111
-
112
- def override_with(name, result = true, &block)
113
- raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
114
-
115
- original_block = @flags[name]
116
- @flags[name] = proc { |*_args| result }
117
- block.call
118
- ensure
119
- @flags[name] = original_block
120
- end
121
-
122
86
  def flag?(name)
123
87
  @flags.key?(name)
124
88
  end
125
89
 
126
- def overridden?(name)
127
- @overrides.key?(name)
128
- end
129
-
130
90
  def active?(name, *args)
131
91
  flag = @flags.fetch(name, proc { |*_args| false })
132
92
  validate_flag_arguments(name, flag.arity, args.size)
133
93
  flag.call(*args)
134
94
  end
135
95
  alias enabled? active?
96
+ alias on? active?
136
97
 
137
98
  def inactive?(name, *args)
138
99
  !active?(name, *args)
139
100
  end
140
101
  alias disabled? inactive?
102
+ alias off? inactive?
103
+
104
+ # Returns thruthy value, returned by flag or nil
105
+ #
106
+ # @param [Symbol] name The name of the flag
107
+ # @param [Array<Symbol>] args The flag arguments
108
+ #
109
+ # @return [TrueClass,NilClass] Returns truthy value from flag or nil
110
+ #
111
+ # @example Usage in Rails
112
+ # user.birth_date = birth_date || FEATURE.on?(:fake_data).presence && '1983-01-01'
113
+ # user.birth_date = birth_date || FEATURE.presence(:fake_data) && '1983-01-01'
114
+ #
115
+ def presence(name, *args)
116
+ active?(name, *args) || nil
117
+ end
141
118
 
142
119
  def env?(*args)
143
120
  [*args].map(&:to_s).include?(env.to_s)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_flag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vojtěch Kusý
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-29 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,6 +70,7 @@ files:
70
70
  - bin/console
71
71
  - bin/setup
72
72
  - lib/simple_flag.rb
73
+ - lib/simple_flag/overrides.rb
73
74
  - lib/simple_flag/version.rb
74
75
  - simple_flag.gemspec
75
76
  homepage: https://github.com/wojtha/simple_flag
@@ -81,7 +82,7 @@ metadata:
81
82
  changelog_uri: https://github.com/wojtha/simple_flag/blob/master/CHANGELOG.md
82
83
  source_code_uri: https://github.com/wojtha/simple_flag
83
84
  bug_tracker_uri: https://github.com/wojtha/simple_flag/issues
84
- post_install_message:
85
+ post_install_message:
85
86
  rdoc_options: []
86
87
  require_paths:
87
88
  - lib
@@ -96,8 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
97
  - !ruby/object:Gem::Version
97
98
  version: '0'
98
99
  requirements: []
99
- rubygems_version: 3.1.1
100
- signing_key:
100
+ rubygems_version: 3.2.27
101
+ signing_key:
101
102
  specification_version: 4
102
103
  summary: Simple feature flags
103
104
  test_files: []