comable-apartment 0.0.1

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 (86) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +22 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Gemfile +4 -0
  6. data/MIT-LICENSE +22 -0
  7. data/README.md +56 -0
  8. data/Rakefile +19 -0
  9. data/app/assets/javascripts/comable/apartment/application.coffee +14 -0
  10. data/app/assets/javascripts/comable/apartment/dispatcher.coffee +0 -0
  11. data/app/assets/stylesheets/comable/apartment/application.scss +10 -0
  12. data/app/controllers/comable/apartment/application_controller.rb +57 -0
  13. data/app/controllers/comable/apartment/dashboard_controller.rb +10 -0
  14. data/app/controllers/comable/apartment/tenants_controller.rb +55 -0
  15. data/app/controllers/comable/apartment/user_sessions_controller.rb +8 -0
  16. data/app/controllers/comable/apartment/users_controller.rb +67 -0
  17. data/app/decorators/comable/ability_decorator.rb +17 -0
  18. data/app/decorators/comable/user_decorator.rb +8 -0
  19. data/app/helpers/comable/apartment/application_helper.rb +19 -0
  20. data/app/models/comable/tenant.rb +59 -0
  21. data/app/navigations/comable/apartment/application.rb +34 -0
  22. data/app/views/comable/apartment/dashboard/show.slim +8 -0
  23. data/app/views/comable/apartment/tenants/_form.slim +19 -0
  24. data/app/views/comable/apartment/tenants/edit.slim +27 -0
  25. data/app/views/comable/apartment/tenants/index.slim +54 -0
  26. data/app/views/comable/apartment/tenants/new.slim +16 -0
  27. data/app/views/comable/apartment/user_sessions/new.slim +25 -0
  28. data/app/views/comable/apartment/users/_form.slim +24 -0
  29. data/app/views/comable/apartment/users/edit.slim +34 -0
  30. data/app/views/comable/apartment/users/index.slim +34 -0
  31. data/app/views/comable/apartment/users/new.slim +21 -0
  32. data/app/views/comable/apartment/users/show.slim +33 -0
  33. data/app/views/layouts/comable/apartment/application.slim +17 -0
  34. data/comable-apartment.gemspec +46 -0
  35. data/config/initializers/comable-apartment.rb +4 -0
  36. data/config/initializers/devise.rb +3 -0
  37. data/config/locales/en.yml +27 -0
  38. data/config/locales/ja.yml +27 -0
  39. data/config/routes.rb +14 -0
  40. data/db/migrate/20150729091221_create_comable_tenant.rb +9 -0
  41. data/db/seeds.rb +5 -0
  42. data/db/seeds/comable/users.rb +51 -0
  43. data/gemfiles/active_record_40.gemfile +4 -0
  44. data/gemfiles/active_record_41.gemfile +4 -0
  45. data/gemfiles/active_record_42.gemfile +4 -0
  46. data/gemfiles/active_record_edge.gemfile +8 -0
  47. data/gemfiles/common.gemfile +2 -0
  48. data/lib/comable/apartment.rb +62 -0
  49. data/lib/comable/apartment/constraint.rb +19 -0
  50. data/lib/comable/apartment/engine.rb +13 -0
  51. data/lib/comable/apartment/tasks/release.rake +50 -0
  52. data/lib/comable/apartment/version.rb +5 -0
  53. data/test/controllers/comable/apartment/tenants_controller_test.rb +71 -0
  54. data/test/controllers/comable/apartment/users_controller_test.rb +80 -0
  55. data/test/dummy/Rakefile +2 -0
  56. data/test/dummy/bin/rails +3 -0
  57. data/test/dummy/config.ru +2 -0
  58. data/test/dummy/config/application.rb +53 -0
  59. data/test/dummy/config/database.yml +18 -0
  60. data/test/dummy/db/.gitkeep +0 -0
  61. data/test/dummy/db/migrate/20150814140744_create_comable_products.comable.rb +16 -0
  62. data/test/dummy/db/migrate/20150814140745_create_comable_users.comable.rb +47 -0
  63. data/test/dummy/db/migrate/20150814140746_create_comable_stocks.comable.rb +15 -0
  64. data/test/dummy/db/migrate/20150814140747_create_comable_orders.comable.rb +21 -0
  65. data/test/dummy/db/migrate/20150814140748_create_comable_order_items.comable.rb +20 -0
  66. data/test/dummy/db/migrate/20150814140749_create_comable_payment_methods.comable.rb +14 -0
  67. data/test/dummy/db/migrate/20150814140750_create_comable_shipment_methods.comable.rb +12 -0
  68. data/test/dummy/db/migrate/20150814140751_create_comable_stores.comable.rb +12 -0
  69. data/test/dummy/db/migrate/20150814140752_create_comable_addresses.comable.rb +18 -0
  70. data/test/dummy/db/migrate/20150814140753_create_comable_categories.comable.rb +11 -0
  71. data/test/dummy/db/migrate/20150814140754_create_comable_products_categories.comable.rb +9 -0
  72. data/test/dummy/db/migrate/20150814140755_create_comable_images.comable.rb +10 -0
  73. data/test/dummy/db/migrate/20150814140756_create_comable_shipments.comable.rb +14 -0
  74. data/test/dummy/db/migrate/20150814140757_create_comable_payments.comable.rb +13 -0
  75. data/test/dummy/db/migrate/20150814140758_create_comable_trackers.comable.rb +13 -0
  76. data/test/dummy/db/migrate/20150814140759_create_comable_pages.comable.rb +18 -0
  77. data/test/dummy/db/migrate/20150814140760_create_comable_themes.comable.rb +16 -0
  78. data/test/dummy/db/migrate/20150814140761_add_theme_id_to_comable_stores.comable.rb +8 -0
  79. data/test/factories/comable/tenants.rb +6 -0
  80. data/test/factories/comable/users.rb +6 -0
  81. data/test/lib/comable/apartment/version_test.rb +7 -0
  82. data/test/lib/comable/apartment_test.rb +27 -0
  83. data/test/minitest_helper.rb +29 -0
  84. data/test/models/comable/tenant_test.rb +81 -0
  85. data/test/support/have_attributes.rb +36 -0
  86. metadata +529 -0
