Skip to content

Commit

Permalink
Implement request, response, disk resource
Browse files Browse the repository at this point in the history
  • Loading branch information
Yegorov committed Jan 28, 2024
1 parent ce2b926 commit 2bc2506
Show file tree
Hide file tree
Showing 11 changed files with 276 additions and 23 deletions.
30 changes: 30 additions & 0 deletions docs/request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
## Request

### DSL build request

```ruby
req = Yadisk::Client::Request.get(
url: 'https://httpbin.org/get',
query: { 'hello' => 'world', 'other' => 'value' },
headers: {
'Content-Type' => 'application/json',
'Accept': 'application/json',
'User-Agent' => 'My User Agent'
}
)
puts req.to_curl
```

```ruby
req = Yadisk::Client::Request.build(config: Yadisk::Client.configuration) do |r|
r.method = :get
r.url = 'https://httpbin.org/get'
r.query = { 'hello' => 'world', 'other' => 'value' }
r.headers = {
'Content-Type' => 'application/json',
'Accept': 'application/json',
'User-Agent' => 'My User Agent'
}
end
puts req.to_curl
```
1 change: 1 addition & 0 deletions lib/yadisk.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# frozen_string_literal: true

module Yadisk
NAME = 'Yadisk'
end

require 'yadisk/version'
Expand Down
4 changes: 3 additions & 1 deletion lib/yadisk/client/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
module Yadisk
class Client
class Configuration
attr_accessor :oauth_token
attr_accessor :oauth_token,
:faraday_request_options,
:faraday_logger

def initialize(oauth_token: nil)
@oauth_token = oauth_token
Expand Down
99 changes: 98 additions & 1 deletion lib/yadisk/client/request.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,104 @@
require 'uri'
require 'yadisk/client/request/curlify'
require 'yadisk/client/request/http_faraday'

module Yadisk
class Client
class Request
# TODO
include Curlify
include HttpFaraday

attr_accessor :config,
:method,
:headers,
:url,
:query,
:body,
:file_io,
:filepath,
:filename,
:file_type

def initialize(**params)
@config = params[:config] || Client.configuration
@method = params[:method]
@headers = params[:headers]
@url = params[:url]
@query = params[:query]
@body = params[:body]
@file_io = params[:file_io]
@filepath = params[:filepath]
@filename = params[:filename]
@file_type = params[:file_type]
end

class << self
def build(**params, &block)
req = new(**params)
yield req
req
end

def get(url:, query: nil, headers: {})
build(method: :get) do |r|
r.url = url
r.headers = headers
r.query = query
end
end

def post(url:, query: nil, headers: {}, body:)
build(
method: :post,
url: url,
query: query,
headers: headers,
body: body
)
end

def patch(url:, query: nil, headers: {}, body:)
build(
method: :patch,
url: url,
query: query,
headers: headers,
body: body
)
end

def put(url:, query: nil, headers: {}, body:)
build(
method: :put,
url: url,
query: query,
headers: headers,
body: body
)
end

def delete(url:, query: nil, headers: {}, body:)
build(
method: :delete,
url: url,
query: query,
headers: headers,
body: body
)
end
end

def call
perform_simple_request
end

def to_s
to_curl
end

def inspect
to_s
end
end
end
end
32 changes: 32 additions & 0 deletions lib/yadisk/client/request/curlify.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module Yadisk
class Client
class Request
module Curlify
def to_curl
case method
when :get
parts = ["curl -X GET '#{url}'"]
parts << curl_query_str(indent: 0) if !query.nil? && !query.empty?
parts << curl_header_str(indent: 2) if !headers.nil? && !headers.empty?
parts.join(" \\\n#{curl_space_prefix(indent: 2)}")
end
end

def curl_space_prefix(indent: 2)
"#{' ' * indent}"
end

def curl_query_str(indent: 2)
"#{curl_space_prefix(indent: indent)}-G -d '#{URI.encode_www_form(query)}'"
end

def curl_header_str(indent: 2)
headers
.each_pair
.map { |name, value| "-H '#{name}: #{value}'" }
.join(" \\\n#{curl_space_prefix(indent: indent)}")
end
end
end
end
end
49 changes: 49 additions & 0 deletions lib/yadisk/client/request/http_faraday.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
module Yadisk
class Client
class Request
module HttpFaraday
def perform_simple_request
faraday_resp = http_faraday.send(method) do |req|
req.url url
req.params = query if !query.nil?
req.headers = headers if !headers.nil? && !headers.empty?
req.body = body if !body.nil?
end

Response.build do |resp|
resp.request = self
resp.status_code = faraday_resp.env.status
resp.status_reason = faraday_resp.env.reason_phrase
resp.headers = faraday_resp.headers
resp.body = faraday_resp.body
end
end

def http_faraday
@_http_faraday ||= Faraday.new(http_faraday_connection_options) do |builder|
http_faraday_build(builder)
end
end

def http_faraday_connection_options
{
request: {
timeout: 30
}.merge(config.faraday_request_options || {})
}
end

def http_faraday_build(builder)
if config.faraday_logger
case config.faraday_logger
when Array
builder.response :logger, *config.faraday_logger
else
builder.response :logger, config.faraday_logger
end
end
end
end
end
end
end
14 changes: 3 additions & 11 deletions lib/yadisk/client/resources/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,9 @@ def paths = parent_resource.paths + [path]

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

private

def default_headers
{
"Content-Type" => "application/json",
"User-Agent" => user_agent
}
end

def user_agent
"Yadisk/#{Yadisk::VERSION}"
def build_request(**params, &block)
request_params = { config: client.config }.merge(params)
Request.build(**request_params, &block)
end
end
end
Expand Down
1 change: 1 addition & 0 deletions lib/yadisk/client/resources/v1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ def disk = @disk
end
end

require 'yadisk/client/resources/v1/helpers'
require 'yadisk/client/resources/v1/disk'
21 changes: 12 additions & 9 deletions lib/yadisk/client/resources/v1/disk.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,21 @@ class Client
module Resources
class V1
class Disk < Resource
include HttpHeaders

def path = 'disk'

def call
# Create Request
def info(fields: nil)
url = to_url
headers = default_headers
puts url
puts headers
puts client.config.oauth_token
# headers = to_headers
# Request.new(method: :get, url: url, headers: headers, query: query, body: body)
Response.new # TODO
query = { "fields" => fields }.compact
headers = build_headers
req = build_request(method: :get) do |r|
r.url = url
r.query = query
r.headers = headers
end
resp = req.()

end
end
end
Expand Down
34 changes: 34 additions & 0 deletions lib/yadisk/client/resources/v1/http_headers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module Yadisk
class Client
module Resources
class V1
module HttpHeaders
def user_agent
"#{Yadisk::NAME}/#{Yadisk::VERSION}"
end

def oauth_token
client.config.oauth_token
end

def default_headers
{
"Content-Type" => "application/json",
"User-Agent" => user_agent
}
end

def auth_headers
{
"Authorization" => "OAuth #{oauth_token}"
}
end

def build_headers(headers = {}, with_auth: true)
default_headers.then { |h| with_auth ? h.merge(auth_headers) : h }.merge(headers)
end
end
end
end
end
end
14 changes: 13 additions & 1 deletion lib/yadisk/client/response.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
module Yadisk
class Client
class Response
# TODO
attr_accessor :request,
:status_code,
:status_reason,
:headers,
:body

class << self
def build(&block)
resp = new
yield resp
resp
end
end
end
end
end

0 comments on commit 2bc2506

Please sign in to comment.