thefox-wallet 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd4e8feceab54fde2f7ffb5ce5782cb48ca3213b
4
- data.tar.gz: 00b9ca606122f5fd4c0f181442b3a0a044105169
3
+ metadata.gz: 83c52b0183b88eef28a1e430a10266cbc926be80
4
+ data.tar.gz: 313cbc717b9eea9cb79444fb871bba40a6f9cad1
5
5
  SHA512:
6
- metadata.gz: 2d37b581624f6f9895f29a8639a5625894c0438916b38c6ddec5058d4c489bd242d67570326475c4b31cf2a3cd5b8cd52b50db0c3638b4978336cdb10b839908
7
- data.tar.gz: 34eb1d12045a4cd6792b455df3bfb06c6c7077507ef4ffa8d8e1309cd5853593192678bb3ebd30df1aec51c5c977aa3221bcb5ce6136910a47cea0fb567fbe3c
6
+ metadata.gz: ceb2875dbc61138cc094ea6a8d0f755f599017869bd966ed42960efa863d712320b270d69c59807cf8539ef709cebdd1720f159cf03b97c1f6a69418e61216af
7
+ data.tar.gz: ce729b9878f78f02f923bc37c15a6ec3827dfb6e44069b12a68996fa0ff6c182da8c74e63c3aba9f04558ddae2fe9b3dba04b7a46027a968674f1f261214036b
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,48 @@
1
+ before_script:
2
+ - ruby -v
3
+ - gem update --system
4
+ - gem install bundler -v '~>1.13'
5
+ - bundler --version
6
+ - make
7
+
8
+ stages:
9
+ - test
10
+ - release
11
+
12
+ test_21:
13
+ image: ruby:2.1
14
+ stage: test
15
+ environment: test
16
+ only:
17
+ - master
18
+ script:
19
+ - make test
20
+
21
+ test_22:
22
+ image: ruby:2.2
23
+ stage: test
24
+ environment: test
25
+ only:
26
+ - master
27
+ script:
28
+ - make test
29
+
30
+ test_23:
31
+ image: ruby:2.3
32
+ stage: test
33
+ environment: test
34
+ only:
35
+ - master
36
+ script:
37
+ - make test
38
+
39
+ release_gem:
40
+ image: ruby:2.3
41
+ stage: release
42
+ environment: release
43
+ only:
44
+ - tags
45
+ script:
46
+ - mkdir -p ~/.gem
47
+ - 'printf "%s\n:rubygems_api_key: %s" "---" "${RUBYGEMSORG_API_KEY}" > ~/.gem/credentials; chmod 0600 ~/.gem/credentials'
48
+ - make release
data/.travis.yml CHANGED
@@ -3,11 +3,12 @@ rvm:
3
3
  - 2.1
4
4
  - 2.2
5
5
  - 2.3
6
+ - 2.4.0-preview2
6
7
  - ruby-head
7
8
  sudo: required
8
9
  before_install:
9
10
  - gem update --system
10
- - gem install bundler -v '~>1.11'
11
+ - gem install bundler -v '~>1.13'
11
12
  - bundler --version
12
13
  install:
13
14
  - make
data/Makefile CHANGED
@@ -12,4 +12,4 @@ cov:
12
12
  RUBYOPT=-w TZ=Europe/Vienna COVERAGE=1 $(BUNDLER) exec ./test/suite_all.rb -v
13
13
 
14
14
  dev:
15
- RUBYOPT=-rbundler/setup ruby ./bin/wallet
15
+ bundler exec ./bin/wallet -w test_wallet add -t 'test' -e 5 -c 'test'
data/README.md CHANGED
@@ -24,7 +24,7 @@ The preferred method of installation is via RubyGems.org:
24
24
 
25
25
  or via `Gemfile`:
26
26
 
27
- gem 'thefox-wallet', '~>0.13'
27
+ gem 'thefox-wallet', '~>0.14'
28
28
 
29
29
  Use it in your sources:
30
30
 
data/bin/wallet CHANGED
@@ -4,7 +4,7 @@ require 'optparse'
4
4
  require 'wallet'
5
5
  require 'tempfile'
6
6
 
7
- options = {}
7
+ options = Hash.new
8
8
  opts = OptionParser.new do |o|
9
9
  o.banner = 'Usage: wallet <command> [options]'
10
10
  o.separator('')
@@ -8,8 +8,8 @@ module TheFox::Wallet
8
8
 
9
9
  NAME = 'default'
10
10
 
11
- def initialize(options = {})
12
- @options = options || {}
11
+ def initialize(options = Hash.new)
12
+ @options = options || Hash.new
13
13
  @options[:wallet_path] ||= 'wallet'
14
14
  @options[:entry_id] ||= nil
15
15
  @options[:entry_title] ||= nil
@@ -64,7 +64,7 @@ module TheFox::Wallet
64
64
  puts "category: #{@options[:entry_category]}"
65
65
  puts "comment: '#{@options[:entry_comment]}'"
66
66
  puts "force: #{@options[:force] ? 'YES' : 'NO'}"
