double_entry 0.1.0 → 0.2.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.
Files changed (40) hide show
  1. data/README.md +16 -14
  2. data/lib/double_entry.rb +9 -62
  3. data/lib/double_entry/account.rb +5 -1
  4. data/lib/double_entry/configuration.rb +21 -0
  5. data/lib/double_entry/reporting.rb +51 -0
  6. data/lib/double_entry/{aggregate.rb → reporting/aggregate.rb} +9 -7
  7. data/lib/double_entry/{aggregate_array.rb → reporting/aggregate_array.rb} +3 -1
  8. data/lib/double_entry/{day_range.rb → reporting/day_range.rb} +2 -0
  9. data/lib/double_entry/{hour_range.rb → reporting/hour_range.rb} +2 -0
  10. data/lib/double_entry/{line_aggregate.rb → reporting/line_aggregate.rb} +4 -2
  11. data/lib/double_entry/{month_range.rb → reporting/month_range.rb} +4 -2
  12. data/lib/double_entry/{time_range.rb → reporting/time_range.rb} +7 -5
  13. data/lib/double_entry/{time_range_array.rb → reporting/time_range_array.rb} +2 -0
  14. data/lib/double_entry/{week_range.rb → reporting/week_range.rb} +3 -1
  15. data/lib/double_entry/{year_range.rb → reporting/year_range.rb} +4 -3
  16. data/lib/double_entry/transfer.rb +4 -0
  17. data/lib/double_entry/validation.rb +1 -0
  18. data/lib/double_entry/{line_check.rb → validation/line_check.rb} +2 -0
  19. data/lib/double_entry/version.rb +1 -1
  20. data/script/jack_hammer +21 -16
  21. data/spec/double_entry/account_spec.rb +9 -0
  22. data/spec/double_entry/configuration_spec.rb +23 -0
  23. data/spec/double_entry/locking_spec.rb +24 -13
  24. data/spec/double_entry/{aggregate_array_spec.rb → reporting/aggregate_array_spec.rb} +2 -2
  25. data/spec/double_entry/reporting/aggregate_spec.rb +171 -0
  26. data/spec/double_entry/reporting/line_aggregate_spec.rb +10 -0
  27. data/spec/double_entry/{month_range_spec.rb → reporting/month_range_spec.rb} +23 -21
  28. data/spec/double_entry/{time_range_array_spec.rb → reporting/time_range_array_spec.rb} +41 -39
  29. data/spec/double_entry/{time_range_spec.rb → reporting/time_range_spec.rb} +10 -9
  30. data/spec/double_entry/{week_range_spec.rb → reporting/week_range_spec.rb} +26 -25
  31. data/spec/double_entry/reporting_spec.rb +24 -0
  32. data/spec/double_entry/transfer_spec.rb +17 -0
  33. data/spec/double_entry/{line_check_spec.rb → validation/line_check_spec.rb} +17 -16
  34. data/spec/double_entry_spec.rb +409 -0
  35. data/spec/support/accounts.rb +16 -17
  36. metadata +70 -35
  37. checksums.yaml +0 -15
  38. data/spec/double_entry/aggregate_spec.rb +0 -168
  39. data/spec/double_entry/double_entry_spec.rb +0 -391
  40. data/spec/double_entry/line_aggregate_spec.rb +0 -8
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module DoubleEntry
3
+ module Reporting
3
4
  class TimeRangeArray
4
5
  class << self
5
6
 
@@ -40,4 +41,5 @@ module DoubleEntry
40
41
  end
41
42
  end
42
43
  end
44
+ end
43
45
  end
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module DoubleEntry
3
+ module Reporting
3
4
  # We use a particularly crazy week numbering system: week 1 of any given year
4
5
  # is the first week with any days that fall into that year.
5
6
  #
@@ -43,7 +44,7 @@ module DoubleEntry
43
44
  end
44
45
 
45
46
  def earliest_week
46
- from_time(DoubleEntry::Reporting.configuration.start_of_business)
47
+ from_time(Reporting.configuration.start_of_business)
47
48
  end
48
49
  end
49
50
 
@@ -96,4 +97,5 @@ module DoubleEntry
96
97
  self.class.send(:start_of_year, year) + (week - 1).weeks
97
98
  end
98
99
  end
100
+ end
99
101
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
-
3
2
  module DoubleEntry
