invoicing 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -0
- data/README.md +57 -0
- data/Rakefile +16 -37
- data/lib/invoicing.rb +20 -10
- data/lib/invoicing/cached_record.rb +9 -6
- data/lib/invoicing/class_info.rb +34 -34
- data/lib/invoicing/connection_adapter_ext.rb +4 -4
- data/lib/invoicing/countries/uk.rb +6 -6
- data/lib/invoicing/currency_value.rb +39 -32
- data/lib/invoicing/find_subclasses.rb +40 -15
- data/lib/invoicing/ledger_item.rb +166 -145
- data/lib/invoicing/ledger_item/pdf_generator.rb +108 -0
- data/lib/invoicing/ledger_item/render_html.rb +76 -73
- data/lib/invoicing/ledger_item/render_ubl.rb +37 -35
- data/lib/invoicing/line_item.rb +43 -38
- data/lib/invoicing/price.rb +1 -1
- data/lib/invoicing/tax_rate.rb +3 -6
- data/lib/invoicing/taxable.rb +37 -32
- data/lib/invoicing/time_dependent.rb +40 -40
- data/lib/invoicing/version.rb +4 -4
- data/lib/rails/generators/invoicing/invoicing_generator.rb +14 -0
- data/lib/rails/generators/invoicing/ledger_item/ledger_item_generator.rb +17 -0
- data/lib/rails/generators/invoicing/ledger_item/templates/migration.rb +25 -0
- data/lib/rails/generators/invoicing/ledger_item/templates/model.rb +5 -0
- data/lib/rails/generators/invoicing/line_item/line_item_generator.rb +17 -0
- data/lib/rails/generators/invoicing/line_item/templates/migration.rb +20 -0
- data/lib/rails/generators/invoicing/line_item/templates/model.rb +5 -0
- data/lib/rails/generators/invoicing/tax_rate/tax_rate_generator.rb +17 -0
- data/lib/rails/generators/invoicing/tax_rate/templates/migration.rb +14 -0
- data/lib/rails/generators/invoicing/tax_rate/templates/model.rb +3 -0
- metadata +110 -153
- data.tar.gz.sig +0 -1
- data/History.txt +0 -31
- data/Manifest.txt +0 -62
- data/PostInstall.txt +0 -10
- data/README.rdoc +0 -58
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/tasks/rcov.rake +0 -4
- data/test/cached_record_test.rb +0 -100
- data/test/class_info_test.rb +0 -253
- data/test/connection_adapter_ext_test.rb +0 -79
- data/test/currency_value_test.rb +0 -209
- data/test/find_subclasses_test.rb +0 -120
- data/test/fixtures/README +0 -7
- data/test/fixtures/cached_record.sql +0 -22
- data/test/fixtures/class_info.sql +0 -28
- data/test/fixtures/currency_value.sql +0 -29
- data/test/fixtures/find_subclasses.sql +0 -43
- data/test/fixtures/ledger_item.sql +0 -39
- data/test/fixtures/line_item.sql +0 -33
- data/test/fixtures/price.sql +0 -4
- data/test/fixtures/tax_rate.sql +0 -4
- data/test/fixtures/taxable.sql +0 -14
- data/test/fixtures/time_dependent.sql +0 -35
- data/test/ledger_item_test.rb +0 -444
- data/test/line_item_test.rb +0 -139
- data/test/models/README +0 -4
- data/test/models/test_subclass_in_another_file.rb +0 -3
- data/test/models/test_subclass_not_in_database.rb +0 -6
- data/test/price_test.rb +0 -9
- data/test/ref-output/creditnote3.html +0 -82
- data/test/ref-output/creditnote3.xml +0 -89
- data/test/ref-output/invoice1.html +0 -93
- data/test/ref-output/invoice1.xml +0 -111
- data/test/ref-output/invoice2.html +0 -86
- data/test/ref-output/invoice2.xml +0 -98
- data/test/ref-output/invoice_null.html +0 -36
- data/test/render_html_test.rb +0 -70
- data/test/render_ubl_test.rb +0 -44
- data/test/setup.rb +0 -37
- data/test/tax_rate_test.rb +0 -9
- data/test/taxable_test.rb +0 -180
- data/test/test_helper.rb +0 -72
- data/test/time_dependent_test.rb +0 -180
- metadata.gz.sig +0 -4
data.tar.gz.sig
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
���G�*���%0<N�t��^��2�$�P����3xő�����0�d�&k�U�t;2����k�ߚp���aP$V#�=@���`�f%m|��MaM,�SQ�g�.$� 8�7Ҥ,<�,��&��Y��u����GM8@���(b�nG�"���RuS��� �]�xK���PU�������.h�t��3��{(���y�~��)�kgI��dz���T#�ر �UC5ےּ0��=�v�hE�G��
|
data/History.txt
DELETED
@@ -1,31 +0,0 @@
|
|
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
|
-
|
11
|
-
== 0.2.0 2009-04-20
|
12
|
-
|
13
|
-
* 4 major enhancements:
|
14
|
-
* New associated gem invoicing_generator for generating an invoicing component in a Rails project
|
15
|
-
(script/generate invoicing_ledger)
|
16
|
-
* Generated controller and views for rendering statements and ledger
|
17
|
-
* Comes with a nice default stylesheet out of the box
|
18
|
-
* More flexible formatting of currency values
|
19
|
-
* 1 bugfix:
|
20
|
-
* Accidental overwriting of total_amount value on payment LedgerItems without LineItems
|
21
|
-
|
22
|
-
== 0.1.0 2009-02-10
|
23
|
-
|
24
|
-
* 2 major enhancements:
|
25
|
-
* Core API is now usable
|
26
|
-
* RCov reports 100% test coverage
|
27
|
-
|
28
|
-
== 0.0.1 2009-01-05
|
29
|
-
|
30
|
-
* 1 major enhancement:
|
31
|
-
* Initial public release
|
data/Manifest.txt
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
History.txt
|
2
|
-
LICENSE
|
3
|
-
Manifest.txt
|
4
|
-
PostInstall.txt
|
5
|
-
README.rdoc
|
6
|
-
Rakefile
|
7
|
-
lib/invoicing.rb
|
8
|
-
lib/invoicing/cached_record.rb
|
9
|
-
lib/invoicing/class_info.rb
|
10
|
-
lib/invoicing/connection_adapter_ext.rb
|
11
|
-
lib/invoicing/countries/uk.rb
|
12
|
-
lib/invoicing/currency_value.rb
|
13
|
-
lib/invoicing/find_subclasses.rb
|
14
|
-
lib/invoicing/ledger_item.rb
|
15
|
-
lib/invoicing/ledger_item/render_html.rb
|
16
|
-
lib/invoicing/ledger_item/render_ubl.rb
|
17
|
-
lib/invoicing/line_item.rb
|
18
|
-
lib/invoicing/price.rb
|
19
|
-
lib/invoicing/tax_rate.rb
|
20
|
-
lib/invoicing/taxable.rb
|
21
|
-
lib/invoicing/time_dependent.rb
|
22
|
-
lib/invoicing/version.rb
|
23
|
-
script/console
|
24
|
-
script/destroy
|
25
|
-
script/generate
|
26
|
-
tasks/rcov.rake
|
27
|
-
test/cached_record_test.rb
|
28
|
-
test/class_info_test.rb
|
29
|
-
test/connection_adapter_ext_test.rb
|
30
|
-
test/currency_value_test.rb
|
31
|
-
test/find_subclasses_test.rb
|
32
|
-
test/fixtures/README
|
33
|
-
test/fixtures/cached_record.sql
|
34
|
-
test/fixtures/class_info.sql
|
35
|
-
test/fixtures/currency_value.sql
|
36
|
-
test/fixtures/find_subclasses.sql
|
37
|
-
test/fixtures/ledger_item.sql
|
38
|
-
test/fixtures/line_item.sql
|
39
|
-
test/fixtures/price.sql
|
40
|
-
test/fixtures/tax_rate.sql
|
41
|
-
test/fixtures/taxable.sql
|
42
|
-
test/fixtures/time_dependent.sql
|
43
|
-
test/ledger_item_test.rb
|
44
|
-
test/line_item_test.rb
|
45
|
-
test/models/README
|
46
|
-
test/models/test_subclass_in_another_file.rb
|
47
|
-
test/models/test_subclass_not_in_database.rb
|
48
|
-
test/price_test.rb
|
49
|
-
test/ref-output/creditnote3.html
|
50
|
-
test/ref-output/creditnote3.xml
|
51
|
-
test/ref-output/invoice1.html
|
52
|
-
test/ref-output/invoice1.xml
|
53
|
-
test/ref-output/invoice2.html
|
54
|
-
test/ref-output/invoice2.xml
|
55
|
-
test/ref-output/invoice_null.html
|
56
|
-
test/render_html_test.rb
|
57
|
-
test/render_ubl_test.rb
|
58
|
-
test/setup.rb
|
59
|
-
test/tax_rate_test.rb
|
60
|
-
test/taxable_test.rb
|
61
|
-
test/test_helper.rb
|
62
|
-
test/time_dependent_test.rb
|
data/PostInstall.txt
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
|
2
|
-
Thanks for trying the Ruby Invoicing Gem. Hope you find it useful.
|
3
|
-
Do please blog and tweet about it (tag your posts with #invgem).
|
4
|
-
|
5
|
-
Now please go to the root of your Rails project and type:
|
6
|
-
script/generate invoicing_ledger billing --currency=GBP
|
7
|
-
(replace GBP with your currency if you do not use Pounds Sterling).
|
8
|
-
For more information please go to http://ept.github.com/invoicing/
|
9
|
-
|
10
|
-
|
data/README.rdoc
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
= Ruby Invoicing Framework
|
2
|
-
|
3
|
-
* {Ruby Invoicing Framework website}[http://ept.github.com/invoicing/]
|
4
|
-
* {API Reference Docs}[http://invoicing.rubyforge.org/doc/]
|
5
|
-
* {Browse the code on GitHub}[http://github.com/ept/invoicing/]
|
6
|
-
* {RubyForge project}[http://rubyforge.org/projects/invoicing/]
|
7
|
-
* Email: Martin Kleppmann <ept@rubyforge.org>
|
8
|
-
|
9
|
-
== DESCRIPTION
|
10
|
-
|
11
|
-
This is a framework for generating and displaying invoices (ideal for
|
12
|
-
commercial Rails apps). It allows for flexible business logic; provides tools
|
13
|
-
for tax handling, commission calculation etc. It aims to be both
|
14
|
-
developer-friendly and accountant-friendly.
|
15
|
-
|
16
|
-
The Ruby Invoicing Framework is based on
|
17
|
-
{ActiveRecord}[http://api.rubyonrails.org/classes/ActiveRecord/Base.html].
|
18
|
-
|
19
|
-
Please see {the website}[http://ept.github.com/invoicing/] for an introduction
|
20
|
-
to using Invoicing, and check the
|
21
|
-
{API reference}[http://invoicing.rubyforge.org/doc/] for in-depth details.
|
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
|
-
|
26
|
-
== FEATURES
|
27
|
-
|
28
|
-
* TODO
|
29
|
-
|
30
|
-
== REQUIREMENTS
|
31
|
-
|
32
|
-
* ActiveRecord >= 2.1
|
33
|
-
* Only MySQL and PostgreSQL databases are currently supported
|
34
|
-
|
35
|
-
== INSTALL
|
36
|
-
|
37
|
-
sudo gem install invoicing
|
38
|
-
|
39
|
-
== STATUS
|
40
|
-
|
41
|
-
So far, the Ruby Invoicing Framework has been tested with ActiveRecord 2.2.2,
|
42
|
-
MySQL 5.0.67 and PostgreSQL 8.3.5. We will be testing it across a wider
|
43
|
-
variety of versions soon.
|
44
|
-
|
45
|
-
== CREDITS
|
46
|
-
|
47
|
-
The Ruby invoicing framework originated as part of the website
|
48
|
-
{Bid for Wine}[http://www.bidforwine.co.uk], developed by Patrick Dietrich,
|
49
|
-
Conrad Irwin, Michael Arnold and Martin Kleppmann for Ept Computing Ltd.
|
50
|
-
It was extracted from the Bid for Wine codebase and substantially extended
|
51
|
-
by Martin Kleppmann.
|
52
|
-
|
53
|
-
== LICENSE
|
54
|
-
|
55
|
-
Copyright (c) 2009 Martin Kleppmann, Ept Computing Limited.
|
56
|
-
|
57
|
-
This gem is made publicly available under the terms of the MIT license.
|
58
|
-
See LICENSE and/or COPYING for details.
|
data/script/console
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# File: script/console
|
3
|
-
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
-
|
5
|
-
libs = " -r irb/completion"
|
6
|
-
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
-
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
-
libs << " -r #{File.dirname(__FILE__) + '/../lib/invoicing.rb'}"
|
9
|
-
puts "Loading invoicing gem"
|
10
|
-
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'rubigen'
|
6
|
-
rescue LoadError
|
7
|
-
require 'rubygems'
|
8
|
-
require 'rubigen'
|
9
|
-
end
|
10
|
-
require 'rubigen/scripts/destroy'
|
11
|
-
|
12
|
-
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
-
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
-
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'rubigen'
|
6
|
-
rescue LoadError
|
7
|
-
require 'rubygems'
|
8
|
-
require 'rubigen'
|
9
|
-
end
|
10
|
-
require 'rubigen/scripts/generate'
|
11
|
-
|
12
|
-
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
-
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
-
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/tasks/rcov.rake
DELETED
data/test/cached_record_test.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'test_helper.rb')
|
2
|
-
|
3
|
-
class CachedRecordTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class CachedRecord < ActiveRecord::Base
|
6
|
-
set_primary_key 'id2'
|
7
|
-
acts_as_cached_record :id => 'id2'
|
8
|
-
has_many :referrers, :class_name => 'RefersToCachedRecord', :foreign_key => 'cached_record_id'
|
9
|
-
end
|
10
|
-
|
11
|
-
class RefersToCachedRecord < ActiveRecord::Base
|
12
|
-
belongs_to :cached_record
|
13
|
-
end
|
14
|
-
|
15
|
-
class CachedRecordMockDatabase < ActiveRecord::Base
|
16
|
-
set_table_name 'cached_records'
|
17
|
-
set_primary_key 'id2'
|
18
|
-
acts_as_cached_record :id => 'id2'
|
19
|
-
|
20
|
-
def self.connection
|
21
|
-
@connection_mock ||= FlexMock.new('connection')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
def test_find_with_valid_id_should_return_record
|
27
|
-
record = CachedRecord.find(1)
|
28
|
-
assert_not_nil record
|
29
|
-
assert record.kind_of?(CachedRecord)
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_find_with_invalid_id_should_raise_exception
|
33
|
-
assert_raise ActiveRecord::RecordNotFound do
|
34
|
-
CachedRecord.find(99)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_find_with_valid_id_should_not_access_database
|
39
|
-
CachedRecordMockDatabase.connection.should_receive(:select).and_throw('should not access database')
|
40
|
-
assert_not_nil CachedRecordMockDatabase.find(1)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_find_with_invalid_id_should_not_access_database
|
44
|
-
CachedRecordMockDatabase.connection.should_receive(:select).and_throw('should not access database')
|
45
|
-
assert_raise ActiveRecord::RecordNotFound do
|
46
|
-
CachedRecordMockDatabase.find(99)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_find_with_conditions_should_still_work
|
51
|
-
assert_equal CachedRecord.find_by_value('Two'), CachedRecord.find(2)
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_find_with_conditions_should_not_use_the_cache
|
55
|
-
assert !CachedRecord.find_by_value('Two').equal?(CachedRecord.find(2))
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_find_without_ids_should_raise_exception
|
59
|
-
assert_raise ActiveRecord::RecordNotFound do
|
60
|
-
CachedRecord.find
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_find_with_empty_list_of_ids_should_raise_exception
|
65
|
-
assert_raise ActiveRecord::RecordNotFound do
|
66
|
-
CachedRecord.find(:conditions => {:id => []})
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_find_with_list_of_ids_should_return_list_of_objects
|
71
|
-
expected = CachedRecord.cached_record_list.sort{|r1, r2| r1.id - r2.id}
|
72
|
-
assert_equal expected, CachedRecord.find([1,2])
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_cached_record_associations_should_still_work
|
76
|
-
assert_equal 2, CachedRecord.find(1).referrers.length
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_foreign_key_to_cached_record_should_use_cache
|
80
|
-
assert RefersToCachedRecord.find(1).cached_record.equal?(CachedRecord.find(1))
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_cached_record_list_should_return_all_objects
|
84
|
-
assert_equal 2, CachedRecord.cached_record_list.length
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_cached_record_list_should_not_access_database
|
88
|
-
CachedRecordMockDatabase.connection.should_receive(:select).and_throw('should not access database')
|
89
|
-
assert_not_nil CachedRecordMockDatabase.cached_record_list
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_reload_cache_should_do_what_it_says_on_the_tin
|
93
|
-
CachedRecord.connection.execute "insert into cached_records (id2, value) values(3, 'Three')"
|
94
|
-
CachedRecord.reload_cache
|
95
|
-
record = CachedRecord.find(3)
|
96
|
-
assert_not_nil record
|
97
|
-
assert record.kind_of?(CachedRecord)
|
98
|
-
assert_equal 3, CachedRecord.cached_record_list.length
|
99
|
-
end
|
100
|
-
end
|
data/test/class_info_test.rb
DELETED
@@ -1,253 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'test_helper.rb')
|
2
|
-
|
3
|
-
# Mini implementation of the ClassInfo pattern, at which we can fire our tests
|
4
|
-
|
5
|
-
module MyNamespace
|
6
|
-
module ClassInfoTestModule
|
7
|
-
module ActMethods
|
8
|
-
def acts_as_class_info_test(*args)
|
9
|
-
Invoicing::ClassInfo.acts_as(MyNamespace::ClassInfoTestModule, self, args)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def get_class_info
|
14
|
-
class_info_test_module_class_info
|
15
|
-
end
|
16
|
-
|
17
|
-
def my_instance_method
|
18
|
-
class_info_test_module_class_info.the_answer / value
|
19
|
-
end
|
20
|
-
|
21
|
-
def my_other_instance_method
|
22
|
-
class_info_test_module_class_info.not_the_answer / value
|
23
|
-
end
|
24
|
-
|
25
|
-
module ClassMethods
|
26
|
-
def my_class_method(number)
|
27
|
-
class_info_test_module_class_info.the_answer / number
|
28
|
-
end
|
29
|
-
|
30
|
-
def my_other_class_method(number)
|
31
|
-
class_info_test_module_class_info.not_the_answer / number
|
32
|
-
end
|
33
|
-
|
34
|
-
def get_class_info
|
35
|
-
class_info_test_module_class_info
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class ClassInfo < Invoicing::ClassInfo::Base
|
40
|
-
def foo
|
41
|
-
'foo'
|
42
|
-
end
|
43
|
-
|
44
|
-
def the_answer
|
45
|
-
all_args.first
|
46
|
-
end
|
47
|
-
|
48
|
-
def not_the_answer
|
49
|
-
all_args.last
|
50
|
-
end
|
51
|
-
|
52
|
-
def option_defaults
|
53
|
-
{:option1 => :baa, :option2 => :blah}
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
module ClassInfoTest2
|
60
|
-
module ActMethods
|
61
|
-
def acts_as_class_info_test2(*args)
|
62
|
-
Invoicing::ClassInfo.acts_as(MyNamespace::ClassInfoTest2, self, args)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
module ClassMethods
|
67
|
-
def test2_class_info
|
68
|
-
class_info_test2_class_info
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
class ClassInfo < Invoicing::ClassInfo::Base
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
ActiveRecord::Base.send(:extend, MyNamespace::ClassInfoTestModule::ActMethods)
|
78
|
-
ActiveRecord::Base.send(:extend, MyNamespace::ClassInfoTest2::ActMethods)
|
79
|
-
|
80
|
-
|
81
|
-
# Model objects which use the acts_as feature defined above
|
82
|
-
|
83
|
-
class ClassInfoTestRecord < ActiveRecord::Base
|
84
|
-
acts_as_class_info_test 42, :option1 => :moo
|
85
|
-
acts_as_class_info_test 84, 42, 168, :option3 => :asdf
|
86
|
-
|
87
|
-
def self.class_foo
|
88
|
-
class_info_test_module_class_info.foo
|
89
|
-
end
|
90
|
-
|
91
|
-
def instance_foo
|
92
|
-
class_info_test_module_class_info.foo
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class ClassInfoTestSubclass < ClassInfoTestRecord
|
97
|
-
acts_as_class_info_test 336, :option1 => :quack, :option4 => :fdsa
|
98
|
-
end
|
99
|
-
|
100
|
-
class ClassInfoTestSubclass2 < ClassInfoTestRecord
|
101
|
-
acts_as_class_info_test2 :option1 => :badger
|
102
|
-
end
|
103
|
-
|
104
|
-
class ClassInfoTestSubSubclass < ClassInfoTestSubclass2
|
105
|
-
acts_as_class_info_test 112, :option3 => 1234
|
106
|
-
end
|
107
|
-
|
108
|
-
class ClassInfoTestEmptySubclass < ClassInfoTestRecord
|
109
|
-
end
|
110
|
-
|
111
|
-
class ClassInfoTest2Record < ActiveRecord::Base
|
112
|
-
acts_as_class_info_test2 :option1 => :okapi, :option3 => :kangaroo
|
113
|
-
|
114
|
-
def option1; 'this is option1'; end
|
115
|
-
def option2; 'this is option2'; end
|
116
|
-
def kangaroo; 'bounce'; end
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
#######################################################################################
|
121
|
-
|
122
|
-
class ClassInfoTest < Test::Unit::TestCase
|
123
|
-
|
124
|
-
def test_call_into_class_info_via_class
|
125
|
-
assert_equal 'foo', ClassInfoTestRecord.class_foo
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_call_into_class_info_via_instance
|
129
|
-
assert_equal 'foo', ClassInfoTestRecord.new.instance_foo
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_mixin_superclass_instance_methods
|
133
|
-
assert_equal 21, ClassInfoTestRecord.find(1).my_instance_method
|
134
|
-
assert_equal 84, ClassInfoTestRecord.find(1).my_other_instance_method
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_mixin_superclass_class_methods
|
138
|
-
assert_equal 14, ClassInfoTestRecord.my_class_method(3)
|
139
|
-
assert_equal 28, ClassInfoTestRecord.my_other_class_method(6)
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_mixin_subclass_instance_methods
|
143
|
-
assert_equal 14, ClassInfoTestRecord.find(2).my_instance_method
|
144
|
-
assert_equal 112, ClassInfoTestRecord.find(2).my_other_instance_method
|
145
|
-
end
|
146
|
-
|
147
|
-
def test_mixin_subclass_class_methods
|
148
|
-
assert_equal 14, ClassInfoTestSubclass.my_class_method(3)
|
149
|
-
assert_equal 56, ClassInfoTestSubclass.my_other_class_method(6)
|
150
|
-
end
|
151
|
-
|
152
|
-
def test_all_args_in_superclass
|
153
|
-
assert_equal [42, 84, 168], ClassInfoTestRecord.get_class_info.all_args
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_all_args_in_subclass
|
157
|
-
assert_equal [42, 84, 168, 336], ClassInfoTestSubclass.get_class_info.all_args
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_all_args_in_sub_subclass
|
161
|
-
assert_equal [42, 84, 168, 112], ClassInfoTestSubSubclass.get_class_info.all_args
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_current_args_in_superclass
|
165
|
-
assert_equal [84, 42, 168], ClassInfoTestRecord.get_class_info.current_args
|
166
|
-
end
|
167
|
-
|
168
|
-
def test_current_args_in_subclass
|
169
|
-
assert_equal [336], ClassInfoTestSubclass.get_class_info.current_args
|
170
|
-
end
|
171
|
-
|
172
|
-
def test_current_args_in_sub_subclass
|
173
|
-
assert_equal [112], ClassInfoTestSubSubclass.get_class_info.current_args
|
174
|
-
end
|
175
|
-
|
176
|
-
def test_new_args_in_superclass
|
177
|
-
assert_equal [84, 168], ClassInfoTestRecord.get_class_info.new_args
|
178
|
-
end
|
179
|
-
|
180
|
-
def test_new_args_in_subclass
|
181
|
-
assert_equal [336], ClassInfoTestSubclass.get_class_info.new_args
|
182
|
-
end
|
183
|
-
|
184
|
-
def test_new_args_in_sub_subclass
|
185
|
-
assert_equal [112], ClassInfoTestSubSubclass.get_class_info.new_args
|
186
|
-
end
|
187
|
-
|
188
|
-
def test_all_options_in_superclass
|
189
|
-
assert_equal :moo, ClassInfoTestRecord.get_class_info.all_options[:option1]
|
190
|
-
assert_equal :blah, ClassInfoTestRecord.get_class_info.all_options[:option2]
|
191
|
-
assert_equal :asdf, ClassInfoTestRecord.get_class_info.all_options[:option3]
|
192
|
-
assert_nil ClassInfoTestRecord.get_class_info.all_options[:option4]
|
193
|
-
end
|
194
|
-
|
195
|
-
def test_all_options_in_subclass
|
196
|
-
assert_equal :quack, ClassInfoTestSubclass.get_class_info.all_options[:option1]
|
197
|
-
assert_equal :blah, ClassInfoTestSubclass.get_class_info.all_options[:option2]
|
198
|
-
assert_equal :asdf, ClassInfoTestSubclass.get_class_info.all_options[:option3]
|
199
|
-
assert_equal :fdsa, ClassInfoTestSubclass.get_class_info.all_options[:option4]
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_all_options_in_sub_subclass
|
203
|
-
assert_equal :moo, ClassInfoTestSubSubclass.get_class_info.all_options[:option1]
|
204
|
-
assert_equal :blah, ClassInfoTestSubSubclass.get_class_info.all_options[:option2]
|
205
|
-
assert_equal 1234, ClassInfoTestSubSubclass.get_class_info.all_options[:option3]
|
206
|
-
assert_nil ClassInfoTestSubSubclass.get_class_info.all_options[:option4]
|
207
|
-
end
|
208
|
-
|
209
|
-
def test_current_options_in_superclass
|
210
|
-
assert_equal({:option3 => :asdf}, ClassInfoTestRecord.get_class_info.current_options)
|
211
|
-
end
|
212
|
-
|
213
|
-
def test_current_options_in_subclass
|
214
|
-
assert_equal({:option1 => :quack, :option4 => :fdsa}, ClassInfoTestSubclass.get_class_info.current_options)
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_two_features_in_the_same_model
|
218
|
-
assert_equal({:option1 => :badger}, ClassInfoTestSubclass2.test2_class_info.all_options)
|
219
|
-
assert_equal({:option1 => :badger}, ClassInfoTestSubSubclass.test2_class_info.all_options)
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_the_same_feature_in_two_models
|
223
|
-
assert_equal({:option1 => :okapi, :option3 => :kangaroo}, ClassInfoTest2Record.test2_class_info.all_options)
|
224
|
-
end
|
225
|
-
|
226
|
-
def test_method_renamed
|
227
|
-
assert_equal 'kangaroo', ClassInfoTest2Record.test2_class_info.method(:option3)
|
228
|
-
assert_equal 'bounce', ClassInfoTest2Record.test2_class_info.get(ClassInfoTest2Record.find(1), :option3)
|
229
|
-
end
|
230
|
-
|
231
|
-
def test_database_column_renamed
|
232
|
-
assert_equal 'okapi', ClassInfoTest2Record.test2_class_info.method(:option1)
|
233
|
-
assert_equal 'OKAPI!', ClassInfoTest2Record.test2_class_info.get(ClassInfoTest2Record.find(1), :option1)
|
234
|
-
end
|
235
|
-
|
236
|
-
def test_method_not_renamed
|
237
|
-
assert_equal 'option2', ClassInfoTest2Record.test2_class_info.method(:option2)
|
238
|
-
assert_equal 'this is option2', ClassInfoTest2Record.test2_class_info.get(ClassInfoTest2Record.find(1), :option2)
|
239
|
-
end
|
240
|
-
|
241
|
-
def test_method_on_nil_object
|
242
|
-
assert_nil ClassInfoTest2Record.test2_class_info.get(nil, :option2)
|
243
|
-
end
|
244
|
-
|
245
|
-
def test_method_not_found_via_class_info
|
246
|
-
assert_nil ClassInfoTest2Record.test2_class_info.get(ClassInfoTest2Record.find(1), :this_method_does_not_exist)
|
247
|
-
end
|
248
|
-
|
249
|
-
def test_inherited_to_empty_subclass
|
250
|
-
assert_not_nil ClassInfoTestEmptySubclass.new.get_class_info
|
251
|
-
assert_equal ClassInfoTestEmptySubclass.new.get_class_info, ClassInfoTestRecord.new.get_class_info
|
252
|
-
end
|
253
|
-
end
|