cadenero 0.0.2.b3 → 0.0.2.b4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +12 -9
  3. data/app/controllers/cadenero/v1/account/sessions_controller.rb +1 -1
  4. data/app/controllers/cadenero/v1/account/users_controller.rb +8 -9
  5. data/app/controllers/cadenero/v1/accounts_controller.rb +2 -9
  6. data/app/extenders/controllers/application_controller_decorator.rb +1 -1
  7. data/app/extenders/middleware/robustness.rb +0 -2
  8. data/app/models/cadenero/user.rb +2 -1
  9. data/app/models/cadenero/v1/account.rb +2 -0
  10. data/config/routes.rb +3 -2
  11. data/lib/cadenero/testing_support/authentication_helpers.rb +93 -0
  12. data/lib/cadenero/version.rb +1 -1
  13. data/spec/dummy/config/application.rb +8 -7
  14. data/spec/dummy/config/boot.rb +7 -3
  15. data/spec/dummy/config/environments/development.rb +9 -2
  16. data/spec/dummy/config/environments/production.rb +1 -2
  17. data/spec/dummy/config/environments/test.rb +7 -2
  18. data/spec/dummy/config/initializers/secret_token.rb +13 -2
  19. data/spec/dummy/config/initializers/wrap_parameters.rb +13 -0
  20. data/spec/dummy/log/development.log +5 -0
  21. data/spec/dummy/log/test.log +16262 -0
  22. data/spec/features/accounts/sign_up_spec.rb +10 -23
  23. data/spec/features/users/sign_in_spec.rb +16 -50
  24. data/spec/features/users/sign_up_spec.rb +22 -17
  25. data/spec/support/factories/user_factory.rb +0 -1
  26. metadata +18 -39
  27. data/config/initializers/strong_parameters.rb +0 -1
  28. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  29. data/spec/dummy/config/initializers/inflections.rb +0 -15
  30. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  31. data/spec/dummy/config/initializers/session_store.rb +0 -8
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NThlODkyY2YyMmNlYTBhYjc0ZjVmNTE1YmI0Mzg3NjQxMTI3ZDE3Ng==
4
+ YWFkM2QwNGFkNGJjNGVlOGM0ZmVkNDIzZDI2NTdlM2IwYTgxZjMxMQ==
5
5
  data.tar.gz: !binary |-
6
- M2UzOWZjMDA5M2U3MGRjNTdjZWZiNzIwMjQ2NTEzOGI1ZDc4NGNiZg==
6
+ NzIyNDk3ZDdiMjE3ZWVmOTBmOWY0MTUxYTRhMDU1ZjEyYzE2MzViNg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ODYwNTExMGVkOTU5MzI2YWZmODI5YjgyY2E0OTQ3ODgzM2ViOTY5ZjVhNGMw
10
- YWI0MGVjY2MzOGM3OGUxOTE2ODRmMDk0Yjg4ZjM4NWYzMWFiYTU0MmNiMDYz
11
- ZDQ3Mjg1ZDkxZDNlMWZmOWU4YTNlMmEzYTA4MWE3ZjMxYTY4MTg=
9
+ ODUwOGQ0OGFlNmYwZjc1MzE4YjAxZTMwZGZhZDJlZTVkZmY3NmIxZGYxMWFm
10
+ OGFjYzkwYzI2ZTYyMzlkZjdkM2JjOGI4Y2I1Njg2ZDVkY2NkMDgyNTVhNTY1
11
+ ZmZiYTcyMWU1MTE4NGQ0MWUzMWVhYTg5YTc0MzdiODVmYjlkODI=
12
12
  data.tar.gz: !binary |-
