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.
- checksums.yaml +15 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +58 -0
- data/LICENSE.txt +20 -0
- data/README.md +304 -0
- data/itrp-client.gemspec +40 -0
- data/lib/itrp.rb +35 -0
- data/lib/itrp/ca-bundle.crt +3554 -0
- data/lib/itrp/client.rb +314 -0
- data/lib/itrp/client/attachments.rb +99 -0
- data/lib/itrp/client/multipart.rb +75 -0
- data/lib/itrp/client/response.rb +114 -0
- data/lib/itrp/client/version.rb +5 -0
- metadata +168 -0
@@ -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
|
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: []
|