ledgerjournal 0.5.1 → 1.0.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
  SHA256:
3
- metadata.gz: 0b5770e988a14b6a2a45ada7b393d3a7ef857a822e17a5c4da2caebb50393257
4
- data.tar.gz: 5fa7b153ddbddc3a175566086b6ebb8277f75428ad34ea065e13a524ec53b2a8
3
+ metadata.gz: 3b96cd33913d69368fc316ef97ee6654b2c663960d198cccebaa8400d5d5f9b6
4
+ data.tar.gz: c24c388fd31134bf04638828b10d2215da2f2f94dc05c9606d220bde0415326b
5
5
  SHA512:
6
- metadata.gz: d3ce3d96d0e7b9cf22378d8b802b24077be2bcc56f5bffe0005c1b134d1d0621def7f74874ae1f260d5467ce02d7aa06092df30753414b4e59af225f5327fa37
7
- data.tar.gz: c70b31078daf4176609859c4751d45d0c153dcee4cea59c22774a317aecd74163024b8b56d5f7f419b32460a7a4f7167f221c8cfd9cf5471fdf07ba8e51dc7ef
6
+ metadata.gz: bb15f01ae7d43c8a83ad9fbc76434149210e6447d59faef804b0b7245c3c1445c4013b54008550a622d4e454a4e9240e608979937a9c409cfd33729733bcda1d
7
+ data.tar.gz: 064c993bddf12b87f20f001d16d9bd19df988d26b7ad64c6072e0e6ba1a7db83cfbf8f59819786418552bb0048e5d43ad2a2e2cf550a5693cbb6b71f15d589d6
data/.rubocop.yml CHANGED
@@ -4,6 +4,9 @@ Layout/LineLength:
4
4
  Metrics/MethodLength:
5
5
  Max: 30
6
6
 
7
+ Metrics/ClassLength:
8
+ Max: 300
9
+
7
10
  Style/RedundantReturn:
8
11
  Enabled: false
9
12
 
data/Gemfile CHANGED
@@ -6,4 +6,4 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  gem 'minitest', '~> 5.0'
9
- gem 'rake', '~> 12.0'
9
+ gem 'rake', '~> 13.0'
data/Gemfile.lock CHANGED
@@ -1,27 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ledgerjournal (0.5.1)
4
+ ledgerjournal (0.6.0)
5
+ bigdecimal
5
6
  nokogiri (~> 1.10)
6
7
  open4 (~> 1.3)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
11
- mini_portile2 (2.4.0)
12
- minitest (5.14.0)
13
- nokogiri (1.10.9)
14
- mini_portile2 (~> 2.4.0)
12
+ bigdecimal (3.2.2)
13
+ docile (1.4.1)
14
+ mini_portile2 (2.8.9)
15
+ minitest (5.25.5)
16
+ nokogiri (1.18.10)
17
+ mini_portile2 (~> 2.8.2)
18
+ racc (~> 1.4)
19
+ nokogiri (1.18.10-x86_64-darwin)
20
+ racc (~> 1.4)
15
21
  open4 (1.3.4)
16
- rake (12.3.3)
22
+ racc (1.8.1)
23
+ rake (13.3.0)
24
+ simplecov (0.22.0)
25
+ docile (~> 1.1)
26
+ simplecov-html (~> 0.11)
27
+ simplecov_json_formatter (~> 0.1)
28
+ simplecov-html (0.13.2)
29
+ simplecov_json_formatter (0.1.4)
17
30
 
18
31
  PLATFORMS
19
32
  ruby
33
+ x86_64-darwin-19
20
34
 
21
35
  DEPENDENCIES
22
36
  ledgerjournal!
23
37
  minitest (~> 5.0)
24
- rake (~> 12.0)
38
+ rake (~> 13.0)
39
+ simplecov
25
40
 
26
41
  BUNDLED WITH
27
- 2.1.4
42
+ 2.6.8
data/README.md CHANGED
@@ -10,16 +10,16 @@ The ledger binary needs to be installed to parse and pretty-print.
10
10
 
11
11
  ## Usage
12
12
 
13
- Parsing a leger file:
13
+ Parsing a ledger journal file:
14
14
 
15
15
  ```ruby
16
- journal = Ledger::Journal.new(path: "example_journal.txt")
16
+ journal = Ledger::Journal.new(path: "example_journal.dat")
17
17
  journal.transactions.each do |tx|
18
18
  puts tx.date, tx.payee
19
19
  end
20
20
  ```
21
21
 
22
- Creating a ledger:
22
+ Creating a ledger file from scratch:
23
23
 
24
24
  ```ruby
25
25
  journal = Ledger::Journal.new()
@@ -37,9 +37,30 @@ journal.transactions << Ledger::Transaction.new(
37
37
  puts(journal.to_s)
38
38
  ```
39
39
 
40
+ Appending to a ledger journal:
41
+
42
+ ```ruby
43
+ journal = Ledger::Journal.new(path: "example_journal.dat")
44
+ journal.transactions << Ledger::Transaction.new(
45
+ date: Date.new(2020, 1, 2),
46
+ payee: 'Example Payee',
47
+ postings: [
48
+ Ledger::Posting.new(account: "Expenses:Unknown", currency: "EUR", amount: BigDecimal('1234.56')),
49
+ Ledger::Posting.new(account: "Assets:Checking", currency: "EUR", amount: BigDecimal('-1234.56'))
50
+ ]
51
+ )
52
+ journal.save!
53
+ ```
54
+
55
+ Running ledger commands:
56
+
57
+ ```ruby
58
+ puts Ledger.defaults.run('--version')
59
+ ```
60
+
40
61
  ### Locale-specific settings
41
62
 
42
- By default ledgerjournal expectes the ledger default date format '%Y/%m/%d' and amounts with decimal point (1234.56). This is configurable:
63
+ By default ledgerjournal expects the date format '%Y/%m/%d' and amounts with decimal point (1234.56). This is configurable:
43
64
 
