keepr 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: 41676e1855dcb2af4b7df3fad8ed257251832317
4
- data.tar.gz: eb275e943f86edd5efa5cf2b92fe4627ef28d152
3
+ metadata.gz: 6b2f5d039bfbbf335697d28fa698e479fef8b5ed
4
+ data.tar.gz: 4c8d29642d5316b292355c93b794aa7e016663e5
5
5
  SHA512:
6
- metadata.gz: a491c1d52227749de2aca883072cb6f91ded6a09cc8f51dbee18353a22b3ec12c8150201b269e5f60f361d57b7786959e54afccba7eecf12fb73c5c962db37f9
7
- data.tar.gz: c1e1703a56d273389ba00bd2dd4360941b933d72f4ddb3778f88d665175b940dfb5da38901996e4763ff82bdb690d27eef41648a0b0b6e6a596d5159494fb584
6
+ metadata.gz: 022d01a0b65737a9c41fd17fcbe6c943a1b0731e01ce77d6ed4389128232bc53ba6256ea91e26557973c31c1afa170b6c30ce6ad9942533f71fa455902da9a43
7
+ data.tar.gz: 27954084b5c167eac3b0b15c9c57e7f86562cdb7685090bd6e33b1b0708111a3479a6b60eb22d7728af816093cdcee42200128da6f1dfca1eb452b9dc24d3b77
data/.travis.yml CHANGED
@@ -1,9 +1,20 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- - 2.1.6
5
- - 2.2.2
4
+ - 2.0.0
5
+ - 2.1.10
6
+ - 2.2.5
7
+ - 2.3.1
6
8
  gemfile:
7
9
  - ci/Gemfile-rails-4-1
8
10
  - ci/Gemfile-rails-4-2
11
+ - ci/Gemfile-rails-5-0
12
+ matrix:
13
+ exclude:
14
+ - rvm: 1.9.3
15
+ gemfile: ci/Gemfile-rails-5-0
16
+ - rvm: 2.0.0
17
+ gemfile: ci/Gemfile-rails-5-0
18
+ - rvm: 2.1.10
19
+ gemfile: ci/Gemfile-rails-5-0
9
20
  before_install: gem update bundler
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2015 Georg Ledermann
1
+ Copyright (c) 2013-2016 Georg Ledermann
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -18,7 +18,7 @@ This Ruby gem provides a double entry accounting system for use in any Rails app
18
18
  ## Dependencies
19
19
 
20
20
  * Ruby 1.9.3 or later
21
- * Rails 4.1 or 4.2
21
+ * Rails 4.1 or newer (including Rails 5)
22
22
 
23
23
 
24
24
  ## Installation
@@ -60,3 +60,6 @@ TODO: Write usage instructions here
60
60
  * https://github.com/telent/pacioli
61
61
  * https://github.com/astrails/deb
62
62
  * https://github.com/bigfleet/accountable
