saucy 0.1.3 → 0.1.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/Gemfile +15 -1
- data/Gemfile.lock +67 -1
- data/Rakefile +26 -0
- data/app/controllers/memberships_controller.rb +33 -1
- data/app/models/invitation.rb +1 -1
- data/app/models/membership.rb +22 -0
- data/app/models/permission.rb +17 -0
- data/app/models/signup.rb +3 -3
- data/app/views/memberships/edit.html.erb +18 -0
- data/app/views/memberships/index.html.erb +4 -4
- data/config/routes.rb +2 -3
- data/features/run_features.feature +4 -3
- data/features/step_definitions/rails_steps.rb +3 -0
- data/lib/generators/saucy/features/templates/factories.rb +4 -4
- data/lib/generators/saucy/features/templates/step_definitions/session_steps.rb +6 -3
- data/lib/generators/saucy/features/templates/step_definitions/user_steps.rb +6 -4
- data/lib/generators/saucy/install/templates/create_saucy_tables.rb +8 -6
- data/lib/saucy/account.rb +9 -5
- data/lib/saucy/project.rb +28 -5
- data/lib/saucy/user.rb +5 -12
- data/spec/controllers/memberships_controller_spec.rb +87 -5
- data/spec/environment.rb +91 -0
- data/spec/models/account_spec.rb +17 -6
- data/spec/models/membership_spec.rb +37 -0
- data/spec/models/permission_spec.rb +19 -0
- data/spec/models/project_spec.rb +39 -9
- data/spec/models/user_spec.rb +16 -42
- data/spec/scaffold/config/routes.rb +5 -0
- data/spec/spec_helper.rb +8 -1
- data/spec/support/authentication_helpers.rb +16 -6
- metadata +75 -74
- data/app/controllers/permissions_controller.rb +0 -17
- data/app/models/account_membership.rb +0 -8
- data/app/models/project_membership.rb +0 -14
- data/app/views/permissions/edit.html.erb +0 -15
- data/spec/controllers/permissions_controller_spec.rb +0 -69
- data/spec/models/account_membership_spec.rb +0 -13
- data/spec/models/project_membership_spec.rb +0 -22
data/spec/models/user_spec.rb
CHANGED
@@ -5,20 +5,20 @@ describe User, "valid" do
|
|
5
5
|
|
6
6
|
it { should validate_presence_of(:name) }
|
7
7
|
|
8
|
-
it { should have_many(:
|
9
|
-
it { should have_many(:accounts).through(:
|
10
|
-
it { should have_many(:
|
11
|
-
it { should have_many(:
|
8
|
+
it { should have_many(:memberships) }
|
9
|
+
it { should have_many(:accounts).through(:memberships) }
|
10
|
+
it { should have_many(:permissions) }
|
11
|
+
it { should have_many(:projects).through(:permissions) }
|
12
12
|
|
13
13
|
it "is an admin of an account with an admin membership" do
|
14
14
|
account = Factory(:account)
|
15
|
-
Factory(:
|
15
|
+
Factory(:membership, :user => subject, :admin => true, :account => account)
|
16
16
|
subject.should be_admin_of(account)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "isn't an admin of an account with a non admin membership" do
|
20
20
|
account = Factory(:account)
|
21
|
-
Factory(:
|
21
|
+
Factory(:membership, :user => subject, :admin => false, :account => account)
|
22
22
|
subject.should_not be_admin_of(account)
|
23
23
|
end
|
24
24
|
|
@@ -29,29 +29,33 @@ describe User, "valid" do
|
|
29
29
|
|
30
30
|
it "is a member with a membership for the given account" do
|
31
31
|
account = Factory(:account)
|
32
|
-
Factory(:
|
32
|
+
Factory(:membership, :user => subject, :account => account)
|
33
33
|
subject.should be_member_of(account)
|
34
34
|
end
|
35
35
|
|
36
36
|
it "isn't a member without a membership for the given account" do
|
37
37
|
account = Factory(:account)
|
38
38
|
other_account = Factory(:account)
|
39
|
-
Factory(:
|
39
|
+
Factory(:membership, :user => subject, :account => other_account)
|
40
40
|
subject.should_not be_member_of(account)
|
41
41
|
end
|
42
42
|
|
43
43
|
it "is a member with a membership for the given project" do
|
44
44
|
project = Factory(:project)
|
45
|
-
Factory(:
|
46
|
-
|
45
|
+
membership = Factory(:membership, :user => subject,
|
46
|
+
:account => project.account)
|
47
|
+
Factory(:permission, :membership => membership,
|
48
|
+
:project => project)
|
47
49
|
subject.should be_member_of(project)
|
48
50
|
end
|
49
51
|
|
50
52
|
it "isn't a member without a membership for the given project" do
|
51
53
|
project = Factory(:project)
|
52
54
|
other_project = Factory(:project)
|
53
|
-
Factory(:
|
54
|
-
|
55
|
+
membership = Factory(:membership, :user => subject,
|
56
|
+
:account => other_project.account)
|
57
|
+
Factory(:permission, :membership => membership,
|
58
|
+
:project => other_project)
|
55
59
|
subject.should_not be_member_of(project)
|
56
60
|
end
|
57
61
|
|
@@ -62,35 +66,5 @@ describe User, "valid" do
|
|
62
66
|
|
63
67
|
User.by_name.map(&:name).should == %w(abc def ghi)
|
64
68
|
end
|
65
|
-
|
66
|
-
context "updating the permissions for an account" do
|
67
|
-
let!(:account) { Factory(:account) }
|
68
|
-
let!(:other_account) { Factory(:account) }
|
69
|
-
let!(:member_project) { Factory(:project, :account => account) }
|
70
|
-
let!(:nonmember_project) { Factory(:project, :account => account) }
|
71
|
-
let!(:other_account_project) { Factory(:project, :account => other_account) }
|
72
|
-
|
73
|
-
before do
|
74
|
-
Factory(:account_membership, :account => account, :user => subject)
|
75
|
-
Factory(:account_membership, :account => other_account, :user => subject)
|
76
|
-
Factory(:project_membership, :project => member_project, :user => subject)
|
77
|
-
Factory(:project_membership, :project => other_account_project, :user => subject)
|
78
|
-
subject.reload
|
79
|
-
|
80
|
-
subject.update_permissions_for(account, [nonmember_project.id])
|
81
|
-
end
|
82
|
-
|
83
|
-
it "adds an added project for that account" do
|
84
|
-
subject.should be_member_of(nonmember_project)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "removes a removed project for that account" do
|
88
|
-
subject.should_not be_member_of(member_project)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "ignores a project for another account" do
|
92
|
-
subject.should be_member_of(other_account_project)
|
93
|
-
end
|
94
|
-
end
|
95
69
|
end
|
96
70
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
2
|
ENV["RAILS_ENV"] ||= 'test'
|
3
|
-
|
3
|
+
|
4
|
+
if File.exist?("config/environment.rb")
|
5
|
+
require "config/environment"
|
6
|
+
else
|
7
|
+
require File.expand_path("../environment", __FILE__)
|
8
|
+
end
|
9
|
+
|
4
10
|
require 'rspec/rails'
|
11
|
+
require 'shoulda'
|
5
12
|
|
6
13
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
7
14
|
# in spec/support/ and its subdirectories.
|
@@ -21,24 +21,34 @@ module AuthenticationHelpers
|
|
21
21
|
|
22
22
|
def sign_in_as_admin_of_account(account)
|
23
23
|
user = Factory(:user)
|
24
|
-
Factory(:
|
24
|
+
Factory(:membership, :user => user, :account => account, :admin => true)
|
25
25
|
sign_in_as user
|
26
26
|
end
|
27
27
|
|
28
28
|
def sign_in_as_non_admin_of_account(account)
|
29
29
|
user = Factory(:user)
|
30
|
-
Factory(:
|
30
|
+
Factory(:membership, :user => user, :account => account, :admin => false)
|
31
31
|
sign_in_as user
|
32
32
|
end
|
33
33
|
|
34
34
|
def sign_in_as_non_admin_of_project(project)
|
35
|
-
user =
|
36
|
-
Factory(:
|
35
|
+
user = Factory(:user)
|
36
|
+
membership = Factory(:membership, :user => user,
|
37
|
+
:account => account,
|
38
|
+
:admin => false)
|
39
|
+
Factory(:permission, :membership => membership,
|
40
|
+
:project => project)
|
41
|
+
sign_in_as user
|
37
42
|
end
|
38
43
|
|
39
44
|
def sign_in_as_admin_of_project(project)
|
40
|
-
user =
|
41
|
-
Factory(:
|
45
|
+
user = Factory(:user)
|
46
|
+
membership = Factory(:membership, :user => user,
|
47
|
+
:account => account,
|
48
|
+
:admin => true)
|
49
|
+
Factory(:permission, :membership => membership,
|
50
|
+
:project => project)
|
51
|
+
sign_in_as user
|
42
52
|
end
|
43
53
|
end
|
44
54
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saucy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- thoughtbot, inc.
|
@@ -17,13 +17,14 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-12-
|
20
|
+
date: 2010-12-17 00:00:00 -05:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
24
|
+
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
|
26
|
+
name: formtastic
|
27
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
28
|
none: false
|
28
29
|
requirements:
|
29
30
|
- - ">="
|
@@ -33,12 +34,12 @@ dependencies:
|
|
33
34
|
- 1
|
34
35
|
- 2
|
35
36
|
version: "1.2"
|
36
|
-
|
37
|
-
version_requirements: *id001
|
37
|
+
requirement: *id001
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
39
|
+
type: :runtime
|
40
40
|
prerelease: false
|
41
|
-
|
41
|
+
name: railties
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
43
|
none: false
|
43
44
|
requirements:
|
44
45
|
- - ">="
|
@@ -49,12 +50,12 @@ dependencies:
|
|
49
50
|
- 0
|
50
51
|
- 3
|
51
52
|
version: 3.0.3
|
52
|
-
|
53
|
-
version_requirements: *id002
|
53
|
+
requirement: *id002
|
54
54
|
- !ruby/object:Gem::Dependency
|
55
|
-
|
55
|
+
type: :development
|
56
56
|
prerelease: false
|
57
|
-
|
57
|
+
name: aruba
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
58
59
|
none: false
|
59
60
|
requirements:
|
60
61
|
- - "="
|
@@ -65,9 +66,8 @@ dependencies:
|
|
65
66
|
- 2
|
66
67
|
- 6
|
67
68
|
version: 0.2.6
|
68
|
-
|
69
|
-
|
70
|
-
description: BLAH BLAH BLAH
|
69
|
+
requirement: *id003
|
70
|
+
description: Clearance-based Rails engine for Software as a Service (Saas) that provides account and project management
|
71
71
|
email: support@thoughtbot.com
|
72
72
|
executables: []
|
73
73
|
|
@@ -76,92 +76,93 @@ extensions: []
|
|
76
76
|
extra_rdoc_files: []
|
77
77
|
|
78
78
|
files:
|
79
|
+
- Gemfile
|
79
80
|
- Gemfile.lock
|
81
|
+
- Rakefile
|
80
82
|
- README
|
81
|
-
- Gemfile
|
82
83
|
- config/routes.rb
|
83
|
-
- app/
|
84
|
-
- app/
|
85
|
-
- app/
|
84
|
+
- app/controllers/accounts_controller.rb
|
85
|
+
- app/controllers/invitations_controller.rb
|
86
|
+
- app/controllers/memberships_controller.rb
|
87
|
+
- app/controllers/plans_controller.rb
|
88
|
+
- app/controllers/profiles_controller.rb
|
89
|
+
- app/models/invitation.rb
|
90
|
+
- app/models/membership.rb
|
91
|
+
- app/models/permission.rb
|
92
|
+
- app/models/signup.rb
|
93
|
+
- app/views/accounts/_account.html.erb
|
94
|
+
- app/views/accounts/_blank_slate.html.erb
|
86
95
|
- app/views/accounts/_projects.html.erb
|
87
|
-
- app/views/accounts/edit.html.erb
|
88
96
|
- app/views/accounts/_tab_bar.html.erb
|
89
|
-
- app/views/accounts/
|
90
|
-
- app/views/accounts/_account.html.erb
|
97
|
+
- app/views/accounts/edit.html.erb
|
91
98
|
- app/views/accounts/index.html.erb
|
99
|
+
- app/views/accounts/new.html.erb
|
92
100
|
- app/views/invitation_mailer/invitation.text.erb
|
93
|
-
- app/views/
|
101
|
+
- app/views/invitations/new.html.erb
|
102
|
+
- app/views/invitations/show.html.erb
|
103
|
+
- app/views/memberships/edit.html.erb
|
94
104
|
- app/views/memberships/index.html.erb
|
95
|
-
- app/views/
|
105
|
+
- app/views/plans/index.html.erb
|
96
106
|
- app/views/profiles/_inputs.html.erb
|
97
|
-
- app/views/
|
107
|
+
- app/views/profiles/edit.html.erb
|
108
|
+
- app/views/projects/_form.html.erb
|
98
109
|
- app/views/projects/edit.html.erb
|
99
110
|
- app/views/projects/index.html.erb
|
100
|
-
- app/views/projects/
|
101
|
-
- app/views/permissions/edit.html.erb
|
102
|
-
- app/controllers/profiles_controller.rb
|
103
|
-
- app/controllers/accounts_controller.rb
|
104
|
-
- app/controllers/memberships_controller.rb
|
105
|
-
- app/controllers/plans_controller.rb
|
106
|
-
- app/controllers/invitations_controller.rb
|
107
|
-
- app/controllers/permissions_controller.rb
|
108
|
-
- app/models/project_membership.rb
|
109
|
-
- app/models/invitation.rb
|
110
|
-
- app/models/signup.rb
|
111
|
-
- app/models/account_membership.rb
|
112
|
-
- lib/generators/saucy/views/views_generator.rb
|
111
|
+
- app/views/projects/new.html.erb
|
113
112
|
- lib/generators/saucy/base.rb
|
114
|
-
- lib/generators/saucy/install/install_generator.rb
|
115
|
-
- lib/generators/saucy/install/templates/create_saucy_tables.rb
|
116
|
-
- lib/generators/saucy/install/templates/controllers/projects_controller.rb
|
117
|
-
- lib/generators/saucy/install/templates/models/project.rb
|
118
|
-
- lib/generators/saucy/install/templates/models/plan.rb
|
119
|
-
- lib/generators/saucy/install/templates/models/account.rb
|
120
|
-
- lib/generators/saucy/install/templates/models/invitation_mailer.rb
|
121
113
|
- lib/generators/saucy/features/features_generator.rb
|
122
114
|
- lib/generators/saucy/features/templates/factories.rb
|
115
|
+
- lib/generators/saucy/features/templates/step_definitions/email_steps.rb
|
123
116
|
- lib/generators/saucy/features/templates/step_definitions/factory_girl_steps.rb
|
124
117
|
- lib/generators/saucy/features/templates/step_definitions/html_steps.rb
|
125
|
-
- lib/generators/saucy/features/templates/step_definitions/session_steps.rb
|
126
118
|
- lib/generators/saucy/features/templates/step_definitions/project_steps.rb
|
127
|
-
- lib/generators/saucy/features/templates/step_definitions/
|
119
|
+
- lib/generators/saucy/features/templates/step_definitions/session_steps.rb
|
128
120
|
- lib/generators/saucy/features/templates/step_definitions/user_steps.rb
|
129
|
-
- lib/saucy.rb
|
130
|
-
- lib/saucy/
|
121
|
+
- lib/generators/saucy/install/install_generator.rb
|
122
|
+
- lib/generators/saucy/install/templates/controllers/projects_controller.rb
|
123
|
+
- lib/generators/saucy/install/templates/create_saucy_tables.rb
|
124
|
+
- lib/generators/saucy/install/templates/models/account.rb
|
125
|
+
- lib/generators/saucy/install/templates/models/invitation_mailer.rb
|
126
|
+
- lib/generators/saucy/install/templates/models/plan.rb
|
127
|
+
- lib/generators/saucy/install/templates/models/project.rb
|
128
|
+
- lib/generators/saucy/views/views_generator.rb
|
129
|
+
- lib/saucy/account.rb
|
131
130
|
- lib/saucy/account_authorization.rb
|
132
131
|
- lib/saucy/configuration.rb
|
133
132
|
- lib/saucy/engine.rb
|
134
|
-
- lib/saucy/
|
133
|
+
- lib/saucy/layouts.rb
|
135
134
|
- lib/saucy/plan.rb
|
136
|
-
- lib/saucy/
|
137
|
-
- lib/saucy/user.rb
|
135
|
+
- lib/saucy/project.rb
|
138
136
|
- lib/saucy/projects_controller.rb
|
137
|
+
- lib/saucy/user.rb
|
138
|
+
- lib/saucy.rb
|
139
139
|
- features/run_features.feature
|
140
|
-
- features/support/file.rb
|
141
|
-
- features/support/env.rb
|
142
|
-
- features/step_definitions/rails_steps.rb
|
143
140
|
- features/step_definitions/clearance_steps.rb
|
144
|
-
-
|
141
|
+
- features/step_definitions/rails_steps.rb
|
142
|
+
- features/support/env.rb
|
143
|
+
- features/support/file.rb
|
144
|
+
- spec/controllers/accounts_controller_spec.rb
|
145
145
|
- spec/controllers/application_controller_spec.rb
|
146
146
|
- spec/controllers/invitations_controller_spec.rb
|
147
|
-
- spec/controllers/accounts_controller_spec.rb
|
148
147
|
- spec/controllers/memberships_controller_spec.rb
|
149
|
-
- spec/controllers/permissions_controller_spec.rb
|
150
148
|
- spec/controllers/profiles_controller_spec.rb
|
151
149
|
- spec/controllers/projects_controller_spec.rb
|
150
|
+
- spec/environment.rb
|
152
151
|
- spec/layouts_spec.rb
|
153
|
-
- spec/saucy_spec.rb
|
154
|
-
- spec/support/clearance_matchers.rb
|
155
|
-
- spec/support/authorization_helpers.rb
|
156
|
-
- spec/support/authentication_helpers.rb
|
157
|
-
- spec/models/user_spec.rb
|
158
|
-
- spec/models/signup_spec.rb
|
159
|
-
- spec/models/project_spec.rb
|
160
|
-
- spec/models/project_membership_spec.rb
|
161
|
-
- spec/models/invitation_spec.rb
|
162
152
|
- spec/models/account_spec.rb
|
163
|
-
- spec/models/
|
153
|
+
- spec/models/invitation_spec.rb
|
154
|
+
- spec/models/membership_spec.rb
|
155
|
+
- spec/models/permission_spec.rb
|
156
|
+
- spec/models/project_spec.rb
|
157
|
+
- spec/models/signup_spec.rb
|
158
|
+
- spec/models/user_spec.rb
|
159
|
+
- spec/saucy_spec.rb
|
160
|
+
- spec/scaffold/config/routes.rb
|
164
161
|
- spec/spec_helper.rb
|
162
|
+
- spec/support/authentication_helpers.rb
|
163
|
+
- spec/support/authorization_helpers.rb
|
164
|
+
- spec/support/clearance_matchers.rb
|
165
|
+
- spec/views/accounts/_account.html.erb_spec.rb
|
165
166
|
has_rdoc: true
|
166
167
|
homepage: http://github.com/thoughtbot/saucy
|
167
168
|
licenses: []
|
@@ -195,10 +196,10 @@ rubyforge_project:
|
|
195
196
|
rubygems_version: 1.3.7
|
196
197
|
signing_key:
|
197
198
|
specification_version: 3
|
198
|
-
summary:
|
199
|
+
summary: Clearance-based Rails engine for SaaS
|
199
200
|
test_files:
|
200
201
|
- features/run_features.feature
|
201
|
-
- features/support/file.rb
|
202
|
-
- features/support/env.rb
|
203
|
-
- features/step_definitions/rails_steps.rb
|
204
202
|
- features/step_definitions/clearance_steps.rb
|
203
|
+
- features/step_definitions/rails_steps.rb
|
204
|
+
- features/support/env.rb
|
205
|
+
- features/support/file.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class PermissionsController < ApplicationController
|
2
|
-
before_filter :authorize_admin
|
3
|
-
layout Saucy::Layouts.to_proc
|
4
|
-
|
5
|
-
def edit
|
6
|
-
@user = User.find(params[:user_id])
|
7
|
-
@projects = current_account.projects_by_name
|
8
|
-
render
|
9
|
-
end
|
10
|
-
|
11
|
-
def update
|
12
|
-
user = User.find(params[:user_id])
|
13
|
-
user.update_permissions_for(current_account, params[:permissions][:project_ids])
|
14
|
-
flash[:success] = "Permissions updated."
|
15
|
-
redirect_to account_memberships_url(current_account)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class ProjectMembership < ActiveRecord::Base
|
2
|
-
belongs_to :user
|
3
|
-
belongs_to :project
|
4
|
-
|
5
|
-
validate :ensure_account_member
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def ensure_account_member
|
10
|
-
unless user.member_of?(project.account)
|
11
|
-
errors.add(:base, "This user is not a member of #{project.name}'s account")
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|