@@ -0,0 +1,4 @@
1
+ Comable::Apartment.config do |config|
2
+ config.excluded_models = Comable::Apartment::DEFAULT_EXCLUDED_MODELS
3
+ config.tenant_names = -> { Comable::Tenant.pluck(:name) }
4
+ end
@@ -0,0 +1,3 @@
1
+ Devise.setup do |config|
2
+ config.parent_controller = 'Comable::Apartment::ApplicationController'
3
+ end
@@ -0,0 +1,27 @@
1
+ en:
2
+ comable:
3
+ apartment:
4
+ access_denied: 'Access denied'
5
+ comable_apartment_provides_multi_tenancy: 'Comable Apartment provides multi-tenancy.'
6
+ confirmation_before_destroy: 'This operation cannot be undone. Would you like to proceed?'
7
+ dashboard: 'Dashboard'
8
+ destroy: 'Destory'
9
+ edit: 'Edit'
10
+ general: 'General'
11
+ manage_tenants: 'Manage the tenants'
12
+ new: 'New'
13
+ not_found: 'Record not found.'
14
+ results: 'results'
15
+ save: 'Save'
16
+ sign_in: 'Login'
17
+ sign_out: 'Logout'
18
+ tenants: 'Tenants'
19
+ users: 'Admin users'
20
+ visit_store: 'Visit the store'
21
+ visit_admin: 'Visit the admin panel'
22
+ you_can_manage_tenants_form_this_page: 'You can manage the tenants form this page.'
23
+
24
+ enumerize:
25
+ comable/user:
26
+ role:
27
+ root: 'Superuser'
@@ -0,0 +1,27 @@
1
+ ja:
2
+ comable:
3
+ apartment:
4
+ access_denied: 'アクセス権がありません'
5
+ comable_apartment_provides_multi_tenancy: 'Comable Apartmentはマルチテナントを実現を可能にします。'
6
+ confirmation_before_destroy: 'この操作は元に戻せません。本当に削除してもよろしいですか?'
7
+ dashboard: 'ダッシュボード'
8
+ destroy: '削除'
9
+ edit: '編集'
10
+ general: '一般'
11
+ manage_tenants: 'テナント管理'
12
+ new: '新規作成'
13
+ not_found: 'レコードが見つかりませんでした。'
14
+ results: '件'
15
+ save: '保存'
16
+ sign_in: 'ログイン'
17
+ sign_out: 'ログアウト'
18
+ tenants: 'テナント'
19
+ users: '管理者'
20
+ visit_store: 'ストアを見る'
21
+ visit_admin: '管理画面を見る'
22
+ you_can_manage_tenants_form_this_page: 'このページからテナントを管理することができます。'
23
+
24
+ enumerize:
25
+ comable/user:
26
+ role:
27
+ root: 'スーパーユーザー'
@@ -0,0 +1,14 @@
1
+ Comable::Apartment::Engine.routes.draw do
2
+ root to: 'dashboard#show'
3
+
4
+ devise_for :root_user, path: :user, class_name: Comable::User.name, module: :devise, router_name: :comable_apartment, controllers: {
5
+ sessions: 'comable/apartment/user_sessions'
6
+ }
7
+
8
+ resources :tenants do
9
+ resources :users
10
+ end
11
+
12
+ # TODO: Change to 404 page
13
+ get '*path', controller: :dashboard, action: :show
14
+ end
@@ -0,0 +1,9 @@
1
+ class CreateComableTenant < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_tenants do |t|
4
+ t.string :name, null: false, unique: true
5
+ t.string :domain
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ seeds_path = File.join(File.dirname(__FILE__), 'seeds')
2
+
3
+ Dir.glob(File.join(seeds_path, '**/*.rb')).sort.each do |fixture_file|
4
+ require fixture_file
5
+ end
@@ -0,0 +1,51 @@
1
+ require 'highline/import'
2
+
3
+ def default_email
4
+ 'comable@example.com'
5
+ end
6
+
7
+ def default_password
8
+ 'password'
9
+ end
10
+
11
+ def ask_root_email
12
+ if ENV['ROOT_EMAIL']
13
+ ENV['ROOT_EMAIL']
14
+ else
15
+ ask("Email [#{default_email}]: ") do |q|
16
+ q.echo = true
17
+ q.whitespace = :strip
18
+ end
19
+ end.presence || default_email
20
+ end
21
+
22
+ def ask_root_password
23
+ if ENV['ROOT_PASSWORD']
24
+ ENV['ROOT_PASSWORD']
25
+ else
26
+ ask("Password [#{default_password}]: ") do |q|
27
+ q.echo = false
28
+ q.whitespace = :strip
29
+ end
30
+ end.presence || default_password
31
+ end
32
+
33
+ def create_root_user
34
+ email = ask_root_email
35
+ password = ask_root_password
36
+
37
+ if Comable::User.where(email: email).exists?
38
+ puts "WARNING: The email address has already existed: #{email}"
39
+ else
40
+ Comable::User.with_role(:root).new do |obj|
41
+ obj.email = email
42
+ obj.password = password
43
+ end.save!
44
+ end
45
+ end
46
+
47
+ if Comable::User.with_role(:root).exists?
48
+ puts 'Root user has already been previously created.'
49
+ else
50
+ create_root_user
51
+ end
@@ -0,0 +1,4 @@
1
+ eval File.read(File.expand_path('../common.gemfile', __FILE__))
2
+
3
+ gem 'railties', '~> 4.0.0'
4
+ gem 'activerecord', '~> 4.0.0', require: 'active_record'
@@ -0,0 +1,4 @@
1
+ eval File.read(File.expand_path('../common.gemfile', __FILE__))
2
+
3
+ gem 'railties', '~> 4.1.0'
4
+ gem 'activerecord', '~> 4.1.0', require: 'active_record'
@@ -0,0 +1,4 @@
1
+ eval File.read(File.expand_path('../common.gemfile', __FILE__))
2
+
3
+ gem 'railties', '~> 4.2.0'
4
+ gem 'activerecord', '~> 4.2.0', require: 'active_record'
@@ -0,0 +1,8 @@
1
+ eval File.read(File.expand_path('../common.gemfile', __FILE__))
2
+
3
+ git 'git://github.com/rails/rails.git' do
4
+ gem 'railties'
5
+ gem 'activerecord', require: 'active_record'
6
+ end
7
+
8
+ gem 'arel', github: 'rails/arel'
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec path: '..'
@@ -0,0 +1,62 @@
1
+ require 'slim-rails'
2
+ require 'sass-rails'
3
+ require 'coffee-rails'
4
+ require 'compass-rails'
5
+ require 'uglifier'
6
+ require 'bootstrap-sass'
7
+ require 'font-awesome-rails'
8
+ require 'dynamic_form'
9
+ require 'jquery-rails'
10
+ require 'jquery-ui-rails'
11
+ require 'raphael-rails'
12
+ require 'morrisjs-rails'
13
+ require 'nprogress-rails'
14
+ require 'turbolinks'
15
+ require 'jquery-turbolinks'
16
+ require 'awesome_admin_layout'
17
+
18
+ require 'apartment'
19
+ require 'apartment/elevators/generic'
20
+ require 'comable/core'
21
+ require 'comable/apartment/constraint'
22
+ require 'comable/apartment/engine'
23
+ require 'comable/apartment/version'
24
+
25
+ module Comable
26
+ module Apartment
27
+ DEFAULT_EXCLUDED_MODELS = %w(
28
+ Comable::Tenant
29
+ )
30
+
31
+ class << self
32
+ delegate :excluded_models, :tenant_names, to: ::Apartment
33
+
34
+ def config
35
+ yield self if block_given?
36
+ end
37
+
38
+ def excluded_models=(models)
39
+ ::Apartment.configure { |config| config.excluded_models = models }
40
+ end
41
+
42
+ def tenant_names=(names)
43
+ ::Apartment.configure { |config| config.tenant_names = names }
44
+ end
45
+
46
+ def translate(key, options = {})
47
+ I18n.translate("comable.apartment.#{key}", options)
48
+ end
49
+
50
+ alias_method :t, :translate
51
+
52
+ def routes(router, options = {})
53
+ options.reverse_merge! at: '/'
54
+ router.instance_eval do
55
+ constraints Comable::Apartment::Constraint do
56
+ mount Comable::Apartment::Engine, options
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ module Comable
2
+ module Apartment
3
+ class Constraint
4
+ class << self
5
+ def matches?(request)
6
+ request_to_apartment? request
7
+ end
8
+
9
+ private
10
+
11
+ def request_to_apartment?(request)
12
+ tenant = Comable::Tenant.from_request(request)
13
+ tenant.switch!
14
+ tenant.new_record?
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module Comable
2
+ module Apartment
3
+ class Engine < Rails::Engine
4
+ isolate_namespace Comable::Apartment
5
+
6
+ config.to_prepare do
7
+ Dir.glob(Comable::Apartment::Engine.root.join('app/decorators/comable/*_decorator.rb')).each do |c|
8
+ Rails.configuration.cache_classes ? require_dependency(c) : load(c)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ require 'comable/apartment/version'
2
+
3
+ root = File.expand_path('../../../../../', __FILE__)
4
+ version = Comable::Apartment::VERSION
5
+ tag = "v#{version}"
6
+
7
+ directory 'pkg'
8
+
9
+ namespace :comable do
10
+ namespace :apartment do
11
+ gemname = 'comable-apartment'
12
+ gem = "#{gemname}-#{version}.gem"
13
+ gemspec = "#{gemname}.gemspec"
14
+
15
+ task :clean do
16
+ rm_f "pkg/#{gem}"
17
+ end
18
+
19
+ task :build => :pkg do
20
+ sh "gem build #{gemspec} && mv #{gem} #{root}/pkg/"
21
+ end
22
+
23
+ task :install => :build do
24
+ sh "gem install pkg/#{gem}"
25
+ end
26
+
27
+ task :push => :build do
28
+ sh 'git push'
29
+ sh "gem push pkg/#{gem}"
30
+ end
31
+
32
+ task :commit do
33
+ File.open('pkg/commit_message.txt', 'w') do |f|
34
+ f.puts "# Bump to #{version}\n"
35
+ f.puts
36
+ f.puts '# UNCOMMENT THE LINE ABOVE TO APPROVE THIS COMMIT'
37
+ end
38
+
39
+ sh 'git commit --verbose --template=pkg/commit_message.txt'
40
+ rm_f 'pkg/commit_message.txt'
41
+ end
42
+
43
+ task :tag do
44
+ sh "git tag -m '#{tag} release' #{tag}"
45
+ sh 'git push --tags'
46
+ end
47
+
48
+ task :release => %w(clean build commit tag push)
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ module Comable
2
+ module Apartment
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,71 @@
1
+ require 'minitest_helper'
2
+
3
+ class Comable::Apartment::TenantsControllerTest < ActionController::TestCase
4
+ setup do
5
+ @routes = Comable::Apartment::Engine.routes
6
+
7
+ sign_in :root_user, create(:user, role: :root)
8
+ end
9
+
10
+ test 'should get index' do
11
+ tenant = create(:tenant)
12
+ tenant.create
13
+ get :index
14
+ assert_includes assigns(:tenants), tenant
15
+ end
16
+
17
+ test 'should get new tenant' do
18
+ get :new
19
+ assert_instance_of Comable::Tenant, assigns(:tenant)
20
+ end
21
+
22
+ test 'should create tenant' do
23
+ assert_difference('Comable::Tenant.count') do
24
+ post :create, tenant: attributes_for(:tenant)
25
+ end
26
+ end
27
+
28
+ test 'should redirect to the tenant after create tenant' do
29
+ post :create, tenant: attributes_for(:tenant)
30
+ assert_redirected_to tenant_path(assigns(:tenant))
31
+ end
32
+
33
+ test 'should show tenant' do
34
+ tenant = create(:tenant)
35
+ get :show, id: tenant
36
+ assert_response :success
37
+ end
38
+
39
+ test 'should get edit' do
40
+ tenant = create(:tenant)
41
+ get :edit, id: tenant
42
+ assert_response :success
43
+ end
44
+
45
+ test 'should update tenant' do
46
+ tenant = create(:tenant)
47
+ valid_attributes = { domain: "new-#{tenant.domain}" }
48
+ patch :update, id: tenant, tenant: valid_attributes
49
+ assert_have_attributes valid_attributes, tenant.reload.attributes
50
+ end
51
+
52
+ test 'should redirect to the tenant after update tenant' do
53
+ tenant = create(:tenant)
54
+ valid_attributes = { domain: "new-#{tenant.domain}" }
55
+ patch :update, id: tenant, tenant: valid_attributes
56
+ assert_redirected_to tenant_path(assigns(:tenant))
57
+ end
58
+
59
+ test 'should destroy tenant' do
60
+ tenant = create(:tenant)
61
+ assert_difference('Comable::Tenant.count', -1) do
62
+ delete :destroy, id: tenant
63
+ end
64
+ end
65
+
66
+ test 'should redirect to index after destroy tenant' do
67
+ tenant = create(:tenant)
68
+ delete :destroy, id: tenant
69
+ assert_redirected_to tenants_path
70
+ end
71
+ end
@@ -0,0 +1,80 @@
1
+ require 'minitest_helper'
2
+
3
+ class Comable::Apartment::UsersControllerTest < ActionController::TestCase
4
+ setup do
5
+ @routes = Comable::Apartment::Engine.routes
6
+
7
+ @tenant = create(:tenant)
8
+ @tenant.create
9
+ @tenant.switch!
10
+
11
+ # TODO: Create into the "public" schema
12
+ sign_in :root_user, create(:user, role: :root)
13
+ end
14
+
15
+ teardown do
16
+ @tenant.reset!
17
+ @tenant.drop
18
+ end
19
+
20
+ test 'should get index' do
21
+ user = create(:user)
22
+ get :index, tenant_id: @tenant
23
+ assert_includes assigns(:users), user
24
+ end
25
+
26
+ test 'should get new user' do
27
+ get :new, tenant_id: @tenant
28
+ assert_instance_of Comable::User, assigns(:user)
29
+ end
30
+
31
+ test 'should create user' do
32
+ assert_difference('@tenant.switch { Comable::User.count }') do
33
+ post :create, tenant_id: @tenant, user: attributes_for(:user)
34
+ end
35
+ end
36
+
37
+ test 'should redirect to the user after create user' do
38
+ post :create, tenant_id: @tenant, user: attributes_for(:user)
39
+ assert_redirected_to tenant_user_path(@tenant, assigns(:user))
40
+ end
41
+
42
+ test 'should show user' do
43
+ user = create(:user)
44
+ get :show, tenant_id: @tenant, id: user
45
+ assert_response :success
46
+ end
47
+
48
+ test 'should get edit' do
49
+ user = create(:user)
50
+ get :edit, tenant_id: @tenant, id: user
51
+ assert_response :success
52
+ end
53
+
54
+ test 'should update user' do
55
+ user = create(:user)
56
+ valid_attributes = { email: "new-#{user.email}" }
57
+ patch :update, tenant_id: @tenant, id: user, user: valid_attributes
58
+ assert_have_attributes valid_attributes, @tenant.switch { user.reload.attributes }
59
+ end
60
+
61
+ test 'should redirect to the user after update user' do
62
+ user = create(:user)
63
+ valid_attributes = { email: "new-#{user.email}" }
64
+ patch :update, tenant_id: @tenant, id: user, user: valid_attributes
65
+ assert_redirected_to tenant_user_path(@tenant, assigns(:user))
66
+ end
67
+
68
+ test 'should destroy user' do
69
+ user = create(:user)
70
+ assert_difference('@tenant.switch { Comable::User.count }', -1) do
71
+ delete :destroy, tenant_id: @tenant, id: user
72
+ end
73
+ end
74
+
75
+ test 'should redirect to index after destroy user' do
76
+ user = create(:user)
77
+ delete :destroy, tenant_id: @tenant, id: user
78
+ assert_redirected_to tenant_users_path(@tenant)
79
+ end
80
+ end