days 0.2.0 → 1.0.0.rc1

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +21 -4
  3. data/app/javascripts/admin/bootstrap.min.js +7 -0
  4. data/app/javascripts/jquery-2.1.3.min.js +4 -0
  5. data/app/stylesheets/admin/bootstrap-theme.min.css +5 -0
  6. data/app/stylesheets/admin/bootstrap.min.css +5 -0
  7. data/app/stylesheets/admin/login.scss +3 -5
  8. data/app/stylesheets/admin.scss +4 -0
  9. data/app/views/admin/categories.haml +3 -3
  10. data/app/views/admin/entries/form.haml +22 -17
  11. data/app/views/admin/entries/index.haml +46 -28
  12. data/app/views/admin/login.haml +11 -8
  13. data/app/views/admin/setup.haml +16 -9
  14. data/app/views/admin.haml +31 -21
  15. data/days.gemspec +14 -11
  16. data/lib/days/app/admin/entries.rb +11 -5
  17. data/lib/days/app/entries.rb +24 -13
  18. data/lib/days/app.rb +2 -3
  19. data/lib/days/command.rb +1 -1
  20. data/lib/days/config.rb +18 -5
  21. data/lib/days/helpers.rb +13 -11
  22. data/lib/days/models/base.rb +11 -0
  23. data/lib/days/models/category.rb +2 -2
  24. data/lib/days/models/entry.rb +41 -8
  25. data/lib/days/models/user.rb +2 -2
  26. data/lib/days/version.rb +1 -1
  27. data/scripts/tumblr_export.rb +1 -1
  28. data/spec/controllers/admin/categories_spec.rb +22 -22
  29. data/spec/controllers/admin/entries_spec.rb +155 -44
  30. data/spec/controllers/admin/session_spec.rb +16 -25
  31. data/spec/controllers/admin/setup_spec.rb +22 -25
  32. data/spec/controllers/admin/users_spec.rb +39 -40
  33. data/spec/controllers/entries_spec.rb +71 -42
  34. data/spec/helpers_spec.rb +18 -29
  35. data/spec/models/entry_spec.rb +117 -47
  36. data/spec/shared/admin.rb +2 -2
  37. data/spec/spec_helper.rb +25 -25
  38. metadata +111 -86
  39. data/app/javascripts/bootstrap.js +0 -2159
  40. data/app/javascripts/bootstrap.min.js +0 -6
  41. data/app/javascripts/jquery-1.8.3.min.js +0 -2
  42. data/app/stylesheets/bootstrap-responsive.css +0 -1092
  43. data/app/stylesheets/bootstrap-responsive.min.css +0 -9
  44. data/app/stylesheets/bootstrap.css +0 -6039
  45. data/app/stylesheets/bootstrap.min.css +0 -9
@@ -2,8 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Days::App, type: :controller do
4
4
  describe "admin: users" do
5
- fixtures :users
6
- let(:user) { users(:blogger) }
5
+ let(:user) { Days::User.create!(login_name: 'blogger', name: 'blogger', password: 'x', password_confirmation: 'x') }
7
6
 
8
7
  before { login(user) }
9
8
 
@@ -12,13 +11,13 @@ describe Days::App, type: :controller do
12
11
 
13
12
  it_behaves_like 'an admin page'
14
13
 
15
- it { should be_ok }
14
+ it { is_expected.to be_ok }
16
15
 
17
16
  it "lists up users" do
18
- render[:data].should == :'admin/users/index'
17
+ expect(render[:data]).to eq(:'admin/users/index')
19
18
 
20
19
  users = render[:ivars][:@users]
21
- users.should == Days::User.all
20
+ expect(users).to eq(Days::User.all)
22
21
  end
23
22
  end
24
23
 
@@ -27,19 +26,18 @@ describe Days::App, type: :controller do
27
26
 
28
27
  it_behaves_like 'an admin page'
29
28
 
30
- it { should be_ok }
29
+ it { is_expected.to be_ok }
31
30
 
32
31
  it "renders form page" do
33
- render[:data].should == :'admin/users/form'
32
+ expect(render[:data]).to eq(:'admin/users/form')
34
33
  user = render[:ivars][:@user]
