Skip to content

Commit 42679f8

Browse files
First complete working version
1 parent 8e94666 commit 42679f8

File tree

6 files changed

+282
-0
lines changed

6 files changed

+282
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ build/
3434

3535
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
3636
.rvmrc
37+
.env

Rakefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'rake/testtask'
2+
3+
Rake::TestTask.new do |t|
4+
t.libs << 'test'
5+
end
6+
7+
desc "Run tests"
8+
task :default => :test

examples/example.rb

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
require_relative '../lib/config'
2+
require_relative '../lib/ruby_http_client'
3+
4+
Config.new
5+
headers = JSON.parse('
6+
{
7+
"Authorization": "Bearer ' + ENV['SENDGRID_API_KEY'] + '",
8+
"Content-Type": "application/json"
9+
}
10+
')
11+
host = ENV['HOST']
12+
client = SendGrid::Client.new(host: host, request_headers: headers)
13+
14+
# GET Collection
15+
query_params = {"limit" => 100, "offset" => 0}
16+
response = client.version('v3').api_keys.get(query_params: query_params)
17+
puts response.status_code
18+
puts response.response_body
19+
puts response.response_headers
20+
21+
# POST
22+
request_body = JSON.parse('
23+
{
24+
"name": "My API Key Ruby Test",
25+
"scopes": [
26+
"mail.send",
27+
"alerts.create",
28+
"alerts.read"
29+
]
30+
}
31+
')
32+
response = client.version('v3').api_keys.post(request_body: request_body)
33+
puts response.status_code
34+
puts response.response_body
35+
puts response.response_headers
36+
api_key_id = JSON.parse(response.response_body)["api_key_id"]
37+
38+
# GET Single
39+
response = client.version('v3').api_keys._(api_key_id).get()
40+
puts response.status_code
41+
puts response.response_body
42+
puts response.response_headers
43+
44+
# PATCH
45+
request_body = JSON.parse('
46+
{
47+
"name": "A New Hope"
48+
}
49+
')
50+
response = client.api_keys._(api_key_id).patch(request_body: request_body)
51+
puts response.status_code
52+
puts response.response_body
53+
puts response.response_headers
54+
55+
# PUT
56+
request_body = JSON.parse('
57+
{
58+
"name": "A New Hope",
59+
"scopes": [
60+
"user.profile.read",
61+
"user.profile.update"
62+
]
63+
}
64+
')
65+
response = client.api_keys._(api_key_id).put(request_body: request_body)
66+
puts response.status_code
67+
puts response.response_body
68+
puts response.response_headers
69+
70+
# DELETE
71+
response = client.api_keys._(api_key_id).delete()
72+
puts response.status_code
73+
puts response.response_headers

lib/config.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Config
2+
def initialize()
3+
File.open("./.env").readlines.each do |line|
4+
key, value = line.split "="
5+
ENV[key] = value.chomp
6+
end
7+
return ENV
8+
end
9+
end

lib/ruby_http_client.rb

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
require 'json'
2+
require 'net/http'
3+
require 'net/https'
4+
5+
module SendGrid
6+
class Response
7+
def initialize(response)
8+
@status_code = response.code
9+
@response_body = response.body
10+
@response_headers = response.to_hash.inspect
11+
end
12+
13+
def status_code
14+
@status_code
15+
end
16+
17+
def response_body
18+
@response_body
19+
end
20+
21+
def response_headers
22+
@response_headers
23+
end
24+
end
25+
26+
class Client
27+
attr_reader :host, :request_headers, :url_path
28+
def initialize(host:, request_headers: nil, version: nil, url_path: nil)
29+
@host = host
30+
@request_headers = request_headers ? request_headers : {}
31+
@version = version
32+
@url_path = url_path ? url_path : []
33+
@methods = ["delete", "get", "patch", "post", "put"]
34+
end
35+
36+
def update_headers(request_headers)
37+
@request_headers = @request_headers.merge(request_headers)
38+
end
39+
40+
def build_url(query_params: nil)
41+
url = ''
42+
if @version
43+
url.concat("/#{@version}")
44+
end
45+
@url_path.each do |x|
46+
url.concat("/#{x}")
47+
end
48+
if query_params
49+
url.concat("?")
50+
count = 0
51+
query_params.each do |key, value|
52+
if count > 0
53+
url.concat("&")
54+
end
55+
url.concat("#{key}=#{value}")
56+
count = count +1
57+
end
58+
end
59+
return "#{@host}#{url}"
60+
end
61+
62+
def _(name = nil)
63+
url_path = name ? @url_path.push(name) : @url_path
64+
@url_path = []
65+
return Client.new(host: @host, request_headers: @request_headers, version: @version, url_path: url_path)
66+
end
67+
68+
def make_request(http, request)
69+
response = http.request(request)
70+
return Response.new(response)
71+
end
72+
73+
def method_missing(name, *args, &block)
74+
75+
if name.to_s == "version"
76+
@version = args[0]
77+
return self._()
78+
end
79+
80+
if @methods.include?(name.to_s)
81+
query_params = nil
82+
request_body = nil
83+
args.each do |value|
84+
value.each do |key, value|
85+
case key.to_s
86+
when "query_params"
87+
query_params = value
88+
when "request_headers"
89+
self.update_headers(value)
90+
when "request_body"
91+
request_body = value
92+
else
93+
end
94+
end
95+
end
96+
uri = URI.parse(self.build_url(query_params: query_params))
97+
http = Net::HTTP.new(uri.host, uri.port)
98+
protocol = host.split(":")[0]
99+
if protocol == "https"
100+
http.use_ssl = true
101+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
102+
end
103+
net_http = Kernel.const_get('Net::HTTP::' + name.to_s.capitalize)
104+
request = net_http.new(uri.request_uri)
105+
@request_headers.each do |key, value|
106+
request[key] = value
107+
end
108+
if request_body
109+
request.body = request_body.to_json
110+
end
111+
return self.make_request(http, request)
112+
end
113+
114+
return self._(name)
115+
end
116+
end
117+
end

test/test_ruby_http_client.rb

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
require_relative '../lib/config'
2+
require_relative '../lib/ruby_http_client'
3+
require 'minitest/autorun'
4+
5+
class MockResponse
6+
attr_reader :status_code, :response_body, :response_headers
7+
8+
def initialize(response)
9+
@status_code = response['code']
10+
@response_body = response['body']
11+
@response_headers = response['headers']
12+
end
13+
end
14+
15+
class MockRequest < SendGrid::Client
16+
def make_request(http, request)
17+
response = {}
18+
response['code'] = 200
19+
response['body'] = {"message": "success"}
20+
response['headers'] = {"headers" => "test"}
21+
return MockResponse.new(response)
22+
end
23+
end
24+
25+
class TestClient < Minitest::Test
26+
def setup
27+
@headers = JSON.parse('
28+
{
29+
"Authorization": "Bearer XXXXXXX",
30+
"Content-Type": "application/json"
31+
}
32+
')
33+
@host = 'http://localhost:4010'
34+
@version = 'v3'
35+
@client = MockRequest.new(host: @host, request_headers: @headers, version: @version)
36+
end
37+
38+
def test_init
39+
assert_equal(@host, @client.host)
40+
assert_equal(@headers, @client.request_headers)
41+
end
42+
43+
def test_update_headers
44+
request_headers = {"X-Test" => "test"}
45+
@client.update_headers(request_headers)
46+
assert_equal(@headers.merge(request_headers), @client.request_headers)
47+
end
48+
49+
def test_url_builder
50+
url1 = @client.my.path.to.the.endpoint
51+
params = {"limit" => 100, "offset" => 0}
52+
assert_equal(url1.build_url(query_params: params), @host + "/" + @version + "/my/path/to/the/endpoint?limit=100&offset=0")
53+
54+
url1 = url1.one_more
55+
params = {"limit" => 100, "offset" => 0}
56+
assert_equal(url1.build_url(query_params: params), @host + "/" + @version + "/my/path/to/the/endpoint/one_more?limit=100&offset=0")
57+
58+
url2 = @client.my.path._("to").the.endpoint
59+
params = {"limit" => 100, "offset" => 0}
60+
assert_equal(url2.build_url(query_params: params), @host + "/" + @version + "/my/path/to/the/endpoint?limit=100&offset=0")
61+
end
62+
63+
def test__
64+
url1 = @client._("test")
65+
assert_equal(url1.url_path, ["test"])
66+
end
67+
68+
def test_method_missing
69+
response = @client.get()
70+
assert_equal(response.status_code, 200)
71+
assert_equal(response.response_body, {"message": "success"})
72+
assert_equal(response.response_headers, {"headers" => "test"})
73+
end
74+
end

0 commit comments

Comments
 (0)