thefox-wallet 0.15.0 → 0.16.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: 2cbb979259e323ea7267d725982ce79a4031b915
4
- data.tar.gz: 97e01ebf34e7fe376b1898fc4154527f64e41f71
3
+ metadata.gz: 371beb2557b5d4b13a93fa29ec2a4314d3988253
4
+ data.tar.gz: 557b1b3fd12d91150875cae58ca6a7226f2aaa1a
5
5
  SHA512:
6
- metadata.gz: dbb7973fbd8bbe143409c33d2c329480e04d4acb20bfbedd31ce3fce400e3c9856174c9b715bccc2dc4595971d1253dbf95a2d62701f4deb037ce61e50948e8e
7
- data.tar.gz: 9be10133bac53c6b17ad37905345517c408f9b1d0b1b1a68b957820ce0c436dc94b83075211f53d9563a5881fd6c6c337911d06866132311a108e965564fc0bf
6
+ metadata.gz: 626f9cc9eb31732942d00247bed4059b0652923a11b842e46b54803817c6abd7a3ca489ad0acc441d44f6d158910e0553c0afc2d9654ea51920287e29063f378
7
+ data.tar.gz: 7fe39b9adf2b48a9d95d1cc89e1e4b3f2c7152ff3159442c3191b36b2962bc4cae53f12787540df836ea26b005efd20fff1d0d2db45364dff18dccd8d4c3ad0d
data/bin/wallet CHANGED
@@ -17,10 +17,11 @@ opts = OptionParser.new do |o|
17
17
  o.separator('Commands:')
18
18
  o.separator('')
19
19
  o.separator(' add Add a new entry')
20
- o.separator(' list List entries')
21
20
  o.separator(' categories List categories')
22
- o.separator(' html Generate HTML files')
21
+ o.separator(' clear Clear temp and cache files')
23
22
  o.separator(' csv Import/Export CSV file')
23
+ o.separator(' html Generate HTML files')
24
+ o.separator(' list List entries')
24
25
  o.separator(' vi Import per VIM editor')
25
26
  o.separator('')
26
27
 
@@ -72,7 +73,7 @@ opts = OptionParser.new do |o|
72
73
  @options[:is_export] = true
73
74
  end
74
75
 
75
- o.on('-p', '--path <path>', 'Path used for csv import/export.') do |path|
76
+ o.on('-p', '--path <path>', 'Path used for csv import/export and html directory path.') do |path|
76
77
  @options[:path] = path
77
78
  end
78
79
 
@@ -35,10 +35,11 @@ module TheFox::Wallet
35
35
  def self.create_by_name(name, options = nil)
36
36
  classes = [
37
37
  AddCommand,
38
- ListCommand,
39
38
  CategoriesCommand,
40
- HtmlCommand,
39
+ ClearCommand,
41
40
  CsvCommand,
41
+ HtmlCommand,
42
+ ListCommand,
42
43
  ]
43
44
 
44
45
  classes.each do |cclass|
@@ -16,7 +16,12 @@ module TheFox::Wallet
16
16
  print "title: [#{@options[:entry_title]}] "
17
17
  title_t = STDIN.gets.strip
18
18
  if title_t.length > 0
19
- @options[:entry_title] = title_t
19
+ if @options[:entry_title] =~ /%d/
20
+ @options[:entry_title] = @options[:entry_title] % title_t.split(',').map{ |s| s.strip }
21
+ else
22
+ @options[:entry_title] = title_t
23
+ end
24
+ puts "title: #{@options[:entry_title]}"
20
25
  end
21
26
 
22
27
  print "date: [#{@options[:entry_date]}] "
@@ -0,0 +1,17 @@
1
+
2
+ require 'pathname'
3
+
4
+ module TheFox::Wallet
5
+
6
+ class ClearCommand < Command
7
+
8
+ NAME = 'clear'
9
+
10
+ def run
11
+ wallet = Wallet.new(@options[:wallet_path])
12
+ wallet.logger = @options[:logger]
13
+ wallet.clear
14
+ end
15
+
16
+ end
17
+ end
@@ -1,4 +1,6 @@
1
1
 
2
+ require 'pathname'
3
+
2
4
  module TheFox::Wallet
3
5
 
4
6
  class HtmlCommand < Command
@@ -6,17 +8,13 @@ module TheFox::Wallet
6
8
  NAME = 'html'
7
9
 
8
10
  def run
