saucy 0.1.11 → 0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/accounts_controller.rb +1 -1
- data/app/models/signup.rb +3 -3
- data/app/views/accounts/edit.html.erb +1 -1
- data/app/views/accounts/new.html.erb +1 -1
- data/app/views/invitations/new.html.erb +1 -0
- data/app/views/projects/_form.html.erb +1 -1
- data/lib/generators/saucy/features/templates/factories.rb +4 -4
- data/lib/generators/saucy/features/templates/features/manage_projects.feature +1 -1
- data/lib/generators/saucy/features/templates/features/new_account.feature +6 -6
- data/lib/generators/saucy/features/templates/features/sign_up.feature +1 -1
- data/lib/generators/saucy/install/templates/create_saucy_tables.rb +4 -2
- data/lib/saucy/account.rb +7 -10
- data/lib/saucy/account_authorization.rb +2 -2
- data/lib/saucy/project.rb +4 -4
- data/lib/saucy/projects_controller.rb +3 -3
- data/spec/controllers/application_controller_spec.rb +1 -1
- data/spec/controllers/invitations_controller_spec.rb +2 -2
- data/spec/controllers/memberships_controller_spec.rb +1 -1
- data/spec/controllers/projects_controller_spec.rb +1 -1
- data/spec/models/account_spec.rb +7 -12
- data/spec/models/project_spec.rb +7 -7
- data/spec/models/signup_spec.rb +2 -2
- metadata +3 -3
data/app/models/signup.rb
CHANGED
@@ -7,8 +7,8 @@ class Signup
|
|
7
7
|
|
8
8
|
FIELDS = {
|
9
9
|
:account => {
|
10
|
-
:name
|
11
|
-
:
|
10
|
+
:name => :account_name,
|
11
|
+
:keyword => :keyword,
|
12
12
|
},
|
13
13
|
:user => {
|
14
14
|
:name => :user_name,
|
@@ -18,7 +18,7 @@ class Signup
|
|
18
18
|
}
|
19
19
|
}.freeze
|
20
20
|
|
21
|
-
attr_accessor :account_name, :
|
21
|
+
attr_accessor :account_name, :keyword, :user_name, :email, :password,
|
22
22
|
:password_confirmation
|
23
23
|
|
24
24
|
def initialize(attributes = {})
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<h5 class="legend">Basic Information</h5>
|
7
7
|
<%= form.inputs do %>
|
8
8
|
<%= form.input :account_name, :label => 'Company Name' %>
|
9
|
-
<%= form.input :
|
9
|
+
<%= form.input :keyword, :hint => "#{root_url}/accounts/<span>accounturl</span>" %>
|
10
10
|
<% end %>
|
11
11
|
|
12
12
|
<% unless signed_in? -%>
|
@@ -14,8 +14,8 @@ Factory.define :user do |user|
|
|
14
14
|
end
|
15
15
|
|
16
16
|
Factory.define :account do |f|
|
17
|
-
f.name
|
18
|
-
f.
|
17
|
+
f.name { Factory.next(:name) }
|
18
|
+
f.keyword { Factory.next(:name) }
|
19
19
|
end
|
20
20
|
|
21
21
|
Factory.define :membership do |f|
|
@@ -25,7 +25,7 @@ end
|
|
25
25
|
|
26
26
|
Factory.define :signup do |f|
|
27
27
|
f.account_name { Factory.next(:name) }
|
28
|
-
f.
|
28
|
+
f.keyword { Factory.next(:name) }
|
29
29
|
f.user_name { "test user" }
|
30
30
|
f.email { Factory.next :email }
|
31
31
|
f.password { "password" }
|
@@ -35,7 +35,7 @@ end
|
|
35
35
|
Factory.define :project do |f|
|
36
36
|
f.association :account
|
37
37
|
f.name { Factory.next(:name) }
|
38
|
-
f.
|
38
|
+
f.keyword { Factory.next(:name) }
|
39
39
|
end
|
40
40
|
|
41
41
|
Factory.define :permission do |f|
|
@@ -12,7 +12,7 @@ Feature: Manage Projects
|
|
12
12
|
When I go to the projects page for the "Test" account
|
13
13
|
And I follow "New Project"
|
14
14
|
And I fill in "Name" with "Project 1"
|
15
|
-
And I fill in "
|
15
|
+
And I fill in "Keyword" with "project1"
|
16
16
|
And I press "Create"
|
17
17
|
And I go to the projects page for the "Test" account
|
18
18
|
Then I should see "Project 1" within "ul.projects"
|
@@ -9,13 +9,13 @@ Feature: user adds a new account
|
|
9
9
|
And I fill in "Email" with "user@example.com"
|
10
10
|
And I fill in "Password" with "test"
|
11
11
|
And I fill in "Company Name" with "Robots"
|
12
|
-
And I fill in "
|
12
|
+
And I fill in "Keyword" with "robots"
|
13
13
|
And I press "Sign up"
|
14
14
|
Then I should see "created"
|
15
15
|
But I should not see "Instructions for confirming"
|
16
16
|
When I go to the settings page
|
17
17
|
And I follow "Robots"
|
18
|
-
Then the "
|
18
|
+
Then the "Keyword" field should contain "robots"
|
19
19
|
|
20
20
|
Scenario: sign up for two accounts
|
21
21
|
When I go to the sign up page for the "Free" plan
|
@@ -24,21 +24,21 @@ Feature: user adds a new account
|
|
24
24
|
And I fill in "Confirm password" with "password"
|
25
25
|
And I fill in "Your name" with "Robot"
|
26
26
|
And I fill in "Company Name" with "Robots, Inc"
|
27
|
-
And I fill in "
|
27
|
+
And I fill in "Keyword" with "robots"
|
28
28
|
And I press "Sign up"
|
29
29
|
Then I should see "created"
|
30
30
|
When I go to the settings page
|
31
31
|
And I follow "Robots, Inc"
|
32
|
-
Then the "
|
32
|
+
Then the "Keyword" field should contain "robots"
|
33
33
|
When I go to the settings page
|
34
34
|
And I follow "Add new account"
|
35
35
|
And I follow "Free"
|
36
36
|
And I fill in "Company Name" with "Machines"
|
37
|
-
And I fill in "
|
37
|
+
And I fill in "Keyword" with "machines"
|
38
38
|
And I press "Sign up"
|
39
39
|
Then I should see "created"
|
40
40
|
But I should not see "Instructions for confirming"
|
41
41
|
When I go to the settings page
|
42
42
|
And I follow "Machines"
|
43
|
-
Then the "
|
43
|
+
Then the "Keyword" field should contain "machines"
|
44
44
|
|
@@ -22,6 +22,6 @@ Feature: Sign up
|
|
22
22
|
And I fill in "Confirm password" with "password"
|
23
23
|
And I fill in "Your name" with "Robot"
|
24
24
|
And I fill in "Company Name" with "Robots, Inc"
|
25
|
-
And I fill in "
|
25
|
+
And I fill in "Keyword" with "robotsinc"
|
26
26
|
And I press "Sign up"
|
27
27
|
Then I should see "created"
|
@@ -13,11 +13,12 @@ class CreateSaucyTables < ActiveRecord::Migration
|
|
13
13
|
create_table :accounts do |table|
|
14
14
|
table.belongs_to :plan
|
15
15
|
table.string :name
|
16
|
-
table.string :
|
16
|
+
table.string :keyword
|
17
17
|
table.datetime :created_at
|
18
18
|
table.datetime :updated_at
|
19
19
|
end
|
20
20
|
add_index :accounts, :plan_id
|
21
|
+
add_index :accounts, :keyword
|
21
22
|
|
22
23
|
create_table :invitations do |table|
|
23
24
|
table.string :email
|
@@ -42,11 +43,12 @@ class CreateSaucyTables < ActiveRecord::Migration
|
|
42
43
|
|
43
44
|
create_table :projects do |table|
|
44
45
|
table.string :name
|
45
|
-
table.string :
|
46
|
+
table.string :keyword
|
46
47
|
table.integer :account_id
|
47
48
|
table.datetime :created_at
|
48
49
|
table.datetime :updated_at
|
49
50
|
end
|
51
|
+
add_index :projects, :keyword
|
50
52
|
|
51
53
|
alter_table :users do |table|
|
52
54
|
table.string :name, :default => ""
|
data/lib/saucy/account.rb
CHANGED
@@ -12,22 +12,19 @@ module Saucy
|
|
12
12
|
|
13
13
|
belongs_to :plan
|
14
14
|
|
15
|
-
validates_uniqueness_of :name, :
|
16
|
-
validates_presence_of :name, :
|
15
|
+
validates_uniqueness_of :name, :keyword
|
16
|
+
validates_presence_of :name, :keyword
|
17
17
|
|
18
|
-
attr_accessible :name, :
|
18
|
+
attr_accessible :name, :keyword
|
19
19
|
|
20
|
-
validates_format_of
|
21
|
-
|
22
|
-
|
23
|
-
validates_exclusion_of :url,
|
24
|
-
:in => %w[app admin blog dev ftp mail pop pop3 imap smtp staging stats status www],
|
25
|
-
:message => 'is reserved.'
|
20
|
+
validates_format_of :keyword,
|
21
|
+
:with => %r{^[a-z0-9]+$},
|
22
|
+
:message => "must be only lower case letters."
|
26
23
|
end
|
27
24
|
|
28
25
|
module InstanceMethods
|
29
26
|
def to_param
|
30
|
-
|
27
|
+
keyword
|
31
28
|
end
|
32
29
|
|
33
30
|
def has_member?(user)
|
@@ -11,11 +11,11 @@ module Saucy
|
|
11
11
|
protected
|
12
12
|
|
13
13
|
def current_account
|
14
|
-
::Account.
|
14
|
+
::Account.find_by_keyword!(params[:account_id])
|
15
15
|
end
|
16
16
|
|
17
17
|
def current_project
|
18
|
-
::Project.
|
18
|
+
::Project.find_by_keyword!(params[:project_id])
|
19
19
|
end
|
20
20
|
|
21
21
|
def authorize_admin
|
data/lib/saucy/project.rb
CHANGED
@@ -7,11 +7,11 @@ module Saucy
|
|
7
7
|
has_many :permissions, :dependent => :destroy
|
8
8
|
has_many :users, :through => :permissions
|
9
9
|
|
10
|
-
validates_presence_of :account_id, :
|
10
|
+
validates_presence_of :account_id, :keyword, :name
|
11
11
|
|
12
|
-
validates_uniqueness_of :
|
12
|
+
validates_uniqueness_of :keyword, :scope => :account_id
|
13
13
|
|
14
|
-
validates_format_of :
|
14
|
+
validates_format_of :keyword,
|
15
15
|
:with => %r{^[a-z0-9]+$},
|
16
16
|
:message => "must be only lower case letters."
|
17
17
|
|
@@ -37,7 +37,7 @@ module Saucy
|
|
37
37
|
|
38
38
|
module InstanceMethods
|
39
39
|
def to_param
|
40
|
-
|
40
|
+
keyword
|
41
41
|
end
|
42
42
|
|
43
43
|
def has_member?(user)
|
@@ -23,11 +23,11 @@ module Saucy
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def edit
|
26
|
-
@project = ::Project.
|
26
|
+
@project = ::Project.find_by_keyword!(params[:id])
|
27
27
|
end
|
28
28
|
|
29
29
|
def update
|
30
|
-
@project = ::Project.
|
30
|
+
@project = ::Project.find_by_keyword!(params[:id])
|
31
31
|
if @project.update_attributes params[:project]
|
32
32
|
flash[:success] = 'Project was updated.'
|
33
33
|
redirect_to account_projects_url(current_account)
|
@@ -37,7 +37,7 @@ module Saucy
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def destroy
|
40
|
-
@project = ::Project.
|
40
|
+
@project = ::Project.find_by_keyword!(params[:id])
|
41
41
|
@project.destroy
|
42
42
|
flash[:success] = "Project has been deleted"
|
43
43
|
redirect_to account_projects_url(@project.account)
|
@@ -5,7 +5,7 @@ describe ApplicationController do
|
|
5
5
|
describe "with a valid account id in the params" do
|
6
6
|
before do
|
7
7
|
@account = Factory(:account)
|
8
|
-
@controller.stubs(:params).returns(:account_id => @account.
|
8
|
+
@controller.stubs(:params).returns(:account_id => @account.to_param)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should return the corresponding account from current_account" do
|
@@ -27,7 +27,7 @@ describe InvitationsController, "new", :as => :account_admin do
|
|
27
27
|
let(:projects) { ['one', 'two'] }
|
28
28
|
|
29
29
|
before do
|
30
|
-
Account.stubs(:
|
30
|
+
Account.stubs(:find_by_keyword! => account)
|
31
31
|
account.stubs(:projects_by_name => projects)
|
32
32
|
Invitation.stubs(:new => invitation)
|
33
33
|
get :new, :account_id => account.to_param
|
@@ -81,7 +81,7 @@ describe InvitationsController, "invalid create", :as => :account_admin do
|
|
81
81
|
before do
|
82
82
|
Invitation.stubs(:new => invitation)
|
83
83
|
invitation.stubs(:save => false)
|
84
|
-
Account.stubs(:
|
84
|
+
Account.stubs(:find_by_keyword! => account)
|
85
85
|
account.stubs(:projects_by_name => projects)
|
86
86
|
post :create, :account_id => account.to_param, :invitation => {}
|
87
87
|
end
|
@@ -26,7 +26,7 @@ describe MembershipsController, "index", :as => :account_admin do
|
|
26
26
|
let(:memberships) { [Factory.stub(:membership), Factory.stub(:membership)] }
|
27
27
|
|
28
28
|
before do
|
29
|
-
Account.stubs(:
|
29
|
+
Account.stubs(:find_by_keyword! => account)
|
30
30
|
account.stubs(:memberships_by_name => memberships)
|
31
31
|
get :index, :account_id => account.to_param
|
32
32
|
end
|
@@ -91,7 +91,7 @@ describe ProjectsController, "index", :as => :account_admin do
|
|
91
91
|
let(:projects) { ['one', 'two'] }
|
92
92
|
|
93
93
|
before do
|
94
|
-
Account.stubs(:
|
94
|
+
Account.stubs(:find_by_keyword! => account)
|
95
95
|
account.stubs(:projects => projects)
|
96
96
|
get :index, :account_id => account.to_param
|
97
97
|
end
|
data/spec/models/account_spec.rb
CHANGED
@@ -8,30 +8,25 @@ describe Account do
|
|
8
8
|
it { should have_many(:projects) }
|
9
9
|
|
10
10
|
it { should validate_uniqueness_of(:name) }
|
11
|
-
it { should validate_uniqueness_of(:
|
11
|
+
it { should validate_uniqueness_of(:keyword) }
|
12
12
|
it { should validate_presence_of( :name) }
|
13
|
-
it { should validate_presence_of(:
|
13
|
+
it { should validate_presence_of(:keyword) }
|
14
14
|
|
15
15
|
it { should_not allow_mass_assignment_of(:id) }
|
16
16
|
it { should_not allow_mass_assignment_of(:updated_at) }
|
17
17
|
it { should_not allow_mass_assignment_of(:created_at) }
|
18
|
-
it { should allow_mass_assignment_of(:
|
18
|
+
it { should allow_mass_assignment_of(:keyword) }
|
19
19
|
|
20
20
|
[nil, "", "a b", "a.b", "a%b"].each do |value|
|
21
|
-
it { should_not allow_value(value).for(:
|
22
|
-
end
|
23
|
-
|
24
|
-
["admin", "blog", "dev", "ftp", "mail", "pop", "pop3", "imap", "smtp",
|
25
|
-
"staging", "stats", "status","www"].each do |value|
|
26
|
-
it { should_not allow_value(value).for(:url).with_message(/reserved/i) }
|
21
|
+
it { should_not allow_value(value).for(:keyword).with_message(/letters/i) }
|
27
22
|
end
|
28
23
|
|
29
24
|
["foo", "f00", "37signals"].each do |value|
|
30
|
-
it { should allow_value(value).for(:
|
25
|
+
it { should allow_value(value).for(:keyword) }
|
31
26
|
end
|
32
27
|
|
33
|
-
it "should give its
|
34
|
-
subject.to_param.should == subject.
|
28
|
+
it "should give its keyword for to_param" do
|
29
|
+
subject.to_param.should == subject.keyword
|
35
30
|
end
|
36
31
|
|
37
32
|
it "finds admin users" do
|
data/spec/models/project_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Project do
|
|
5
5
|
it { should validate_presence_of(:account_id) }
|
6
6
|
it { should have_many(:permissions) }
|
7
7
|
it { should have_many(:users).through(:permissions) }
|
8
|
-
it { should validate_presence_of(:
|
8
|
+
it { should validate_presence_of(:keyword) }
|
9
9
|
it { should validate_presence_of(:name) }
|
10
10
|
|
11
11
|
it "finds projects visible to a user" do
|
@@ -31,22 +31,22 @@ describe Project do
|
|
31
31
|
Project.by_name.map(&:name).should == %w(abc def ghi)
|
32
32
|
end
|
33
33
|
|
34
|
-
it "should give its
|
34
|
+
it "should give its keyword for to_param" do
|
35
35
|
project = Factory(:project)
|
36
|
-
project.to_param.should == project.
|
36
|
+
project.to_param.should == project.keyword
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
describe Project, "
|
40
|
+
describe Project, "keyword uniqueness" do
|
41
41
|
let(:project) { Factory(:project) }
|
42
42
|
subject do
|
43
43
|
Factory.build(:project, :account => project.account)
|
44
44
|
end
|
45
45
|
|
46
|
-
it "validates uniqueness of it's
|
47
|
-
subject.
|
46
|
+
it "validates uniqueness of it's keyword" do
|
47
|
+
subject.keyword = project.keyword
|
48
48
|
subject.save
|
49
|
-
subject.errors[:
|
49
|
+
subject.errors[:keyword].should include("has already been taken")
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
data/spec/models/signup_spec.rb
CHANGED
@@ -10,11 +10,11 @@ describe Signup do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
describe Signup, "with attributes in the constructor" do
|
13
|
-
subject { Signup.new(:user_name => 'Joe', :account_name => 'blokes', :
|
13
|
+
subject { Signup.new(:user_name => 'Joe', :account_name => 'blokes', :keyword => 'blk') }
|
14
14
|
it "assigns attributes" do
|
15
15
|
subject.user_name.should == 'Joe'
|
16
16
|
subject.account_name.should == 'blokes'
|
17
|
-
subject.
|
17
|
+
subject.keyword.should == 'blk'
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
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: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 12
|
10
|
+
version: 0.1.12
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- thoughtbot, inc.
|