invoicing 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +10 -0
- data/README.rdoc +3 -0
- data/Rakefile +10 -4
- data/lib/invoicing.rb +3 -0
- data/lib/invoicing/countries/uk.rb +15 -3
- data/lib/invoicing/ledger_item.rb +21 -6
- data/lib/invoicing/ledger_item/render_html.rb +2 -1
- data/lib/invoicing/ledger_item/render_ubl.rb +15 -4
- data/lib/invoicing/line_item.rb +9 -0
- data/lib/invoicing/tax_rate.rb +13 -0
- data/lib/invoicing/version.rb +1 -1
- data/test/connection_adapter_ext_test.rb +13 -5
- data/test/ledger_item_test.rb +13 -3
- data/test/line_item_test.rb +2 -2
- data/test/ref-output/creditnote3.html +1 -1
- data/test/render_html_test.rb +1 -0
- data/test/render_ubl_test.rb +16 -4
- data/test/test_helper.rb +29 -5
- metadata +6 -7
- metadata.gz.sig +4 -3
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== 0.2.1
|
2
|
+
|
3
|
+
* 2 minor enhancements:
|
4
|
+
* Added option to LedgerItem#account_summary which enables inclusion of open/pending
|
5
|
+
ledger items in the summary
|
6
|
+
* Improved robustness and documentation for test suite
|
7
|
+
* 2 bugfixes:
|
8
|
+
* Compatibility with recent versions of ActiveRecord
|
9
|
+
* Cleaned up unnecessary gem dependencies (mocha, uuid)
|
10
|
+
|
1
11
|
== 0.2.0 2009-04-20
|
2
12
|
|
3
13
|
* 4 major enhancements:
|
data/README.rdoc
CHANGED
@@ -20,6 +20,9 @@ Please see {the website}[http://ept.github.com/invoicing/] for an introduction
|
|
20
20
|
to using Invoicing, and check the
|
21
21
|
{API reference}[http://invoicing.rubyforge.org/doc/] for in-depth details.
|
22
22
|
|
23
|
+
If you're interested in contributing to the invoicing gem itself, please see the file
|
24
|
+
{HACKING.md}[http://github.com/ept/invoicing/blob/master/HACKING.md].
|
25
|
+
|
23
26
|
== FEATURES
|
24
27
|
|
25
28
|
* TODO
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
%w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
|
1
|
+
%w[rubygems rake rake/clean fileutils newgem rubigen hoe].each { |f| require f }
|
2
2
|
require File.dirname(__FILE__) + '/lib/invoicing'
|
3
3
|
|
4
4
|
# Hoe calls Ruby with the "-w" set by default; unfortunately, ActiveRecord (at version 2.2.2
|
@@ -6,16 +6,21 @@ require File.dirname(__FILE__) + '/lib/invoicing'
|
|
6
6
|
# the output. Comment out the following four lines to see those warnings.
|
7
7
|
class Hoe
|
8
8
|
RUBY_FLAGS = ENV['RUBY_FLAGS'] || "-I#{%w(lib test).join(File::PATH_SEPARATOR)}" +
|
9
|
-
(RUBY_DEBUG ? " #{RUBY_DEBUG}" : '')
|
9
|
+
((defined?(RUBY_DEBUG) && RUBY_DEBUG) ? " #{RUBY_DEBUG}" : '')
|
10
10
|
end
|
11
11
|
|
12
12
|
# Generate all the Rake tasks
|
13
13
|
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
14
|
-
$hoe = Hoe.
|
15
|
-
p.
|
14
|
+
$hoe = Hoe.spec 'invoicing' do |p|
|
15
|
+
p.version = Invoicing::VERSION
|
16
|
+
p.developer 'Martin Kleppmann', 'rubyforge@eptcomputing.com'
|
17
|
+
|
18
|
+
p.summary = p.paragraphs_of('README.rdoc', 3).join
|
19
|
+
p.description = p.paragraphs_of('README.rdoc', 3..5).join("\n\n")
|
16
20
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
17
21
|
p.post_install_message = 'PostInstall.txt'
|
18
22
|
p.rubyforge_name = p.name
|
23
|
+
|
19
24
|
p.extra_deps = [
|
20
25
|
['activerecord', '>= 2.1.0'],
|
21
26
|
['builder', '>= 2.0']
|
@@ -28,6 +33,7 @@ $hoe = Hoe.new('invoicing', Invoicing::VERSION) do |p|
|
|
28
33
|
p.test_globs = %w[test/*_test.rb] # do not include test/models/*.rb
|
29
34
|
p.clean_globs |= %w[**/.DS_Store tmp *.log coverage]
|
30
35
|
p.rsync_args = '-av --delete --ignore-errors'
|
36
|
+
p.remote_rdoc_dir = 'doc'
|
31
37
|
end
|
32
38
|
|
33
39
|
require 'newgem/tasks' # load /tasks/*.rake
|
data/lib/invoicing.rb
CHANGED
@@ -3,12 +3,24 @@ module Invoicing
|
|
3
3
|
module UK
|
4
4
|
# Extremely simplistic implementation of UK VAT. This needs to be fixed.
|
5
5
|
class VAT
|
6
|
+
def tax_rate(params)
|
7
|
+
params[:model_object].send(:tax_rate)
|
8
|
+
end
|
9
|
+
|
10
|
+
def tax_factor(params)
|
11
|
+
BigDecimal('1') + tax_rate(params).rate
|
12
|
+
end
|
13
|
+
|
14
|
+
def tax_percent(params)
|
15
|
+
BigDecimal('100') * tax_rate(params).rate
|
16
|
+
end
|
17
|
+
|
6
18
|
def apply_tax(params)
|
7
|
-
params[:value] *
|
19
|
+
params[:value] * tax_factor(params)
|
8
20
|
end
|
9
21
|
|
10
22
|
def remove_tax(params)
|
11
|
-
params[:value] /
|
23
|
+
params[:value] / tax_factor(params)
|
12
24
|
end
|
13
25
|
|
14
26
|
def tax_info(params)
|
@@ -16,7 +28,7 @@ module Invoicing
|
|
16
28
|
end
|
17
29
|
|
18
30
|
def tax_details(params)
|
19
|
-
"(including VAT at
|
31
|
+
"(including VAT at #{tax_percent(params).to_s}%)"
|
20
32
|
end
|
21
33
|
end
|
22
34
|
end
|
@@ -430,6 +430,8 @@ module Invoicing
|
|
430
430
|
# Make sure ledger_item association is assigned -- the CurrencyValue
|
431
431
|
# getters depend on it to fetch the currency
|
432
432
|
info.set(line, :ledger_item, self)
|
433
|
+
line.valid? # Ensure any before_validation hooks are called
|
434
|
+
|
433
435
|
net_amount = info.get(line, :net_amount)
|
434
436
|
tax_amount = info.get(line, :tax_amount)
|
435
437
|
net_total += net_amount unless net_amount.nil?
|
@@ -615,7 +617,13 @@ module Invoicing
|
|
615
617
|
#
|
616
618
|
# If +other_id+ is +nil+, this method aggregates the accounts of +self_id+ with *all* other
|
617
619
|
# parties.
|
618
|
-
|
620
|
+
#
|
621
|
+
# Also accepts options:
|
622
|
+
#
|
623
|
+
# <tt>:with_status</tt>:: List of ledger item status strings; only ledger items whose status
|
624
|
+
# is one of these will be taken into account. Default:
|
625
|
+
# <tt>["closed", "cleared"]</tt>.
|
626
|
+
def account_summary(self_id, other_id=nil, options={})
|
619
627
|
info = ledger_item_class_info
|
620
628
|
self_id = self_id.to_i
|
621
629
|
other_id = [nil, ''].include?(other_id) ? nil : other_id.to_i
|
@@ -623,7 +631,7 @@ module Invoicing
|
|
623
631
|
if other_id.nil?
|
624
632
|
result = {}
|
625
633
|
# Sum over all others, grouped by currency
|
626
|
-
account_summaries(self_id).each_pair do |other_id, hash|
|
634
|
+
account_summaries(self_id, options).each_pair do |other_id, hash|
|
627
635
|
hash.each_pair do |currency, summary|
|
628
636
|
if result[currency]
|
629
637
|
result[currency] += summary
|
@@ -638,7 +646,7 @@ module Invoicing
|
|
638
646
|
conditions = {info.method(:sender_id) => [self_id, other_id],
|
639
647
|
info.method(:recipient_id) => [self_id, other_id]}
|
640
648
|
with_scope(:find => {:conditions => conditions}) do
|
641
|
-
account_summaries(self_id)[other_id] || {}
|
649
|
+
account_summaries(self_id, options)[other_id] || {}
|
642
650
|
end
|
643
651
|
end
|
644
652
|
end
|
@@ -661,7 +669,13 @@ module Invoicing
|
|
661
669
|
# q3_2008 = ['issue_date >= ? AND issue_date < ?', DateTime.parse('2008-07-01'), DateTime.parse('2008-10-01')]
|
662
670
|
# LedgerItem.scoped(:conditions => q3_2008).account_summaries(1)
|
663
671
|
#
|
664
|
-
|
672
|
+
#
|
673
|
+
# Also accepts options:
|
674
|
+
#
|
675
|
+
# <tt>:with_status</tt>:: List of ledger item status strings; only ledger items whose status
|
676
|
+
# is one of these will be taken into account. Default:
|
677
|
+
# <tt>["closed", "cleared"]</tt>.
|
678
|
+
def account_summaries(self_id, options={})
|
665
679
|
info = ledger_item_class_info
|
666
680
|
ext = Invoicing::ConnectionAdapterExt
|
667
681
|
scope = scope(:find)
|
@@ -681,8 +695,9 @@ module Invoicing
|
|
681
695
|
sender_is_self = merge_conditions({info.method(:sender_id) => self_id})
|
682
696
|
recipient_is_self = merge_conditions({info.method(:recipient_id) => self_id})
|
683
697
|
other_id_column = ext.conditional_function(sender_is_self, cols[:recipient_id], cols[:sender_id])
|
684
|
-
|
685
|
-
|
698
|
+
accept_status = sanitize_sql_hash_for_conditions(info.method(:status) => (options[:with_status] || %w(closed cleared)))
|
699
|
+
filter_conditions = "#{accept_status} AND (#{sender_is_self} OR #{recipient_is_self})"
|
700
|
+
|
686
701
|
sql = "SELECT #{other_id_column} AS other_id, #{cols[:currency]} AS currency, " +
|
687
702
|
"SUM(#{ext.conditional_function(debit_when_sent, cols[:total_amount], 0)}) AS sales, " +
|
688
703
|
"SUM(#{ext.conditional_function(debit_when_received, cols[:total_amount], 0)}) AS purchase_payments, " +
|
@@ -90,7 +90,7 @@ module Invoicing
|
|
90
90
|
invoice.cbc :ID, identifier
|
91
91
|
invoice.cbc :UUID, uuid if uuid
|
92
92
|
|
93
|
-
issue_date_formatted, issue_time_formatted = (issue_date || Time.now)
|
93
|
+
issue_date_formatted, issue_time_formatted = date_and_time(issue_date || Time.now)
|
94
94
|
invoice.cbc :IssueDate, issue_date_formatted
|
95
95
|
invoice.cbc :IssueTime, issue_time_formatted
|
96
96
|
|
@@ -173,8 +173,8 @@ module Invoicing
|
|
173
173
|
# <cbc:EndDate>2008-07-02</cbc:EndDate>
|
174
174
|
# <cbc:EndTime>01:02:03+02:00</cbc:EndTime>
|
175
175
|
def build_period(xml, start_datetime, end_datetime)
|
176
|
-
start_date, start_time = start_datetime
|
177
|
-
end_date, end_time = end_datetime
|
176
|
+
start_date, start_time = date_and_time(start_datetime)
|
177
|
+
end_date, end_time = date_and_time(end_datetime)
|
178
178
|
xml.cbc :StartDate, start_date
|
179
179
|
xml.cbc :StartTime, start_time
|
180
180
|
xml.cbc :EndDate, end_date
|
@@ -247,7 +247,10 @@ module Invoicing
|
|
247
247
|
quantity_tag = [:Invoice, :SelfBilledInvoice].include?(doc_type) ? :InvoicedQuantity : :CreditedQuantity
|
248
248
|
invoice_line.cbc quantity_tag, quantity_of(line_item) if quantity_of(line_item)
|
249
249
|
invoice_line.cbc :LineExtensionAmount, (factor*net_amount_of(line_item)).to_s, :currencyID => currency
|
250
|
-
|
250
|
+
if tax_point_of(line_item)
|
251
|
+
tax_point_date, tax_point_time = date_and_time(tax_point_of(line_item))
|
252
|
+
invoice_line.cbc :TaxPointDate, tax_point_date
|
253
|
+
end
|
251
254
|
|
252
255
|
invoice_line.cac :TaxTotal do |tax_total|
|
253
256
|
tax_total.cbc :TaxAmount, (factor*tax_amount_of(line_item)).to_s, :currencyID => currency
|
@@ -263,6 +266,14 @@ module Invoicing
|
|
263
266
|
|
264
267
|
#cac:Price
|
265
268
|
end
|
269
|
+
|
270
|
+
private
|
271
|
+
|
272
|
+
# Returns an array of two strings, <tt>[date, time]</tt> in the format specified by UBL,
|
273
|
+
# for a given datetime value.
|
274
|
+
def date_and_time(value)
|
275
|
+
value.in_time_zone(Time.zone || 'Etc/UTC').xmlschema.split('T')
|
276
|
+
end
|
266
277
|
end
|
267
278
|
end
|
268
279
|
end
|
data/lib/invoicing/line_item.rb
CHANGED
@@ -149,6 +149,8 @@ module Invoicing
|
|
149
149
|
# Set the 'amount' columns to act as currency values
|
150
150
|
acts_as_currency_value(info.method(:net_amount), info.method(:tax_amount))
|
151
151
|
|
152
|
+
before_validation :calculate_tax_amount
|
153
|
+
|
152
154
|
extend Invoicing::FindSubclasses
|
153
155
|
|
154
156
|
# Dynamically created named scopes
|
@@ -192,6 +194,11 @@ module Invoicing
|
|
192
194
|
ledger_item.send(:ledger_item_class_info).get(ledger_item, :currency)
|
193
195
|
end
|
194
196
|
|
197
|
+
def calculate_tax_amount
|
198
|
+
return unless respond_to? :net_amount_taxed
|
199
|
+
self.tax_amount = net_amount_taxed - net_amount
|
200
|
+
end
|
201
|
+
|
195
202
|
# The sum of +net_amount+ and +tax_amount+.
|
196
203
|
def gross_amount
|
197
204
|
net_amount = line_item_class_info.get(self, :net_amount)
|
@@ -212,6 +219,8 @@ module Invoicing
|
|
212
219
|
raise RuntimeError, "You need to define an association like 'belongs_to :ledger_item' on #{self.class.name}. If you " +
|
213
220
|
"have defined the association with a different name, pass the option :ledger_item => :your_association_name to " +
|
214
221
|
"acts_as_line_item."
|
222
|
+
elsif method_name =~ /^amount/
|
223
|
+
send("net_#{method_name}", *args)
|
215
224
|
else
|
216
225
|
super
|
217
226
|
end
|
data/lib/invoicing/tax_rate.rb
CHANGED
@@ -2,8 +2,21 @@ module Invoicing
|
|
2
2
|
module TaxRate
|
3
3
|
module ActMethods
|
4
4
|
def acts_as_tax_rate(*args)
|
5
|
+
Invoicing::ClassInfo.acts_as(Invoicing::TaxRate, self, args)
|
6
|
+
info = tax_rate_class_info
|
5
7
|
|
8
|
+
if info.previous_info.nil? # Called for the first time?
|
9
|
+
# Import TimeDependent functionality
|
10
|
+
acts_as_time_dependent :value => :rate
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
14
|
+
|
15
|
+
# Stores state in the ActiveRecord class object
|
16
|
+
class ClassInfo < Invoicing::ClassInfo::Base #:nodoc:
|
17
|
+
def initialize(model_class, previous_info, args)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
8
21
|
end
|
9
22
|
end
|
data/lib/invoicing/version.rb
CHANGED
@@ -9,11 +9,19 @@ class ConnectionAdapterExtTest < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def using_database(database_type)
|
12
|
-
|
13
|
-
|
12
|
+
if database_type.to_sym == database_used_for_testing
|
13
|
+
# If the test is for the main database type of this test suite, just run it
|
14
14
|
yield
|
15
|
-
|
16
|
-
|
15
|
+
|
16
|
+
elsif test_in_all_databases
|
17
|
+
# Run the test having connected to the requested database type, or skip it
|
18
|
+
# if we're not trying to test all database types
|
19
|
+
begin
|
20
|
+
ActiveRecord::Base.establish_connection(TEST_DB_CONFIG[database_type.to_sym])
|
21
|
+
yield
|
22
|
+
ensure
|
23
|
+
connect_to_testing_database
|
24
|
+
end
|
17
25
|
end
|
18
26
|
end
|
19
27
|
|
@@ -68,4 +76,4 @@ class ConnectionAdapterExtTest < Test::Unit::TestCase
|
|
68
76
|
end
|
69
77
|
end
|
70
78
|
|
71
|
-
end
|
79
|
+
end
|
data/test/ledger_item_test.rb
CHANGED
@@ -218,11 +218,11 @@ class LedgerItemTest < Test::Unit::TestCase
|
|
218
218
|
|
219
219
|
def test_uuid_gem_not_present
|
220
220
|
begin
|
221
|
-
real_uuid = Object.send(:remove_const, :UUID)
|
221
|
+
real_uuid = Object.send(:remove_const, :UUID) rescue nil
|
222
222
|
UUIDNotPresentLedgerItem.acts_as_ledger_item(LedgerItemMethods::RENAMED_METHODS)
|
223
223
|
assert_nil UUIDNotPresentLedgerItem.new.get_class_info.uuid_generator
|
224
224
|
ensure
|
225
|
-
Object.send(:const_set, :UUID, real_uuid)
|
225
|
+
Object.send(:const_set, :UUID, real_uuid) unless real_uuid.nil?
|
226
226
|
end
|
227
227
|
end
|
228
228
|
|
@@ -362,7 +362,17 @@ class LedgerItemTest < Test::Unit::TestCase
|
|
362
362
|
assert_equal BigDecimal('0.00'), summary[:GBP].purchase_payments
|
363
363
|
assert_equal BigDecimal('-666807.63'), summary[:GBP].balance
|
364
364
|
end
|
365
|
-
|
365
|
+
|
366
|
+
def test_account_summary_with_include_open_option
|
367
|
+
summary = MyLedgerItem.account_summary(1, nil, :with_status => %w(open closed cleared))
|
368
|
+
assert_equal [:GBP], summary.keys
|
369
|
+
assert_equal BigDecimal('269.00'), summary[:GBP].sales
|
370
|
+
assert_equal BigDecimal('666808.63'), summary[:GBP].purchases
|
371
|
+
assert_equal BigDecimal('256.50'), summary[:GBP].sale_receipts
|
372
|
+
assert_equal BigDecimal('0.00'), summary[:GBP].purchase_payments
|
373
|
+
assert_equal BigDecimal('-666796.13'), summary[:GBP].balance
|
374
|
+
end
|
375
|
+
|
366
376
|
def test_account_summary_to_s
|
367
377
|
assert_equal "sales = £257.50; purchases = £666,808.63; sale_receipts = £256.50; " +
|
368
378
|
"purchase_payments = £0.00; balance = −£666,807.63", MyLedgerItem.account_summary(1)[:GBP].to_s
|
data/test/line_item_test.rb
CHANGED
@@ -99,11 +99,11 @@ class LineItemTest < Test::Unit::TestCase
|
|
99
99
|
|
100
100
|
def test_uuid_gem_not_present
|
101
101
|
begin
|
102
|
-
real_uuid = Object.send(:remove_const, :UUID)
|
102
|
+
real_uuid = Object.send(:remove_const, :UUID) rescue nil
|
103
103
|
UUIDNotPresentLineItem.acts_as_line_item(LineItemMethods::RENAMED_METHODS)
|
104
104
|
assert_nil UUIDNotPresentLineItem.new.get_class_info.uuid_generator
|
105
105
|
ensure
|
106
|
-
Object.send(:const_set, :UUID, real_uuid)
|
106
|
+
Object.send(:const_set, :UUID, real_uuid) unless real_uuid.nil?
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
data/test/render_html_test.rb
CHANGED
@@ -28,6 +28,7 @@ class RenderHTMLTest < Test::Unit::TestCase
|
|
28
28
|
expected[0] = "<h1>INVOICE</h1>"
|
29
29
|
expected[3] = " <th class=\"recipient\">Customer</th>"
|
30
30
|
expected[4] = " <th class=\"sender\">Supplier</th>"
|
31
|
+
expected[40] = " <th>INVOICE no.:</th>"
|
31
32
|
rendered = MyInvoice.find(1).render_html {|i|
|
32
33
|
i.invoice_label{ "INVOICE" }
|
33
34
|
i.sender_label "Supplier"
|
data/test/render_ubl_test.rb
CHANGED
@@ -7,20 +7,32 @@ class RenderUBLTest < Test::Unit::TestCase
|
|
7
7
|
def reference_output(filename)
|
8
8
|
IO.readlines(File.join(File.dirname(__FILE__), 'ref-output', filename)).join
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
|
+
# Compares two strings, each being a serialised XML document, while ignoring
|
12
|
+
# the order of attributes within elements.
|
13
|
+
# TODO: this could generate much nicer error messages on failure.
|
14
|
+
def assert_equivalent_xml(doc1, doc2)
|
15
|
+
doc1, doc2 = [doc1, doc2].map do |doc|
|
16
|
+
doc.gsub(/(<[^\s>]+\s+)([^>]+)(>)/) do |match|
|
17
|
+
$1.to_s + $2.to_s.split(/\s+/).sort.join(' ') + $3.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
assert_equal doc1, doc2
|
21
|
+
end
|
22
|
+
|
11
23
|
def test_render_ubl_invoice
|
12
|
-
|
24
|
+
assert_equivalent_xml reference_output('invoice1.xml'), MyInvoice.find(1).render_ubl
|
13
25
|
end
|
14
26
|
|
15
27
|
def test_render_ubl_self_billed_invoice
|
16
|
-
|
28
|
+
assert_equivalent_xml reference_output('invoice2.xml'), MyInvoice.find(2).render_ubl
|
17
29
|
end
|
18
30
|
|
19
31
|
def test_render_ubl_credit_note
|
20
32
|
#File.open(File.join(File.dirname(__FILE__), 'ref-output', 'debug3.xml'), 'w') do |f|
|
21
33
|
# f.syswrite(MyCreditNote.find(3).render_ubl)
|
22
34
|
#end
|
23
|
-
|
35
|
+
assert_equivalent_xml reference_output('creditnote3.xml'), MyCreditNote.find(3).render_ubl
|
24
36
|
end
|
25
37
|
|
26
38
|
def test_cannot_render_unknown_ledger_item_subtype
|
data/test/test_helper.rb
CHANGED
@@ -3,7 +3,6 @@ require 'rubygems'
|
|
3
3
|
require 'activerecord'
|
4
4
|
require 'activesupport'
|
5
5
|
require 'flexmock/test_unit'
|
6
|
-
require 'mocha'
|
7
6
|
|
8
7
|
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
9
8
|
|
@@ -11,20 +10,45 @@ ActiveSupport::Dependencies.load_paths << File.join(File.dirname(__FILE__), 'mod
|
|
11
10
|
|
12
11
|
require 'invoicing'
|
13
12
|
|
13
|
+
# Overridden by ../../config/database.yml if it exists.
|
14
14
|
TEST_DB_CONFIG = {
|
15
15
|
:postgresql => {:adapter => "postgresql", :host => "localhost", :database => "invoicing_test",
|
16
|
-
:username => "
|
16
|
+
:username => "invoicing", :password => "password"},
|
17
17
|
:mysql => {:adapter => "mysql", :host => "localhost", :database => "invoicing_test",
|
18
|
-
:username => "root", :password => ""}
|
19
|
-
:sqlite3 => {:adapter => "sqlite3", :database => Tempfile.new('invoicing_sqlite').path}
|
18
|
+
:username => "root", :password => ""}
|
20
19
|
}
|
20
|
+
TEST_DB_CONFIG_FILE = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'database.yml'))
|
21
|
+
|
22
|
+
def database_used_for_testing
|
23
|
+
(ENV['DATABASE'] || :mysql).to_sym
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_in_all_databases
|
27
|
+
!!ENV['TEST_ALL_DATABASES']
|
28
|
+
end
|
21
29
|
|
22
30
|
def connect_to_testing_database
|
23
|
-
|
31
|
+
db_config = TEST_DB_CONFIG[database_used_for_testing]
|
32
|
+
db_config_from_file = false
|
33
|
+
|
34
|
+
if File.exists? TEST_DB_CONFIG_FILE
|
35
|
+
yaml = YAML::load File.open(TEST_DB_CONFIG_FILE)
|
36
|
+
if yaml && yaml['test'] && (yaml['test']['adapter'].to_s == database_used_for_testing.to_s)
|
37
|
+
db_config = yaml['test']
|
38
|
+
db_config_from_file = true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts "Connecting to #{database_used_for_testing} with config #{db_config.inspect}" +
|
43
|
+
(db_config_from_file ? " from #{TEST_DB_CONFIG_FILE}" : "")
|
44
|
+
ActiveRecord::Base.establish_connection(db_config)
|
24
45
|
end
|
25
46
|
|
26
47
|
connect_to_testing_database
|
27
48
|
|
49
|
+
require 'setup'
|
50
|
+
|
51
|
+
|
28
52
|
ENV['TZ'] = 'Etc/UTC' # timezone of values in database
|
29
53
|
ActiveRecord::Base.default_timezone = :utc # timezone of created_at and updated_at
|
30
54
|
Time.zone = 'Etc/UTC' # timezone for output (when using Time#in_time_zone)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: invoicing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Kleppmann
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
jT4Qh3sYJbvqWGFAQcuOIf4spvpNiA==
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
|
33
|
-
date: 2009-
|
33
|
+
date: 2009-08-26 00:00:00 +01:00
|
34
34
|
default_executable:
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
@@ -71,7 +71,7 @@ dependencies:
|
|
71
71
|
requirements:
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
74
|
+
version: 2.3.2
|
75
75
|
version:
|
76
76
|
description: This is a framework for generating and displaying invoices (ideal for commercial Rails apps). It allows for flexible business logic; provides tools for tax handling, commission calculation etc. It aims to be both developer-friendly and accountant-friendly. The Ruby Invoicing Framework is based on {ActiveRecord}[http://api.rubyonrails.org/classes/ActiveRecord/Base.html]. Please see {the website}[http://ept.github.com/invoicing/] for an introduction to using Invoicing, and check the {API reference}[http://invoicing.rubyforge.org/doc/] for in-depth details.
|
77
77
|
email:
|
@@ -84,7 +84,6 @@ extra_rdoc_files:
|
|
84
84
|
- History.txt
|
85
85
|
- Manifest.txt
|
86
86
|
- PostInstall.txt
|
87
|
-
- README.rdoc
|
88
87
|
files:
|
89
88
|
- History.txt
|
90
89
|
- LICENSE
|
@@ -149,11 +148,11 @@ files:
|
|
149
148
|
- test/test_helper.rb
|
150
149
|
- test/time_dependent_test.rb
|
151
150
|
has_rdoc: true
|
152
|
-
homepage:
|
151
|
+
homepage:
|
153
152
|
post_install_message: PostInstall.txt
|
154
153
|
rdoc_options:
|
155
154
|
- --main
|
156
|
-
- README.
|
155
|
+
- README.txt
|
157
156
|
require_paths:
|
158
157
|
- lib
|
159
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -174,7 +173,7 @@ rubyforge_project: invoicing
|
|
174
173
|
rubygems_version: 1.3.1
|
175
174
|
signing_key:
|
176
175
|
specification_version: 2
|
177
|
-
summary: This is a framework for generating and displaying invoices (ideal for commercial Rails apps)
|
176
|
+
summary: This is a framework for generating and displaying invoices (ideal for commercial Rails apps). It allows for flexible business logic; provides tools for tax handling, commission calculation etc. It aims to be both developer-friendly and accountant-friendly.
|
178
177
|
test_files:
|
179
178
|
- test/cached_record_test.rb
|
180
179
|
- test/class_info_test.rb
|
metadata.gz.sig
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
�
|
1
|
+
�9V��g贵��QV�
|
2
|
+
Ĺ���!�2ګ��iw���X��"�NBz�#��P��m�r%����iJ��e0wA���|��j���+=X.��v����_��%��bà
|
3
|
+
�MQ�����/����e��ْ�NQ�6[�m��5vc��$0�
|
4
|
+
Te�kX{%v���Җ|��P3��������(��oTYE�dg��و��ќK�7��h-HB� �ZH,ư��c����&Wx����5A���A�t7i}���
|