okay 2.0.0 → 3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 821cdf5fa5035a799e732e2988fee9ec3666155a
4
- data.tar.gz: dd1f9595882d529f39e18e6bb7205637b555c05d
2
+ SHA256:
3
+ metadata.gz: 9995a83167cde5a2a18a0ae55c1db1492f4c6ee8642658879f0ab3ca8ed33ad3
4
+ data.tar.gz: 796de237563159535c7e8493b4cc1a41badcffd9b21888ff3faa3110f2842de1
5
5
  SHA512:
6
- metadata.gz: df138d22cd54965b5c7e788a99a5c09d4b8952dc13026e0f6d3190529e503f50e34798e4c37f21b2976384dc6977b31bdb519d6d987ac2d910180cda102c0bfb
7
- data.tar.gz: f5bde4d3e7b9863580717bdd3c5c892c88e518eae484a5892ae3fd61e778d06bd7fcb6d4bd50655a630e93fd97f83ce851aedfef672eab6bb18d0e9e2917d8ca
6
+ metadata.gz: a9ec2986376209d09718a1eb1583385595f4eb623022c6d05e801dd0c6de811f413dd62337b35a477d2718cdc415eeb092f6bdaba2633a90256865010712800f
7
+ data.tar.gz: ba34fcc968de9b609509510596e687e25bbdc339e1bcf64fc9c4b9b3c5a119704d123069967f2b1b0b6f99a5ad765c6084495af981ef21c98025b3a845a515e8
data/README.md CHANGED
@@ -8,8 +8,7 @@ Goals:
8
8
 
9
9
  * Concise, but easy-to-understand code.
10
10
  * Be reasonably robust, but don't chase every potential edgecase. Handle
11
- them as they come, and try to find a way to the code easy to
12
- understand.
11
+ them as they come.
13
12
  * Well-documented codebase.
14
13
  * Document known limitations, not just features.
15
14
  * Document tests, not just the implementation.
@@ -23,17 +22,6 @@ or ask questions if you aren't sure it'll work for your usecase.
23
22
  If it doesn't, I may decide I want to add support for it, or be able to
24
23
  help you find something that works for you!
25
24
 
