prest 0.1.6 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: baed86642c0c37f151d41d58a12e0bf73cc8be4441e42082dec217cbb921d957
4
- data.tar.gz: a506ed62ea0a49d24e5a10c2945b56a7e298114df36730d99f3fb3e3fb48d299
3
+ metadata.gz: accb2149cb0dacc0ad3fee732fb7bff9fb552d1bbea197118b29525fed9e24fe
4
+ data.tar.gz: b6cf166232aca1d97372acc0efdb8b8e952d4025159a638d55f779ea608e2276
5
5
  SHA512:
6
- metadata.gz: 3ad4dd9cd51bae9cc9626acc59fd1e114e4a666f367914b16af3135797842cf9f890a801fcc6f2509f01751c20368f15a139c53c49ab2f38b8840851146f30a0
7
- data.tar.gz: 3cad6750ed114c2e4abe01ca74ec5dc708f1ed298eab7694597dfd5f7fe2e19fae35667f5c3660059b42b438b0bc39257e5e1d4a3c8abbd0bc45c56abf66ba96
6
+ metadata.gz: a313c848c5bd26fd4210cdccfc0e6f79f07927dc59cca7417966ccac53c518b61f0d80c403cc6371c99c9453e21f8b08d1696af2774bbaba91945a7826c6ce48
7
+ data.tar.gz: 16364768bf1190a5bb884c44379873ef37841ae610d9d832b7fdc9742a13ca79601fd9442513342c8ceca4a92bfa1df27a61409488f3c6cdfe16a683a2815279
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- prest (0.1.6)
4
+ prest (0.1.8)
5
5
  httparty (~> 0.20.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -54,6 +54,48 @@ Prest::Client.new('https://example.com/api', { headers: { 'Authorization' => 'Be
54
54
  .post(body: { username: 'juan-apa' })
55
55
  ```
56
56
 
57
+ ### Using raw/custom/special query parameters
58
+
59
+ In ruby, duplicate keyword arguments on method calls are not accepted, so you **can not** do the following:
60
+
61
+ ```ruby
62
+ Prest::Client.new('https://example.com/api').example(key: 1, key: 2).get
63
+ # `key: 1` is overriden by `key: 2`;
64
+ # produces: GET https://example.com/api/one/two?key=2
65
+ ```
66
+
67
+ Because of this and other cases where formatting is very strict/unusual, you can pass a string which will not be formatted to the query parameters. To do this, use the following:
68
+
69
+ ```ruby
70
+ # GET https://example.com/api/example?key=1&key2&other=value
71
+ Prest::Client.new('https://example.com/api')
72
+ .example(__query_params: 'key=1&key=2', other: 'value')
73
+ .get
74
+ ```
75
+
76
+ The string passed to the keyword argument `__query_params` will not be formatted, and passed as is.
77
+
78
+ > **Warning**
79
+ > `__query_params` is the only keyword argument that can be repeated across method calls:
80
+
81
+ ```ruby
82
+ Prest::Client.new('https://example.com/api')
83
+ .one(key: '1')
84
+ .two(key: '2')
85
+ .get
86
+ # Produces: GET https://example.com/api/one/two?key=2
87
+ ```
88
+
89
+ However using `__query_params`:
90
+
91
+ ```ruby
92
+ Prest::Client.new('https://example.com/api')
93
+ .one(__query_params: 'key=1')
94
+ .two(__query_params: 'key=2')
95
+ .get
96
+ #Produces: GET https://example.com/api/one/two?key=1&key=2
97
+ ```
98
+
57
99
  ### Automatically adding the json headers
58
100
 
59
101
  Because some API's need a `Content-Type: application/json` and/or `Accept: application/json` headers, there's a built in option that can be passed to the client to add those for you:
@@ -70,18 +112,21 @@ Note: The option will merge any other header you pass to the initializer.
70
112
  ### Raising exceptions on failed HTTP requests
71
113
 
72
114
  An HTTP request is considered as failed when the status code is not between `100` and `299`.
73
- To automatically raise a `Prest::Error` when the HTTP request is not successful, use the bang methods (`get!`, `post!`, `put!`, `patch!` and `delete!`).
115
+ To automatically raise a `Prest::RequestError` when the HTTP request is not successful, use the bang methods (`get!`, `post!`, `put!`, `patch!` and `delete!`).
74
116
 
75
117
  ```ruby
76
118
  # If for example the authorization headers are invalid, it will return an 401 status code.
77
- # This call will raise a ::Prest::Error with the response as a json in the message.
119
+ # This call will raise a ::Prest::RequestError with the response as a json in the message.
78
120
 
79
121
  begin
80
122
  Prest::Client.new('https://example.com/api', { headers: { 'Authorization' => 'Bearer Token xxxyyyzzz' } })
81
123
  .users
82
124
  .get!
83
- rescue Prest::Error => e
125
+ rescue Prest::RequestError => e
84
126
  puts e.message # "{ error: \"Invalid auth credentials\" }"
127
+ puts e.status # 403
128
+ puts e.body # "{ error: \"Invalid auth credentials\" }"
129
+ puts e.headers # { 'ContentType' => 'application/json' }
85
130
  end
86
131
  ```
87
132
 
data/lib/prest/client.rb CHANGED
@@ -36,12 +36,19 @@ module Prest
36
36
  res = ::HTTParty.send(http_method, build_url, headers: headers, body: body)
37
37
  ::Prest::Response.new(res.code, res.parsed_response, res.headers)
38
38
  rescue ::HTTParty::ResponseError => e
39
- ::Kernel.raise ::Prest::Error, e.message
39
+ ::Kernel.raise(::Prest::RequestError.new(status: res.status,
40
+ body: res.parsed_response,
41
+ headers: res.headers), e.message)
40
42
  end
41
43
 
42
44
  def execute_query!(*args, **kwargs)
43
45
  res = execute_query(*args, **kwargs)
44
- ::Kernel.raise ::Prest::Error, res.body.to_json unless res.successful?
46
+
47
+ unless res.successful?
48
+ ::Kernel.raise(::Prest::RequestError.new(status: res.status,
49
+ body: res.body.to_json,
50
+ headers: res.headers), res.body.to_json)
51
+ end
45
52
 
46
53
  res
47
54
  end
@@ -49,7 +56,10 @@ module Prest
49
56
  def chain_fragment(fragment_name, *args, **kwargs)
50
57
  arguments = args.join('/')
51
58
  parsed_args = arguments.empty? ? '' : "/#{arguments}"
52
- @query_params.merge!(kwargs)
59
+ extract_raw_query_params!(kwargs)
60
+ dup_kwargs = kwargs.dup
61
+ dup_kwargs.delete(:__query_params)
62
+ @query_params.merge!(dup_kwargs)
53
63
  @fragments << "#{fragment_name.gsub("__", "-")}#{parsed_args}"
54
64
  end
55
65
 
@@ -62,13 +72,26 @@ module Prest
62
72
  def build_url
63
73
  path = @fragments.join('/')
64
74
 
65
- stringified_params = ''
66
- @query_params.to_a.each do |key_val|
67
- stringified_params += "#{key_val[0]}=#{key_val[1]}&"
68
- end
75
+ stringified_params = @query_params.to_a.map do |key_val|
76
+ key_val[0] == :__query_params ? key_val[1].join('&') : "#{key_val[0]}=#{key_val[1]}"
77
+ end.join('&')
69
78
 
70
- stringified_params = stringified_params.empty? ? '' : "?#{stringified_params[0..-2]}"
79
+ stringified_params = stringified_params.empty? ? '' : "?#{stringified_params}"
71
80
  "#{@base_uri}/#{path}#{stringified_params}"
72
81
  end
82
+
83
+ def array_wrap(obj)
84
+ obj.is_a?(::Array) ? obj : [obj]
85
+ end
86
+
87
+ def extract_raw_query_params!(kwargs)
88
+ return unless kwargs.key?(:__query_params)
89
+
90
+ @query_params[:__query_params] = if @query_params[:__query_params].is_a?(::Array)
91
+ @query_params[:__query_params] + array_wrap(kwargs[:__query_params])
92
+ else
93
+ array_wrap(kwargs[:__query_params])
94
+ end
95
+ end
73
96
  end
74
97
  end
data/lib/prest/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prest
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.8'
5
5
  end
data/lib/prest.rb CHANGED
@@ -8,4 +8,16 @@ require_relative 'prest/response'
8
8
 
9
9
  module Prest
10
10
  class Error < StandardError; end
11
+
12
+ # Error for when a request is unsuccessful.
13
+ class RequestError < StandardError
14
+ attr_reader :status, :body, :headers
15
+
16
+ def initialize(status:, body: '', headers: {})
17
+ super()
18
+ @status = status
19
+ @body = body
20
+ @headers = headers
21
+ end
22
+ end
11
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Aparicio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-02 00:00:00.000000000 Z
11
+ date: 2023-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty