cadenero 0.0.1 → 0.0.2.a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +3 -0
  3. data/app/models/cadenero/v1/account.rb +1 -1
  4. data/db/migrate/20130612061604_create_cadenero_v1_accounts.rb +2 -0
  5. data/db/seeds.rb +2 -0
  6. data/lib/cadenero/version.rb +2 -2
  7. data/lib/generators/cadenero/install/templates/initializer.rb +16 -0
  8. data/lib/generators/cadenero/install_generator.rb +143 -0
  9. data/spec/controllers/cadenero/v1/accounts_controller_spec.rb +25 -0
  10. data/spec/dummy/README.rdoc +261 -0
  11. data/spec/dummy/Rakefile +7 -0
  12. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  13. data/spec/dummy/config/application.rb +63 -0
  14. data/spec/dummy/config/boot.rb +10 -0
  15. data/spec/dummy/config/database.yml +14 -0
  16. data/spec/dummy/config/environment.rb +5 -0
  17. data/spec/dummy/config/environments/development.rb +39 -0
  18. data/spec/dummy/config/environments/production.rb +69 -0
  19. data/spec/dummy/config/environments/test.rb +39 -0
  20. data/spec/dummy/config/initializers/cadenero.rb +0 -0
  21. data/spec/dummy/config/initializers/secret_token.rb +19 -0
  22. data/spec/dummy/config/initializers/wrap_parameters.rb +13 -0
  23. data/spec/dummy/config/locales/en.yml +5 -0
  24. data/spec/dummy/config/routes.rb +3 -0
  25. data/spec/dummy/config.ru +4 -0
  26. data/spec/dummy/db/schema.rb +45 -0
  27. data/spec/dummy/log/development.log +94 -0
  28. data/spec/dummy/log/test.log +8934 -0
  29. data/spec/dummy/public/404.html +26 -0
  30. data/spec/dummy/public/422.html +26 -0
  31. data/spec/dummy/public/500.html +25 -0
  32. data/spec/dummy/public/favicon.ico +0 -0
  33. data/spec/dummy/script/rails +6 -0
  34. data/spec/dummy/spec/spec_helper.rb +38 -0
  35. data/spec/dummy/tmp/ember-rails/ember-data.js +8886 -0
  36. data/spec/dummy/tmp/ember-rails/ember.js +29953 -0
  37. data/spec/features/accounts/sign_up_spec.rb +32 -0
  38. data/spec/features/cadenero/account_spec.rb +24 -0
  39. data/spec/features/users/sign_in_spec.rb +63 -0
  40. data/spec/features/users/sign_up_spec.rb +26 -0
  41. data/spec/generators/install_generator_spec.rb +56 -0
  42. data/spec/models/cadenero/account_spec.rb +7 -0
  43. data/spec/models/cadenero/member_spec.rb +7 -0
  44. data/spec/models/cadenero/user_spec.rb +7 -0
  45. data/spec/spec_helper.rb +77 -0
  46. data/spec/support/factories/account_factory.rb +15 -0
  47. data/spec/support/factories/user_factory.rb +6 -0
  48. data/spec/support/generator_macros.rb +29 -0
  49. data/spec/support/subdomain_helpers.rb +8 -0
  50. metadata +93 -9
  51. data/db/migrate/20130612093908_add_authentication_token_to_accounts.rb +0 -6
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ def create_account
4
+ @visitor ||= { name: "Testy", subdomain: "test", owner_attributes:
5
+ {email: "testy@example.com", password: "changeme", password_confirmation: "changeme"} }
6
+ end
7
+
8
+ def find_account_by_name
9
+ @account = Cadenero::V1::Account.where(name: @visitor[:name]).first
10
+ end
11
+
12
+ def sign_up
13
+ create_account
14
+ post "/v1/accounts", account: @visitor
15
+ find_account_by_name
16
+ end
17
+
18
+ feature 'Accounts' do
19
+ scenario "creating an account" do
20
+ sign_up
21
+ expect(last_response.status).to eq 201
22
+ expect(JSON.parse(last_response.body)).to have_content "auth_token"
23
+ end
24
+
25
+ scenario "cannot create an account with an already used subdomain" do
26
+ Cadenero::V1::Account.create!(:subdomain => "test", :name => "Testy")
27
+ sign_up
28
+ expect(last_response.status).to eq 422
29
+ errors = { errors: {subdomain:["has already been taken"]} }
30
+ expect(last_response.body).to eql(errors.to_json)
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ feature Cadenero::V1::Account do
4
+ scenario "can be created with an owner" do
5
+ params = {
6
+ :name => "Test Account",
7
+ :subdomain => "test",
8
+ :owner_attributes => {
9
+ :email => "user@example.com",
10
+ :password => "password",
11
+ :password_confirmation => "password"
12
+ }
13
+ }
14
+ account = Cadenero::V1::Account.create_with_owner(params)
15
+ account.should be_persisted
16
+ account.users.first.should == account.owner
17
+ end
18
+
19
+ it "cannot create an account without a subdomain" do
20
+ account = Cadenero::V1::Account.create_with_owner
21
+ account.should_not be_valid
22
+ account.users.should be_empty
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ feature 'User sign in' do
3
+ extend SubdomainHelpers
4
+
5
+ def create_account_user
6
+ @user ||= { email: "user@example.com", password: "password", password_confirmation: "password" }
7
+ end
8
+
9
+ def sign_in_account_user(user)
10
+ @user = { email: user.email, password: "password", password_confirmation: "password" }
11
+ end
12
+
13
+ def find_account_by_email
14
+ create_account_user
15
+ @account = Cadenero::V1::Account.where(name: @user[:email]).first
16
+ end
17
+
18
+ def sign_in_user(url, user)
19
+ post "#{url}", user: user
20
+ find_account_by_email
21
+ end
22
+
23
+ let(:account) { FactoryGirl.create(:account_with_schema) }
24
+ let(:errors_redirect_ro_sign_in) {{errors: "Please sign in. posting the user json credentials to /v1/sign_in", links: "/v1/sign_in"}.to_json}
25
+ let(:errors_invalid_email_or_password) {{ errors: {user:["Invalid email or password"]} }.to_json}
26
+ let(:sign_in_url) { "http://#{account.subdomain}.example.com/v1/sign_in" }
27
+ let(:root_url) { "http://#{account.subdomain}.example.com/v1" }
28
+
29
+ within_account_subdomain do
30
+ scenario "signs in as an account owner successfully" do
31
+ get root_url
32
+ expect(last_response.body).to eql(errors_redirect_ro_sign_in)
33
+ sign_in_user sign_in_url, sign_in_account_user(account.owner)
34
+ expect(last_response.status).to eq 201
35
+ expect(JSON.parse(last_response.body)["user"]["account_ids"]).to eq [account.id]
36
+ end
37
+ end
38
+
39
+ it "attempts sign in with an invalid password and fails" do
40
+ get cadenero.v1_root_url(:subdomain => account.subdomain)
41
+ expect(last_response.body).to eql(errors_redirect_ro_sign_in)
42
+ sign_in_user sign_in_url, { email: "user@example.com", password: "", password_confirmation: "" }
43
+ expect(last_response.status).to eq 422
44
+ expect(last_response.body).to eql(errors_invalid_email_or_password)
45
+ end
46
+
47
+ it "attempts sign in with an invalid email address and fails" do
48
+ get cadenero.v1_root_url(:subdomain => account.subdomain)
49
+ expect(last_response.body).to eql(errors_redirect_ro_sign_in)
50
+ sign_in_user sign_in_url, { email: "foo@example.com", password: "password", password_confirmation: "password" }
51
+ expect(last_response.status).to eq 422
52
+ expect(last_response.body).to eql(errors_invalid_email_or_password)
53
+ end
54
+
55
+ it "cannot sign in if not a part of this subdomain" do
56
+ other_account = FactoryGirl.create(:account)
57
+ get cadenero.v1_root_url(:subdomain => account.subdomain)
58
+ expect(last_response.body).to eql(errors_redirect_ro_sign_in)
59
+ sign_in_user sign_in_url, { email: other_account.owner.email, password: "", password_confirmation: "" }
60
+ expect(last_response.status).to eq 422
61
+ expect(last_response.body).to eql(errors_invalid_email_or_password)
62
+ end
63
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ def create_account_user
4
+ @user ||= { email: "user@example.com", password: "password", password_confirmation: "password" }
5
+ end
6
+
7
+ def find_account_by_email
8
+ @account = Cadenero::V1::Account.where(name: @user[:email]).first
9
+ end
10
+
11
+ def sign_up_user(url)
12
+ create_account_user
13
+ post "#{url}/v1/sign_up", user: @user
14
+ find_account_by_email
15
+ end
16
+
17
+ feature "User signup" do
18
+ let!(:account) { FactoryGirl.create(:account_with_schema) }
19
+ let(:root_url) { "http://#{account.subdomain}.example.com/" }
20
+ scenario "under an account" do
21
+ sign_up_user root_url
22
+ expect(last_response.status).to eq 201
23
+ expect(JSON.parse(last_response.body)["user"]["account_ids"]).to eq [account.id]
24
+ expect(last_request.url).to eq "#{root_url}v1/sign_up"
25
+ end
26
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+ require 'generators/cadenero/install_generator'
3
+
4
+ describe Cadenero::Generators::InstallGenerator do
5
+ before { cleanup! }
6
+ after { cleanup! }
7
+
8
+ # So we can know whether to backup or restore in cleanup!
9
+ # Wish RSpec had a setting for this already
10
+ before { flag_example! }
11
+ def flag_example!
12
+ example.metadata[:run] = true
13
+ end
14
+
15
+ def migrations
16
+ Dir["#{Rails.root}/db/migrate/*.rb"].sort
17
+ end
18
+
19
+ it "copies over the migrations" do
20
+ migrations.should be_empty
21
+ capture(:stdout) do
22
+ described_class.start(["--user-class=User", "--no-migrate", "--current-user-helper=current_user"], :destination => Rails.root)
23
+ end
24
+
25
+ # Ensure cadenero migrations have been copied over
26
+ migrations.should_not be_empty
27
+
28
+ # Ensure initializer has been created
29
+ #cadenero_initializer = File.readlines("#{Rails.root}/config/initializers/cadenero.rb")
30
+ #cadenero_initializer[0].strip.should == %q{Cadenero.user_class = "User"}
31
+
32
+ # Ensure cadenero_user is added to ApplicationController
33
+ application_controller = File.read("#{Rails.root}/app/controllers/application_controller.rb")
34
+ expected_cadenero_user_method = %Q{
35
+ def cadenero_user
36
+ current_user
37
+ end
38
+ helper_method :cadenero_user
39
+
40
+ }
41
+ application_controller.should include(expected_cadenero_user_method)
42
+ end
43
+
44
+ it "seeds the database" do
45
+ Cadenero::V1::Account.count.should == 0
46
+ Cadenero::User.count.should == 0
47
+
48
+ FactoryGirl.create(:account)
49
+ FactoryGirl.create(:user)
50
+ Cadenero::Engine.load_seed
51
+
52
+ Cadenero::V1::Account.count.should == 2
53
+ Cadenero::User.count.should == 3
54
+ end
55
+
56
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Cadenero::V1
4
+ describe Account do
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Cadenero
4
+ describe Member do
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Cadenero
4
+ describe User do
5
+
6
+ end
7
+ end
@@ -0,0 +1,77 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
+ require 'rspec/rails'
5
+ require 'rspec/autorun'
6
+ require 'capybara/rspec'
7
+ require 'factory_girl'
8
+ require 'database_cleaner'
9
+ require 'coveralls'
10
+
11
+ Coveralls.wear!
12
+
13
+ module ApiHelper
14
+ require 'rack/test'
15
+ include Rack::Test::Methods
16
+
17
+ def app
18
+ Rails.application
19
+ end
20
+ end
21
+ # Requires supporting ruby files with custom matchers and macros, etc,
22
+ # in spec/support/ and its subdirectories.
23
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
24
+
25
+ RSpec.configure do |config|
26
+ include ApiHelper
27
+ # ## Mock Framework
28
+ #
29
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
30
+ #
31
+ # config.mock_with :mocha
32
+ # config.mock_with :flexmock
33
+ # config.mock_with :rr
34
+
35
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
36
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
37
+
38
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
39
+ # examples within a transaction, remove the following line or assign false
40
+ # instead of true.
41
+ config.use_transactional_fixtures = true
42
+
43
+ # If true, the base class of anonymous controllers will be inferred
44
+ # automatically. This will be the default behavior in future versions of
45
+ # rspec-rails.
46
+ config.infer_base_class_for_anonymous_controllers = false
47
+
48
+ # Run specs in random order to surface order dependencies. If you find an
49
+ # order dependency and want to debug it, you can fix the order by providing
50
+ # the seed, which is printed after each run.
51
+ # --seed 1234
52
+ config.order = "random"
53
+
54
+ config.before(:suite) do
55
+ DatabaseCleaner.strategy = :truncation
56
+ DatabaseCleaner.clean_with(:truncation)
57
+ end
58
+ config.before(:each) do
59
+ DatabaseCleaner.start
60
+ end
61
+ config.after(:each) do
62
+ Apartment::Database.reset
63
+ DatabaseCleaner.clean
64
+ connection = ActiveRecord::Base.connection.raw_connection
65
+ schemas = connection.query(%Q{
66
+ SELECT 'drop schema ' || nspname || ' cascade;'
67
+ from pg_namespace
68
+ where nspname != 'public'
69
+ AND nspname != 'pg_toast'
70
+ AND nspname != 'pg_catalog'
71
+ AND nspname != 'information_schema';
72
+ })
73
+ schemas.each do |query|
74
+ connection.query(query.values.first)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :account, :class => Cadenero::V1::Account do
3
+ sequence(:name) { |n| "Test Account ##{n}" }
4
+ sequence(:subdomain) { |n| "test#{n}" }
5
+ association :owner, :factory => :user
6
+ after(:create) do |account|
7
+ account.users << account.owner
8
+ end
9
+ factory :account_with_schema do
10
+ after(:create) do |account|
11
+ account.create_schema
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :user, :class => Cadenero::User do
3
+ sequence(:email) { |n| "user#{n}@example.com" }
4
+ password "password"
5
+ end
6
+ end
@@ -0,0 +1,29 @@
1
+ module Cadenero
2
+ module GeneratorMacros
3
+ def cleanup!
4
+ Dir.chdir(Rails.root) do
5
+ FileUtils.rm_rf("db/migrate")
6
+ end
7
+
8
+ backup_or_restore = "#{example.metadata[:run] ? "restore" : "backup"}_file"
9
+ ["#{Rails.root}/app/controllers/application_controller.rb",
10
+ "#{Rails.root}/config/routes.rb"].each do |file|
11
+ send(backup_or_restore, file)
12
+ end
13
+ end
14
+
15
+ def backup_file(file)
16
+ FileUtils.cp(file, file + ".bak")
17
+ end
18
+
19
+ def restore_file(file)
20
+ FileUtils.mv(file + ".bak", file)
21
+ end
22
+ end
23
+ end
24
+
25
+ RSpec.configure do |c|
26
+ c.include Cadenero::GeneratorMacros, :example_group => {
27
+ :file_path => c.escaped_path(%w[spec (generators)])
28
+ }
29
+ end
@@ -0,0 +1,8 @@
1
+ module SubdomainHelpers
2
+ def within_account_subdomain
3
+ let(:subdomain_url) { "http://#{account.subdomain}.example.com" }
4
+ before { Capybara.default_host = subdomain_url }
5
+ after { Capybara.default_host = "http://example.com" }
6
+ yield
7
+ end
8
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cadenero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2.a
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Manuel Vidaurre
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-25 00:00:00.000000000 Z
12
+ date: 2013-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails-api
@@ -219,8 +219,8 @@ dependencies:
219
219
  - - ~>
