feature 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3f9b9580a7aa39fe081df357dce3bcfaf4611ba9
4
+ data.tar.gz: 5ec1b69eb13c4c20689fd227194796e26969b4ef
5
+ SHA512:
6
+ metadata.gz: 5d12f49a521091b2d2ad0787f33bfa4352f5db57ea3801a86088e03ea2c61ddf116e5c9cae9f6f2fb83cb560b196f47a1916455e78e293cba4f1b3b4705bd794
7
+ data.tar.gz: d84ff821a0bd30c0534ce68e971b671640881c829a46384d9f2165ea5945f1594e1db0d1264d38b1ad80caa766e8b31a775879c36faecd22f14157992ce9984d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 1.1.0 (2014-09-30)
2
+
3
+ * generator compatible with Rails 3/4 (mumoshu)
4
+ * add LICENSE (pivotalfish)
5
+ * add optional environment flag for YamlRepository (cherbst-medidata)
6
+ * documentation fixes (asmega, crackofdusk)
7
+ * update to rspec 3
8
+
1
9
  ## 1.0.0 (2014-03-26)
2
10
 
3
11
  * drop ruby 1.8 support
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Feature is a battle-tested [feature toggle](http://martinfowler.com/bliki/FeatureToggle.html) library for ruby.
4
4
 
5
- The feature toggle functionality has to be configured by feature repositories. A feature repository simply provides lists of active features (symbols!). Unknown features are assumed deactive.
5
+ The feature toggle functionality has to be configured by feature repositories. A feature repository simply provides lists of active features (symbols!). Unknown features are assumed inactive.
6
6
  With this approach Feature is higly configurable and not bound to a specific kind of configuration.
7
7
 
8
8
  **NOTE:** Ruby 1.8 is only supported until version 0.7.0. Later Versions require at least Ruby 1.9.
@@ -28,9 +28,9 @@ With this approach Feature is higly configurable and not bound to a specific kin
28
28
 
29
29
  * Use Feature in your production code
30
30
 
31
- Feature.active(:feature_name) # => true/false
31
+ Feature.active?(:feature_name) # => true/false
32
32
 
33
- Feature.deactive?(:feature_name) # => true/false
33
+ Feature.inactive?(:feature_name) # => true/false
34
34
 
35
35
  Feature.with(:feature_name) do
36
36
  # code
@@ -80,7 +80,7 @@ With this approach Feature is higly configurable and not bound to a specific kin
80
80
  ### Rails using YamlRepository
81
81
 
82
82
  # File: Gemfile
83
- gem 'feature' # Or with version specifier, e.g. '~> 0.7.0'
83
+ gem 'feature'
84
84
 
85
85
  # File: config/feature.yml
86
86
  features:
@@ -96,11 +96,27 @@ With this approach Feature is higly configurable and not bound to a specific kin
96
96
  <%# Feature implementation goes here %>
97
97
  <% end %>
98
98
 
99
+ You may also specify a Rails environment to use a new feature in development and test, but not production:
100
+
101
+ # File: config/feature.yml
102
+ development:
103
+ features:
104
+ a_new_feature: true
105
+ test:
106
+ features:
107
+ a_new_feature: true
108
+ production:
109
+ features:
110
+ a_new_feature: false
111
+
112
+ # File: config/initializers/feature.rb
113
+ repo = Feature::Repository::YamlRepository.new("#{Rails.root}/config/feature.yml", Rails.env)
114
+ Feature.set_repository repo
99
115
 
100
116
  ### Rails using ActiveRecordRepository
101
117
 
102
118
  # File: Gemfile
103
- gem 'feature' # Or with version specifier, e.g. '~> 0.7.0'
119
+ gem 'feature'
104
120
 
105
121
  # Run generator and migrations
106
122
  $ rails g feature:install
@@ -108,8 +124,8 @@ With this approach Feature is higly configurable and not bound to a specific kin
108
124
 
109
125
  # Add Features to table FeaturesToggle for example in
110
126
  # File: db/schema.rb
111
- FeatureToggle.new(name: "ActiveFeature", active: true)
112
- FeatureToggle.new(name: "InActiveFeature", active: false)
127
+ FeatureToggle.create!(name: "ActiveFeature", active: true)
128
+ FeatureToggle.create!(name: "InActiveFeature", active: false)
113
129
 
114
130
  # or in initializer
115
131
  # File: config/initializers/feature.rb
@@ -12,8 +12,23 @@ module Feature
12
12
 
13
13
  def create_model_file
14
14
  template 'feature.rb', 'config/initializers/feature.rb'
15
- template 'feature_toggle.rb', 'app/models/feature_toggle.rb'
15
+ template appropriate_feature_toggle_rb, 'app/models/feature_toggle.rb'
16
16
  migration_template 'create_feature_toggles.rb', 'db/migrate/create_feature_toggles.rb'
17
17
  end
18
+
19
+ def self.next_migration_number(path)
20
+ ActiveRecord::Generators::Base.next_migration_number(path)
21
+ end
22
+
23
+ private
24
+
25
+ def appropriate_feature_toggle_rb
26
+ # For Rails 4 + protected_attributes or Rails 3, we prefer the model with `attr_accessible` pre-populated
27
+ if ActiveRecord::Base.respond_to? :attr_accessible
28
+ 'feature_toggle.rb'
29
+ else
30
+ 'feature_toggle_without_attr_accessible.rb'
31
+ end
32
+ end
18
33
  end
19
34
  end
@@ -0,0 +1,4 @@
1
+ class FeatureToggle < ActiveRecord::Base
2
+ # Feature name should be present and unique
3
+ validates :name, presence: true, uniqueness: true
4
+ end
@@ -18,9 +18,11 @@ module Feature
18
18
  # Constructor
19
19
  #
20
20
  # @param [String] yaml_file_name the yaml config filename
21
+ # @param [String] environment optional environment to use from config
21
22
  #
22
- def initialize(yaml_file_name)
23
+ def initialize(yaml_file_name, environment='')
23
24
  @yaml_file_name = yaml_file_name
25
+ @environment = environment
24
26
  end
25
27
 
26
28
  # Returns list of active features
@@ -41,6 +43,7 @@ module Feature
41
43
  raw_data = File.read(@yaml_file_name)
42
44
  evaluated_data = ERB.new(raw_data).result
43
45
  data = YAML.load(evaluated_data)
46
+ data = data[@environment] unless @environment.empty?
44
47
 
45
48
  if !data.is_a?(Hash) or !data.has_key?('features')
46
49
  raise ArgumentError, "content of #{@yaml_file_name} does not contain proper config"
@@ -10,14 +10,14 @@ describe Feature::Repository::ActiveRecordRepository do
10
10
  end
11
11
 
12
12
  it "should have no active features after initialization" do
13
- @features.stub(:where) { Hash.new }
13
+ allow(@features).to receive(:where) { Hash.new }
14
14
 
15
- @repository.active_features.should == []
15
+ expect(@repository.active_features).to eq([])
16
16
  end
17
17
 
18
18
  it "should add an active feature" do
19
- @features.should_receive(:exists?).with("feature_a").and_return(false)
20
- @features.should_receive(:new).with(name: "feature_a", active: true).and_return(stub(save: true))
19
+ expect(@features).to receive(:exists?).with("feature_a").and_return(false)
20
+ expect(@features).to receive(:new).with(name: "feature_a", active: true).and_return(double(save: true))
21
21
 
22
22
  @repository.add_active_feature :feature_a
23
23
  end
@@ -29,8 +29,8 @@ describe Feature::Repository::ActiveRecordRepository do
29
29
  end
30
30
 
31
31
  it "should raise an exception when adding a active feature already added as active" do
32
- @features.should_receive(:new).with(name: "feature_a", active: true).and_return(stub(save: true))
33
- @features.stub(:exists?).and_return(false, true)
32
+ expect(@features).to receive(:new).with(name: "feature_a", active: true).and_return(double(save: true))
33
+ allow(@features).to receive(:exists?).and_return(false, true)
34
34
 
35
35
  @repository.add_active_feature :feature_a
36
36
  expect {
@@ -3,29 +3,29 @@ require 'spec_helper'
3
3
  describe Feature do
4
4
  context "without FeatureRepository" do
5
5
  it "should raise an exception when calling active?" do
6
- lambda do
6
+ expect do
7
7
  Feature.active?(:feature_a)
8
- end.should raise_error("Feature is missing Repository for obtaining feature lists")
8
+ end.to raise_error("Feature is missing Repository for obtaining feature lists")
9
9
  end
10
10
 
11
11
  it "should raise an exception when calling inactive?" do
12
- lambda do
12
+ expect do
13
13
  Feature.inactive?(:feature_a)
14
- end.should raise_error("Feature is missing Repository for obtaining feature lists")
14
+ end.to raise_error("Feature is missing Repository for obtaining feature lists")
15
15
  end
16
16
 
17
17
  it "should raise an exception when calling with" do
18
- lambda do
18
+ expect do
19
19
  Feature.with(:feature_a) do
20
20
  end
21
- end.should raise_error("Feature is missing Repository for obtaining feature lists")
21
+ end.to raise_error("Feature is missing Repository for obtaining feature lists")
22
22
  end
23
23
 
24
24
  it "should raise an exception when calling without" do
25
- lambda do
25
+ expect do
26
26
  Feature.without(:feature_a) do
27
27
  end
28
- end.should raise_error("Feature is missing Repository for obtaining feature lists")
28
+ end.to raise_error("Feature is missing Repository for obtaining feature lists")
29
29
  end
30
30
  end
31
31
 
@@ -36,14 +36,14 @@ describe Feature do
36
36
  end
37
37
 
38
38
  it "should raise an exception when add repository with wrong class" do
39
- lambda do
39
+ expect do
40
40
  Feature.set_repository("not a repository")
41
- end.should raise_error(ArgumentError, "given repository does not respond to active_features")
41
+ end.to raise_error(ArgumentError, "given repository does not respond to active_features")
42
42
  end
43
43
 
44
44
  it "should get active features from repository once" do
45
45
  @repository.add_active_feature(:feature_a)
46
- Feature.active?(:feature_a).should be_false
46
+ expect(Feature.active?(:feature_a)).to be_falsey
47
47
  end
48
48
  end
49
49
 
@@ -56,7 +56,7 @@ describe Feature do
56
56
  it "should refresh active feature lists from repository" do
57
57
  @repository.add_active_feature(:feature_a)
58
58
  Feature.refresh!
59
- Feature.active?(:feature_a).should be_true
59
+ expect(Feature.active?(:feature_a)).to be_truthy
60
60
  end
61
61
  end
62
62
 
@@ -68,19 +68,19 @@ describe Feature do
68
68
  end
69
69
 
70
70
  it "should affirm active feature is active" do
71
- Feature.active?(:feature_active).should be_true
71
+ expect(Feature.active?(:feature_active)).to be_truthy
72
72
  end
73
73
 
74
74
  it "should not affirm active feature is inactive" do
75
- Feature.inactive?(:feature_active).should be_false
75
+ expect(Feature.inactive?(:feature_active)).to be_falsey
76
76
  end
77
77
 
78
78
  it "should affirm inactive feature is inactive" do
79
- Feature.inactive?(:feature_inactive).should be_true
79
+ expect(Feature.inactive?(:feature_inactive)).to be_truthy
80
80
  end
81
81
 
82
82
  it "should not affirm inactive feature is active" do
83
- Feature.active?(:feature_inactive).should be_false
83
+ expect(Feature.active?(:feature_inactive)).to be_falsey
84
84
  end
85
85
 
86
86
  it "should call block with active feature in active list" do
@@ -90,7 +90,7 @@ describe Feature do
90
90
  reached = true
91
91
  end
92
92
 
93
- reached.should be_true
93
+ expect(reached).to be_truthy
94
94
  end
95
95
 
96
96
  it "should not call block with active feature not in active list" do
@@ -100,13 +100,13 @@ describe Feature do
100
100
  reached = true
101
101
  end
102
102
 
103
- reached.should be_false
103
+ expect(reached).to be_falsey
104
104
  end
105
105
 
106
106
  it "should raise exception when no block given to with" do
107
- lambda do
107
+ expect do
108
108
  Feature.with(:feature_active)
109
- end.should raise_error(ArgumentError, "no block given to with")
109
+ end.to raise_error(ArgumentError, "no block given to with")
110
110
  end
111
111
 
112
112
  it "should call block without inactive feature in inactive list" do
@@ -116,7 +116,7 @@ describe Feature do
116
116
  reached = true
117
117
  end
118
118
 
119
- reached.should be_true
119
+ expect(reached).to be_truthy
120
120
  end
121
121
 
122
122
  it "should not call block without inactive feature in inactive list" do
@@ -126,13 +126,13 @@ describe Feature do
126
126
  reached = true
127
127
  end
128
128
 
129
- reached.should be_false
129
+ expect(reached).to be_falsey
130
130
  end
131
131
 
132
132
  it "should raise exception when no block given to without" do
133
- lambda do
133
+ expect do
134
134
  Feature.without(:feature_inactive)
135
- end.should raise_error(ArgumentError, "no block given to without")
135
+ end.to raise_error(ArgumentError, "no block given to without")
136
136
  end
137
137
 
138
138
  describe 'switch()' do
@@ -8,24 +8,24 @@ describe Feature::Repository::SimpleRepository do
8
8
  end
9
9
 
10
10
  it "should have no active features after initialization" do
11
- @repository.active_features.should == []
11
+ expect(@repository.active_features).to eq([])
12
12
  end
13
13
 
14
14
  it "should add an active feature" do
15
15
  @repository.add_active_feature :feature_a
16
- @repository.active_features.should == [:feature_a]
16
+ expect(@repository.active_features).to eq([:feature_a])
17
17
  end
18
18
 
19
19
  it "should raise an exception when adding not a symbol as active feature" do
20
- lambda do
20
+ expect do
21
21
  @repository.add_active_feature 'feature_a'
22
- end.should raise_error(ArgumentError, "given feature feature_a is not a symbol")
22
+ end.to raise_error(ArgumentError, "given feature feature_a is not a symbol")
23
23
  end
24
24
 
25
25
  it "should raise an exception when adding a active feature already added as active" do
26
26
  @repository.add_active_feature :feature_a
27
- lambda do
27
+ expect do
28
28
  @repository.add_active_feature :feature_a
29
- end.should raise_error(ArgumentError, "feature :feature_a already added to list of active features")
29
+ end.to raise_error(ArgumentError, "feature :feature_a already added to list of active features")
30
30
  end
31
31
  end
@@ -9,22 +9,22 @@ describe "Feature testing support" do
9
9
  end
10
10
 
11
11
  it "should execute code block with an deactivated feature" do
12
- Feature.active?(:another_feature).should be_false
12
+ expect(Feature.active?(:another_feature)).to be_falsey
13
13
 
14
14
  Feature.run_with_activated(:another_feature) do
15
- Feature.active?(:another_feature).should be_true
15
+ expect(Feature.active?(:another_feature)).to be_truthy
16
16
  end
17
17
 
18
- Feature.active?(:another_feature).should be_false
18
+ expect(Feature.active?(:another_feature)).to be_falsey
19
19
  end
20
20
 
21
21
  it "should execute code block with an deactivated feature" do
22
- Feature.active?(:active_feature).should be_true
22
+ expect(Feature.active?(:active_feature)).to be_truthy
23
23
 
24
24
  Feature.run_with_deactivated(:active_feature) do
25
- Feature.active?(:active_feature).should be_false
25
+ expect(Feature.active?(:active_feature)).to be_falsey
26
26
  end
27
27
 
28
- Feature.active?(:active_feature).should be_true
28
+ expect(Feature.active?(:active_feature)).to be_truthy
29
29
  end
30
30
  end
@@ -25,7 +25,7 @@ EOF
25
25
  end
26
26
 
27
27
  it "should read active features from a config file" do
28
- @repo.active_features.should == [:feature_a_active, :feature_b_active]
28
+ expect(@repo.active_features).to eq([:feature_a_active, :feature_b_active])
29
29
  end
30
30
 
31
31
  context "re-read config file" do
@@ -40,7 +40,7 @@ EOF
40
40
  end
41
41
 
42
42
  it "should read active features new on each request" do
43
- @repo.active_features.should == [:feature_a_active]
43
+ expect(@repo.active_features).to eq([:feature_a_active])
44
44
  end
45
45
  end
46
46
 
@@ -55,7 +55,34 @@ EOF
55
55
  end
56
56
 
57
57
  it "should read active features new on each request" do
58
- @repo.active_features.should == []
58
+ expect(@repo.active_features).to eq([])
59
+ end
60
+ end
61
+
62
+ context "with optional environment name" do
63
+ before(:each) do
64
+ fp = File.new(@filename, 'w')
65
+ fp.write <<"EOF";
66
+ development:
67
+ features:
68
+ feature_a: true
69
+ feature_b: true
70
+ production:
71
+ features:
72
+ feature_a: true
73
+ feature_b: false
74
+ EOF
75
+ fp.close
76
+ end
77
+
78
+ it "has two active features for development environment" do
79
+ repo = YamlRepository.new(@filename, 'development')
80
+ expect(repo.active_features).to eq([:feature_a, :feature_b])
81
+ end
82
+
83
+ it "has one active feature for production environment" do
84
+ repo = YamlRepository.new(@filename, 'production')
85
+ expect(repo.active_features).to eq([:feature_a])
59
86
  end
60
87
  end
61
88
 
@@ -78,16 +105,16 @@ EOF
78
105
  end
79
106
 
80
107
  it "should read active features from the config file" do
81
- @repo.active_features.should == [:feature_a_active, :feature_b_active]
108
+ expect(@repo.active_features).to eq([:feature_a_active, :feature_b_active])
82
109
  end
83
110
  end
84
111
  end
85
112
 
86
113
  it "should raise exception on no file found" do
87
114
  repo = YamlRepository.new("/this/file/should/not/exist")
88
- lambda do
115
+ expect do
89
116
  repo.active_features
90
- end.should raise_error(Errno::ENOENT, /No such file or directory/)
117
+ end.to raise_error(Errno::ENOENT, /No such file or directory/)
91
118
  end
92
119
 
93
120
  it "should raise exception on invalid yaml" do
@@ -97,9 +124,9 @@ EOF
97
124
  fp.close
98
125
 
99
126
  repo = YamlRepository.new(@filename)
100
- lambda do
127
+ expect do
101
128
  repo.active_features
102
- end.should raise_error(ArgumentError, "content of #{@filename} does not contain proper config")
129
+ end.to raise_error(ArgumentError, "content of #{@filename} does not contain proper config")
103
130
  end
104
131
 
105
132
  it "should raise exception on not true/false value in config" do
@@ -112,8 +139,8 @@ EOF
112
139
  fp.close
113
140
 
114
141
  repo = YamlRepository.new(@filename)
115
- lambda do
142
+ expect do
116
143
  repo.active_features
117
- end.should raise_error(ArgumentError, "neither_true_or_false is not allowed value in config, use true/false")
144
+ end.to raise_error(ArgumentError, "neither_true_or_false is not allowed value in config, use true/false")
118
145
  end
119
146
  end
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.2.19'
4
+ gem 'railties'
@@ -0,0 +1,86 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ actionmailer (3.2.19)
5
+ actionpack (= 3.2.19)
6
+ mail (~> 2.5.4)
7
+ actionpack (3.2.19)
8
+ activemodel (= 3.2.19)
9
+ activesupport (= 3.2.19)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ journey (~> 1.0.4)
13
+ rack (~> 1.4.5)
14
+ rack-cache (~> 1.2)
15
+ rack-test (~> 0.6.1)
16
+ sprockets (~> 2.2.1)
17
+ activemodel (3.2.19)
18
+ activesupport (= 3.2.19)
19
+ builder (~> 3.0.0)
20
+ activerecord (3.2.19)
21
+ activemodel (= 3.2.19)
22
+ activesupport (= 3.2.19)
23
+ arel (~> 3.0.2)
24
+ tzinfo (~> 0.3.29)
25
+ activeresource (3.2.19)
26
+ activemodel (= 3.2.19)
27
+ activesupport (= 3.2.19)
28
+ activesupport (3.2.19)
29
+ i18n (~> 0.6, >= 0.6.4)
30
+ multi_json (~> 1.0)
31
+ arel (3.0.3)
32
+ builder (3.0.4)
33
+ erubis (2.7.0)
34
+ hike (1.2.3)
35
+ i18n (0.6.11)
36
+ journey (1.0.4)
37
+ json (1.8.1)
38
+ mail (2.5.4)
39
+ mime-types (~> 1.16)
40
+ treetop (~> 1.4.8)
41
+ mime-types (1.25.1)
42
+ multi_json (1.10.1)
43
+ polyglot (0.3.5)
44
+ rack (1.4.5)
45
+ rack-cache (1.2)
46
+ rack (>= 0.4)
47
+ rack-ssl (1.3.4)
48
+ rack
49
+ rack-test (0.6.2)
50
+ rack (>= 1.0)
51
+ rails (3.2.19)
52
+ actionmailer (= 3.2.19)
53
+ actionpack (= 3.2.19)
54
+ activerecord (= 3.2.19)
55
+ activeresource (= 3.2.19)
56
+ activesupport (= 3.2.19)
57
+ bundler (~> 1.0)
58
+ railties (= 3.2.19)
59
+ railties (3.2.19)
60
+ actionpack (= 3.2.19)
61
+ activesupport (= 3.2.19)
62
+ rack-ssl (~> 1.3.2)
63
+ rake (>= 0.8.7)
64
+ rdoc (~> 3.4)
65
+ thor (>= 0.14.6, < 2.0)
66
+ rake (10.3.2)
67
+ rdoc (3.12.2)
68
+ json (~> 1.4)
69
+ sprockets (2.2.2)
70
+ hike (~> 1.2)
71
+ multi_json (~> 1.0)
72
+ rack (~> 1.0)
73
+ tilt (~> 1.1, != 1.3.0)
74
+ thor (0.19.1)
75
+ tilt (1.4.1)
76
+ treetop (1.4.15)
77
+ polyglot
78
+ polyglot (>= 0.3.1)
79
+ tzinfo (0.3.40)
80
+
81
+ PLATFORMS
82
+ ruby
83
+
84
+ DEPENDENCIES
85
+ rails (~> 3.2.19)
86
+ railties
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.1.4'
4
+ gem 'railties'
@@ -0,0 +1,85 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ actionmailer (4.1.4)
5
+ actionpack (= 4.1.4)
6
+ actionview (= 4.1.4)
7
+ mail (~> 2.5.4)
8
+ actionpack (4.1.4)
9
+ actionview (= 4.1.4)
10
+ activesupport (= 4.1.4)
11
+ rack (~> 1.5.2)
12
+ rack-test (~> 0.6.2)
13
+ actionview (4.1.4)
14
+ activesupport (= 4.1.4)
15
+ builder (~> 3.1)
16
+ erubis (~> 2.7.0)
17
+ activemodel (4.1.4)
18
+ activesupport (= 4.1.4)
19
+ builder (~> 3.1)
20
+ activerecord (4.1.4)
21
+ activemodel (= 4.1.4)
22
+ activesupport (= 4.1.4)
23
+ arel (~> 5.0.0)
24
+ activesupport (4.1.4)
25
+ i18n (~> 0.6, >= 0.6.9)
26
+ json (~> 1.7, >= 1.7.7)
27
+ minitest (~> 5.1)
28
+ thread_safe (~> 0.1)
29
+ tzinfo (~> 1.1)
30
+ arel (5.0.1.20140414130214)
31
+ builder (3.2.2)
32
+ erubis (2.7.0)
33
+ hike (1.2.3)
34
+ i18n (0.6.11)
35
+ json (1.8.1)
36
+ mail (2.5.4)
37
+ mime-types (~> 1.16)
38
+ treetop (~> 1.4.8)
39
+ mime-types (1.25.1)
40
+ minitest (5.4.0)
41
+ multi_json (1.10.1)
42
+ polyglot (0.3.5)
43
+ rack (1.5.2)
44
+ rack-test (0.6.2)
45
+ rack (>= 1.0)
46
+ rails (4.1.4)
47
+ actionmailer (= 4.1.4)
48
+ actionpack (= 4.1.4)
49
+ actionview (= 4.1.4)
50
+ activemodel (= 4.1.4)
51
+ activerecord (= 4.1.4)
52
+ activesupport (= 4.1.4)
53
+ bundler (>= 1.3.0, < 2.0)
54
+ railties (= 4.1.4)
55
+ sprockets-rails (~> 2.0)
56
+ railties (4.1.4)
57
+ actionpack (= 4.1.4)
58
+ activesupport (= 4.1.4)
59
+ rake (>= 0.8.7)
60
+ thor (>= 0.18.1, < 2.0)
61
+ rake (10.3.2)
62
+ sprockets (2.12.1)
63
+ hike (~> 1.2)
64
+ multi_json (~> 1.0)
65
+ rack (~> 1.0)
66
+ tilt (~> 1.1, != 1.3.0)
67
+ sprockets-rails (2.1.3)
68
+ actionpack (>= 3.0)
69
+ activesupport (>= 3.0)
70
+ sprockets (~> 2.8)
71
+ thor (0.19.1)
72
+ thread_safe (0.3.4)
73
+ tilt (1.4.1)
74
+ treetop (1.4.15)
75
+ polyglot
76
+ polyglot (>= 0.3.1)
77
+ tzinfo (1.2.1)
78
+ thread_safe (~> 0.1)
79
+
80
+ PLATFORMS
81
+ ruby
82
+
83
+ DEPENDENCIES
84
+ rails (~> 4.1.4)
85
+ railties
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ for rails_version in 3 4; do
6
+ RAILS_VERSION=$rails_version ./test-against-specific-rails-version.sh
7
+ done
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ BUNDLE_GEMFILE=gemfiles/rails${RAILS_VERSION}.gemfile
6
+
7
+ TESTAPP_NAME=testapp
8
+
9
+ if [ -d $TESTAPP_NAME ]; then
10
+ rm -Rf $TESTAPP_NAME
11
+ fi
12
+
13
+ bundle install
14
+ bundle exec rails new $TESTAPP_NAME --skip-bundle
15
+
16
+ unset BUNDLE_GEMFILE
17
+
18
+ echo "gem 'feature', path: '../../../..'" >> $TESTAPP_NAME/Gemfile
19
+
20
+ cd $TESTAPP_NAME
21
+
22
+ bundle install
23
+ bundle exec rails g feature:install
24
+ bundle exec rake db:migrate
metadata CHANGED
@@ -1,37 +1,31 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: feature
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 0
10
- version: 1.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Markus Gerdes
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2014-03-26 00:00:00 Z
11
+ date: 2014-09-30 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
13
  description:
22
14
  email: github@mgsnova.de
23
15
  executables: []
24
-
25
16
  extensions: []
26
-
27
17
  extra_rdoc_files: []
28
-
29
- files:
18
+ files:
19
+ - CHANGELOG.md
20
+ - Gemfile
21
+ - README.md
22
+ - Rakefile
30
23
  - lib/feature.rb
31
24
  - lib/feature/generators/install_generator.rb
32
25
  - lib/feature/generators/templates/create_feature_toggles.rb
33
26
  - lib/feature/generators/templates/feature.rb
34
27
  - lib/feature/generators/templates/feature_toggle.rb
28
+ - lib/feature/generators/templates/feature_toggle_without_attr_accessible.rb
35
29
  - lib/feature/repository.rb
36
30
  - lib/feature/repository/active_record_repository.rb
37
31
  - lib/feature/repository/simple_repository.rb
@@ -42,43 +36,35 @@ files:
42
36
  - spec/feature/simple_repository_spec.rb
43
37
  - spec/feature/testing_spec.rb
44
38
  - spec/feature/yaml_repository_spec.rb
39
+ - spec/integration/rails/gemfiles/rails3.gemfile
40
+ - spec/integration/rails/gemfiles/rails3.gemfile.lock
41
+ - spec/integration/rails/gemfiles/rails4.gemfile
42
+ - spec/integration/rails/gemfiles/rails4.gemfile.lock
43
+ - spec/integration/rails/test-against-several-rails-versions.sh
44
+ - spec/integration/rails/test-against-specific-rails-version.sh
45
45
  - spec/spec_helper.rb
46
- - Rakefile
47
- - Gemfile
48
- - README.md
49
- - CHANGELOG.md
50
46
  homepage: http://github.com/mgsnova/feature
51
- licenses: []
52
-
47
+ licenses:
48
+ - MIT
49
+ metadata: {}
53
50
  post_install_message:
54
51
  rdoc_options: []
55
-
56
- require_paths:
52
+ require_paths:
57
53
  - lib
58
- required_ruby_version: !ruby/object:Gem::Requirement
59
- none: false
60
- requirements:
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
61
56
  - - ">="
62
- - !ruby/object:Gem::Version
63
- hash: 3
64
- segments:
65
- - 0
66
- version: "0"
67
- required_rubygems_version: !ruby/object:Gem::Requirement
68
- none: false
69
- requirements:
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
70
61
  - - ">="
71
- - !ruby/object:Gem::Version
72
- hash: 3
73
- segments:
74
- - 0
75
- version: "0"
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
76
64
  requirements: []
77
-
78
65
  rubyforge_project:
79
- rubygems_version: 1.8.29
66
+ rubygems_version: 2.2.2
80
67
  signing_key:
81
- specification_version: 3
68
+ specification_version: 4
82
69
  summary: Feature Toggle library for ruby
83
70
  test_files: []
84
-