freeagent 0.1.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 (47) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +1 -0
  3. data/CHANGELOG.rdoc +6 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +50 -0
  6. data/LICENSE +22 -0
  7. data/README.rdoc +27 -0
  8. data/Rakefile +28 -0
  9. data/freeagent.gemspec +27 -0
  10. data/lib/free_agent.rb +64 -0
  11. data/lib/free_agent/attachment.rb +21 -0
  12. data/lib/free_agent/bank_account.rb +7 -0
  13. data/lib/free_agent/base.rb +6 -0
  14. data/lib/free_agent/bill.rb +15 -0
  15. data/lib/free_agent/contact.rb +7 -0
  16. data/lib/free_agent/invoice.rb +7 -0
  17. data/lib/free_agent/invoice_item.rb +10 -0
  18. data/lib/free_agent/project.rb +7 -0
  19. data/lib/free_agent/version.rb +16 -0
  20. data/lib/freeagent.rb +1 -0
  21. data/spec/fixtures/attachments/all.xml +23 -0
  22. data/spec/fixtures/attachments/single.xml +11 -0
  23. data/spec/fixtures/bank_accounts/all.xml +35 -0
  24. data/spec/fixtures/bank_accounts/single.xml +15 -0
  25. data/spec/fixtures/bills/all.xml +37 -0
  26. data/spec/fixtures/bills/single.xml +18 -0
  27. data/spec/fixtures/contacts/all.xml +47 -0
  28. data/spec/fixtures/contacts/single.xml +23 -0
  29. data/spec/fixtures/invoice_items/all.xml +15 -0
  30. data/spec/fixtures/invoice_items/single.xml +13 -0
  31. data/spec/fixtures/invoices/all.xml +75 -0
  32. data/spec/fixtures/invoices/single.xml +37 -0
  33. data/spec/fixtures/projects/all.xml +25 -0
  34. data/spec/fixtures/projects/single.xml +23 -0
  35. data/spec/spec_helper.rb +33 -0
  36. data/spec/support/helper.rb +18 -0
  37. data/spec/support/mimic.rb +47 -0
  38. data/spec/unit/attachment_spec.rb +56 -0
  39. data/spec/unit/bank_account_spec.rb +56 -0
  40. data/spec/unit/base_spec.rb +9 -0
  41. data/spec/unit/bill_spec.rb +66 -0
  42. data/spec/unit/contact_spec.rb +56 -0
  43. data/spec/unit/freeagent_spec.rb +54 -0
  44. data/spec/unit/invoice_item_spec.rb +77 -0
  45. data/spec/unit/invoice_spec.rb +56 -0
  46. data/spec/unit/project_spec.rb +56 -0
  47. metadata +169 -0
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bank-account>
3
+ <id type="integer">85327</id>
4
+ <type>StandardBankAccount</type>
5
+ <name>Business Checking Account</name>
6
+ <account-number>00000000</account-number>
7
+ <sort-code>00000000</sort-code>
8
+ <secondary-sort-code></secondary-sort-code>
9
+ <iban></iban>
10
+ <bic></bic>
11
+ <current-balance type="decimal">5571.18</current-balance>
12
+ <current-balance-date type="datetime">2011-04-04</current-balance-date>
13
+ <opening-balance type="decimal">4733.42</opening-balance>
14
+ <is-personal>false</is-personal>
15
+ </bank-account>
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bills type="array">
3
+ <bill>
4
+ <id type="integer">157528</id>
5
+ <contact-id type="integer">436186</contact-id>
6
+ <reference>USD122</reference>
7
+ <dated-on type="datetime">2011-04-01T00:00:00+00:00</dated-on>
8
+ <due-date type="datetime">2011-04-30T00:00:00+00:00</due-date>
9
+ <bill-type>Accountancy Fees</bill-type>
10
+ <comments>To be paid ASAP.</comments>
11
+ <depreciation-schedule>3 Years</depreciation-schedule>
12
+ <total-value type="decimal">140.0</total-value>
13
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
14
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
15
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
16
+ <manual-sales-tax-amount type="decimal">0.0</manual-sales-tax-amount>
17
+ <recurring></recurring>
18
+ <status>Open</status>
19
+ </bill>
20
+ <bill>
21
+ <id type="integer">157514</id>
22
+ <contact-id type="integer">436186</contact-id>
23
+ <reference>USD100</reference>
24
+ <dated-on type="datetime">2011-01-04T00:00:00+00:00</dated-on>
25
+ <due-date type="datetime">2011-01-31T00:00:00+00:00</due-date>
26
+ <bill-type>Accountancy Fees</bill-type>
27
+ <comments></comments>
28
+ <depreciation-schedule>3 Years</depreciation-schedule>
29
+ <total-value type="decimal">5000.0</total-value>
30
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
31
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
32
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
33
+ <manual-sales-tax-amount type="decimal">0.0</manual-sales-tax-amount>
34
+ <recurring></recurring>
35
+ <status>Paid</status>
36
+ </bill>
37
+ </bills>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bill>
3
+ <id type="integer">157514</id>
4
+ <contact-id type="integer">436186</contact-id>
5
+ <reference>USD100</reference>
6
+ <dated-on type="datetime">2011-01-04T00:00:00+00:00</dated-on>
7
+ <due-date type="datetime">2011-01-31T00:00:00+00:00</due-date>
8
+ <bill-type>Accountancy Fees</bill-type>
9
+ <comments></comments>
10
+ <depreciation-schedule>3 Years</depreciation-schedule>
11
+ <total-value type="decimal">5000.0</total-value>
12
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
13
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
14
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
15
+ <manual-sales-tax-amount type="decimal">0.0</manual-sales-tax-amount>
16
+ <recurring></recurring>
17
+ <status>Paid</status>
18
+ </bill>
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <contacts type="array">
3
+ <contact>
4
+ <id type="integer">433858</id>
5
+ <organisation-name></organisation-name>
6
+ <first-name>John</first-name>
7
+ <last-name>Doe</last-name>
8
+ <email>john@example.com</email>
9
+ <billing-email></billing-email>
10
+ <phone-number></phone-number>
11
+ <address1></address1>
12
+ <town></town>
13
+ <region></region>
14
+ <postcode></postcode>
15
+ <address2></address2>
16
+ <address3></address3>
17
+ <contact-name-on-invoices type="boolean">true</contact-name-on-invoices>
18
+ <country>Italy</country>
19
+ <sales-tax-registration-number></sales-tax-registration-number>
20
+ <locale>en</locale>
21
+ <mobile></mobile>
22
+ <account-balance>0.0</account-balance>
23
+ <uses-contact-invoice-sequence type="boolean">false</uses-contact-invoice-sequence>
24
+ </contact>
25
+ <contact>
26
+ <id type="integer">436186</id>
27
+ <organisation-name>Wonderland</organisation-name>
28
+ <first-name>Alice</first-name>
29
+ <last-name></last-name>
30
+ <email></email>
31
+ <billing-email></billing-email>
32
+ <phone-number></phone-number>
33
+ <address1></address1>
34
+ <town></town>
35
+ <region></region>
36
+ <postcode></postcode>
37
+ <address2></address2>
38
+ <address3></address3>
39
+ <contact-name-on-invoices type="boolean">true</contact-name-on-invoices>
40
+ <country>Italy</country>
41
+ <sales-tax-registration-number></sales-tax-registration-number>
42
+ <locale>en</locale>
43
+ <mobile></mobile>
44
+ <account-balance>0.0</account-balance>
45
+ <uses-contact-invoice-sequence type="boolean">false</uses-contact-invoice-sequence>
46
+ </contact>
47
+ </contacts>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <contact>
3
+ <id type="integer">436186</id>
4
+ <organisation-name>Wonderland</organisation-name>
5
+ <first-name>Alice</first-name>
6
+ <last-name></last-name>
7
+ <email></email>
8
+ <billing-email></billing-email>
9
+ <phone-number></phone-number>
10
+ <address1></address1>
11
+ <town></town>
12
+ <region></region>
13
+ <postcode></postcode>
14
+ <address2></address2>
15
+ <address3></address3>
16
+ <contact-name-on-invoices type="boolean">true</contact-name-on-invoices>
17
+ <country>Italy</country>
18
+ <sales-tax-registration-number></sales-tax-registration-number>
19
+ <locale>en</locale>
20
+ <mobile></mobile>
21
+ <account-balance>0.0</account-balance>
22
+ <uses-contact-invoice-sequence type="boolean">false</uses-contact-invoice-sequence>
23
+ </contact>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoice-items type="array">
3
+ <invoice-item>
4
+ <id type="integer">3257802</id>
5
+ <description>Domains April.</description>
6
+ <project-id type="integer" nil="true"></project-id>
7
+ <invoice-id type="integer">2593747</invoice-id>
8
+ <item-type>-no unit-</item-type>
9
+ <price type="decimal">0.4</price>
10
+ <quantity type="decimal">40.0</quantity>
11
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
12
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
13
+ <nominal-code>001</nominal-code>
14
+ </invoice-item>
15
+ </invoice-items>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoice-item>
3
+ <id type="integer">3257802</id>
4
+ <description>Domains April.</description>
5
+ <project-id type="integer" nil="true"></project-id>
6
+ <invoice-id type="integer">2593747</invoice-id>
7
+ <item-type>-no unit-</item-type>
8
+ <price type="decimal">0.4</price>
9
+ <quantity type="decimal">40.0</quantity>
10
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
11
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
12
+ <nominal-code>001</nominal-code>
13
+ </invoice-item>
@@ -0,0 +1,75 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoices type="array">
3
+ <invoice>
4
+ <id type="integer">2593747</id>
5
+ <company-id type="integer">46313</company-id>
6
+ <project-id type="integer"></project-id>
7
+ <contact-id type="integer">433858</contact-id>
8
+ <dated-on type="datetime">2011-04-09T00:00:00Z</dated-on>
9
+ <due-on type="datetime">2011-04-09T00:00:00Z</due-on>
10
+ <reference>001</reference>
11
+ <currency>EUR</currency>
12
+ <exchange-rate>1.0</exchange-rate>
13
+ <net-value type="decimal">16.0</net-value>
14
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
15
+ <second-sales-tax-value type="decimal">0.0</second-sales-tax-value>
16
+ <status>Paid</status>
17
+ <comments></comments>
18
+ <discount-percent type="decimal"></discount-percent>
19
+ <po-reference></po-reference>
20
+ <omit-header type="boolean">false</omit-header>
21
+ <payment-terms-in-days type="integer">0</payment-terms-in-days>
22
+ <written-off-date type="datetime"></written-off-date>
23
+ <ec-status></ec-status>
24
+ <invoice-items type="array">
25
+ <invoice-item>
26
+ <id type="integer">3257802</id>
27
+ <description>Monthly fee.</description>
28
+ <project-id type="integer" nil="true"></project-id>
29
+ <invoice-id type="integer">2593747</invoice-id>
30
+ <item-type>-no unit-</item-type>
31
+ <price type="decimal">0.4</price>
32
+ <quantity type="decimal">40.0</quantity>
33
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
34
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
35
+ <nominal-code>001</nominal-code>
36
+ </invoice-item>
37
+ </invoice-items>
38
+ </invoice>
39
+ <invoice>
40
+ <id type="integer">2593795</id>
41
+ <company-id type="integer">46313</company-id>
42
+ <project-id type="integer"></project-id>
43
+ <contact-id type="integer">433858</contact-id>
44
+ <dated-on type="datetime">2011-04-09T00:00:00Z</dated-on>
45
+ <due-on type="datetime">2011-04-09T00:00:00Z</due-on>
46
+ <reference>003</reference>
47
+ <currency>USD</currency>
48
+ <exchange-rate>0.69044088</exchange-rate>
49
+ <net-value type="decimal">0.4</net-value>
50
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
51
+ <second-sales-tax-value type="decimal">0.0</second-sales-tax-value>
52
+ <status>Draft</status>
53
+ <comments></comments>
54
+ <discount-percent type="decimal"></discount-percent>
55
+ <po-reference></po-reference>
56
+ <omit-header type="boolean">false</omit-header>
57
+ <payment-terms-in-days type="integer">0</payment-terms-in-days>
58
+ <written-off-date type="datetime"></written-off-date>
59
+ <ec-status></ec-status>
60
+ <invoice-items type="array">
61
+ <invoice-item>
62
+ <id type="integer">3257875</id>
63
+ <description>Monthly fee.</description>
64
+ <project-id type="integer" nil="true"></project-id>
65
+ <invoice-id type="integer">2593795</invoice-id>
66
+ <item-type>-no unit-</item-type>
67
+ <price type="decimal">0.4</price>
68
+ <quantity type="decimal">1.0</quantity>
69
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
70
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
71
+ <nominal-code>001</nominal-code>
72
+ </invoice-item>
73
+ </invoice-items>
74
+ </invoice>
75
+ </invoices>
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoice>
3
+ <id type="integer">2593747</id>
4
+ <company-id type="integer">46313</company-id>
5
+ <project-id type="integer"></project-id>
6
+ <contact-id type="integer">433858</contact-id>
7
+ <dated-on type="datetime">2011-04-09T00:00:00Z</dated-on>
8
+ <due-on type="datetime">2011-04-09T00:00:00Z</due-on>
9
+ <reference>001</reference>
10
+ <currency>EUR</currency>
11
+ <exchange-rate>1.0</exchange-rate>
12
+ <net-value type="decimal">16.0</net-value>
13
+ <sales-tax-value type="decimal">0.0</sales-tax-value>
14
+ <second-sales-tax-value type="decimal">0.0</second-sales-tax-value>
15
+ <status>Paid</status>
16
+ <comments></comments>
17
+ <discount-percent type="decimal"></discount-percent>
18
+ <po-reference></po-reference>
19
+ <omit-header type="boolean">false</omit-header>
20
+ <payment-terms-in-days type="integer">0</payment-terms-in-days>
21
+ <written-off-date type="datetime"></written-off-date>
22
+ <ec-status></ec-status>
23
+ <invoice-items type="array">
24
+ <invoice-item>
25
+ <id type="integer">3257802</id>
26
+ <description>Monthly fee.</description>
27
+ <project-id type="integer" nil="true"></project-id>
28
+ <invoice-id type="integer">2593747</invoice-id>
29
+ <item-type>-no unit-</item-type>
30
+ <price type="decimal">0.4</price>
31
+ <quantity type="decimal">40.0</quantity>
32
+ <sales-tax-rate type="decimal">0.0</sales-tax-rate>
33
+ <second-sales-tax-rate type="decimal">0.0</second-sales-tax-rate>
34
+ <nominal-code>001</nominal-code>
35
+ </invoice-item>
36
+ </invoice-items>
37
+ </invoice>
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projects type="array">
3
+ <project>
4
+ <id type="integer">116526</id>
5
+ <contact-id type="integer">436186</contact-id>
6
+ <name>Website</name>
7
+ <currency>USD</currency>
8
+ <status>Active</status>
9
+ <starts-on type="date"></starts-on>
10
+ <ends-on type="date"></ends-on>
11
+ <billing-basis type="decimal">8.0</billing-basis>
12
+ <hours-per-day type="decimal">8.0</hours-per-day>
13
+ <billing-period>hour</billing-period>
14
+ <normal-billing-rate>0.0</normal-billing-rate>
15
+ <budget type="integer">1000</budget>
16
+ <budget-units>Monetary</budget-units>
17
+ <uses-project-invoice-sequence type="boolean">false</uses-project-invoice-sequence>
18
+ <contacts-po-reference></contacts-po-reference>
19
+ <is-ir35 type="boolean"></is-ir35>
20
+ <notes-count type="integer">1</notes-count>
21
+ <basecamp-id type="integer"></basecamp-id>
22
+ <created-at type="datetime">2011-04-12T18:33:06Z</created-at>
23
+ <updated-at type="datetime">2011-04-12T18:33:06Z</updated-at>
24
+ </project>
25
+ </projects>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project>
3
+ <id type="integer">116526</id>
4
+ <contact-id type="integer">436186</contact-id>
5
+ <name>Website</name>
6
+ <currency>USD</currency>
7
+ <status>Active</status>
8
+ <starts-on type="date"></starts-on>
9
+ <ends-on type="date"></ends-on>
10
+ <billing-basis type="decimal">8.0</billing-basis>
11
+ <hours-per-day type="decimal">8.0</hours-per-day>
12
+ <billing-period>hour</billing-period>
13
+ <normal-billing-rate>0.0</normal-billing-rate>
14
+ <budget type="integer">1000</budget>
15
+ <budget-units>Monetary</budget-units>
16
+ <uses-project-invoice-sequence type="boolean">false</uses-project-invoice-sequence>
17
+ <contacts-po-reference></contacts-po-reference>
18
+ <is-ir35 type="boolean"></is-ir35>
19
+ <notes-count type="integer">1</notes-count>
20
+ <basecamp-id type="integer"></basecamp-id>
21
+ <created-at type="datetime">2011-04-12T18:33:06Z</created-at>
22
+ <updated-at type="datetime">2011-04-12T18:33:06Z</updated-at>
23
+ </project>
@@ -0,0 +1,33 @@
1
+ require 'rspec'
2
+ require 'freeagent'
3
+
4
+ unless defined?(SPEC_ROOT)
5
+ SPEC_ROOT = File.expand_path("../", __FILE__)
6
+ end
7
+
8
+ # The fixtures are UTF-8 encoded.
9
+ # Make sure Ruby uses the proper encoding.
10
+ if RUBY_VERSION < '1.9'
11
+ $KCODE='u'
12
+ else
13
+ Encoding.default_external = Encoding::UTF_8
14
+ Encoding.default_internal = Encoding::UTF_8
15
+ end
16
+
17
+ # Requires supporting ruby files with custom matchers and macros, etc,
18
+ # in spec/support/ and its subdirectories.
19
+ Dir[File.join(SPEC_ROOT, "support/**/*.rb")].each { |f| require f }
20
+
21
+ RSpec.configure do |config|
22
+ # config.mock_with :rr
23
+
24
+ config.before(:each) do
25
+ FreeAgent.configure do |config|
26
+ config.username = "email@example.com"
27
+ config.password = "letmein"
28
+ config.subdomain = "example"
29
+ end
30
+
31
+ FreeAgent::Base.site = "http://localhost:11988"
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ module Helper
2
+
3
+ # Gets the currently described class.
4
+ # Conversely to +subject+, it returns the class
5
+ # instead of an instance.
6
+ def klass
7
+ described_class
8
+ end
9
+
10
+ def fixture(*name)
11
+ File.join(SPEC_ROOT, "fixtures", *name)
12
+ end
13
+
14
+ end
15
+
16
+ RSpec.configure do |config|
17
+ config.include Helper
18
+ end
@@ -0,0 +1,47 @@
1
+ require 'mimic'
2
+
3
+ def fixture(*path)
4
+ File.read(File.join(SPEC_ROOT, 'fixtures', *path))
5
+ end
6
+
7
+ Mimic.mimic do
8
+
9
+ use Rack::Auth::Basic do |username, password|
10
+ username == 'email@example.com' and password == 'letmein'
11
+ end
12
+
13
+ get('/attachments.xml').returning fixture('attachments/all.xml')
14
+ get('/attachments/1.xml').returning "", 404
15
+ get('/attachments/2.xml').returning fixture('attachments/single.xml')
16
+
17
+ get('/bank_accounts.xml').returning fixture('bank_accounts/all.xml')
18
+ get('/bank_accounts/1.xml').returning "", 404
19
+ get('/bank_accounts/2.xml').returning fixture('bank_accounts/single.xml')
20
+
21
+ get('/bills.xml') do
22
+ return [400, {}, []] unless params[:period]
23
+
24
+ [200, {}, fixture('bills/all.xml')]
25
+ end
26
+ get('/bills/1.xml').returning "", 404
27
+ get('/bills/2.xml').returning fixture('bills/single.xml')
28
+
29
+ get('/contacts.xml').returning fixture('contacts/all.xml')
30
+ get('/contacts/1.xml').returning "", 404
31
+ get('/contacts/2.xml').returning fixture('contacts/single.xml')
32
+
33
+ get('/invoices.xml').returning fixture('invoices/all.xml')
34
+ get('/invoices/1.xml').returning "", 404
35
+ get('/invoices/2.xml').returning fixture('invoices/single.xml')
36
+
37
+ get('/invoices/1/*') do
38
+ [404, {}, []]
39
+ end
40
+ get('/invoices/2/invoice_items.xml').returning fixture('invoice_items/all.xml')
41
+ get('/invoices/2/invoice_items/1.xml').returning "", 404
42
+ get('/invoices/2/invoice_items/2.xml').returning fixture('invoice_items/single.xml')
43
+
44
+ get('/projects.xml').returning fixture('projects/all.xml')
45
+ get('/projects/1.xml').returning "", 404
46
+ get('/projects/2.xml').returning fixture('projects/single.xml')
47
+ end