220
220
  - !ruby/object:Gem::Version
221
221
  version: 1.0.1
222
- description: An Engine tha use Warden and OAuth for authenticate users using a RESTful
223
- API
222
+ description: A Rails.API Engine that use Warden for authenticate users using a RESTful
223
+ API in a multitenant way
224
224
  email:
225
225
  - manuel.vidaurre@agiltec.com.mx
226
226
  executables: []
@@ -254,16 +254,59 @@ files:
254
254
  - db/migrate/20130612061604_create_cadenero_v1_accounts.rb
255
255
  - db/migrate/20130612064652_create_cadenero_v1_users.rb
256
256
  - db/migrate/20130612073709_create_cadenero_v1_members.rb
257
- - db/migrate/20130612093908_add_authentication_token_to_accounts.rb
257
+ - db/seeds.rb
258
258
  - lib/cadenero/active_record_extensions.rb
259
259
  - lib/cadenero/constraints/subdomain_required.rb
260
260
  - lib/cadenero/engine.rb
261
261
  - lib/cadenero/version.rb
262
262
  - lib/cadenero.rb
263
+ - lib/generators/cadenero/install/templates/initializer.rb
264
+ - lib/generators/cadenero/install_generator.rb
263
265
  - lib/tasks/cadenero_tasks.rake
