cadenero 0.0.1 → 0.0.2.a

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.
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