thefox-wallet 0.8.2 → 0.9.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f25d2660b54e8632abc6d1eccf1b5eab45ce187e
4
- data.tar.gz: bf3d8220d2041a5bf2c287d79fdbe165b2c20f41
3
+ metadata.gz: b777e3c55bf57dfcef12a6f140f714b53ac43b91
4
+ data.tar.gz: 8c889702061c3f94edd2853d7f790233d4f1262c
5
5
  SHA512:
6
- metadata.gz: e900d5a0c2ac751250667e6a0f0740d78cf6d58cb06e26699370706196e3276d120622beecc5f1fc2cafccc21aa689e71bebd878c51e14b358ae5e3e452e52c6
7
- data.tar.gz: 33cac727648eae7e8e7189e6d1909d58f84ae6c8dbe2e20bcdeb4f1403988c2771a0a21297cc7cbd77532f470442c8aa555c45656e346718133d3719eba46dab
6
+ metadata.gz: c5658968fafe93f915466bc7f76dea49fb15b30fb6773ba6f41436a3512c3602c0b692ddc943423aef9fb1ef3b075f60c95971e86399acea52a09794e5a584e3
7
+ data.tar.gz: 300e6b51667e753e5fac037e8f9d34c56a4c90b726baa9954ef40a3098e911dc142ed826f7e38dbe1ea2cf230426de6a8f047e2534a82b8f4f8059867fb5993d
data/Makefile CHANGED
@@ -6,3 +6,6 @@ include Makefile.common
6
6
  .PHONY: test
7
7
  test:
8
8
  RUBYOPT=-w $(BUNDLER) exec ./tests/ts_all.rb
9
+
10
+ dev:
11
+ RUBYOPT=-rbundler/setup ruby ./bin/wallet
data/Makefile.common CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  # Ruby Common Big
3
- # 2015-12-21
3
+ # 2016-02-14
4
4
 
5
5
  MV = mv -nv
6
6
  RM = rm -rf
@@ -9,8 +9,8 @@ BUNDLER = bundle
9
9
  BUNDLER_OPTIONS = --jobs=5 --retry=3
10
10
  GEMSPEC_FILE = $(GEM_NAME).gemspec
11
11
 
12
- .PHONY: all $(ALL_TARGETS_EXT)
13
- all: setup
12
+ .PHONY: all
13
+ all: setup $(ALL_TARGETS_EXT)
14
14
 
15
15
  .PHONY: setup
16
16
  setup: .setup
data/README.md CHANGED
@@ -32,6 +32,7 @@ Use it in your sources:
32
32
 
33
33
  ## Project Links
34
34
 
