flip_fab 1.0.2 → 1.0.16
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 +5 -5
- data/.github/dependabot.yml +18 -0
- data/.github/workflows/dobby-actions.yml +29 -0
- data/.github/workflows/gem-publish.yml +46 -0
- data/.github/workflows/version-forget-me-not.yml +19 -0
- data/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +58 -0
- data/.ruby-version +1 -0
- data/.semaphore/semaphore.yml +49 -0
- data/CODEOWNERS +3 -0
- data/README.md +8 -2
- data/_pipeline/step_build_gem.sh +5 -0
- data/_pipeline/step_test_gem.sh +6 -0
- data/catalog-info.yaml +8 -0
- data/example/rails_app/Rakefile +1 -1
- data/example/rails_app/app/assets/config/manifest.js +3 -0
- data/example/rails_app/app/controllers/beavers_controller.rb +1 -1
- data/example/rails_app/bin/bundle +1 -1
- data/example/rails_app/bin/rails +1 -1
- data/example/rails_app/config/application.rb +2 -2
- data/example/rails_app/config/boot.rb +1 -1
- data/example/rails_app/config/environment.rb +1 -1
- data/example/rails_app/config.ru +1 -1
- data/example/rails_app/db/schema.rb +0 -1
- data/example/rails_app/spec/rails_helper.rb +1 -1
- data/example/rails_app/test/test_helper.rb +1 -1
- data/flip_fab.gemspec +5 -6
- data/lib/flip_fab/contextual_feature.rb +12 -2
- data/lib/flip_fab/cookie_persistence.rb +3 -5
- data/lib/flip_fab/features_by_name.rb +1 -0
- data/lib/flip_fab/version.rb +6 -1
- data/lib/flip_fab.rb +1 -1
- data/spec/lib/flip_fab/contextual_feature_spec.rb +7 -1
- data/spec/lib/flip_fab/cookie_persistence.feature +3 -3
- data/spec/lib/flip_fab/cookie_persistence_spec.rb +4 -8
- metadata +31 -22
- data/example/rails_app/Gemfile.lock +0 -168
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f7f880a207dde1105f807623c68b6f3911883cab9f930760b33b372addc7aa5c
|
|
4
|
+
data.tar.gz: 38824c24a924aab3f4bd486c3595e83a98630420a300afc89d1f554e38c4d930
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6854f1e7fab3aa484661e0228808e40f04a5cc39be460d1d543c44ee828aa4aba01aea6338c27c1f96749a563483d20a2d8bc71c5f22c7388af385a4e7dc26fa
|
|
7
|
+
data.tar.gz: 610b9b7ae75eaafbc3bcc02076fc4bb519d08727cc75909a93f9d51cd0ea1a0ffe03a93a870fa2be1d4bdadad1fa1c1d7c74f0883c7c9f38072c8a04451d4344
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: bundler
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: daily
|
|
7
|
+
time: "07:00"
|
|
8
|
+
open-pull-requests-limit: 99
|
|
9
|
+
labels:
|
|
10
|
+
- dependencies
|
|
11
|
+
- package-ecosystem: github-actions
|
|
12
|
+
directory: "/"
|
|
13
|
+
schedule:
|
|
14
|
+
interval: daily
|
|
15
|
+
time: "07:00"
|
|
16
|
+
open-pull-requests-limit: 99
|
|
17
|
+
labels:
|
|
18
|
+
- dependencies
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
name: "Dobby action"
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
jobs:
|
|
9
|
+
pr_commented:
|
|
10
|
+
runs-on: ubuntu-20.04
|
|
11
|
+
if: startsWith(github.event.comment.body, '/dobby')
|
|
12
|
+
env:
|
|
13
|
+
BUNDLE_WITHOUT: "development:test"
|
|
14
|
+
steps:
|
|
15
|
+
- name: Chekcout action
|
|
16
|
+
uses: actions/checkout@v3
|
|
17
|
+
with:
|
|
18
|
+
repository: 'simplybusiness/dobby'
|
|
19
|
+
ref: 'v3.0.1'
|
|
20
|
+
- name: Set up ruby
|
|
21
|
+
uses: ruby/setup-ruby@v1
|
|
22
|
+
with:
|
|
23
|
+
bundler-cache: true
|
|
24
|
+
- name: Bump version
|
|
25
|
+
uses: simplybusiness/dobby@v3.0.1
|
|
26
|
+
env:
|
|
27
|
+
DOBBY_APP_ID: ${{ secrets.DOBBY_APP_ID }}
|
|
28
|
+
DOBBY_PRIVATE_KEY: ${{ secrets.DOBBY_PRIVATE_KEY }}
|
|
29
|
+
VERSION_FILE_PATH: lib/flip_fab/version.rb
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Publish Ruby Gem
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build and Publish
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v3
|
|
16
|
+
- name: Set up Ruby
|
|
17
|
+
uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
bundler-cache: true
|
|
20
|
+
- name: Publish to RubyGems
|
|
21
|
+
run: |
|
|
22
|
+
mkdir -p $HOME/.gem
|
|
23
|
+
touch $HOME/.gem/credentials
|
|
24
|
+
chmod 0600 $HOME/.gem/credentials
|
|
25
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
|
26
|
+
gem build *.gemspec
|
|
27
|
+
gem push *.gem
|
|
28
|
+
env:
|
|
29
|
+
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
|
|
30
|
+
- name: Get Gem Version
|
|
31
|
+
id: get-gem-version
|
|
32
|
+
run: echo "::set-output name=GEM_VERSION::$(bundle exec ruby -e 'puts FlipFab::VERSION')"
|
|
33
|
+
- name: Create Release
|
|
34
|
+
uses: actions/github-script@v6
|
|
35
|
+
env:
|
|
36
|
+
GEM_VERSION: ${{ steps.get-gem-version.outputs.GEM_VERSION }}
|
|
37
|
+
with:
|
|
38
|
+
result-encoding: string
|
|
39
|
+
script: |
|
|
40
|
+
const { GEM_VERSION } = process.env
|
|
41
|
+
github.rest.repos.createRelease({
|
|
42
|
+
owner: context.repo.owner,
|
|
43
|
+
repo: context.repo.repo,
|
|
44
|
+
tag_name: GEM_VERSION,
|
|
45
|
+
generate_release_notes: true,
|
|
46
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Check version
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- master
|
|
7
|
+
types: [opened, synchronize]
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
statuses: write
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-18.04
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: simplybusiness/version-forget-me-not@v2.3.0
|
|
17
|
+
env:
|
|
18
|
+
ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
19
|
+
VERSION_FILE_PATH: "lib/flip_fab/version.rb"
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2021-11-22 12:55:16 UTC using RuboCop version 1.12.1.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 1
|
|
10
|
+
# Configuration parameters: Include.
|
|
11
|
+
# Include: **/*.gemspec
|
|
12
|
+
Gemspec/RequiredRubyVersion:
|
|
13
|
+
Exclude:
|
|
14
|
+
- 'flip_fab.gemspec'
|
|
15
|
+
|
|
16
|
+
# Offense count: 3
|
|
17
|
+
# Cop supports --auto-correct.
|
|
18
|
+
# Configuration parameters: AllowComments.
|
|
19
|
+
Lint/UselessMethodDefinition:
|
|
20
|
+
Exclude:
|
|
21
|
+
- 'lib/flip_fab/cookie_persistence.rb'
|
|
22
|
+
- 'spec/support/test_multiple_persistence.rb'
|
|
23
|
+
- 'spec/support/test_persistence.rb'
|
|
24
|
+
|
|
25
|
+
# Offense count: 13
|
|
26
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
27
|
+
# IgnoredMethods: refine
|
|
28
|
+
Metrics/BlockLength:
|
|
29
|
+
Max: 262
|
|
30
|
+
|
|
31
|
+
# Offense count: 58
|
|
32
|
+
# Cop supports --auto-correct.
|
|
33
|
+
# Configuration parameters: EnforcedStyle.
|
|
34
|
+
# SupportedStyles: always, always_true, never
|
|
35
|
+
Style/FrozenStringLiteralComment:
|
|
36
|
+
Enabled: false
|
|
37
|
+
|
|
38
|
+
# Offense count: 1
|
|
39
|
+
# Cop supports --auto-correct.
|
|
40
|
+
Style/HashTransformValues:
|
|
41
|
+
Exclude:
|
|
42
|
+
- 'lib/flip_fab/features_by_name.rb'
|
|
43
|
+
|
|
44
|
+
# Offense count: 1
|
|
45
|
+
# Cop supports --auto-correct.
|
|
46
|
+
# Configuration parameters: EnforcedStyle.
|
|
47
|
+
# SupportedStyles: literals, strict
|
|
48
|
+
Style/MutableConstant:
|
|
49
|
+
Exclude:
|
|
50
|
+
- 'lib/flip_fab/cookie_persistence.rb'
|
|
51
|
+
|
|
52
|
+
# Offense count: 1
|
|
53
|
+
# Cop supports --auto-correct.
|
|
54
|
+
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods.
|
|
55
|
+
# AllowedMethods: present?, blank?, presence, try, try!
|
|
56
|
+
Style/SafeNavigation:
|
|
57
|
+
Exclude:
|
|
58
|
+
- 'lib/flip_fab/cookie_persistence.rb'
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.0.4
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
version: v1.0
|
|
2
|
+
name: Semaphore v2 tests
|
|
3
|
+
agent:
|
|
4
|
+
machine:
|
|
5
|
+
type: e1-standard-2
|
|
6
|
+
os_image: ubuntu2004
|
|
7
|
+
auto_cancel:
|
|
8
|
+
running:
|
|
9
|
+
when: branch != 'master'
|
|
10
|
+
global_job_config:
|
|
11
|
+
prologue:
|
|
12
|
+
commands:
|
|
13
|
+
- checkout
|
|
14
|
+
- sem-version ruby $RUBY_VERSION -f
|
|
15
|
+
- gem update --system
|
|
16
|
+
- bundle config set --local path 'vendor/bundle'
|
|
17
|
+
- cache restore bundle-$RUBY_VERSION-$SEMAPHORE_GIT_BRANCH-$SEMAPHORE_WORKFLOW_ID,bundle-$RUBY_VERSION-$SEMAPHORE_GIT_BRANCH,bundle-$RUBY_VERSION-master
|
|
18
|
+
- bundle install
|
|
19
|
+
- bundle clean --force
|
|
20
|
+
- cache store bundle-$RUBY_VERSION-$SEMAPHORE_GIT_BRANCH-$SEMAPHORE_WORKFLOW_ID vendor/bundle
|
|
21
|
+
secrets:
|
|
22
|
+
- name: bundler-global
|
|
23
|
+
blocks:
|
|
24
|
+
- name: Semaphore v2 tests
|
|
25
|
+
dependencies: []
|
|
26
|
+
execution_time_limit:
|
|
27
|
+
minutes: 30
|
|
28
|
+
task:
|
|
29
|
+
jobs:
|
|
30
|
+
- name: Tests
|
|
31
|
+
matrix:
|
|
32
|
+
- env_var: RUBY_VERSION
|
|
33
|
+
values: ["2.7", "3.0"]
|
|
34
|
+
commands:
|
|
35
|
+
- bundle exec rspec
|
|
36
|
+
- name: Semaphore v2 Compliance
|
|
37
|
+
dependencies: []
|
|
38
|
+
skip:
|
|
39
|
+
when: branch = 'master'
|
|
40
|
+
execution_time_limit:
|
|
41
|
+
minutes: 10
|
|
42
|
+
task:
|
|
43
|
+
jobs:
|
|
44
|
+
- name: Rubocop
|
|
45
|
+
commands:
|
|
46
|
+
- bundle exec rubocop
|
|
47
|
+
env_vars:
|
|
48
|
+
- name: RUBY_VERSION
|
|
49
|
+
value: 2.6.5
|
data/CODEOWNERS
ADDED
data/README.md
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
Flip Fab
|
|
2
|
-
--------
|
|
1
|
+
# Flip Fab
|
|
3
2
|
|
|
4
3
|
**Feature flipping... Made FaBuLoUs!**
|
|
5
4
|
|
|
@@ -166,3 +165,10 @@ Perform the following to try the example:
|
|
|
166
165
|
1. Start rails: `bundle exec rails s`
|
|
167
166
|
1. View the page with the feature disabled: `open 'http://localhost:3000/beavers?justin_beaver=disabled'`
|
|
168
167
|
1. View the page with the feature enabled: `open 'http://localhost:3000/beavers?justin_beaver=enabled'`
|
|
168
|
+
|
|
169
|
+
## Contributing
|
|
170
|
+
|
|
171
|
+
1. Make your changes in a branch
|
|
172
|
+
1. Update the version using semantic versioning in `lib/flip_fab/version.rb`
|
|
173
|
+
1. Once signed off, merge
|
|
174
|
+
1. The gem will automatically be pushed to gemstash
|
data/catalog-info.yaml
ADDED
data/example/rails_app/Rakefile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
2
2
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
3
3
|
|
|
4
|
-
require File.expand_path('
|
|
4
|
+
require File.expand_path('config/application', __dir__)
|
|
5
5
|
|
|
6
6
|
Rails.application.load_tasks
|
data/example/rails_app/bin/rails
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require File.expand_path('
|
|
1
|
+
require File.expand_path('boot', __dir__)
|
|
2
2
|
|
|
3
3
|
require 'rails/all'
|
|
4
4
|
|
|
@@ -20,6 +20,6 @@ module RailsApp
|
|
|
20
20
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
|
21
21
|
# config.i18n.default_locale = :de
|
|
22
22
|
|
|
23
|
-
config.eager_load_paths += %W
|
|
23
|
+
config.eager_load_paths += %W[#{config.root}/lib]
|
|
24
24
|
end
|
|
25
25
|
end
|
data/example/rails_app/config.ru
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
|
2
2
|
ENV['RAILS_ENV'] ||= 'test'
|
|
3
3
|
require 'spec_helper'
|
|
4
|
-
require File.expand_path('
|
|
4
|
+
require File.expand_path('../config/environment', __dir__)
|
|
5
5
|
require 'rspec/rails'
|
|
6
6
|
# Add additional requires below this line. Rails is not loaded until this point!
|
|
7
7
|
|
data/flip_fab.gemspec
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
3
|
require 'flip_fab/version'
|
|
5
4
|
|
|
@@ -18,10 +17,10 @@ Gem::Specification.new do |spec|
|
|
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
18
|
spec.require_paths = ['lib']
|
|
20
19
|
|
|
21
|
-
spec.add_development_dependency 'rack', '
|
|
22
|
-
spec.add_development_dependency 'rack-test'
|
|
20
|
+
spec.add_development_dependency 'rack', '>=2.1.1'
|
|
21
|
+
spec.add_development_dependency 'rack-test'
|
|
23
22
|
spec.add_development_dependency 'rspec', '~> 3.5'
|
|
24
|
-
spec.add_development_dependency 'rutabaga', '~>
|
|
23
|
+
spec.add_development_dependency 'rutabaga', '~> 3.0'
|
|
24
|
+
spec.add_development_dependency 'simplycop', '~> 1.9'
|
|
25
25
|
spec.add_development_dependency 'timecop', '~> 0.8'
|
|
26
|
-
spec.add_development_dependency 'rubocop', '~> 0.46'
|
|
27
26
|
end
|
|
@@ -6,10 +6,17 @@ module FlipFab
|
|
|
6
6
|
@feature = feature
|
|
7
7
|
@context = context
|
|
8
8
|
return unless overridden?
|
|
9
|
+
|
|
9
10
|
@state = override
|
|
10
11
|
persist
|
|
11
12
|
end
|
|
12
13
|
|
|
14
|
+
def as_json(options = {})
|
|
15
|
+
{
|
|
16
|
+
'feature' => feature.as_json(options)
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
13
20
|
def enabled?
|
|
14
21
|
state == :enabled
|
|
15
22
|
end
|
|
@@ -27,8 +34,9 @@ module FlipFab
|
|
|
27
34
|
end
|
|
28
35
|
|
|
29
36
|
def state=(value)
|
|
30
|
-
raise "Invalid state provided: `#{value}`, possible states are :enabled, :disabled" unless %i
|
|
37
|
+
raise "Invalid state provided: `#{value}`, possible states are :enabled, :disabled" unless %i[enabled disabled].include? value
|
|
31
38
|
return if overridden?
|
|
39
|
+
|
|
32
40
|
@state = value
|
|
33
41
|
persist
|
|
34
42
|
end
|
|
@@ -65,8 +73,10 @@ module FlipFab
|
|
|
65
73
|
|
|
66
74
|
def override
|
|
67
75
|
return unless context.respond_to? :params
|
|
76
|
+
|
|
68
77
|
override = context.params[feature.name.to_s]
|
|
69
|
-
return unless %w
|
|
78
|
+
return unless %w[enabled disabled].include? override
|
|
79
|
+
|
|
70
80
|
override.to_sym
|
|
71
81
|
end
|
|
72
82
|
|
|
@@ -14,11 +14,9 @@ module FlipFab
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def write(state)
|
|
17
|
-
|
|
18
|
-
context.response.set_cookie key, value: state,
|
|
17
|
+
context.response.set_cookie key, value: state,
|
|
19
18
|
expires: cookie_expiration,
|
|
20
|
-
|
|
21
|
-
path: COOKIE_PATH
|
|
19
|
+
path: COOKIE_PATH
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
private
|
|
@@ -33,7 +31,7 @@ module FlipFab
|
|
|
33
31
|
|
|
34
32
|
# See: https://github.com/rails/rails/blob/b1124a2ac88778c0feb0157ac09367cbd204bf01/actionpack/lib/action_dispatch/middleware/cookies.rb#L286-L294
|
|
35
33
|
def top_level_domain
|
|
36
|
-
|
|
34
|
+
Regexp.last_match(0) if (host !~ /^[\d.]+$/) && (host =~ DOMAIN_REGEXP)
|
|
37
35
|
end
|
|
38
36
|
|
|
39
37
|
def cookie_expiration
|
data/lib/flip_fab/version.rb
CHANGED
data/lib/flip_fab.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module FlipFab
|
|
2
|
-
describe ContextualFeature do
|
|
2
|
+
describe ContextualFeature do # rubocop:disable Metrics/BlockLength
|
|
3
3
|
let(:override) {}
|
|
4
4
|
let(:default) { :disabled }
|
|
5
5
|
let(:persistence_adapters) { [TestPersistence] }
|
|
@@ -8,6 +8,12 @@ module FlipFab
|
|
|
8
8
|
let(:context) { TestContext.new feature_states, 'example_feature' => override }
|
|
9
9
|
subject { described_class.new feature, context }
|
|
10
10
|
|
|
11
|
+
describe '.as_json' do
|
|
12
|
+
it 'returns only the feature' do
|
|
13
|
+
expect(subject.as_json.keys).to eq(['feature'])
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
11
17
|
describe '.new' do
|
|
12
18
|
it 'assigns the feature' do
|
|
13
19
|
expect(subject.feature).to eq(feature)
|
|
@@ -10,10 +10,10 @@ Feature: Persisting the feature state in a cookie
|
|
|
10
10
|
When I persist the feature state in a cookie
|
|
11
11
|
Then the cookie has the path '/'
|
|
12
12
|
|
|
13
|
-
Scenario Outline: The cookie should
|
|
13
|
+
Scenario Outline: The cookie populated should not contain domain
|
|
14
14
|
Given the host is '<host>'
|
|
15
15
|
When I persist the feature state in a cookie
|
|
16
|
-
Then the cookie
|
|
16
|
+
Then the cookie does not have domain '<cookie domain>'
|
|
17
17
|
|
|
18
18
|
Examples:
|
|
19
19
|
| host | cookie domain |
|
|
@@ -37,7 +37,7 @@ Feature: Persisting the feature state in a cookie
|
|
|
37
37
|
|
|
38
38
|
Scenario: The cookie should expire after 1 year
|
|
39
39
|
When I persist the feature state in a cookie
|
|
40
|
-
Then the cookie expires at 'Fri, 22 Jan 2016 15:26:31
|
|
40
|
+
Then the cookie expires at 'Fri, 22 Jan 2016 15:26:31 GMT'
|
|
41
41
|
|
|
42
42
|
Scenario Outline: The cookie's value should be the state of the feature
|
|
43
43
|
Given the state of the feature is '<feature state>'
|
|
@@ -36,12 +36,8 @@ module FlipFab
|
|
|
36
36
|
expect(@cookie).to match(/path=#{path};/)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
step 'the cookie
|
|
40
|
-
|
|
41
|
-
expect(@cookie).not_to match(/domain/)
|
|
42
|
-
else
|
|
43
|
-
expect(@cookie).to match(/domain=#{domain};/)
|
|
44
|
-
end
|
|
39
|
+
step 'the cookie does not have domain :domain' do |domain|
|
|
40
|
+
expect(@cookie).not_to match(/domain=#{domain};/)
|
|
45
41
|
end
|
|
46
42
|
|
|
47
43
|
step 'the cookie has the name :name' do |name|
|
|
@@ -53,7 +49,7 @@ module FlipFab
|
|
|
53
49
|
end
|
|
54
50
|
|
|
55
51
|
step 'the cookie value is :value' do |value|
|
|
56
|
-
expect(@cookie).to match(
|
|
52
|
+
expect(@cookie).to match(/=#{value};/)
|
|
57
53
|
end
|
|
58
54
|
end
|
|
59
55
|
|
|
@@ -80,7 +76,7 @@ module FlipFab
|
|
|
80
76
|
after { Timecop.return }
|
|
81
77
|
|
|
82
78
|
it 'saves the feature state' do
|
|
83
|
-
expect { subject.write :enabled }.to change { context.response_cookies }.from(nil).to('flip_fab.example_feature=enabled;
|
|
79
|
+
expect { subject.write :enabled }.to change { context.response_cookies }.from(nil).to('flip_fab.example_feature=enabled; path=/; expires=Tue, 01 Jan 1991 00:00:00 GMT')
|
|
84
80
|
end
|
|
85
81
|
end
|
|
86
82
|
end
|
metadata
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: flip_fab
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.16
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Simply Business
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-07-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 2.1.1
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 2.1.1
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rack-test
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- - "
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0
|
|
33
|
+
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- - "
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0
|
|
40
|
+
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -58,42 +58,42 @@ dependencies:
|
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
61
|
+
version: '3.0'
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
68
|
+
version: '3.0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
70
|
+
name: simplycop
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
75
|
+
version: '1.9'
|
|
76
76
|
type: :development
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
82
|
+
version: '1.9'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
84
|
+
name: timecop
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0.
|
|
89
|
+
version: '0.8'
|
|
90
90
|
type: :development
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0.
|
|
96
|
+
version: '0.8'
|
|
97
97
|
description: A gem providing persistent, per-user feature flipping to Rack applications.
|
|
98
98
|
email:
|
|
99
99
|
- tech@simplybusiness.co.uk
|
|
@@ -101,16 +101,27 @@ executables: []
|
|
|
101
101
|
extensions: []
|
|
102
102
|
extra_rdoc_files: []
|
|
103
103
|
files:
|
|
104
|
+
- ".github/dependabot.yml"
|
|
105
|
+
- ".github/workflows/dobby-actions.yml"
|
|
106
|
+
- ".github/workflows/gem-publish.yml"
|
|
107
|
+
- ".github/workflows/version-forget-me-not.yml"
|
|
104
108
|
- ".gitignore"
|
|
105
109
|
- ".rspec"
|
|
106
110
|
- ".rubocop.yml"
|
|
111
|
+
- ".rubocop_todo.yml"
|
|
112
|
+
- ".ruby-version"
|
|
113
|
+
- ".semaphore/semaphore.yml"
|
|
114
|
+
- CODEOWNERS
|
|
107
115
|
- Gemfile
|
|
108
116
|
- LICENSE.txt
|
|
109
117
|
- README.md
|
|
118
|
+
- _pipeline/step_build_gem.sh
|
|
119
|
+
- _pipeline/step_test_gem.sh
|
|
120
|
+
- catalog-info.yaml
|
|
110
121
|
- example/rails_app/.gitignore
|
|
111
122
|
- example/rails_app/Gemfile
|
|
112
|
-
- example/rails_app/Gemfile.lock
|
|
113
123
|
- example/rails_app/Rakefile
|
|
124
|
+
- example/rails_app/app/assets/config/manifest.js
|
|
114
125
|
- example/rails_app/app/assets/images/.keep
|
|
115
126
|
- example/rails_app/app/assets/images/justin_beaver.jpg
|
|
116
127
|
- example/rails_app/app/assets/images/regular_beaver.jpg
|
|
@@ -226,8 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
226
237
|
- !ruby/object:Gem::Version
|
|
227
238
|
version: '0'
|
|
228
239
|
requirements: []
|
|
229
|
-
|
|
230
|
-
rubygems_version: 2.4.5.1
|
|
240
|
+
rubygems_version: 3.2.33
|
|
231
241
|
signing_key:
|
|
232
242
|
specification_version: 4
|
|
233
243
|
summary: A gem providing persistent, per-user feature flipping to Rack applications.
|
|
@@ -248,4 +258,3 @@ test_files:
|
|
|
248
258
|
- spec/support/test_multiple_persistence.rb
|
|
249
259
|
- spec/support/test_persistence.rb
|
|
250
260
|
- spec/support/test_rack_context.rb
|
|
251
|
-
has_rdoc:
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: ../../
|
|
3
|
-
specs:
|
|
4
|
-
flip_fab (1.0.2)
|
|
5
|
-
|
|
6
|
-
GEM
|
|
7
|
-
remote: https://rubygems.org/
|
|
8
|
-
specs:
|
|
9
|
-
actioncable (5.0.1)
|
|
10
|
-
actionpack (= 5.0.1)
|
|
11
|
-
nio4r (~> 1.2)
|
|
12
|
-
websocket-driver (~> 0.6.1)
|
|
13
|
-
actionmailer (5.0.1)
|
|
14
|
-
actionpack (= 5.0.1)
|
|
15
|
-
actionview (= 5.0.1)
|
|
16
|
-
activejob (= 5.0.1)
|
|
17
|
-
mail (~> 2.5, >= 2.5.4)
|
|
18
|
-
rails-dom-testing (~> 2.0)
|
|
19
|
-
actionpack (5.0.1)
|
|
20
|
-
actionview (= 5.0.1)
|
|
21
|
-
activesupport (= 5.0.1)
|
|
22
|
-
rack (~> 2.0)
|
|
23
|
-
rack-test (~> 0.6.3)
|
|
24
|
-
rails-dom-testing (~> 2.0)
|
|
25
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
26
|
-
actionview (5.0.1)
|
|
27
|
-
activesupport (= 5.0.1)
|
|
28
|
-
builder (~> 3.1)
|
|
29
|
-
erubis (~> 2.7.0)
|
|
30
|
-
rails-dom-testing (~> 2.0)
|
|
31
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
32
|
-
activejob (5.0.1)
|
|
33
|
-
activesupport (= 5.0.1)
|
|
34
|
-
globalid (>= 0.3.6)
|
|
35
|
-
activemodel (5.0.1)
|
|
36
|
-
activesupport (= 5.0.1)
|
|
37
|
-
activerecord (5.0.1)
|
|
38
|
-
activemodel (= 5.0.1)
|
|
39
|
-
activesupport (= 5.0.1)
|
|
40
|
-
arel (~> 7.0)
|
|
41
|
-
activesupport (5.0.1)
|
|
42
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
43
|
-
i18n (~> 0.7)
|
|
44
|
-
minitest (~> 5.1)
|
|
45
|
-
tzinfo (~> 1.1)
|
|
46
|
-
arel (7.1.4)
|
|
47
|
-
builder (3.2.2)
|
|
48
|
-
coffee-rails (4.2.1)
|
|
49
|
-
coffee-script (>= 2.2.0)
|
|
50
|
-
railties (>= 4.0.0, < 5.2.x)
|
|
51
|
-
coffee-script (2.4.1)
|
|
52
|
-
coffee-script-source
|
|
53
|
-
execjs
|
|
54
|
-
coffee-script-source (1.12.2)
|
|
55
|
-
concurrent-ruby (1.0.4)
|
|
56
|
-
diff-lcs (1.2.5)
|
|
57
|
-
erubis (2.7.0)
|
|
58
|
-
execjs (2.7.0)
|
|
59
|
-
globalid (0.3.7)
|
|
60
|
-
activesupport (>= 4.1.0)
|
|
61
|
-
i18n (0.7.0)
|
|
62
|
-
jquery-rails (4.2.2)
|
|
63
|
-
rails-dom-testing (>= 1, < 3)
|
|
64
|
-
railties (>= 4.2.0)
|
|
65
|
-
thor (>= 0.14, < 2.0)
|
|
66
|
-
loofah (2.0.3)
|
|
67
|
-
nokogiri (>= 1.5.9)
|
|
68
|
-
mail (2.6.4)
|
|
69
|
-
mime-types (>= 1.16, < 4)
|
|
70
|
-
method_source (0.8.2)
|
|
71
|
-
mime-types (3.1)
|
|
72
|
-
mime-types-data (~> 3.2015)
|
|
73
|
-
mime-types-data (3.2016.0521)
|
|
74
|
-
mini_portile2 (2.1.0)
|
|
75
|
-
minitest (5.10.1)
|
|
76
|
-
nio4r (1.2.1)
|
|
77
|
-
nokogiri (1.7.0)
|
|
78
|
-
mini_portile2 (~> 2.1.0)
|
|
79
|
-
rack (2.0.1)
|
|
80
|
-
rack-test (0.6.3)
|
|
81
|
-
rack (>= 1.0)
|
|
82
|
-
rails (5.0.1)
|
|
83
|
-
actioncable (= 5.0.1)
|
|
84
|
-
actionmailer (= 5.0.1)
|
|
85
|
-
actionpack (= 5.0.1)
|
|
86
|
-
actionview (= 5.0.1)
|
|
87
|
-
activejob (= 5.0.1)
|
|
88
|
-
activemodel (= 5.0.1)
|
|
89
|
-
activerecord (= 5.0.1)
|
|
90
|
-
activesupport (= 5.0.1)
|
|
91
|
-
bundler (>= 1.3.0, < 2.0)
|
|
92
|
-
railties (= 5.0.1)
|
|
93
|
-
sprockets-rails (>= 2.0.0)
|
|
94
|
-
rails-controller-testing (1.0.1)
|
|
95
|
-
actionpack (~> 5.x)
|
|
96
|
-
actionview (~> 5.x)
|
|
97
|
-
activesupport (~> 5.x)
|
|
98
|
-
rails-dom-testing (2.0.2)
|
|
99
|
-
activesupport (>= 4.2.0, < 6.0)
|
|
100
|
-
nokogiri (~> 1.6)
|
|
101
|
-
rails-html-sanitizer (1.0.3)
|
|
102
|
-
loofah (~> 2.0)
|
|
103
|
-
railties (5.0.1)
|
|
104
|
-
actionpack (= 5.0.1)
|
|
105
|
-
activesupport (= 5.0.1)
|
|
106
|
-
method_source
|
|
107
|
-
rake (>= 0.8.7)
|
|
108
|
-
thor (>= 0.18.1, < 2.0)
|
|
109
|
-
rake (12.0.0)
|
|
110
|
-
rspec-core (3.5.4)
|
|
111
|
-
rspec-support (~> 3.5.0)
|
|
112
|
-
rspec-expectations (3.5.0)
|
|
113
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
114
|
-
rspec-support (~> 3.5.0)
|
|
115
|
-
rspec-mocks (3.5.0)
|
|
116
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
117
|
-
rspec-support (~> 3.5.0)
|
|
118
|
-
rspec-rails (3.5.2)
|
|
119
|
-
actionpack (>= 3.0)
|
|
120
|
-
activesupport (>= 3.0)
|
|
121
|
-
railties (>= 3.0)
|
|
122
|
-
rspec-core (~> 3.5.0)
|
|
123
|
-
rspec-expectations (~> 3.5.0)
|
|
124
|
-
rspec-mocks (~> 3.5.0)
|
|
125
|
-
rspec-support (~> 3.5.0)
|
|
126
|
-
rspec-support (3.5.0)
|
|
127
|
-
sass (3.4.23)
|
|
128
|
-
sass-rails (5.0.6)
|
|
129
|
-
railties (>= 4.0.0, < 6)
|
|
130
|
-
sass (~> 3.1)
|
|
131
|
-
sprockets (>= 2.8, < 4.0)
|
|
132
|
-
sprockets-rails (>= 2.0, < 4.0)
|
|
133
|
-
tilt (>= 1.1, < 3)
|
|
134
|
-
sprockets (3.7.1)
|
|
135
|
-
concurrent-ruby (~> 1.0)
|
|
136
|
-
rack (> 1, < 3)
|
|
137
|
-
sprockets-rails (3.2.0)
|
|
138
|
-
actionpack (>= 4.0)
|
|
139
|
-
activesupport (>= 4.0)
|
|
140
|
-
sprockets (>= 3.0.0)
|
|
141
|
-
sqlite3 (1.3.12)
|
|
142
|
-
thor (0.19.4)
|
|
143
|
-
thread_safe (0.3.5)
|
|
144
|
-
tilt (2.0.5)
|
|
145
|
-
tzinfo (1.2.2)
|
|
146
|
-
thread_safe (~> 0.1)
|
|
147
|
-
uglifier (3.0.4)
|
|
148
|
-
execjs (>= 0.3.0, < 3)
|
|
149
|
-
websocket-driver (0.6.4)
|
|
150
|
-
websocket-extensions (>= 0.1.0)
|
|
151
|
-
websocket-extensions (0.1.2)
|
|
152
|
-
|
|
153
|
-
PLATFORMS
|
|
154
|
-
ruby
|
|
155
|
-
|
|
156
|
-
DEPENDENCIES
|
|
157
|
-
coffee-rails
|
|
158
|
-
flip_fab!
|
|
159
|
-
jquery-rails
|
|
160
|
-
rails (~> 5.0)
|
|
161
|
-
rails-controller-testing
|
|
162
|
-
rspec-rails
|
|
163
|
-
sass-rails
|
|
164
|
-
sqlite3
|
|
165
|
-
uglifier (>= 1.3.0)
|
|
166
|
-
|
|
167
|
-
BUNDLED WITH
|
|
168
|
-
1.11.2
|