moneyrail 0.1.4 → 0.1.5
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/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
|