35
+ - [Blog Post about Wallet](http://blog.fox21.at/2015/07/09/wallet.html)
35
36
  - [Gem](https://rubygems.org/gems/thefox-wallet)
36
37
  - [Travis CI Repository](https://travis-ci.org/TheFox/wallet)
37
38
 
data/bin/wallet CHANGED
@@ -1,205 +1,219 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'tempfile'
3
+ require 'pp'
4
+ require 'optparse'
4
5
  require 'wallet'
5
- require 'ArgsParser'
6
6
 
7
-
8
- parser = ArgsParser.parser
9
- parser.bind(:wallet, :w, 'Wallet', 'wallet')
10
- parser.bind(:title, :t, 'Title')
11
- parser.bind(:date, :d, 'Date', Date.today.to_s)
12
- parser.bind(:revenue, :r, 'Revenue', 0)
13
- parser.bind(:expense, :e, 'Expense', 0)
14
- parser.bind(:category, :c, 'Category')
15
- parser.bind(:comment, :o, 'Comment')
16
- parser.bind(:path, :p, 'Path')
17
-
18
- command, params = parser.parse(ARGV)
19
- command = command.to_s
20
-
21
- # puts 'command: ' + command.to_s
22
- # puts 'params: ' + params.to_s
23
- # puts
24
-
25
- # Command Aliases
26
- if command == 'i'
27
- command = 'int'
28
- elsif command == 'l'
29
- command = 'list'
30
- elsif command == 'lc'
31
- command = 'cat'
32
- end
33
-
34
- wallet = params[:wallet].to_s
35
- title = params[:title].to_s
36
- date = params[:date].to_s
37
- revenue = params[:revenue].to_s.gsub('.', '').sub(/,/, '.').to_f.round(3).abs
38
- category = params[:category].to_s
39
- comment = params[:comment].to_s
40
- path = params[:path].to_s
41
- import = params[:i]
42
-
43
- path_is_temp = false
44
-
45
- expense = 0.0
46
- export = false
47
- if params[:expense].is_a? TrueClass
48
- export = true
49
- else
50
- expense = -params[:expense].to_s.gsub('.', '').sub(/,/, '.').to_f.round(3).abs
51
- end
52
-
53
- # puts 'argv len: ' + ARGV.length.to_s
54
- # puts 'command: ' + '%-10s' % command.class.to_s + ' "' + command.to_s + '"'
55
- # puts 'wallet: ' + '%-10s' % wallet.class.to_s + ' "' + wallet.to_s + '"'
56
- # puts 'title: ' + '%-10s' % title.class.to_s + ' "' + title + '"'
57
- # puts 'date: ' + '%-10s' % date.class.to_s + ' "' + date + '"'
58
- # puts 'revenue: ' + '%-10s' % revenue.class.to_s + ' "' + revenue.to_s + '"'
59
- # puts 'expense: ' + '%-10s' % expense.class.to_s + ' "' + expense.to_s + '"'
60
- # puts 'category: ' + '%-10s' % category.class.to_s + ' "' + category + '"'
61
- # puts 'comment: ' + '%-10s' % comment.class.to_s + ' "' + comment.to_s + '"'
62
- # puts 'path: ' + '%-10s' % path.class.to_s + ' "' + path.to_s + '"'
63
- # puts
64
-
65
- if command == 'help' || command.length == 0
66
- script_name = File.basename(__FILE__)
67
- padding = ' ' * (script_name.length + 8)
7
+ options = {
8
+ :wallet_path => 'wallet',
68
9
 
69
- puts "#{::TheFox::Wallet::NAME} #{::TheFox::Wallet::VERSION} (#{::TheFox::Wallet::DATE})"
70
- puts 'Usage: ' + script_name + ' COMMAND OPTIONS'
71
- puts
72
- puts 'Commands:'
73
- puts padding + 'help Show this help'
74
- puts padding + 'add Add a new entry'
75
- puts padding + 'i|int Add a new entry interactively'
76
- puts padding + 'l|list List entries'
77
- puts padding + 'lc|cat List categories'
78
- puts padding + 'html Generate HTML files'
79
- puts padding + 'csv Import/Export CSV file'
80
- puts padding + 'vi Import per VIM editor'
81
- puts
82
- puts 'Options:'
83
- puts padding + '-w|--wallet PATH Optional'
84
- puts padding + '-t|--title TITLE Required for command "add"'
85
- puts padding + '-d|--date Optional'
86
- puts padding + '-r|--revenue Optional. Default: 0'
87
- puts padding + '-e|--expense Optional. Default: 0'
88
- puts padding + '-c|--category Optional. Default: default'
89
- puts padding + '-o|--comment Optional'
90
- puts padding + '-i|-e Import or Export. Default: -i'
91
- puts padding + '-p|--path PATH Required for command "csv"'
92
-
93
- exit 3
94
- end
95
-
96
- if command == 'int'
97
- command = 'add'
10
+ :entry_title => nil,
11
+ :entry_date => Date.today.to_s,
12
+ #:entry_end_date => nil,
13
+ :entry_revenue => 0.0,
14
+ :entry_expense => 0.0,
15
+ :entry_category => nil,
16
+ :entry_comment => nil,
98
17
 
99
- print 'title: [' + title + '] '
100
- title_t = STDIN.gets.strip
101
- if title_t.length > 0
102
- title = title_t
18
+ :is_import => false,
19
+ :is_export => false,
20
+ :path => nil,
21
+ :is_interactively => false,
22
+ }
23
+ balance = 0.0
24
+ opts = OptionParser.new do |o|
25
+ o.banner = 'Usage: wallet <command> [options]'
26
+ o.separator('')
27
+ o.separator('Commands:')
28
+ o.separator('')
29
+ o.separator(' add Add a new entry')
30
+ o.separator(' list List entries')
31
+ o.separator(' categories List categories')
32
+ o.separator(' html Generate HTML files')
33
+ o.separator(' csv Import/Export CSV file')
34
+ o.separator(' vi Import per VIM editor')
35
+ o.separator('')
36
+
37
+ o.on('-w', '--wallet <path>', 'Path to wallet directory.') do |path|
38
+ options[:wallet_path] = path
103
39
  end
104
40
 
105
- print 'date: [' + date + '] '
106
- date_t = STDIN.gets.strip
107
- if date_t.length > 0
108
- date = date_t
41
+ o.on('-t', '--title <title>', 'Title used for the entry.') do |title|
42
+ options[:entry_title] = title
109
43
  end
110
44
 
111
- print 'revenue: [' + revenue.to_s + '] '
112
- revenue_t = STDIN.gets.strip
113
- if revenue_t.length > 0
114
- revenue = revenue_t.to_s.gsub('.', '').sub(/,/, '.').to_f.round(3).abs
45
+ o.on('-d', '--date <date>', 'Date used for the entry.') do |date|
46
+ #o.on('-d', '--date <date>', 'Start date or date used for the entry.') do |date|
47
+ options[:entry_date] = date
115
48
  end
116
49
 
117
- print 'expense: [' + expense.to_s + '] '
118
- expense_t = STDIN.gets.strip
119
- if expense_t.length > 0
120
- expense = -expense_t.to_s.gsub('.', '').sub(/,/, '.').to_f.round(3).abs
50
+ #o.on('-z', '--end <date>', 'End date.') do |date|
51
+ # options[:entry_end_date] = date
52
+ #end
53
+
54
+ o.on('-r', '--revenue <revenue>', 'Revenue used for the entry.') do |revenue|
55
+ options[:entry_revenue] = revenue.to_s.sub(/,/, '.').to_f.abs
56
+ balance += options[:entry_revenue]
121
57
  end
122
58
 
123
- if category.to_s.length == 0
124
- category = 'default'
59
+ o.on('-e', '--expense <expense>', 'Expense used for the entry.') do |expense|
60
+ options[:entry_expense] = -expense.to_s.sub(/,/, '.').to_f.abs
61
+ balance += options[:entry_expense]
125
62
  end
126
- print 'category: [' + category + '] '
127
- category_t = STDIN.gets.strip
128
- if category_t.length > 0
129
- category = category_t
63
+
64
+ o.on('-c', '--category <category>', 'Category used for the entry.') do |category|
65
+ options[:entry_category] = category
130
66
  end
131
67
 
132
- print 'comment: [' + comment + '] '
133
- comment_t = STDIN.gets.strip
134
- if comment_t.length > 0
135
- comment = comment_t
68
+ o.on('-o', '--comment <comment>', 'Comment used for the entry.') do |comment|
69
+ options[:entry_comment] = comment
136
70
  end
137
71
 
138
- puts '-' * 20
139
- elsif command == 'vi'
140
- vi_file = Tempfile.create('wallet-vi-import', '/tmp')
141
- vi_file.puts('# This is a comment line.')
142
- vi_file.puts('# Date,Title,Revenue,Expense,Category,Comment')
143
- vi_file.puts('# Date,Title,Expense')
144
- vi_file.close
72
+ o.on('--import', 'Import') do
73
+ options[:is_import] = true
74
+ end
145
75
 
146
- puts 'cwd: ' + Dir.pwd
147
- puts 'editor: ' + ENV['EDITOR']
148
- puts 'file: ' + vi_file.path
149
- sleep 1
76
+ o.on('--export', 'Export') do
77
+ options[:is_export] = true
78
+ end
150
79
 
151
- system(ENV['EDITOR'] + ' ' + vi_file.path)
152
- system('grep -v "#" ' + vi_file.path + ' | grep -v ^$ > ' + vi_file.path + '.ok')
80
+ o.on('-p', '--path <path>', 'Path used for csv import/export.') do |path|
81
+ options[:path] = path
82
+ end
83
+
84
+ o.on('-i', 'Use some commands interactively.') do
85
+ options[:is_interactively] = true
86
+ end
153
87
 
154
- command = 'csv'
155
- path = vi_file.path + '.ok'
156
- path_is_temp = true
157
- import = true
88
+ o.on_tail('-V', '--version', 'Show version.') do
89
+ puts "#{::TheFox::Wallet::NAME} #{::TheFox::Wallet::VERSION} (#{::TheFox::Wallet::DATE})"
90
+ puts TheFox::Wallet::HOMEPAGE
91
+ exit
92
+ end
158
93
 
159
- File.unlink vi_file.path
94
+ o.on_tail('-h', '--help', 'Show this message.') do
95
+ puts o
96
+ puts
97
+ exit 3
98
+ end
160
99
  end
100
+ ARGV << '-h' if ARGV.count == 0
101
+ commands = opts.parse(ARGV)
102
+ command = commands.shift
161
103
 
162
- wallet = TheFox::Wallet::Wallet.new(wallet)
104
+ #pp commands
105
+ #pp command
163
106
 
164
- if command == 'add'
165
- if category.to_s.length == 0
166
- category = 'default'
107
+ case command
108
+ when 'add'
109
+ if options[:entry_category].nil?
110
+ options[:entry_category] = 'default'
111
+ end
112
+ if options[:is_interactively]
113
+ print "title: [#{options[:entry_title]}] "
114
+ title_t = STDIN.gets.strip
115
+ if title_t.length > 0
116
+ options[:entry_title] = title_t
117
+ end
118
+
119
+ print "date: [#{options[:entry_date]}] "
120
+ date_t = STDIN.gets.strip
121
+ if date_t.length > 0
122
+ options[:entry_date] = date_t
123
+ end
124
+
125
+ print "revenue: [#{options[:entry_revenue]}] "
126
+ revenue_t = STDIN.gets.strip
127
+ if revenue_t.length > 0
128
+ options[:entry_revenue] = revenue_t.to_s.sub(/,/, '.').to_f.round(TheFox::Wallet::NUMBER_ROUND).abs
129
+ end
130
+
131
+ print "expense: [#{options[:entry_expense]}] "
132
+ expense_t = STDIN.gets.strip
133
+ if expense_t.length > 0
134
+ options[:entry_expense] = -expense_t.to_s.sub(/,/, '.').to_f.round(TheFox::Wallet::NUMBER_ROUND).abs
135
+ end
136
+
137
+ print "category: [#{options[:entry_category]}] "
138
+ category_t = STDIN.gets.strip
139
+ if category_t.length > 0
140
+ options[:entry_category] = category_t
141
+ end
142
+
143
+ print "comment: [#{options[:entry_comment]}] "
144
+ comment_t = STDIN.gets.strip
145
+ if comment_t.length > 0
146
+ options[:entry_comment] = comment_t
147
+ end
148
+
149
+ puts '-' * 20
167
150
  end
168
151
 
169
- if title == ''
170
- puts 'ERROR: Option --title is required for command "' + command + '"'
152
+ if options[:entry_title].nil?
153
+ puts "ERROR: Option --title is required for command '#{command}'"
171
154
  exit 1
172
155
  end
173
156
 
174
- puts 'title: ' + title
175
- puts 'date: ' + Date.parse(date).to_s
176
- puts 'revenue: ' + revenue.to_s
177
- puts 'expense: ' + expense.to_s
178
- puts 'balance: ' + (revenue + expense).to_f.round(3).to_s
179
- puts 'category: ' + category.to_s
180
- puts 'comment: ' + comment.to_s
157
+ puts "title: '#{options[:entry_title]}'"
158
+ puts "date: " + Date.parse(options[:entry_date]).to_s
159
+ puts "revenue: " + TheFox::Wallet::NUMBER_FORMAT % options[:entry_revenue]
160
+ puts "expense: " + TheFox::Wallet::NUMBER_FORMAT % options[:entry_expense]
161
+ puts "balance: " + TheFox::Wallet::NUMBER_FORMAT % balance
162
+ puts "category: #{options[:entry_category]}"
163
+ puts "comment: '#{options[:entry_comment]}'"
181
164
 
182
- wallet.add TheFox::Wallet::Entry.new(title, date, revenue, expense, category, comment)
183
- elsif command == 'list'
165
+ entry = TheFox::Wallet::Entry.new(options[:entry_title], options[:entry_date], options[:entry_revenue], options[:entry_expense], options[:entry_category], options[:entry_comment])
166
+ wallet = TheFox::Wallet::Wallet.new(options[:wallet_path])
167
+ wallet.add(entry)
168
+ when 'list'
184
169
  puts
185
170
 
186
- year, month, day = date.scan(/^(\d{2,4}).?(\d{0,2}).?(\d{0,2})/).shift.map{ |x|
187
- y = x.to_i
188
- y == 0 ? nil : y
189
- }
171
+ wallet = TheFox::Wallet::Wallet.new(options[:wallet_path])
172
+ entries = wallet.entries(options[:entry_date], options[:entry_category].to_s)
173
+ #entries = wallet.entries(options[:entry_date], options[:entry_end_date], options[:entry_category].to_s)
190
174
 
191
- entries = wallet.entries(year, month, day, category)
192
-
193
- entries_l = entries.map{ |day_name, day_items| day_items.count }.inject{ |sum, n| sum + n }.to_s.length
194
- title_l = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['title'].length } }.flatten.max.to_i
195
- revenue_l = entries.map{ |month_item| month_item[1].map{ |day_item| (::TheFox::Wallet::NUMBER_FORMAT % day_item['revenue']).length } }.flatten.max.to_i
196
- expense_l = entries.map{ |month_item| month_item[1].map{ |day_item| (::TheFox::Wallet::NUMBER_FORMAT % day_item['expense']).length } }.flatten.max.to_i
197
- balance_l = entries.map{ |month_item| month_item[1].map{ |day_item| (::TheFox::Wallet::NUMBER_FORMAT % day_item['balance']).length } }.flatten.max.to_i
198
- category_l = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['category'].length } }.flatten.max.to_i
199
- comment_l = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['comment'].length } }.flatten.max.to_i
175
+ entries_l = entries
176
+ .map{ |day_name, day_items| day_items.count }
177
+ .inject{ |sum, n| sum + n }
178
+ .to_s
179
+ .length
180
+ title_l = entries
181
+ .map{ |month_item| month_item[1].map{ |day_item| day_item['title'].length }}
182
+ .flatten
183
+ .max
184
+ .to_i
185
+ revenue_l = entries
186
+ .map{ |month_item| month_item[1].map{ |day_item| (TheFox::Wallet::NUMBER_FORMAT % day_item['revenue']).length } }
187
+ .flatten
188
+ .max
189
+ .to_i
190
+ expense_l = entries
191
+ .map{ |month_item| month_item[1].map{ |day_item| (TheFox::Wallet::NUMBER_FORMAT % day_item['expense']).length } }
192
+ .flatten
193
+ .max
194
+ .to_i
195
+ balance_l = entries
196
+ .map{ |month_item| month_item[1].map{ |day_item| (TheFox::Wallet::NUMBER_FORMAT % day_item['balance']).length } }
197
+ .flatten
198
+ .max
199
+ .to_i
200
+ category_l = entries
201
+ .map{ |month_item| month_item[1].map{ |day_item| day_item['category'].length } }
202
+ .flatten
203
+ .max
204
+ .to_i
205
+ comment_l = entries
206
+ .map{ |month_item| month_item[1].map{ |day_item| day_item['comment'].length } }
207
+ .flatten
208
+ .max
209
+ .to_i
200
210
 
