elmas 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.
@@ -0,0 +1,17 @@
1
+ module Elmas
2
+ class Journal
3
+ include Elmas::Resource
4
+
5
+ def base_path
6
+ "financial/Journals"
7
+ end
8
+
9
+ def mandatory_attributes
10
+ []
11
+ end
12
+
13
+ def other_attributes
14
+ [:code, :description]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,79 @@
1
+ require File.expand_path("../parser", __FILE__)
2
+ require File.expand_path("../utils", __FILE__)
3
+
4
+ module Elmas
5
+ class Response
6
+ attr_accessor :status_code, :body, :response
7
+
8
+ def initialize(response)
9
+ @response = response
10
+ end
11
+
12
+ def success?
13
+ @response.success? || SUCCESS_CODES.include?(status)
14
+ end
15
+
16
+ def body
17
+ @response.body
18
+ end
19
+
20
+ def parsed
21
+ Parser.new(body)
22
+ end
23
+
24
+ def results
25
+ results = []
26
+ if parsed.results.any?
27
+ parsed.results.each do |attributes|
28
+ klass = resolve_class
29
+ results << klass.send(:new, attributes)
30
+ end
31
+ end
32
+ results
33
+ end
34
+
35
+ def first
36
+ results.first if results
37
+ end
38
+
39
+ def type
40
+ return unless parsed.results.any?
41
+ c_type = parsed.results.first["__metadata"]["type"]
42
+ c_type.split(".").last
43
+ end
44
+
45
+ def status
46
+ @response.status
47
+ end
48
+
49
+ def fail?
50
+ ERROR_CODES.include? status
51
+ end
52
+
53
+ def unauthorized?
54
+ UNAUTHORIZED_CODES.include? status
55
+ end
56
+
57
+ SUCCESS_CODES = [
58
+ 201, 202, 203, 204, 301, 302, 303, 304
59
+ ]
60
+
61
+ ERROR_CODES = [
62
+ 400, 401, 402, 403, 404, 500, 501, 502, 503
63
+ ]
64
+
65
+ UNAUTHORIZED_CODES = [
66
+ 401, 402, 403
67
+ ]
68
+
69
+ private
70
+
71
+ def resolve_class
72
+ constant_name = Utils.modulize(type)
73
+ return Object.const_get(constant_name)
74
+ rescue NameError
75
+ Elmas.info("Unknown resource encountered, proceed as usual but further resource details might have to be implemented")
76
+ return Class.new { include Elmas::Resource }
77
+ end
78
+ end
79
+ end
data/lib/elmas/uri.rb ADDED
@@ -0,0 +1,50 @@
1
+ module Elmas
2
+ module Resource
3
+ module UriMethods
4
+ def base_path
5
+ Utils.collection_path self.class.name
6
+ end
7
+
8
+ def uri(options = {})
9
+ options.each do |option|
10
+ send("apply_#{option}".to_sym)
11
+ end
12
+ uri = URI(base_path)
13
+ uri.query = URI.encode_www_form(@query)
14
+ uri
15
+ end
16
+
17
+ # ?$filter=ID eq guid'#{id}'
18
+ def id_filter
19
+ ["$filter", "ID eq guid'#{id}'"]
20
+ end
21
+
22
+ def base_filter(attribute)
23
+ if attribute == :id
24
+ return id_filter
25
+ else
26
+ return ["$filter", "#{Utils.camelize(attribute)} eq '#{@attributes[attribute]}'"]
27
+ end
28
+ end
29
+
30
+ def apply_filters
31
+ return unless @filters
32
+ @filters.each do |filter|
33
+ @query << base_filter(filter)
34
+ end
35
+ end
36
+
37
+ def basic_identifier_uri
38
+ "#{base_path}(guid'#{id}')"
39
+ end
40
+
41
+ def apply_order
42
+ @query << ["$order_by", Utils.camelize(@order_by.to_s)] if @order_by
43
+ end
44
+
45
+ def apply_select
46
+ @query << ["$select", (@select.map { |s| Utils.camelize(s) }.join(","))] if @select
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,48 @@
1
+ module Elmas
2
+ module Utils
3
+ def self.demodulize(class_name_in_module)
4
+ class_name_in_module.to_s.sub(/^.*::/, "")
5
+ end
6
+
7
+ def self.pluralize(word)
8
+ word.to_s.sub(/([^s])$/, '\1s')
9
+ end
10
+
11
+ def self.modulize(class_name)
12
+ "Elmas::#{class_name}"
13
+ end
14
+
15
+ def self.collection_path(class_name)
16
+ (Utils.pluralize Utils.demodulize class_name).downcase
17
+ end
18
+
19
+ def self.camelize(word, uppercase_first_letter = true)
20
+ if uppercase_first_letter
21
+ word.to_s.gsub(%r{/\/(.?)/}) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
22
+ else
23
+ word[0] + Utils.camelize(word)[1..-1]
24
+ end
25
+ end
26
+
27
+ def self.normalize_hash_key(key)
28
+ if key.is_a? String
29
+ key = key.gsub(/::/, "/")
30
+ key = key.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
31
+ key = key.gsub(/([a-z\d])([A-Z])/, '\1_\2')
32
+ key = key.tr("-", "_")
33
+ key = key.downcase
34
+ return key.to_sym
35
+ end
36
+ key
37
+ end
38
+
39
+ def self.normalize_hash(hash)
40
+ Hash[hash.map { |k, v| [Utils.normalize_hash_key(k), v] }]
41
+ end
42
+
43
+ def self.parse_key(key)
44
+ "VATCode" if key.downcase == "vat_code"
45
+ Utils.camelize(key)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,13 @@
1
+ module Elmas
2
+ class Version
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+
7
+ class << self
8
+ def to_s
9
+ [MAJOR, MINOR, PATCH].compact.join(".")
10
+ end
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,264 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elmas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Marthyn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.10'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0.8'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.10'
33
+ - !ruby/object:Gem::Dependency
34
+ name: mechanize
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '='
38
+ - !ruby/object:Gem::Version
39
+ version: 2.6.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '='
45
+ - !ruby/object:Gem::Version
46
+ version: 2.6.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.9'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.9'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: simplecov
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov-rcov
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: webmock
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.6'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.6'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubycritic
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 1.4.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 1.4.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: guard-rspec
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: guard-rubocop
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: mutant-rspec
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: dotenv
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ description:
202
+ email:
203
+ - MarthynOlthof@hoppinger.nl
204
+ executables: []
205
+ extensions: []
206
+ extra_rdoc_files: []
207
+ files:
208
+ - ".gitignore"
209
+ - ".rspec"
210
+ - ".rubocop.yml"
211
+ - ".travis.yml"
212
+ - Gemfile
213
+ - Guardfile
214
+ - README.md
215
+ - Rakefile
216
+ - bin/console
217
+ - bin/setup
218
+ - elmas.gemspec
219
+ - jenkins.sh
220
+ - lib/elmas.rb
221
+ - lib/elmas/api.rb
222
+ - lib/elmas/client.rb
223
+ - lib/elmas/config.rb
224
+ - lib/elmas/exception.rb
225
+ - lib/elmas/log.rb
226
+ - lib/elmas/oauth.rb
227
+ - lib/elmas/parser.rb
228
+ - lib/elmas/request.rb
229
+ - lib/elmas/resource.rb
230
+ - lib/elmas/resources/account.rb
231
+ - lib/elmas/resources/contact.rb
232
+ - lib/elmas/resources/invoice.rb
233
+ - lib/elmas/resources/invoice_line.rb
234
+ - lib/elmas/resources/item.rb
235
+ - lib/elmas/resources/journal.rb
236
+ - lib/elmas/response.rb
237
+ - lib/elmas/uri.rb
238
+ - lib/elmas/utils.rb
239
+ - lib/elmas/version.rb
240
+ homepage: https://www.hoppinger.com
241
+ licenses:
242
+ - MIT
243
+ metadata: {}
244
+ post_install_message:
245
+ rdoc_options: []
246
+ require_paths:
247
+ - lib
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ requirements: []
259
+ rubyforge_project:
260
+ rubygems_version: 2.4.5
261
+ signing_key:
262
+ specification_version: 4
263
+ summary: API wrapper for Exact Online
264
+ test_files: []