264
266
  - MIT-LICENSE
265
267
  - Rakefile
266
268
  - README.md
269
+ - spec/controllers/cadenero/v1/accounts_controller_spec.rb
270
+ - spec/dummy/app/controllers/application_controller.rb
271
+ - spec/dummy/config/application.rb
272
+ - spec/dummy/config/boot.rb
273
+ - spec/dummy/config/database.yml
274
+ - spec/dummy/config/environment.rb
275
+ - spec/dummy/config/environments/development.rb
276
+ - spec/dummy/config/environments/production.rb
277
+ - spec/dummy/config/environments/test.rb
278
+ - spec/dummy/config/initializers/cadenero.rb
279
+ - spec/dummy/config/initializers/secret_token.rb
280
+ - spec/dummy/config/initializers/wrap_parameters.rb
281
+ - spec/dummy/config/locales/en.yml
282
+ - spec/dummy/config/routes.rb
283
+ - spec/dummy/config.ru
284
+ - spec/dummy/db/schema.rb
285
+ - spec/dummy/log/development.log
286
+ - spec/dummy/log/test.log
287
+ - spec/dummy/public/404.html
288
+ - spec/dummy/public/422.html
289
+ - spec/dummy/public/500.html
290
+ - spec/dummy/public/favicon.ico
291
+ - spec/dummy/Rakefile
292
+ - spec/dummy/README.rdoc
293
+ - spec/dummy/script/rails
294
+ - spec/dummy/spec/spec_helper.rb
295
+ - spec/dummy/tmp/ember-rails/ember-data.js
296
+ - spec/dummy/tmp/ember-rails/ember.js
297
+ - spec/features/accounts/sign_up_spec.rb
298
+ - spec/features/cadenero/account_spec.rb
299
+ - spec/features/users/sign_in_spec.rb
300
+ - spec/features/users/sign_up_spec.rb
301
+ - spec/generators/install_generator_spec.rb
302
+ - spec/models/cadenero/account_spec.rb
303
+ - spec/models/cadenero/member_spec.rb
304
+ - spec/models/cadenero/user_spec.rb
305
+ - spec/spec_helper.rb
306
+ - spec/support/factories/account_factory.rb
307
+ - spec/support/factories/user_factory.rb
308
+ - spec/support/generator_macros.rb
309
+ - spec/support/subdomain_helpers.rb
267
310
  homepage: http://www.agiltec.com.mx/ruby/gems/cadenero