63
+
64
+
65
+ Copyright (c) 2013-2016 [Georg Ledermann](http://www.georg-ledermann.de), released under the MIT license
data/ci/Gemfile-rails-4-1 CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'activerecord', '~> 4.1.10'
3
+ gem 'activerecord', '~> 4.1.15'
4
4
  gem 'ancestry'
5
5
  gem 'sqlite3'
6
6
  gem 'rake'
data/ci/Gemfile-rails-4-2 CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'activerecord', '~> 4.2.1'
3
+ gem 'activerecord', '~> 4.2.6'
4
4
  gem 'ancestry'
5
5
  gem 'sqlite3'
6
6
  gem 'rake'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activerecord', '5.0.0.beta1'
4
+ gem 'ancestry'
5
+ gem 'sqlite3'
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ gem 'simplecov'
9
+ gem 'coveralls'
10
+ gem 'database_cleaner'
11
+ gem 'factory_girl'
12
+ gem 'coveralls'
data/keepr.gemspec CHANGED
@@ -22,11 +22,12 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'activerecord', '>= 4.1'
23
23
  spec.add_dependency 'ancestry'
24
24
 
25
- spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'bundler'
26
26
  spec.add_development_dependency 'rake'
27
27
  spec.add_development_dependency 'sqlite3'
28
28
  spec.add_development_dependency 'rspec'
29
29
  spec.add_development_dependency 'database_cleaner'
30
30
  spec.add_development_dependency 'factory_girl'
31
31
  spec.add_development_dependency 'coveralls'
32
+ spec.add_development_dependency 'simplecov'
32
33
  end
@@ -9,7 +9,7 @@ module Keepr
9
9
  source_root File.expand_path('../templates', __FILE__)
10
10
 
11
11
  def create_migration_file
12
- migration_template 'migration.rb', 'db/migrate/keepr_migration'
12
+ migration_template 'migration.rb', 'db/migrate/keepr_migration.rb'
13
13
  end
14
14
 
15
15
  def self.next_migration_number(dirname)
@@ -1,29 +1,31 @@
1
1
  class KeeprMigration < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :keepr_groups, force: true do |t|
3
+ create_table Keepr::Group, force: true do |t|
4
4
  t.integer :target, :null => false
5
5
  t.string :number
6
6
  t.string :name, :null => false
7
7
  t.boolean :is_result, :null => false, :default => false
8
8
  t.string :ancestry
9
+
10
+ t.index :ancestry
9
11
  end
10
- add_index :keepr_groups, :ancestry
11
12
 
12
- create_table :keepr_taxes, force: true do |t|
13
+ create_table Keepr::Tax, force: true do |t|
13
14
  t.string :name, :null => false
14
15
  t.string :description
15
16
  t.decimal :value, :precision => 8, :scale => 2, :null => false
16
17
  t.references :keepr_account, :null => false
18
+
19
+ t.index :keepr_account_id
17
20
  end
18
- add_index :keepr_taxes, :keepr_account_id
19
21
 
20
- create_table :keepr_cost_centers, force: true do |t|
22
+ create_table Keepr::CostCenter, force: true do |t|
21
23
  t.string :number, :null => false
22
24
  t.string :name, :null => false
23
25
  t.text :note
24
26
  end
25
27
 
26
- create_table :keepr_accounts, force: true do |t|
28
+ create_table Keepr::Account, force: true do |t|
27
29
  t.integer :number, :null => false
28
30
  t.string :ancestry
29
31
  t.string :name, :null => false
@@ -33,14 +35,15 @@ class KeeprMigration < ActiveRecord::Migration
33
35
  t.references :keepr_tax
34
36
  t.datetime :created_at
35
37
  t.datetime :updated_at
38
+
39
+ t.index :number
40
+ t.index :ancestry
41
+ t.index [:accountable_type, :accountable_id]
42
+ t.index :keepr_group_id
43
+ t.index :keepr_tax_id
36
44
  end
37
- add_index :keepr_accounts, :number
38
- add_index :keepr_accounts, :ancestry
39
- add_index :keepr_accounts, [:accountable_type, :accountable_id]
40
- add_index :keepr_accounts, :keepr_group_id
41
- add_index :keepr_accounts, :keepr_tax_id
42
45
 
43
- create_table :keepr_journals, force: true do |t|
46
+ create_table Keepr::Journal, force: true do |t|
44
47
  t.string :number
45
48
  t.date :date, :null => false
46
49
  t.string :subject
@@ -49,25 +52,31 @@ class KeeprMigration < ActiveRecord::Migration
49
52
  t.boolean :permanent, :null => false, :default => false
50
53
  t.datetime :created_at
51
54
  t.datetime :updated_at
55
+
56
+ t.index :date
57
+ t.index [:accountable_type, :accountable_id], :name => 'index_keepr_journals_on_accountable'
52
58
  end
53
- add_index :keepr_journals, :date
54
- add_index :keepr_journals, [:accountable_type, :accountable_id], :name => 'index_keepr_journals_on_accountable'
55
59
 
56
- create_table :keepr_postings, force: true do |t|
60
+ create_table Keepr::Posting, force: true do |t|
57
61
  t.references :keepr_account, :null => false
58
62
  t.references :keepr_journal, :null => false
59
63
  t.decimal :amount, :precision => 8, :scale => 2, :null => false
60
64
  t.references :keepr_cost_center
65
+ t.references :accountable, :polymorphic => true
66
+
67
+ t.index :keepr_account_id
68
+ t.index :keepr_journal_id
69
+ t.index :keepr_cost_center_id
70
+ t.index [:accountable_type, :accountable_id]
61
71
  end
62
- add_index :keepr_postings, :keepr_account_id
63
- add_index :keepr_postings, :keepr_journal_id
64
- add_index :keepr_postings, :keepr_cost_center_id
65
72
  end
66
73
 
67
74
  def self.down
68
- drop_table :keepr_postings
69
- drop_table :keepr_journals
70
- drop_table :keepr_accounts
71
- drop_table :keepr_groups
75
+ drop_table Keepr::Posting
76
+ drop_table Keepr::Journal
77
+ drop_table Keepr::Account
78
+ drop_table Keepr::CostCenter
79
+ drop_table Keepr::Tax
80
+ drop_table Keepr::Group
72
81
  end
73
82
  end
data/lib/keepr/account.rb CHANGED
@@ -22,32 +22,29 @@ class Keepr::Account < ActiveRecord::Base
22
22
  def self.with_sums(options={})
23
23
  raise ArgumentError unless options.is_a?(Hash)
24
24
 
25
- scope = select('keepr_accounts.*, SUM(amount) AS sum_amount').
26
- group('keepr_accounts.id').
27
- joins('LEFT JOIN keepr_postings ON keepr_postings.keepr_account_id = keepr_accounts.id')
25
+ subquery = Keepr::Posting.
26
+ select('SUM(keepr_postings.amount)').
27
+ joins(:keepr_journal).
28
+ where('keepr_postings.keepr_account_id = keepr_accounts.id')
28
29
 
29
30
  date = options[:date]
30
31
  permanent_only = options[:permanent_only]
31
32
 
32
- if date || permanent_only
33
- scope = scope.joins('LEFT JOIN keepr_journals ON keepr_journals.id = keepr_postings.keepr_journal_id')
34
- end
35
-
36
33
  if date
37
34
  if date.is_a?(Date)
38
- scope = scope.where("keepr_journals.id IS NULL OR keepr_journals.date <= '#{date.to_s(:db)}'")
35
+ subquery = subquery.where "keepr_journals.date <= '#{date.to_s(:db)}'"
39
36
  elsif date.is_a?(Range)
40
- scope = scope.where("keepr_journals.id IS NULL OR (keepr_journals.date BETWEEN '#{date.first.to_s(:db)}' AND '#{date.last.to_s(:db)}')")
37
+ subquery = subquery.where "keepr_journals.date BETWEEN '#{date.first.to_s(:db)}' AND '#{date.last.to_s(:db)}'"
41
38
  else
42
39
  raise ArgumentError
43
40
  end
44
41
  end
45
42
 
46
43
  if permanent_only
47
- scope = scope.where("keepr_journals.id IS NULL OR keepr_journals.permanent = #{connection.quoted_true}")
44
+ subquery = subquery.where "keepr_journals.permanent = #{connection.quoted_true}"
48
45
  end
49
46
 
50
- scope
47
+ select "keepr_accounts.*, (#{subquery.to_sql}) AS sum_amount"
51
48
  end
52
49
 
53
50
  def self.merged_with_sums(options={})
@@ -61,6 +58,8 @@ class Keepr::Account < ActiveRecord::Base
61
58
  parent_account.sum_amount ||= 0
62
59
  parent_account.sum_amount += account.sum_amount
63
60
  accounts.delete_at(position)
61
+ else
62
+ raise RuntimeError
64
63
  end
65
64
  else
66
65
  position += 1
@@ -110,20 +109,20 @@ private
110
109
  def group_validation
111
110
  if keepr_group.present?
112
111
  if asset?
113
- errors.add(:kind, 'does not match group') unless keepr_group.asset?
112
+ errors.add(:kind, :group_mismatch) unless keepr_group.asset?
114
113
  elsif liability?
115
- errors.add(:kind, 'does not match group') unless keepr_group.liability?
114
+ errors.add(:kind, :group_mismatch) unless keepr_group.liability?
116
115
  elsif profit_and_loss?
117
- errors.add(:kind, 'does not match group') unless keepr_group.profit_and_loss?
116
+ errors.add(:kind, :group_mismatch) unless keepr_group.profit_and_loss?
118
117
  else
119
- errors.add(:kind, 'conflicts with group')
118
+ errors.add(:kind, :group_conflict)
120
119
  end
121
120
 
122
- errors.add(:keepr_group_id, 'is a result group') if keepr_group.is_result
121
+ errors.add(:keepr_group_id, :no_group_allowed_for_result) if keepr_group.is_result
123
122
  end
124
123
  end
125
124
 
126
125
  def tax_validation
127
- errors.add(:keepr_tax_id, 'circular reference') if keepr_tax && keepr_tax.keepr_account == self
126
+ errors.add(:keepr_tax_id, :circular_reference) if keepr_tax && keepr_tax.keepr_account == self
128
127
  end
129
128
  end
@@ -5,17 +5,17 @@ module Keepr::ActiveRecordExtension
5
5
 
6
6
  module ClassMethods
7
7
  def has_one_keepr_account
8
- has_one :keepr_account, :class_name => 'Keepr::Account', :as => :accountable
9
- has_many :keepr_postings, :class_name => 'Keepr::Posting', :through => :keepr_account
8
+ has_one :keepr_account, :class_name => 'Keepr::Account', :as => :accountable, :dependent => :restrict_with_error
9
+ has_many :keepr_postings, :class_name => 'Keepr::Posting', :through => :keepr_account, :dependent => :restrict_with_error
10
10
  end
11
11
 
12
12
  def has_many_keepr_accounts
13
- has_many :keepr_accounts, :class_name => 'Keepr::Account', :as => :accountable
14
- has_many :keepr_postings, :class_name => 'Keepr::Posting', :through => :keepr_accounts
13
+ has_many :keepr_accounts, :class_name => 'Keepr::Account', :as => :accountable, :dependent => :restrict_with_error
14
+ has_many :keepr_postings, :class_name => 'Keepr::Posting', :through => :keepr_accounts, :dependent => :restrict_with_error
15
15
  end
16
16
 
17
- def is_keepr_accountable
18
- has_many :keepr_journals, :class_name => 'Keepr::Journal', :as => :accountable
17
+ def has_keepr_journals
18
+ has_many :keepr_journals, :class_name => 'Keepr::Journal', :as => :accountable, :dependent => :restrict_with_error
19
19
 
20
20
  class_eval <<-EOT
21
21
  def keepr_booked?
@@ -29,5 +29,9 @@ module Keepr::ActiveRecordExtension
29
29
  scope :keepr_booked, -> { joins(:keepr_journals) }
30
30
  EOT
31
31
  end
32
+
33
+ def has_keepr_postings
34
+ has_many :keepr_postings, :class_name => 'Keepr::Posting', :as => :accountable, :dependent => :restrict_with_error
35
+ end
32
36
  end
33
37
  end
data/lib/keepr/group.rb CHANGED
@@ -35,7 +35,8 @@ private
35
35
 
36
36
  def check_result_and_target
37
37
  if is_result
38
- errors.add(:base, 'is_result allowed for liability target only') unless liability?
38
+ # Attribute `is_result` allowed for liability target only
39
+ errors.add :base, :liability_needed_for_result unless liability?
39
40
  end
40
41
  end
41
42
  end
data/lib/keepr/journal.rb CHANGED
@@ -42,16 +42,27 @@ private
42
42
 
43
43
  def validate_postings
44
44
  if existing_postings.map(&:keepr_account_id).uniq.length < 2
45
- errors.add(:base, 'At least two accounts have to be booked!')
46
- elsif existing_postings.sum(&:raw_amount) != 0
47
- errors.add(:base, 'Debit does not match credit!')
45
+ # At least two accounts have to be booked
46
+ errors.add :base, :account_missing
47
+ elsif existing_postings.select(&:debit?).count > 1 && existing_postings.select(&:credit?).count > 1
48
+ # A split is allowed either on debit or credit, not both
49
+ errors.add :base, :split_on_both_sides
50
+ elsif existing_postings.map(&:raw_amount).compact.sum != 0
51
+ # Debit does not match credit
52
+ errors.add :base, :amount_mismatch
48
53
  end
49
54
  end
50
55
 
51
56
  def check_permanent
52
57
  if self.permanent_was
53
- errors.add(:base, 'Is permanent and cannot be changed!')
54
- false
58
+ # If marked as permanent, no changes are allowed
59
+ errors.add :base, :changes_not_allowed
60
+
61
+ if ActiveRecord::VERSION::MAJOR < 5
62
+ false
63
+ else
64
+ throw :abort
65
+ end
55
66
  end
56
67
  end
57
68
  end
data/lib/keepr/posting.rb CHANGED
@@ -7,6 +7,7 @@ class Keepr::Posting < ActiveRecord::Base
7
7
  belongs_to :keepr_account, :class_name => 'Keepr::Account'
8
8
  belongs_to :keepr_journal, :class_name => 'Keepr::Journal'
9
9
  belongs_to :keepr_cost_center, :class_name => 'Keepr::CostCenter'
10
+ belongs_to :accountable, :polymorphic => true
10
11
 
11
12
  SIDE_DEBIT = 'debit'
12
13
  SIDE_CREDIT = 'credit'
@@ -67,7 +68,8 @@ private
67
68
  def cost_center_validation
68
69
  if keepr_cost_center
69
70
  unless keepr_account.profit_and_loss?
70
- errors.add(:keepr_cost_center_id, 'allowed for expense or revenue accounts only')
71
+ # allowed for expense or revenue accounts only
72
+ errors.add :keepr_cost_center_id, :allowed_for_expense_or_revenue_only
71
73
  end
72
74
  end
73
75
  end
data/lib/keepr/tax.rb CHANGED
@@ -8,6 +8,6 @@ class Keepr::Tax < ActiveRecord::Base
8
8
  has_many :keepr_accounts, :class_name => 'Keepr::Account', :foreign_key => 'keepr_tax_id', :dependent => :restrict_with_error
9
9
 
10
10
  validate do |tax|
11
- tax.errors.add(:keepr_account_id, 'circular reference') if tax.keepr_account.try(:keepr_tax) == tax
11
+ tax.errors.add(:keepr_account_id, :circular_reference) if tax.keepr_account.try(:keepr_tax) == tax
12
12
  end
13
13
  end
data/lib/keepr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Keepr
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -61,25 +61,25 @@ describe Keepr::Account do
61
61
  it "should not allow assigning to result group" do
62
62
  account = FactoryGirl.build(:account, :keepr_group => result_group)
63
63
  expect(account).to_not be_valid
64
- expect(account.errors[:keepr_group_id]).to include('is a result group')
64
+ expect(account.errors.added? :keepr_group_id, :no_group_allowed_for_result).to eq(true)
65
65
  end
66
66
 
67
67
  it "should not allow assigning asset account to liability group" do
68
68
  account = FactoryGirl.build(:account, :kind => :asset, :keepr_group => liability_group)
69
69
  expect(account).to_not be_valid
70
- expect(account.errors[:kind]).to include('does not match group')
70
+ expect(account.errors.added? :kind, :group_mismatch).to eq(true)
71
71
  end
72
72
 
73
73
  it "should not allow assigning liability account to asset group" do
74
74
  account = FactoryGirl.build(:account, :kind => :liability, :keepr_group => asset_group)
75
75
  expect(account).to_not be_valid
76
- expect(account.errors[:kind]).to include('does not match group')
76
+ expect(account.errors.added? :kind, :group_mismatch).to eq(true)
77
77
  end
78
78
 
79
79
  it "should not allow assigning neutral account to asset group" do
80
80
  account = FactoryGirl.build(:account, :kind => :neutral, :keepr_group => asset_group)
81
81
  expect(account).to_not be_valid
82
- expect(account.errors[:kind]).to include('conflicts with group')
82
+ expect(account.errors.added? :kind, :group_conflict).to eq(true)
83
83
  end
84
84
 
85
85
  it "should allow target match" do
@@ -210,7 +210,7 @@ describe Keepr::Account, 'with subaccounts' do
210
210
  describe :with_sums do
211
211
  it 'should calc balance' do
212
212
  expect(Keepr::Account.with_sums.
213
- select { |a| (a.sum_amount || 0) != 0 }.
213
+ select(&:sum_amount).
214
214
  map { |a| [a.number, a.sum_amount] }).
215
215
  to eq([[8400, -20], [10000, 20]])
216
216
  end
@@ -219,7 +219,7 @@ describe Keepr::Account, 'with subaccounts' do
219
219
  describe :merged_with_sums do
220
220
  it 'should calc merged balance' do
221
221
  expect(Keepr::Account.merged_with_sums.
222
- select { |a| (a.sum_amount || 0) != 0 }.
222
+ select(&:sum_amount).
223
223
  map { |a| [a.number, a.sum_amount] }).
224
224
  to eq([[1400, 20], [8400, -20]])
225
225
  end
@@ -4,14 +4,14 @@ describe Keepr::Group do
4
4
  describe 'validations' do
5
5
  it "should allow is_result for liability" do
6
6
  group = Keepr::Group.new(:is_result => true, :target => :liability, :name => 'foo')
7
- expect(group.valid?).to eq(true)
7
+ expect(group).to be_valid
8
8
  end
9
9
 
10
10
  [ :asset, :profit_and_loss ].each do |target|
11
11
  it "should not allow is_result for #{target}" do
12
12
  group = Keepr::Group.new(:is_result => true, :target => target, :name => 'foo')
13
- expect(group.valid?).to eq(false)
14
- expect(group.errors[:base]).to include('is_result allowed for liability target only')
13
+ expect(group).not_to be_valid
14
+ expect(group.errors.added? :base, :liability_needed_for_result).to eq(true)
15
15
  end
16
16
  end
17
17
  end
@@ -35,7 +35,7 @@ describe Keepr::GroupsCreator do
35
35
 
36
36
  private
37
37
  def compare_with_source(scope, filename)
38
- full_filename = File.join(File.dirname(__FILE__), "../lib/keepr/groups_creator/#{filename}")
38
+ full_filename = File.join(File.dirname(__FILE__), "../../lib/keepr/groups_creator/#{filename}")
39
39
  source = File.read(full_filename)
40
40
 
41
41
  lines = scope.find_each.map { |g| "#{' ' * g.depth * 2}#{g.number} #{g.name}\n" }.join
@@ -57,6 +57,18 @@ describe Keepr::Journal do
57
57
  { :keepr_account => account_4920, :amount => 8.40, :side => 'debit' }
58
58
  ]
