gnucash 1.2.0 → 1.2.1

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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTlmNWViYWRiZWVmNzlhYWE2NDdmODc1ZGIyYmFmZTEzNzBiOGJkYg==
5
- data.tar.gz: !binary |-
6
- YmFmZGY1YmQ0NzkxYTRlMGEzYjBiNjVjZDE0ZTBjNDU2MGQxMGVjMQ==
2
+ SHA1:
3
+ metadata.gz: f91912ae36d38bc2c602c735564159fd14114e43
4
+ data.tar.gz: c95bc53e838d5595872d3edcb16945ba84e9d0d6
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NzExNTNlOTgxZjk3MjI2ZWQ4ZmFlMDIwZDEwOTQ1YzZmN2I4MmEyM2E1YTlm
10
- MGNlMjU1NzE2MjdkZTVmZDdmZWM5YzkzNDU3YmM2MThhNzk0NzMyYzViMzBk
11
- Y2E0MTM4ZTNmYWIzOGUzNzk1ZDkwYWJjMjU2ZGYyYzEwNzBhNmE=
12
- data.tar.gz: !binary |-
13
- ZjY0NzY5YjZhN2Y0OWMyNTNmNzRmMjE3MTE0MjFhNjM0YWUzNTcxY2Y1ZmM1
14
- ODg2Y2UzMzJhODJjODNiZDIxNDAwOTllMDFhOTVkNTZiYWEwYmIzZWRjYTZk
15
- ZTQ1MTU4ODBlZDQ4ZTcxOTkxZWZhNjA5Y2M3ZGQzNGYwN2U0Mzg=
6
+ metadata.gz: 129f20266029b1d5e2529d3c23084b0d75f13988b87dceb8aad9b58e236ef5001a3014a857d584716aa1914543ee96d7cf449fc51226e896fd713788afe56a49
7
+ data.tar.gz: 479734374bb70a35026880996ef489923d18544c8b85fe82c2c8bdd4dbb1dba8590c6a60f72cc0edbf44b678ca3eb7593572f4a0303445901a5784314108a442
data/.gitignore CHANGED
@@ -3,7 +3,6 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
7
6
  InstalledFiles
8
7
  _yardoc
9
8
  coverage
@@ -0,0 +1,50 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gnucash (1.2.1)
5
+ nokogiri
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.3)
11
+ docile (1.1.5)
12
+ json (2.1.0)
13
+ mini_portile2 (2.2.0)
14
+ nokogiri (1.8.0)
15
+ mini_portile2 (~> 2.2.0)
16
+ rake (12.0.0)
17
+ rdoc (5.1.0)
18
+ rspec (3.6.0)
19
+ rspec-core (~> 3.6.0)
20
+ rspec-expectations (~> 3.6.0)
21
+ rspec-mocks (~> 3.6.0)
22
+ rspec-core (3.6.0)
23
+ rspec-support (~> 3.6.0)
24
+ rspec-expectations (3.6.0)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.6.0)
27
+ rspec-mocks (3.6.0)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.6.0)
30
+ rspec-support (3.6.0)
31
+ simplecov (0.15.0)
32
+ docile (~> 1.1.0)
33
+ json (>= 1.8, < 3)
34
+ simplecov-html (~> 0.10.0)
35
+ simplecov-html (0.10.2)
36
+ yard (0.9.9)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ gnucash!
43
+ rake
44
+ rdoc
45
+ rspec
46
+ simplecov
47
+ yard
48
+
49
+ BUNDLED WITH
50
+ 1.10.6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Gnucash
2
2
 
