arturo 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -88,7 +88,7 @@ of Arturo.
88
88
 
89
89
  $ rails g arturo:migration
90
90
  $ rails g arturo:initializer
91
- $ rails g arturo:route
91
+ $ rails g arturo:routes
92
92
  $ rails g arturo:assets
93
93
 
94
94
  #### Run the migration:
@@ -277,19 +277,3 @@ percentage. See `Arturo::CacheSupport` for more information.
277
277
  Arturo gets its name from
278
278
  [Professor Maximillian Arturo](http://en.wikipedia.org/wiki/Maximillian_Arturo)
279
279
  on [Sliders](http://en.wikipedia.org/wiki/Sliders).
280
-
281
- ## Contributing ##
282
-
283
- For bug reports, open an [issue](https://github.com/jamesarosen/Timecop.js/issues)
284
- on GitHub.
285
-
286
- Timecop.js has a ‘commit-bit’ policy, much like the Rubinius project
287
- and Gemcutter. Submit a patch that is accepted, and you can get full
288
- commit access to the project. All you have to do is open an issue
289
- asking for access and I'll add you as a collaborator.
290
- Feel free to fork the project though and have fun in your own sandbox.
291
-
292
- ## Authors ##
293
-
294
- * [https://github.com/jamesarosen](James A. Rosen)
295
- * [https://github.com/plukevdh](Luke van der Hoeven)
@@ -1,4 +1,5 @@
1
1
  require 'action_controller'
2
+ require 'arturo/feature_params_support'
2
3
 
3
4
  # TODO: this doesn't do anything radically out of the ordinary.
4
5
  # Are there Rails 3 patterns/mixins/methods I can use
@@ -10,12 +11,20 @@ module Arturo
10
11
  # return true only for users who are permitted to manage features.
11
12
  class FeaturesController < ApplicationController
12
13
  include Arturo::FeatureManagement
14
+ include Arturo::FeatureParamsSupport
13
15
 
14
16
  unloadable
15
17
  respond_to :html, :json, :xml
16
18
  before_filter :require_permission
17
19
  before_filter :load_feature, :only => [ :show, :edit, :update, :destroy ]
18
20
 
21
+ if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0
22
+ def arturo_engine
23
+ self
24
+ end
25
+ helper_method :arturo_engine
26
+ end
27
+
19
28
  def index
20
29
  @features = Arturo::Feature.all
21
30
  respond_with @features
@@ -24,7 +33,6 @@ module Arturo
24
33
  def update_all
25
34
  updated_count = 0
26
35
  errors = []
27
- features_params = params[:features] || {}
28
36
  features_params.each do |id, attributes|
29
37
  feature = Arturo::Feature.find_by_id(id)
30
38
  if feature.blank?
@@ -32,7 +40,7 @@ module Arturo
32
40
  elsif feature.update_attributes(attributes)
33
41
  updated_count += 1
34
42
  else
35
- errors << t('arturo.features.flash.error_updating', :id => id)
43
+ errors << t('arturo.features.flash.error_updating', :id => id, :errors => feature.errors.full_messages.to_sentence)
36
44
  end
37
45
  end
38
46
  if errors.any?
@@ -40,7 +48,7 @@ module Arturo
40
48
  else
41
49
  flash[:success] = t('arturo.features.flash.updated_many', :count => updated_count)
42
50
  end
43
- redirect_to features_path
51
+ redirect_to arturo_engine.features_path
44
52
  end
45
53
 
46
54
  def show
@@ -48,15 +56,15 @@ module Arturo
48
56
  end
49
57
 
50
58
  def new
51
- @feature = Arturo::Feature.new(params[:feature])
59
+ @feature = Arturo::Feature.new(feature_params)
52
60
  respond_with @feature
53
61
  end
54
62
 
55
63
  def create
56
- @feature = Arturo::Feature.new(params[:feature])
64
+ @feature = Arturo::Feature.new(feature_params)
57
65
  if @feature.save
58
66
  flash[:notice] = t('arturo.features.flash.created', :name => @feature.to_s)
59
- redirect_to features_path
67
+ redirect_to arturo_engine.features_path
60
68
  else
61
69
  flash[:alert] = t('arturo.features.flash.error_creating', :name => @feature.to_s)
62
70
  render :action => 'new'
@@ -68,11 +76,11 @@ module Arturo
68
76
  end
69
77
 
70
78
  def update
71
- if @feature.update_attributes(params[:feature])
79
+ if @feature.update_attributes(feature_params)
72
80
  flash[:notice] = t('arturo.features.flash.updated', :name => @feature.to_s)
73
- redirect_to feature_path(@feature)
81
+ redirect_to arturo_engine.feature_path(@feature)
74
82
  else
75
- flash[:alert] = t('arturo.features.flash.error_updating', :name => @feature.to_s)
83
+ flash[:alert] = t('arturo.features.flash.error_updating', :name => @feature.to_s)
76
84
  render :action => 'edit'
77
85
  end
78
86
  end
@@ -83,7 +91,7 @@ module Arturo
83
91
  else
84
92
  flash[:alert] = t('arturo.features.flash.error_removing', :name => @feature.to_s)
85
93
  end
86
- redirect_to features_path
94
+ redirect_to arturo_engine.features_path
87
95
  end
88
96
 
89
97
  protected
@@ -1,10 +1,23 @@
1
- require 'action_view/helpers/tag_helper'
2
- require 'action_view/helpers/form_tag_helper'
3
-
4
1
  module Arturo
5
2
  module FeaturesHelper
6
3
  include ActionView::Helpers::TagHelper
7
4
 
5
+ def arturo_flash_messages(flash = self.flash)
6
+ [ :success, :notice, :error ].inject(''.html_safe) do |output, status|
7
+ [* flash[status] ].each do |messages|
8
+ output += arturo_flash_message(status, messages)
9
+ end
10
+ output
11
+ end
12
+ end
13
+
14
+ def arturo_flash_message(status, message)
15
+ content_tag(:div, :class => "alert alert-#{status} alert-arturo") do
16
+ close = content_tag(:a, '&times;'.html_safe, :href => '#', :class => 'close', 'data-dismiss' => 'alert')
17
+ content_tag(:span, message) + close
18
+ end
19
+ end
20
+
8
21
  def deployment_percentage_range_and_output_tags(name, value, options = {})
9
22
  id = sanitize_to_id(name)
10
23
  options = {
@@ -10,6 +10,7 @@ module Arturo
10
10
  Arturo::Feature::SYMBOL_REGEX = /^[a-zA-z][a-zA-Z0-9_]*$/
11
11
  DEFAULT_ATTRIBUTES = { :deployment_percentage => 0 }.with_indifferent_access
12
12
 
13
+ attr_accessible :symbol, :deployment_percentage if Rails::VERSION::MAJOR < 4
13
14
  attr_readonly :symbol
14
15
 
15
16
  validates_presence_of :symbol, :deployment_percentage
@@ -29,8 +30,9 @@ module Arturo
29
30
  end
30
31
 
31
32
  # Create a new Feature
32
- def initialize(attributes = {}, options = {}, &block)
33
- super(DEFAULT_ATTRIBUTES.merge(attributes || {}), options, &block)
33
+ def initialize(*args, &block)
34
+ args[0] = DEFAULT_ATTRIBUTES.merge(args[0] || {})
35
+ super(*args, &block)
34
36
  end
35
37
 
36
38
  # @param [Object] feature_recipient a User, Account,
@@ -63,12 +65,16 @@ module Arturo
63
65
  "<Arturo::Feature #{name}, deployed to #{deployment_percentage}%>"
64
66
  end
65
67
 
68
+ def self.last_updated_at
69
+ maximum(:updated_at)
70
+ end
71
+
66
72
  protected
67
73
 
68
74
  def passes_threshold?(feature_recipient)
69
75
  threshold = self.deployment_percentage || 0
70
- return false if threshold == 0
71
76
  return true if threshold == 100
77
+ return false if threshold == 0 || !feature_recipient.id
72
78
  (((feature_recipient.id + (self.id || 1) + 17) * 13) % 100) < threshold
73
79
  end
74
80
  end
@@ -1,5 +1,5 @@
1
1
  <tr class='feature' id="feature_<%= feature.id %>">
2
2
  <td><code class='ruby symbol'><%= feature.symbol %></code></td>
3
3
  <td><%= deployment_percentage_range_and_output_tags("features[#{feature.id}][deployment_percentage]", feature.deployment_percentage) %></td>
4
- <td><%= link_to t('.edit'), edit_feature_path(feature), :rel => 'edit', :class => 'edit' %></td>
4
+ <td><%= link_to t('.edit'), arturo_engine.edit_feature_path(feature), :rel => 'edit', :class => 'edit' %></td>
5
5
  </tr>
@@ -1,4 +1,4 @@
1
- <%= form_for(feature, :as => 'feature', :url => (feature.new_record? ? features_path : feature_path(feature))) do |form| %>
1
+ <%= form_for(feature, :as => 'feature', :url => (feature.new_record? ? arturo_engine.features_path : arturo_engine.feature_path(feature))) do |form| %>
2
2
  <fieldset>
3
3
  <legend><%= legend %></legend>
4
4
 
@@ -1,2 +1,5 @@
1
1
  <h2><%= t('.title', :name => @feature.name) %></h2>
2
+
3
+ <%= arturo_flash_messages %>
4
+
2
5
  <%= render :partial => 'form', :locals => { :feature => @feature, :legend => t('.legend', :name => @feature.name) } %>
@@ -1,2 +1,5 @@
1
1
  <h2><%= t('.title') %></h2>
2
+
3
+ <%= arturo_flash_messages %>
4
+
2
5
  <p><%= t('.text') %></p>
@@ -1,5 +1,8 @@
1
1
  <h2><%= t('.title') %></h2>
2
- <%= form_tag(features_path, :method => 'put', 'data-update-path' => feature_path(:id => ':id'), :remote => true) do %>
2
+
3
+ <%= arturo_flash_messages %>
4
+
5
+ <%= form_tag(arturo_engine.features_path, :method => 'put', 'data-update-path' => arturo_engine.feature_path(:id => ':id'), :remote => true) do %>
3
6
  <fieldset>
4
7
  <legend><%= t('.title') %></legend>
5
8
  <table class='features'>
@@ -14,7 +17,7 @@
14
17
  </tr>
15
18
  </thead>
16
19
  <tfoot>
17
- <tr><th colspan='4'><%= link_to t('.new'), new_feature_path %> <%= submit_tag %></th></tr>
20
+ <tr><th colspan='4'><%= link_to t('.new'), arturo_engine.new_feature_path %> <%= submit_tag %></th></tr>
18
21
  </tfoot>
19
22
  <tbody>
20
23
  <% @features.each do |f| %>
@@ -1,2 +1,5 @@
1
1
  <h2><%= t('.title') %></h2>
2
+
3
+ <%= arturo_flash_messages %>
4
+
2
5
  <%= render :partial => 'form', :locals => { :feature => @feature, :legend => t('.legend') } %>
@@ -1,2 +1,5 @@
1
1
  <h2><%= t('.title', :name => @feature.name) %></h2>
2
+
3
+ <%= arturo_flash_messages %>
4
+
2
5
  <p>Deployment percentage: <%= @feature.deployment_percentage %></p>
@@ -35,6 +35,9 @@ en:
35
35
  created: "Created %{name}"
36
36
  error_creating: "Sorry, there was an error creating the feature."
37
37
  updated: "Updated %{name}"
38
- error_updating: "Sorry, there was an error updating %{name}"
38
+ error_updating: "Could not update feature #%{id}: %{errors}."
39
39
  removed: "Removed %{name}"
40
40
  error_removing: "Sorry, there was an error removing %{name}"
41
+ no_such_feature:
42
+ name: "NoSuchFeature: %{symbol}"
43
+ symbol_required: "NoSuchFeature marker objects must have a symbol."
@@ -1,14 +1,13 @@
1
- # In Rails edge, the engine can have its own route set
2
- # and be mounted within an application at a sub-URL.
3
- # In 3.0.1, this is not yet available.
4
-
5
- # TODO replace this with the commented-out version below
6
- Rails.application.routes.draw do
7
- resources :features, :controller => 'arturo/features'
8
- put 'features', :to => 'arturo/features#update_all', :as => 'features'
1
+ if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0
2
+ Rails.application.routes.draw do
3
+ scope "/arturo" do
4
+ resources :features, :controller => "arturo/features"
5
+ put 'features', :to => 'arturo/features#update_all', :as => 'features'
6
+ end
7
+ end
8
+ else
9
+ Arturo::Engine.routes.draw do
10
+ resources :features, :controller => 'arturo/features'
11
+ put 'features', :to => 'arturo/features#update_all', :as => 'features'
12
+ end
9
13
  end
10
-
11
- # Arturo::Engine.routes.draw do
12
- # resources :features, :controller => 'arturo/features'
13
- # put 'features', :to => 'arturo/features#update_all', :as => 'features'
14
- # end
@@ -6,7 +6,7 @@ module Arturo
6
6
  require 'arturo/feature_caching'
7
7
  require 'arturo/controller_filters'
8
8
  require 'arturo/middleware'
9
- require 'arturo/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
9
+ require 'arturo/engine' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
10
10
 
11
11
  class <<self
12
12
 
@@ -1,3 +1,5 @@
1
+ require 'arturo/no_such_feature'
2
+
1
3
  module Arturo
2
4
 
3
5
  # To be extended by Arturo::Feature if you want to enable
@@ -31,16 +33,18 @@ module Arturo
31
33
 
32
34
  # Wraps Arturo::Feature.to_feature with in-memory caching.
33
35
  def to_feature_with_caching(feature_or_symbol)
34
- if !self.caches_features?
35
- return to_feature_without_caching(feature_or_symbol)
36
+ if !caches_features?
37
+ to_feature_without_caching(feature_or_symbol)
36
38
  elsif (feature_or_symbol.kind_of?(Arturo::Feature))
37
- feature_cache.write(feature_or_symbol.symbol, feature_or_symbol, :expires_in => cache_ttl)
39
+ feature_cache.write(feature_or_symbol.symbol.to_sym, feature_or_symbol, :expires_in => cache_ttl)
38
40
  feature_or_symbol
39
41
  elsif (cached_feature = feature_cache.read(feature_or_symbol.to_sym))
40
42
  cached_feature
41
- elsif (f = to_feature_without_caching(feature_or_symbol))
42
- feature_cache.write(f.symbol, f, :expires_in => cache_ttl)
43
- f
43
+ else
44
+ symbol = feature_or_symbol.to_sym
45
+ feature = to_feature_without_caching(symbol) || Arturo::NoSuchFeature.new(symbol)
46
+ feature_cache.write(symbol, feature, :expires_in => cache_ttl)
47
+ feature
44
48
  end
45
49
  end
46
50
 
@@ -51,8 +55,8 @@ module Arturo
51
55
  def initialize
52
56
  @data = {} # of the form {key => [value, expires_at or nil]}
53
57
  end
58
+
54
59
  def read(name, options = nil)
55
- name = name.to_s
56
60
  value, expires_at = *@data[name]
57
61
  if value && (expires_at.blank? || expires_at > Time.now)
58
62
  value
@@ -60,8 +64,8 @@ module Arturo
60
64
  nil
61
65
  end
62
66
  end
67
+
63
68
  def write(name, value, options = nil)
64
- name = name.to_s
65
69
  expires_at = if options && options.respond_to?(:[]) && options[:expires_in]
66
70
  Time.now + options.delete(:expires_in)
67
71
  else
@@ -71,6 +75,7 @@ module Arturo
71
75
  @data[name] = [value, expires_at]
72
76
  end
73
77
  end
78
+
74
79
  def clear
75
80
  @data.clear
76
81
  end
@@ -78,4 +83,4 @@ module Arturo
78
83
 
79
84
  end
80
85
 
81
- end
86
+ end
@@ -1,4 +1,8 @@
1
- Factory.define :feature, :class => Arturo::Feature do |f|
2
- f.sequence(:symbol) { |n| "feature_#{n}".to_sym }
3
- f.deployment_percentage { |_| rand(101) }
1
+ FactoryGirl.define do
2
+ sequence(:feature_symbol) { |n| "feature_#{n}".to_sym }
3
+
4
+ factory :feature, :class => Arturo::Feature do
5
+ symbol { generate(:feature_symbol) }
6
+ deployment_percentage { rand(101) }
7
+ end
4
8
  end
@@ -0,0 +1,38 @@
1
+ module Arturo
2
+
3
+ # Mix in to FeaturesController. Provides the logic for getting parameters
4
+ # for creating/updated features out of the request.
5
+ module FeatureParamsSupport
6
+
7
+ module WithoutStrongParams
8
+ def feature_params
9
+ params[:feature] || {}
10
+ end
11
+
12
+ def features_params
13
+ params[:features] || {}
14
+ end
15
+ end
16
+
17
+ module WithStrongParams
18
+ PERMITTED_ATTRIBUTES = [ :symbol, :deployment_percentage ]
19
+
20
+ def feature_params
21
+ params.permit(:feature => PERMITTED_ATTRIBUTES)[:feature]
22
+ end
23
+
24
+ def features_params
25
+ permitted = PERMITTED_ATTRIBUTES
26
+ features = params[:features]
27
+ features.each do |id, attributes|
28
+ features[id] = ActionController::Parameters.new(attributes).permit(*permitted)
29
+ end
30
+ end
31
+ end
32
+
33
+ include defined?(ActionController::Parameters) ? WithStrongParams : WithoutStrongParams
34
+
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,29 @@
1
+ module Arturo
2
+
3
+ # A Null-Object stand-in for a Feature.
4
+ class NoSuchFeature
5
+
6
+ attr_reader :symbol
7
+
8
+ def initialize(symbol)
9
+ raise ArgumentError.new(I18n.t('arturo.no_such_feature.symbol_required')) if symbol.nil?
10
+ @symbol = symbol
11
+ end
12
+
13
+ def enabled_for?(feature_recipient)
14
+ false
15
+ end
16
+
17
+ def name
18
+ I18n.t('arturo.no_such_feature.name', :symbol => symbol)
19
+ end
20
+
21
+ alias_method :to_s, :name
22
+
23
+ def inspect
24
+ "<Arturo::NoSuchFeature #{symbol}>"
25
+ end
26
+
27
+ end
28
+
29
+ end
metadata CHANGED
@@ -1,140 +1,165 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: arturo
3
- version: !ruby/object:Gem::Version
4
- hash: 7
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 4
9
- - 0
10
- version: 1.4.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - James A. Rosen
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-04-30 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-04-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rails
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 7
29
- segments:
30
- - 3
31
- - 0
32
- version: "3.0"
18
+ requirements:
19
+ - - ! '>'
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: '5.0'
33
25
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: mocha
37
26
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>'
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ - - <
34
+ - !ruby/object:Gem::Version
35
+ version: '5.0'
36
+ - !ruby/object:Gem::Dependency
37
+ name: mocha
38
+ requirement: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
47
44
  type: :development
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: rake
51
45
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: rake
54
+ requirement: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
61
60
  type: :development
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
64
- name: redgreen
65
61
  prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
62
+ version_requirements: !ruby/object:Gem::Requirement
67
63
  none: false
68
- requirements:
69
- - - ~>
70
- - !ruby/object:Gem::Version
71
- hash: 11
72
- segments:
73
- - 1
74
- - 2
75
- version: "1.2"
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: minitest-rg
70
+ requirement: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
76
  type: :development
77
- version_requirements: *id004
78
- - !ruby/object:Gem::Dependency
79
- name: sqlite3
80
77
  prerelease: false
81
- requirement: &id005 !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 3
87
- segments:
88
- - 0
89
- version: "0"
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: sqlite3
86
+ requirement: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
90
92
  type: :development
91
- version_requirements: *id005
92
- - !ruby/object:Gem::Dependency
93
- name: factory_girl
94
93
  prerelease: false
95
- requirement: &id006 !ruby/object:Gem::Requirement
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: factory_girl
102
+ requirement: !ruby/object:Gem::Requirement
96
103
  none: false
97
- requirements:
104
+ requirements:
98
105
  - - ~>
99
- - !ruby/object:Gem::Version
100
- hash: 9
101
- segments:
102
- - 1
103
- - 3
104
- version: "1.3"
106
+ - !ruby/object:Gem::Version
107
+ version: '4.2'
105
108
  type: :development
106
- version_requirements: *id006
107
- - !ruby/object:Gem::Dependency
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ~>
114
+ - !ruby/object:Gem::Version
115
+ version: '4.2'
116
+ - !ruby/object:Gem::Dependency
108
117
  name: timecop
118
+ requirement: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ version: '0.3'
124
+ type: :development
109
125
  prerelease: false
110
- requirement: &id007 !ruby/object:Gem::Requirement
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '0.3'
132
+ - !ruby/object:Gem::Dependency
133
+ name: appraisal
134
+ requirement: !ruby/object:Gem::Requirement
111
135
  none: false
112
- requirements:
136
+ requirements:
113
137
  - - ~>
114
- - !ruby/object:Gem::Version
115
- hash: 13
116
- segments:
117
- - 0
118
- - 3
119
- version: "0.3"
138
+ - !ruby/object:Gem::Version
139
+ version: '0.5'
120
140
  type: :development
121
- version_requirements: *id007
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ none: false
144
+ requirements:
145
+ - - ~>
146
+ - !ruby/object:Gem::Version
147
+ version: '0.5'
122
148
  description: Deploy features incrementally to your users
123
149
  email: james.a.rosen@gmail.com
124
150
  executables: []
125
-
126
151
  extensions: []
127
-
128
152
  extra_rdoc_files: []
129
-
130
- files:
153
+ files:
131
154
  - lib/arturo/controller_filters.rb
132
155
  - lib/arturo/engine.rb
133
156
  - lib/arturo/feature_availability.rb
134
157
  - lib/arturo/feature_caching.rb
135
158
  - lib/arturo/feature_factories.rb
136
159
  - lib/arturo/feature_management.rb
160
+ - lib/arturo/feature_params_support.rb
137
161
  - lib/arturo/middleware.rb
162
+ - lib/arturo/no_such_feature.rb
138
163
  - lib/arturo/special_handling.rb
139
164
  - lib/arturo/test_support.rb
140
165
  - lib/arturo.rb
@@ -163,38 +188,30 @@ files:
163
188
  - README.md
164
189
  - HISTORY.md
165
190
  homepage: http://github.com/jamesarosen/arturo
166
- licenses: []
167
-
191
+ licenses:
192
+ - APLv2
168
193
  post_install_message:
169
194
  rdoc_options: []
170
-
171
- require_paths:
195
+ require_paths:
172
196
  - .
173
197
  - lib
174
- required_ruby_version: !ruby/object:Gem::Requirement
198
+ required_ruby_version: !ruby/object:Gem::Requirement
175
199
  none: false
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- hash: 3
180
- segments:
181
- - 0
182
- version: "0"
183
- required_rubygems_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ! '>='
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
205
  none: false
185
- requirements:
186
- - - ">="
187
- - !ruby/object:Gem::Version
188
- hash: 3
189
- segments:
190
- - 0
191
- version: "0"
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
192
210
  requirements: []
193
-
194
211
  rubyforge_project:
195
- rubygems_version: 1.8.15
212
+ rubygems_version: 1.8.25
196
213
  signing_key:
197
214
  specification_version: 2
198
215
  summary: Feature sliders, wrapped up in an engine
199
216
  test_files: []
200
-
217
+ has_rdoc: 'false'