59
59
  expect(journal).not_to be_valid
60
+ expect(journal.errors.added? :base, :account_missing).to eq(true)
61
+ end
62
+
63
+ it 'should fail for journal with multiple postings on both sides' do
64
+ journal = Keepr::Journal.create :keepr_postings_attributes => [
65
+ { :keepr_account => account_1000, :amount => 5.00, :side => 'debit' },
66
+ { :keepr_account => account_1200, :amount => 5.00, :side => 'debit' },
67
+ { :keepr_account => account_4910, :amount => 7.00, :side => 'credit' },
68
+ { :keepr_account => account_4920, :amount => 3.00, :side => 'credit' }
69
+ ]
70
+ expect(journal).not_to be_valid
71
+ expect(journal.errors.added? :base, :split_on_both_sides).to eq(true)
60
72
  end
61
73
 
62
74
  it 'should fail for booking the same account twice' do
@@ -65,6 +77,7 @@ describe Keepr::Journal do
65
77
  { :keepr_account => account_1000, :amount => 10, :side => 'credit' }
66
78
  ]
67
79
  expect(journal).not_to be_valid
80
+ expect(journal.errors.added? :base, :account_missing).to eq(true)
68
81
  end
69
82
 
70
83
  it 'should fail for unbalanced journal' do
