hledger-forecast 0.1.5 → 0.1.6

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
  SHA256:
3
- metadata.gz: efe6bca69db97f1f08539e609f7f6db6af22d40c5cf514dce6e543fbc34cd442
4
- data.tar.gz: 21ccaeb1bbfd846e5cf7afc3da4ffa17a9064a851380ed17b09d4efeb517d197
3
+ metadata.gz: 60e8bd939c2bb57d5d1fdf01d39d4fd7bc1cd59886a189b8b0d8a8fe7a7b6640
4
+ data.tar.gz: e752946a04d49b531ca303a8832d11a686d610392ce29d5a7d96c5aae2658dee
5
5
  SHA512:
6
- metadata.gz: ede280944f144b0b055068d5f8e919ab48f2534299dbbd2ff51c599ce1f57a7a1cb7ea72474e0d08a6f3ec27ab17b9ba06ebfe8de7319d7a87d9815648297ffa
7
- data.tar.gz: 1d19fdf61f57e622e734797ce304d4b0337d5942b27aaefcb90965593ecf0a769d811f457ea5424a4eb22e989d6babd562d1cf15f2a556edf103a2430301fb3c
6
+ metadata.gz: a7b44e5ceebc727be1a578a1210741fc5bbb9ec5e6d5a13feb36012bd35fb253173594ef0a35fb8448e1da697575ecdc97797473f7d5751db032a5065cce2bf8
7
+ data.tar.gz: c341817f928c9120662319a6ef9c1434d22b8872e685283b162ad4043efd9a0d1366eeeed4a58196e54708689833fa24af1b6b9e92dc59b8a75a98ad77810390
data/Gemfile CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem 'colorize'
5
6
  gem 'money'
6
7
 
7
8
  gemspec
data/README.md CHANGED
@@ -37,6 +37,7 @@ Running `hledger-forecast -h` shows the available options:
37
37
  -s, --start-date DATE The date to start generating from (yyyy-mm-dd)
38
38
  -e, --end-date DATE The date to start generating to (yyyy-mm-dd)
39
39
  --force Force an overwrite of the output file
40
+ --summarize Summarize the forecast file and output to the terminal
40
41
  -h, --help Show this message
41
42
  --version Show version
42
43
 
@@ -113,6 +114,14 @@ settings:
113
114
  thousands_separator: true # Separate thousands with a comma?
