itrp-client 1.0.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,114 @@
1
+ module Itrp
2
+ class Response
3
+ def initialize(request, response)
4
+ @request = request
5
+ @response = response
6
+ end
7
+
8
+ def request
9
+ @request
10
+ end
11
+
12
+ def response
13
+ @response
14
+ end
15
+ alias_method :raw, :response
16
+
17
+ def body
18
+ @response.body
19
+ end
20
+
21
+ # The JSON value, if single resource is queried this is a Hash, if multiple resources where queried it is an Array
22
+ # If the response is not +valid?+ it is a Hash with 'message' and optionally 'errors'
23
+ def json
24
+ return @json if defined?(@json)
25
+ # no body, no json
26
+ data = {message: @response.message.blank? ? 'empty body' : @response.message.strip} if @response.body.blank?
27
+ begin
28
+ data ||= JSON.parse(@response.body)
29
+ rescue ::Exception => e
30
+ data = { message: "Invalid JSON - #{e.message} for:\n#{@response.body}" }
31
+ end
32
+ # indifferent access to hashes
33
+ data = data.is_a?(Array) ? data.map(&:with_indifferent_access) : data.with_indifferent_access
34
+ # empty OK response is not seen as an error
35
+ data = {} if data.is_a?(Hash) && data.size == 1 && data[:message] == 'OK'
36
+ # prepend HTTP response code to message
37
+ data[:message] = "#{response.code}: #{data[:message]}" unless @response.is_a?(Net::HTTPSuccess)
38
+ @json = data
39
+ end
40
+
41
+ # the error message in case the response is not +valid?+
42
+ def message
43
+ @message ||= json.is_a?(Hash) ? json[:message] : nil
44
+ end
45
+
46
+ # +true+ if the server did not respond at all
47
+ def empty?
48
+ @response.body.nil?
49
+ end
50
+
51
+ # +true+ if no 'message' is given (and the JSON could be parsed)
52
+ def valid?
53
+ message.nil?
54
+ end
55
+ alias_method :success?, :valid?
56
+
57
+ # retrieve a value from the resource
58
+ # if the JSON value is an Array a array with the value for each resource will be given
59
+ # @param keys: a single key or a key-path separated by comma
60
+ def[](*keys)
61
+ values = json.is_a?(Array) ? json : [json]
62
+ keys.each { |key| values = values.map{ |value| value.is_a?(Hash) ? value[key] : nil} }
63
+ json.is_a?(Array) ? values : values.first
64
+ end
65
+
66
+ # The nr of resources found
67
+ def size
68
+ @size ||= message ? 0 : json.is_a?(Array) ? json.size : 1
69
+ end
70
+ alias :count :size
71
+
72
+ # pagination - per page
73
+ def per_page
74
+ @per_page ||= @response.header['X-Pagination-Per-Page'].to_i
75
+ end
76
+
77
+ # pagination - current page
78
+ def current_page
79
+ @current_page ||= @response.header['X-Pagination-Current-Page'].to_i
80
+ end
81
+
82
+ # pagination - total pages
83
+ def total_pages
84
+ @total_pages ||= @response.header['X-Pagination-Total-Pages'].to_i
85
+ end
86
+
87
+ # pagination - total entries
88
+ def total_entries
89
+ @total_entries ||= @response.header['X-Pagination-Total-Entries'].to_i
90
+ end
91
+
92
+ # pagination urls (full paths with server) - relations :first, :prev, :next, :last
93
+ # Link: <https://api.itrp.com/v1/requests?page=1&per_page=25>; rel="first", <https://api.itrp.com/v1/requests?page=2&per_page=25>; rel="prev", etc.
94
+ def pagination_link(relation)
95
+ # split on ',' select the [url] in '<[url]>; rel="[relation]"', compact to all url's found (at most one) and take the first
96
+ (@pagination_links ||= {})[relation] ||= @response.header['Link'] && @response.header['Link'].split(/,\s*<?/).map{ |link| link[/^\s*<?(.*?)>?;\s*rel="#{relation.to_s}"\s*$/, 1] }.compact.first
97
+ end
98
+
99
+ # pagination urls (relative paths without server) - relations :first, :prev, :next, :last
100
+ def pagination_relative_link(relation)
101
+ (@pagination_relative_links ||= {})[relation] ||= pagination_link(relation) && pagination_link(relation)[/^https?:\/\/[^\/]*(.*)/, 1]
102
+ end
103
+
104
+ # +true+ if the response is invalid because of throttling
105
+ def throttled?
106
+ !!(@response.code.to_s == '429' || (message && message =~ /Too Many Requests/))
107
+ end
108
+
109
+ def to_s
110
+ valid? ? json.to_s : message
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,5 @@
1
+ module Itrp
2
+ class Client
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,168 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: itrp-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - ITRP
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gem_config
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mime-types
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.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: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '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: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '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: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Client for accessing the ITRP REST API
126
+ email: developers@itrp.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - lib/itrp/ca-bundle.crt
132
+ - lib/itrp/client.rb
133
+ - lib/itrp/client/version.rb
134
+ - lib/itrp/client/response.rb
135
+ - lib/itrp/client/multipart.rb
136
+ - lib/itrp/client/attachments.rb
137
+ - lib/itrp.rb
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Gemfile
141
+ - Gemfile.lock
142
+ - itrp-client.gemspec
143
+ homepage: https://developer.itrp.com
144
+ licenses:
145
+ - MIT
146
+ metadata: {}
147
+ post_install_message:
148
+ rdoc_options:
149
+ - --charset=UTF-8
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: 1.9.3
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project:
164
+ rubygems_version: 2.1.11
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: Client for accessing the ITRP REST API
168
+ test_files: []