201
211
  has_category_col = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['category'] } }.flatten.select{ |i| i != 'default' }.count > 0
202
- has_comment_col = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['comment'] } }.flatten.select{ |i| i != '' }.count > 0
212
+ has_comment_col = entries
213
+ .map{ |month_item| month_item[1].map{ |day_item| day_item['comment'] } }
214
+ .flatten
215
+ .select{ |i| i != '' }
216
+ .count > 0
203
217
 
204
218
  if title_l < 6
205
219
  title_l = 6
@@ -273,9 +287,9 @@ elsif command == 'list'
273
287
  out += entries_f % entry_no
274
288
  out += ' ' + '%10s' % (entry['date'] == previous_date ? '' : entry['date'])
275
289
  out += ' ' + title_f % title
276
- out += ' ' + revenue_f % (::TheFox::Wallet::NUMBER_FORMAT % entry['revenue'])
277
- out += ' ' + expense_f % (::TheFox::Wallet::NUMBER_FORMAT % entry['expense'])
278
- out += ' ' + balance_f % (::TheFox::Wallet::NUMBER_FORMAT % entry['balance'])
290
+ out += ' ' + revenue_f % (TheFox::Wallet::NUMBER_FORMAT % entry['revenue'])
291
+ out += ' ' + expense_f % (TheFox::Wallet::NUMBER_FORMAT % entry['expense'])
292
+ out += ' ' + balance_f % (TheFox::Wallet::NUMBER_FORMAT % entry['balance'])
279
293
  out += ' ' + category_f % category if has_category_col