44
65
  ```ruby
45
66
  Ledger.defaults = Options.new(date_format: '%d.%m.%Y', decimal_comma: true)
@@ -17,10 +17,9 @@ The ledger binary needs to be installed to parse and pretty-print.'
17
17
  spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
18
18
 
19
19
  spec.metadata = {
20
- 'homepage_uri' => spec.homepage,
21
20
  'source_code_uri' => 'https://github.com/ralfebert/ledgerjournal.git',
22
21
  'bug_tracker_uri' => 'https://github.com/ralfebert/ledgerjournal/issues',
23
- 'documentation_uri' => "https://www.rubydoc.info/gems/ledgerjournal/#{Ledger::VERSION}"
22
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/ledgerjournal/'
24
23
  }
25
24
 
26
25
  # Specify which files should be added to the gem when it is released.
@@ -32,4 +31,6 @@ The ledger binary needs to be installed to parse and pretty-print.'
32
31
 
33
32
  spec.add_dependency 'nokogiri', '~> 1.10'
34
33
  spec.add_dependency 'open4', '~> 1.3'
34
+ spec.add_dependency 'bigdecimal'
35
+ spec.add_development_dependency 'simplecov'
35
36
  end
@@ -23,8 +23,7 @@ module Ledger
23
23
  @path = path
24
24
  raise Error, "#{@path} not found" unless File.exist?(@path)
25
25
 
26
- args = ["-f #{@path.shellescape}", ledger_args].compact.join(' ')
27
- read_ledger(ledger_args: args)
26
+ read_ledger(ledger_args: ["-f #{@path.shellescape}", ledger_args].compact.join(' '))
28
27
  end
29
28
  end
30
29
 
@@ -38,6 +37,8 @@ module Ledger
38
37
  # @param [Boolean] pretty_print calls ledger to format the journal if true
39
38
  def to_s(pretty_print: true)
40
39
  str = transactions.map(&:to_s).join("\n\n")
40
+ # add a newline at the end of the file - see https://github.com/ledger/ledger/issues/516
41
+ str += "\n"
41
42
  if pretty_print
42
43
  begin
43
44
  str = Ledger.defaults.run('-f - print', stdin: str)
@@ -69,7 +70,7 @@ module Ledger
69
70
  def read_ledger(ledger_args: '')
70
71
  xml_result = Ledger.defaults.run(ledger_args + ' xml')
71
72
  xml = Nokogiri::XML(xml_result)
72
- @transactions = xml.css('transaction').map { |tx_xml| Transaction.parse_xml(tx_xml) }
73
+ @transactions = xml.xpath('ledger/transactions/transaction').map { |tx_xml| Transaction.parse_xml(tx_xml) }
73
74
  end
74
75
  end
75
76
  end
@@ -3,6 +3,9 @@
3
3
  module Ledger
4
4
  # Options for interaction with ledger-cli
5
5
  class Options
6
+ attr_reader :date_format
7
+ attr_reader :decimal_comma
8
+
6
9
  # @param [String] date_format like '%Y/%m/%d' to pass to ledger-cli
7
10
  # @param [Boolean] decimal_comma pass true to use a comma as decimal separator, otherwise a dot is used
8
11
  def initialize(date_format:, decimal_comma:)
@@ -43,10 +43,11 @@ module Ledger
43
43
  end
44
44
 
45
45
  def to_s
46
- posting_line = "#{account} #{currency} #{Ledger.defaults.format(amount)}"
46
+ posting_line = "#{account} "
47
+ posting_line += "#{currency} #{Ledger.defaults.format(amount)}".rjust(48 - posting_line.length, ' ')
47
48
  posting_line += " = #{currency} #{Ledger.defaults.format(balance_assignment)}" if balance_assignment
48
49
  lines = [posting_line]
49
- lines += metadata.to_a.sort { |a, b| a[0].casecmp(b[0]) }.collect { |m| "; #{m[0]}: #{m[1]}" } unless metadata.empty?
50
+ lines += metadata.to_a.collect { |m| "; #{m[0]}: #{m[1]}" } unless metadata.empty?
50
51
  return lines.join("\n")
51
52
  end
52
53
 
@@ -21,7 +21,7 @@ module Ledger
21
21
 
22
22
  def self.parse_xml(xml)
23
23
  Transaction.new(
24
- date: Date.strptime(xml.xpath('date').text, '%Y/%m/%d'),
24
+ date: Date.strptime(xml.xpath('date').text, Ledger.defaults.date_format),
25
25
  payee: xml.xpath('payee').text,
26
26
  state: xml['state'].to_sym,
27
27
  metadata: Hash[xml.xpath('metadata/value').collect { |m| [m['key'], m.xpath('string').text] }],
@@ -38,11 +38,11 @@ module Ledger
38
38
  states = { pending: '!', cleared: '*' }
39
39
  lines = ["#{date_str} #{states[state]} #{payee}"]
40
40
 
41
- lines += metadata.to_a.sort { |a, b| a[0].casecmp(b[0]) }.collect { |m| " ; #{m[0]}: #{m[1]}" } unless metadata.empty?
41
+ lines += metadata.to_a.collect { |m| " ; #{m[0]}: #{m[1]}" } unless metadata.empty?
42
42
 
43
43
  lines += postings.map { |posting| posting.to_s.lines.map { |line| ' ' + line }.join }
44
44
 
45
- return lines.join("\n") + "\n"
45
+ return lines.join("\n")
46
46
  end
47
47
 
48
48
  # @param [String, Array<String>] accounts name(s)
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Ledger
4
4
  # ledgerjournal version
5
- VERSION = '0.5.1'
5
+ VERSION = '1.0.0'
6
6
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledgerjournal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ralf Ebert
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2020-04-26 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: nokogiri
@@ -38,6 +37,34 @@ dependencies:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
39
  version: '1.3'
40
+ - !ruby/object:Gem::Dependency
41
+ name: bigdecimal
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: simplecov
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
41
68
  description: |-
42
69
  ledgerjournal is a Ruby gem to read and write ledger accounting files.
43
70
  For parsing, it uses the xml output from ledger. For outputting, it formats the ledger data to String in custom Ruby code.
@@ -69,11 +96,9 @@ homepage: https://github.com/ralfebert/ledgerjournal
69
96
  licenses:
70
97
  - MIT
71
98
  metadata:
72
- homepage_uri: https://github.com/ralfebert/ledgerjournal
73
99
  source_code_uri: https://github.com/ralfebert/ledgerjournal.git
74
100
  bug_tracker_uri: https://github.com/ralfebert/ledgerjournal/issues
75
- documentation_uri: https://www.rubydoc.info/gems/ledgerjournal/0.5.1
76
- post_install_message:
101
+ documentation_uri: https://www.rubydoc.info/gems/ledgerjournal/
77
102
  rdoc_options: []
78
103
  require_paths:
79
104
  - lib
@@ -88,8 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
113
  - !ruby/object:Gem::Version
89
114
  version: '0'
90
115
  requirements: []
91
- rubygems_version: 3.0.4
92
- signing_key:
116
+ rubygems_version: 3.6.8
93
117
  specification_version: 4
94
118
  summary: Library to read and write ledger accounting files.
95
119
  test_files: []