bookkeeper 0.0.1 → 0.0.2

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 (36) hide show
  1. data/README.md +1 -1
  2. data/app/controllers/bookkeeper/search_controller.rb +11 -0
  3. data/app/models/bookkeeper/purchase.rb +2 -0
  4. data/app/views/bookkeeper/purchases/_search.html.erb +6 -0
  5. data/app/views/bookkeeper/purchases/index.html.erb +3 -0
  6. data/app/views/bookkeeper/search/create.html.erb +31 -0
  7. data/config/locales/en.yml +6 -0
  8. data/config/routes.rb +1 -0
  9. data/lib/bookkeeper/version.rb +1 -1
  10. data/spec/controllers/bookkeeper/purchases_controller_spec.rb +38 -34
  11. data/spec/controllers/bookkeeper/search_controller_spec.rb +33 -0
  12. data/spec/dummy/log/development.log +0 -0
  13. data/spec/dummy/log/test.log +6237 -0
  14. metadata +8 -45
  15. data/spec/dummy/public/uploads/receipt.jpg +0 -0
  16. data/spec/dummy/public/uploads/thumb_receipt.jpg +0 -0
  17. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-0153/receipt.jpg +0 -0
  18. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-0153/thumb_receipt.jpg +0 -0
  19. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-1009/receipt.jpg +0 -0
  20. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-1009/thumb_receipt.jpg +0 -0
  21. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-2120/receipt.jpg +0 -0
  22. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-2120/thumb_receipt.jpg +0 -0
  23. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-2714/receipt.jpg +0 -0
  24. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-2714/thumb_receipt.jpg +0 -0
  25. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-3081/receipt.jpg +0 -0
  26. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-3081/thumb_receipt.jpg +0 -0
  27. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-3658/receipt.jpg +0 -0
  28. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-3658/thumb_receipt.jpg +0 -0
  29. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-5761/receipt.jpg +0 -0
  30. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-5761/thumb_receipt.jpg +0 -0
  31. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-6301/receipt.jpg +0 -0
  32. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-6301/thumb_receipt.jpg +0 -0
  33. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-8404/receipt.jpg +0 -0
  34. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-8404/thumb_receipt.jpg +0 -0
  35. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-9318/receipt.jpg +0 -0
  36. data/spec/dummy/public/uploads/tmp/20130223-1958-61501-9318/thumb_receipt.jpg +0 -0
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Bookkeeper
1
+ # Bookkeeper [![Build Status](https://secure.travis-ci.org/tommyblue/Bookkeeper.png?branch=master)](http://travis-ci.org/tommyblue/Bookkeeper) [![Dependency Status](https://gemnasium.com/tommyblue/Bookkeeper.png)](https://gemnasium.com/tommyblue/Bookkeeper) [![Code Climate](https://codeclimate.com/github/tommyblue/Bookkeeper.png)](https://codeclimate.com/github/tommyblue/Bookkeeper)
2
2
 
3
3
  Bookkeeper is a Rails engine with the aim of allowing a Rails application (at least 3.1) to handle the purchases you made and their receipt.
4
4
 
@@ -0,0 +1,11 @@
1
+ require_dependency "bookkeeper/application_controller"
2
+
3
+ module Bookkeeper
4
+ class SearchController < ApplicationController
5
+ def create
6
+ @q = params[:search][:q]
7
+ query = "%#{@q}%"
8
+ @results = Purchase.where("title LIKE ? OR description LIKE ?", query, query)
9
+ end
10
+ end
11
+ end
@@ -7,5 +7,7 @@ module Bookkeeper
7
7
  validates_presence_of :title
8
8
  validates_numericality_of :warranty_duration, allow_nil: true
9
9
  validates_date :purchase_date, allow_nil: true, allow_blank: true
10
+
11
+ default_scope order('created_at DESC')
10
12
  end
11
13
  end
@@ -0,0 +1,6 @@
1
+ <div class="pull-right">
2
+ <%= form_tag search_index_path, class: "navbar-search pull-left" do %>
3
+ <%= text_field_tag 'search[q]', '', class: 'search-query', placeholder: t('.search') %>
4
+ <% end %>
5
+ </div>
6
+
@@ -1,3 +1,4 @@
1
+ <%= render partial: 'search' %>
1
2
  <h1><%= t '.title' %></h1>
