Skip to content

Commit 2bc2506

Browse files
committed
Implement request, response, disk resource
1 parent ce2b926 commit 2bc2506

File tree

11 files changed

+276
-23
lines changed

11 files changed

+276
-23
lines changed

docs/request.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
## Request
2+
3+
### DSL build request
4+
5+
```ruby
6+
req = Yadisk::Client::Request.get(
7+
url: 'https://httpbin.org/get',
8+
query: { 'hello' => 'world', 'other' => 'value' },
9+
headers: {
10+
'Content-Type' => 'application/json',
11+
'Accept': 'application/json',
12+
'User-Agent' => 'My User Agent'
13+
}
14+
)
15+
puts req.to_curl
16+
```
17+
18+
```ruby
19+
req = Yadisk::Client::Request.build(config: Yadisk::Client.configuration) do |r|
20+
r.method = :get
21+
r.url = 'https://httpbin.org/get'
22+
r.query = { 'hello' => 'world', 'other' => 'value' }
23+
r.headers = {
24+
'Content-Type' => 'application/json',
25+
'Accept': 'application/json',
26+
'User-Agent' => 'My User Agent'
27+
}
28+
end
29+
puts req.to_curl
30+
```

lib/yadisk.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
module Yadisk
5+
NAME = 'Yadisk'
56
end
67

78
require 'yadisk/version'

lib/yadisk/client/configuration.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
module Yadisk
44
class Client
55
class Configuration
6-
attr_accessor :oauth_token
6+
attr_accessor :oauth_token,
7+
:faraday_request_options,
8+
:faraday_logger
79

810
def initialize(oauth_token: nil)
911
@oauth_token = oauth_token

lib/yadisk/client/request.rb

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,104 @@
1+
require 'uri'
2+
require 'yadisk/client/request/curlify'
3+
require 'yadisk/client/request/http_faraday'
4+
15
module Yadisk
26
class Client
37
class Request
4-
# TODO
8+
include Curlify
9+
include HttpFaraday
10+
11+
attr_accessor :config,
12+
:method,
13+
:headers,
14+
:url,
15+
:query,
16+
:body,
17+
:file_io,
18+
:filepath,
19+
:filename,
20+
:file_type
21+
22+
def initialize(**params)
23+
@config = params[:config] || Client.configuration
24+
@method = params[:method]
25+
@headers = params[:headers]
26+
@url = params[:url]
27+
@query = params[:query]
28+
@body = params[:body]
29+
@file_io = params[:file_io]
30+
@filepath = params[:filepath]
31+
@filename = params[:filename]
32+
@file_type = params[:file_type]
33+
end
34+
35+
class << self
36+
def build(**params, &block)
37+
req = new(**params)
38+
yield req
39+
req
40+
end
41+
42+
def get(url:, query: nil, headers: {})
43+
build(method: :get) do |r|
44+
r.url = url
45+
r.headers = headers
46+
r.query = query
47+
end
48+
end
49+
50+
def post(url:, query: nil, headers: {}, body:)
51+
build(
52+
method: :post,
53+
url: url,
54+
query: query,
55+
headers: headers,
56+
body: body
57+
)
58+
end
59+
60+
def patch(url:, query: nil, headers: {}, body:)
61+
build(
62+
method: :patch,
63+
url: url,
64+
query: query,
65+
headers: headers,
66+
body: body
67+
)
68+
end
69+
70+
def put(url:, query: nil, headers: {}, body:)
71+
build(
72+
method: :put,
73+
url: url,
74+
query: query,
75+
headers: headers,
76+
body: body
77+
)
78+
end
79+
80+
def delete(url:, query: nil, headers: {}, body:)
81+
build(
82+
method: :delete,
83+
url: url,
84+
query: query,
85+
headers: headers,
86+
body: body
87+
)
88+
end
89+
end
90+
91+
def call
92+
perform_simple_request
93+
end
94+
95+
def to_s
96+
to_curl
97+
end
98+
99+
def inspect
100+
to_s
101+
end
5102
end
6103
end
7104
end

