feature 0.7.0 → 1.0.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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 1.0.0 (2014-03-26)
2
+
3
+ * drop ruby 1.8 support
4
+ * support Rails 4 generator loading only (mauriciovieira)
5
+ * add Feature.switch method (FlavourSys)
6
+ * minor code and doc fixes and cleanup
7
+
1
8
  ## 0.7.0 (2013-12-07)
2
9
 
3
10
  * add ActiveRecordRepository and a Rails::Generator (bigzed)
data/Gemfile CHANGED
@@ -1,9 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem "rake"
4
- gem "rspec"
5
- gem "rspec-mocks"
6
4
 
7
5
  group :test do
8
- gem 'coveralls', :require => false
6
+ gem "rspec"
7
+ gem "rspec-mocks"
8
+ gem 'coveralls', require: false
9
9
  end
data/README.md CHANGED
@@ -5,12 +5,14 @@ Feature is a battle-tested [feature toggle](http://martinfowler.com/bliki/Featur
5
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.
6
6
  With this approach Feature is higly configurable and not bound to a specific kind of configuration.
7
7
 
8
+ **NOTE:** Ruby 1.8 is only supported until version 0.7.0. Later Versions require at least Ruby 1.9.
9
+
8
10
  ## CI status
9
11
 
10
12
  [![Gem Version](https://badge.fury.io/rb/feature.png)](https://rubygems.org/gems/feature)
11
13
  [![Travis-CI Build Status](https://travis-ci.org/mgsnova/feature.png)](https://travis-ci.org/mgsnova/feature)
12
14
  [![Code Climate](https://codeclimate.com/github/mgsnova/feature.png)](https://codeclimate.com/github/mgsnova/feature)
13
- [![Coverage Status](https://coveralls.io/repos/mgsnova/feature/badge.png)](https://coveralls.io/r/mgsnova/feature)
15
+ [![Coverage Status](https://coveralls.io/repos/mgsnova/feature/badge.png?branch=master)](https://coveralls.io/r/mgsnova/feature)
14
16
 
15
17
  ## Installation
16
18
 
@@ -22,7 +24,7 @@ With this approach Feature is higly configurable and not bound to a specific kin
22
24
  * Create a repository (see examples below)
23
25
  * set repository to Feature
24
26
 
25
- Feature.set_repository(your_repository)
27
+ Feature.set_repository(your_repository)
26
28
 
27
29
  * Use Feature in your production code
28
30
 
@@ -38,6 +40,11 @@ With this approach Feature is higly configurable and not bound to a specific kin
38
40
  # code
39
41
  end
40
42
 
43
+ Feature.switch(:feature_name, value_true, value_false) # => returns value_true if :feature_name is active, otherwise value_false
44
+
45
+ # May also take Procs (here in Ruby 1.9 lambda syntax), returns code evaluation result.
46
+ Feature.switch(:feature_name, -> { code... }, -> { code... })
47
+
41
48
  * Use Feature in your test code (for reliable testing of feature depending code)
42
49
 
43
50
  require 'feature/testing'
data/Rakefile CHANGED
@@ -6,5 +6,5 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
6
6
  spec.rspec_opts = ['--colour', '-f documentation', '--backtrace']
7
7
  end
8
8
 
9
- task :default => [:spec] do
9
+ task default: [:spec] do
10
10
  end
@@ -5,7 +5,7 @@ require 'rails/generators/active_record'
5
5
  module Feature
6
6
  class InstallGenerator < Rails::Generators::Base
7
7
  include Rails::Generators::Migration
8
- extend ActiveRecord::Generators::Migration
8
+ extend Rails::Generators::Migration
9
9
 
10
10
  desc 'This generator creates a migration and a model for FeatureToggles.'
11
11
  source_root File.expand_path('../templates', __FILE__)
@@ -2,5 +2,5 @@ class FeatureToggle < ActiveRecord::Base
2
2
  attr_accessible :name, :active
3
3
 
4
4
  # Feature name should be present and unique
5
- validates :name, :presence => true, :uniqueness => true
5
+ validates :name, presence: true, uniqueness: true
6
6
  end
@@ -21,7 +21,7 @@ module Feature
21
21
  # @return [Array<Symbol>] list of active features
22
22
  #
23
23
  def active_features
24
- @model.where(:active => true).map { |f| f.name.to_sym }
24
+ @model.where(active: true).map { |f| f.name.to_sym }
25
25
  end
26
26
 
27
27
  # Add an active feature to repository
@@ -31,7 +31,7 @@ module Feature
31
31
  def add_active_feature(feature)
32
32
  check_feature_is_not_symbol(feature)
33
33
  check_feature_already_in_list(feature)
34
- @model.new(:name => feature.to_s, :active => true).save
34
+ @model.new(name: feature.to_s, active: true).save
35
35
  end
36
36
 
37
37
  # Checks if the given feature is a not symbol and raises an exception if so
@@ -7,8 +7,9 @@ require 'feature'
7
7
  # To enable Feature testing capabilities do:
8
8
  # require 'feature/testing'
9
9
  module Feature
10
+
10
11
  # Execute the code block with the given feature active
11
- #
12
+ #
12
13
  # Example usage:
13
14
  # Feature.run_with_activated(:feature) do
14
15
  # # your test code here
@@ -22,7 +23,7 @@ module Feature
22
23
  end
23
24
 
24
25
  # Execute the code block with the given feature deactive
25
- #
26
+ #
26
27
  # Example usage:
27
28
  # Feature.run_with_deactivated(:feature) do
28
29
  # # your test code here
data/lib/feature.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  # - to refresh the feature lists (request them from repository)
6
6
  #
7
7
  # @note all features not active will be handled has inactive
8
- #
8
+ #
9
9
  # Example usage:
10
10
  # repository = SimpleRepository.new
11
11
  # repository.add_active_feature(:feature_name)
@@ -22,8 +22,8 @@
22
22
  #
23
23
  module Feature
24
24
  require 'feature/repository'
25
- # Only load the generator if Rails is defined
26
- require 'feature/generators/install_generator' if defined?(Rails)
25
+ # Only load the generator if Rails is defined and Version is greater than 3
26
+ require 'feature/generators/install_generator' if defined?(Rails) and Rails::VERSION::STRING > "3"
27
27
 
28
28
  @repository = nil
29
29
  @active_features = nil
@@ -80,9 +80,7 @@ module Feature
80
80
  raise ArgumentError, "no block given to #{__method__}"
81
81
  end
82
82
 
83
- if active?(feature)
84
- yield
85
- end
83
+ yield if active?(feature)
86
84
  end
87
85
 
88
86
  # Execute the given block if feature is inactive
@@ -94,8 +92,20 @@ module Feature
94
92
  raise ArgumentError, "no block given to #{__method__}"
95
93
  end
96
94
 
97
- if inactive?(feature)
98
- yield
95
+ yield if inactive?(feature)
96
+ end
97
+
98
+ # Return value or execute Proc/lambda depending on Feature status.
99
+ #
100
+ # @param [Symbol] feature
101
+ # @param [Object] value to be returned / lambda to be evaluated if feature is active
102
+ # @param [Object] value to be returned / lambda to be evaluated if feature is inactive
103
+ #
104
+ def self.switch(feature, l1, l2)
105
+ if active?(feature)
106
+ l1.is_a?(Proc) ? l1.call : l1
107
+ else
108
+ l2.is_a?(Proc) ? l2.call : l2
99
109
  end
100
110
  end
101
111
  end
@@ -17,7 +17,7 @@ describe Feature::Repository::ActiveRecordRepository do
17
17
 
18
18
  it "should add an active feature" do
19
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))
20
+ @features.should_receive(:new).with(name: "feature_a", active: true).and_return(stub(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
+ @features.should_receive(:new).with(name: "feature_a", active: true).and_return(stub(save: true))
33
+ @features.stub(:exists?).and_return(false, true)
34
34
 
35
35
  @repository.add_active_feature :feature_a
36
36
  expect {
@@ -41,16 +41,6 @@ describe Feature do
41
41
  end.should raise_error(ArgumentError, "given repository does not respond to active_features")
42
42
  end
43
43
 
44
- it "should set a feature repository" do
45
- lambda do
46
- Feature.active?(:feature_a)
47
- end.should_not raise_error
48
-
49
- lambda do
50
- Feature.inactive?(:feature_a)
51
- end.should_not raise_error
52
- end
53
-
54
44
  it "should get active features from repository once" do
55
45
  @repository.add_active_feature(:feature_a)
56
46
  Feature.active?(:feature_a).should be_false
@@ -145,5 +135,30 @@ describe Feature do
145
135
  end.should raise_error(ArgumentError, "no block given to without")
146
136
  end
147
137
 
138
+ describe 'switch()' do
139
+ context 'given a value' do
140
+ it "should return the first value if the feature is active" do
141
+ retval = Feature.switch(:feature_active, 1, 2)
142
+ expect(retval).to eq(1)
143
+ end
144
+
145
+ it "should return the second value if the feature is inactive" do
146
+ retval = Feature.switch(:feature_inactive, 1, 2)
147
+ expect(retval).to eq(2)
148
+ end
149
+ end
150
+
151
+ context 'given a proc/lambda' do
152
+ it "should call the first proc/lambda if the feature is active" do
153
+ retval = Feature.switch(:feature_active, lambda { 1 }, lambda { 2 })
154
+ expect(retval).to eq(1)
155
+ end
156
+
157
+ it "should call the second proc/lambda if the feature is active" do
158
+ retval = Feature.switch(:feature_inactive, lambda { 1 }, lambda { 2 })
159
+ expect(retval).to eq(2)
160
+ end
161
+ end
162
+ end
148
163
  end
149
164
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
- require "pathname"
2
- require 'pp'
1
+ require 'pathname'
3
2
  require 'coveralls'
4
3
  Coveralls.wear!
5
4
 
metadata CHANGED
@@ -1,22 +1,32 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: feature
3
- version: !ruby/object:Gem::Version
4
- version: 0.7.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Markus Gerdes
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-12-07 00:00:00.000000000 Z
17
+
18
+ date: 2014-03-26 00:00:00 Z
13
19
  dependencies: []
20
+
14
21
  description:
15
22
  email: github@mgsnova.de
16
23
  executables: []
24
+
17
25
  extensions: []
26
+
18
27
  extra_rdoc_files: []
19
- files:
28
+
29
+ files:
20
30
  - lib/feature.rb
21
31
  - lib/feature/generators/install_generator.rb
22
32
  - lib/feature/generators/templates/create_feature_toggles.rb
@@ -39,26 +49,36 @@ files:
39
49
  - CHANGELOG.md
40
50
  homepage: http://github.com/mgsnova/feature
41
51
  licenses: []
52
+
42
53
  post_install_message:
43
54
  rdoc_options: []
44
- require_paths:
55
+
56
+ require_paths:
45
57
  - lib
46
- required_ruby_version: !ruby/object:Gem::Requirement
58
+ required_ruby_version: !ruby/object:Gem::Requirement
47
59
  none: false
48
- requirements:
49
- - - ! '>='
50
- - !ruby/object:Gem::Version
51
- version: '0'
52
- required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
68
  none: false
54
- requirements:
55
- - - ! '>='
56
- - !ruby/object:Gem::Version
57
- version: '0'
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
58
76
  requirements: []
77
+
59
78
  rubyforge_project:
60
- rubygems_version: 1.8.24
79
+ rubygems_version: 1.8.29
61
80
  signing_key:
62
81
  specification_version: 3
63
82
  summary: Feature Toggle library for ruby
64
83
  test_files: []
84
+