2
3
 
3
4
  <table class='table table-striped table-condensed table-bordered'>
@@ -8,6 +9,7 @@
8
9
  <th><%=t 'bookkeeper.models.purchase.attributes.purchase_date' %></th>
9
10
  <th><%=t 'bookkeeper.models.purchase.attributes.warranty_duration' %></th>
10
11
  <th><%=t 'bookkeeper.models.purchase.attributes.receipt' %></th>
12
+ <th><%=t 'bookkeeper.models.purchase.attributes.updated_at' %></th>
11
13
  <th></th>
12
14
  </tr>
13
15
  </thead>
@@ -19,6 +21,7 @@
19
21
  <td><%=l purchase.purchase_date rescue '' %></td>
20
22
  <td><%= purchase.warranty_duration %> <%=t '.months' %></td>
21
23
  <td><%= link_to "<i class='icon-download-alt'></i> #{purchase.receipt.file.filename}".html_safe, purchase.receipt.url, class: 'btn btn-mini' if purchase.receipt.file %></td>
24
+ <td><%=l purchase.updated_at, format: :short rescue '' %></td>
22
25
  <td>
23
26
  <%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_purchase_path(purchase), class: 'btn btn-mini' %>
24
27
  <%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, purchase, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-mini btn-danger' %>
@@ -0,0 +1,31 @@
1
+ <h1><%= t '.title', q: @q %></h1>
2
+
3
+ <table class='table table-striped table-condensed table-bordered'>
4
+ <thead>
5
+ <tr>
6
+ <th><%=t 'bookkeeper.models.purchase.attributes.title' %></th>
7
+ <th><%=t 'bookkeeper.models.purchase.attributes.description' %></th>
8
+ <th><%=t 'bookkeeper.models.purchase.attributes.purchase_date' %></th>
9
+ <th><%=t 'bookkeeper.models.purchase.attributes.warranty_duration' %></th>
10
+ <th><%=t 'bookkeeper.models.purchase.attributes.receipt' %></th>
11
+ <th></th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% @results.each do |purchase| %>
16
+ <tr>
17
+ <td><%= purchase.title %></td>
18
+ <td><%= purchase.description %></td>
19
+ <td><%=l purchase.purchase_date rescue '' %></td>
20
+ <td><%= purchase.warranty_duration %> <%=t '.months' %></td>
21
+ <td><%= link_to "<i class='icon-download-alt'></i> #{purchase.receipt.file.filename}".html_safe, purchase.receipt.url, class: 'btn btn-mini' if purchase.receipt.file %></td>
22
+ <td>
23
+ <%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_purchase_path(purchase), class: 'btn btn-mini' %>
24
+ <%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, purchase, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-mini btn-danger' %>
25
+ </td>
26
+ </tr>
27
+ <% end %>
28
+ </tbody>
29
+ </table>
30
+ <br />
31
+ <%= link_to ('<i class="icon-arrow-left"></i> ' + t('bookkeeper.actions.back')).html_safe, purchases_path, class: 'btn' %>
@@ -17,6 +17,7 @@ en:
17
17
  purchase_date: 'Purchase date'
18
18
  warranty_duration: 'Warranty duration'
19
19
  receipt: 'Receipt'
20
+ updated_at: 'Last update'
20
21
  # controllers
21
22
  controllers:
22
23
  purchases:
@@ -24,6 +25,9 @@ en:
24
25
  updated: 'Purchase was successfully updated.'
25
26
  destroyed: 'Purchase was successfully deleted.'
26
27
  # views
28
+ search:
29
+ create:
30
+ title: 'Search results for "%{q}"'
27
31
  purchases:
28
32
  index:
29
33
  title: 'Listing purchases'
@@ -32,3 +36,5 @@ en:
32
36
  title: 'New purchase'
33
37
  edit:
34
38
  title: 'Edit purchase'
39
+ search:
40
+ search: 'Search'
data/config/routes.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  Bookkeeper::Engine.routes.draw do
2
2
  resources :purchases
3
+ resources :search, only: [:create]
3
4
  end
@@ -1,3 +1,3 @@
1
1
  module Bookkeeper
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,46 +2,50 @@ require 'spec_helper'
2
2
 
3
3
  module Bookkeeper
4
4
  describe PurchasesController do