35
- user.should be_a(Days::User)
36
- user.should be_new_record
34
+ expect(user).to be_a(Days::User)
35
+ expect(user).to be_new_record
37
36
  end
38
37
  end
39
38
 
40
39
  describe "POST /admin/users" do
41
40
  subject { post '/admin/users', params, env }
42
- let(:user) { Days::User.last }
43
41
  let(:user_params) do
44
42
  {
45
43
  name: "Writer", login_name: "writer",
@@ -51,26 +49,26 @@ describe Days::App, type: :controller do
51
49
  it_behaves_like 'an admin page'
52
50
 
53
51
  it "creates user" do
54
- subject.should be_redirect
52
+ expect(subject).to be_redirect
55
53
 
56
54
  user = Days::User.last
57
- user.name.should == "Writer"
58
- user.login_name.should == "writer"
55
+ expect(user.name).to eq("Writer")
56
+ expect(user.login_name).to eq("writer")
59
57
  end
60
58
 
61
59
  context "when user is invalid" do
62
60
  before do
63
- Days::User.any_instance.stub(:valid? => false, :save => false)
61
+ allow_any_instance_of(Days::User).to receive_messages(:valid? => false, :save => false)
64
62
  end
65
63
 
66
- specify { subject.status.should == 406 } # not acceptable
64
+ specify { expect(subject.status).to eq(406) } # not acceptable
67
65
 
68
66
  it "renders form" do
69
- render[:data].should == :'admin/users/form'
67
+ expect(render[:data]).to eq(:'admin/users/form')
70
68
  iuser = render[:ivars][:@user]
71
- iuser.should be_a_new_record
72
- iuser.name.should == 'Writer'
73
- iuser.login_name.should == 'writer'
69
+ expect(iuser).to be_a_new_record
70
+ expect(iuser.name).to eq('Writer')
71
+ expect(iuser.login_name).to eq('writer')
74
72
  end
75
73
  end
76
74
  end
@@ -81,14 +79,15 @@ describe Days::App, type: :controller do
81
79
  it_behaves_like 'an admin page'
82
80
 
83
81
  it "renders form page" do
84
- render[:data].should == :'admin/users/form'
85
- render[:ivars][:@user].should == user
82
+ expect(render[:data]).to eq(:'admin/users/form')
83
+ expect(render[:ivars][:@user]).to eq(user)
86
84
  end
87
85
 
88
86
  context "with invalid user" do
89
- let(:user) { double.tap { |_| _.stub(id: Days::User.last.id.succ) } }
87
+ let(:user2) { Days::User.create!(login_name: 'blogger2', name: 'blogger2', password: 'x', password_confirmation: 'x') }
88
+ before { login(user2); user.destroy }
90
89
 
91
- it { should be_not_found }
90
+ it { is_expected.to be_not_found }
92
91
  end
93
92
  end
94
93
 
@@ -101,45 +100,46 @@ describe Days::App, type: :controller do
101
100
  it_behaves_like 'an admin page'
102
101
 
103
102
  it "updates user" do
104
- subject.should be_redirect
105
- URI.parse(subject['Location']).path.should == path
103
+ expect(subject).to be_redirect
104
+ expect(URI.parse(subject['Location']).path).to eq(path)
106
105
 
107
106
  user.reload
108
- user.name.should == 'Newbie'
107
+ expect(user.name).to eq('Newbie')
109
108
  end
110
109
 
111
110
  context "when invalid" do
112
111
  before do
113
- Days::User.any_instance.stub(:valid? => false, :save => false)
112
+ allow_any_instance_of(Days::User).to receive_messages(:valid? => false, :save => false)
114
113
  end
115
114
 
116
115
  it "renders form" do
117
- render[:data].should == :'admin/users/form'
116
+ expect(render[:data]).to eq(:'admin/users/form')
118
117
  iuser = render[:ivars][:@user]
119
- iuser.id.should == user.id
120
- iuser.name.should == 'Newbie'
118
+ expect(iuser.id).to eq(user.id)
119
+ expect(iuser.name).to eq('Newbie')
121
120
  end
122
121
  end
123
122
 
124
123
  context "with invalid user" do
125
- let(:user) { double.tap { |_| _.stub(id: Days::User.last.id.succ) } }
124
+ let(:user2) { Days::User.create!(login_name: 'blogger2', name: 'blogger2', password: 'x', password_confirmation: 'x') }
125
+ before { login(user2); user.destroy }
126
126
 
127
- it { should be_not_found }
127
+ it { is_expected.to be_not_found }
128
128
  end
129
129
  end
130
130
 
131
131
  describe "DELETE /admin/users/:id" do
132
- let(:another_user) { users(:writer) }
132
+ let!(:another_user) { Days::User.create!(login_name: 'blogger2', name: 'blogger2', password: 'x', password_confirmation: 'x') }
133
133
  subject { delete "/admin/users/#{another_user.id}", {}, env }
134
134
 
135
135
  it_behaves_like 'an admin page'
136
136
 
137
137
  it "destroys user" do
138
138
  expect { subject }.to change { Days::User.count }.by(-1)
139
- Days::User.where(id: another_user.id).count.should be_zero
139
+ expect(Days::User.where(id: another_user.id).count).to be_zero
140
140
 
141
- subject.should be_redirect
142
- URI.parse(subject.location).path.should == "/admin/users"
141
+ expect(subject).to be_redirect
142
+ expect(URI.parse(subject.location).path).to eq("/admin/users")
143
143
  end
144
144
 
145
145
  context "when tried to delete myself" do
@@ -148,15 +148,14 @@ describe Days::App, type: :controller do
148
148
  it "doesn't destroy" do
149
149
  expect { subject }.to_not change { Days::User.count }
150
150
 
151
- subject.status.should == 400
151
+ expect(subject.status).to eq(400)
152
152
  end
153
153
  end
154
154
 
155
155
  context "with invalid user" do
156
- subject { delete "/admin/users/#{user.id}", {}, env }
157
- let(:user) { users(:blogger).tap(&:destroy) }
156
+ before { another_user.destroy }
158
157
 
159
- it { should be_not_found }
158
+ it { is_expected.to be_not_found }
160
159
  end
161
160
  end
162
161
  end
@@ -2,54 +2,58 @@ require 'spec_helper'
2
2
 
3
3
  describe Days::App, type: :controller do
4
4
  describe "entry page" do
5
- fixtures :categories, :entries
6
5
  let(:path) { '/2012/12/slug' }
7
6
  subject { get path, {}, {} }
8
7
 
9
8
  before do
10
- Days::App.any_instance.should_receive(:lookup_entry).at_least(:once).with(path).and_return(result)
9
+ expect_any_instance_of(Days::App).to receive(:lookup_entry).at_least(:once).with(path).and_return(result)
11
10
  end
12
11
 
13
- let(:result) { entries(:entry_one) }
12
+ let(:result) { Days::Entry.create!(title: 'foo', body: 'foo') }
14
13
 
15
- it { should be_ok }
14
+ it { is_expected.to be_ok }
16
15
 
17
16
  it "renders entry.haml" do
18
- render[:data].should == :entry
19
- render[:options][:locals][:entry].should == result
17
+ expect(render[:data]).to eq(:entry)
18
+ expect(render[:options][:locals][:entry]).to eq(result)
20
19
  end
21
20
 
22
21
  context "when lookup_entry returned nil" do
23
22
  let(:result) { nil }
24
23
 
25
- it { should be_not_found }
24
+ it { is_expected.to be_not_found }
26
25
  end
27
26
 
28
27
  context "when lookup_entry returned Array" do
29
- let(:result) { [entries(:entry_one), entries(:entry_two)] }
28
+ let(:result) {
29
+ [
30
+ Days::Entry.create!(title: 'foo', body: 'foo'),
31
+ Days::Entry.create!(title: 'foo2', body: 'foo')
32
+ ]
33
+ }
30
34
 
31
- it { should be_ok }
35
+ it { is_expected.to be_ok }
32
36
 
33
37
  it "renders entry.haml" do
34
- render[:data].should == :entries
35
- render[:ivars][:@entries].should == result
38
+ expect(render[:data]).to eq(:entries)
39
+ expect(render[:ivars][:@entries]).to eq(result)
36
40
  end
37
41
  end
38
42
  end
39
43
 
40
44
  describe "redirection from old path" do
41
- fixtures :categories, :entries
42
45
  let(:path) { nil }
43
46
  subject { get path, {}, {} }
44
47
 
45
48
  before do
46
- Days::App.any_instance.stub(lookup_entry: nil)
49
+ allow_any_instance_of(Days::App).to receive_messages(lookup_entry: nil)
50
+ Days::Entry.create!(title: 'new', body: 'foo', old_path: '/post/old-path', published_at: Time.local(2012,11,30,0,0,0))
47
51
  end
48
52
 
49
53
  context "when entry not found" do
50
54
  let(:path) { '/post/like-old-but-not-exists' }
51
55
 
52
- it { should be_not_found }
56
+ it { is_expected.to be_not_found }
53
57
  end
54
58
 
55
59
  context "when entry found by old path" do
@@ -57,98 +61,123 @@ describe Days::App, type: :controller do
57
61
 
58
62
  it "redirects to present path" do
59
63
  expect(subject.status).to eq 301
60
- expect(subject['Location']).to eq '/2012/11/today-is-a-rainy-day'
64
+ expect(subject['Location']).to eq '/2012/11/new'
61
65
  end
62
66
  end
63
67
  end
64
68
 
65
69
  describe "GET /:year/:month" do
66
- fixtures :categories, :entries
67
70
  subject { get '/2012/12', params }
68
71
  let(:params) { {} }
69
72
 
70
- it { should be_ok }
73
+ before do
74
+ Days::Entry.create!(title: '1', body: 'a', published_at: Time.local(2012, 11, 15, 0, 0, 0))
75
+ Days::Entry.create!(title: '2', body: 'a', published_at: Time.local(2012, 12, 25, 0, 0, 0))
76
+ Days::Entry.create!(title: '3', body: 'a', published_at: Time.local(2012, 12, 5, 0, 0, 0))
77
+ end
78
+
79
+ it { is_expected.to be_ok }
71
80
 
72
81
  it "renders entries" do
73
- render[:data].should == :entries
82
+ expect(render[:data]).to eq(:entries)
74
83
 
75
84
  base = Time.local(2012, 12, 1, 0, 0, 0)
76
85
  range = (base.beginning_of_month .. base.end_of_month)
77
- render[:ivars][:@entries].to_a.should == Days::Entry.where(published_at: range).published.to_a
78
- render[:ivars][:@entries].current_page.should == 1
86
+ expect(render[:ivars][:@entries].to_a).to eq(Days::Entry.where(published_at: range).published.to_a)
87
+ expect(render[:ivars][:@entries].current_page).to eq(1)
79
88
  end
80
89
 
81
90
  context "with page param" do
82
91
  let(:params) { {page: 2} }
83
92
 
84
93
  it "renders entries" do
85
- render[:data].should == :entries
86
- render[:ivars][:@entries].current_page.should == 2
94
+ expect(render[:data]).to eq(:entries)
95
+ expect(render[:ivars][:@entries].current_page).to eq(2)
87
96
  end
88
97
  end
89
98
 
90
99
  context "with character" do
91
100
  it "returns not found" do
92
- get('/aaa/01').should be_not_found
93
- get('/2012/bbb').should be_not_found
94
- get('/aaa/bbb').should be_not_found
101
+ expect(get('/aaa/01')).to be_not_found
102
+ expect(get('/2012/bbb')).to be_not_found
103
+ expect(get('/aaa/bbb')).to be_not_found
95
104
  end
96
105
  end
97
106
  end
98
107
 
99
108
  describe "GET /category/:name" do
100
- fixtures :categories, :entries
101
- subject { get '/category/daily', params }
109
+ subject { get '/category/cat', params }
102
110
  let(:params) { {} }
103
111
 
104
- it { should be_ok }
112
+ it { is_expected.to be_ok }
113
+
114
+ let!(:category) { Days::Category.create!(name: 'cat') }
115
+ let!(:entry) { Days::Entry.create!(title: 'a', body: 'a', categories: [category]) }
105
116
 
106
117
  it "renders entries" do
107
- render[:data].should == :entries
118
+ expect(render[:data]).to eq(:entries)
108
119
 
109
- render[:ivars][:@entries].to_a.should == categories(:daily).entries.published.to_a
110
- render[:ivars][:@entries].current_page.should == 1
120
+ expect(render[:ivars][:@entries].to_a).to eq(category.entries.reload.published.to_a)
121
+ expect(render[:ivars][:@entries].current_page).to eq(1)
111
122
  end
112
123
 
113
124
  context "with page param" do
114
125
  let(:params) { {page: 2} }
115
126
 
116
127
  it "renders entries" do
117
- render[:data].should == :entries
118
- render[:ivars][:@entries].current_page.should == 2
128
+ expect(render[:data]).to eq(:entries)
129
+ expect(render[:ivars][:@entries].current_page).to eq(2)
119
130
  end
120
131
  end
121
132
  end
122
133
 
123
134
  describe "GET /" do
124
- fixtures :categories, :entries
125
135
  subject { get '/', params }
126
136
  let(:params) { {} }
127
137
 
138
+ before do
139
+ Days::Entry.create!(title: '1', body: 'a', published_at: Time.local(2012, 11, 15, 0, 0, 0))
140
+ Days::Entry.create!(title: '2', body: 'a', published_at: Time.local(2012, 12, 25, 0, 0, 0))
141
+ end
142
+
143
+ let!(:draft) do
144
+ Days::Entry.create!(title: '3', body: 'a', draft: true)
145
+ end
146
+
128
147
  it "renders entries" do
129
- render[:data].should == :entries
130
- render[:ivars][:@entries].current_page.should == 1
131
- render[:ivars][:@entries].should_not include(entries(:entry_draft))
148
+ expect(render[:data]).to eq(:entries)
149
+ expect(render[:ivars][:@entries].current_page).to eq(1)
150
+ expect(render[:ivars][:@entries]).not_to include(draft)
132
151
  end
133
152
 
134
153
  context "with page param" do
135
154
  let(:params) { {page: 2} }
136
155
 
137
156
  it "renders entries" do
138
- render[:data].should == :entries
139
- render[:ivars][:@entries].current_page.should == 2
157
+ expect(render[:data]).to eq(:entries)
158
+ expect(render[:ivars][:@entries].current_page).to eq(2)
140
159
  end
141
160
  end
142
161
  end
143
162
 
144
163
  describe "GET /feed" do
145
- fixtures :categories, :entries
146
164
  subject { get '/feed' }
147
165
 
148
- it { should be_ok }
166
+ it { is_expected.to be_ok }
167
+
168
+ specify do
169
+ expect(subject.content_type).to eq('application/atom+xml')
170
+ end
171
+ end
172
+
173
+ describe "GET /feed/category/:name" do
174
+ let!(:category) { Days::Category.create!(name: 'cat') }
175
+ subject { get '/feed/category/cat' }
176
+
177
+ it { is_expected.to be_ok }
149
178
 
150
179
  specify do
151
- subject.content_type.should == 'application/atom+xml'
180
+ expect(subject.content_type).to eq('application/atom+xml')
152
181
  end
153
182
  end
154
183
  end
data/spec/helpers_spec.rb CHANGED
@@ -6,35 +6,24 @@ describe Days::Helpers do
6
6
 
7
7
  let(:config) do
8
8
  double.tap do |_|
9
- _.stub(permalink: permalink)
9
+ allow(_).to receive_messages(permalink: permalink)
10
10
  end
11
11
  end
12
12
 
13
- let(:entry_a) do
14
- Days::Entry.where(slug: "sushi").first
15
- end
16
-
17
- let(:entry_b) do
18
- Days::Entry.where(slug: "neko").first
19
- end
20
-
21
- before(:all) do
22
- Days::Entry.destroy_all
23
- entry_a = Days::Entry.create(
13
+ let!(:entry_a) do
14
+ Days::Entry.create!(
24
15
  title: 'Sushi', body: 'Sushi!',
25
16
  published_at: Time.local(2012, 12, 31, 9, 24, 42),
26
17
  slug: "sushi"
27
18
  )
28
- entry_b = Days::Entry.create(
19
+ end
20
+
21
+ let!(:entry_b) do
22
+ Days::Entry.create!(
29
23
  title: 'Neko', body: 'Meow!',
30
24
  published_at: Time.local(2012, 12, 31, 19, 14, 32),
31
25
  slug: "neko"
32
26
  )
33
-
34
- end
35
-
36
- after(:all) do
37
- Days::Entry.destroy_all
38
27
  end
39
28
 
40
29
  let(:permalink) { "/{year}/{month}/{day}/{hour}/{minute}/{second}/{id}-{slug}" }
@@ -42,26 +31,26 @@ describe Days::Helpers do
42
31
  describe ".#entry_path" do
43
32
  subject { entry_path(entry_a) }
44
33
 
45
- it { should == "/2012/12/31/09/24/42/#{entry_a.id}-sushi" }
34
+ it { is_expected.to eq("/2012/12/31/09/24/42/#{entry_a.id}-sushi") }
46
35
 
47
36
  context "with invalid format (unbalanced parenthesis)" do
48
37
  let(:permalink) { "/{year}/{month}/{day/{hour}/{minute}/{second}/{id}-{slug" }
49
38
 
50
- it { should == "/2012/12/{day/09/24/42/#{entry_a.id}-{slug" }
39
+ it { is_expected.to eq("/2012/12/{day/09/24/42/#{entry_a.id}-{slug") }
51
40
  end
52
41
 
53
42
  context "with invalid format (invalid tag name)" do
54
43
  let(:permalink) { "/{foo}-{slug}" }
55
44
 
56
- it { should == "/-sushi" }
45
+ it { is_expected.to eq("/-sushi") }
57
46
  end
58
47
 
59
48
  context "with not published entry" do
60
49
  before do
61
- entry_a.stub(published?: false)
50
+ allow(entry_a).to receive_messages(published?: false)
62
51
  end
63
52
 
64
- it { should be_nil }
53
+ it { is_expected.to be_nil }
65
54
  end
66
55
  end
67
56
 
@@ -71,26 +60,26 @@ describe Days::Helpers do
71
60
 
72
61
  let(:path) { "/2012/12/31/09/24/42/#{entry_a.id}-sushi" }
73
62
 
74
- it { should == entry_a }
63
+ it { is_expected.to eq entry_a }
75
64
 
76
65
  context "with invalid link" do
77
66
  let(:path) { "/2012/12/31/09/24//#{entry_a.id}-sushi" }
78
67
 
79
- it { should be_nil }
68
+ it { is_expected.to be_nil }
80
69
  end
81
70
 
82
71
  context "with another format" do
83
72
  let(:permalink) { "/{year}/{month}/{day}/{slug}" }
84
73
  let(:path) { "/2012/12/31/sushi" }
85
74
 
86
- it { should == entry_a }
75
+ it { is_expected.to eq(entry_a) }
87
76
  end
88
77
 
89
78
  context "with invalid format (unbalanced parenthesis)" do
90
79
  let(:permalink) { "/{year}/{month}/{day/{slug}" }
91
80
  let(:path) { "/2012/12/31/sushi" }
92
81
 
93
- it { should be_nil }
82
+ it { is_expected.to be_nil }
94
83
  end
95
84
 
96
85
  context "with invalid format (invalid tag name)" do
@@ -102,7 +91,7 @@ describe Days::Helpers do
102
91
  let(:permalink) { "/{year}/{month}/{day}" }
103
92
  let(:path) { "/2012/12/31" }
104
93
 
105
- it { should == [entry_a, entry_b] }
94
+ it { is_expected.to eq([entry_a, entry_b]) }
106
95
  end
107
96
 
108
97
  context "when entry has not published" do
@@ -111,7 +100,7 @@ describe Days::Helpers do
111
100
  entry_a.save
112
101
  end
113
102
 
114
- it { should be_nil }
103
+ it { is_expected.to be_nil }
115
104
  end
116
105
  end
117
106
  end