13
- ZGY1MWUyODM2NWU2OTA3MmZkYmY2YmEzZjU1MmYzODE0YWJjMWQzMmFkYTA3
14
- YTU4Y2QyZGMyOTcxMWM5NjAyY2Q2MjZmOWM2Zjk4NzAzOWEwNjc4NzE2ZmU3
15
- NDZkZjkwNmFhYTlhZTk2MmI0Y2E0OTIwMjkwNDE1YmNiNDZkNjI=
13
+ MjU0OWZjYTBhMWIxZjc5NmRjNDgwOTQ4MzU2M2ZjNWY3ZTM4NDk0Zjc4Yzlk
14
+ MWQ4MjllZWM0OTA3M2U3MmRlZDYwNDlkNTA2ZWY5NGJkNmQ3YmVjMzJkMjNl
15
+ YTRmNjI1MWRiNGYwZTM1NDRhMjdiNDBiYzA2NTI1NjhmZWUwMzg=
data/README.md CHANGED
@@ -20,15 +20,17 @@ Authentication Engine for Rails.API multitenant RESTful APIs based on Warden. It
20
20
 
21
21
  ### Installing **Cadenero**
22
22
 
23
- Generate first your Rails.API app as usual using:
23
+ Rails 3.2.13 is the master version used now by **Cadenero**, if you want to use Rails 4 goodness please use the branch "rails4"
24
+
25
+ Generate first your Rails app as usual using:
24
26
 
25
27
  ```
26
- $ rails-api new your_app --skip-test-unit
28
+ $ rails _3.2.13_ new your_app --skip-test-unit
27
29
  ```
28
30
 
29
31
  In the `Gemfile` add the following lines:
30
32
  ```ruby
31
- gem 'cadenero', github: 'AgilTec/cadenero', branch: 'rails4'
33
+ gem 'cadenero', '~> 0.0.2.b4'
32
34
  gem 'pg'
33
35
  ```
34
36
 
@@ -97,12 +99,13 @@ Have fun!
97
99
  **Cadenero** creates the following versioned routes for exposing the authentication RESTful API
98
100
 
99
101
  ```
100
- v1_root /v1(.:format) cadenero/v1/account/dashboard#index {:default=>:json}
101
- v1_sessions POST /v1/sessions(.:format) cadenero/v1/account/sessions#create {:default=>:json}
102
- DELETE /v1/sessions(.:format) cadenero/v1/account/sessions#delete {:default=>:json}
103
- v1_users POST /v1/users(.:format) cadenero/v1/account/users#create {:default=>:json}
104
- v1_accounts POST /v1/accounts(.:format) cadenero/v1/accounts#create {:default=>:json}
105
- root / cadenero/v1/account/dashboard#index {:default=>:json}
102
+ v1_root /v1(.:format) cadenero/v1/account/dashboard#index {:default=>:json}
103
+ v1_sessions POST /v1/sessions(.:format) cadenero/v1/account/sessions#create {:default=>:json}
104
+ DELETE /v1/sessions(.:format) cadenero/v1/account/sessions#delete {:default=>:json}
105
+ v1_users POST /v1/users(.:format) cadenero/v1/account/users#create {:default=>:json}
106
+ v1 GET /v1/users/:id(.:format) cadenero/v1/account/users#show {:default=>:json}
107
+ v1_accounts POST /v1/accounts(.:format) cadenero/v1/accounts#create {:default=>:json}
108
+ root / cadenero/v1/account/dashboard#index {:default=>:json}
106
109
  ```
107
110
 
108
111
  You can check them running:
@@ -7,7 +7,7 @@ module Cadenero::V1
7
7
  def create
8
8
  if env['warden'].authenticate(:password, :scope => :user)
9
9
  #return the user JSON on success
10
- render json: current_user, serializer: Cadenero::UserSerializer, status: :created
10
+ render json: current_user, status: :created
11
11
  else
12
12
  #return error mesage in a JSON on error
13
13
  render json: {errors: {user:["Invalid email or password"]}}, status: :unprocessable_entity
@@ -19,23 +19,22 @@ module Cadenero
19
19
  # fulfilled and resulted in a new resource being created.
20
20
  def create
21
21
  account = Cadenero::V1::Account.where(subdomain: request.subdomain).first
22
- @user = account.users.create(user_params)
22
+ @user = account.users.create(params[:user])
23
23
  force_authentication!(@user)
24
- render json: @user, serializer: UserSerializer, status: :created
24
+ render json: @user, status: :created
25
25
  end
26
+
26
27
  # Send as JSON the user that match the params[:user]
27
28
  def show