9
- wallet = Wallet.new(@options[:wallet_path])
10
- wallet.logger = @options[:logger]
11
-
12
- html_path = Pathname.new('html').expand_path(wallet.dir_path)
13
11
  if @options[:path]
14
12
  html_path = Pathname.new(@options[:path]).expand_path
15
13
  end
16
14
 
17
- @options[:logger].info("generate html to #{html_path} ...") if @options[:logger]
18
- wallet.gen_html(html_path, @options[:entry_date_start], @options[:entry_date_end], @options[:entry_category])
19
- @options[:logger].info('generate html done') if @options[:logger]
15
+ wallet = Wallet.new(@options[:wallet_path])
16
+ wallet.logger = @options[:logger]
17
+ wallet.generate_html(html_path, @options[:entry_date_start], @options[:entry_date_end], @options[:entry_category])
20
18
  end
21
19
 
22
20
  end
@@ -2,8 +2,8 @@
2
2
  module TheFox
3
3
  module Wallet
4
4
  NAME = 'Wallet'
5
- VERSION = '0.15.0'
6
- DATE = '2016-11-13'
5
+ VERSION = '0.16.0'
6
+ DATE = '2017-02-19'
7
7
  HOMEPAGE = 'https://github.com/TheFox/wallet'
8
8
 
9
9
  NUMBER_FORMAT = '%.2f'
data/lib/wallet/wallet.rb CHANGED
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  require 'yaml/store'
7
7
  require 'csv'
8
8
  require 'pathname'
9
+ require 'fileutils'
9
10
  require 'ostruct' # OpenStruct use to generate HTML.
10
11
  # require 'pp'
11
12
 
@@ -25,6 +26,7 @@ module TheFox
25
26
  @dir_path_basename_s = @dir_path_basename.to_s
26
27
  @data_path = Pathname.new('data').expand_path(@dir_path)
27
28
  @tmp_path = Pathname.new('tmp').expand_path(@dir_path)
29
+ @html_path = Pathname.new('html').expand_path(@dir_path)
28
30
 
29
31
  @has_transaction = false
30
32
  @transaction_files = Hash.new
@@ -35,7 +37,7 @@ module TheFox
35
37
  @entries_index_is_loaded = false
36
38
 
37
39
  Signal.trap('SIGINT') do
38
- @logger.warning('received SIGINT. break ...') if @logger
40
+ #@logger.warn('received SIGINT. break ...') if @logger
39
41
  @exit = true
40
42
  end
41
43
  end
@@ -302,7 +304,15 @@ module TheFox
302
304
  categories_a
303
305
  end
304
306
 
305
- def gen_html(html_path, date_start = nil, date_end = nil, category = nil)
307
+ ##
308
+ # Generate HTML files from date_start to date_end.
309
+ def generate_html(html_path = nil, date_start = nil, date_end = nil, category = nil)
310
+ # @FIXME use @exit on all loops in this function
311
+
312
+ html_path ||= @html_path
313
+
314
+ @logger.info("generate html to #{html_path} ...") if @logger
315
+
306
316
  create_dirs
307
317
 
308
318
  unless html_path.exist?
@@ -336,6 +346,7 @@ module TheFox
336
346
  categories_total_balance = Hash.new
337
347
  categories_available.map{ |item| categories_total_balance[item] = 0.0 }
338
348
 
349
+ # Ignore the html directory.
339
350
  gitignore_file_path = Pathname.new('.gitignore').expand_path(html_path)
340
351
  gitignore_file = File.open(gitignore_file_path, 'w')
341
352
  gitignore_file.write('*')
@@ -366,21 +377,10 @@ module TheFox
366
377
  ')
367
378
  css_file.close
368
379
 
