fluidfeatures-rails 0.4.0 → 0.4.4
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/.gitignore +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +2 -13
- data/Guardfile +5 -0
- data/README.md +0 -1
- data/Rakefile +2 -12
- data/fluidfeatures-rails.gemspec +8 -3
- data/lib/fluidfeatures/rails/version.rb +1 -1
- data/lib/fluidfeatures/rails.rb +2 -1
- data/spec/controller_extentions_spec.rb +96 -0
- data/spec/controller_spec.rb +24 -0
- data/spec/initializer_spec.rb +55 -0
- data/spec/routes_spec.rb +24 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/action_controller/base.rb +10 -0
- data/spec/support/active_support.rb +9 -0
- data/spec/support/application_controller.rb +9 -0
- data/spec/support/rails.rb +29 -0
- metadata +79 -19
- data/test/testapp/.gitignore +0 -15
- data/test/testapp/Gemfile +0 -18
- data/test/testapp/Rakefile +0 -8
- data/test/testapp/app/controllers/application_controller.rb +0 -16
- data/test/testapp/app/controllers/home_controller.rb +0 -17
- data/test/testapp/config/application.rb +0 -10
- data/test/testapp/config/boot.rb +0 -6
- data/test/testapp/config/environment.rb +0 -5
- data/test/testapp/config/environments/test.rb +0 -9
- data/test/testapp/config/initializers/secret_token.rb +0 -1
- data/test/testapp/config/routes.rb +0 -3
- data/test/testapp/config.ru +0 -4
- data/test/testapp/script/rails +0 -6
- data/test/testapp/spec/controllers/home_controller_spec.rb +0 -133
- data/test/testapp/spec/spec_helper.rb +0 -8
data/.gitignore
CHANGED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3@fluidfeature-rails --create
|
data/.travis.yml
CHANGED
@@ -1,17 +1,6 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 1.8.7
|
4
|
-
- 1.9.2
|
5
3
|
- 1.9.3
|
6
|
-
- jruby-18mode # JRuby in 1.8 mode
|
7
|
-
- jruby-19mode # JRuby in 1.9 mode
|
8
|
-
- rbx-18mode
|
9
|
-
- rbx-19mode
|
10
|
-
- ruby-head
|
11
|
-
#- jruby-head
|
12
|
-
- ree
|
13
4
|
gemfile:
|
14
|
-
-
|
15
|
-
|
16
|
-
# uncomment this line if your project needs to run something other than `rake`:
|
17
|
-
script: bundle exec rspec spec
|
5
|
+
- Gemfile
|
6
|
+
script: bundle exec rake spec
|
data/Guardfile
ADDED
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,13 +1,3 @@
|
|
1
|
-
require '
|
2
|
-
Bundler::GemHelper.install_tasks
|
1
|
+
require 'rspec/core/rake_task'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
task :test do
|
9
|
-
Dir.chdir("test/testapp") do
|
10
|
-
system("bundle update")
|
11
|
-
exec("bundle exec rspec spec")
|
12
|
-
end
|
13
|
-
end
|
3
|
+
RSpec::Core::RakeTask.new('spec')
|
data/fluidfeatures-rails.gemspec
CHANGED
@@ -12,8 +12,13 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = %q{Ruby on Rails client for the FluidFeatures service.}
|
13
13
|
s.rubyforge_project = s.name
|
14
14
|
s.files = `git ls-files`.split("\n")
|
15
|
-
|
15
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
16
16
|
s.require_paths = ["lib"]
|
17
|
-
|
18
|
-
s.add_dependency "fluidfeatures", "~>0.4.
|
17
|
+
|
18
|
+
s.add_dependency "fluidfeatures", "~>0.4.4" unless ENV["FF_DEV"]
|
19
|
+
|
20
|
+
s.add_development_dependency('rake', '~> 10.0.2')
|
21
|
+
s.add_development_dependency('rspec', '~> 2.12.0')
|
22
|
+
s.add_development_dependency('guard-rspec', '~> 2.2.1')
|
23
|
+
s.add_development_dependency('rb-inotify', '~> 0.8.8')
|
19
24
|
end
|
data/lib/fluidfeatures/rails.rb
CHANGED
@@ -14,7 +14,8 @@ module FluidFeatures
|
|
14
14
|
# It sets up the before and after request hooks
|
15
15
|
#
|
16
16
|
def self.initializer
|
17
|
-
|
17
|
+
#fixes class variable state persisted between calls
|
18
|
+
@enabled = false
|
18
19
|
#
|
19
20
|
# Without these FluidFeatures credentials we cannot talk to
|
20
21
|
# the FluidFeatures service.
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "fluidfeatures/rails"
|
3
|
+
|
4
|
+
describe "FluidFeatures controller extensions" do
|
5
|
+
|
6
|
+
let(:controller) { class DummyController < ActionController::Base; end; DummyController.new }
|
7
|
+
|
8
|
+
let(:transaction) { mock('transaction', user: mock('user')) }
|
9
|
+
|
10
|
+
context "API calls" do
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
FluidFeatures::Rails.stub!(:enabled).and_return(true)
|
14
|
+
controller.ff_transaction = transaction
|
15
|
+
end
|
16
|
+
|
17
|
+
it "#fluidfeature should call #feature_enabled? on transaction" do
|
18
|
+
params = ["Feature", "a", true]
|
19
|
+
controller.ff_transaction.should_receive(:feature_enabled?).with(*params)
|
20
|
+
controller.fluidfeature(*params)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "#fluidfeature should call #feature_enabled? on transaction without version" do
|
24
|
+
controller.ff_transaction.should_receive(:feature_enabled?).with("Feature", nil, true)
|
25
|
+
controller.fluidfeature("Feature", true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#fluidgoal should call #goal_hit on transaction" do
|
29
|
+
controller.ff_transaction.should_receive(:goal_hit).with("Goal", nil)
|
30
|
+
controller.fluidgoal("Goal")
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
context "#fluidfeatures_initialize_user" do
|
36
|
+
|
37
|
+
before(:each) do
|
38
|
+
transaction.user.stub!(:anonymous).and_return(true)
|
39
|
+
transaction.user.stub!(:unique_id).and_return("unique id")
|
40
|
+
controller.stub!(:fluidfeatures_current_user).and_return({})
|
41
|
+
controller.cookies.stub!(:[]).with(:fluidfeatures_anonymous).and_return("anonymous id")
|
42
|
+
controller.stub!(:request).and_return(mock("request", protocol: 'http://', host_with_port: 'example.com', fullpath: '/'))
|
43
|
+
FluidFeatures::Rails.ff_app = mock('app')
|
44
|
+
FluidFeatures::Rails.ff_app.stub!(:user_transaction).and_return(transaction)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should log error if not #fluidfeature_current_user defined" do
|
48
|
+
controller.unstub!(:fluidfeatures_current_user)
|
49
|
+
Rails.logger.should_receive(:error).with("[FF] Method fluidfeatures_current_user is not defined in your ApplicationController")
|
50
|
+
controller.fluidfeatures_initialize_user.should == nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should get user id from cookies if not set" do
|
54
|
+
controller.cookies.should_receive(:[]).with(:fluidfeatures_anonymous).and_return("anonymous id")
|
55
|
+
controller.fluidfeatures_initialize_user
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should update cookie for anonymous user" do
|
59
|
+
controller.cookies.should_receive(:[]=).with(:fluidfeatures_anonymous, "unique id")
|
60
|
+
controller.fluidfeatures_initialize_user
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should delete cookie for existing user" do
|
64
|
+
transaction.user.stub!(:anonymous).and_return(false)
|
65
|
+
controller.cookies.stub!(:has_key?).with(:fluidfeatures_anonymous).and_return(true)
|
66
|
+
controller.cookies.should_receive(:delete).with(:fluidfeatures_anonymous)
|
67
|
+
controller.fluidfeatures_initialize_user
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should call #user_transaction on app with valid params" do
|
71
|
+
FluidFeatures::Rails.ff_app.should_receive(:user_transaction).with("anonymous id", "http://example.com/", nil, false, nil, nil)
|
72
|
+
controller.fluidfeatures_initialize_user
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
it "#fluidfeatures_request_before should initialize user transaction" do
|
78
|
+
transaction = mock("transaction")
|
79
|
+
controller.should_receive(:fluidfeatures_initialize_user).and_return(transaction)
|
80
|
+
controller.fluidfeatures_request_before
|
81
|
+
controller.ff_transaction.should == transaction
|
82
|
+
end
|
83
|
+
|
84
|
+
it "#fluidfeatures_request_after should end transaction" do
|
85
|
+
controller.ff_transaction = mock("transaction")
|
86
|
+
controller.ff_transaction.should_receive(:end_transaction)
|
87
|
+
controller.fluidfeatures_request_after
|
88
|
+
end
|
89
|
+
|
90
|
+
it "#fluidfeatures_retrieve_user_features should return user transaction features" do
|
91
|
+
features = []
|
92
|
+
controller.ff_transaction = mock("transaction")
|
93
|
+
controller.ff_transaction.should_receive(:features).and_return(features)
|
94
|
+
controller.fluidfeatures_retrieve_user_features.should eq(features)
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "fluidfeatures/rails/app/controllers/fluidfeatures_controller"
|
3
|
+
|
4
|
+
describe "FluidFeatures Features controller" do
|
5
|
+
let(:controller) { FluidFeatureAjaxController.new }
|
6
|
+
|
7
|
+
it "should call #fluidfeature and render on index" do
|
8
|
+
controller.update_params(feature_name: "Feature", version_name: "a")
|
9
|
+
controller.should_receive(:fluidfeature).with("Feature", "a")
|
10
|
+
controller.should_receive(:render)
|
11
|
+
controller.index
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "FluidFeatures Goals controller" do
|
16
|
+
let(:controller) { FluidGoalAjaxController.new }
|
17
|
+
|
18
|
+
it "should call #fluidgoal and render on index" do
|
19
|
+
controller.update_params(goal_name: "Goal", goal_version: "default")
|
20
|
+
controller.should_receive(:fluidgoal).with("Goal", "default")
|
21
|
+
controller.should_receive(:render)
|
22
|
+
controller.index
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "fluidfeatures/rails"
|
3
|
+
|
4
|
+
describe "FluidFeatures Rails initialization" do
|
5
|
+
CONFIG_KEYS = %w[FLUIDFEATURES_BASEURI FLUIDFEATURES_SECRET FLUIDFEATURES_APPID]
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
CONFIG_KEYS.each {|k| ENV[k] = k}
|
9
|
+
end
|
10
|
+
|
11
|
+
CONFIG_KEYS.each do |key|
|
12
|
+
it "should require #{key} environment variable" do
|
13
|
+
ENV[key] = nil
|
14
|
+
$stderr.should_receive(:puts).with("!! fluidfeatures-rails requires ENV[\"#{key}\"] (fluidfeatures is disabled)")
|
15
|
+
FluidFeatures::Rails.initializer
|
16
|
+
FluidFeatures::Rails.enabled.should be_false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should start application if Rails defined" do
|
21
|
+
defined?(Rails).should be_true
|
22
|
+
$stderr.should_receive(:puts).with("=> fluidfeatures-rails initializing as app #{ENV["FLUIDFEATURES_APPID"]} with #{ENV["FLUIDFEATURES_BASEURI"]}")
|
23
|
+
FluidFeatures::Rails.initializer
|
24
|
+
FluidFeatures::Rails.enabled.should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "on :action_controller load" do
|
28
|
+
let(:on_load) { ActiveSupport.on_load_block }
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
$stderr.stub!(:puts)
|
32
|
+
FluidFeatures.stub!(:app)
|
33
|
+
ActionController::Base.stub!(:append_before_filter)
|
34
|
+
ActionController::Base.stub!(:append_after_filter)
|
35
|
+
FluidFeatures::Rails.initializer
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should create app with passed credentials" do
|
39
|
+
@app = mock("app")
|
40
|
+
FluidFeatures.should_receive(:app).with(ENV["FLUIDFEATURES_BASEURI"], ENV["FLUIDFEATURES_APPID"], ENV["FLUIDFEATURES_SECRET"]).and_return(@app)
|
41
|
+
instance_eval &on_load
|
42
|
+
FluidFeatures::Rails.ff_app.should == @app
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should add :fluidfeatures_request_before to before filter chain" do
|
46
|
+
ActionController::Base.should_receive(:append_before_filter).with(:fluidfeatures_request_before)
|
47
|
+
instance_eval &on_load
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should add :fluidfeatures_request_after to after filter chain" do
|
51
|
+
ActionController::Base.should_receive(:append_after_filter).with(:fluidfeatures_request_after)
|
52
|
+
instance_eval &on_load
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/routes_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "fluidfeatures/rails/config/routes"
|
3
|
+
|
4
|
+
describe "FluidFeatures routes" do
|
5
|
+
let(:routes) { Rails::Routes.routes_block }
|
6
|
+
|
7
|
+
it "should be added for feature by name" do
|
8
|
+
stub!(:match)
|
9
|
+
should_receive(:match).with("/fluidfeature/:feature_name"=> "fluid_feature_ajax#index")
|
10
|
+
instance_eval &routes
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be added for goal by name" do
|
14
|
+
stub!(:match)
|
15
|
+
should_receive(:match).with("/fluidgoal/:goal_name" => "fluid_goal_ajax#index")
|
16
|
+
instance_eval &routes
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be added for goal by name and version" do
|
20
|
+
stub!(:match)
|
21
|
+
should_receive(:match).with("/fluidgoal/:goal_name/:goal_version" => "fluid_goal_ajax#index")
|
22
|
+
instance_eval &routes
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
5
|
+
config.run_all_when_everything_filtered = true
|
6
|
+
config.filter_run :focus
|
7
|
+
|
8
|
+
# Run specs in random order to surface order dependencies. If you find an
|
9
|
+
# order dependency and want to debug it, you can fix the order by providing
|
10
|
+
# the seed, which is printed after each run.
|
11
|
+
# --seed 1234
|
12
|
+
config.order = 'random'
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Rails
|
2
|
+
class Routes
|
3
|
+
def draw(&block)
|
4
|
+
@@routes_block = block
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.routes_block
|
8
|
+
@@routes_block
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Application
|
13
|
+
def routes
|
14
|
+
Routes.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.initializer(initializer_name, &block)
|
18
|
+
block.call
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.application
|
23
|
+
Application.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.logger
|
27
|
+
@@logger ||= Object.new
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluidfeatures-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluidfeatures
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.4.
|
21
|
+
version: 0.4.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,71 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.4.
|
29
|
+
version: 0.4.4
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 10.0.2
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 10.0.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.12.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.12.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.2.1
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.2.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rb-inotify
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.8.8
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.8.8
|
30
94
|
description: Ruby on Rails client for the FluidFeatures service.
|
31
95
|
email:
|
32
96
|
- phil@fluidfeatures.com
|
@@ -35,8 +99,10 @@ extensions: []
|
|
35
99
|
extra_rdoc_files: []
|
36
100
|
files:
|
37
101
|
- .gitignore
|
102
|
+
- .rvmrc
|
38
103
|
- .travis.yml
|
39
104
|
- Gemfile
|
105
|
+
- Guardfile
|
40
106
|
- LICENSE
|
41
107
|
- README.md
|
42
108
|
- Rakefile
|
@@ -46,21 +112,15 @@ files:
|
|
46
112
|
- lib/fluidfeatures/rails/config/routes.rb
|
47
113
|
- lib/fluidfeatures/rails/version.rb
|
48
114
|
- lib/pre_ruby192/uri.rb
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
-
|
58
|
-
- test/testapp/config/environments/test.rb
|
59
|
-
- test/testapp/config/initializers/secret_token.rb
|
60
|
-
- test/testapp/config/routes.rb
|
61
|
-
- test/testapp/script/rails
|
62
|
-
- test/testapp/spec/controllers/home_controller_spec.rb
|
63
|
-
- test/testapp/spec/spec_helper.rb
|
115
|
+
- spec/controller_extentions_spec.rb
|
116
|
+
- spec/controller_spec.rb
|
117
|
+
- spec/initializer_spec.rb
|
118
|
+
- spec/routes_spec.rb
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
- spec/support/action_controller/base.rb
|
121
|
+
- spec/support/active_support.rb
|
122
|
+
- spec/support/application_controller.rb
|
123
|
+
- spec/support/rails.rb
|
64
124
|
homepage: https://github.com/FluidFeatures/fluidfeatures-rails
|
65
125
|
licenses: []
|
66
126
|
post_install_message:
|
data/test/testapp/.gitignore
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
2
|
-
#
|
3
|
-
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
-
# or operating system, you probably want to add a global ignore instead:
|
5
|
-
# git config --global core.excludesfile ~/.gitignore_global
|
6
|
-
|
7
|
-
# Ignore bundler config
|
8
|
-
/.bundle
|
9
|
-
|
10
|
-
# Ignore the default SQLite database.
|
11
|
-
/db/*.sqlite3
|
12
|
-
|
13
|
-
# Ignore all logfiles and tempfiles.
|
14
|
-
/log/*.log
|
15
|
-
/tmp
|
data/test/testapp/Gemfile
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
gem 'rake'
|
4
|
-
gem 'railties'
|
5
|
-
gem 'tzinfo'
|
6
|
-
if ENV["FF_DEV"] and File.directory? '../../../fluidfeatures-ruby'
|
7
|
-
# (used this for development of the fluidfeature gems)
|
8
|
-
gem 'fluidfeatures', :path => '../../../fluidfeatures-ruby'
|
9
|
-
end
|
10
|
-
gem 'fluidfeatures-rails', :path => '../..'
|
11
|
-
gem "rspec-rails", "~> 2.0"
|
12
|
-
gem "fakeweb"
|
13
|
-
gem "json_pure"
|
14
|
-
gem "json_spec"
|
15
|
-
|
16
|
-
# JRuby Rails requires this for active_support/message_encryptor.rb
|
17
|
-
gem 'jruby-openssl', :platforms => :jruby
|
18
|
-
|
data/test/testapp/Rakefile
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
class ApplicationController < ActionController::Base
|
2
|
-
|
3
|
-
# simple authentication. user passes their id
|
4
|
-
def authenticate_user
|
5
|
-
params[:user_id]
|
6
|
-
end
|
7
|
-
|
8
|
-
def current_user_id
|
9
|
-
@current_user_id ||= authenticate_user
|
10
|
-
end
|
11
|
-
|
12
|
-
def fluidfeature_current_user(verbose=false)
|
13
|
-
{ :id => current_user_id }
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class HomeController < ApplicationController
|
2
|
-
def index
|
3
|
-
enabled_features = []
|
4
|
-
# apples is enabled by default
|
5
|
-
if fluidfeature("apples", { :enabled => true })
|
6
|
-
enabled_features << "apples"
|
7
|
-
end
|
8
|
-
%w{oranges lemons}.each do |feature_name|
|
9
|
-
if fluidfeature(feature_name)
|
10
|
-
enabled_features << feature_name
|
11
|
-
end
|
12
|
-
end
|
13
|
-
# render a simple page that is a list of features enabled
|
14
|
-
# separated by one space character
|
15
|
-
render :inline => enabled_features.join(" ")
|
16
|
-
end
|
17
|
-
end
|
data/test/testapp/config/boot.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
Testapp::Application.configure do
|
2
|
-
config.cache_classes = true
|
3
|
-
config.whiny_nils = true
|
4
|
-
config.consider_all_requests_local = true
|
5
|
-
config.action_controller.perform_caching = false
|
6
|
-
config.action_dispatch.show_exceptions = false
|
7
|
-
# Print deprecation notices to the stderr
|
8
|
-
config.active_support.deprecation = :stderr
|
9
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
Testapp::Application.config.secret_token = "some secret phrase of at least 30 characters"
|
data/test/testapp/config.ru
DELETED
data/test/testapp/script/rails
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
-
|
4
|
-
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
-
require File.expand_path('../../config/boot', __FILE__)
|
6
|
-
require 'rails/commands'
|
@@ -1,133 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fakeweb'
|
3
|
-
require 'json'
|
4
|
-
require 'json_spec'
|
5
|
-
|
6
|
-
describe HomeController do
|
7
|
-
|
8
|
-
describe '#index' do
|
9
|
-
|
10
|
-
before do
|
11
|
-
FakeWeb.register_uri(
|
12
|
-
:get,
|
13
|
-
File.join(ENV["FLUIDFEATURES_BASEURI"], "/app/123/user/1/features?anonymous=?false"),
|
14
|
-
:body => JSON.generate({}) # no features registered yet
|
15
|
-
)
|
16
|
-
FakeWeb.register_uri(
|
17
|
-
:get,
|
18
|
-
File.join(ENV["FLUIDFEATURES_BASEURI"], "/app/123/user/2/features?anonymous=false"),
|
19
|
-
:body => JSON.generate({
|
20
|
-
:apples => false,
|
21
|
-
:oranges => true,
|
22
|
-
:lemons => true
|
23
|
-
})
|
24
|
-
)
|
25
|
-
[1,2].each do |user_id|
|
26
|
-
FakeWeb.register_uri(
|
27
|
-
:post,
|
28
|
-
File.join(ENV["FLUIDFEATURES_BASEURI"], "/app/123/user/#{user_id.to_s}/features/hit"),
|
29
|
-
:body => ""
|
30
|
-
)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should return only the default enabled features for user 1' do
|
35
|
-
get :index, { :user_id => 1 }
|
36
|
-
response.response_code.should == 200
|
37
|
-
response.body.should == "apples"
|
38
|
-
|
39
|
-
# Check the call to features hit
|
40
|
-
features_hit_request = FakeWeb.last_request
|
41
|
-
JsonSpec.exclude_keys("duration", "ff_latency")
|
42
|
-
features_hit_request.body.should be_json_eql(%({
|
43
|
-
"user": {
|
44
|
-
"id": "1"
|
45
|
-
},
|
46
|
-
"hits": {
|
47
|
-
"feature": {
|
48
|
-
"apples": {
|
49
|
-
"default": {}
|
50
|
-
}
|
51
|
-
},
|
52
|
-
"goal": {
|
53
|
-
}
|
54
|
-
},
|
55
|
-
"features": {
|
56
|
-
"unknown": {
|
57
|
-
// features that we have not seen before
|
58
|
-
"apples": {
|
59
|
-
"versions": {
|
60
|
-
"default": {
|
61
|
-
"enabled": true
|
62
|
-
}
|
63
|
-
}
|
64
|
-
},
|
65
|
-
"lemons": {
|
66
|
-
"versions": {
|
67
|
-
"default": {
|
68
|
-
"enabled": false
|
69
|
-
}
|
70
|
-
}
|
71
|
-
},
|
72
|
-
"oranges": {
|
73
|
-
"versions": {
|
74
|
-
"default": {
|
75
|
-
"enabled": false
|
76
|
-
}
|
77
|
-
}
|
78
|
-
}
|
79
|
-
}
|
80
|
-
},
|
81
|
-
"stats": {
|
82
|
-
"ff_latency": 1,
|
83
|
-
"request": {
|
84
|
-
// duration ignored
|
85
|
-
}
|
86
|
-
},
|
87
|
-
"url": "http://test.host/?user_id=1"
|
88
|
-
}))
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should not return the feature for user 2' do
|
92
|
-
get :index, { :user_id => 2 }
|
93
|
-
response.response_code.should == 200
|
94
|
-
response.body.should == "oranges lemons"
|
95
|
-
|
96
|
-
# Check the call to features hit
|
97
|
-
features_hit_request = FakeWeb.last_request
|
98
|
-
JsonSpec.exclude_keys("duration", "ff_latency")
|
99
|
-
features_hit_request.body.should be_json_eql(%({
|
100
|
-
"user": {
|
101
|
-
"id": "2"
|
102
|
-
},
|
103
|
-
"hits": {
|
104
|
-
"feature": {
|
105
|
-
"oranges": {
|
106
|
-
"default": {}
|
107
|
-
},
|
108
|
-
"lemons": {
|
109
|
-
"default": {}
|
110
|
-
}
|
111
|
-
},
|
112
|
-
"goal": {
|
113
|
-
}
|
114
|
-
},
|
115
|
-
"features": {
|
116
|
-
"unknown": {
|
117
|
-
// no unknown features
|
118
|
-
}
|
119
|
-
},
|
120
|
-
"stats": {
|
121
|
-
"ff_latency": 1,
|
122
|
-
"request": {
|
123
|
-
// duration ignored
|
124
|
-
}
|
125
|
-
},
|
126
|
-
"url": "http://test.host/?user_id=2"
|
127
|
-
}))
|
128
|
-
end
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|
@@ -1,8 +0,0 @@
|
|
1
|
-
ENV["RAILS_ENV"] ||= 'test'
|
2
|
-
|
3
|
-
ENV["FLUIDFEATURES_BASEURI"] ||= "http://www.fluidfeatures.com/service"
|
4
|
-
ENV["FLUIDFEATURES_APPID"] ||= "123"
|
5
|
-
ENV["FLUIDFEATURES_SECRET"] ||= "ssssshhhhhh"
|
6
|
-
|
7
|
-
require File.expand_path("../../config/environment", __FILE__)
|
8
|
-
require 'rspec/rails'
|