3
+ module Reporting
4
4
  class YearRange < TimeRange
5
5
  attr_reader :year
6
6
 
@@ -13,11 +13,11 @@ module DoubleEntry
13
13
  end
14
14
 
15
15
  def self.current
16
- YearRange.new(:year => Time.now.year)
16
+ new(:year => Time.now.year)
17
17
  end
18
18
 
19
19
  def self.from_time(time)
20
- YearRange.new(:year => time.year)
20
+ new(:year => time.year)
21
21
  end
22
22
 
23
23
  def ==(other)
@@ -36,4 +36,5 @@ module DoubleEntry
36
36
  year.to_s
37
37
  end
38
38
  end
39
+ end
39
40
  end
@@ -2,6 +2,10 @@
2
2
  module DoubleEntry
3
3
  class Transfer
4
4
  class Set < Array
5
+ def define(attributes)
6
+ self << Transfer.new(attributes)
7
+ end
8
+
5
9
  def find(from, to, code)
6
10
  _find(from.identifier, to.identifier, code)
7
11
  end
@@ -0,0 +1 @@
1
+ require 'double_entry/validation/line_check'
@@ -2,6 +2,7 @@
2
2
  require 'set'
3
3
 
4
4
  module DoubleEntry
5
+ module Validation
5
6
  class LineCheck < ActiveRecord::Base
6
7
  extend EncapsulateAsMoney
7
8
 
@@ -115,4 +116,5 @@ module DoubleEntry
115
116
  account_balance.update_attribute(:balance, balance)
116
117
  end
117
118
  end
119
+ end
118
120
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module DoubleEntry
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/script/jack_hammer CHANGED
@@ -68,24 +68,29 @@ end
68
68
  def create_accounts_and_transfers
69
69
  puts "Setting up #{$account_count} accounts..."
70
70
 
71
- # Create the accounts.
72
- scope = lambda {|x| x }
73
- DoubleEntry.accounts = DoubleEntry::Account::Set.new
74
- $account_count.times do |i|
75
- DoubleEntry.accounts << DoubleEntry::Account.new(:identifier => :"account-#{i}", :scope_identifier => scope)
76
- end
71
+ DoubleEntry.configure do |config|
77
72
 
78
- # Create all the possible transfers.
79
- DoubleEntry.transfers = DoubleEntry::Transfer::Set.new
80
- DoubleEntry.accounts.each do |from|
81
- DoubleEntry.accounts.each do |to|
82
- DoubleEntry.transfers << DoubleEntry::Transfer.new(:from => from.identifier, :to => to.identifier, :code => :test)
73
+ # Create the accounts.
74
+ config.define_accounts do |accounts|
75
+ scope = ->(x) { x }
76
+ $account_count.times do |i|
77
+ accounts.define(:identifier => :"account-#{i}", :scope_identifier => scope)
78
+ end
79
+ end
80
+
81
+ # Create all the possible transfers.
82
+ config.define_transfers do |transfers|
83
+ config.accounts.each do |from|
84
+ config.accounts.each do |to|
85
+ transfers.define(:from => from.identifier, :to => to.identifier, :code => :test)
86
+ end
87
+ end
83
88
  end
84
- end
85
89
 
86
- # Find account instances so we have something to work with.
87
- $accounts = DoubleEntry.accounts.map do |account|
88
- DoubleEntry.account(account.identifier, :scope => 1)
90
+ # Find account instances so we have something to work with.
91
+ $accounts = config.accounts.map do |account|
92
+ DoubleEntry.account(account.identifier, :scope => 1)
93
+ end
89
94
  end
90
95
  end
91
96
 
@@ -93,7 +98,7 @@ end
93
98
  def run_tests
94
99
  puts "Spawning #{$process_count} processes..."
95
100
 
96
- iterations_per_process = $transfer_count / $process_count / $balance_flush_count
101
+ iterations_per_process = [ ($transfer_count / $process_count / $balance_flush_count), 1 ].max
97
102
 
98
103
  $balance_flush_count.times do
99
104
  puts "Flushing balances"
@@ -19,5 +19,14 @@ describe DoubleEntry::Account do
19
19
  expect(a1.hash).to eq a2.hash
20
20
  expect(a1.hash).to_not eq b.hash
21
21
  end
