toggles 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +13 -0
- data/README.md +79 -0
- data/lib/toggles.rb +43 -4
- data/lib/toggles/feature.rb +10 -2
- data/spec/spec_helper.rb +7 -4
- data/spec/toggles/feature/acceptance/collection_spec.rb +1 -1
- data/spec/toggles/feature/acceptance/complex_and_spec.rb +1 -1
- data/spec/toggles/feature/acceptance/multiple_subjects_spec.rb +1 -1
- data/spec/toggles/feature/acceptance/nested_attributes_spec.rb +1 -1
- data/spec/toggles/feature/acceptance/or_attributes_spec.rb +1 -1
- data/spec/toggles/feature/acceptance/type_spec.rb +1 -1
- data/spec/toggles/init_spec.rb +84 -0
- data/toggles.gemspec +12 -5
- metadata +48 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fc507d16102054690297319ce1e47e61c1ef408
|
4
|
+
data.tar.gz: 482eb06c1c41bd52afd536d0aad227e57ac7deab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97b6de15c5f8abff3dc5fac12dd1429163ebe7208a1b68c4666af82d130cb6aa2ca3a44c20a87e959ee6df3bf42964b046658a0355816d3b799aa1292bd340bd
|
7
|
+
data.tar.gz: 85553a0544a5c6cb9f8929fe9f9c66d540451d6df8e2996af56af9bb3a16ea28ff9495f39dcb250e6396c8cf74bc48a30d18979a7e41c9ea9dc532cefc607321
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2016-2016, Simpler Postage, Inc. <oss@easypost.com>
|
2
|
+
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
4
|
+
purpose with or without fee is hereby granted, provided that the above
|
5
|
+
copyright notice and this permission notice appear in all copies.
|
6
|
+
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
8
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
9
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
10
|
+
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
11
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
12
|
+
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
13
|
+
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Toggles
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/toggles.svg)](https://badge.fury.io/rb/toggles)
|
4
|
+
[![CircleCI](https://circleci.com/gh/EasyPost/toggles.svg?style=svg)](https://circleci.com/gh/EasyPost/toggles)
|
5
|
+
|
6
|
+
YAML backed feature toggles
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add the following to your Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem "toggles"
|
14
|
+
```
|
15
|
+
|
16
|
+
and run `bundle install` from your shell.
|
17
|
+
|
18
|
+
To install the gem manually from your shell, run:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
gem install toggles
|
22
|
+
```
|
23
|
+
|
24
|
+
## Configuration
|
25
|
+
|
26
|
+
Configure `toggles`:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Toggles.configure do |config|
|
30
|
+
config.features_dir = "features"
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
You can now express conditional logic within `features_dir`. The structure of the `features_dir` determines the structure of the classes within the `Feature` module. For example if the `features_dir` has the structure:
|
35
|
+
|
36
|
+
```
|
37
|
+
features
|
38
|
+
├── thing
|
39
|
+
| ├── one.yml
|
40
|
+
| └── two.yml
|
41
|
+
└── test.yml
|
42
|
+
```
|
43
|
+
|
44
|
+
The classes `Feature::Test`, `Feature::Thing::One` and `Feature::Thing::Two` will be available for use within
|
45
|
+
your application.
|
46
|
+
|
47
|
+
You can call the `Toggles.init` method to force re-parsing the configuration and re-initializing all Features
|
48
|
+
structures at any time. The `Toggles.reinit_if_necessary` method is a convenience helper which will only
|
49
|
+
re-initialize of the top-level features directory has changed. Note that, in general, this will only detect
|
50
|
+
changes if you use a system where you swap out the entire features directory on changes and do not edit
|
51
|
+
individual files within the directory.
|
52
|
+
|
53
|
+
## Usage
|
54
|
+
|
55
|
+
Create a file in `features_dir`:
|
56
|
+
|
57
|
+
```yaml
|
58
|
+
user:
|
59
|
+
id:
|
60
|
+
in:
|
61
|
+
- 12345
|
62
|
+
- 54321
|
63
|
+
```
|
64
|
+
|
65
|
+
Check if the feature is enabled or disabled:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
Feature::NewFeature::AvailableForPresentation.enabled_for?(user: OpenStruct.new(id: 12345)) # true
|
69
|
+
Feature::NewFeature::AvailableForPresentation.enabled_for?(user: OpenStruct.new(id: 54321)) # true
|
70
|
+
Feature::NewFeature::AvailableForPresentation.enabled_for?(user: OpenStruct.new(id: 7)) # false
|
71
|
+
|
72
|
+
Feature::NewFeature::AvailableForPresentation.disabled_for?(user: OpenStruct.new(id: 12345)) # false
|
73
|
+
Feature::NewFeature::AvailableForPresentation.disabled_for?(user: OpenStruct.new(id: 54321)) # false
|
74
|
+
Feature::NewFeature::AvailableForPresentation.disabled_for?(user: OpenStruct.new(id: 7)) # true
|
75
|
+
```
|
76
|
+
|
77
|
+
## License
|
78
|
+
|
79
|
+
This project is licensed under the ISC License, the contents of which can be found at [LICENSE.txt](LICENSE.txt).
|
data/lib/toggles.rb
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
+
require "find"
|
2
|
+
require "pathname"
|
3
|
+
|
1
4
|
require "toggles/configuration"
|
2
5
|
require "toggles/feature"
|
3
6
|
|
4
7
|
module Toggles
|
5
8
|
extend self
|
6
9
|
|
10
|
+
StatResult = Struct.new(:inode, :mtime)
|
11
|
+
|
7
12
|
def configure
|
13
|
+
@stat_tuple ||= StatResult.new(0, 0)
|
8
14
|
yield configuration
|
9
15
|
init
|
10
16
|
end
|
@@ -30,11 +36,25 @@ module Toggles
|
|
30
36
|
def init
|
31
37
|
return unless Dir.exists? configuration.features_dir
|
32
38
|
|
33
|
-
|
39
|
+
new_tree = Module.new
|
40
|
+
|
41
|
+
top_level = File.realpath(configuration.features_dir)
|
42
|
+
top_level_p = Pathname.new(top_level)
|
43
|
+
|
44
|
+
Find.find(top_level) do |path|
|
45
|
+
previous = new_tree
|
46
|
+
abspath = path
|
47
|
+
path = Pathname.new(path).relative_path_from(top_level_p).to_s
|
34
48
|
if path.match(/\.ya?ml\Z/)
|
35
|
-
|
49
|
+
base = path.chomp(File.extname(path)).split("/")
|
50
|
+
if base.size > 1
|
51
|
+
directories = base[0...-1]
|
52
|
+
filename = base[-1]
|
53
|
+
else
|
54
|
+
directories = []
|
55
|
+
filename = base[0]
|
56
|
+
end
|
36
57
|
|
37
|
-
previous = Feature
|
38
58
|
directories.each do |directory|
|
39
59
|
module_name = directory.split("_").map(&:capitalize).join.to_sym
|
40
60
|
previous = if previous.constants.include? module_name
|
@@ -45,11 +65,30 @@ module Toggles
|
|
45
65
|
end
|
46
66
|
|
47
67
|
cls = Class.new(Feature::Base) do |c|
|
48
|
-
c.const_set(:PERMISSIONS, Feature::Permissions.new(
|
68
|
+
c.const_set(:PERMISSIONS, Feature::Permissions.new(abspath))
|
49
69
|
end
|
50
70
|
|
51
71
|
previous.const_set(filename.split("_").map(&:capitalize).join.to_sym, cls)
|
52
72
|
end
|
53
73
|
end
|
74
|
+
|
75
|
+
stbuf = File.stat(top_level)
|
76
|
+
@stat_tuple = StatResult.new(stbuf.ino, stbuf.mtime)
|
77
|
+
|
78
|
+
Feature.set_tree(new_tree)
|
79
|
+
end
|
80
|
+
|
81
|
+
def reinit_if_changed
|
82
|
+
# Reload the configuration if the top-level directory has changed.
|
83
|
+
# Does not detect changes to files inside that directory unless your
|
84
|
+
# filesystem propagates mtimes.
|
85
|
+
return unless Dir.exists? configuration.features_dir
|
86
|
+
top_level = File.realpath(configuration.features_dir)
|
87
|
+
stbuf = File.stat(top_level)
|
88
|
+
stat_tuple = StatResult.new(stbuf.ino, stbuf.mtime)
|
89
|
+
|
90
|
+
if @stat_tuple != stat_tuple
|
91
|
+
init
|
92
|
+
end
|
54
93
|
end
|
55
94
|
end
|
data/lib/toggles/feature.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require "find"
|
2
|
-
|
3
1
|
require "toggles/feature/base"
|
4
2
|
require "toggles/feature/operation"
|
5
3
|
require "toggles/feature/permissions"
|
@@ -13,4 +11,14 @@ module Feature
|
|
13
11
|
not: Operation::Not,
|
14
12
|
or: Operation::Or,
|
15
13
|
range: Operation::Range}
|
14
|
+
|
15
|
+
@@tree = Module.new
|
16
|
+
|
17
|
+
def self.set_tree(tree)
|
18
|
+
@@tree = tree
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.const_missing(sym)
|
22
|
+
@@tree.const_get(sym, inherit: false)
|
23
|
+
end
|
16
24
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require "rspec/its"
|
2
|
+
require 'rspec/temp_dir'
|
2
3
|
|
3
4
|
require "toggles"
|
4
5
|
|
5
|
-
Toggles.configure do |config|
|
6
|
-
config.features_dir = "features"
|
7
|
-
end
|
8
|
-
|
9
6
|
RSpec.configure do |config|
|
10
7
|
config.order = "random"
|
8
|
+
|
9
|
+
config.before(:each) do
|
10
|
+
Toggles.configure do |c|
|
11
|
+
c.features_dir = "features"
|
12
|
+
end
|
13
|
+
end
|
11
14
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
describe Toggles do
|
2
|
+
describe "#init" do
|
3
|
+
include_context "uses temp dir"
|
4
|
+
|
5
|
+
it "correctly loads configuration" do
|
6
|
+
Dir.mkdir("#{temp_dir}/foo")
|
7
|
+
Dir.mkdir("#{temp_dir}/bar")
|
8
|
+
|
9
|
+
File.open("#{temp_dir}/foo/users.yml", "w") do |f|
|
10
|
+
f.write("{\"id\": {\"in\": [1, 2]}}")
|
11
|
+
end
|
12
|
+
|
13
|
+
File.open("#{temp_dir}/bar/users.yml", "w") do |f|
|
14
|
+
f.write("{\"id\": {\"in\": [3, 4]}}")
|
15
|
+
end
|
16
|
+
|
17
|
+
Toggles.configure do |c|
|
18
|
+
c.features_dir = temp_dir
|
19
|
+
end
|
20
|
+
|
21
|
+
expect(Feature::Foo::Users.enabled_for?(id: 1)).to eq(true)
|
22
|
+
expect(Feature::Bar::Users.enabled_for?(id: 3)).to eq(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "reloads configuration when #init is called" do
|
26
|
+
Dir.mkdir("#{temp_dir}/foo")
|
27
|
+
|
28
|
+
File.open("#{temp_dir}/foo/users.yml", "w") do |f|
|
29
|
+
f.write("{\"id\": {\"in\": [1, 2]}}")
|
30
|
+
end
|
31
|
+
File.open("#{temp_dir}/foo/children.yml", "w") do |f|
|
32
|
+
f.write("{\"id\": {\"in\": [1, 2]}}")
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
Toggles.configure do |c|
|
37
|
+
c.features_dir = temp_dir
|
38
|
+
end
|
39
|
+
|
40
|
+
expect(Feature::Foo::Users.enabled_for?(id: 1)).to eq(true)
|
41
|
+
expect(Feature::Foo::Children.enabled_for?(id: 1)).to eq(true)
|
42
|
+
|
43
|
+
File.open("#{temp_dir}/foo/users.yml", "w") do |f|
|
44
|
+
f.write("{\"id\": {\"in\": [2]}}")
|
45
|
+
end
|
46
|
+
|
47
|
+
File.unlink("#{temp_dir}/foo/children.yml")
|
48
|
+
|
49
|
+
Toggles.init
|
50
|
+
|
51
|
+
expect(Feature::Foo::Users.enabled_for?(id: 1)).to eq(false)
|
52
|
+
expect { Feature::Foo::Children.enabled_for?(id: 1) }.to raise_error(NameError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#reinit_if_changed" do
|
57
|
+
include_context "uses temp dir"
|
58
|
+
|
59
|
+
it "reloads when the contents have changed" do
|
60
|
+
Dir.mkdir("#{temp_dir}/features")
|
61
|
+
|
62
|
+
Toggles.configure do |c|
|
63
|
+
c.features_dir = "#{temp_dir}/features"
|
64
|
+
end
|
65
|
+
|
66
|
+
Dir.delete("#{temp_dir}/features")
|
67
|
+
Dir.mkdir("#{temp_dir}/features")
|
68
|
+
|
69
|
+
expect(Toggles).to receive("init")
|
70
|
+
Toggles.reinit_if_changed
|
71
|
+
end
|
72
|
+
|
73
|
+
it "does not reload when the contents have not changed" do
|
74
|
+
Dir.mkdir("#{temp_dir}/features")
|
75
|
+
|
76
|
+
Toggles.configure do |c|
|
77
|
+
c.features_dir = "#{temp_dir}/features"
|
78
|
+
end
|
79
|
+
|
80
|
+
expect(Toggles).not_to receive("init")
|
81
|
+
Toggles.reinit_if_changed
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/toggles.gemspec
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "toggles"
|
3
|
-
s.version = "0.1.
|
4
|
-
s.authors = ["Andrew Tribone"]
|
3
|
+
s.version = "0.1.2"
|
4
|
+
s.authors = ["Andrew Tribone", "James Brown"]
|
5
5
|
s.summary = "YAML backed feature toggles"
|
6
|
-
s.email = "
|
7
|
-
s.homepage = "https://github.com/
|
8
|
-
s.license = ""
|
6
|
+
s.email = "oss@easypost.com"
|
7
|
+
s.homepage = "https://github.com/EasyPost/toggles"
|
8
|
+
s.license = "ISC"
|
9
9
|
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
10
10
|
s.test_files = s.files.grep(/^(spec)\//)
|
11
|
+
s.description = <<-EOF
|
12
|
+
YAML-backed implementation of the feature flags pattern. Build a
|
13
|
+
hierarchy of features in YAML files in the filesystem, apply various
|
14
|
+
conditions using boolean logic and a selection of filters, and easily
|
15
|
+
check whether a given feature should be applied.
|
16
|
+
EOF
|
11
17
|
|
12
18
|
s.add_development_dependency "bundler"
|
13
19
|
s.add_development_dependency "pry"
|
@@ -16,4 +22,5 @@ Gem::Specification.new do |s|
|
|
16
22
|
s.add_development_dependency "rake"
|
17
23
|
s.add_development_dependency "rspec"
|
18
24
|
s.add_development_dependency "rspec-its"
|
25
|
+
s.add_development_dependency "rspec-temp_dir"
|
19
26
|
end
|
metadata
CHANGED
@@ -1,122 +1,143 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toggles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Tribone
|
8
|
+
- James Brown
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2016-11-08 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- -
|
18
|
+
- - '>='
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '0'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - '>='
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '0'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: pry
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - '>='
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - '>='
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: pry-nav
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
|
-
- -
|
46
|
+
- - '>='
|
46
47
|
- !ruby/object:Gem::Version
|
47
48
|
version: '0'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
|
-
- -
|
53
|
+
- - '>='
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '0'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
57
|
name: pry-remote
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
|
-
- -
|
60
|
+
- - '>='
|
60
61
|
- !ruby/object:Gem::Version
|
61
62
|
version: '0'
|
62
63
|
type: :development
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
|
-
- -
|
67
|
+
- - '>='
|
67
68
|
- !ruby/object:Gem::Version
|
68
69
|
version: '0'
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
71
|
name: rake
|
71
72
|
requirement: !ruby/object:Gem::Requirement
|
72
73
|
requirements:
|
73
|
-
- -
|
74
|
+
- - '>='
|
74
75
|
- !ruby/object:Gem::Version
|
75
76
|
version: '0'
|
76
77
|
type: :development
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
|
-
- -
|
81
|
+
- - '>='
|
81
82
|
- !ruby/object:Gem::Version
|
82
83
|
version: '0'
|
83
84
|
- !ruby/object:Gem::Dependency
|
84
85
|
name: rspec
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
86
87
|
requirements:
|
87
|
-
- -
|
88
|
+
- - '>='
|
88
89
|
- !ruby/object:Gem::Version
|
89
90
|
version: '0'
|
90
91
|
type: :development
|
91
92
|
prerelease: false
|
92
93
|
version_requirements: !ruby/object:Gem::Requirement
|
93
94
|
requirements:
|
94
|
-
- -
|
95
|
+
- - '>='
|
95
96
|
- !ruby/object:Gem::Version
|
96
97
|
version: '0'
|
97
98
|
- !ruby/object:Gem::Dependency
|
98
99
|
name: rspec-its
|
99
100
|
requirement: !ruby/object:Gem::Requirement
|
100
101
|
requirements:
|
101
|
-
- -
|
102
|
+
- - '>='
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '0'
|
104
105
|
type: :development
|
105
106
|
prerelease: false
|
106
107
|
version_requirements: !ruby/object:Gem::Requirement
|
107
108
|
requirements:
|
108
|
-
- -
|
109
|
+
- - '>='
|
109
110
|
- !ruby/object:Gem::Version
|
110
111
|
version: '0'
|
111
|
-
|
112
|
-
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rspec-temp_dir
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: |2
|
127
|
+
YAML-backed implementation of the feature flags pattern. Build a
|
128
|
+
hierarchy of features in YAML files in the filesystem, apply various
|
129
|
+
conditions using boolean logic and a selection of filters, and easily
|
130
|
+
check whether a given feature should be applied.
|
131
|
+
email: oss@easypost.com
|
113
132
|
executables: []
|
114
133
|
extensions: []
|
115
134
|
extra_rdoc_files: []
|
116
135
|
files:
|
117
|
-
-
|
118
|
-
-
|
136
|
+
- .gitignore
|
137
|
+
- .rspec
|
119
138
|
- Gemfile
|
139
|
+
- LICENSE.txt
|
140
|
+
- README.md
|
120
141
|
- Rakefile
|
121
142
|
- features/collection.yml
|
122
143
|
- features/complex_and.yml
|
@@ -158,10 +179,11 @@ files:
|
|
158
179
|
- spec/toggles/feature/operation/range_spec.rb
|
159
180
|
- spec/toggles/feature/permissions_spec.rb
|
160
181
|
- spec/toggles/feature/subject_spec.rb
|
182
|
+
- spec/toggles/init_spec.rb
|
161
183
|
- toggles.gemspec
|
162
|
-
homepage: https://github.com/
|
184
|
+
homepage: https://github.com/EasyPost/toggles
|
163
185
|
licenses:
|
164
|
-
-
|
186
|
+
- ISC
|
165
187
|
metadata: {}
|
166
188
|
post_install_message:
|
167
189
|
rdoc_options: []
|
@@ -169,17 +191,17 @@ require_paths:
|
|
169
191
|
- lib
|
170
192
|
required_ruby_version: !ruby/object:Gem::Requirement
|
171
193
|
requirements:
|
172
|
-
- -
|
194
|
+
- - '>='
|
173
195
|
- !ruby/object:Gem::Version
|
174
196
|
version: '0'
|
175
197
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
198
|
requirements:
|
177
|
-
- -
|
199
|
+
- - '>='
|
178
200
|
- !ruby/object:Gem::Version
|
179
201
|
version: '0'
|
180
202
|
requirements: []
|
181
203
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
204
|
+
rubygems_version: 2.0.14.1
|
183
205
|
signing_key:
|
184
206
|
specification_version: 4
|
185
207
|
summary: YAML backed feature toggles
|
@@ -203,3 +225,4 @@ test_files:
|
|
203
225
|
- spec/toggles/feature/operation/range_spec.rb
|
204
226
|
- spec/toggles/feature/permissions_spec.rb
|
205
227
|
- spec/toggles/feature/subject_spec.rb
|
228
|
+
- spec/toggles/init_spec.rb
|