67
- puts "unique: #{is_unique ? 'YES' : 'NO'}"
67
+ puts "unique: #{is_unique ? 'YES' : 'NO'} (#{is_unique})"
68
68
 
69
69
  entry = Entry.new(@options[:entry_id], @options[:entry_title], @options[:entry_date], @options[:entry_revenue], @options[:entry_expense], @options[:entry_category], @options[:entry_comment])
70
70
  wallet = Wallet.new(@options[:wallet_path])
@@ -2,8 +2,8 @@
2
2
  module TheFox
3
3
  module Wallet
4
4
  NAME = 'Wallet'
5
- VERSION = '0.13.0'
6
- DATE = '2016-09-14'
5
+ VERSION = '0.14.0'
6
+ DATE = '2016-10-20'
7
7
  HOMEPAGE = 'https://github.com/TheFox/wallet'
8
8
 
9
9
  NUMBER_FORMAT = '%.2f'
data/lib/wallet/wallet.rb CHANGED
@@ -29,9 +29,12 @@ module TheFox
29
29
  @tmp_path = File.expand_path('tmp', @dir_path)
30
30
 
31
31
  @has_transaction = false
32
- @transaction_files = {}
32
+ @transaction_files = Hash.new
33
33
 
34
34
  @entries_by_ids = nil
35
+ @entries_index_file_path = File.expand_path('index.yml', @data_path)
36
+ @entries_index = Array.new
37
+ @entries_index_is_loaded = false
35
38
 
36
39
  Signal.trap('SIGINT') do
37
40
  puts
@@ -49,24 +52,27 @@ module TheFox
49
52
  # puts "add, is_unique #{is_unique}"
50
53
  # puts "add, entry_exist? #{entry_exist?(entry)}"
51
54
  # puts
55
+
52
56
  if is_unique && entry_exist?(entry)
53
57
  return false
54
58
  end
55
59
 
56
60
  date = entry.date
57
61
  date_s = date.to_s
58
- dbfile_basename = 'month_' + date.strftime('%Y_%m') + '.yml'
62
+ dbfile_basename = "month_#{date.strftime('%Y_%m')}.yml"
59
63
  dbfile_path = File.expand_path(dbfile_basename, @data_path)
60
- tmpfile_path = dbfile_path + '.tmp'
64
+ tmpfile_path = "#{dbfile_path}.tmp"
61
65
  file = {
62
66
  'meta' => {
63
67
  'version' => 1,
64
68
  'created_at' => DateTime.now.to_s,
65
69
  'updated_at' => DateTime.now.to_s,
66
70
  },
67
- 'days' => {}
71
+ 'days' => Hash.new,
68
72
  }
69
73
 
74
+ @entries_index << entry.id
75
+
70
76
  # puts 'dbfile_basename: ' + dbfile_basename
71
77
  # puts 'dbfile_path: ' + dbfile_path
72
78
  # puts 'tmpfile_path: ' + tmpfile_path
@@ -90,10 +96,10 @@ module TheFox
90
96
  end
91
97
 
92
98
  if file['days'].is_a?(Array)
93
- file['days'] = {}
99
+ file['days'] = Hash.new
94
100
  end
95
101
  if !file['days'].has_key?(date_s)
96
- file['days'][date_s] = []
102
+ file['days'][date_s] = Array.new
97
103
  end
98
104
 
99
105
  file['days'][date_s].push(entry.to_h)
@@ -108,10 +114,10 @@ module TheFox
108
114
  end
109
115
 
110
116
  if file['days'].is_a?(Array)
111
- file['days'] = {}
117
+ file['days'] = Hash.new
112
118
  end
113
119
  if !file['days'].has_key?(date_s)
114
- file['days'][date_s] = []
120
+ file['days'][date_s] = Array.new
115
121
  end
116
122
 
117
123
  file['days'][date_s].push(entry.to_h)
@@ -122,13 +128,15 @@ module TheFox
122
128
  store['days'] = file['days']
123
129
  end
124
130
 
131
+ save_entries_index_file
132
+
125
133
  if File.exist?(tmpfile_path)
126
134
  File.rename(tmpfile_path, dbfile_path)
127
135
  end
128
136
  end
129
137
 
130
138
  if @entries_by_ids.nil?
131
- @entries_by_ids = {}
139
+ @entries_by_ids = Hash.new
132
140
  end
133
141
  @entries_by_ids[entry.id] = entry
134
142
 
@@ -137,7 +145,7 @@ module TheFox
137
145
 
138
146
  def transaction_start
139
147
  @has_transaction = true
140
- @transaction_files = {}
148
+ @transaction_files = Hash.new
141
149
 
142
150
  create_dirs
143
151
  end
@@ -148,6 +156,7 @@ module TheFox
148
156
  if @exit
149
157
  throw :done
150
158
  end
159
+
151
160
  # puts 'keys left: ' + @transaction_files.keys.count.to_s
152
161
  # puts 'tr_file_key: ' + tr_file_key
153
162
  # puts 'path: ' + tr_file_data['path']
@@ -167,8 +176,10 @@ module TheFox
167
176
  end
168
177
  end
169
178
 