28
- @user = account.users.where(user_params).first
29
+ @user = current_account.users.where(id: params[:id]).first
29
30
  render json: @user, status: :ok
30
31
  end
31
32
 
32
- private
33
-
34
- # Permited parameters using strong parameters format
35
- def user_params
36
- params.require(:user).permit(:email, :password, :password_confirmation)
33
+ # Send as JSON the users for the current_account
34
+ def index
35
+ @users = current_account.users
36
+ render json: @users, status: :ok
37
37
  end
38
-
39
38
  end
40
39
  end
41
40
  end
@@ -20,12 +20,12 @@ module Cadenero
20
20
  # @return render JSON of [Cadenero::V1::Account] created and the status 201 Created: The request has been
21
21
  # fulfilled and resulted in a new resource being created.
22
22
  def create
23
- @account = Cadenero::V1::Account.create_with_owner(account_params)
23
+ @account = Cadenero::V1::Account.create_with_owner(params[:account])
24
24
  if @account.valid?
25
25
  @account.create_schema
26
26
  @account.ensure_authentication_token!
27
27
  force_authentication!(@account.owner)
28
- render json: @account, serializer: AccountSerializer, status: :created
28
+ render json: @account, status: :created
29
29
  else
30
30
  @data = {
31
31
  errors: @account.errors
@@ -33,13 +33,6 @@ module Cadenero
33
33
  render json: @data, status: :unprocessable_entity
34
34
  end
35
35
  end
36
-
37
- private
38
-
39
- # Permited parameters using strong parameters format
40
- def account_params
41
- params.require(:account).permit(:name, :subdomain, owner_attributes: [:email, :password, :password_confirmation])
42
- end
43
36
  end
44
37
  end
45
38
  end
@@ -30,7 +30,7 @@
30
30
 
31
31
  # Check to see if there is an authenticated user
32
32
  def user_signed_in?
33
- env['warden'].authenticated?(:user) unless env['warden'].nil?
33
+ env['warden'].authenticated?(:user)
34
34
  end
35
35
 
36
36
  # it the user is not authenticated returns a 422 and an informative error with the link for sign
@@ -10,8 +10,6 @@ class Robustness
10
10
  @app.call(env)
11
11
  rescue Apartment::SchemaNotFound => ex
12
12
  [422, { 'Content-Type' => 'application/json' }, [ {errors: {subdomain:["Invalid subdomain"]}}.to_json ] ] # suppose the message can be safely used
13
- rescue ArgumentError => ex
14
- [422, { 'Content-Type' => 'application/json' }, [ {errors: {subdomain:["Invalid subdomain"]}}.to_json ] ] # suppose the message can be safely used
15
13
  rescue SecurityError => ex
16
14
  [403, { 'Content-Type' => 'application/json' }, [ ex.message ] ]
17
15
  ensure
@@ -1,6 +1,7 @@
1
1
  module Cadenero
2
2
  # Defines a user of one or more accounts for the multitenant Rails App
3
3
  class User < ActiveRecord::Base
4
+ attr_accessible :email, :password, :password_confirmation
4
5
  has_secure_password
5
6
  has_many :accounts, class_name: "Cadenero::V1::Account", foreign_key: "owner_id"
6
7
  has_many :members, class_name: "Cadenero::Member"
@@ -8,7 +9,7 @@ module Cadenero
8
9
 
9
10
  # Obtain the authentication_token from the account to be use for the User
10
11
  def auth_token
11
- accounts[0].authentication_token if accounts[0]
12
+ accounts.map{|acc| acc.authentication_token}
12
13
  end
13
14
 
14
15
  end
@@ -6,8 +6,10 @@ module Cadenero::V1
6
6
  has_many :users, :through => :members, :class_name => "Cadenero::User"
7
7
 
8
8
  accepts_nested_attributes_for :owner
9
+ attr_accessible :name, :subdomain, :owner_attributes, :owner
9
10
  validates :subdomain, :presence => true, :uniqueness => true
10
11
  validates :owner, :presence => true
12
+ after_create :ensure_authentication_token!
11
13
 
12
14
  # Creates an account and assign the provided [Cadenero::User] as owner to the account
13
15
  # @param [Hash] params list
data/config/routes.rb CHANGED
@@ -8,10 +8,11 @@ Cadenero::Engine.routes.draw do
8
8
  post '/sessions', :to => "sessions#create", default: :json
9
9
  delete '/sessions', :to => "sessions#delete", default: :json
10
10
  post '/users', :to => "users#create", default: :json
11
- get '/users', :to => "users#show", default: :json
11
+ get '/users', :to => "users#index", default: :json
12
+ get '/users/:id', :to => "users#show", as: :user, default: :json
12
13
  end
13
14
  end
14
- post '/accounts', :to => "accounts#create", :as => :accounts, default: :json
15
+ post '/accounts', :to => "accounts#create", as: :accounts, default: :json
15
16
 
16
17
  end
17
18
  root :to => "v1/account/dashboard#index", default: :json
@@ -0,0 +1,93 @@
1
+ module Cadenero
2
+ # Helper Methods for testing
3
+ module TestingSupport
4
+ # RSpec Helper for subdomains
5
+ module AuthenticationHelpers
6
+ # creates a dummy user for testing
7
+ # @return a dummy user JSON parameters for sign up
8
+ def create_account_user
9
+ @user ||= { email: "user@example.com", password: "password", password_confirmation: "password" }
10
+ end
11
+ # @param user [Cadenero::User]
12
+ # @return [JSON] a dummy user JSON parameters for sign in
13
+ def account_user(user)
14
+ @user = { email: user.email, password: "password" }
15
+ end
16
+
17
+ # find an account in the Database using the email of the owner
18
+ # @return [Cadenero::V1::Account] the corresponding account that was founded
19
+ def find_account_by_email
20
+ @account = Cadenero::V1::Account.where(name: create_account_user[:email]).first
21
+ end
22
+
23
+ # find an account in the Database using the name of the owner
24
+ # @return [Cadenero::V1::Account] the corresponding account that was founded
25
+ def find_account_by_name
26
+ @account = Cadenero::V1::Account.where(name: @visitor[:name]).first
27
+ end
28
+
29
+ # sing in a user sending a POST
30
+ # @param url [String] the URL to be POSTed
31
+ # @param user [Cadenero::User] to be POSTed
32
+ # @return [Cadenero::V1::Account] the corresponding account that was founded
33
+ def sign_in_user(url, user)
34
+ post "#{url}", format: :json, user: user
35
+ find_account_by_email
36
+ end
37
+
38
+ # Expect that the JSON response from the server corresponds to the provided msg
39
+ # @param msg [JSON] the errors: as JSON
40
+ def expected_json_errors(msg)
41
+ expect(last_response.body).to eql(msg)
42
+ expect(last_response.status).to eq 422
43
+ end
44
+
45
+ # Expect that the JSON response will be a default error message when the user has not signed in yet
46
+ # the errors_redirect_ro_sign_in is defined if was not previously defined is a Spec
47
+ def check_error_for_not_signed_in_yet
48
+ errors_redirect_ro_sign_in ||= {errors: %Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} to /v1/sessions}, links: "/v1/sessions"}.to_json
49
+ get cadenero.v1_root_url(:subdomain => account.subdomain)
50
+ expected_json_errors(errors_redirect_ro_sign_in)
51
+ end
52
+
53
+ # Sign up a dummy user for testing
54
+ # @return [Cadenero::V1::Account] the corresponding account that was founded
55
+ def sign_up_user(url)
56
+ post "#{url}/v1/users", format: :json, user: create_account_user
57
+ find_account_by_email
58
+ end
59
+
60
+ # Expect that a owner sign in successfuly to an account
61
+ # @param account [Cadenero::V1::Account]
62
+ # @return email [String] for the last response user
63
+ def successful_sign_in_owner(account)
64
+ sign_in_user sessions_url, account_user(account.owner)
65
+ expect(last_response.status).to eq 201
66
+ expect(json_last_response_body["user"]["account_ids"]).to eq [account.id]
67
+ expect(json_last_response_body).to have_content "auth_token"
68
+ expect(json_last_response_body["user"]["auth_token"]).to eq [account.authentication_token]
69
+ return json_last_response_body["user"]["email"]
70
+ end
71
+
72
+ # creates a dummy account for testing
73
+ # @return [JSON] a dummy account JSON parameters
74
+ def create_account
75
+ @visitor ||= { name: "Testy", subdomain: "test", owner_attributes:
76
+ {email: "testy@example.com", password: "changeme", password_confirmation: "changeme"} }
77
+ end
78
+
79
+ # Sign up a dummy account for testing
80
+ # @return [Cadenero::V1::Account] the corresponding account that was founded
81
+ def sign_up_account
82
+ post "/v1/accounts", format: :json, account: create_account
83
+ find_account_by_name
84
+ end
85
+
86
+ # Parse the last_response.body as JSON
87
+ # @return [JSON] for the last_response.body
88
+ def json_last_response_body
89
+ JSON.parse(last_response.body)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,3 +1,3 @@
1
1
  module Cadenero
