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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f2041da22824b405194cc6203aa275e474ee4055f733d4959c60256d0984d51
4
- data.tar.gz: d5c4f449cadb4febda25719c8653eeff8d1f4fc65c42c72f9f0d1661cae3eac1
3
+ metadata.gz: bbd1947bf544e442e36623fd657fb8cdf6e0efe8fb63ec7f0971f262be989ca0
4
+ data.tar.gz: 195755be62e37c5e6ba4e6ac26c35b1923336fe928077e8fb949e2c4b1ef9c24
5
5
  SHA512:
6
- metadata.gz: d95d77afd1ee6c44acf335e977034920f7f70eba17f52577823489240bfa3089ee5348a762fd7f2a192ed7ac29b93a1aca52d35567fc4e80363d751bf2602a47
7
- data.tar.gz: 440b21b9616ff41ff02597088ec1da841224cbfa513c6c3f5c309ef576e5480fac001399715a316edc7929c6aa76385609327fdea6f5b3b357d2ace469e1f223
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
@@ -9,5 +9,8 @@
9
9
  /tmp/
10
10
  Gemfile.lock
11
11
 
12
+ # ASDF-VM
13
+ .tool-versions
14
+
12
15
  # rspec failure tracking
13
16
  .rspec_status
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
@@ -5,5 +5,6 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in simple_flag.gemspec
6
6
  gemspec
7
7
 
8
- gem 'rake', '~> 12.0'
9
- gem 'rspec', '~> 3.0'
8
+ gem 'rake', '~> 13.1'
9
+ gem 'rspec', '~> 3.12'
10
+ gem 'rubocop', '~> 1.57'
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class SimpleFlag
4
- VERSION = '0.1.1'
4
+ VERSION = '0.3.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)
@@ -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
- "but #{override_arity} arguments were given"
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
- "but #{args_size} arguments were given"
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
- "but #{args_size} arguments were given"
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.4.0'
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.1.1
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: 2020-04-29 00:00:00.000000000 Z
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
- post_install_message:
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.4.0
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.1.1
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: []
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6.5
6
- before_install: gem install bundler -v 2.1.4