nusii 0.1.1
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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/Gemfile +5 -0
- data/LICENSE +21 -0
- data/README.md +306 -0
- data/Rakefile +6 -0
- data/bin/console +7 -0
- data/lib/nusii.rb +54 -0
- data/lib/nusii/account.rb +18 -0
- data/lib/nusii/api_operations/base.rb +58 -0
- data/lib/nusii/api_operations/connection.rb +21 -0
- data/lib/nusii/api_operations/create.rb +30 -0
- data/lib/nusii/api_operations/delete.rb +30 -0
- data/lib/nusii/api_operations/index.rb +37 -0
- data/lib/nusii/api_operations/nested_create.rb +31 -0
- data/lib/nusii/api_operations/nested_index.rb +27 -0
- data/lib/nusii/api_operations/send.rb +29 -0
- data/lib/nusii/api_operations/show.rb +32 -0
- data/lib/nusii/api_operations/update.rb +30 -0
- data/lib/nusii/client.rb +24 -0
- data/lib/nusii/crud/create.rb +12 -0
- data/lib/nusii/crud/destroy.rb +12 -0
- data/lib/nusii/crud/destroy_self.rb +14 -0
- data/lib/nusii/crud/get.rb +12 -0
- data/lib/nusii/crud/list.rb +12 -0
- data/lib/nusii/crud/save.rb +23 -0
- data/lib/nusii/line_item.rb +37 -0
- data/lib/nusii/nusii_error.rb +48 -0
- data/lib/nusii/proposal.rb +31 -0
- data/lib/nusii/proposal_activity.rb +17 -0
- data/lib/nusii/request.rb +45 -0
- data/lib/nusii/resource.rb +40 -0
- data/lib/nusii/response_object.rb +29 -0
- data/lib/nusii/section.rb +25 -0
- data/lib/nusii/utils/json_api_builder.rb +69 -0
- data/lib/nusii/version.rb +3 -0
- data/lib/nusii/webhook_endpoint.rb +23 -0
- data/nusii.gemspec +33 -0
- metadata +194 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Base
|
4
|
+
|
5
|
+
def call
|
6
|
+
if [200, 201].include?(response.status)
|
7
|
+
update_rate_limit && build_ok_response
|
8
|
+
else
|
9
|
+
update_rate_limit && raise_error_response
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def response
|
16
|
+
raise NotImplementedError,
|
17
|
+
"Each subclass must implement this method"
|
18
|
+
end
|
19
|
+
|
20
|
+
def build_ok_response
|
21
|
+
raise NotImplementedError,
|
22
|
+
"Each subclass must implement this method"
|
23
|
+
end
|
24
|
+
|
25
|
+
def resource_path
|
26
|
+
raise NotImplementedError,
|
27
|
+
"Each subclass must implement this method"
|
28
|
+
end
|
29
|
+
|
30
|
+
def update_rate_limit
|
31
|
+
Nusii.rate_limit_remaining = headers["x-ratelimit-remaining"].to_i
|
32
|
+
Nusii.rate_limit_retry_after = headers["x-ratelimit-retry-after"].to_i
|
33
|
+
end
|
34
|
+
|
35
|
+
def raise_error_response
|
36
|
+
current_error = NusiiError.error_for(status)
|
37
|
+
|
38
|
+
raise current_error.new(status, body, reason_phrase)
|
39
|
+
end
|
40
|
+
|
41
|
+
def parsed_body
|
42
|
+
@parsed_body ||= JSON.parse body
|
43
|
+
end
|
44
|
+
|
45
|
+
def resource_url_string
|
46
|
+
resource_class.class_name.underscore.pluralize
|
47
|
+
end
|
48
|
+
|
49
|
+
def connection
|
50
|
+
@connection ||= Connection.new
|
51
|
+
end
|
52
|
+
|
53
|
+
delegate :status, :body, :reason_phrase, :headers,
|
54
|
+
:to => :response
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Nusii
|
2
|
+
class Connection
|
3
|
+
|
4
|
+
delegate :get, :post, :put, :delete,
|
5
|
+
:to => :connection
|
6
|
+
|
7
|
+
HOST = "https://app.nusii.com"
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def connection
|
12
|
+
@connection ||= Faraday.new(HOST) do |conn|
|
13
|
+
conn.adapter :net_http
|
14
|
+
conn.headers['Authorization'] = "Token token=#{Nusii.api_key}"
|
15
|
+
conn.headers['User-Agent'] = Nusii.user_agent
|
16
|
+
conn.headers['Content-Type'] = 'application/json'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Create < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :resource
|
6
|
+
|
7
|
+
def initialize resource_class, resource
|
8
|
+
@resource_class = resource_class
|
9
|
+
@resource = resource
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def response
|
15
|
+
@response ||= connection.post resource_path, resource.save_params.to_json
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_ok_response
|
19
|
+
builder = Utils::JsonApiBuilder.new(parsed_body['data'], parsed_body['included'])
|
20
|
+
builder.call
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_path
|
24
|
+
"/api/v2/#{resource_url_string}"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Delete < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :resource_id, :options
|
6
|
+
|
7
|
+
def initialize resource_class, resource_id, options={}
|
8
|
+
@resource_class = resource_class
|
9
|
+
@resource_id = resource_id
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def response
|
16
|
+
@response ||= connection.delete resource_path, options
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_ok_response
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_path
|
24
|
+
"/api/v2/#{resource_url_string}/#{resource_id}"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Index < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :options
|
6
|
+
|
7
|
+
def initialize resource_class, options={}
|
8
|
+
@resource_class = resource_class
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def response
|
15
|
+
@response ||= connection.get resource_path, options
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_ok_response
|
19
|
+
ResponseObject.new(resources, meta, resource_class)
|
20
|
+
end
|
21
|
+
|
22
|
+
def resources
|
23
|
+
builder = Utils::JsonApiBuilder.new(parsed_body['data'], parsed_body['included'])
|
24
|
+
builder.call
|
25
|
+
end
|
26
|
+
|
27
|
+
def meta
|
28
|
+
parsed_body['meta']
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_path
|
32
|
+
"/api/v2/#{resource_url_string}"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class NestedCreate < Create
|
4
|
+
|
5
|
+
attr_reader :resource_class, :nested_resource_id,
|
6
|
+
:nested_resource_class, :params
|
7
|
+
|
8
|
+
def initialize resource_class, nested_resource_id, nested_resource_class, params
|
9
|
+
@resource_class = resource_class
|
10
|
+
@nested_resource_id = nested_resource_id
|
11
|
+
@nested_resource_class = nested_resource_class
|
12
|
+
@params = params
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def response
|
18
|
+
@response ||= connection.post resource_path, params.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
def resource_path
|
22
|
+
"/api/v2/#{nested_resource_url_string}/#{nested_resource_id}/#{resource_url_string}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def nested_resource_url_string
|
26
|
+
nested_resource_class.class_name.downcase.pluralize
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class NestedIndex < Index
|
4
|
+
|
5
|
+
attr_reader :resource_class, :nested_resource_id,
|
6
|
+
:nested_resource_class, :options
|
7
|
+
|
8
|
+
def initialize resource_class, nested_resource_id, nested_resource_class, options={}
|
9
|
+
@resource_class = resource_class
|
10
|
+
@nested_resource_id = nested_resource_id
|
11
|
+
@nested_resource_class = nested_resource_class
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def resource_path
|
18
|
+
"/api/v2/#{nested_resource_url_string}/#{nested_resource_id}/#{resource_url_string}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def nested_resource_url_string
|
22
|
+
nested_resource_class.class_name.downcase.pluralize
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Send < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :resource, :params
|
6
|
+
|
7
|
+
def initialize resource_class, resource, params
|
8
|
+
@resource_class = resource_class
|
9
|
+
@resource = resource
|
10
|
+
@params = params
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def response
|
16
|
+
@response ||= connection.put resource_path, params.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_ok_response
|
20
|
+
parsed_body
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_path
|
24
|
+
"/api/v2/#{resource_url_string}/#{resource.id}/send_proposal"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Show < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :resource_id, :options
|
6
|
+
|
7
|
+
def initialize resource_class, resource_id, options={}
|
8
|
+
@resource_class = resource_class
|
9
|
+
@resource_id = resource_id
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def response
|
16
|
+
@response ||= connection.get resource_path, options
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_ok_response
|
20
|
+
builder = Utils::JsonApiBuilder.new(parsed_body['data'], parsed_body['included'])
|
21
|
+
builder.call
|
22
|
+
end
|
23
|
+
|
24
|
+
def resource_path
|
25
|
+
(resource_class.respond_to?(:resource_path) && resource_class.resource_path) ||
|
26
|
+
"/api/v2/#{resource_url_string}/#{resource_id}"
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nusii
|
2
|
+
module ApiOperations
|
3
|
+
class Update < Base
|
4
|
+
|
5
|
+
attr_reader :resource_class, :resource
|
6
|
+
|
7
|
+
def initialize resource_class, resource
|
8
|
+
@resource_class = resource_class
|
9
|
+
@resource = resource
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def response
|
15
|
+
@response ||= connection.put resource_path, resource.save_params.to_json
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_ok_response
|
19
|
+
builder = Utils::JsonApiBuilder.new(parsed_body['data'], parsed_body['included'])
|
20
|
+
builder.call
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_path
|
24
|
+
"/api/v2/#{resource_url_string}/#{resource.id}"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/nusii/client.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Nusii
|
2
|
+
class Client < Resource
|
3
|
+
extend Nusii::Crud::Get
|
4
|
+
extend Nusii::Crud::List
|
5
|
+
extend Nusii::Crud::Create
|
6
|
+
include Nusii::Crud::Save
|
7
|
+
extend Nusii::Crud::Destroy
|
8
|
+
include Nusii::Crud::DestroySelf
|
9
|
+
|
10
|
+
attr_accessor :id, :email, :name, :surname, :full_name,
|
11
|
+
:currency, :business, :locale, :pdf_page_size,
|
12
|
+
:web, :telephone, :address, :city, :postcode,
|
13
|
+
:country, :city, :state
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def editable_attributes
|
18
|
+
[ :email, :name, :surname, :currency, :business,
|
19
|
+
:locale, :pdf_page_size, :web, :telephone, :address,
|
20
|
+
:city, :postcode, :country, :state ]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Nusii
|
2
|
+
module Crud
|
3
|
+
module DestroySelf
|
4
|
+
|
5
|
+
def destroy options={}
|
6
|
+
raise ArgumentError, "This #{self.class.class_name} has no id" if self.id.blank?
|
7
|
+
|
8
|
+
requester = Nusii::Request.new
|
9
|
+
requester.delete_call self.class, self.id, options
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nusii
|
2
|
+
module Crud
|
3
|
+
module Save
|
4
|
+
|
5
|
+
def save
|
6
|
+
self.id.present? ? update_call : create_call
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def create_call
|
12
|
+
requester = Nusii::Request.new
|
13
|
+
requester.create_call self.class, self
|
14
|
+
end
|
15
|
+
|
16
|
+
def update_call
|
17
|
+
requester = Nusii::Request.new
|
18
|
+
requester.update_call self.class, self
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|