2
- VERSION = "0.0.2.b3" # Current VERSION of Cadenero
2
+ VERSION = "0.0.2.b4" # Current VERSION of Cadenero
3
3
  end
@@ -2,12 +2,8 @@ require File.expand_path('../boot', __FILE__)
2
2
 
3
3
  require 'rails/all'
4
4
 
5
- if defined?(Bundler)
6
- # If you precompile assets before deploying to production, use this line
7
- Bundler.require(*Rails.groups(:assets => %w(development test)))
8
- # If you want your assets lazily compiled in production, use this line
9
- # Bundler.require(:default, :assets, Rails.env)
10
- end
5
+ Bundler.require(*Rails.groups)
6
+ require "cadenero"
11
7
 
12
8
  module Dummy
13
9
  class Application < Rails::Application
@@ -51,12 +47,17 @@ module Dummy
51
47
  # This will create an empty whitelist of attributes available for mass-assignment for all models
52
48
  # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
53
49
  # parameters by using an attr_accessible or attr_protected declaration.
54
- #config.active_record.whitelist_attributes = true
50
+ config.active_record.whitelist_attributes = true
55
51
 
56
52
  # Enable the asset pipeline
57
53
  config.assets.enabled = true
58
54
 
59
55
  # Version of your assets, change this if you want to expire all your assets