369
- index_file_path = Pathname.new('index.html').expand_path(html_path)
370
- index_file = File.open(index_file_path, 'w')
371
- index_file.write('
372
- <html>
373
- <head>
374
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
375
- <title>' << @dir_path_basename_s << '</title>
376
- <link rel="stylesheet" href="style.css" type="text/css" />
377
- </head>
378
- <body>
379
- <h1>' << @dir_path_basename_s << '</h1>
380
- <p>Generated @ ' << DateTime.now.strftime('%F %T') << ' by <a href="' << HOMEPAGE << '">' << NAME << '</a> v' << VERSION << '</p>
381
- ')
382
-
380
+ # Use this for index.html.
383
381
  years_total = Hash.new
382
+
383
+ # Iterate over all years.
384
384
  years(date_start, date_end).each do |year|
385
385
  year_s = year.to_s
386
386
  year_file_name_s = "year_#{year}.html"
@@ -458,23 +458,24 @@ module TheFox
458
458
  entry_n = 0
459
459
  data = YAML.load_file(file_path)
460
460
 
461
- generate_html = false
461
+ # Determine if the html file should be updated.
462
+ write_html = false
462
463
  if html_options['changes'][file_name_s]
463
464
  if html_options['changes'][file_name_s]['updated_at'] != data['meta']['updated_at']
464
465
  html_options['changes'][file_name_s]['updated_at'] = data['meta']['updated_at']
465
- generate_html = true
466
+ write_html = true
466
467
  end
467
468
  else
468
469
  html_options['changes'][file_name_s] = {
469
470
  'updated_at' => data['meta']['updated_at'],
470
471
  }
471
- generate_html = true
472
+ write_html = true
472
473
  end
473
474
  unless month_file_path.exist?
474
- generate_html = true
475
+ write_html = true
475
476
  end
476
477
 
477
- if generate_html
478
+ if write_html
478
479
  @logger.debug("file: #{month_file_name_s} (from #{file_name_s})") if @logger
479
480
 
480
481
  month_file = File.open(month_file_path, 'w')
@@ -509,13 +510,7 @@ module TheFox
509
510
  entry_date = Date.parse(entry['date'])
510
511
  entry_date_s = entry_date.strftime('%d.%m.%y')
511
512
 
512
- date_start_oor = date_start > entry_date
513
- date_end_oor = date_end < entry_date
514
-
515
- if category && !categories_available.include?(entry['category']) ||
516
- date_start > entry_date ||
517
- date_end < entry_date
518
-
513
+ if category && !categories_available.include?(entry['category'])
519
514
  next
520
515
  end
521
516
 
@@ -532,7 +527,7 @@ module TheFox
532
527
  category_out = entry['category'] == 'default' ? '&nbsp;' : entry['category']
533
528
  comment_out = entry['comment'] == '' ? '&nbsp;' : entry['comment']
534
529
 
535
- if generate_html
530
+ if write_html
536
531
  month_file.write('
537
532
  <tr>
538
533
  <td valign="top" class="left">' << entry_n.to_s << '</td>
@@ -569,7 +564,7 @@ module TheFox
569
564
  if balance_month < 0
570
565
  balance_class = 'red'
571
566
  end
572
- if generate_html
567
+ if write_html
573
568
  month_file.write('
574
569
  <tr>
575
570
  <th>&nbsp;</th>
@@ -671,6 +666,21 @@ module TheFox
671
666
 
672
667
  years_total.sort.inject(0.0){ |sum, item| item[1].balance_total = (sum + item[1].balance).round(NUMBER_ROUND) }
673
668
 
669
+ index_file_path = Pathname.new('index.html').expand_path(html_path)
670
+ index_file = File.open(index_file_path, 'w')
671
+ index_file.write('
672
+ <html>
673
+ <head>
674
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
675
+ <title>' << @dir_path_basename_s << '</title>
676
+ <link rel="stylesheet" href="style.css" type="text/css" />
677
+ </head>
678
+ <body>
679
+ <h1>' << @dir_path_basename_s << '</h1>
680
+ <p>Generated @ ' << DateTime.now.strftime('%F %T') << ' by <a href="' << HOMEPAGE << '">' << NAME << '</a> v' << VERSION << '</p>
681
+ ')
682
+
683
+ # Write total to index.html file.
674
684
  index_file.write('
675
685
  <table class="list">
676
686
  <tr>
@@ -680,6 +690,8 @@ module TheFox
680
690
  <th class="right">Balance</th>
681
691
  <th class="right">Balance &#8721;</th>
682
692
  </tr>')
693
+
694
+ # Write years total to index.html file.
683
695
  years_total.each do |year_name, year_data|
684
696
  index_file.write('
685
697
  <tr>
@@ -694,18 +706,16 @@ module TheFox
694
706
  balance_total = years_total.inject(0.0){ |sum, item| sum + item[1].balance }
695
707
 
696
708
  index_file.write('
697
- <tr>
698
- <th class="left"><b>TOTAL</b></th>
699
- <th class="right">' << NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].revenue } << '</th>
700
- <th class="right red">' << NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].expense } << '</th>
701
- <th class="right ' << (balance_total < 0 ? 'red' : '') << '">' << NUMBER_FORMAT % balance_total << '</th>
702
- <th>&nbsp;</th>
703
- </tr>
704
- </table>
705
-
706
- <p><img src="total.png"></p>
707
- ')
708
- index_file.write('
709
+ <tr>
710
+ <th class="left"><b>TOTAL</b></th>
711
+ <th class="right">' << NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].revenue } << '</th>
712
+ <th class="right red">' << NUMBER_FORMAT % years_total.inject(0.0){ |sum, item| sum + item[1].expense } << '</th>
713
+ <th class="right ' << (balance_total < 0 ? 'red' : '') << '">' << NUMBER_FORMAT % balance_total << '</th>
714
+ <th>&nbsp;</th>
715
+ </tr>
716
+ </table>
717
+
718
+ <p><img src="total.png"></p>
709
719
  </body>
710
720
  </html>
711
721
  ')
@@ -723,11 +733,13 @@ module TheFox
723
733
  end
724
734
  totaldat_file_c = totaldat_file_c.join("\n")
725
735
 
736
+ # DAT file for GNUPlot.
726
737
  totaldat_file_path = Pathname.new('total.dat').expand_path(@tmp_path)
727
738
  totaldat_file = File.new(totaldat_file_path, 'w')
728
739
  totaldat_file.write(totaldat_file_c)
729
740
  totaldat_file.close
730
741
 
742
+ # Generate image with GNUPlot.
731
743
  png_file_path = Pathname.new('total.png').expand_path(html_path)
732
744
 
733
745
  gnuplot_file_path = Pathname.new('total.gp').expand_path(@tmp_path)
@@ -755,6 +767,8 @@ module TheFox
755
767
  gnuplot_file.close
756
768
 
757
769
  system("gnuplot #{gnuplot_file_path} &> /dev/null")
770
+
771
+ @logger.info('generate html done') if @logger
758
772
  end
759
773
 
760
774
  def import_csv_file(file_path)
@@ -864,6 +878,33 @@ module TheFox
864
878
  @entries_by_ids[id]
865
879
  end
866
880
 
881
+ def clear
882
+ c = 0
883
+
884
+ # Take the standard html path instead of --path option.
885
+ # Do not provide the functionality to delete files from --path.
886
+ # If a user uses --path to generate html files outside of the
887
+ # wallet path the user needs to manual remove these files.
888
+ children = @tmp_path.children + @html_path.children
889
+
890
+ children.each do |child|
891
+
892
+ if child.basename.to_s[0] == '.'
893
+ # Ignore 'hidden' files like .gitignore.
894
+ next
895
+ end
896
+
897
+ # puts "child #{child}"
898
+ FileUtils.rm_rf(child)
899
+
900
+ c += 1
901
+ if c > 100
902
+ # If something goes wrong do not delete to whole harddisk. ;)
903
+ break
904
+ end
905
+ end
906
+ end
907
+
867
908
  private
868
909
 
869
910
  def create_dirs
data/lib/wallet.rb CHANGED
@@ -4,7 +4,8 @@ require 'wallet/wallet'
4
4
  require 'wallet/entry'
5
5
  require 'wallet/command'
6
6
  require 'wallet/command_add'
7
- require 'wallet/command_list'
8
7
  require 'wallet/command_categories'
9
- require 'wallet/command_html'
8
+ require 'wallet/command_clear'
10
9
  require 'wallet/command_csv'
10
+ require 'wallet/command_html'
11
+ require 'wallet/command_list'
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.15.0
4
+ version: 0.16.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-11-13 00:00:00.000000000 Z
11
+ date: 2017-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -102,6 +102,7 @@ files:
102
102
  - lib/wallet/command.rb
103
103
  - lib/wallet/command_add.rb
104
104
  - lib/wallet/command_categories.rb
105
+ - lib/wallet/command_clear.rb
105
106
  - lib/wallet/command_csv.rb
106
107
  - lib/wallet/command_html.rb
107
108
  - lib/wallet/command_list.rb
@@ -130,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
131
  version: '0'
131
132
  requirements: []
132
133
  rubyforge_project:
133
- rubygems_version: 2.6.8
134
+ rubygems_version: 2.6.10
134
135
  signing_key:
135
136
  specification_version: 4
136
137
  summary: Finances Tracking