22
+ end
22
23
 
24
+ describe DoubleEntry::Account::Set do
25
+ describe "#define" do
26
+ context "given a 'savings' account is defined" do
27
+ before { subject.define(:identifier => "savings") }
28
+ its(:first) { should be_a DoubleEntry::Account }
29
+ its("first.identifier") { should eq "savings" }
30
+ end
31
+ end
23
32
  end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ describe DoubleEntry::Configuration do
4
+
5
+ its(:accounts) { should be_a DoubleEntry::Account::Set }
6
+ its(:transfers) { should be_a DoubleEntry::Transfer::Set }
7
+
8
+ describe "#define_accounts" do
9
+ it "yields the accounts set" do
10
+ expect { |block|
11
+ subject.define_accounts(&block)
12
+ }.to yield_with_args(be_a DoubleEntry::Account::Set)
13
+ end
14
+ end
15
+
16
+ describe "#define_transfers" do
17
+ it "yields the transfers set" do
18
+ expect { |block|
19
+ subject.define_transfers(&block)
20
+ }.to yield_with_args(be_a DoubleEntry::Transfer::Set)
21
+ end
22
+ end
23
+ end
@@ -3,22 +3,33 @@ require 'spec_helper'
3
3
 
4
4
  describe DoubleEntry::Locking do
5
5
 
6
- before(:all) { @saved_accounts, @saved_transfers = DoubleEntry.accounts, DoubleEntry.transfers }
7
- after(:all) { DoubleEntry.accounts, DoubleEntry.transfers = @saved_accounts, @saved_transfers }
8
-
9
6
  before do
10
- scope = lambda {|x| x }
7
+ @config_accounts = DoubleEntry.configuration.accounts
8
+ @config_transfers = DoubleEntry.configuration.transfers
9
+ DoubleEntry.configuration.accounts = DoubleEntry::Account::Set.new
10
+ DoubleEntry.configuration.transfers = DoubleEntry::Transfer::Set.new
11
+ end
11
12
 
12
- DoubleEntry.accounts = DoubleEntry::Account::Set.new.tap do |accounts|
13
- accounts << DoubleEntry::Account.new(:identifier => :account_a, :scope_identifier => scope)
14
- accounts << DoubleEntry::Account.new(:identifier => :account_b, :scope_identifier => scope)
15
- accounts << DoubleEntry::Account.new(:identifier => :account_c, :scope_identifier => scope)
16
- accounts << DoubleEntry::Account.new(:identifier => :account_d, :scope_identifier => scope)
17
- end
13
+ after do
14
+ DoubleEntry.configuration.accounts = @config_accounts
15
+ DoubleEntry.configuration.transfers = @config_transfers
16
+ end
18
17
 
19
- DoubleEntry.transfers = DoubleEntry::Transfer::Set.new.tap do |transfers|
20
- transfers << DoubleEntry::Transfer.new(:from => :account_a, :to => :account_b, :code => :test)
21
- transfers << DoubleEntry::Transfer.new(:from => :account_c, :to => :account_d, :code => :test)
18
+ before do
19
+ scope = ->(x) { x }
20
+
21
+ DoubleEntry.configure do |config|
22
+ config.define_accounts do |accounts|
23
+ accounts.define(:identifier => :account_a, :scope_identifier => scope)
24
+ accounts.define(:identifier => :account_b, :scope_identifier => scope)
25
+ accounts.define(:identifier => :account_c, :scope_identifier => scope)
26
+ accounts.define(:identifier => :account_d, :scope_identifier => scope)
27
+ end
28
+
29
+ config.define_transfers do |transfers|
30
+ transfers.define(:from => :account_a, :to => :account_b, :code => :test)
31
+ transfers.define(:from => :account_c, :to => :account_d, :code => :test)
32
+ end
22
33
  end
23
34
 
24
35
  @account_a = DoubleEntry.account(:account_a, :scope => "1")
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- describe DoubleEntry::AggregateArray do
2
+ describe DoubleEntry::Reporting::AggregateArray do
3
3
 
4
4
  let(:user) { User.make! }
5
5
  let(:start) { nil }
@@ -7,7 +7,7 @@ describe DoubleEntry::AggregateArray do
7
7
  let(:range_type) { 'year' }
8
8
 
