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 +4 -4
- data/lib/simple_flag/overrides.rb +47 -0
- data/lib/simple_flag/version.rb +1 -1
- data/lib/simple_flag.rb +20 -43
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18fd6ddd2543f859954f77dbb4d2a64554371199ce04c0077ce8959ae0686b6c
|
4
|
+
data.tar.gz: f84e73174f51d979c5472e627bc3dabc7f52842cadb432b644db65303a235faf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/simple_flag/version.rb
CHANGED
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.
|
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:
|
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.
|
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: []
|