Skip to content

Commit ce2b926

Browse files
committed
Implement base classes for yandex disk client
1 parent dee5b01 commit ce2b926

File tree

18 files changed

+334
-1
lines changed

18 files changed

+334
-1
lines changed

Gemfile.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ PLATFORMS
5353
DEPENDENCIES
5454
coveralls_reborn
5555
rspec (~> 3.9, < 4.0)
56+
simplecov
5657
yadisk!
5758

5859
BUNDLED WITH

bin/console

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ require 'faraday'
77
# You can add fixtures and/or initialization code here to make experimenting
88
# with your gem easier. You can also use a different console, if you like.
99

10+
require 'yadisk'
11+
1012
# (If you use this, don't forget to add pry to your Gemfile!)
1113
# require "pry"
1214
# Pry.start

lib/yadisk.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# encoding: utf-8
2+
# frozen_string_literal: true
23

34
module Yadisk
45
end
6+
7+
require 'yadisk/version'
8+
require 'yadisk/client'

lib/yadisk/client.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
require 'yadisk/client/configuration'
4+
require 'yadisk/client/resources'
5+
require 'yadisk/client/request'
6+
require 'yadisk/client/response'
7+
8+
module Yadisk
9+
class Client
10+
attr_reader :config
11+
12+
def initialize(config = nil)
13+
@config = config || self.class.configuration
14+
@v1 = Resources::V1.new(self)
15+
end
16+
17+
class << self
18+
def configuration
19+
@_configuration ||= Configuration.new
20+
end
21+
22+
def configure
23+
yield(configuration)
24+
end
25+
26+
def default
27+
new(configuration)
28+
end
29+
end
30+
31+
def v1 = @v1
32+
end
33+
end

lib/yadisk/client/configuration.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
module Yadisk
4+
class Client
5+
class Configuration
6+
attr_accessor :oauth_token
7+
8+
def initialize(oauth_token: nil)
9+
@oauth_token = oauth_token
10+
end
11+
12+
def self.build(&block)
13+
config = self.new
14+
block.call(config)
15+
config
16+
end
17+
end
18+
end
19+
end

lib/yadisk/client/request.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Yadisk
2+
class Client
3+
class Request
4+
# TODO
5+
end
6+
end
7+
end

lib/yadisk/client/resources.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
module Yadisk
4+
class Client
5+
module Resources
6+
end
7+
end
8+
end
9+
10+
require 'yadisk/client/resources/resource'
11+
require 'yadisk/client/resources/v1'
12+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
module Yadisk
4+
class Client
5+
module Resources
6+
class Resource
7+
attr_reader :client, :parent_resource
8+
9+
def initialize(client, parent_resource = nil)
10+
@client = client
11+
@parent_resource = parent_resource
12+
end
13+
14+
def path = nil
15+
16+
def paths = parent_resource.paths + [path]
17+
18+
def to_url = "#{parent_resource.to_url}/#{path}"
19+
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}"
31+
end
32+
end
33+
end
34+
end
35+
end

lib/yadisk/client/resources/v1.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# frozen_string_literal: true
2+
3+
module Yadisk
4+
class Client
5+
module Resources
6+
class V1 < Resource
7+
BASE_URL = 'https://cloud-api.yandex.net'
8+
9+
def initialize(*args)
10+
super
11+
@disk = Disk.new(client, self)
12+
end
13+
14+
def base_url = BASE_URL
15+
16+
def path = 'v1'
17+
18+
def paths = [path]
19+
20+
def to_url = "#{base_url}/#{path}"
21+
22+
def disk = @disk
23+
end
24+
end
25+
end
26+
end
27+
28+
require 'yadisk/client/resources/v1/disk'
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
module Yadisk
4+
class Client
5+
module Resources
6+
class V1
7+
class Disk < Resource
8+
def path = 'disk'
9+
10+
def call
11+
# Create Request
12+
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
20+
end
21+
end
22+
end
23+
end
24+
end
25+
end
26+

lib/yadisk/client/response.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Yadisk
2+
class Client
3+
class Response
4+
# TODO
5+
end
6+
end
7+
end

lib/yadisk/version.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module Yadisk
24
VERSION = '1.0.0.dev'
35
end

spec/spec_helper.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,17 @@
1414
#
1515
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
1616

17+
require 'simplecov'
1718
require 'coveralls'
18-
Coveralls.wear!
1919

20+
SimpleCov.formatters = [
21+
SimpleCov::Formatter::HTMLFormatter,
22+
Coveralls::SimpleCov::Formatter
23+
]
24+
SimpleCov.start
25+
# Coveralls.wear!
26+
27+
require 'yadisk'
2028

2129
RSpec.configure do |config|
2230
# rspec-expectations config goes here. You can use an alternate
@@ -102,6 +110,9 @@
102110
# as the one that triggered the failure.
103111
Kernel.srand config.seed
104112
=end
113+
114+
config.order = :random
115+
Kernel.srand config.seed
105116
end
106117