60
56
  config.assets.version = '1.0'
57
+
58
+ config.generators do |g|
59
+ g.test_framework :rspec
60
+ end
61
61
  end
62
62
  end
63
+
@@ -1,6 +1,10 @@
1
1
  require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
2
3
 
3
- # Set up gems listed in the Gemfile.
4
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
5
9
 
6
- require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -4,9 +4,13 @@ Dummy::Application.configure do
4
4
  # In the development environment your application's code is reloaded on
5
5
  # every request. This slows down response time but is perfect for development
6
6
  # since you don't have to restart the web server when you make code changes.
7
- #config.ember.variant = :development
7
+ config.cache_classes = false
8
+
9
+ config.ember.variant = :development
10
+
11
+ # Log error messages when you accidentally call methods on nil.
12
+ config.whiny_nils = true
8
13
 
9
- config.eager_load = false
10
14
  # Show full error reports and disable caching
11
15
  config.consider_all_requests_local = true
12
16
  config.action_controller.perform_caching = false
@@ -20,6 +24,9 @@ Dummy::Application.configure do
20
24
  # Only use best-standards-support built into browsers
21
25
  config.action_dispatch.best_standards_support = :builtin
22
26
 
27
+ # Raise exception on mass assignment protection for Active Record models
28
+ config.active_record.mass_assignment_sanitizer = :strict
29
+
23
30
  # Log the query plan for queries taking more than this (works
24
31
  # with SQLite, MySQL, and PostgreSQL)
25
32
  config.active_record.auto_explain_threshold_in_seconds = 0.5
@@ -4,8 +4,7 @@ Dummy::Application.configure do
4
4
  # Code is not reloaded between requests
5
5
  config.cache_classes = true
6
6
 
7
- config.eager_load = true
8
- #config.ember.variant = :production
7
+ config.ember.variant = :production
9
8
 
10
9
  # Full error reports are disabled and caching is turned on
11
10
  config.consider_all_requests_local = false