9
9
  subject(:aggregate_array) {
10
- DoubleEntry.aggregate_array(
10
+ DoubleEntry::Reporting.aggregate_array(
11
11
  :sum,
12
12
  :savings,
13
13
  :bonus,
@@ -0,0 +1,171 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ module DoubleEntry
4
+ module Reporting
5
+ describe Aggregate do
6
+
7
+ let(:user) { User.make! }
8
+
9
+ before do
10
+ # Thursday
11
+ Timecop.freeze Time.local(2009, 10, 1) do
12
+ perform_deposit user, 20_00
13
+ end
14
+
15
+ # Saturday
16
+ Timecop.freeze Time.local(2009, 10, 3) do
17
+ perform_deposit user, 40_00
18
+ end
19
+
20
+ Timecop.freeze Time.local(2009, 10, 10) do
21
+ perform_deposit user, 50_00
22
+ end
23
+ Timecop.freeze Time.local(2009, 11, 1, 0, 59, 0) do
24
+ perform_deposit user, 40_00
25
+ end
26
+ Timecop.freeze Time.local(2009, 11, 1, 1, 00, 0) do
27
+ perform_deposit user, 50_00
28
+ end
29
+ end
30
+
31
+ it 'should store the aggregate for quick retrieval' do
32
+ Reporting.aggregate(:sum, :savings, :bonus,
33
+ :range => TimeRange.make(:year => 2009, :month => 10))
34
+ expect(LineAggregate.count).to eq 1
35
+ end
36
+
37
+ it 'should only store the aggregate once if it is requested more than once' do
38
+ Reporting.aggregate(:sum, :savings, :bonus,
39
+ :range => TimeRange.make(:year => 2009, :month => 9))
40
+ Reporting.aggregate(:sum, :savings, :bonus,
41
+ :range => TimeRange.make(:year => 2009, :month => 9))
42
+ Reporting.aggregate(:sum, :savings, :bonus,
43
+ :range => TimeRange.make(:year => 2009, :month => 10))
44
+ expect(LineAggregate.count).to eq 2
45
+ end
46
+
47
+ it 'should calculate the complete year correctly' do
48
+ expect(
49
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009))
50
+ ).to eq Money.new(200_00)
51
+ end
52
+
53
+ it 'should calculate seperate months correctly' do
54
+ expect(
55
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :month => 10))
56
+ ).to eq Money.new(110_00)
57
+ expect(
58
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :month => 11))
59
+ ).to eq Money.new(90_00)
60
+ end
61
+
62
+ it 'should calculate seperate weeks correctly' do
63
+ # Week 40 - Mon Sep 28, 2009 to Sun Oct 4 2009
64
+ expect(
65
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :week => 40))
66
+ ).to eq Money.new(60_00)
67
+ end
68
+
69
+ it 'should calculate seperate days correctly' do
70
+ # 1 Nov 2009
71
+ expect(
72
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :week => 44, :day => 7))
73
+ ).to eq Money.new(90_00)
74
+ end
75
+
76
+ it 'should calculate seperate hours correctly' do
77
+ # 1 Nov 2009
78
+ expect(
79
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :week => 44, :day => 7, :hour => 0))
80
+ ).to eq Money.new(40_00)
81
+ expect(
82
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :week => 44, :day => 7, :hour => 1))
83
+ ).to eq Money.new(50_00)
84
+ end
85
+
86
+ it 'should calculate, but not store aggregates when the time range is still current' do
87
+ Timecop.freeze Time.local(2009, 11, 21) do
88
+ expect(
89
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :month => 11))
90
+ ).to eq Money.new(90_00)
91
+ expect(LineAggregate.count).to eq 0
92
+ end
93
+ end
94
+
95
+ it 'should calculate, but not store aggregates when the time range is in the future' do
96
+ Timecop.freeze Time.local(2009, 11, 21) do
97
+ expect(
98
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :month => 12))
99
+ ).to eq Money.new(0)
100
+ expect(LineAggregate.count).to eq 0
101
+ end
102
+ end
103
+
104
+ it 'should calculate monthly all_time ranges correctly' do
105
+ expect(
106
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :month => 12, :range_type => :all_time))
107
+ ).to eq Money.new(200_00)
108
+ end
109
+
110
+ it 'should calculate weekly all_time ranges correctly' do
111
+ expect(
112
+ Reporting.aggregate(:sum, :savings, :bonus, :range => TimeRange.make(:year => 2009, :week => 43, :range_type => :all_time))
113
+ ).to eq Money.new(110_00)
114
+ end
115
+
116
+ context 'filters' do
117
+
118
+ let(:range) { TimeRange.make(:year => 2011, :month => 10) }
119
+
120
+ class ::DoubleEntry::Line
121
+ scope :test_filter, -> { where(:amount => 10_00) }
122
+ end
123
+
124
+ before do
125
+ Timecop.freeze Time.local(2011, 10, 10) do
126
+ perform_deposit user, 10_00
127
+ end
128
+
129
+ Timecop.freeze Time.local(2011, 10, 10) do
130
+ perform_deposit user, 9_00
131
+ end
132
+ end
133
+
134
+ it 'saves filtered aggregations' do
135
+ expect {
136
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
137
+ }.to change { LineAggregate.count }.by 1
138
+ end
139
+
140
+ it 'saves filtered aggregation only once for a range' do
141
+ expect {
142
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
143
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
144
+ }.to change { LineAggregate.count }.by 1
145
+ end
146
+
147
+ it 'saves filtered aggregations and non filtered aggregations separately' do
148
+ expect {
149
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
150
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range)
151
+ }.to change { LineAggregate.count }.by 2
152
+ end
153
+
154
+ it 'loads the correct saved aggregation' do
155
+
156
+ # cache the results for filtered and unfiltered aggregations
157
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
158
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range)
159
+
160
+ # ensure a second call loads the correct cached value
161
+ expect(
162
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range, :filter => [:test_filter])
163
+ ).to eq Money.new(10_00)
164
+ expect(
165
+ Reporting.aggregate(:sum, :savings, :bonus, :range => range)
166
+ ).to eq Money.new(19_00)
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ module DoubleEntry::Reporting
4
+ describe LineAggregate do
5
+
6
+ it "has a table name prefixed with double_entry_" do
7
+ expect(LineAggregate.table_name).to eq "double_entry_line_aggregates"
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,10 @@
1
1
  # encoding: utf-8
2
2
  require "spec_helper"
3
- describe DoubleEntry::MonthRange do
3
+ module DoubleEntry::Reporting
4
+ describe MonthRange do
4
5
 
5
6
  describe "::from_time" do
6
- subject(:from_time) { DoubleEntry::MonthRange.from_time(given_time) }
7
+ subject(:from_time) { MonthRange.from_time(given_time) }
7
8
 
8
9
  context "given the Time 31st March 2012" do
9
10
  let(:given_time) { Time.new(2012, 3, 31) }
@@ -19,15 +20,15 @@ describe DoubleEntry::MonthRange do
19
20
  end
20
21
 
21
22
  describe "::reportable_months" do
22
- subject(:reportable_months) { DoubleEntry::MonthRange.reportable_months }
23
+ subject(:reportable_months) { MonthRange.reportable_months }
23
24
 
24
25
  context "The date is 1st March 1970" do
25
26
  before { Timecop.freeze(Time.new(1970, 3, 1)) }
26
27
 
27
28
  it { should eq [
28
- DoubleEntry::MonthRange.new(year: 1970, month: 1),
29
- DoubleEntry::MonthRange.new(year: 1970, month: 2),
30
- DoubleEntry::MonthRange.new(year: 1970, month: 3),
29
+ MonthRange.new(year: 1970, month: 1),
30
+ MonthRange.new(year: 1970, month: 2),
31
+ MonthRange.new(year: 1970, month: 3),
31
32
  ] }
32
33
 
33
34
  context "My business started on 5th Feb 1970" do
@@ -38,8 +39,8 @@ describe DoubleEntry::MonthRange do
38
39
  end
39
40
 
40
41
  it { should eq [
41
- DoubleEntry::MonthRange.new(year: 1970, month: 2),
42
- DoubleEntry::MonthRange.new(year: 1970, month: 3),
42
+ MonthRange.new(year: 1970, month: 2),
43
+ MonthRange.new(year: 1970, month: 3),
43
44
  ] }
44
45
  end
45
46
  end
@@ -47,24 +48,24 @@ describe DoubleEntry::MonthRange do
47
48
  context "The date is 1st Jan 1970" do