5
- def valid_session
6
- {}
7
- end
8
-
9
5
  describe "GET index" do
10
6
  it "assigns all purchases as @purchases" do
11
7
  purchase = create(:bookkeeper_purchase)
12
- get :index, { use_route: :purchases }, valid_session
8
+ get :index, { use_route: :purchases }
13
9
  expect(assigns(:purchases)).to match_array [purchase]
14
10
  end
15
11
 
16
12
  it "renders the :index template" do
17
13
  purchase = create(:bookkeeper_purchase)
18
- get :index, { use_route: :purchases }, valid_session
14
+ get :index, { use_route: :purchases }
19
15
  expect(response).to render_template :index
20
16
  end
21
- end
22
17
 
23
- describe "GET show" do
24
- it "assigns the requested purchase as @purchase" do
25
- purchase = create(:bookkeeper_purchase)
26
- get :show, { id: purchase.to_param, use_route: :purchases }, valid_session
27
- expect(assigns(:purchase)).to eq purchase
18
+ it "shows all purchases ordered by creation" do
19
+ first_purchase = create(:bookkeeper_purchase)
20
+ last_purchase = create(:bookkeeper_purchase)
21
+ get :index, { use_route: :purchases }
22
+ expect(assigns(:purchases)).to eq([last_purchase, first_purchase])
28
23
  end
29
24
 
30
- it "renders the :show template" do
31
- purchase = create(:bookkeeper_purchase)
32
- get :show, { id: purchase.to_param, use_route: :purchases }, valid_session
33
- expect(response).to render_template :show
34
- end
35
25
  end
36
26
 
27
+ # describe "GET show" do
28
+ # it "assigns the requested purchase as @purchase" do
29
+ # purchase = create(:bookkeeper_purchase)
30
+ # get :show, { id: purchase.to_param, use_route: :purchases }
31
+ # expect(assigns(:purchase)).to eq purchase
32
+ # end
33
+
34
+ # it "renders the :show template" do
35
+ # purchase = create(:bookkeeper_purchase)
36
+ # get :show, { id: purchase.to_param, use_route: :purchases }
37
+ # expect(response).to render_template :show
38
+ # end
39
+ # end
40
+
37
41
  describe "GET new" do
38
42
  it "assigns a new purchase as @purchase" do
39
- get :new, { use_route: :purchases }, valid_session
43
+ get :new, { use_route: :purchases }
40
44
  expect(assigns(:purchase)).to be_a_new(Purchase)
41
45
  end
42
46
 
43
47
  it "renders the :new template" do
44
- get :new, { use_route: :purchases }, valid_session
48
+ get :new, { use_route: :purchases }
45
49
  expect(response).to render_template :new
46
50
  end
47
51
  end
@@ -49,13 +53,13 @@ module Bookkeeper
49
53
  describe "GET edit" do
50
54
  it "assigns the requested purchase as @purchase" do
51
55
  purchase = create(:bookkeeper_purchase)
52
- get :edit, { id: purchase.to_param, use_route: :purchases }, valid_session
56
+ get :edit, { id: purchase.to_param, use_route: :purchases }
53
57
  expect(assigns(:purchase)).to eq(purchase)
54
58
  end
55
59
 
56
60
  it "renders the :edit template" do
57
61
  purchase = create(:bookkeeper_purchase)
58
- get :edit, { id: purchase.to_param, use_route: :purchases }, valid_session
62
+ get :edit, { id: purchase.to_param, use_route: :purchases }
59
63
  expect(response).to render_template :edit
60
64
  end
61
65
  end
@@ -64,18 +68,18 @@ module Bookkeeper
64
68
  describe "with valid params" do
65
69
  it "creates a new Purchase" do
66
70
  expect {
67
- post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}, valid_session
71
+ post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}
68
72
  }.to change(Purchase, :count).by(1)
69
73
  end
70
74
 
71
75
  it "assigns a newly created purchase as @purchase" do
72
- post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}, valid_session
76
+ post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}
73
77
  expect(assigns(:purchase)).to be_a(Purchase)
74
78
  expect(assigns(:purchase)).to be_persisted
75
79
  end
76
80
 
77
81
  it "redirects to the purchases page" do
78
- post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}, valid_session
82
+ post :create, {purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}
79
83
  expect(response).to redirect_to :purchases
80
84
  end
81
85
  end
@@ -83,17 +87,17 @@ module Bookkeeper
83
87
  describe "with invalid params" do
84
88
  it "does not save the new Purchase" do
85
89
  expect {
86
- post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}, valid_session
90
+ post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}
87
91
  }.to_not change(Purchase, :count).by(1)
88
92
  end
89
93
 
90
94
  it "assigns a newly created but unsaved purchase as @purchase" do
91
- post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}, valid_session
95
+ post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}
92
96
  expect(assigns(:purchase)).to be_a_new(Purchase)
93
97
  end
94
98
 
95
99
  it "re-renders the 'new' template" do
96
- post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}, valid_session
100
+ post :create, {purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}
97
101
  expect(response).to render_template :new
98
102
  end
99
103
  end
@@ -107,30 +111,30 @@ module Bookkeeper
107
111
 
108
112
  describe "with valid params" do
109
113
  it "updates the requested purchase" do
110
- put :update, {id: @purchase, use_route: :purchases, purchase: attributes_for(:bookkeeper_purchase)}, valid_session
114
+ put :update, {id: @purchase, use_route: :purchases, purchase: attributes_for(:bookkeeper_purchase)}
111
115
  expect(assigns(:purchase)).to eq(@purchase)
112
116
  end
113
117
 
114
118
  it "assigns the requested purchase as @purchase" do
115
- put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}, valid_session
119
+ put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}
116
120
  expect(assigns(:purchase)).to eq(@purchase)
117
121
  end
118
122
 
119
123
  it "redirects to the purchase" do
120
- put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}, valid_session
124
+ put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_purchase), use_route: :purchases}
121
125
  expect(response).to redirect_to(:purchases)
122
126
  end
123
127
  end
124
128
 
125
129
  describe "with invalid params" do
126
130
  it "assigns the purchase as @purchase" do
127
- put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}, valid_session
131
+ put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}
128
132
  @purchase.reload
129
133
  expect(@purchase.title).to eq(@purchase_title)
130
134
  end
131
135
 
132
136
  it "re-renders the 'edit' template" do
133
- put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}, valid_session
137
+ put :update, {id: @purchase.to_param, purchase: attributes_for(:bookkeeper_invalid_purchase), use_route: :purchases}
134
138
  expect(response).to render_template :edit
135
139
  end
136
140
  end
@@ -142,12 +146,12 @@ module Bookkeeper
142
146
  end
143
147
  it "destroys the requested purchase" do
144
148
  expect {
145
- delete :destroy, {id: @purchase.to_param, use_route: :purchases}, valid_session
149
+ delete :destroy, {id: @purchase.to_param, use_route: :purchases}
146
150
  }.to change(Purchase, :count).by(-1)
147
151
  end
148
152
 
149
153
  it "redirects to the purchases list" do
150
- delete :destroy, {id: @purchase.to_param, use_route: :purchases}, valid_session
154
+ delete :destroy, {id: @purchase.to_param, use_route: :purchases}
151
155
  expect(response).to redirect_to :purchases
152
156
  end
153
157
  end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ module Bookkeeper
4
+ describe SearchController do
5
+ describe "POST create" do
6
+ describe "with search results" do
7
+ it "assigns the researched term as @q" do
8
+ post :create, {search: {q: 'searchable'}, use_route: :purchases}
9
+ expect(assigns(:q)).to eq('searchable')
10
+ end
11
+ it "Finds the purchase by title" do
12
+ purchase = create(:bookkeeper_purchase, title: 'My searchable purchase')
13
+ post :create, {search: {q: 'searchable'}, use_route: :purchases}
14
+ expect(assigns(:results)).to eq([purchase])
15
+ end
16
+ it "Finds the purchase by description" do
17
+ purchase = create(:bookkeeper_purchase, description: 'My searchable purchase')
18
+ post :create, {search: {q: 'searchable'}, use_route: :purchases}
19
+ expect(assigns(:results)).to eq([purchase])
20
+ end
21
+ end
22
+
23
+ describe "without search results" do
24
+ it "Doesn't find the purchase" do
25
+ purchase = create(:bookkeeper_purchase, title: 'My searchable purchase')
26
+ post :create, {search: {q: 'unsearchable'}, use_route: :purchases}
27
+ expect(assigns(:results)).to eq([])
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
File without changes