280
294
  out += ' ' + comment_f % comment if has_comment_col
281
295
 
@@ -290,38 +304,60 @@ elsif command == 'list'
290
304
  out = ''
291
305
  out += ' ' * (12 + entries_l)
292
306
  out += ' ' + title_f % 'TOTAL'
293
- out += ' ' + revenue_f % (::TheFox::Wallet::NUMBER_FORMAT % revenue_total)
294
- out += ' ' + expense_f % (::TheFox::Wallet::NUMBER_FORMAT % expense_total)
295
- out += ' ' + balance_f % (::TheFox::Wallet::NUMBER_FORMAT % balance_total)
307
+ out += ' ' + revenue_f % (TheFox::Wallet::NUMBER_FORMAT % revenue_total)
308
+ out += ' ' + expense_f % (TheFox::Wallet::NUMBER_FORMAT % expense_total)
309
+ out += ' ' + balance_f % (TheFox::Wallet::NUMBER_FORMAT % balance_total)
296
310
  puts out
297
- elsif command == 'cat'
311
+ when 'categories'
312
+ wallet = TheFox::Wallet::Wallet.new(options[:wallet_path])
298
313
  categories = wallet.categories
299
- puts 'categories(' + categories.count.to_s + '):'
300
- categories.each do |category_item|
301
- puts "\t" + category_item
302
- end
303
- elsif command == 'html'
314
+ puts "categories: #{categories.count}"
315
+ puts "\t" + categories.join("\n\t")
316
+ when 'html'
317
+ wallet = TheFox::Wallet::Wallet.new(options[:wallet_path])
304
318
  puts 'generate html to ' + wallet.html_path + ' ...'