48
49
  before { Timecop.freeze(Time.new(1970, 1, 1)) }
49
50
 
50
- it { should eq [ DoubleEntry::MonthRange.new(year: 1970, month: 1) ] }
51
+ it { should eq [ MonthRange.new(year: 1970, month: 1) ] }
51
52
  end
52
53
  end
53
54
 
54
55
  describe "::beginning_of_financial_year" do
55
- let(:month_range) { DoubleEntry::MonthRange.new(:year => year, :month => month) }
56
+ let(:month_range) { MonthRange.new(:year => year, :month => month) }
56
57
  let(:year) { 2014 }
57
58
 
58
59
  context "the first month of the financial year is July" do
59
60
  subject(:beginning_of_financial_year) { month_range.beginning_of_financial_year }
60
61
  context "returns the current year if the month is after July" do
61
62
  let(:month) { 10 }
62
- it { should eq(DoubleEntry::MonthRange.new(:year => 2014, :month => 7)) }
63
+ it { should eq(MonthRange.new(:year => 2014, :month => 7)) }
63
64
  end
64
65
 
65
66
  context "returns the previous year if the month is before July" do
66
67
  let(:month) { 3 }
67
- it { should eq(DoubleEntry::MonthRange.new(:year => 2013, :month => 7)) }
68
+ it { should eq(MonthRange.new(:year => 2013, :month => 7)) }
68
69
  end
69
70
  end
70
71
 
@@ -79,12 +80,12 @@ describe DoubleEntry::MonthRange do
79
80
 
80
81
  context "returns the current year if the month is after January" do
81
82
  let(:month) { 10 }
82
- it { should eq(DoubleEntry::MonthRange.new(:year => 2014, :month => 1)) }
83
+ it { should eq(MonthRange.new(:year => 2014, :month => 1)) }
83
84
  end
84
85
 
85
86
  context "returns the current year if the month is January" do
86
87
  let(:month) { 1 }
87
- it { should eq(DoubleEntry::MonthRange.new(:year => 2014, :month => 1)) }
88
+ it { should eq(MonthRange.new(:year => 2014, :month => 1)) }
88
89
  end
89
90
  end
90
91
 
@@ -99,33 +100,34 @@ describe DoubleEntry::MonthRange do
99
100
 
100
101
  context "returns the previous year if the month is before December (in the same year)" do
101
102
  let(:month) { 11 }
102
- it { should eq(DoubleEntry::MonthRange.new(:year => 2013, :month => 12)) }
103
+ it { should eq(MonthRange.new(:year => 2013, :month => 12)) }
103
104
  end
104
105
 
105
106
  context "returns the previous year if the month is after December (in the next year)" do
106
107
  let(:year) { 2015 }
107
108
  let(:month) { 1 }
108
- it { should eq(DoubleEntry::MonthRange.new(:year => 2014, :month => 12)) }
109
+ it { should eq(MonthRange.new(:year => 2014, :month => 12)) }
109
110
  end
110
111
 
111
112
  context "returns the current year if the month is December" do
112
113
  let(:month) { 12 }
113
- it { should eq(DoubleEntry::MonthRange.new(:year => 2014, :month => 12)) }
114
+ it { should eq(MonthRange.new(:year => 2014, :month => 12)) }
114
115
  end
115
116
  end
116
117
 
117
118
  context "Given a start time of 3rd Dec 1982" do
118
- subject(:reportable_months) { DoubleEntry::MonthRange.reportable_months(from: Time.new(1982, 12, 3)) }
119
+ subject(:reportable_months) { MonthRange.reportable_months(from: Time.new(1982, 12, 3)) }
119
120
 
120
121
  context "The date is 2nd Feb 1983" do
121
122
  before { Timecop.freeze(Time.new(1983, 2, 2)) }
122
123
 
123
124
  it { should eq [
124
- DoubleEntry::MonthRange.new(year: 1982, month: 12),
125
- DoubleEntry::MonthRange.new(year: 1983, month: 1),
126
- DoubleEntry::MonthRange.new(year: 1983, month: 2),
125
+ MonthRange.new(year: 1982, month: 12),
126
+ MonthRange.new(year: 1983, month: 1),
127
+ MonthRange.new(year: 1983, month: 2),
127
128
  ] }
128
129
  end
129
130
  end
130
131
  end
132
+ end
131
133
  end