179
+ save_entries_index_file
180
+
170
181
  @has_transaction = false
171
- @transaction_files = {}
182
+ @transaction_files = Hash.new
172
183
  end
173
184
 
174
185
  def sum(year = nil, month = nil, day = nil, category = nil)
@@ -180,20 +191,20 @@ module TheFox
180
191
  expense = 0.0
181
192
  balance = 0.0
182
193
 
183
- glob = @data_path + '/month_'
194
+ glob = File.expand_path('month_', @data_path)
184
195
  if year == nil && month == nil
185
- glob += '*.yml'
196
+ glob << '*.yml'
186
197
  elsif year && month == nil
187
- glob += year_s + '_*.yml'
198
+ glob << "#{year_s}_*.yml"
188
199
  elsif year && month
189
- glob += year_s + '_' + month_f + '.yml'
200
+ glob << "#{year_s}_#{month_f}.yml"
190
201
  end
191
202
 
192
203
  Dir[glob].each do |file_path|
193
204
  data = YAML.load_file(file_path)
194
205
 
195
206
  if day
196
- day_key = year_s + '-' + month_f + '-' + day_f
207
+ day_key = "#{year_s}-#{month_f}-#{day_f}"
197
208
  if data['days'].has_key?(day_key)
198
209
  day_sum = calc_day(data['days'][day_key], category)
199
210
  revenue += day_sum[:revenue]
@@ -216,7 +227,7 @@ module TheFox
216
227
 
217
228
  diff = revenue + expense - balance
218
229
  if diff != 0
219
- raise RuntimeError, 'diff between revenue and expense to balance is ' + diff.to_s
230
+ raise RuntimeError, "diff between revenue and expense to balance is #{diff}"
220
231
  end
221
232
 