@@ -73,6 +86,16 @@ describe Keepr::Journal do
73
86
  { :keepr_account => account_1200, :amount => 10, :side => 'debit' }
74
87
  ]
75
88
  expect(journal).not_to be_valid
89
+ expect(journal.errors.added? :base, :amount_mismatch).to eq(true)
90
+ end
91
+
92
+ it 'should fail for nil amount' do
93
+ journal = Keepr::Journal.create :keepr_postings_attributes => [
94
+ { :keepr_account => account_1000, :amount => 10, :side => 'debit' },
95
+ { :keepr_account => account_1200, :amount => nil, :side => 'credit' }
96
+ ]
97
+ expect(journal).not_to be_valid
98
+ expect(journal.errors.added? :base, :amount_mismatch).to eq(true)
76
99
  end
77
100
  end
78
101
 
@@ -83,12 +106,12 @@ describe Keepr::Journal do
83
106
 
84
107
  it "should not allow update" do
85
108
  expect(simple_journal.update_attributes :subject => 'foo').to eq(false)
86
- expect(simple_journal.errors[:base]).to include('Is permanent and cannot be changed!')
109
+ expect(simple_journal.errors.added? :base, :changes_not_allowed).to eq(true)
87
110
  end
88
111
 
89
112
  it "should not allow destroy" do