305
319
  wallet.gen_html
306
320
  puts 'generate html done'
307
- elsif command == 'csv'
308
- if path == ''
309
- puts 'ERROR: Option --path is required for command "' + command + '"'
321
+ when 'csv'
322
+ if options[:is_interactively]
323
+ vi_file = Tempfile.create('wallet-vi-import', '/tmp')
324
+ vi_file.puts('# This is a comment line.')
325
+ vi_file.puts('# Date,Title,Revenue,Expense,Category,Comment')
326
+ vi_file.puts('# Date,Title,Expense')
327
+ vi_file.puts
328
+ vi_file.puts
329
+ vi_file.close
330
+
331
+ puts 'cwd: ' + Dir.pwd
332
+ puts 'editor: ' + ENV['EDITOR']
333
+ puts 'file: ' + vi_file.path
334
+
335
+ system("#{ENV['EDITOR']} #{vi_file.path}")
336
+ system("grep -v '#' #{vi_file.path} | grep -v ^$ > #{vi_file.path}.ok")
337
+
338
+ options[:path] = "#{vi_file.path}.ok"
339
+ File.unlink(vi_file.path)
340
+ end
341
+
342
+ if options[:path].nil?
343
+ puts "ERROR: Option --path is required for command '#{command}'"
310
344
  exit 1
311
345
  end
312
346
 
313
- if import || !export
314
- puts 'import csv ' + path + ' ...'
315
- wallet.import_csv_file path
316
- puts 'import csv ' + path + ' done'
347
+ wallet = TheFox::Wallet::Wallet.new(options[:wallet_path])
348
+
349
+ if options[:is_import] || !options[:is_export]
350
+ puts "import csv #{options[:path]} ..."
351
+ wallet.import_csv_file(options[:path])
352
+ puts "import csv #{options[:path]} done"
317
353
 
318
- if path_is_temp
319
- puts 'delete ' + path
320
- File.unlink(path)
354
+ if options[:is_interactively]
355
+ puts "delete #{options[:path]}"
356
+ File.unlink(options[:path])
321
357
  end
322
- elsif export
323
- puts 'export csv ' + path + ' ...'
324
- wallet.export_csv_file path
325
- puts 'export csv ' + path + ' done'
358
+ elsif options[:is_export]
359
+ puts "export csv #{options[:path]} ..."
360
+ wallet.export_csv_file(options[:path])
361
+ puts "export csv #{options[:path]} done"
326
362
  end
327
363
  end
data/lib/wallet/entry.rb CHANGED
@@ -40,9 +40,9 @@ module TheFox
40
40
  end
41
41
 
42
42
  def date=(date)
