fakturan_nu 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -3
- data/fakturan_nu.gemspec +1 -1
- data/lib/fakturan_nu.rb +3 -0
- data/lib/fakturan_nu/account.rb +27 -0
- data/lib/fakturan_nu/base.rb +11 -9
- data/lib/fakturan_nu/middleware/parse_json.rb +1 -1
- data/lib/fakturan_nu/setting.rb +5 -0
- data/lib/fakturan_nu/user.rb +8 -0
- data/test/exceptions_test.rb +7 -0
- data/test/models_test.rb +5 -14
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02e35fa5a923f61075b3e317194962264c8ee81f
|
4
|
+
data.tar.gz: ae4c21387becc98cce2317202131450e7aa9feb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8f81b2e68400977172e5dfd33d32e81d55c41a7211985836c26a8a8937603a0a229d03de9f96df4c10520254c85a27fe839a86b394dfd1dbb18224d431a9617
|
7
|
+
data.tar.gz: b56c5ae954df126117441917ad54303e3dde7cac5457556c4b395e07f82f31dedfc4f62ada4f02a979384d76932bd91ce62405355d71818e56a65db156b8e52a
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Ruby client for the fakturan.nu API
|
2
2
|
==============================
|
3
3
|
|
4
|
-
API client in ruby for the Swedish web based invoicing software [fakturan.nu](https://www.fakturan.nu).
|
4
|
+
API client in ruby for the Swedish web based invoicing software [fakturan.nu](https://www.fakturan.nu).
|
5
5
|
|
6
6
|
---
|
7
7
|
|
@@ -30,7 +30,7 @@ If you're not using Rails, just ``` require 'fakturan_nu'``` and run setup where
|
|
30
30
|
|
31
31
|
### General
|
32
32
|
|
33
|
-
The client attempts to provide an interface similar to ActiveRecord.
|
33
|
+
The api client attempts to provide an interface similar to ActiveRecord.
|
34
34
|
|
35
35
|
```ruby
|
36
36
|
Fakturan::Product.all
|
@@ -56,7 +56,7 @@ product.save
|
|
56
56
|
|
57
57
|
### Invoices
|
58
58
|
|
59
|
-
For creating invoices, a client is required. It can be an existing client (by using ```client_id```), or a new one (by using ```client```):
|
59
|
+
For creating invoices, a client/customer is required. It can be an existing client (by using ```client_id```), or a new one (by using ```client```):
|
60
60
|
|
61
61
|
```ruby
|
62
62
|
invoice = Fakturan::Invoice.create(client: { company: "Acme Inc" })
|
@@ -72,6 +72,15 @@ invoice = Fakturan::Invoice.create(client_id: 1, rows: [{ product_name: "Shoes",
|
|
72
72
|
# POST "https://fakturan.nu/api/v2/invoices" # Will create a new invoice for client with id: 1
|
73
73
|
```
|
74
74
|
|
75
|
+
### Finding specific resources
|
76
|
+
|
77
|
+
Some resources can be found by other attributes than their id. Any attribute that can be used for *filtering* on the list action, (see [client/list](https://sandbox.fakturan.nu/apidocs/2/clients/index.en.html) for example) can be used to find a single resource as well. This is done through the same find_by-interface that ActiveRecord uses:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
Client.find_by(number: 123)
|
81
|
+
# GET "https://fakturan.nu/api/v2/clients?number=123" # Find a client by number or return nil if not found
|
82
|
+
```
|
83
|
+
|
75
84
|
### Available resources and properties
|
76
85
|
|
77
86
|
For a full list of resources and the properties of each type of resource, see the [api reference](https://sandbox.fakturan.nu/apidocs).
|
data/fakturan_nu.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = 'fakturan_nu'
|
4
|
-
s.version = '1.2.
|
4
|
+
s.version = '1.2.1'
|
5
5
|
s.date = '2015-05-11'
|
6
6
|
s.summary = 'A ruby client for the Fakturan.nu - API'
|
7
7
|
s.description = 'A ruby client for the Fakturan.nu - API. Fakturan.nu is a webbapp for billing.'
|
data/lib/fakturan_nu.rb
CHANGED
@@ -14,6 +14,9 @@ require 'fakturan_nu/product'
|
|
14
14
|
require 'fakturan_nu/client'
|
15
15
|
require 'fakturan_nu/row'
|
16
16
|
require 'fakturan_nu/invoice'
|
17
|
+
require 'fakturan_nu/account'
|
18
|
+
require 'fakturan_nu/setting'
|
19
|
+
require 'fakturan_nu/user'
|
17
20
|
|
18
21
|
I18n.load_path += Dir.glob( File.dirname(__FILE__) + "lib/locales/*.{rb,yml}" )
|
19
22
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Fakturan
|
2
|
+
class Account < Base
|
3
|
+
uri 'accounts/(:id)'
|
4
|
+
has_many :users, uri: nil
|
5
|
+
belongs_to :setting, uri: nil
|
6
|
+
|
7
|
+
attributes :api_token
|
8
|
+
|
9
|
+
accepts_nested_attributes_for :users, :setting
|
10
|
+
|
11
|
+
def users=(attrs_or_obj_array)
|
12
|
+
if attrs_or_obj_array.first.respond_to?(:each)
|
13
|
+
send(:users_attributes=, attrs_or_obj_array)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def setting=(attrs_or_obj)
|
20
|
+
if attrs_or_obj.respond_to?(:each)
|
21
|
+
send(:setting_attributes=, attrs_or_obj)
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/fakturan_nu/base.rb
CHANGED
@@ -41,7 +41,7 @@ module Fakturan
|
|
41
41
|
|
42
42
|
# The errors are for an associated object, and there is an associated object to put them on
|
43
43
|
if (association = self.class.reflect_on_association(ass_name)) && !self.send(ass_name).blank?
|
44
|
-
if association.type == Spyke::Associations::HasMany
|
44
|
+
if association.type == Spyke::Associations::HasMany && self.respond_to?(field_name.to_sym)
|
45
45
|
# We need to add one error to our "base" object so that it's not valid
|
46
46
|
self.add_to_errors(field_name.to_sym, [{error: :invalid}])
|
47
47
|
field_errors.each do |new_error_hash_with_index| # new_error_hash_OR_error_type ("blank") on presence of has_many
|
@@ -63,14 +63,16 @@ module Fakturan
|
|
63
63
|
association_target_parent = path_sub_parts[0..-2].inject(self, :send)
|
64
64
|
|
65
65
|
# We add the error to the associated object
|
66
|
-
association_target.
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
66
|
+
if association_target.respond_to?(field_name)
|
67
|
+
association_target.add_to_errors(field_name, field_errors)
|
68
|
+
# and then we get the errors (with generated messages) and add them to
|
69
|
+
# the parent (but without details, like nested_attributes works)
|
70
|
+
# This only makes sense on belongs_to and has_one, since it's impossible
|
71
|
+
# to know which object is refered to on has_many
|
72
|
+
association_target.errors.each do |attribute, message|
|
73
|
+
association_target_parent.errors[full_field_path] << message
|
74
|
+
association_target_parent.errors[full_field_path].uniq!
|
75
|
+
end
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
@@ -19,7 +19,7 @@ module Fakturan
|
|
19
19
|
else # If we get 204 = request fine, but no content returned
|
20
20
|
env.body = { data: {}, metadata: {}, errors: {} }
|
21
21
|
end
|
22
|
-
rescue MultiJson::ParseError
|
22
|
+
rescue MultiJson::ParseError
|
23
23
|
raise Fakturan::Error::ParseError, {:status => env.status, :headers => env.response_headers, :body => env.body}
|
24
24
|
end
|
25
25
|
end
|
data/test/exceptions_test.rb
CHANGED
@@ -114,6 +114,13 @@ module Fakturan
|
|
114
114
|
assert_equal ({:company=>[{:error=>:blank}]}), invoice.client.errors.details
|
115
115
|
end
|
116
116
|
|
117
|
+
def test_ignores_errors_for_nonexistant_attributes
|
118
|
+
stub_api_request(:post, '/accounts').to_return(body: {errors: { "users.email" => [{ error: "taken", value: "palle@kuling.net"}], "users.login" => [{error:"taken",value:"palle@kuling.net"}], users: [{"0" => { "users.email" => [{error: "taken", value: "palle@kuling.net"}], "users.login" => [{ error: "taken", value: "palle@kuling.net"}]}}]}}.to_json, status: 422)
|
119
|
+
|
120
|
+
account = Fakturan::Account.new( setting: { company_email: "palle@kuling.net" }, users: [{ email: "palle@kuling.net", password: "asdfasdf", firstname: "asdfasdf", lastname: "asdfasdf"}])
|
121
|
+
assert !account.save # Should just return false without raising errors
|
122
|
+
end
|
123
|
+
|
117
124
|
def test_validation_errors_on_nested_associated_objects
|
118
125
|
stub_api_request(:post, '/invoices').to_return(body: {errors: {date: [{error: :blank},{error: :invalid}], :"client.address.country" => [{ error: :blank}]}}.to_json, status: 422)
|
119
126
|
invoice = Fakturan::Invoice.new(client: { address: { street_address: 'Some street' } })
|
data/test/models_test.rb
CHANGED
@@ -28,19 +28,12 @@ module Fakturan
|
|
28
28
|
assert_equal nil, client
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
32
|
-
|
33
|
-
@invoice = Fakturan::Invoice.find(5)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_find_one_and_access_attribute
|
37
|
-
client = Fakturan::Client.find(1)
|
38
|
-
assert client.name.is_a? String
|
31
|
+
def good_invoice
|
32
|
+
@invoice ||= Fakturan::Invoice.find(5)
|
39
33
|
end
|
40
34
|
|
41
35
|
def test_should_create_associated_objects
|
42
|
-
|
43
|
-
assert_equal @invoice.address.name, 'A simple client'
|
36
|
+
assert_equal good_invoice.address.name, 'A simple client'
|
44
37
|
end
|
45
38
|
|
46
39
|
def test_should_be_able_to_fetch_and_update_invoice
|
@@ -51,11 +44,10 @@ module Fakturan
|
|
51
44
|
end
|
52
45
|
|
53
46
|
def test_should_fetch_associated_record
|
54
|
-
get_good_invoice
|
55
47
|
client = Fakturan::Client.find(11)
|
56
48
|
assert_equal Fakturan::Client, client.class
|
57
49
|
assert_equal 'A simple client', client.name
|
58
|
-
assert_equal client.name,
|
50
|
+
assert_equal client.name, good_invoice.client.name
|
59
51
|
end
|
60
52
|
|
61
53
|
def test_find_one_and_access_attribute
|
@@ -116,8 +108,7 @@ module Fakturan
|
|
116
108
|
end
|
117
109
|
|
118
110
|
def test_date_fields_should_not_be_typecast
|
119
|
-
|
120
|
-
assert_equal String, @invoice.date.class
|
111
|
+
assert_equal String, good_invoice.date.class
|
121
112
|
end
|
122
113
|
|
123
114
|
def test_getting_attribute_on_new_instance
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fakturan_nu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Bourque Olivegren
|
@@ -203,6 +203,7 @@ files:
|
|
203
203
|
- config/locales/en.yml
|
204
204
|
- fakturan_nu.gemspec
|
205
205
|
- lib/fakturan_nu.rb
|
206
|
+
- lib/fakturan_nu/account.rb
|
206
207
|
- lib/fakturan_nu/address.rb
|
207
208
|
- lib/fakturan_nu/base.rb
|
208
209
|
- lib/fakturan_nu/client.rb
|
@@ -213,7 +214,9 @@ files:
|
|
213
214
|
- lib/fakturan_nu/middleware/raise_error.rb
|
214
215
|
- lib/fakturan_nu/product.rb
|
215
216
|
- lib/fakturan_nu/row.rb
|
217
|
+
- lib/fakturan_nu/setting.rb
|
216
218
|
- lib/fakturan_nu/spyke_extensions.rb
|
219
|
+
- lib/fakturan_nu/user.rb
|
217
220
|
- test/basics_test.rb
|
218
221
|
- test/exceptions_test.rb
|
219
222
|
- test/fixtures.rb
|
@@ -240,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
243
|
version: '0'
|
241
244
|
requirements: []
|
242
245
|
rubyforge_project:
|
243
|
-
rubygems_version: 2.
|
246
|
+
rubygems_version: 2.4.5.1
|
244
247
|
signing_key:
|
245
248
|
specification_version: 4
|
246
249
|
summary: A ruby client for the Fakturan.nu - API
|