90
113
  expect(simple_journal.destroy).to eq(false)
91
- expect(simple_journal.errors[:base]).to include('Is permanent and cannot be changed!')
114
+ expect(simple_journal.errors.added? :base, :changes_not_allowed).to eq(true)
92
115
  end
93
116
  end
94
117
 
File without changes
File without changes
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  require 'simplecov'
2
2
  require 'coveralls'
3
3
 
4
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
5
5
  SimpleCov::Formatter::HTMLFormatter,
6
6
  Coveralls::SimpleCov::Formatter
7
- ]
7
+ ])
8
8
  SimpleCov.start do
9
9
  add_filter '/spec/'
10
10
  end
@@ -38,6 +38,9 @@ RSpec.configure do |config|
38
38
  # config.order = 'random'
39
39
 
40
40
  config.before(:suite) do
41
+ KeeprMigration.up
42
+ SpecMigration.up
43
+
41
44
  DatabaseCleaner.strategy = :transaction
42
45
  DatabaseCleaner.clean_with(:truncation)
43
46
  end
@@ -56,19 +59,7 @@ RSpec.configure do |config|
56
59
  end
57
60
  end
58
61
 
59
- def setup_db
60
- ActiveRecord::Base.configurations = YAML.load_file(File.expand_path('database.yml', File.dirname(__FILE__)))
61
-
62
- ActiveRecord::Base.establish_connection(:sqlite)
63
- ActiveRecord::Migration.verbose = false
64
-
65
- ActiveRecord::Base.connection.tables.each do |table|
66
- next if table == 'schema_migrations'
67
- ActiveRecord::Base.connection.execute("DROP TABLE #{table}")
68
- end
69
-
70
- KeeprMigration.up
71
- SpecMigration.up
72
- end
73
-
74
- setup_db
62
+ puts "Testing with ActiveRecord #{ActiveRecord::VERSION::STRING}"
63
+ ActiveRecord::Base.configurations = YAML.load_file(File.expand_path('database.yml', File.dirname(__FILE__)))
64
+ ActiveRecord::Base.establish_connection(:sqlite)
65
+ ActiveRecord::Migration.verbose = false
@@ -1,3 +1,4 @@
1
1
  class Document < ActiveRecord::Base