114
115
  ```
115
116
 
117
+ ### Summarizing the config file
118
+
119
+ As your config file grows, it can be helpful to sum up the total amounts and output them in the CLI. This can be achieved by:
120
+
121
+ hledger-forecast -f forecast.yml --summarize
122
+
123
+ where `forecast.yml` is the config file to sum up.
124
+
116
125
  ## :brain: Rationale
117
126
 
118
127
  Firstly, I've come to realise from reading countless blog and Reddit posts on [plain text accounting](https://plaintextaccounting.org), that everyone does it __completely__ differently!
data/bin/hledger-forecast CHANGED
@@ -9,4 +9,4 @@ rescue RuntimeError => e
9
9
  exit(1)
10
10
  end
11
11
 
12
- HledgerForecast::Command.run(options)
12
+ HledgerForecast::CLI.run(options)
data/example.yml CHANGED
@@ -43,6 +43,6 @@ once:
43
43
 
44
44
  settings:
45
45
  currency: GBP
46
- show_symbol: false
46
+ show_symbol: true
47
47
  sign_before_symbol: true
48
- thousands_separator: false
48
+ thousands_separator: true
@@ -14,6 +14,7 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.add_dependency "highline", "~> 2.1.0"
16
16
  s.add_dependency "money", "~> 6.16.0"
17
+ s.add_dependency "colorize", "~> 0.8.1"
17
18
  s.add_development_dependency 'rspec', '~> 3.12'
18
19
 
19
20
  s.files = `git ls-files`.split("\n")
@@ -1,11 +1,13 @@
1
1
  module HledgerForecast
2
- class Command
2
+ class CLI
3
3
  def self.run(args)
4
4
  end_date = args[:end_date]
5
5
  start_date = args[:start_date]
6
6
  forecast = File.read(args[:forecast_file])
7
7
  transactions = args[:transactions_file] ? File.read(args[:transactions_file]) : nil
8
8
 
9
+ return HledgerForecast::Summarize.generate(forecast) if args[:summarize]
10
+
9
11
  puts "[Using default dates: #{start_date} to #{end_date}]" if args[:default_dates]
10
12
 
11
13
  transactions = Generator.create_journal_entries(transactions, forecast, start_date, end_date)
@@ -29,7 +29,7 @@ module HledgerForecast
29
29
  Money.from_cents(formatted_transaction['amount'].to_i * 100, @settings[:currency]).format(
30
30
  symbol: @settings[:show_symbol],
31
31
  sign_before_symbol: @settings[:sign_before_symbol],
32
- thousands_separator: @settings[:thousands_separator] ? ',' : nil
32
+ thousands_separator: @settings[:thousands_separator] ? ',' : nil,
33
33
  )
34
34
 
35
35
  formatted_transaction
@@ -32,6 +32,11 @@ module HledgerForecast
32
32
  options[:end_date] = a
33
33
  end
34
34
 
35
+ opts.on("--summarize",
36
+ "Summarize the forecast file and output to the terminal") do |a|
37
+ options[:summarize] = a
38
+ end
39
+
35
40
  opts.on("--force",
36
41
  "Force an overwrite of the output file") do |a|
37
42
  options[:force] = a
@@ -0,0 +1,68 @@
1
+ module HledgerForecast
2
+ # Summarise a forecast YAML file and output it to the CLI
3
+ class Summarize
4
+ def self.sum_transactions(forecast_data, period)
5
+ category_totals = Hash.new(0)
6
+ forecast_data[period]&.each do |entry|
7
+ entry['transactions'].each do |transaction|
8
+ category_totals[transaction['category']] += transaction['amount']
9
+ end
10
+ end
11
+ category_totals
12
+ end
13
+
14
+ def self.print_category_totals(period, category_totals, generator)
15
+ puts "#{period.capitalize}:"
16
+ period_total = 0
17
+
18
+ category_totals.each do |category, amount|
19
+ formatted_amount = generator.format_transaction({ 'amount' => amount })['amount']
20
+ formatted_amount = amount.to_i < 0 ? formatted_amount.red : formatted_amount.green
21
+ puts " #{category.ljust(40)}#{formatted_amount}"
22
+ period_total += amount
23
+ end
24
+
25
+ formatted_period_total = generator.format_transaction({ 'amount' => period_total })['amount']
26
+ formatted_period_total = period_total.to_i < 0 ? formatted_period_total.red : formatted_period_total.green
27
+ puts " TOTAL".ljust(42) + formatted_period_total
28
+ end
29
+
30
+ def self.sum_all_periods(forecast_data)
31
+ periods = %w[monthly quarterly half-yearly yearly once]
32
+ total = {}
33
+ grand_total = 0
34
+
35
+ periods.each do |period|
36
+ total[period] = sum_transactions(forecast_data, period)
37
+ grand_total += total[period]
38
+ end
39
+
40
+ total['total'] = grand_total
41
+ total
42
+ end
43
+
44
+ def self.generate(forecast)
45
+ forecast_data = YAML.safe_load(forecast)
46
+
47
+ category_totals_by_period = {}
48
+ %w[monthly quarterly half-yearly yearly once].each do |period|
49
+ category_totals_by_period[period] = sum_transactions(forecast_data, period)
50
+ end
51
+
52
+ grand_total = category_totals_by_period.values.map(&:values).flatten.sum
53
+
54
+ generator = HledgerForecast::Generator
55
+ generator.configure_settings(forecast_data)
56
+
57
+ puts
58
+ category_totals_by_period.each do |period, category_totals|
59
+ print_category_totals(period, category_totals, generator)
60
+ puts
61
+ end
62
+
63
+ formatted_grand_total = generator.format_transaction({ 'amount' => grand_total })['amount']
64
+ formatted_grand_total = grand_total.to_i < 0 ? formatted_grand_total.red : formatted_grand_total.green
65
+ puts "TOTAL:".ljust(42) + formatted_grand_total
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,3 @@
1
1
  module HledgerForecast
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'colorize'
3
4
  require 'date'
4
5
  require 'highline'
5
6
  require 'money'
@@ -12,4 +13,5 @@ Money.rounding_mode = BigDecimal::ROUND_HALF_UP
12
13
  require_relative 'hledger_forecast/version'
13
14
  require_relative 'hledger_forecast/options'
14
15
  require_relative 'hledger_forecast/generator'
15
- require_relative 'hledger_forecast/command'
16
+ require_relative 'hledger_forecast/summarize'
17
+ require_relative 'hledger_forecast/CLI'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hledger-forecast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oli Morris
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 6.16.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: colorize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.8.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.8.1
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -70,9 +84,10 @@ files:
70
84
  - example.yml
71
85
  - hledger-forecast.gemspec
72
86
  - lib/hledger_forecast.rb
73
- - lib/hledger_forecast/command.rb
87
+ - lib/hledger_forecast/cli.rb
74
88
  - lib/hledger_forecast/generator.rb
75
89
  - lib/hledger_forecast/options.rb
90
+ - lib/hledger_forecast/summarize.rb
76
91
  - lib/hledger_forecast/version.rb
77
92
  - spec/command_spec.rb
78
93
  - spec/half-yearly_spec.rb