43
- if date.is_a? String
43
+ if date.is_a?(String)
44
44
  @date = Date.parse(date)
45
- elsif date.is_a? Date
45
+ elsif date.is_a?(Date)
46
46
  @date = date
47
47
  else
48
48
  raise ArgumentError, 'date must be a String or a Date instance'
@@ -94,7 +94,7 @@ module TheFox
94
94
  private
95
95
 
96
96
  def calc_balance
97
- @balance = (@revenue.round(3) + @expense.round(3)).to_f.round(3)
97
+ @balance = (@revenue.round(NUMBER_ROUND) + @expense.round(NUMBER_ROUND)).to_f.round(NUMBER_ROUND)
98
98
  end
99
99
  end
100
100
 
@@ -2,9 +2,10 @@
2
2
  module TheFox
3
3
  module Wallet
4
4
  NAME = 'Wallet'
5
- VERSION = '0.8.2'
6
- DATE = '2015-12-21'
5
+ VERSION = '0.9.0'
6
+ DATE = '2016-02-27'
7
7
  HOMEPAGE = 'https://github.com/TheFox/wallet'
8
8
  NUMBER_FORMAT = '%.2f'
9
+ NUMBER_ROUND = 5
9
10
  end
10
11
  end
data/lib/wallet/wallet.rb CHANGED
@@ -178,9 +178,9 @@ module TheFox
178
178
  end
179
179
  end
180
180
 
181
- revenue = revenue.to_f.round(3)
182
- expense = expense.to_f.round(3)
183
- balance = (revenue + expense).round(3)
181
+ revenue = revenue.to_f.round(NUMBER_ROUND)
182
+ expense = expense.to_f.round(NUMBER_ROUND)
183
+ balance = (revenue + expense).round(NUMBER_ROUND)
184
184
 
185
185
  diff = revenue + expense - balance
186
186
  if diff != 0
@@ -198,57 +198,63 @@ module TheFox
198
198
  sum(nil, nil, nil, category)
199
199
  end
200
200
 
201
- def entries(year = nil, month = nil, day = nil, category = nil)
202
- year_s = year.to_i.to_s
203
- month_f = '%02d' % month.to_i
204
- day_f = '%02d' % day.to_i
201
+ def entries(begin_date, category = nil)
202
+ #def entries(year = nil, month = nil, day = nil, category = nil)
203
+ begin_year, begin_month, begin_day = begin_date.split('-').map{ |n| n.to_i }
205
204
 
206
- glob = @data_path + '/month_'
207
- if year == nil && month == nil
205
+ begin_year_s = begin_year.to_i.to_s
206
+ begin_month_f = '%02d' % begin_month.to_i
207
+ begin_day_f = '%02d' % begin_day.to_i
208
+
209
+ glob = "#{@data_path}/month_"
210
+ if begin_year == nil && begin_month == nil
208
211
  glob += '*.yml'
209
- elsif year && month == nil
210
- glob += year_s + '_*.yml'
211
- elsif year && month
212
- glob += year_s + '_' + month_f + '.yml'
212
+ elsif begin_year && begin_month == nil
213
+ glob += "#{begin_year_s}_*.yml"
214
+ elsif begin_year && begin_month
215
+ glob += "#{begin_year_s}_#{begin_month_f}.yml"
213
216
  end
214
217
 
218
+ category = category.to_s.downcase
219
+
215
220
  # puts 'glob: ' + glob
216
- # puts 'year: ' + '%-10s' % year.class.to_s + ' = "' + year.to_s + '"'
217
- # puts 'month: ' + '%-10s' % month.class.to_s + ' = "' + month.to_s + '"'
218
- # puts 'day: ' + '%-10s' % day.class.to_s + ' = "' + day.to_s + '"'
219
- # puts 'category: ' + '%-10s' % category.class.to_s + ' = "' + category.to_s + '"'
221
+ # puts 'begin_year: ' + '%-10s' % begin_year.class.to_s + ' = "' + begin_year.to_s + '"'
222
+ # puts 'begin_month: ' + '%-10s' % begin_month.class.to_s + ' = "' + begin_month.to_s + '"'
223
+ # puts 'begin_day: ' + '%-10s' % begin_day.class.to_s + ' = "' + begin_day.to_s + '"'
224
+ # puts 'category: ' + '%-10s' % category.class.to_s + ' = "' + category.to_s + '"'
220
225
  # puts