2
- is_keepr_accountable
2
+ has_keepr_journals
3
+ has_keepr_postings
3
4
  end
@@ -1,20 +1,21 @@
1
1
  class SpecMigration < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :contacts, force: true do |t|
3
+ create_table Contact, force: true do |t|
4
4
  t.string :name
5
5
  end
6
6
 
7
- create_table :ledgers, force: true do |t|
7
+ create_table Ledger, force: true do |t|
8
8
  t.string :bank_name
9
9
  end
10
10
 
11
- create_table :documents, force: true do |t|
11
+ create_table Document, force: true do |t|
12
12
  t.string :number
13
13
  end
14
14
  end
15
15
 
16
16
  def self.down
17
- drop_table :documents
18
- drop_table :contacts
17
+ drop_table Document
18
+ drop_table Ledger
19
+ drop_table Contact
19
20
  end
20
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keepr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georg Ledermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-21 00:00:00.000000000 Z
11
+ date: 2016-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.3'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.3'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: Double entry bookkeeping with Rails
140
154
  email: mail@georg-ledermann.de
141
155
  executables: []
@@ -150,6 +164,7 @@ files:
150
164
  - Rakefile
151
165
  - ci/Gemfile-rails-4-1
152
166
  - ci/Gemfile-rails-4-2
167
+ - ci/Gemfile-rails-5-0
153
168
  - keepr.gemspec
154
169
  - lib/generators/keepr/migration/migration_generator.rb
155
170
  - lib/generators/keepr/migration/templates/migration.rb
@@ -166,24 +181,24 @@ files:
166
181
  - lib/keepr/posting.rb
167
182
  - lib/keepr/tax.rb
168
183
  - lib/keepr/version.rb
169
- - spec/account_spec.rb
170
- - spec/active_record_extension_spec.rb
171
- - spec/cost_center_spec.rb
172
184
  - spec/database.yml
173
185
  - spec/factories/account.rb
174
186
  - spec/factories/cost_center.rb
175
187
  - spec/factories/group.rb
176
188
  - spec/factories/tax.rb
177
- - spec/group_spec.rb
178
- - spec/groups_creator_spec.rb
179
- - spec/journal_spec.rb
180
- - spec/posting_spec.rb
189
+ - spec/keepr/account_spec.rb
190
+ - spec/keepr/active_record_extension_spec.rb
191
+ - spec/keepr/cost_center_spec.rb
192
+ - spec/keepr/group_spec.rb
193
+ - spec/keepr/groups_creator_spec.rb
194
+ - spec/keepr/journal_spec.rb
195
+ - spec/keepr/posting_spec.rb
196
+ - spec/keepr/tax_spec.rb
181
197
  - spec/spec_helper.rb