268
311
  licenses: []
269
312
  post_install_message:
@@ -279,14 +322,55 @@ required_ruby_version: !ruby/object:Gem::Requirement
279
322
  required_rubygems_version: !ruby/object:Gem::Requirement
280
323
  none: false
281
324
  requirements:
282
- - - ! '>='
325
+ - - ! '>'
283
326
  - !ruby/object:Gem::Version
284
- version: '0'
327
+ version: 1.3.1
285
328
  requirements: []
286
329
  rubyforge_project:
287
330
  rubygems_version: 1.8.23
288
331
  signing_key:
289
332
  specification_version: 3
290
333
  summary: Rails.API Engine for manage multitenant authentication
291
- test_files: []
334
+ test_files:
335
+ - spec/controllers/cadenero/v1/accounts_controller_spec.rb
336
+ - spec/dummy/app/controllers/application_controller.rb
337
+ - spec/dummy/config/application.rb
338
+ - spec/dummy/config/boot.rb
339
+ - spec/dummy/config/database.yml
340
+ - spec/dummy/config/environment.rb
341
+ - spec/dummy/config/environments/development.rb
342
+ - spec/dummy/config/environments/production.rb
343
+ - spec/dummy/config/environments/test.rb
344
+ - spec/dummy/config/initializers/cadenero.rb
345
+ - spec/dummy/config/initializers/secret_token.rb
346
+ - spec/dummy/config/initializers/wrap_parameters.rb
347
+ - spec/dummy/config/locales/en.yml
348
+ - spec/dummy/config/routes.rb
349
+ - spec/dummy/config.ru
350
+ - spec/dummy/db/schema.rb
351
+ - spec/dummy/log/development.log
352
+ - spec/dummy/log/test.log
353
+ - spec/dummy/public/404.html
354
+ - spec/dummy/public/422.html
355
+ - spec/dummy/public/500.html
356
+ - spec/dummy/public/favicon.ico
357
+ - spec/dummy/Rakefile
358
+ - spec/dummy/README.rdoc
359
+ - spec/dummy/script/rails
360
+ - spec/dummy/spec/spec_helper.rb
361
+ - spec/dummy/tmp/ember-rails/ember-data.js
362
+ - spec/dummy/tmp/ember-rails/ember.js
363
+ - spec/features/accounts/sign_up_spec.rb
364
+ - spec/features/cadenero/account_spec.rb
365
+ - spec/features/users/sign_in_spec.rb
366
+ - spec/features/users/sign_up_spec.rb
367
+ - spec/generators/install_generator_spec.rb
368
+ - spec/models/cadenero/account_spec.rb
369
+ - spec/models/cadenero/member_spec.rb
370
+ - spec/models/cadenero/user_spec.rb
371
+ - spec/spec_helper.rb
372
+ - spec/support/factories/account_factory.rb
373
+ - spec/support/factories/user_factory.rb
374
+ - spec/support/generator_macros.rb
375
+ - spec/support/subdomain_helpers.rb
292
376
  has_rdoc:
@@ -1,6 +0,0 @@
1
- class AddAuthenticationTokenToAccounts < ActiveRecord::Migration
2
- def change
3
- add_column :cadenero_accounts, :authentication_token, :string
4
- add_index :cadenero_accounts, :authentication_token
5
- end
6
- end