221
226
 
222
227
  entries_a = {}
223
228
  Dir[glob].each do |file_path|
229
+ #puts "path: #{file_path}"
230
+
224
231
  data = YAML.load_file(file_path)
225
- if category.nil? || category.to_s.length == 0
226
- if day
227
- day_key = year_s + '-' + month_f + '-' + day_f
232
+ if category.length == 0
233
+ if begin_day
234
+ day_key = begin_year_s + '-' + begin_month_f + '-' + begin_day_f
228
235
  if data['days'].has_key?(day_key)
229
236
  entries_a[day_key] = data['days'][day_key]
230
237
  end
231
238
  else
232
- entries_a.merge! data['days']
239
+ entries_a.merge!(data['days'])
233
240
  end
234
241
  else
235
- category = category.to_s.downcase
236
- if day
237
- day_key = year_s + '-' + month_f + '-' + day_f
242
+ if begin_day
243
+ day_key = begin_year_s + '-' + begin_month_f + '-' + begin_day_f
238
244
  if data['days'].has_key?(day_key)
239
245
  entries_a[day_key] = data['days'][day_key].keep_if{ |day_item|
240
246
  day_item['category'].downcase == category
241
247
  }
242
248
  end
243
249
  else
244
- entries_a.merge! data['days'].map{ |day_name, day_items|
250
+ entries_a.merge!(data['days'].map{ |day_name, day_items|
245
251
  day_items.keep_if{ |day_item|
246
252
  day_item['category'].downcase == category
247
253
  }
248
254
  [day_name, day_items]
249
255
  }.to_h.keep_if{ |day_name, day_items|
250
256
  day_items.count > 0
251
- }
257
+ })
252
258
  end
253
259
  end
254
260
 
@@ -492,9 +498,9 @@ module TheFox
492
498
  expense_year += expense_month
493
499
  balance_year += balance_month
494
500
 
495
- revenue_month_r = revenue_month.round(3)
496
- expense_month_r = expense_month.round(3)
497
- balance_month_r = balance_month.round(3)
501
+ revenue_month_r = revenue_month.round(NUMBER_ROUND)
502
+ expense_month_r = expense_month.round(NUMBER_ROUND)
503
+ balance_month_r = balance_month.round(NUMBER_ROUND)
498
504
 
499
505
  year_total[month_n] = ::OpenStruct.new({
500
506
  month: month_n.to_i,
@@ -538,7 +544,7 @@ module TheFox
538
544
  year_file.write('</tr>')
539
545
  end
540
546
 
541
- year_total.sort.inject(0.0){ |sum, item| item[1].balance_total = (sum + item[1].balance).round(3) }
547
+ year_total.sort.inject(0.0){ |sum, item| item[1].balance_total = (sum + item[1].balance).round(NUMBER_ROUND) }
542
548
 
543
549
  year_file.write('
544
550
  <tr>
@@ -629,13 +635,13 @@ module TheFox
629
635
 
630
636
  years_total[year_s] = ::OpenStruct.new({
631
637
  year: year_s,
632
- revenue: revenue_year.round(3),
633
- expense: expense_year.round(3),
634
- balance: balance_year.round(3),
638
+ revenue: revenue_year.round(NUMBER_ROUND),
639
+ expense: expense_year.round(NUMBER_ROUND),
640
+ balance: balance_year.round(NUMBER_ROUND),
635
641
  })
636
642
  end
637
643
 
638
- years_total.sort.inject(0.0){ |sum, item| item[1].balance_total = (sum + item[1].balance).round(3) }
644
+ years_total.sort.inject(0.0){ |sum, item| item[1].balance_total = (sum + item[1].balance).round(NUMBER_ROUND) }
639
645
 
640
646
  index_file.write('
641
647
  <table class="list">
@@ -24,6 +24,4 @@ Gem::Specification.new do |spec|
24
24
  spec.required_ruby_version = '>=2.0.0'
25
25
 
26
26
  spec.add_development_dependency 'minitest', '~>5.7'
27
-
28
- spec.add_dependency 'ArgsParser', '~>1.0'
29
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thefox-wallet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Mayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-21 00:00:00.000000000 Z
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.7'
27
- - !ruby/object:Gem::Dependency
28
- name: ArgsParser
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
27
  description: A Ruby library for tracking your finances.
42
28
  email: christian@fox21.at
43
29
  executables: