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.
@@ -0,0 +1,37 @@
1
+ module Nusii
2
+ class LineItem < Resource
3
+ extend Nusii::Crud::List
4
+ extend Nusii::Crud::Destroy
5
+ include Nusii::Crud::DestroySelf
6
+
7
+ attr_accessor :id, :section_id, :name, :position, :cost_type,
8
+ :recurring_type, :per_type, :quantity, :currency,
9
+ :amount_in_cents, :amount_formatted, :total_in_cents,
10
+ :total_formatted, :updated_at, :created_at, :amount
11
+
12
+ def self.list_by_section section_id, options={}
13
+ requester = Nusii::Request.new
14
+ requester.nested_index_call self, section_id, Nusii::Section, options
15
+ end
16
+
17
+ def self.create_with_section section_id, params
18
+ requester = Nusii::Request.new
19
+ requester.nested_create_call self, section_id, Nusii::Section, params
20
+ end
21
+
22
+ def save
23
+ raise(ArgumentError, 'You can\'t update a line item without id') if self.id.blank?
24
+
25
+ requester = Nusii::Request.new
26
+ requester.update_call self.class, self
27
+ end
28
+
29
+ private
30
+
31
+ def editable_attributes
32
+ [ :name, :cost_type, :recurring_type, :per_type,
33
+ :position, :quantity, :amount ]
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ module Nusii
2
+ class NusiiError < StandardError
3
+ attr_reader :status, :body, :reason_phrase
4
+
5
+ def initialize status, body, reason_phrase
6
+ @status = status
7
+ @body = body
8
+ @reason_phrase = reason_phrase
9
+ end
10
+
11
+ def to_s
12
+ message_text = message.present? ? "\nMessage: #{message}" : ''
13
+ "Status: #{status}#{message_text}"
14
+ end
15
+
16
+ def message
17
+ @message ||= body.presence || reason_phrase.presence
18
+ end
19
+
20
+ def self.error_for status
21
+ case status
22
+ when 400 then BadRequestError
23
+ when 401 then UnauthorizedError
24
+ when 403 then ForbiddenError
25
+ when 404 then NotFoundError
26
+ when 405 then MethodNotAllowedError
27
+ when 406 then NotAcceptableError
28
+ when 410 then GoneError
29
+ when 429 then TooManyRequestsError
30
+ when 500 then IntervalServerError
31
+ when 503 then ServiceUnavailableError
32
+ else NusiiError
33
+ end
34
+ end
35
+ end
36
+
37
+ class BadRequestError < NusiiError; end
38
+ class UnauthorizedError < NusiiError; end
39
+ class ForbiddenError < NusiiError; end
40
+ class NotFoundError < NusiiError; end
41
+ class MethodNotAllowedError < NusiiError; end
42
+ class NotAcceptableError < NusiiError; end
43
+ class GoneError < NusiiError; end
44
+ class TooManyRequestsError < NusiiError; end
45
+ class IntervalServerError < NusiiError; end
46
+ class ServiceUnavailableError < NusiiError; end
47
+
48
+ end
@@ -0,0 +1,31 @@
1
+ module Nusii
2
+ class Proposal < 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, :account_id, :status, :public_id, :title,
11
+ :prepared_by_id, :client_id, :client_email,
12
+ :sender_id, :document_section_title,
13
+ :expires_at, :display_date, :report,
14
+ :exclude_total, :exclude_total_in_pdf, :theme,
15
+ :sections
16
+
17
+ def send_proposal params
18
+ requester = Nusii::Request.new
19
+ requester.send_call self.class, self, params
20
+ end
21
+
22
+ private
23
+
24
+ def editable_attributes
25
+ [ :title, :client_id, :client_email, :document_section_title,
26
+ :prepared_by_id, :expires_at, :display_date,
27
+ :report, :exclude_total, :exclude_total_in_pdf, :theme ]
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ module Nusii
2
+ class ProposalActivity < Resource
3
+ extend Nusii::Crud::Get
4
+ extend Nusii::Crud::List
5
+
6
+ attr_accessor :id, :activity_type, :ip_address, :additional_fields,
7
+ :proposal_title, :proposal_created_at,
8
+ :proposal_sent_at, :proposal_status,
9
+ :proposal_public_id, :proposal_expires_at,
10
+ :client_name, :client_email, :client_surname,
11
+ :client_full_name, :client_business, :client_telephone,
12
+ :client_locale, :client_address, :client_postcode,
13
+ :client_country, :client_city, :client_state,
14
+ :client_web
15
+
16
+ end
17
+ end
@@ -0,0 +1,45 @@
1
+ module Nusii
2
+ class Request
3
+
4
+ def show_call resource_class, resource_id = nil, options = {}
5
+ operator = ApiOperations::Show.new(resource_class, resource_id, options)
6
+ operator.call
7
+ end
8
+
9
+ def index_call resource_class, options={}
10
+ operator = ApiOperations::Index.new(resource_class, options)
11
+ operator.call
12
+ end
13
+
14
+ def nested_index_call resource_class, nested_resource_id, nested_resource, options={}
15
+ operator = ApiOperations::NestedIndex.new(resource_class, nested_resource_id, nested_resource, options)
16
+ operator.call
17
+ end
18
+
19
+ def create_call resource_class, resource
20
+ operator = ApiOperations::Create.new(resource_class, resource)
21
+ operator.call
22
+ end
23
+
24
+ def nested_create_call resource_class, nested_resource_id, nested_resource_class, params
25
+ operator = ApiOperations::NestedCreate.new(resource_class, nested_resource_id, nested_resource_class, params)
26
+ operator.call
27
+ end
28
+
29
+ def update_call resource_class, resource
30
+ operator = ApiOperations::Update.new(resource_class, resource)
31
+ operator.call
32
+ end
33
+
34
+ def delete_call resource_class, resource_id, options={}
35
+ operator = ApiOperations::Delete.new(resource_class, resource_id, options)
36
+ operator.call
37
+ end
38
+
39
+ def send_call resource_class, resource, params
40
+ operator = ApiOperations::Send.new(resource_class, resource, params)
41
+ operator.call
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,40 @@
1
+ module Nusii
2
+ class Resource
3
+
4
+ def initialize args
5
+ assign_attributes args
6
+ end
7
+
8
+ def self.class_name
9
+ name.split("::").last
10
+ end
11
+
12
+ def editable_params
13
+ editable_attributes.each_with_object({}) do |attribute, result|
14
+ result[attribute.to_s] = self.send(attribute)
15
+ end
16
+ end
17
+
18
+ def save_params
19
+ {
20
+ self.class.class_name.underscore.singularize => editable_params
21
+ }
22
+ end
23
+
24
+ private
25
+
26
+ def assign_attributes args
27
+ args.each do |attribute, value|
28
+ value = value.to_i if attribute.match(/\w+\_id$|^id$/)
29
+ instance_variable_set("@#{attribute}", value) unless value.nil?
30
+ end
31
+ self
32
+ end
33
+
34
+ def editable_attributes
35
+ raise NotImplementedError,
36
+ "Each subclass must implement this method"
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ module Nusii
2
+ class ResponseObject
3
+
4
+ attr_accessor :resources, :meta, :resource_class
5
+
6
+ def initialize resources, meta, resource_class
7
+ @resources = resources
8
+ @meta = meta
9
+ @resource_class = resource_class
10
+ end
11
+
12
+ def next_page
13
+ raise(ArgumentError, "That page does no exist") if meta['next_page'] == nil
14
+ resource_class.list(:page => meta['next_page'], :per => per_page)
15
+ end
16
+
17
+ def prev_page
18
+ raise(ArgumentError, "That page does no exist") if meta['prev_page'] == nil
19
+ resource_class.list(:page => meta['prev_page'], :per => per_page)
20
+ end
21
+
22
+ private
23
+
24
+ def per_page
25
+ (meta['total_count'] / meta['total_pages'].to_f).round
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module Nusii
2
+ class Section < 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, :currency, :account_id, :proposal_id,
11
+ :template_id, :title, :name, :body, :position,
12
+ :reusable, :section_type, :created_at, :updated_at,
13
+ :page_break, :optional, :selected, :include_total,
14
+ :total_in_cents, :total_formatted, :line_items
15
+
16
+ private
17
+
18
+ def editable_attributes
19
+ [ :proposal_id, :template_id, :title, :body,
20
+ :name, :position, :reusable, :section_type,
21
+ :page_break, :optional, :include_total ]
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,69 @@
1
+ module Nusii
2
+ module Utils
3
+ class JsonApiBuilder
4
+ attr_reader :data, :extra, :is_collection
5
+
6
+ def initialize data, extra
7
+ @is_collection = data.is_a?(Array)
8
+ @data = data.is_a?(Array) ? data : [data]
9
+ @extra = extra
10
+ end
11
+
12
+ def call
13
+ is_collection ? parsed_data : parsed_data.first
14
+ end
15
+
16
+ private
17
+
18
+ def parsed_data
19
+ data.each_with_object([]) do |resource_info, result|
20
+ result << resource_class.new(attributes_for(resource_info))
21
+ end
22
+ end
23
+
24
+ def attributes_for resource_info
25
+ {}.tap do |result|
26
+ result.merge! flat_id_with_attributes_for resource_info
27
+ result.merge! relationship_attributes_for(resource_info)
28
+ end
29
+ end
30
+
31
+ def relationship_attributes_for resource_info
32
+ (resource_info['relationships']||{}).each_with_object({}) do |(resource_type, resource_data), result|
33
+ resource_data['data'].each do |related_resource|
34
+ klass = "Nusii::#{resource_type.classify}".constantize
35
+ resource_id = related_resource['id']
36
+
37
+ result[resource_type] ||= []
38
+ result[resource_type] << klass.new(extract_from_included(resource_type, resource_id))
39
+ end
40
+ end
41
+ end
42
+
43
+ def extract_from_included resource_type, resource_id
44
+ ( parsed_included.present? &&
45
+ parsed_included[resource_type][resource_id] ) ||
46
+ {'id' => resource_id }
47
+ end
48
+
49
+ def parsed_included
50
+ @parsed_included ||= (extra||{}).each_with_object({}) do |item, result|
51
+ result[item['type']] ||= {}
52
+ result[item['type']][item['id']] = flat_id_with_attributes_for(item)
53
+ end
54
+ end
55
+
56
+ def flat_id_with_attributes_for item
57
+ new_item = item['attributes']
58
+ new_item.tap do |new_item_temp|
59
+ new_item_temp['id'] = item['id']
60
+ end
61
+ end
62
+
63
+ def resource_class
64
+ "Nusii::#{data.first['type'].classify}".constantize
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,3 @@
1
+ module Nusii
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ module Nusii
2
+ class WebhookEndpoint < Resource
3
+ extend Nusii::Crud::Get
4
+ extend Nusii::Crud::List
5
+ extend Nusii::Crud::Create
6
+ extend Nusii::Crud::Destroy
7
+ include Nusii::Crud::DestroySelf
8
+
9
+ attr_accessor :id, :target_url, :events
10
+
11
+ def save
12
+ requester = Nusii::Request.new
13
+ requester.create_call self.class, self
14
+ end
15
+
16
+ private
17
+
18
+ def editable_attributes
19
+ [ :target_url, :events ]
20
+ end
21
+
22
+ end
23
+ end
data/nusii.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'nusii/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "nusii"
8
+ spec.version = Nusii::VERSION
9
+ spec.authors = ["Víctor Martín"]
10
+ spec.email = ["support@nusii.com"]
11
+
12
+ spec.summary = %q{Nusii API wrapper.}
13
+ spec.description = %q{Ruby library for the Nusii API.}
14
+ spec.homepage = "https://github.com/Nusii/nusii-ruby"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_runtime_dependency "bundler", "~> 1.14"
25
+ spec.add_runtime_dependency "faraday", '~> 0.9'
26
+ spec.add_runtime_dependency "json", '~> 2.3'
27
+ spec.add_runtime_dependency "activesupport", "~> 6.0.3"
28
+
29
+ spec.add_development_dependency "rake", "~> 13.0"
30
+ spec.add_development_dependency "rspec", "~> 3.0"
31
+ spec.add_development_dependency "webmock", "~> 3.1.1"
32
+ spec.add_development_dependency "sinatra", "~> 2.0.0"
33
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nusii
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Víctor Martín
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 6.0.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 6.0.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '13.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '13.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.1.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 3.1.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 2.0.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.0.0
125
+ description: Ruby library for the Nusii API.
126
+ email:
127
+ - support@nusii.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".travis.yml"
135
+ - Gemfile
136
+ - LICENSE
137
+ - README.md
138
+ - Rakefile
139
+ - bin/console
140
+ - lib/nusii.rb
141
+ - lib/nusii/account.rb
142
+ - lib/nusii/api_operations/base.rb
143
+ - lib/nusii/api_operations/connection.rb
144
+ - lib/nusii/api_operations/create.rb
145
+ - lib/nusii/api_operations/delete.rb
146
+ - lib/nusii/api_operations/index.rb
147
+ - lib/nusii/api_operations/nested_create.rb
148
+ - lib/nusii/api_operations/nested_index.rb
149
+ - lib/nusii/api_operations/send.rb
150
+ - lib/nusii/api_operations/show.rb
151
+ - lib/nusii/api_operations/update.rb
152
+ - lib/nusii/client.rb
153
+ - lib/nusii/crud/create.rb
154
+ - lib/nusii/crud/destroy.rb
155
+ - lib/nusii/crud/destroy_self.rb
156
+ - lib/nusii/crud/get.rb
157
+ - lib/nusii/crud/list.rb
158
+ - lib/nusii/crud/save.rb
159
+ - lib/nusii/line_item.rb
160
+ - lib/nusii/nusii_error.rb
161
+ - lib/nusii/proposal.rb
162
+ - lib/nusii/proposal_activity.rb
163
+ - lib/nusii/request.rb
164
+ - lib/nusii/resource.rb
165
+ - lib/nusii/response_object.rb
166
+ - lib/nusii/section.rb
167
+ - lib/nusii/utils/json_api_builder.rb
168
+ - lib/nusii/version.rb
169
+ - lib/nusii/webhook_endpoint.rb
170
+ - nusii.gemspec
171
+ homepage: https://github.com/Nusii/nusii-ruby
172
+ licenses:
173
+ - MIT
174
+ metadata: {}
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubygems_version: 3.0.9
191
+ signing_key:
192
+ specification_version: 4
193
+ summary: Nusii API wrapper.
194
+ test_files: []