ledgerjournal 0.5.1 → 0.6.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
  SHA256:
3
- metadata.gz: 0b5770e988a14b6a2a45ada7b393d3a7ef857a822e17a5c4da2caebb50393257
4
- data.tar.gz: 5fa7b153ddbddc3a175566086b6ebb8277f75428ad34ea065e13a524ec53b2a8
3
+ metadata.gz: 0bb59ca2d7f64a129c519354a4d9cdfb5d3eb4b7f97cb58d2232a4558315cfb2
4
+ data.tar.gz: 2ee806a9ab9755e980581d1b96910d8f692c7ff03cdd9700fbd0d673f6e592e4
5
5
  SHA512:
6
- metadata.gz: d3ce3d96d0e7b9cf22378d8b802b24077be2bcc56f5bffe0005c1b134d1d0621def7f74874ae1f260d5467ce02d7aa06092df30753414b4e59af225f5327fa37
7
- data.tar.gz: c70b31078daf4176609859c4751d45d0c153dcee4cea59c22774a317aecd74163024b8b56d5f7f419b32460a7a4f7167f221c8cfd9cf5471fdf07ba8e51dc7ef
6
+ metadata.gz: a5ecd9601da9786418765ebc5d5c7488ba225fce0c332a70919e13809387278d633905eb211eef170c3a87c50daa5f6c6a53d019b4c200819279cb53bc1d21d7
7
+ data.tar.gz: bc1f7e4b702408d90ec302617ffa37514530e2542d85d92033b72e8d42ecce0834935a084a44c9fb526a2fbd0cd2c45b83cae50818f31c6207b7ce29ea4e9df5
@@ -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
 
@@ -8,12 +8,17 @@ PATH
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ docile (1.3.2)
11
12
  mini_portile2 (2.4.0)
12
13
  minitest (5.14.0)
13
14
  nokogiri (1.10.9)
14
15
  mini_portile2 (~> 2.4.0)
15
16
  open4 (1.3.4)
16
17
  rake (12.3.3)
18
+ simplecov (0.18.5)
19
+ docile (~> 1.1)
20
+ simplecov-html (~> 0.11)
21
+ simplecov-html (0.12.2)
17
22
 
18
23
  PLATFORMS
19
24
  ruby
@@ -22,6 +27,7 @@ DEPENDENCIES
22
27
  ledgerjournal!
23
28
  minitest (~> 5.0)
24
29
  rake (~> 12.0)
30
+ simplecov
25
31
 
26
32
  BUNDLED WITH
27
33
  2.1.4
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,5 @@ 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_development_dependency 'simplecov'
35
35
  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 = '0.6.0'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledgerjournal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ralf Ebert
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-26 00:00:00.000000000 Z
11
+ date: 2020-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: |-
42
56
  ledgerjournal is a Ruby gem to read and write ledger accounting files.
43
57
  For parsing, it uses the xml output from ledger. For outputting, it formats the ledger data to String in custom Ruby code.
@@ -69,11 +83,10 @@ homepage: https://github.com/ralfebert/ledgerjournal
69
83
  licenses:
70
84
  - MIT
71
85
  metadata:
72
- homepage_uri: https://github.com/ralfebert/ledgerjournal
73
86
  source_code_uri: https://github.com/ralfebert/ledgerjournal.git
74
87
  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:
88
+ documentation_uri: https://www.rubydoc.info/gems/ledgerjournal/
89
+ post_install_message:
77
90
  rdoc_options: []
78
91
  require_paths:
79
92
  - lib
@@ -88,8 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
101
  - !ruby/object:Gem::Version
89
102
  version: '0'
90
103
  requirements: []
91
- rubygems_version: 3.0.4
92
- signing_key:
104
+ rubygems_version: 3.0.8
105
+ signing_key:
93
106
  specification_version: 4
94
107
  summary: Library to read and write ledger accounting files.
95
108
  test_files: []