182
198
  - spec/support/contact.rb
183
199
  - spec/support/document.rb
184
200
  - spec/support/ledger.rb
185
201
  - spec/support/spec_migration.rb
186
- - spec/tax_spec.rb
187
202
  homepage: https://github.com/ledermann/keepr
188
203
  licenses:
189
204
  - MIT
@@ -204,26 +219,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
219
  version: '0'
205
220
  requirements: []
206
221
  rubyforge_project:
207
- rubygems_version: 2.4.6
222
+ rubygems_version: 2.6.4
208
223
  signing_key:
209
224
  specification_version: 4
210
225
  summary: Some basic ActiveRecord models to build a double entry bookkeeping application
211
226
  test_files:
212
- - spec/account_spec.rb
213
- - spec/active_record_extension_spec.rb
214
- - spec/cost_center_spec.rb
215
227
  - spec/database.yml
216
228
  - spec/factories/account.rb
217
229
  - spec/factories/cost_center.rb
218
230
  - spec/factories/group.rb
219
231
  - spec/factories/tax.rb
220
- - spec/group_spec.rb
221
- - spec/groups_creator_spec.rb
222
- - spec/journal_spec.rb
223
- - spec/posting_spec.rb
232
+ - spec/keepr/account_spec.rb
233
+ - spec/keepr/active_record_extension_spec.rb
234
+ - spec/keepr/cost_center_spec.rb
235
+ - spec/keepr/group_spec.rb
236
+ - spec/keepr/groups_creator_spec.rb
237
+ - spec/keepr/journal_spec.rb
238
+ - spec/keepr/posting_spec.rb
239
+ - spec/keepr/tax_spec.rb
224
240
  - spec/spec_helper.rb
225
241
  - spec/support/contact.rb
226
242
  - spec/support/document.rb
227
243
  - spec/support/ledger.rb
228
244
  - spec/support/spec_migration.rb
229
- - spec/tax_spec.rb