222
233
  {
@@ -237,13 +248,13 @@ module TheFox
237
248
  begin_month_f = '%02d' % begin_month.to_i
238
249
  begin_day_f = '%02d' % begin_day.to_i
239
250
 
240
- glob = "#{@data_path}/month_"
251
+ glob = File.expand_path('month_', @data_path)
241
252
  if begin_year == nil && begin_month == nil
242
- glob += '*.yml'
253
+ glob << '*.yml'
243
254
  elsif begin_year && begin_month == nil
244
- glob += "#{begin_year_s}_*.yml"
255
+ glob << "#{begin_year_s}_*.yml"
245
256
  elsif begin_year && begin_month
246
- glob += "#{begin_year_s}_#{begin_month_f}.yml"
257
+ glob << "#{begin_year_s}_#{begin_month_f}.yml"
247
258
  end
248
259
 
249
260
  category = category.to_s.downcase
@@ -255,14 +266,14 @@ module TheFox
255
266
  # puts 'category: ' + '%-10s' % category.class.to_s + ' = "' + category.to_s + '"'
256
267
  # puts
257
268
 
258
- entries_a = {}
269
+ entries_a = Hash.new
259
270
  Dir[glob].each do |file_path|
260
271
  #puts "path: #{file_path}"
261
272
 
262
273
  data = YAML.load_file(file_path)
263
274
  if category.length == 0
264
275
  if begin_day
265
- day_key = begin_year_s + '-' + begin_month_f + '-' + begin_day_f
276
+ day_key = "#{begin_year_s}-#{begin_month_f}-#{begin_day_f}"
266
277
  if data['days'].has_key?(day_key)
267
278
  entries_a[day_key] = data['days'][day_key]
268
279
  end
@@ -271,7 +282,7 @@ module TheFox
271
282
  end
272
283
  else
273
284
  if begin_day
274
- day_key = begin_year_s + '-' + begin_month_f + '-' + begin_day_f
285
+ day_key = "#{begin_year_s}-#{begin_month_f}-#{begin_day_f}"
275
286
  if data['days'].has_key?(day_key)
276
287
  entries_a[day_key] = data['days'][day_key].keep_if{ |day_item|
277
288
  day_item['category'].downcase == category
@@ -294,8 +305,8 @@ module TheFox
294
305
  end
295
306
 
296
307
  def categories
297
- categories_h = {}
298
- Dir[@data_path + '/month_*.yml'].each do |file_path|
308
+ categories_h = Hash.new
309
+ Dir[File.expand_path('month_*.yml', @data_path)].each do |file_path|
299
310
  data = YAML.load_file(file_path)
300
311
 
301
312
  data['days'].each do |day_name, day_items|
@@ -320,14 +331,14 @@ module TheFox
320
331
  def gen_html
321
332
  create_dirs
322
333
 
323
- html_options_path = "#{@html_path}/options.yml"
334
+ html_options_path = File.expand_path('options.yml', @html_path)
324
335
  html_options = {
325
336
  'meta' => {
326
337
  'version' => 1,
327
338
  'created_at' => DateTime.now.to_s,
328
339
  'updated_at' => DateTime.now.to_s,
329
340
  },
330
- 'changes' => {},
341
+ 'changes' => Hash.new,
331
342
  }
332
343
  if Dir.exist?(@html_path)
333
344
  if File.exist?(html_options_path)
@@ -338,16 +349,16 @@ module TheFox
338
349
  Dir.mkdir(@html_path)
339
350
  end
340
351
 
341
- categories_available = categories()
352
+ categories_available = categories
342
353
 
343
- categories_total_balance = {}
354
+ categories_total_balance = Hash.new
344
355
  categories_available.map{ |item| categories_total_balance[item] = 0.0 }
345
356
 
346
- gitignore_file = File.open(@html_path + '/.gitignore', 'w')
357
+ gitignore_file = File.open(File.expand_path('.gitignore', @html_path), 'w')
347
358
  gitignore_file.write('*')
348
359
  gitignore_file.close
349
360
 
350
- css_file_path = @html_path + '/style.css'
361
+ css_file_path = File.expand_path('style.css', @html_path)
351
362
  css_file = File.open(css_file_path, 'w')
352
363
  css_file.write('
353
364
  html {
@@ -372,75 +383,75 @@ module TheFox
372
383
  ')
373
384
  css_file.close
374
385
 
375
- index_file_path = @html_path + '/index.html'
386
+ index_file_path = File.expand_path('index.html', @html_path)
376
387
  index_file = File.open(index_file_path, 'w')
377
388
  index_file.write('
378
389
  <html>
379
390
  <head>
380
391
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
381
- <title>' + @dir_path + '</title>
392
+ <title>' << @dir_path << '</title>
382
393
  <link rel="stylesheet" href="style.css" type="text/css" />
383
394
  </head>
384
395
  <body>
385
- <h1>' + @dir_path + '</h1>
386
- <p>Generated @ ' + DateTime.now.strftime('%Y-%m-%d %H:%M:%S') + ' by <a href="' + ::TheFox::Wallet::HOMEPAGE + '">' + ::TheFox::Wallet::NAME + '</a> ' + ::TheFox::Wallet::VERSION + '</p>
396
+ <h1>' << @dir_path << '</h1>
397
+ <p>Generated @ ' << DateTime.now.strftime('%Y-%m-%d %H:%M:%S') << ' by <a href="' << ::TheFox::Wallet::HOMEPAGE << '">' << ::TheFox::Wallet::NAME << '</a> ' << ::TheFox::Wallet::VERSION << '</p>
387
398
  ')
388
399
 
389
- years_total = {}
400
+ years_total = Hash.new
390
401
  years.each do |year|
391
402
  year_s = year.to_s
392
- year_file_name = 'year_' + year_s + '.html'
393
- year_file_path = @html_path + '/' + year_file_name
403
+ year_file_name = "year_#{year}.html"
404
+ year_file_path = File.expand_path(year_file_name, @html_path)
394
405
 
395
406
  year_file = File.open(year_file_path, 'w')
396
407
  year_file.write('
397
408
  <html>
398
409
  <head>
399
410
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
400
- <title>' + year_s + ' - ' + @dir_path + '</title>
411
+ <title>' << year_s << ' - ' << @dir_path << '</title>
401
412
  <link rel="stylesheet" href="style.css" type="text/css" />
402
413
  </head>
403
414
  <body>
404
- <h1><a href="index.html">' + @dir_path + '</a></h1>
405
- <p>Generated @ ' + DateTime.now.strftime('%Y-%m-%d %H:%M:%S') + ' by <a href="' + ::TheFox::Wallet::HOMEPAGE + '">' + ::TheFox::Wallet::NAME + '</a> ' + ::TheFox::Wallet::VERSION + '</p>
415
+ <h1><a href="index.html">' << @dir_path << '</a></h1>
416
+ <p>Generated @ ' << DateTime.now.strftime('%Y-%m-%d %H:%M:%S') << ' by <a href="' << ::TheFox::Wallet::HOMEPAGE << '">' << ::TheFox::Wallet::NAME << '</a> ' << ::TheFox::Wallet::VERSION << '</p>
406
417
 
407
- <h2>Year: ' + year_s + '</h2>
418
+ <h2>Year: ' << year_s << '</h2>
408
419
  <table class="list">
409
420
  <tr>
410
421
  <th class="left">Month</th>
411
422
  <th class="right">Revenue</th>
412
423
  <th class="right">Expense</th>
413
424
  <th class="right">Balance</th>
414
- <th colspan="' + categories_available.count.to_s + '">' + categories_available.count.to_s + ' Categories</th>
425
+ <th colspan="' << categories_available.count.to_s << '">' << categories_available.count.to_s << ' Categories</th>
415
426
  </tr>
416
427
  <tr>
417
428
  <th colspan="4">&nbsp;</th>
418
429
  ')
419
430
  categories_available.each do |category|
420
- year_file.write('<th class="right">' + category + '</th>')
431
+ year_file.write('<th class="right">' << category << '</th>')
421
432
  end
422
433
  year_file.write('</tr>')
423
434
 
424
435
  revenue_year = 0.0
425
436
  expense_year = 0.0
426
437
  balance_year = 0.0
427
- categories_year_balance = {}
438
+ categories_year_balance = Hash.new
428
439
  categories_available.map{ |item| categories_year_balance[item] = 0.0 }
429
- year_total = {}
440
+ year_total = Hash.new
430
441
 
431
- puts 'generate year ' + year_s
432
- Dir[@data_path + '/month_' + year_s + '_*.yml'].each do |file_path|
442
+ puts "generate year #{year}"
443
+ Dir[File.expand_path("month_#{year}_*.yml", @data_path)].each do |file_path|
433
444
  file_name = File.basename(file_path)
434
445
  month_n = file_name[11, 2]
435
- month_file_name = 'month_' + year_s + '_' + month_n + '.html'
436
- month_file_path = @html_path + '/' + month_file_name
446
+ month_file_name = "month_#{year}_#{month_n}.html"
447
+ month_file_path = File.expand_path(month_file_name, @html_path)
437
448
 
438
- month_s = Date.parse('2015-' + month_n + '-15').strftime('%B')
449
+ month_s = Date.parse("2015-#{month_n}-15").strftime('%B')
439
450
 
440
451
  revenue_month = 0.0
441
452
  expense_month = 0.0
442
453
  balance_month = 0.0
443
- categories_month_balance = {}
454
+ categories_month_balance = Hash.new
444
455
  categories_available.map{ |item| categories_month_balance[item] = 0.0 }
445
456
 
446
457
  entry_n = 0
@@ -463,21 +474,21 @@ module TheFox
463
474
  end
464
475
 
465
476
  if generate_html
466
- puts "\t" + 'file: ' + month_file_name + ' (from ' + file_name + ')'
477
+ puts "\tfile: #{month_file_name} (from #{file_name})"
467
478
 
468
479
  month_file = File.open(month_file_path, 'w')
469
480
  month_file.write('
470
481
  <html>
471
482
  <head>
472
483
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
473
- <title>' + month_s + ' ' + year_s + ' - ' + @dir_path + '</title>
484
+ <title>' << month_s << ' ' << year_s << ' - ' << @dir_path << '</title>
474
485
  <link rel="stylesheet" href="style.css" type="text/css" />
475
486
  </head>
476
487
  <body>
477
- <h1><a href="index.html">' + @dir_path + '</a></h1>
478
- <p>Generated @ ' + DateTime.now.strftime('%Y-%m-%d %H:%M:%S') + ' by <a href="' + ::TheFox::Wallet::HOMEPAGE + '">' + ::TheFox::Wallet::NAME + '</a> ' + ::TheFox::Wallet::VERSION + ' from <code>' + file_name + '</code></p>
488
+ <h1><a href="index.html">' << @dir_path << '</a></h1>
489
+ <p>Generated @ ' << DateTime.now.strftime('%Y-%m-%d %H:%M:%S') << ' by <a href="' << ::TheFox::Wallet::HOMEPAGE << '">' << ::TheFox::Wallet::NAME << '</a> ' << ::TheFox::Wallet::VERSION << ' from <code>' << file_name << '</code></p>
479
490
 
480
- <h2>Month: ' + month_s + ' <a href="' + year_file_name + '">' + year_s + '</a></h2>
491
+ <h2>Month: ' << month_s << ' <a href="' << year_file_name << '">' << year_s << '</a></h2>
481
492
  <table class="list">
482
493
  <tr>
483
494
  <th class="left">#</th>
@@ -493,7 +504,6 @@ module TheFox
493
504
  end
494
505
 
495
506
  data['days'].sort.each do |day_name, day_items|
496
- #puts "\t\t" + 'day: ' + day_name
497
507
  day_items.each do |entry|
498
508
  entry_n += 1
499
509
  revenue_month += entry['revenue']
@@ -511,14 +521,14 @@ module TheFox
511
521
  if generate_html
512
522
  month_file.write('
513
523
  <tr>
514
- <td valign="top" class="left">' + entry_n.to_s + '</td>
515
- <td valign="top" class="left">' + Date.parse(entry['date']).strftime('%d.%m.%y') + '</td>
516
- <td valign="top" class="left">' + entry['title'][0, 50] + '</td>
517
- <td valign="top" class="right">' + revenue_out + '</td>
518
- <td valign="top" class="right red">' + expense_out + '</td>
519
- <td valign="top" class="right ' + (entry['balance'] < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % entry['balance'] + '</td>
520
- <td valign="top" class="right">' + category_out + '</td>
521
- <td valign="top" class="left">' + comment_out + '</td>
524
+ <td valign="top" class="left">' << entry_n.to_s << '</td>
525
+ <td valign="top" class="left">' << Date.parse(entry['date']).strftime('%d.%m.%y') << '</td>
526
+ <td valign="top" class="left">' << entry['title'][0, 50] << '</td>
527
+ <td valign="top" class="right">' << revenue_out << '</td>
528
+ <td valign="top" class="right red">' << expense_out << '</td>
529
+ <td valign="top" class="right ' << (entry['balance'] < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % entry['balance'] << '</td>
530
+ <td valign="top" class="right">' << category_out << '</td>
531
+ <td valign="top" class="left">' << comment_out << '</td>
522
532
  </tr>
523
533
  ')
524
534
  end
@@ -551,9 +561,9 @@ module TheFox
551
561
  <th>&nbsp;</th>
552
562
  <th>&nbsp;</th>
553
563
  <th class="left"><b>TOTAL</b></th>
554
- <th class="right">' + ::TheFox::Wallet::NUMBER_FORMAT % revenue_month + '</th>
555
- <th class="right red">' + ::TheFox::Wallet::NUMBER_FORMAT % expense_month + '</th>
556
- <th class="right ' + balance_class + '">' + ::TheFox::Wallet::NUMBER_FORMAT % balance_month + '</th>
564
+ <th class="right">' << ::TheFox::Wallet::NUMBER_FORMAT % revenue_month << '</th>
565
+ <th class="right red">' << ::TheFox::Wallet::NUMBER_FORMAT % expense_month << '</th>
566
+ <th class="right ' << balance_class << '">' << ::TheFox::Wallet::NUMBER_FORMAT % balance_month << '</th>
557
567
  <th>&nbsp;</th>
558
568
  <th>&nbsp;</th>
559
569
  </tr>
@@ -564,13 +574,13 @@ module TheFox
564
574
 
565
575
  year_file.write('
566
576
  <tr>
567
- <td class="left"><a href="' + month_file_name + '">' + month_s + '</a></td>
568
- <td class="right">' + ::TheFox::Wallet::NUMBER_FORMAT % revenue_month + '</td>
569
- <td class="right red">' + ::TheFox::Wallet::NUMBER_FORMAT % expense_month + '</td>
570
- <td class="right ' + balance_class + '">' + ::TheFox::Wallet::NUMBER_FORMAT % balance_month + '</td>')
577
+ <td class="left"><a href="' << month_file_name << '">' << month_s << '</a></td>
578
+ <td class="right">' << ::TheFox::Wallet::NUMBER_FORMAT % revenue_month << '</td>
579
+ <td class="right red">' << ::TheFox::Wallet::NUMBER_FORMAT % expense_month << '</td>
580
+ <td class="right ' << balance_class << '">' << ::TheFox::Wallet::NUMBER_FORMAT % balance_month << '</td>')
571
581
  categories_available.each do |category|
572
582
  category_balance = categories_month_balance[category]
573
- year_file.write('<td class="right ' + (category_balance < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % category_balance + '</td>')
583
+ year_file.write('<td class="right ' << (category_balance < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % category_balance << '</td>')
574
584
  end
575
585
  year_file.write('</tr>')
576
586
  end
@@ -580,12 +590,12 @@ module TheFox
580
590
  year_file.write('
581
591
  <tr>
582
592
  <th class="left"><b>TOTAL</b></th>
583
- <th class="right">' + ::TheFox::Wallet::NUMBER_FORMAT % revenue_year + '</th>
584
- <th class="right red">' + ::TheFox::Wallet::NUMBER_FORMAT % expense_year + '</th>
585
- <th class="right ' + (balance_year < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % balance_year + '</th>')
593
+ <th class="right">' << ::TheFox::Wallet::NUMBER_FORMAT % revenue_year << '</th>
594
+ <th class="right red">' << ::TheFox::Wallet::NUMBER_FORMAT % expense_year << '</th>
595
+ <th class="right ' << (balance_year < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % balance_year << '</th>')
586
596
  categories_available.each do |category|
587
597
  category_balance = categories_year_balance[category]
588
- year_file.write('<td class="right ' + (category_balance < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % category_balance + '</td>')
598
+ year_file.write('<td class="right ' << (category_balance < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % category_balance << '</td>')
589
599
  end
590
600
 
591
601
  year_file.write('
@@ -593,11 +603,11 @@ module TheFox
593
603
  </table>
594
604
  ')
595
605
 
596
- year_file.write("<p><img src=\"year_#{year_s}.png\"></p>")
606
+ year_file.write(%{<p><img src="year_#{year_s}.png"></p>})
597
607
  year_file.write('</body></html>')
598
608
  year_file.close
599
609
 
600
- yeardat_file_path = "#{@tmp_path}/year_#{year_s}.dat"
610
+ yeardat_file_path = File.expand_path("year_#{year_s}.dat", @tmp_path)
601
611
  yeardat_file = File.new(yeardat_file_path, 'w')
602
612
  yeardat_file.write(year_total
603
613
  .map{ |k, m| "#{year_s}-#{m.month_s} #{m.revenue} #{m.expense} #{m.balance} #{m.balance_total} #{m.balance_total}" }
@@ -632,7 +642,7 @@ module TheFox
632
642
  # puts "#{year_max} #{year_max.to_s.length} #{year_max_r} #{year_max_rl}"
633
643
  # puts "#{year_min} #{year_min.to_s.length} #{year_min_r} #{year_min_rl}"
634
644
 
635
- gnuplot_file = File.new("#{@tmp_path}/year_#{year_s}.gp", 'w')
645
+ gnuplot_file = File.new(File.expand_path("year_#{year_s}.gp", @tmp_path), 'w')
636
646
  gnuplot_file.puts("set title 'Year #{year_s}'")
637
647
  gnuplot_file.puts("set xlabel 'Months'")
638
648
  gnuplot_file.puts("set ylabel 'Euro'")
@@ -655,14 +665,14 @@ module TheFox
655
665
  gnuplot_file.puts("set style line 4 linecolor rgb '#0000ff' linewidth 2 linetype 1 pointtype 2")
656
666
  gnuplot_file.puts("set style data linespoints")
657
667
  gnuplot_file.puts("set terminal png enhanced")
658
- gnuplot_file.puts("set output '#{@html_path}/year_#{year_s}.png'")
668
+ gnuplot_file.puts("set output '" << File.expand_path("year_#{year_s}.png", @html_path) << "'")
659
669
  gnuplot_file.puts("plot sum = 0, \\")
660
670
  gnuplot_file.puts("\t'#{yeardat_file_path}' using 1:2 linestyle 1 title 'Revenue', \\")
661
671
  gnuplot_file.puts("\t'' using 1:3 linestyle 2 title 'Expense', \\")
662
672
  gnuplot_file.puts("\t'' using 1:4 linestyle 3 title 'Balance', \\")
663
673
  gnuplot_file.puts("\t'' using 1:5 linestyle 4 title '∑ Balance'")
664
674
  gnuplot_file.close
665
- system("gnuplot #{@tmp_path}/year_#{year_s}.gp")
675
+ system("gnuplot " << File.expand_path("year_#{year_s}.gp", @tmp_path))
666
676
 
667
677
  years_total[year_s] = ::OpenStruct.new({
668
678
  year: year_s,
@@ -686,11 +696,11 @@ module TheFox
686
696
  years_total.each do |year_name, year_data|
687
697
  index_file.write('
688
698
  <tr>
689
- <td class="left"><a href="year_' + year_name + '.html">' + year_name + '</a></td>
690
- <td class="right">' + ::TheFox::Wallet::NUMBER_FORMAT % year_data.revenue + '</td>
691
- <td class="right red">' + ::TheFox::Wallet::NUMBER_FORMAT % year_data.expense + '</td>
692
- <td class="right ' + (year_data.balance < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % year_data.balance + '</td>
693
- <td class="right ' + (year_data.balance_total < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % year_data.balance_total + '</td>
699
+ <td class="left"><a href="year_' << year_name << '.html">' << year_name << '</a></td>
700
+ <td class="right">' << ::TheFox::Wallet::NUMBER_FORMAT % year_data.revenue << '</td>
701
+ <td class="right red">' << ::TheFox::Wallet::NUMBER_FORMAT % year_data.expense << '</td>
702
+ <td class="right ' << (year_data.balance < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % year_data.balance << '</td>
703
+ <td class="right ' << (year_data.balance_total < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % year_data.balance_total << '</td>
694
704
  </tr>')
695
705
  end
696
706
 
@@ -699,9 +709,9 @@ module TheFox
699
709
  index_file.write('
700
710
  <tr>
701
711
  <th class="left"><b>TOTAL</b></th>
702
- <th class="right">' + ::TheFox::Wallet::NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].revenue } + '</th>
703
- <th class="right red">' + ::TheFox::Wallet::NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].expense } + '</th>
704
- <th class="right ' + (balance_total < 0 ? 'red' : '') + '">' + ::TheFox::Wallet::NUMBER_FORMAT % balance_total + '</th>
712
+ <th class="right">' << ::TheFox::Wallet::NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].revenue } << '</th>
713
+ <th class="right red">' << ::TheFox::Wallet::NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].expense } << '</th>
714
+ <th class="right ' << (balance_total < 0 ? 'red' : '') << '">' << ::TheFox::Wallet::NUMBER_FORMAT % balance_total << '</th>
705
715
  <th>&nbsp;</th>
706
716
  </tr>
707
717
  </table>
@@ -726,12 +736,12 @@ module TheFox
726
736
  end
727
737
  totaldat_file_c = totaldat_file_c.join("\n")
728
738
 
729
- totaldat_file_path = "#{@tmp_path}/total.dat"
739
+ totaldat_file_path = File.expand_path('total.dat', @tmp_path)
730
740
  totaldat_file = File.new(totaldat_file_path, 'w')
731
741
  totaldat_file.write(totaldat_file_c)
732
742
  totaldat_file.close
733
743
 
734
- gnuplot_file = File.new("#{@tmp_path}/total.gp", 'w')
744
+ gnuplot_file = File.new(File.expand_path('total.gp', @tmp_path), 'w')
735
745
  gnuplot_file.puts("set title 'Total'")
736
746
  gnuplot_file.puts("set xlabel 'Years'")
737
747
  gnuplot_file.puts("set ylabel 'Euro'")
@@ -746,14 +756,15 @@ module TheFox
746
756
  gnuplot_file.puts("set style line 4 linecolor rgb '#0000ff' linewidth 2 linetype 1 pointtype 2")
747
757
  gnuplot_file.puts("set style data linespoints")
748
758
  gnuplot_file.puts("set terminal png enhanced")
749
- gnuplot_file.puts("set output '#{@html_path}/total.png'")
759
+ gnuplot_file.puts("set output '" << File.expand_path('total.png', @html_path) << "'")
750
760
  gnuplot_file.puts("plot sum = 0, \\")
751
761
  gnuplot_file.puts("\t'#{totaldat_file_path}' using 1:2 linestyle 1 title 'Revenue', \\")
752
762
  gnuplot_file.puts("\t'' using 1:3 linestyle 2 title 'Expense', \\")
753
763
  gnuplot_file.puts("\t'' using 1:4 linestyle 3 title 'Balance', \\")
754
764
  gnuplot_file.puts("\t'' using 1:5 linestyle 4 title '∑ Balance'")
755
765
  gnuplot_file.close
756
- system("gnuplot #{@tmp_path}/total.gp")
766
+
767
+ system("gnuplot " << File.expand_path('total.gp', @tmp_path))
757
768
  end
758
769
 
759
770
  def import_csv_file(file_path)
@@ -805,7 +816,7 @@ module TheFox
805
816
  # :encoding => 'ISO-8859-1',
806
817
  }
807
818
  CSV.open(file_path, 'wb', csv_options) do |csv|
808
- Dir[@data_path + '/month_*.yml'].each do |yaml_file_path|
819
+ Dir[File.expand_path('month_*.yml', @data_path)].each do |yaml_file_path|
809
820
  puts 'export ' + File.basename(yaml_file_path)
810
821
 
811
822
  data = YAML.load_file(yaml_file_path)
@@ -830,10 +841,13 @@ module TheFox
830
841
 
831
842
  def entry_exist?(entry)
832
843
  if !entry.is_a?(Entry)
833
- raise ArgumentError, 'variable must be a Entry instance'
844
+ raise ArgumentError, 'variable must be an Entry instance'
834
845
  end
835
846
 
836
- !find_entry_by_id(entry.id).nil?
847
+ if @entries_index.count == 0
848
+ load_entries_index_file
849
+ end
850
+ @entries_index.include?(entry.id)
837
851
  end
838
852
 
839
853
  def build_entry_by_id_index(force = false)
@@ -878,12 +892,20 @@ module TheFox
878
892
  Dir.mkdir(@tmp_path)
879
893
  end
880
894
 
881
- tmp_gitignore_path = @tmp_path + '/.gitignore'
895
+ tmp_gitignore_path = File.expand_path('.gitignore', @tmp_path)
882
896
  if !File.exist?(tmp_gitignore_path)
883
897
  gitignore_file = File.open(tmp_gitignore_path, 'w')
884
898
  gitignore_file.write('*')
885
899
  gitignore_file.close
886
900
  end
901
+
902
+ if File.exist?(@entries_index_file_path)
903
+ load_entries_index_file
904
+ else
905
+ build_entry_by_id_index(true)
906
+ @entries_index = @entries_by_ids.keys
907
+ save_entries_index_file
908
+ end
887
909
  end
888
910
 
889
911
  def calc_day(day, category = nil)
@@ -916,7 +938,24 @@ module TheFox
916
938
  end
917
939
 
918
940
  def years
919
- Dir[@data_path + '/month_*.yml'].map{ |file_path| File.basename(file_path)[6, 4].to_i }.uniq
941
+ Dir[File.expand_path('month_*.yml', @data_path)].map{ |file_path| File.basename(file_path)[6, 4].to_i }.uniq
942
+ end
943
+
944
+ def load_entries_index_file
945
+ unless @entries_index_is_loaded
946
+ @entries_index_is_loaded = true
947
+ if File.exist?(@entries_index_file_path)
948
+ data = YAML.load_file(@entries_index_file_path)
949
+ @entries_index = data['index']
950
+ end
951
+ end
952
+ end
953
+
954
+ def save_entries_index_file
955
+ store = YAML::Store.new(@entries_index_file_path)
956
+ store.transaction do
957
+ store['index'] = @entries_index
958
+ end
920
959
  end
921
960
 
922
961
  end
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_development_dependency 'minitest', '~>5.7'
27
27
  spec.add_development_dependency 'simplecov', '~>0.12'
28
- spec.add_development_dependency 'simplecov-phpunit', '~>0.2'
28
+ spec.add_development_dependency 'simplecov-phpunit', '~>0.4'
29
29
 
30
- spec.add_dependency 'uuid', '~>2.3'
30
+ spec.add_runtime_dependency 'uuid', '~>2.3'
31
31
  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.13.0
4
+ version: 0.14.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: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2016-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.2'
47
+ version: '0.4'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.2'
54
+ version: '0.4'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: uuid
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -76,6 +76,7 @@ files:
76
76
  - ".ackrc"
77
77
  - ".editorconfig"
78
78
  - ".gitignore"
79
+ - ".gitlab-ci.yml"
79
80
  - ".travis.yml"
80
81
  - Gemfile
81
82
  - Makefile
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
116
  version: '0'
116
117
  requirements: []
117
118
  rubyforge_project:
118
- rubygems_version: 2.5.1
119
+ rubygems_version: 2.6.7
119
120
  signing_key:
120
121
  specification_version: 4
121
122
  summary: Finances Tracking