moneyrail 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/app/controllers/home_controller.rb +5 -3
- data/app/controllers/stats_controller.rb +76 -28
- data/app/helpers/application_helper.rb +12 -2
- data/app/models/category.rb +8 -0
- data/app/views/home/index.html.erb +9 -2
- data/app/views/layouts/application.html.erb +7 -1
- data/app/views/stats/show.html.erb +35 -8
- data/config/environment.rb +1 -1
- data/config/routes.rb +6 -2
- data/moneyrail.gemspec +10 -6
- data/public/stylesheets/stats.less +13 -0
- data/test/functional/notes_controller_test.rb +45 -0
- data/test/unit/helpers/notes_helper_test.rb +4 -0
- data/test/unit/note_test.rb +8 -0
- metadata +7 -3
data/Rakefile
CHANGED
@@ -26,7 +26,7 @@ Jeweler::Tasks.new do |gemspec|
|
|
26
26
|
gemspec.homepage = "http://github.com/yhara/#{PROJECT_NAME}"
|
27
27
|
gemspec.description = gemspec.summary
|
28
28
|
gemspec.authors = ["Yutaka HARA"]
|
29
|
-
gemspec.add_dependency('rails', '= 2.3.
|
29
|
+
gemspec.add_dependency('rails', '= 2.3.5')
|
30
30
|
gemspec.add_dependency('ruby-station-runtime', '>= 0.0.4')
|
31
31
|
gemspec.add_dependency('less')
|
32
32
|
gemspec.add_dependency('sqlite3-ruby')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
@@ -1,9 +1,11 @@
|
|
1
1
|
class HomeController < ApplicationController
|
2
2
|
|
3
3
|
def index
|
4
|
-
|
5
|
-
collect_months(
|
6
|
-
append_current_month(
|
4
|
+
months = []
|
5
|
+
collect_months(months)
|
6
|
+
append_current_month(months)
|
7
|
+
|
8
|
+
@months = months.group_by(&:year)
|
7
9
|
end
|
8
10
|
|
9
11
|
private
|
@@ -1,56 +1,104 @@
|
|
1
1
|
class StatsController < ApplicationController
|
2
|
-
|
2
|
+
|
3
|
+
def month
|
4
|
+
@mode = :month
|
5
|
+
|
3
6
|
year = params[:year].to_i
|
4
7
|
month = params[:month].to_i
|
5
|
-
|
6
8
|
@month = Date.new(year, month)
|
7
|
-
@
|
9
|
+
@stat = make_month_stats(@month)
|
8
10
|
|
9
|
-
|
11
|
+
render :show
|
12
|
+
end
|
13
|
+
|
14
|
+
def year
|
15
|
+
@mode = :year
|
16
|
+
|
17
|
+
year = params[:year].to_i
|
18
|
+
@year = Date.new(year)
|
19
|
+
months = (0...12).map{|i| @year >> i}
|
20
|
+
@stat = make_year_stats(months)
|
10
21
|
|
11
|
-
|
22
|
+
render :show
|
23
|
+
end
|
24
|
+
|
25
|
+
def recent
|
26
|
+
@mode = :recent
|
27
|
+
|
28
|
+
now = DateTime.now.beginning_of_month
|
29
|
+
months = (0...12).map{|i| now << i}.reverse
|
30
|
+
@stat = make_year_stats(months)
|
31
|
+
|
32
|
+
render :show
|
12
33
|
end
|
13
34
|
|
14
35
|
private
|
15
36
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
37
|
+
def month_range(month)
|
38
|
+
month.beginning_of_month .. month.end_of_month
|
39
|
+
end
|
40
|
+
|
41
|
+
# - Expense Income
|
42
|
+
# - cat1 cat2 cat3 cat4 sum cat5 cat6 sum
|
43
|
+
# acc1 99 99 99 0 x 0 33 y
|
44
|
+
# acc2 12 34 567 8 x 9 0 y
|
20
45
|
# ------------------------------------
|
21
46
|
# sum
|
22
|
-
def
|
23
|
-
|
47
|
+
def make_month_stats(month)
|
48
|
+
rows = Account.all(:order => "position").map{|account|
|
49
|
+
items = Item.all(:conditions => {
|
50
|
+
:account_id => account.id,
|
51
|
+
:date => month_range(month),
|
52
|
+
:type => ["Expense", "Income"]
|
53
|
+
}).group_by(&:category)
|
24
54
|
|
25
|
-
|
55
|
+
make_row(account.name, items)
|
56
|
+
}
|
57
|
+
|
58
|
+
return rows.push make_sum_row(rows)
|
59
|
+
end
|
60
|
+
|
61
|
+
# - Expense Income
|
62
|
+
# month cat1 cat2 cat3 cat4 cat5 cat6
|
63
|
+
# 200901 99 99 99 0 0 33
|
64
|
+
# 200902 12 34 567 8 9 0
|
65
|
+
# ------------------------------------
|
66
|
+
# sum
|
67
|
+
def make_year_stats(months)
|
68
|
+
rows = months.map{|month|
|
69
|
+
items = Item.all(:conditions => {
|
70
|
+
:date => month_range(month),
|
71
|
+
:type => ["Expense", "Income"]
|
72
|
+
}).group_by(&:category)
|
26
73
|
|
27
|
-
|
28
|
-
make_stat_row(account, items)
|
74
|
+
make_row(month, items)
|
29
75
|
}
|
30
76
|
|
31
77
|
return rows.push make_sum_row(rows)
|
32
78
|
end
|
33
79
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
sum
|
41
|
-
else
|
42
|
-
0
|
43
|
-
end
|
80
|
+
def make_row(header, items)
|
81
|
+
expenses = Category.expenses.map{|category|
|
82
|
+
(items[category] || []).map(&:amount).sum
|
83
|
+
}
|
84
|
+
incomes = Category.incomes.map{|category|
|
85
|
+
(items[category] || []).map(&:amount).sum
|
44
86
|
}
|
45
|
-
|
87
|
+
|
88
|
+
[header] +
|
89
|
+
expenses +
|
90
|
+
[expenses.sum] +
|
91
|
+
incomes +
|
92
|
+
[incomes.sum] +
|
93
|
+
[incomes.sum - expenses.sum]
|
46
94
|
end
|
47
95
|
|
48
96
|
def make_sum_row(rows)
|
49
97
|
rows.transpose.map{|cells|
|
50
|
-
if cells.first.
|
51
|
-
""
|
52
|
-
else
|
98
|
+
if cells.first.is_a? Numeric
|
53
99
|
cells.sum
|
100
|
+
else
|
101
|
+
"sum"
|
54
102
|
end
|
55
103
|
}
|
56
104
|
end
|
@@ -8,6 +8,10 @@ module ApplicationHelper
|
|
8
8
|
d.strftime("%Y-%m")
|
9
9
|
end
|
10
10
|
|
11
|
+
def format_year(d)
|
12
|
+
d.strftime("%Y")
|
13
|
+
end
|
14
|
+
|
11
15
|
# (str, date) or (date)
|
12
16
|
def link_to_edit_logs(a, b=nil)
|
13
17
|
str, date = str_and_date(a, b)
|
@@ -21,10 +25,16 @@ module ApplicationHelper
|
|
21
25
|
link_to str, show_logs_path(:year => date.year, :month => date.month)
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
28
|
+
def link_to_show_month_stats(a, b=nil)
|
25
29
|
str, date = str_and_date(a, b)
|
26
30
|
|
27
|
-
link_to str,
|
31
|
+
link_to str, show_month_stats_path(:year => date.year, :month => date.month)
|
32
|
+
end
|
33
|
+
|
34
|
+
def link_to_show_year_stats(a, b=nil)
|
35
|
+
str, date = b ? [a, b] : [format_year(a), a]
|
36
|
+
|
37
|
+
link_to str, show_year_stats_path(:year => date.year)
|
28
38
|
end
|
29
39
|
|
30
40
|
private
|
data/app/models/category.rb
CHANGED
@@ -3,15 +3,22 @@
|
|
3
3
|
<li><%= link_to 'Categories', categories_path %></li>
|
4
4
|
<li><%= link_to 'Items', items_path %></li>
|
5
5
|
</ul>
|
6
|
+
|
7
|
+
<h2>Logs</h2>
|
8
|
+
<%= link_to 'Recent stats', show_recent_stats_path %>
|
9
|
+
|
10
|
+
<% @months.each do |year, months| %>
|
11
|
+
<h3><%= link_to_show_year_stats(Date.new(year)) %></h3>
|
6
12
|
<ul>
|
7
|
-
<%
|
13
|
+
<% months.each do |m| %>
|
8
14
|
<li>
|
9
15
|
<%= link_to "Logs: #{m.year}-#{m.month}",
|
10
16
|
show_logs_path(:year => m.year, :month => m.month) %>
|
11
17
|
<%= link_to "(edit)",
|
12
18
|
edit_logs_path(:year => m.year, :month => m.month) %>
|
13
19
|
<%= link_to "stats",
|
14
|
-
|
20
|
+
show_month_stats_path(:year => m.year, :month => m.month) %>
|
15
21
|
</li>
|
16
22
|
<% end %>
|
17
23
|
</ul>
|
24
|
+
<% end %>
|
@@ -7,7 +7,9 @@
|
|
7
7
|
|
8
8
|
<%= stylesheet_link_tag 'scaffold' %>
|
9
9
|
|
10
|
-
<%
|
10
|
+
<% case controller.controller_name
|
11
|
+
when "logs" %>
|
12
|
+
|
11
13
|
<title>MoneyRail : Logs: <%=h @year %>/<%=h @month %></title>
|
12
14
|
<%= stylesheet_link_tag 'editor' %>
|
13
15
|
|
@@ -17,6 +19,10 @@
|
|
17
19
|
<%= javascript_include_tag 'jquery' %>
|
18
20
|
<%= javascript_include_tag 'editor' %>
|
19
21
|
<% end %>
|
22
|
+
|
23
|
+
<% when "stats" %>
|
24
|
+
<%= stylesheet_link_tag 'stats' %>
|
25
|
+
|
20
26
|
<% else %>
|
21
27
|
<title>MoneyRail :
|
22
28
|
<%=h controller.controller_name.camelcase %>:
|
@@ -1,21 +1,48 @@
|
|
1
1
|
<h2>Statictics
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
<% case @mode ; when :year %>
|
3
|
+
<small><%= link_to_show_year_stats("<<", @year-365) %></small>
|
4
|
+
<%= format_year(@year) %>
|
5
|
+
<small><%= link_to_show_year_stats(">>", @year+365) %></small>
|
6
|
+
<% when :month %>
|
7
|
+
<small><%= link_to_show_month_stats("<<", @month << 1) %></small>
|
8
|
+
<%= format_month(@month) %>
|
9
|
+
<small><%= link_to_show_month_stats(">>", @month >> 1) %></small>
|
10
|
+
<% when :recent %>
|
11
|
+
(recent 12 months)
|
12
|
+
<% end %>
|
5
13
|
</h2>
|
6
14
|
|
7
|
-
<table>
|
15
|
+
<table class="stats">
|
16
|
+
<%# row 1: Expense and Income %>
|
17
|
+
<tr>
|
18
|
+
<th rowspan="2"></th>
|
19
|
+
<th colspan="<%= Category.expenses.size + 1 %>">Expense</th>
|
20
|
+
<th colspan="<%= Category.incomes.size + 1 %>">Income</th>
|
21
|
+
<th rowspan="2">sum</th>
|
22
|
+
</tr>
|
23
|
+
|
24
|
+
<%# row 2: Categories %>
|
8
25
|
<tr>
|
9
|
-
|
10
|
-
|
26
|
+
<% Category.expenses.each do |category| %>
|
27
|
+
<th><%=h category.name %></th>
|
28
|
+
<% end %>
|
29
|
+
<th>sum</th>
|
30
|
+
<% Category.incomes.each do |category| %>
|
11
31
|
<th><%=h category.name %></th>
|
12
32
|
<% end %>
|
33
|
+
<th>sum</th>
|
13
34
|
</tr>
|
14
35
|
|
36
|
+
<%# row 3-: stat %>
|
15
37
|
<% @stat.each do |row| %>
|
16
38
|
<tr>
|
17
|
-
<% row.each do |
|
18
|
-
|
39
|
+
<% row.each do |item| %>
|
40
|
+
<% case item
|
41
|
+
when Date %>
|
42
|
+
<td><%= link_to_show_month_stats(item) %></td>
|
43
|
+
<% else %>
|
44
|
+
<td><%=h item %></td>
|
45
|
+
<% end %>
|
19
46
|
<% end %>
|
20
47
|
</tr>
|
21
48
|
<% end %>
|
data/config/environment.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file
|
2
2
|
|
3
3
|
# Specifies gem version of Rails to use when vendor/rails is not present
|
4
|
-
RAILS_GEM_VERSION = '2.3.
|
4
|
+
RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
|
5
5
|
|
6
6
|
# Bootstrap the Rails environment, frameworks, and default configuration
|
7
7
|
require File.join(File.dirname(__FILE__), 'boot')
|
data/config/routes.rb
CHANGED
@@ -35,8 +35,12 @@ ActionController::Routing::Routes.draw do |map|
|
|
35
35
|
:controller => :logs, :action => 'view', :mode => :edit
|
36
36
|
|
37
37
|
# -- statistics
|
38
|
-
map.
|
39
|
-
:controller => :stats, :action => '
|
38
|
+
map.show_recent_stats 'stats/recent',
|
39
|
+
:controller => :stats, :action => 'recent'
|
40
|
+
map.show_month_stats 'stats/:year/:month',
|
41
|
+
:controller => :stats, :action => 'month'
|
42
|
+
map.show_year_stats 'stats/:year',
|
43
|
+
:controller => :stats, :action => 'year'
|
40
44
|
|
41
45
|
# The priority is based upon order of creation: first created -> highest priority.
|
42
46
|
|
data/moneyrail.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{moneyrail}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Yutaka HARA"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-02-09}
|
13
13
|
s.description = %q{Household account book, written in Rails}
|
14
14
|
s.email = %q{yutaka.hara/at/gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -102,6 +102,7 @@ Gem::Specification.new do |s|
|
|
102
102
|
"public/robots.txt",
|
103
103
|
"public/stylesheets/editor.less",
|
104
104
|
"public/stylesheets/scaffold.css",
|
105
|
+
"public/stylesheets/stats.less",
|
105
106
|
"script/about",
|
106
107
|
"script/autospec",
|
107
108
|
"script/console",
|
@@ -156,7 +157,10 @@ Gem::Specification.new do |s|
|
|
156
157
|
"spec/models/category_spec.rb",
|
157
158
|
"spec/models/income_spec.rb",
|
158
159
|
"spec/models/item_spec.rb",
|
159
|
-
"spec/spec_helper.rb"
|
160
|
+
"spec/spec_helper.rb",
|
161
|
+
"test/functional/notes_controller_test.rb",
|
162
|
+
"test/unit/helpers/notes_helper_test.rb",
|
163
|
+
"test/unit/note_test.rb"
|
160
164
|
]
|
161
165
|
|
162
166
|
if s.respond_to? :specification_version then
|
@@ -164,18 +168,18 @@ Gem::Specification.new do |s|
|
|
164
168
|
s.specification_version = 3
|
165
169
|
|
166
170
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
167
|
-
s.add_runtime_dependency(%q<rails>, ["= 2.3.
|
171
|
+
s.add_runtime_dependency(%q<rails>, ["= 2.3.5"])
|
168
172
|
s.add_runtime_dependency(%q<ruby-station-runtime>, [">= 0.0.4"])
|
169
173
|
s.add_runtime_dependency(%q<less>, [">= 0"])
|
170
174
|
s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
|
171
175
|
else
|
172
|
-
s.add_dependency(%q<rails>, ["= 2.3.
|
176
|
+
s.add_dependency(%q<rails>, ["= 2.3.5"])
|
173
177
|
s.add_dependency(%q<ruby-station-runtime>, [">= 0.0.4"])
|
174
178
|
s.add_dependency(%q<less>, [">= 0"])
|
175
179
|
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
176
180
|
end
|
177
181
|
else
|
178
|
-
s.add_dependency(%q<rails>, ["= 2.3.
|
182
|
+
s.add_dependency(%q<rails>, ["= 2.3.5"])
|
179
183
|
s.add_dependency(%q<ruby-station-runtime>, [">= 0.0.4"])
|
180
184
|
s.add_dependency(%q<less>, [">= 0"])
|
181
185
|
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class NotesControllerTest < ActionController::TestCase
|
4
|
+
test "should get index" do
|
5
|
+
get :index
|
6
|
+
assert_response :success
|
7
|
+
assert_not_nil assigns(:notes)
|
8
|
+
end
|
9
|
+
|
10
|
+
test "should get new" do
|
11
|
+
get :new
|
12
|
+
assert_response :success
|
13
|
+
end
|
14
|
+
|
15
|
+
test "should create note" do
|
16
|
+
assert_difference('Note.count') do
|
17
|
+
post :create, :note => { }
|
18
|
+
end
|
19
|
+
|
20
|
+
assert_redirected_to note_path(assigns(:note))
|
21
|
+
end
|
22
|
+
|
23
|
+
test "should show note" do
|
24
|
+
get :show, :id => notes(:one).to_param
|
25
|
+
assert_response :success
|
26
|
+
end
|
27
|
+
|
28
|
+
test "should get edit" do
|
29
|
+
get :edit, :id => notes(:one).to_param
|
30
|
+
assert_response :success
|
31
|
+
end
|
32
|
+
|
33
|
+
test "should update note" do
|
34
|
+
put :update, :id => notes(:one).to_param, :note => { }
|
35
|
+
assert_redirected_to note_path(assigns(:note))
|
36
|
+
end
|
37
|
+
|
38
|
+
test "should destroy note" do
|
39
|
+
assert_difference('Note.count', -1) do
|
40
|
+
delete :destroy, :id => notes(:one).to_param
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_redirected_to notes_path
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moneyrail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yutaka HARA
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-02-09 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - "="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 2.3.
|
23
|
+
version: 2.3.5
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby-station-runtime
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- public/robots.txt
|
148
148
|
- public/stylesheets/editor.less
|
149
149
|
- public/stylesheets/scaffold.css
|
150
|
+
- public/stylesheets/stats.less
|
150
151
|
- script/about
|
151
152
|
- script/autospec
|
152
153
|
- script/console
|
@@ -224,3 +225,6 @@ test_files:
|
|
224
225
|
- spec/models/income_spec.rb
|
225
226
|
- spec/models/item_spec.rb
|
226
227
|
- spec/spec_helper.rb
|
228
|
+
- test/functional/notes_controller_test.rb
|
229
|
+
- test/unit/helpers/notes_helper_test.rb
|
230
|
+
- test/unit/note_test.rb
|