26
- ## Utilities
27
-
28
- Currently implemented utilities:
29
-
30
- * HTTP fetcher.
31
- * `GET` requests implemented.
32
- * `POST` requests implemented.
33
- * Other types of requests should be fairly easy to add, but haven't
34
- been added.
35
- * TLS is supported, using [`openssl/better_defaults`](https://github.com/duckinator/openssl-better_defaults/) to improve security on old Ruby versions.
36
-
37
25
  ## Installation
38
26
 
39
27
  Add this line to your application's Gemfile:
@@ -54,6 +42,11 @@ Or install it yourself as:
54
42
 
55
43
  ### HTTP
56
44
 
45
+ * `GET` and `POST` requests supported.
46
+ * TLS is supported, using [`openssl/better_defaults`](https://github.com/duckinator/openssl-better_defaults/) to improve security on old Ruby versions.
47
+ * Does not handle HTTP 307 redirects correctly. (Because it changes it to a GET
48
+ request.)
49
+
57
50
  ```ruby
58
51
  require 'okay/http'
59
52
 
data/lib/okay/http.rb CHANGED
@@ -11,16 +11,17 @@ class Okay
11
11
  #
12
12
  # @param url [String] The URL to request.
13
13
  # @param parameters [Hash] A hash representing a query string.
14
- def self.get(url, parameters: {})
15
- send_request(:Get, url, parameters, nil)
14
+ def self.get(url, parameters: {}, headers: {})
15
+ send_request(:Get, url, parameters, nil, headers)
16
16
  end
17
17
 
18
18
  # Make an HTTP POST request.
19
19
  #
20
20
  # @param url [String] The URL to request.
21
- # @param data [String] Raw data to for the body of the POST request.
22
- # @param form_data [Hash] Form data, treated as though.
23
- def self.post(url, data: nil, form_data: nil)
21
+ # @param data [String] Raw data to for the body of the request.
22
+ # @param form_data [Hash] Data for the request body, encoded as though it
23
+ # were a form.
24
+ def self.post(url, data: nil, form_data: nil, headers: {})
24
25
  if !data.nil? && !form_data.nil?
25
26
  raise ArgumentError, "cannot specify data and form_data arguments simultaneously."
26
27
  end
@@ -31,11 +32,19 @@ class Okay
31
32
  body = URI.encode_www_form(form_data)
32
33
  end
33
34
 
34
- send_request(:Post, url, nil, body)
35
+ send_request(:Post, url, nil, body, headers)
35
36
  end
36
37
 
37
- def self.send_request(http_method, url, parameters, body, limit = DEFAULT_REDIRECT_LIMIT)
38
- if limit <= 0
38
+ # Helper method for actually creating a request.
39
+ #
40
+ # @param http_method [Symbol] A symbol representing the class name for
41
+ # +Net::HTTP+. E.g., +:Get+ for GET requests, +:Post+ for POST, etc.
42
+ # @param url [String] URL for the request.
43
+ # @param parameters [Hash, nil] Request parameters (for the query string).
44
+ # @param body [String, nil] Request body.
45
+ # @param redirect_limit [Numeric] The maximum number of redirects allowed.
46
+ def self.send_request(http_method, url, parameters, body, headers, redirect_limit = DEFAULT_REDIRECT_LIMIT)
47
+ if redirect_limit <= 0
39
48
  raise RedirectLimitError, "request exceeded redirect limit"
40
49
  end
41
50
 
@@ -57,8 +66,13 @@ class Okay
57
66
  # E.g., if it's a post request, this returns Net::HTTP::Post.
58
67
  request_class = Net::HTTP.const_get(http_method)
59
68
 
60
- # Create the request object, but don't send it yet.
69
+ # Create the request object, but don't send it.
61
70
  request = request_class.new(uri)
71
+
72
+ headers.each do |k, v|
73
+ request[k] = v
74
+ end
75
+
62
76
  # Set the request body, if there is one.
63
77
  request.body = body unless body.nil?
64
78
 
@@ -66,24 +80,18 @@ class Okay
66
80
  response = http.request(request)
67
81
 
68
82
  # Handle responses.
69
- case response
70
- when Net::HTTPSuccess
71
- # Request succeeded; return the result.
72
- response
73
- when Net::HTTPRedirection
83
+ if response.is_a?(Net::HTTPRedirection)
74
84
  # Follow a redirect.
75
- # Decrements +limit+ while doing so, to avoid redirect loops.
76
- #
77
- # NOTE: This does not handle HTTP 307 correctly, as it always
78
- # changes to a GET request. https://httpstatuses.com/307
79
- send_request(:Get, response['location'], parameters, body, limit - 1)
85
+ # Decrements +redirect_limit+ while doing so, to avoid redirect loops.
86
+ # NOTE: Does not handle HTTP 307. https://httpstatuses.com/307
87
+ send_request(:Get, response['location'], parameters, body, headers, redirect_limit - 1)
80
88
  else
81
- # This seemingly-innocent method raises an exception if the request
82
- # isn't successful.
83
- response.value
89
+ response
84
90
  end
85
91
  end
86
92
  end
93
+
94
+ # Make +send_request+ a private method.
87
95
  private_class_method :send_request
88
96
  end
89
97
  end
data/lib/okay/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Okay
2
- VERSION = "2.0.0"
2
+ VERSION = "3.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: okay
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ellen Marie Dash
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-12 00:00:00.000000000 Z
11
+ date: 2017-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: openssl-better_defaults
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
108
  version: '0'
109
109
  requirements: []
110
110
  rubyforge_project:
111
- rubygems_version: 2.6.11
111
+ rubygems_version: 2.7.2
112
112
  signing_key:
113
113
  specification_version: 4
114
114
  summary: Okay, minimalist implementations of common utilities.