107118
RSpec.configure do |c|
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
RSpec.describe Yadisk::Client::Configuration do
2+
let(:oauth_token) { 'token123' }
3+
subject { described_class.new }
4+
5+
it "has empty oauth_token" do
6+
expect(subject.oauth_token).to be_nil
7+
end
8+
9+
context "initialize with .new" do
10+
subject { described_class.new(oauth_token: oauth_token) }
11+
12+
it "has oauth_token" do
13+
expect(subject.oauth_token).to eq(oauth_token)
14+
end
15+
end
16+
17+
context "initialize with .build method" do
18+
subject do
19+
described_class.build do |c|
20+
c.oauth_token = oauth_token
21+
end
22+
end
23+
24+
it "has oauth_token" do
25+
expect(subject.oauth_token).to eq(oauth_token)
26+
end
27+
end
28+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
RSpec.describe Yadisk::Client::Resources::V1::Disk do
2+
subject { described_class.new(client, parent) }
3+
let(:parent) { Yadisk::Client::Resources::V1.new(client) }
4+
let(:client) { Yadisk::Client.default }
5+
before do
6+
Yadisk::Client.configure do |c|
7+
c.oauth_token = 'token123'
8+
end
9+
end
10+
11+
after do
12+
Yadisk::Client.instance_eval do
13+
@_configuration = nil
14+
end
15+
end
16+
17+
it "#path" do
18+
expect(subject.path).to eq('disk')
19+
end
20+
21+
it "#paths" do
22+
expect(subject.paths).to match_array(['v1', 'disk'])
23+
end
24+
25+
it "#to_url" do
26+
expect(subject.to_url).to eq('https://cloud-api.yandex.net/v1/disk')
27+
end
28+
29+
it "#call" do
30+
expect(subject.call).to be_a(Yadisk::Client::Response)
31+
end
32+
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
RSpec.describe Yadisk::Client::Resources::V1 do
2+
subject { described_class.new(client) }
3+
let(:client) { Yadisk::Client.default }
4+
before do
5+
Yadisk::Client.configure do |c|
6+
c.oauth_token = 'token123'
7+
end
8+
end
9+
10+
after do
11+
Yadisk::Client.instance_eval do
12+
@_configuration = nil
13+
end
14+
end
15+
16+
it "#base_url" do
17+
expect(subject.base_url).to eq(Yadisk::Client::Resources::V1::BASE_URL)
18+
end
19+
20+
it "#path" do
21+
expect(subject.path).to eq('v1')
22+
end
23+
24+
it "#paths" do
25+
expect(subject.paths).to match_array(['v1'])
26+
end
27+
28+
it "#to_url" do
29+
expect(subject.to_url).to eq('https://cloud-api.yandex.net/v1')
30+
end
31+
32+
it "#disk" do
33+
expect(subject.disk).to be_a(Yadisk::Client::Resources::V1::Disk)
34+
end
35+
end

spec/yadisk/client_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
RSpec.describe Yadisk::Client do
2+
let(:default_client) { described_class.default }
3+
4+
it "has configure method" do
5+
expect(described_class).to respond_to(:configure)
6+
end
7+
8+
it "not empty config" do
9+
expect(default_client.config).not_to be_nil
10+
end
11+
12+
it "has empty oauth_token" do
13+
expect(default_client.config.oauth_token).to be_nil
14+
end
15+
16+
describe 'with default config' do
17+
let(:oauth_token) { 'y0_AgAAAAA' }
18+
before do
19+
described_class.configure do |c|
20+
c.oauth_token = oauth_token
21+
end
22+
end
23+
after do
24+
Yadisk::Client.instance_eval do
25+
@_configuration = nil
26+
end
27+
end
28+
29+
it "default client has correct oauth_token" do
30+
expect(default_client.config.oauth_token).to eq(oauth_token)
31+
end
32+
end
33+
34+
describe "with custom config" do
35+
let(:config1) { Yadisk::Client::Configuration.new(oauth_token: 'oauth_token1') }
36+
let(:config2) { Yadisk::Client::Configuration.new(oauth_token: 'oauth_token2') }
37+
38+
let(:client1) { described_class.new(config1) }
39+
let(:client2) { described_class.new(config2) }
40+
41+
it "client1 and client2 has different oauth tokens" do
42+
expect(client1.config.oauth_token).not_to eq(client2.config.oauth_token)
43+
end
44+
end
45+
46+
it "has v1 method" do
47+
expect(default_client).to respond_to(:v1)
48+
expect(default_client.v1).to be_a(Yadisk::Client::Resources::Resource)
49+
end
50+
end

yadisk.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ Gem::Specification.new do |s|
2626

2727
s.add_development_dependency 'rspec', '~> 3.9', '< 4.0'
2828
s.add_development_dependency 'coveralls_reborn'
29+
s.add_development_dependency 'simplecov'
2930
end
3031

0 commit comments

Comments
 (0)