3
- Ruby library for extracting data from GnuCash data files
3
+ Ruby library for extracting data from XML GnuCash data files
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/gnucash.png)](http://badge.fury.io/rb/gnucash)
6
6
 
data/Rakefile CHANGED
@@ -7,10 +7,9 @@ end
7
7
  require "bundler/gem_tasks"
8
8
  require "rake/clean"
9
9
  require "rspec/core/rake_task"
10
- require "rdoc/task"
11
10
  require "yard"
12
11
 
13
- CLEAN.include "rdoc"
12
+ CLEAN.include "doc"
14
13
  CLEAN.include "pkg"
15
14
  CLEAN.include "coverage"
16
15
 
@@ -20,10 +19,4 @@ end
20
19
 
21
20
  RSpec::Core::RakeTask.new("spec")
22
21
 
23
- Rake::RDocTask.new(:rdoc) do |rdoc|
24
- rdoc.rdoc_dir = 'rdoc'
25
- rdoc.title = "Ruby library for extracting data from GnuCash data files"
26
- rdoc.rdoc_files.include('lib/**/*.rb')
27
- end
28
-
29
22
  task :default => :spec
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Gnucash::VERSION
9
9
  gem.authors = ["Josh Holtrop"]
10
10
  gem.email = ["jholtrop@gmail.com"]
11
- gem.description = %q{Ruby library for extracting data from GnuCash data files}
12
- gem.summary = %q{Extract data from GnuCash data files}
11
+ gem.description = %q{Ruby library for extracting data from XML GnuCash data files}
12
+ gem.summary = %q{Extract data from XML GnuCash data files}
13
13
  gem.homepage = "https://github.com/holtrop/ruby-gnucash"
14
14
  gem.license = "MIT"
15
15
 
@@ -22,10 +22,7 @@ Gem::Specification.new do |gem|
22
22
 
23
23
  gem.add_development_dependency "simplecov"
24
24
  gem.add_development_dependency "rspec"
25
- gem.add_development_dependency "rspec-core"
26
- gem.add_development_dependency "rspec-expectations"
27
- gem.add_development_dependency "rspec-mocks"
28
25
  gem.add_development_dependency "rake"
29
- gem.add_development_dependency "rdoc"
30
26
  gem.add_development_dependency "yard"
27
+ gem.add_development_dependency "rdoc"
31
28
  end
@@ -5,12 +5,18 @@ require_relative "gnucash/transaction"
5
5
  require_relative "gnucash/value"
6
6
  require_relative "gnucash/version"
7
7
 
8
- # Namespace module for gnucash gem functionality
8
+ # Namespace module for gnucash gem functionality.
9
9
  module Gnucash
10
10
  # Open a GnuCash book from file.
11
+ #
11
12
  # The file can be either a plain-text XML file or a gzipped XML file.
12
- # === Arguments
13
- # +fname+ _String_:: Name of the file to open.
13
+ #
14
+ # @param fname [String]
15
+ # The file name of the GnuCash file to open. Only XML format (or gzipped
16
+ # XML format) GnuCash data files are recognized.
17
+ #
18
+ # @return [Book]
19
+ # Gnucash::Book instance.
14
20
  def self.open(fname)
15
21
  Book.new(fname)
16
22
  end
@@ -1,29 +1,29 @@
1
1
  module Gnucash
2
- # Represent a GnuCash account object
2
+ # Represent a GnuCash account object.
3
3
  class Account
4
- # _String_: The name of the account (unqualified)
4
+ # @return [String] The name of the account (unqualified).
5
5
  attr_reader :name
6
6
 
7
- # _String_: The account description
7
+ # @return [String] The account description.
8
8
  attr_reader :description
9
9
 
10
- # _String_: The account type (such as "EXPENSE")
10
+ # @return [String] The account type (such as "EXPENSE").
11
11
  attr_reader :type
12
12
 
13
- # _String_: The GUID of the account
13
+ # @return [String] The GUID of the account.
14
14
  attr_reader :id
15
15
 
16
- # _Array_: List of _AccountTransaction_ transactions associated with this
17
- # account.
16
+ # @return [Array<AccountTransaction>] List of transactions associated with
17
+ # this account.
18
18
  attr_reader :transactions
19
19
 
20
- # Boolean: whether the account is a placeholder or not
20
+ # @return [Boolean] Whether the account is a placeholder or not.
21
21
  attr_reader :placeholder
22
22
 
23
23
  # Create an Account object.
24
- # === Arguments
25
- # +book+ _Book_:: The Gnucash::Book containing the account
26
- # +node+ _Nokogiri::XML::Node_:: Nokogiri XML node
24
+ #
25
+ # @param book [Book] The {Gnucash::Book} containing the account.
26
+ # @param node [Nokogiri::XML::Node] Nokogiri XML node.
27
27
  def initialize(book, node)
28
28
  @book = book
29
29
  @node = node
@@ -41,18 +41,24 @@ module Gnucash
41
41
  end
42
42
  end
43
43
 
44
- # Return the fully qualified account name
44
+ # Return the fully qualified account name.
45
+ #
46
+ # @return [String] Fully qualified account name.
45
47
  def full_name
46
48
  @full_name ||= calculate_full_name
47
49
  end
48
50
 
49
- # Internal method used to associate a transaction with the account
51
+ # Internal method used to associate a transaction with the account.
52
+ #
53
+ # @return [void]
50
54
  def add_transaction(act_txn)
51
55
  @transactions << act_txn
52
56
  end
53
57
 
54
58
  # Internal method used to complete initialization of the Account after
55
59
  # all transactions have been associated with it.
60
+ #
61
+ # @return [void]
56
62
  def finalize
57
63
  @transactions.sort! { |a, b| a.date <=> b.date }
58
64
  balance = Value.new(0)
@@ -65,16 +71,21 @@ module Gnucash
65
71
  end
66
72
  end
67
73
 
68
- # Return the final balance of the account as a _Gnucash::Value_
74
+ # Return the final balance of the account as a {Value}.
75
+ #
76
+ # @return [Value] The final balance of the account.
69
77
  def final_balance
70
78
  return Value.new(0) unless @balances.size > 0
71
79
  @balances.last[:value]
72
80
  end
73
81
 
74
- # Return the balance of the account as of the date given as a
75
- # _Gnucash::Value_. Transactions that occur on the given date are included
76
- # in the returned balance.
77
- # date can be a _String_ ("YYYY-MM-DD") or _Date_ object.
82
+ # Return the balance of the account as of the date given as a {Value}.
83
+ # Transactions that occur on the given date are included in the returned
84
+ # balance.
85
+ #
86
+ # @param date [String, Date] Date on which to query the balance.
87
+ #
88
+ # @return [Value] Balance of the account as of the date given.
78
89
  def balance_on(date)
79
90
  date = Date.parse(date) if date.is_a?(String)
80
91
  return Value.new(0) unless @balances.size > 0
@@ -96,6 +107,7 @@ module Gnucash
96
107
 
97
108
  private
98
109
 
110
+ # @return [String] Fully qualified account name.
99
111
  def calculate_full_name
100
112
  prefix = ""
101
113
  if @parent_id
@@ -1,21 +1,23 @@
1
1
  module Gnucash
2
2
  # Class to link a transaction object to an Account.
3
3
  class AccountTransaction
4
- # _Gnucash::Value_: The transaction value for the linked account
4
+ # @return [Value] The transaction value for the linked account.
5
5
  attr_reader :value
6
6
 
7
7
  # Construct an AccountTransaction object.
8
+ #
8
9
  # This method is used internally when building a Transaction object.
9
- # === Arguments
10
- # +real_txn+ _Gnucash::Transaction_:: The linked Transaction object
11
- # +value+ _Gnucash::Value_::
10
+ #
11
+ # @param real_txn [Transaction]
12
+ # The linked Transaction object.
13
+ # @param value [Value]
12
14
  # The value of the Transaction split for this account
13
15
  def initialize(real_txn, value)
14
16
  @real_txn = real_txn
15
17
  @value = value
16
18
  end
17
19
 
18
- # Pass through any missing method calls to the linked Transaction object
20
+ # Pass through any missing method calls to the linked Transaction object.
19
21
  def method_missing(*args)
20
22
  @real_txn.send(*args)
21
23
  end
@@ -2,24 +2,27 @@ require "zlib"
2
2
  require "nokogiri"
3
3
 
4
4
  module Gnucash
5
- # Represent a GnuCash Book
5
+ # Represent a GnuCash Book.
6
6
  class Book
7
- # _Array_ of _Gnucash::Account_ objects in the book
7
+ # @return [Array<Account>] Accounts in the book.
8
8
  attr_reader :accounts
9
9
 
10
- # _Array_ of _Gnucash::Transaction_ objects in the book
10
+ # @return [Array<Transaction>] Transactions in the book.
11
11
  attr_reader :transactions
12
12
 
13
- # _Date_ of the first transaction in the book
13
+ # @return [Date] Date of the first transaction in the book.
14
14
  attr_reader :start_date
15
15
 
16
- # _Date_ of the last transaction in the book
16
+ # @return [Date] Date of the last transaction in the book.
17
17
  attr_reader :end_date
18
18
 
19
19
  # Construct a Book object.
20
- # Normally called internally by Gnucash.open()
21
- # === Arguments
22
- # +fname+ _String_:: The file name of the GnuCash file to open.
20
+ #
21
+ # Normally called internally by {Gnucash.open}.
22
+ #
23
+ # @param fname [String]
24
+ # The file name of the GnuCash file to open. Only XML format (or gzipped
25
+ # XML format) GnuCash data files are recognized.
23
26
  def initialize(fname)
24
27
  begin
25
28
  @ng = Nokogiri.XML(Zlib::GzipReader.open(fname).read)
@@ -37,33 +40,35 @@ module Gnucash
37
40
  end
38
41
 
39
42
  # Return a handle to the Account object that has the given GUID.
40
- # === Arguments
41
- # +id+ _String_:: GUID
42
- # === Return
43
- # _Gnucash::Account_ or +nil+
43
+ #
44
+ # @param id [String] GUID.
45
+ #
46
+ # @return [Account, nil] Account object, or nil if not found.
44
47
  def find_account_by_id(id)
45
48
  @accounts.find { |a| a.id == id }
46
49
  end
47
50
 
48
51
  # Return a handle to the Account object that has the given fully-qualified
49
52
  # name.
50
- # === Arguments
51
- # +full_name+ _String_::
52
- # Fully-qualified account name (ex: "Expenses::Auto::Gas")
53
- # === Return
54
- # _Gnucash::Account_ or +nil+
53
+ #
54
+ # @param full_name [String]
55
+ # Fully-qualified account name (ex: "Expenses::Auto::Gas").
56
+ #
57
+ # @return [Account, nil] Account object, or nil if not found.
55
58
  def find_account_by_full_name(full_name)
56
59
  @accounts.find { |a| a.full_name == full_name }
57
60
  end
58
61
 
59
62
  private
60
63
 
64
+ # @return [void]
61
65
  def build_accounts
62
66
  @accounts = @book_node.xpath('gnc:account').map do |act_node|
63
67
  Account.new(self, act_node)
64
68
  end
65
69
  end
66
70
 
71
+ # @return [void]
67
72
  def build_transactions
68
73
  @start_date = nil
69
74
  @end_date = nil
@@ -75,6 +80,7 @@ module Gnucash
75
80
  end
76
81
  end
77
82
 
83
+ # @return [void]
78
84
  def finalize
79
85
  @accounts.sort! do |a, b|
80
86
  a.full_name <=> b.full_name
@@ -2,26 +2,27 @@ require "date"
2
2
 
3
3
  module Gnucash
4
4
  # Represent a GnuCash transaction.
5
+ #
5
6
  # Transactions have multiple splits with individual values.
6
7
  # Splits are created as AccountTransaction objects which are associated
7
8
  # with an individual account.
8
9
  class Transaction
9
- # _Date_: The date of the transaction
10
+ # @return [Date] The date of the transaction.
10
11
  attr_reader :date
11
12
 
12
- # _String_: The GUID of the transaction
13
+ # @return [String] The GUID of the transaction.
13
14
  attr_reader :id
14
15
 
15
- # _String_: The description of the transaction
16
+ # @return [String] The description of the transaction.
16
17
  attr_reader :description
17
18
 
18
- # _Array_ of _Hash_ with keys +account+ and +value+
19
+ # @return [Array<Hash>] Hashes with keys +:account+ and +:value+.
19
20
  attr_reader :splits
20
21
 
21
- # Create a new Transaction object
22
- # === Arguments
23
- # +book+ _Book_:: The Gnucash::Book containing the transaction
24
- # +node+ _Nokogiri::XML::Node_:: Nokogiri XML node
22
+ # Create a new Transaction object.
23
+ #
24
+ # @param book [Book] The {Gnucash::Book} containing the transaction.
25
+ # @param node [Nokogiri::XML::Node] Nokogiri XML node.
25
26
  def initialize(book, node)
26
27
  @book = book
27
28
  @node = node
@@ -29,7 +30,10 @@ module Gnucash
29
30
  @date = Date.parse(node.xpath('trn:date-posted/ts:date').text.split(' ').first)
30
31
  @description = node.xpath('trn:description').text
31
32
  @splits = node.xpath('trn:splits/trn:split').map do |split_node|
32
- value = Value.new(split_node.xpath('split:value').text)
33
+ # Note: split:value represents the split value in the transaction's
34
+ # currency while split:quantity represents it in the currency
35
+ # associated with the account associated with this split.
36
+ value = Value.new(split_node.xpath('split:quantity').text)
33
37
  account_id = split_node.xpath('split:account').text
34
38
  account = @book.find_account_by_id(account_id)
35
39
  unless account
@@ -4,21 +4,23 @@ module Gnucash
4
4
  class Value
5
5
  include Comparable
6
6
 
7
- # _Fixnum_:: The raw, undivided integer value
7
+ # @return [Fixnum] The raw, undivided integer value.
8
8
  attr_reader :val
9
9
 
10
- # Create a new Value object with value 0
10
+ # Create a new Value object with value 0.
11
+ #
12
+ # @return [Value] Zero value.
11
13
  def self.zero
12
14
  Value.new(0)
13
15
  end
14
16
 
15
- # Construct a Value object
16
- # === Arguments
17
- # +val+ _String_ or _Fixnum_::
18
- # Either a _String_ in the form "1234/100" or an integer containing the
19
- # raw value
20
- # +div+ _Fixnum_::
21
- # The divisor value to use (when +val+ is given as a _Fixnum_)
17
+ # Construct a Value object.
18
+ #
19
+ # @param val [String, Fixnum]
20
+ # Either a String in the form "1234/100" or an integer containing the
21
+ # raw value.
22
+ # @param div [Fixnum]
23
+ # The divisor value to use (when +val+ is given as a Fixnum).
22
24
  def initialize(val, div = 100)
23
25
  if val.is_a?(String)
24
26
  if val =~ /^(-?\d+)\/(\d+)$/
@@ -35,8 +37,11 @@ module Gnucash
35
37
  end
36
38
  end
37
39
 
38
- # Add to a Value object
39
- # +other+ can be another Value or a Numeric
40
+ # Add to a Value object.
41
+ #
42
+ # @param other [Value, Numeric]
43
+ #
44
+ # @return [Value] Result of addition.
40
45
  def +(other)
41
46
  if other.is_a?(Value)
42
47
  Value.new(@val + other.val)
@@ -47,8 +52,11 @@ module Gnucash
47
52
  end
48
53
  end
49
54
 
50
- # Subtract from a Value object
51
- # +other+ can be another Value or a Numeric
55
+ # Subtract from a Value object.
56
+ #
57
+ # @param other [Value, Numeric]
58
+ #
59
+ # @return [Value] Result of subtraction.
52
60
  def -(other)
53
61
  if other.is_a?(Value)
54
62
  Value.new(@val - other.val)
@@ -59,13 +67,18 @@ module Gnucash
59
67
  end
60
68
  end
61
69
 
62
- # Negate a Value
70
+ # Negate a Value.
71
+ #
72
+ # @return [Value] Result of negation.
63
73
  def -@
64
74
  Value.new(-@val, @div)
65
75
  end
66
76
 
67
- # Multiply a Value object
68
- # +other+ should be a Numeric
77
+ # Multiply a Value object.
78
+ #
79
+ # @param other [Numeric] Multiplier.
80
+ #
81
+ # @return [Value] Result of multiplication.
69
82
  def *(other)
70
83
  if other.is_a?(Numeric)
71
84
  (to_f * other).round(2)
@@ -74,8 +87,11 @@ module Gnucash
74
87
  end
75
88
  end
76
89
 
77
- # Divide a Value object
78
- # +other+ should be a Numeric
90
+ # Divide a Value object.
91
+ #
92
+ # @param other [Numeric] Divisor.
93
+ #
94
+ # @return [Value] Result of division.
79
95
  def /(other)
80
96
  if other.is_a?(Numeric)
81
97
  (to_f / other).round(2)
@@ -84,17 +100,23 @@ module Gnucash
84
100
  end
85
101
  end
86
102
 
87
- # Represent the Value as a string (two decimal places)
103
+ # Represent the Value as a string (two decimal places).
104
+ #
105
+ # @return [String] Representation of value.
88
106
  def to_s
89
107
  sprintf("%.02f", to_f)
90
108
  end
91
109
 
92
- # Convert the Value to a Float
110
+ # Convert the Value to a Float.
111
+ #
112
+ # @return [Float] Value of the value as a Float.
93
113
  def to_f
94
114
  @val / @div.to_f
95
115
  end
96
116
 
97
- # Compare two Value objects
117
+ # Compare two Value objects.
118
+ #
119
+ # @return [Integer] Comparison result.
98
120
  def <=>(other)
99
121
  @val <=> other.val
100
122
  end
@@ -1,4 +1,4 @@
1
1
  module Gnucash
2
2
  # gem version
3
- VERSION = "1.2.0"
3
+ VERSION = "1.2.1"
4
4
  end
@@ -10,44 +10,44 @@ module Gnucash
10
10
  end
11
11
 
12
12
  it "gives access to the account name" do
13
- @salary.name.should == "Salary"
13
+ expect(@salary.name).to eq "Salary"
14
14
  end
15
15
 
16
16
  it "gives access to the account description" do
17
- @checking.description.should == "Checking Account"
17
+ expect(@checking.description).to eq "Checking Account"
18
18
  end
19
19
 
20
20
  it "gives access to the fully-qualified account name" do
21
- @checking.full_name.should == "Assets:Current Assets:Checking Account"
21
+ expect(@checking.full_name).to eq "Assets:Current Assets:Checking Account"
22
22
  end
23
23
 
24
24
  it "gives access to the final balance" do
25
- @checking.final_balance.should == Value.new(19743000)
25
+ expect(@checking.final_balance).to eq Value.new(19743000)
26
26
  end
27
27
 
28
28
  describe '.balance_on' do
29
29
  it "returns 0 if the given date is before the account's first transaction" do
30
- @checking.balance_on("2006-12-12").should == Value.new(0)
30
+ expect(@checking.balance_on("2006-12-12")).to eq Value.new(0)
31
31
  end
32
32
 
33
33
  it "returns the final balance if the given date is after the account's last transaction" do
34
- @checking.balance_on("2013-10-10").should == @checking.final_balance
34
+ expect(@checking.balance_on("2013-10-10")).to eq @checking.final_balance
35
35
  end
36
36
 
37
37
  it "returns the balance on the given date" do
38
- @checking.balance_on("2012-12-25").should == Value.new(19688000)
38
+ expect(@checking.balance_on("2012-12-25")).to eq Value.new(19688000)
39
39
  end
40
40
 
41
41
  it "includes transactions that occur on the given date" do
42
- @checking.balance_on("2007-03-27").should == Value.new(780000)
42
+ expect(@checking.balance_on("2007-03-27")).to eq Value.new(780000)
43
43
  end
44
44
  end
45
45
 
46
46
  it "stores whether the account was a placeholder" do
47
- @assets.placeholder.should be_true
48
- @checking.placeholder.should be_false
49
- @income.placeholder.should be_true
50
- @salary.placeholder.should be_false
47
+ expect(@assets.placeholder).to be_truthy
48
+ expect(@checking.placeholder).to be_falsey
49
+ expect(@income.placeholder).to be_truthy
50
+ expect(@salary.placeholder).to be_falsey
51
51
  end
52
52
  end
53
53
  end
@@ -3,11 +3,11 @@ module Gnucash
3
3
  context "with errors" do
4
4
  it "raises an error for unexpected XML" do
5
5
  gr = "gr"
6
- Zlib::GzipReader.should_receive(:open).and_return(gr)
7
- gr.should_receive(:read).and_return(nil)
6
+ expect(Zlib::GzipReader).to receive(:open).and_return(gr)
7
+ expect(gr).to receive(:read).and_return(nil)
8
8
  ng = "ng"
9
- Nokogiri.should_receive(:XML).and_return(ng)
10
- ng.should_receive(:xpath).with('/gnc-v2/gnc:book').and_return([])
9
+ expect(Nokogiri).to receive(:XML).and_return(ng)
10
+ expect(ng).to receive(:xpath).with('/gnc-v2/gnc:book').and_return([])
11
11
 
12
12
  expect { Gnucash::Book.new('file name') }.to raise_error "Error: Expected to find one gnc:book entry"
13
13
  end
@@ -20,19 +20,19 @@ module Gnucash
20
20
  end
21
21
 
22
22
  it "records the date of the earliest transaction" do
23
- @subject.start_date.should == Date.parse("2007-01-01")
23
+ expect(@subject.start_date).to eq Date.parse("2007-01-01")
24
24
  end
25
25
 
26
26
  it "records the date of the last transaction" do
27
- @subject.end_date.should == Date.parse("2012-12-28")
27
+ expect(@subject.end_date).to eq Date.parse("2012-12-28")
28
28
  end
29
29
 
30
30
  it "lets you find an account by id" do
31
- @subject.find_account_by_id("67e6e7daadc35716eb6152769373e974").name.should == "Savings Account"
31
+ expect(@subject.find_account_by_id("67e6e7daadc35716eb6152769373e974").name).to eq "Savings Account"
32
32
  end
33
33
 
34
34
  it "lets you find an account by full name" do
35
- @subject.find_account_by_full_name("Assets:Current Assets:Savings Account").id.should == "67e6e7daadc35716eb6152769373e974"
35
+ expect(@subject.find_account_by_full_name("Assets:Current Assets:Savings Account").id).to eq "67e6e7daadc35716eb6152769373e974"
36
36
  end
37
37
  end
38
38
  end
@@ -10,17 +10,17 @@ module Gnucash
10
10
  account_text = "account_text"
11
11
  date_text = "date_text"
12
12
 
13
- text.stub(:text) {"hi there"}
14
- node.should_receive(:xpath).with('trn:id').and_return(text)
15
- date_text.should_receive(:text).and_return("2014-01-20")
16
- node.should_receive(:xpath).with('trn:date-posted/ts:date').and_return(date_text)
17
- value_text.should_receive(:text).and_return("1177/100")
18
- account_text.should_receive(:text).and_return("a1s2d3f4")
19
- split_node.should_receive(:xpath).with("split:value").and_return(value_text)
20
- split_node.should_receive(:xpath).with("split:account").and_return(account_text)
21
- node.should_receive(:xpath).with('trn:description').and_return(text)
22
- node.should_receive(:xpath).with('trn:splits/trn:split').and_return([split_node])
23
- book.should_receive(:find_account_by_id).and_return(nil)
13
+ allow(text).to receive(:text) {"hi there"}
14
+ expect(node).to receive(:xpath).with('trn:id').and_return(text)
15
+ expect(date_text).to receive(:text).and_return("2014-01-20")
16
+ expect(node).to receive(:xpath).with('trn:date-posted/ts:date').and_return(date_text)
17
+ expect(value_text).to receive(:text).and_return("1177/100")
18
+ expect(account_text).to receive(:text).and_return("a1s2d3f4")
19
+ expect(split_node).to receive(:xpath).with("split:quantity").and_return(value_text)
20
+ expect(split_node).to receive(:xpath).with("split:account").and_return(account_text)
21
+ expect(node).to receive(:xpath).with('trn:description').and_return(text)
22
+ expect(node).to receive(:xpath).with('trn:splits/trn:split').and_return([split_node])
23
+ expect(book).to receive(:find_account_by_id).and_return(nil)
24
24
 
25
25
  expect { Transaction.new(book, node) }.to raise_error /Could not find account/
26
26
  end
@@ -33,7 +33,7 @@ module Gnucash
33
33
  end
34
34
 
35
35
  it "keeps track of the transaction description" do
36
- @txn.description.should == "Opening Balance"
36
+ expect(@txn.description).to eq "Opening Balance"
37
37
  end
38
38
  end
39
39
  end
@@ -2,7 +2,7 @@ module Gnucash
2
2
  describe Value do
3
3
  describe '.zero' do
4
4
  it 'creates a Value object with value 0' do
5
- Value.zero.val.should == 0
5
+ expect(Value.zero.val).to eq 0
6
6
  end
7
7
  end
8
8
 
@@ -15,70 +15,70 @@ module Gnucash
15
15
  end
16
16
 
17
17
  it "allows construction from a string" do
18
- Value.new("5678/100").val.should == 5678
18
+ expect(Value.new("5678/100").val).to eq 5678
19
19
  end
20
20
 
21
21
  it "converts the value to the expected string representation" do
22
- Value.new("5678/100").to_s.should == "56.78"
23
- Value.new("1000231455/100").to_s.should == "10002314.55"
22
+ expect(Value.new("5678/100").to_s).to eq "56.78"
23
+ expect(Value.new("1000231455/100").to_s).to eq "10002314.55"
24
24
  end
25
25
 
26
26
  it "allows adding two value objects" do
27
27
  a = Value.new("1234/100")
28
28
  b = Value.new("2345/100")
29
29
  c = a + b
30
- c.to_s.should == "35.79"
30
+ expect(c.to_s).to eq "35.79"
31
31
  end
32
32
 
33
33
  it "allows adding a Value object to a Numeric" do
34
34
  a = Value.new("1234/100")
35
35
  b = 15
36
36
  c = a + b
37
- c.should == 27.34
37
+ expect(c).to eq 27.34
38
38
  end
39
39
 
40
40
  it "allows subtracting two value objects" do
41
41
  a = Value.new("-12300/100")
42
42
  b = Value.new("99/100")
43
43
  c = a - b
44
- c.to_s.should == "-123.99"
44
+ expect(c.to_s).to eq "-123.99"
45
45
  end
46
46
 
47
47
  it "allows subtracting a Numeric from a Value object" do
48
48
  a = Value.new("890/100")
49
49
  b = 7.8
50
50
  c = a - b
51
- c.should == 1.1
51
+ expect(c).to eq 1.1
52
52
  end
53
53
 
54
54
  it "allows negating a Value object" do
55
55
  a = Value.new("123/100")
56
56
  b = -a
57
- b.to_s.should == "-1.23"
57
+ expect(b.to_s).to eq "-1.23"
58
58
  end
59
59
 
60
60
  it "allows multiplying a Value by a Numeric" do
61
61
  a = Value.new("100/100")
62
62
  b = 12
63
63
  c = a * b
64
- c.should == 12.00
64
+ expect(c).to eq 12.00
65
65
  end
66
66
 
67
67
  it "allows dividing a Value by a Numeric" do
68
68
  a = Value.new("150000/100")
69
69
  b = 150
70
70
  c = a / b
71
- c.should == 10.0
71
+ expect(c).to eq 10.0
72
72
  end
73
73
 
74
74
  it "formats the number with two decimal places" do
75
- Value.new("1400/100").to_s.should == "14.00"
75
+ expect(Value.new("1400/100").to_s).to eq "14.00"
76
76
  end
77
77
 
78
78
  it "supports comparisons between two Value objects" do
79
- Value.new("1234/100").should == Value.new(1234)
80
- (Value.new("89/100") < Value.new("100/100")).should be_true
81
- (Value.new("1234/100") > Value.new("222/100")).should be_true
79
+ expect(Value.new("1234/100")).to eq Value.new(1234)
80
+ expect((Value.new("89/100") < Value.new("100/100"))).to be_truthy
81
+ expect((Value.new("1234/100") > Value.new("222/100"))).to be_truthy
82
82
  end
83
83
 
84
84
  context "errors" do
@@ -2,11 +2,11 @@ describe Gnucash do
2
2
  describe '.open' do
3
3
  it 'opens a gzipped gnucash book' do
4
4
  book = Gnucash.open("spec/books/sample.gnucash")
5
- book.is_a?(Gnucash::Book).should be_true
5
+ expect(book.is_a?(Gnucash::Book)).to be_truthy
6
6
  end
7
7
  it 'opens a plain text gnucash book' do
8
8
  book = Gnucash.open("spec/books/sample-text.gnucash")
9
- book.is_a?(Gnucash::Book).should be_true
9
+ expect(book.is_a?(Gnucash::Book)).to be_truthy
10
10
  end
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,151 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnucash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtrop
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-20 00:00:00.000000000 Z
11
+ date: 2017-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: simplecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rspec-core
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ! '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec-expectations
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ! '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ! '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec-mocks
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ! '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ! '>='
52
+ - - ">="
95
53
  - !ruby/object:Gem::Version
96
54
  version: '0'
97
55
  - !ruby/object:Gem::Dependency
98
56
  name: rake
99
57
  requirement: !ruby/object:Gem::Requirement
100
58
  requirements:
101
- - - ! '>='
59
+ - - ">="
102
60
  - !ruby/object:Gem::Version
103
61
  version: '0'
104
62
  type: :development
105
63
  prerelease: false
106
64
  version_requirements: !ruby/object:Gem::Requirement
107
65
  requirements:
108
- - - ! '>='
66
+ - - ">="
109
67
  - !ruby/object:Gem::Version
110
68
  version: '0'
111
69
  - !ruby/object:Gem::Dependency
112
- name: rdoc
70
+ name: yard
113
71
  requirement: !ruby/object:Gem::Requirement
114
72
  requirements:
115
- - - ! '>='
73
+ - - ">="
116
74
  - !ruby/object:Gem::Version
117
75
  version: '0'
118
76
  type: :development
119
77
  prerelease: false
120
78
  version_requirements: !ruby/object:Gem::Requirement
121
79
  requirements:
122
- - - ! '>='
80
+ - - ">="
123
81
  - !ruby/object:Gem::Version
124
82
  version: '0'
125
83
  - !ruby/object:Gem::Dependency
126
- name: yard
84
+ name: rdoc
127
85
  requirement: !ruby/object:Gem::Requirement
128
86
  requirements:
129
- - - ! '>='
87
+ - - ">="
130
88
  - !ruby/object:Gem::Version
131
89
  version: '0'
132
90
  type: :development
133
91
  prerelease: false
134
92
  version_requirements: !ruby/object:Gem::Requirement
135
93
  requirements:
136
- - - ! '>='
94
+ - - ">="
137
95
  - !ruby/object:Gem::Version
138
96
  version: '0'
139
- description: Ruby library for extracting data from GnuCash data files
97
+ description: Ruby library for extracting data from XML GnuCash data files
140
98
  email:
141
99
  - jholtrop@gmail.com
142
100
  executables: []
143
101
  extensions: []
144
102
  extra_rdoc_files: []
145
103
  files:
146
- - .gitignore
147
- - .rspec
104
+ - ".gitignore"
105
+ - ".rspec"
148
106
  - Gemfile
107
+ - Gemfile.lock
149
108
  - LICENSE.txt
150
109
  - README.md
151
110
  - Rakefile
@@ -175,20 +134,20 @@ require_paths:
175
134
  - lib
176
135
  required_ruby_version: !ruby/object:Gem::Requirement
177
136
  requirements:
178
- - - ! '>='
137
+ - - ">="
179
138
  - !ruby/object:Gem::Version
180
139
  version: '0'
181
140
  required_rubygems_version: !ruby/object:Gem::Requirement
182
141
  requirements:
183
- - - ! '>='
142
+ - - ">="
184
143
  - !ruby/object:Gem::Version
185
144
  version: '0'
186
145
  requirements: []
187
146
  rubyforge_project:
188
- rubygems_version: 2.2.1
147
+ rubygems_version: 2.6.12
189
148
  signing_key:
190
149
  specification_version: 4
191
- summary: Extract data from GnuCash data files
150
+ summary: Extract data from XML GnuCash data files
192
151
  test_files:
193
152
  - spec/books/sample-text.gnucash
194
153
  - spec/books/sample.gnucash
@@ -198,4 +157,3 @@ test_files:
198
157
  - spec/gnucash/value_spec.rb
199
158
  - spec/gnucash_spec.rb
200
159
  - spec/spec_helper.rb
201
- has_rdoc: