simple_flag 0.1.1 → 0.3.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/.github/workflows/ci.yml +30 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +6 -0
- data/Gemfile +3 -2
- data/lib/simple_flag/overrides.rb +48 -0
- data/lib/simple_flag/version.rb +1 -1
- data/lib/simple_flag.rb +23 -46
- data/simple_flag.gemspec +2 -5
- metadata +11 -51
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbd1947bf544e442e36623fd657fb8cdf6e0efe8fb63ec7f0971f262be989ca0
|
4
|
+
data.tar.gz: 195755be62e37c5e6ba4e6ac26c35b1923336fe928077e8fb949e2c4b1ef9c24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2513065a2f663f190be82516af7f633b85ac3ea3615d036cc296c08e7a19f151a0fff34f0e025d67e8c452ca7b14e393f9dc087aa05778fb7ebc4be015a2e0b5
|
7
|
+
data.tar.gz: 1bae49ddd11e11832f46cd908c70998fef9097b114d66c034d4cb6c32e627aa968ad73b4cd3adbb0118ee3acb18728181607c52a27116ab3448496661521f49d
|
@@ -0,0 +1,30 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ 'master' ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ 'master' ]
|
8
|
+
|
9
|
+
permissions:
|
10
|
+
contents: read
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
test:
|
14
|
+
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
strategy:
|
17
|
+
matrix:
|
18
|
+
ruby-version: ['2.7', '3.0', '3.1', '3.2']
|
19
|
+
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v3
|
22
|
+
- name: Set up Ruby
|
23
|
+
uses: ruby/setup-ruby@v1
|
24
|
+
with:
|
25
|
+
ruby-version: ${{ matrix.ruby-version }}
|
26
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
27
|
+
- name: Run linter
|
28
|
+
run: bundle exec rubocop
|
29
|
+
- name: Run tests
|
30
|
+
run: bundle exec rspec
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
AllCops:
|
2
|
+
NewCops: enable
|
3
|
+
Gemspec/RequiredRubyVersion:
|
4
|
+
Enabled: false
|
1
5
|
Layout/LineLength:
|
2
6
|
Max: 120
|
3
7
|
Layout/MultilineMethodCallIndentation:
|
@@ -12,3 +16,5 @@ Style/GuardClause:
|
|
12
16
|
Enabled: false
|
13
17
|
Style/NumericPredicate:
|
14
18
|
Enabled: false
|
19
|
+
Style/OptionalBooleanParameter:
|
20
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class SimpleFlag
|
4
|
+
# Overrides module provides methods for overriding feature flags during testing.
|
5
|
+
module Overrides
|
6
|
+
def override(name, result = true, &block)
|
7
|
+
raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
|
8
|
+
|
9
|
+
# We are using proc, not lambda, because proc does not check for number of arguments
|
10
|
+
original_block = overridden?(name) ? @overrides[name] : @flags[name]
|
11
|
+
@overrides[name] = original_block
|
12
|
+
@flags[name] =
|
13
|
+
if block_given?
|
14
|
+
validate_flag_arity(name, original_block.arity, block.arity)
|
15
|
+
block
|
16
|
+
else
|
17
|
+
proc { |*_args| result }
|
18
|
+
end
|
19
|
+
|
20
|
+
original_block
|
21
|
+
end
|
22
|
+
|
23
|
+
def override_with(name, result = true, &block)
|
24
|
+
raise FlagNotDefined, "Feature flag `#{name}` is not defined" unless flag?(name)
|
25
|
+
|
26
|
+
original_block = @flags[name]
|
27
|
+
@flags[name] = proc { |*_args| result }
|
28
|
+
block.call
|
29
|
+
ensure
|
30
|
+
@flags[name] = original_block
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset_override(name)
|
34
|
+
raise FlagNotOverridden, "Feature flag `#{name}` was not overridden" unless overridden?(name)
|
35
|
+
|
36
|
+
original_block = @overrides.delete(name)
|
37
|
+
@flags[name] = original_block
|
38
|
+
end
|
39
|
+
|
40
|
+
def reset_all_overrides
|
41
|
+
@overrides.each_key { |name| reset_override(name) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def overridden?(name)
|
45
|
+
@overrides.key?(name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
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)
|
@@ -150,7 +127,7 @@ class SimpleFlag
|
|
150
127
|
|
151
128
|
if original_arity != override_arity
|
152
129
|
raise FlagArgumentsMismatch, "Flag '#{flag_name}' expects #{flag_arity} arguments, " \
|
153
|
-
|
130
|
+
"but #{override_arity} arguments were given"
|
154
131
|
end
|
155
132
|
end
|
156
133
|
|
@@ -158,11 +135,11 @@ class SimpleFlag
|
|
158
135
|
if flag_arity < 0 && (flag_arity.abs - 1) > args_size
|
159
136
|
# Contains variable -n-1 arguments
|
160
137
|
raise FlagArgumentsMismatch, "Flag '#{flag_name}' expects #{flag_arity.abs - 1} or more arguments, " \
|
161
|
-
|
138
|
+
"but #{args_size} arguments were given"
|
162
139
|
elsif flag_arity >= 0 && flag_arity != args_size
|
163
140
|
# Contains zero or fixed number of arguments
|
164
141
|
raise FlagArgumentsMismatch, "Flag '#{flag_name}' expects #{flag_arity} arguments, " \
|
165
|
-
|
142
|
+
"but #{args_size} arguments were given"
|
166
143
|
end
|
167
144
|
end
|
168
145
|
end
|
data/simple_flag.gemspec
CHANGED
@@ -18,8 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.metadata['changelog_uri'] = 'https://github.com/wojtha/simple_flag/blob/master/CHANGELOG.md'
|
19
19
|
spec.metadata['source_code_uri'] = 'https://github.com/wojtha/simple_flag'
|
20
20
|
spec.metadata['bug_tracker_uri'] = 'https://github.com/wojtha/simple_flag/issues'
|
21
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
21
22
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
23
|
+
spec.required_ruby_version = '>= 2.7.0'
|
23
24
|
|
24
25
|
# Specify which files should be added to the gem when it is released.
|
25
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -29,8 +30,4 @@ Gem::Specification.new do |spec|
|
|
29
30
|
spec.bindir = 'bin'
|
30
31
|
spec.executables = []
|
31
32
|
spec.require_paths = ['lib']
|
32
|
-
|
33
|
-
spec.add_development_dependency 'bundler'
|
34
|
-
spec.add_development_dependency 'rake'
|
35
|
-
spec.add_development_dependency 'rspec'
|
36
33
|
end
|
metadata
CHANGED
@@ -1,57 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_flag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.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:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
11
|
+
date: 2023-11-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
55
13
|
description: Simple but powerful feature flag implementation in 90 LOC.
|
56
14
|
email:
|
57
15
|
- wojtha@gmail.com
|
@@ -59,10 +17,10 @@ executables: []
|
|
59
17
|
extensions: []
|
60
18
|
extra_rdoc_files: []
|
61
19
|
files:
|
20
|
+
- ".github/workflows/ci.yml"
|
62
21
|
- ".gitignore"
|
63
22
|
- ".rspec"
|
64
23
|
- ".rubocop.yml"
|
65
|
-
- ".travis.yml"
|
66
24
|
- Gemfile
|
67
25
|
- LICENSE
|
68
26
|
- README.md
|
@@ -70,6 +28,7 @@ files:
|
|
70
28
|
- bin/console
|
71
29
|
- bin/setup
|
72
30
|
- lib/simple_flag.rb
|
31
|
+
- lib/simple_flag/overrides.rb
|
73
32
|
- lib/simple_flag/version.rb
|
74
33
|
- simple_flag.gemspec
|
75
34
|
homepage: https://github.com/wojtha/simple_flag
|
@@ -81,7 +40,8 @@ metadata:
|
|
81
40
|
changelog_uri: https://github.com/wojtha/simple_flag/blob/master/CHANGELOG.md
|
82
41
|
source_code_uri: https://github.com/wojtha/simple_flag
|
83
42
|
bug_tracker_uri: https://github.com/wojtha/simple_flag/issues
|
84
|
-
|
43
|
+
rubygems_mfa_required: 'true'
|
44
|
+
post_install_message:
|
85
45
|
rdoc_options: []
|
86
46
|
require_paths:
|
87
47
|
- lib
|
@@ -89,15 +49,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
49
|
requirements:
|
90
50
|
- - ">="
|
91
51
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2.
|
52
|
+
version: 2.7.0
|
93
53
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
54
|
requirements:
|
95
55
|
- - ">="
|
96
56
|
- !ruby/object:Gem::Version
|
97
57
|
version: '0'
|
98
58
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
100
|
-
signing_key:
|
59
|
+
rubygems_version: 3.4.21
|
60
|
+
signing_key:
|
101
61
|
specification_version: 4
|
102
62
|
summary: Simple feature flags
|
103
63
|
test_files: []
|