@@ -7,13 +7,15 @@ Dummy::Application.configure do
7
7
  # and recreated between test runs. Don't rely on the data there!
8
8
  config.cache_classes = true
9
9
 
10
- config.eager_load = false
11
- #config.ember.variant = :development
10
+ config.ember.variant = :development
12
11
 
13
12
  # Configure static asset server for tests with Cache-Control for performance
14
13
  config.serve_static_assets = true
15
14
  config.static_cache_control = "public, max-age=3600"
16
15
 
16
+ # Log error messages when you accidentally call methods on nil
17
+ config.whiny_nils = true
18
+
17
19
  # Show full error reports and disable caching
18
20
  config.consider_all_requests_local = true
19
21
  config.action_controller.perform_caching = false
@@ -29,6 +31,9 @@ Dummy::Application.configure do
29
31
  # ActionMailer::Base.deliveries array.
30
32
  # config.action_mailer.delivery_method = :test
31
33
 
34
+ # Raise exception on mass assignment protection for Active Record models
35
+ config.active_record.mass_assignment_sanitizer = :strict
36
+
32
37
  # Print deprecation notices to the stderr
33
38
  config.active_support.deprecation = :stderr
34
39
  end
@@ -2,7 +2,18 @@
2
2
 
3
3
  # Your secret key for verifying the integrity of signed cookies.
4
4
  # If you change this key, all old signed cookies will become invalid!
5
+
5
6
  # Make sure the secret is at least 30 characters and all random,
6
7
  # no regular words or you'll be exposed to dictionary attacks.
7
- Dummy::Application.config.secret_token = '2badc583f5ee641098da66a9330ca138b22302e4c6a8b0e67ca37ef180bd836406f056cf35bdf2c1214cd8835c55969e74fe8f589dde6b093bac703a32960807'
8
- Dummy::Application.config.secret_key_base = 'df98291699a229624c0907ad6236b289bc51369d1d1f2729b2c66cdad46b60cb2cb64b93d47b0d2fd9aa4f833bc8d4c98eaaed223f9d4b9ed684677f655611e8'
8
+ # You can use `rake secret` to generate a secure secret key.
9
+
10
+ # Make sure your secret_key_base is kept private
11
+ # if you're sharing your code publicly.
12
+
13
+ # Although this is not needed for an api-only application, rails4
14
+ # requires secret_key_base or secret_toke to be defined, otherwise an
15
+ # error is raised.
16
+ # Using secret_token for rails3 compatibility. Change to secret_key_base
17
+ # to avoid deprecation warning.
18
+ # Can be safely removed in a rails3 api-only application.
19
+ Dummy::Application.config.secret_token = 'df98291699a229624c0907ad6236b289bc51369d1d1f2729b2c66cdad46b60cb2cb64b93d47b0d2fd9aa4f833bc8d4c98eaaed223f9d4b9ed684677f655611e8'
@@ -0,0 +1,13 @@
1
+ # Be sure to restart your server when you modify this file.
2
+ #
3
+ # This file contains settings for ActionController::ParamsWrapper
4
+
5
+ # Enable parameter wrapping for JSON.
6
+ # ActiveSupport.on_load(:action_controller) do
7
+ # wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
8
+ # end
9
+
10
+ # To enable root element in JSON for ActiveRecord objects.
11
+ # ActiveSupport.on_load(:active_record) do
12
+ # self.include_root_in_json = true
13
+ # end
@@ -357,3 +357,8 @@ Apartment::SchemaNotFound (One of the following schema(s) is invalid: ):
357
357
  Rendered /Users/manuelevidaurrea/Documents/work/agiltec/workspace/ruby/rails/cadenero/vendor/bundle/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (16.8ms)
358
358
  Rendered /Users/manuelevidaurrea/Documents/work/agiltec/workspace/ruby/rails/cadenero/vendor/bundle/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (46.0ms)
359
359
  Connecting to database specified by database.yml
360
+ Connecting to database specified by database.yml
361
+ Connecting to database specified by database.yml
362
+ Connecting to database specified by database.yml
363
+ Connecting to database specified by database.yml
364
+ Connecting to database specified by database.yml