lib/yadisk/client/request/curlify.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module Yadisk
2+
class Client
3+
class Request
4+
module Curlify
5+
def to_curl
6+
case method
7+
when :get
8+
parts = ["curl -X GET '#{url}'"]
9+
parts << curl_query_str(indent: 0) if !query.nil? && !query.empty?
10+
parts << curl_header_str(indent: 2) if !headers.nil? && !headers.empty?
11+
parts.join(" \\\n#{curl_space_prefix(indent: 2)}")
12+
end
13+
end
14+
15+
def curl_space_prefix(indent: 2)
16+
"#{' ' * indent}"
17+
end
18+
19+
def curl_query_str(indent: 2)
20+
"#{curl_space_prefix(indent: indent)}-G -d '#{URI.encode_www_form(query)}'"
21+
end
22+
23+
def curl_header_str(indent: 2)
24+
headers
25+
.each_pair
26+
.map { |name, value| "-H '#{name}: #{value}'" }
27+
.join(" \\\n#{curl_space_prefix(indent: indent)}")
28+
end
29+
end
30+
end
31+
end
32+
end
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
module Yadisk
2+
class Client
3+
class Request
4+
module HttpFaraday
5+
def perform_simple_request
6+
faraday_resp = http_faraday.send(method) do |req|
7+
req.url url
8+
req.params = query if !query.nil?
9+
req.headers = headers if !headers.nil? && !headers.empty?
10+
req.body = body if !body.nil?
11+
end
12+
13+
Response.build do |resp|
14+
resp.request = self
15+
resp.status_code = faraday_resp.env.status
16+
resp.status_reason = faraday_resp.env.reason_phrase
17+
resp.headers = faraday_resp.headers
18+
resp.body = faraday_resp.body
19+
end
20+
end
21+
22+
def http_faraday
23+
@_http_faraday ||= Faraday.new(http_faraday_connection_options) do |builder|
24+
http_faraday_build(builder)
25+
end
26+
end
27+
28+
def http_faraday_connection_options
29+
{
30+
request: {
31+
timeout: 30
32+
}.merge(config.faraday_request_options || {})
33+
}
34+
end
35+
36+
def http_faraday_build(builder)
37+
if config.faraday_logger
38+
case config.faraday_logger
39+
when Array
40+
builder.response :logger, *config.faraday_logger
41+
else
42+
builder.response :logger, config.faraday_logger
43+
end
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end

lib/yadisk/client/resources/resource.rb

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,9 @@ def paths = parent_resource.paths + [path]
1717

1818
def to_url = "#{parent_resource.to_url}/#{path}"
1919

20-
private
21-
22-
def default_headers
23-
{
24-
"Content-Type" => "application/json",
25-
"User-Agent" => user_agent
26-
}
27-
end
28-
29-
def user_agent
30-
"Yadisk/#{Yadisk::VERSION}"
20+
def build_request(**params, &block)
21+
request_params = { config: client.config }.merge(params)
22+
Request.build(**request_params, &block)
3123
end
3224
end
3325
end

lib/yadisk/client/resources/v1.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ def disk = @disk
2525
end
2626
end
2727

28+
require 'yadisk/client/resources/v1/helpers'
2829
require 'yadisk/client/resources/v1/disk'

lib/yadisk/client/resources/v1/disk.rb

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ class Client
55
module Resources
66
class V1
77
class Disk < Resource
8+
include HttpHeaders
9+
810
def path = 'disk'
911

10-
def call
11-
# Create Request
12+
def info(fields: nil)
1213
url = to_url
13-
headers = default_headers
14-
puts url
15-
puts headers
16-
puts client.config.oauth_token
17-
# headers = to_headers
18-
# Request.new(method: :get, url: url, headers: headers, query: query, body: body)
19-
Response.new # TODO
14+
query = { "fields" => fields }.compact
15+
headers = build_headers
16+
req = build_request(method: :get) do |r|
17+
r.url = url
18+
r.query = query
19+
r.headers = headers
20+
end
21+
resp = req.()
22+
2023
end
2124
end
2225
end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module Yadisk
2+
class Client
3+
module Resources
4+
class V1
5+
module HttpHeaders
6+
def user_agent
7+
"#{Yadisk::NAME}/#{Yadisk::VERSION}"
8+
end
9+
10+
def oauth_token
11+
client.config.oauth_token
12+
end
13+
14+
def default_headers
15+
{
16+
"Content-Type" => "application/json",
17+
"User-Agent" => user_agent
18+
}
19+
end
20+
21+
def auth_headers
22+
{
23+
"Authorization" => "OAuth #{oauth_token}"
24+
}
25+
end
26+
27+
def build_headers(headers = {}, with_auth: true)
28+
default_headers.then { |h| with_auth ? h.merge(auth_headers) : h }.merge(headers)
29+
end
30+
end
31+
end
32+
end
33+
end
34+
end

0 commit comments

Comments
 (0)