dribbble 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +33 -0
- data/.travis.yml +3 -6
- data/CHANGELOG.md +58 -0
- data/Gemfile +10 -0
- data/Guardfile +4 -2
- data/README.md +44 -285
- data/Rakefile +2 -0
- data/dribbble.gemspec +10 -8
- data/lib/dribbble.rb +3 -1
- data/lib/dribbble/attachment.rb +9 -1
- data/lib/dribbble/base.rb +3 -1
- data/lib/dribbble/client.rb +5 -30
- data/lib/dribbble/errors.rb +3 -3
- data/lib/dribbble/project.rb +10 -2
- data/lib/dribbble/shot.rb +3 -33
- data/lib/dribbble/user.rb +1 -51
- data/lib/dribbble/utils.rb +5 -3
- data/lib/dribbble/utils/creatable.rb +3 -1
- data/lib/dribbble/utils/deletable.rb +3 -1
- data/lib/dribbble/utils/findable.rb +2 -0
- data/lib/dribbble/utils/has_children.rb +16 -12
- data/lib/dribbble/utils/updatable.rb +2 -0
- data/lib/dribbble/version.rb +3 -1
- data/spec/lib/dribbble/base_spec.rb +10 -8
- data/spec/lib/dribbble/client_spec.rb +16 -69
- data/spec/lib/dribbble/project_spec.rb +52 -16
- data/spec/lib/dribbble/shot_spec.rb +14 -197
- data/spec/lib/dribbble/user_spec.rb +5 -175
- data/spec/spec_helper.rb +5 -3
- data/spec/support/dribbble_api.rb +17 -88
- data/spec/support/fixtures/current_user_success.json +35 -24
- data/spec/support/fixtures/project_success.json +1 -1
- data/spec/support/fixtures/projects_accepted.json +8 -0
- data/spec/support/fixtures/projects_deleted.json +8 -0
- data/spec/support/fixtures/projects_success.json +1 -1
- data/spec/support/fixtures/projects_updated.json +8 -0
- data/spec/support/fixtures/shot_success.json +16 -16
- data/spec/support/fixtures/shot_updated.json +78 -78
- data/spec/support/fixtures/shots_success.json +81 -103
- data/spec/support/fixtures/user_success.json +35 -24
- metadata +33 -67
- data/lib/dribbble/bucket.rb +0 -33
- data/lib/dribbble/comment.rb +0 -29
- data/lib/dribbble/like.rb +0 -7
- data/lib/dribbble/team.rb +0 -6
- data/spec/lib/dribbble/bucket_spec.rb +0 -136
- data/spec/lib/dribbble/comment_spec.rb +0 -77
- data/spec/lib/dribbble/team_spec.rb +0 -43
- data/spec/support/fixtures/attachments_success.json +0 -11
- data/spec/support/fixtures/bucket_created.json +0 -8
- data/spec/support/fixtures/bucket_success.json +0 -8
- data/spec/support/fixtures/bucket_updated.json +0 -8
- data/spec/support/fixtures/buckets_success.json +0 -10
- data/spec/support/fixtures/comment_created.json +0 -38
- data/spec/support/fixtures/comment_likes_success.json +0 -40
- data/spec/support/fixtures/comment_success.json +0 -38
- data/spec/support/fixtures/comment_updated.json +0 -38
- data/spec/support/fixtures/comments_success.json +0 -37
- data/spec/support/fixtures/followers_success.json +0 -33
- data/spec/support/fixtures/following_success.json +0 -33
- data/spec/support/fixtures/shot_likes_success.json +0 -33
- data/spec/support/fixtures/team_success.json +0 -26
- data/spec/support/fixtures/teams_success.json +0 -28
- data/spec/support/fixtures/user_likes_success.json +0 -91
- data/spec/support/fixtures/users_success.json +0 -27
data/Rakefile
CHANGED
data/dribbble.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require File.expand_path('lib/dribbble/version', __dir__)
|
2
4
|
|
3
5
|
Gem::Specification.new do |s|
|
4
6
|
s.name = 'dribbble'
|
@@ -14,12 +16,12 @@ Gem::Specification.new do |s|
|
|
14
16
|
s.files = `git ls-files`.split("\n")
|
15
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
18
|
|
17
|
-
s.required_ruby_version = '>= 2.0.0'
|
18
|
-
s.add_runtime_dependency 'rest-client', '~>
|
19
|
+
s.required_ruby_version = ['>= 2.5.0', '< 3.0']
|
20
|
+
s.add_runtime_dependency 'rest-client', '~> 2.0'
|
19
21
|
|
20
|
-
s.add_development_dependency '
|
21
|
-
s.add_development_dependency '
|
22
|
-
s.add_development_dependency '
|
23
|
-
s.add_development_dependency 'sinatra', '~> 1
|
24
|
-
s.add_development_dependency 'webmock', '~>
|
22
|
+
s.add_development_dependency 'guard-rspec', '~> 4.7'
|
23
|
+
s.add_development_dependency 'rake', '~> 12.3.3'
|
24
|
+
s.add_development_dependency 'rspec', '~> 3.10'
|
25
|
+
s.add_development_dependency 'sinatra', '~> 2.1'
|
26
|
+
s.add_development_dependency 'webmock', '~> 3.13'
|
25
27
|
end
|
data/lib/dribbble.rb
CHANGED
data/lib/dribbble/attachment.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dribbble/utils/creatable'
|
4
|
+
require 'dribbble/utils/deletable'
|
5
|
+
|
1
6
|
module Dribbble
|
2
7
|
class Attachment < Dribbble::Base
|
8
|
+
include Dribbble::Utils::Creatable
|
9
|
+
include Dribbble::Utils::Deletable
|
10
|
+
|
3
11
|
def self.available_fields
|
4
|
-
%i
|
12
|
+
%i[file]
|
5
13
|
end
|
6
14
|
end
|
7
15
|
end
|
data/lib/dribbble/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'dribbble/utils'
|
2
4
|
require 'dribbble/utils/has_children'
|
3
5
|
|
@@ -17,7 +19,7 @@ module Dribbble
|
|
17
19
|
@dribbble_url = build_dribbble_url(@raw['id'].to_s, dribbble_url)
|
18
20
|
|
19
21
|
@raw.each do |k, _v|
|
20
|
-
define_singleton_method(k) { @raw[k] } unless
|
22
|
+
define_singleton_method(k) { @raw[k] } unless respond_to?(k)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
data/lib/dribbble/client.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'dribbble/base'
|
4
|
+
require 'dribbble/shot'
|
2
5
|
require 'dribbble/user'
|
3
|
-
require 'dribbble/bucket'
|
4
6
|
require 'dribbble/project'
|
5
|
-
require 'dribbble/shot'
|
6
|
-
require 'dribbble/team'
|
7
7
|
require 'dribbble/errors'
|
8
8
|
|
9
9
|
require 'rest_client'
|
@@ -16,22 +16,8 @@ module Dribbble
|
|
16
16
|
def initialize(token = nil)
|
17
17
|
token = token.is_a?(Hash) ? token[:token] : token
|
18
18
|
@token = token
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# Get authenticated user's buckets
|
23
|
-
def buckets(attrs = {})
|
24
|
-
Dribbble::Bucket.batch_new token, html_get('/user/buckets', attrs)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Get authenticated user's followers
|
28
|
-
def followers(attrs = {})
|
29
|
-
Dribbble::User.batch_new token, html_get('/user/followers', attrs)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Get authenticated user's likes
|
33
|
-
def likes(attrs = {})
|
34
|
-
Dribbble::Shot.batch_new token, html_get('/user/likes', attrs), 'shot'
|
19
|
+
super(token, {})
|
20
|
+
raise Dribbble::Error::MissingToken if @token.nil?
|
35
21
|
end
|
36
22
|
|
37
23
|
# Get authenticated user's followers
|
@@ -44,17 +30,6 @@ module Dribbble
|
|
44
30
|
Dribbble::Shot.batch_new token, html_get('/user/shots', attrs)
|
45
31
|
end
|
46
32
|
|
47
|
-
# Get authenticated user's followees shots
|
48
|
-
# Limited to first 600 shots regardless of the pagination
|
49
|
-
def following_shots(attrs = {})
|
50
|
-
Dribbble::Shot.batch_new token, html_get('/user/following/shots', attrs)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Get authenticated user's teams
|
54
|
-
def teams(attrs = {})
|
55
|
-
Dribbble::Team.batch_new token, html_get('/user/teams', attrs)
|
56
|
-
end
|
57
|
-
|
58
33
|
# Get a single User or the authenticated one
|
59
34
|
def user
|
60
35
|
Dribbble::User.new @token, html_get('/user')
|
data/lib/dribbble/errors.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dribbble
|
2
4
|
module Error
|
3
|
-
ISSUES_URL = 'https://github.com/Calyhre/dribbble/issues/new'
|
4
|
-
|
5
5
|
# Standard error we will inherit
|
6
6
|
class Standard < StandardError
|
7
7
|
def initialize(message = nil)
|
8
|
-
if message
|
8
|
+
if message&.response
|
9
9
|
super message.response
|
10
10
|
else
|
11
11
|
super(message || self.message)
|
data/lib/dribbble/project.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'dribbble/utils/findable'
|
4
|
+
require 'dribbble/utils/creatable'
|
5
|
+
require 'dribbble/utils/updatable'
|
6
|
+
require 'dribbble/utils/deletable'
|
2
7
|
|
3
8
|
module Dribbble
|
4
9
|
class Project < Dribbble::Base
|
5
10
|
include Dribbble::Utils::Findable
|
11
|
+
include Dribbble::Utils::Creatable
|
12
|
+
include Dribbble::Utils::Updatable
|
13
|
+
include Dribbble::Utils::Deletable
|
6
14
|
|
7
|
-
def
|
8
|
-
|
15
|
+
def self.available_fields
|
16
|
+
%i[name description]
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
data/lib/dribbble/shot.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'dribbble/utils/findable'
|
2
4
|
require 'dribbble/utils/creatable'
|
3
5
|
require 'dribbble/utils/updatable'
|
4
6
|
require 'dribbble/utils/deletable'
|
5
|
-
require 'dribbble/attachment'
|
6
|
-
require 'dribbble/comment'
|
7
|
-
require 'dribbble/like'
|
8
7
|
|
9
8
|
module Dribbble
|
10
9
|
class Shot < Dribbble::Base
|
@@ -13,41 +12,12 @@ module Dribbble
|
|
13
12
|
include Dribbble::Utils::Updatable
|
14
13
|
include Dribbble::Utils::Deletable
|
15
14
|
|
16
|
-
has_many :attachments, :buckets, :comments, :likes, :projects
|
17
|
-
has_many :rebounds, as: Dribbble::Shot
|
18
|
-
|
19
|
-
def self.all(token, attrs = {})
|
20
|
-
@token = token
|
21
|
-
batch_new token, html_get('/shots', attrs)
|
22
|
-
end
|
23
|
-
|
24
15
|
def self.available_fields
|
25
|
-
%i
|
16
|
+
%i[image title description low_profile rebound_source_id scheduled_for tags team_id]
|
26
17
|
end
|
27
18
|
|
28
19
|
def self.after_create(res)
|
29
20
|
res.code == 202 ? res.headers[:location].split('/').last : false
|
30
21
|
end
|
31
|
-
|
32
|
-
def like?
|
33
|
-
html_get "/shots/#{id}/like"
|
34
|
-
true
|
35
|
-
rescue RestClient::ResourceNotFound
|
36
|
-
false
|
37
|
-
end
|
38
|
-
|
39
|
-
def like!
|
40
|
-
res = html_post "/shots/#{id}/like"
|
41
|
-
res.code == 201 ? true : false
|
42
|
-
end
|
43
|
-
|
44
|
-
def unlike!
|
45
|
-
res = html_delete "/shots/#{id}/like"
|
46
|
-
res.code == 204 ? true : false
|
47
|
-
end
|
48
|
-
|
49
|
-
def rebounds(attrs = {})
|
50
|
-
Dribbble::Shot.batch_new token, html_get("/shots/#{id}/rebounds", attrs)
|
51
|
-
end
|
52
22
|
end
|
53
23
|
end
|
data/lib/dribbble/user.rb
CHANGED
@@ -1,56 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dribbble
|
4
4
|
class User < Dribbble::Base
|
5
|
-
include Dribbble::Utils::Findable
|
6
|
-
|
7
|
-
def buckets(attrs = {})
|
8
|
-
Dribbble::Bucket.batch_new token, html_get("/users/#{id}/buckets", attrs)
|
9
|
-
end
|
10
|
-
|
11
|
-
def followers(attrs = {})
|
12
|
-
Dribbble::User.batch_new token, html_get("/users/#{id}/followers", attrs)
|
13
|
-
end
|
14
|
-
|
15
|
-
def following(attrs = {})
|
16
|
-
Dribbble::User.batch_new token, html_get("/users/#{id}/following", attrs), 'followee'
|
17
|
-
end
|
18
|
-
|
19
|
-
def following?(other_user_id = nil)
|
20
|
-
if other_user_id
|
21
|
-
html_get "/users/#{id}/following/#{other_user_id}"
|
22
|
-
else
|
23
|
-
html_get "/user/following/#{id}"
|
24
|
-
end
|
25
|
-
true
|
26
|
-
rescue RestClient::ResourceNotFound
|
27
|
-
false
|
28
|
-
end
|
29
|
-
|
30
|
-
def follow!
|
31
|
-
res = html_put "/users/#{id}/follow"
|
32
|
-
res.code == 204 ? true : false
|
33
|
-
end
|
34
|
-
|
35
|
-
def unfollow!
|
36
|
-
res = html_delete "/users/#{id}/follow"
|
37
|
-
res.code == 204 ? true : false
|
38
|
-
end
|
39
|
-
|
40
|
-
def likes(attrs = {})
|
41
|
-
Dribbble::Shot.batch_new token, html_get("/users/#{id}/likes", attrs), 'shot'
|
42
|
-
end
|
43
|
-
|
44
|
-
def projects(attrs = {})
|
45
|
-
Dribbble::Project.batch_new token, html_get("/users/#{id}/projects", attrs)
|
46
|
-
end
|
47
|
-
|
48
|
-
def shots(attrs = {})
|
49
|
-
Dribbble::Shot.batch_new token, html_get("/users/#{id}/shots", attrs)
|
50
|
-
end
|
51
|
-
|
52
|
-
def teams(attrs = {})
|
53
|
-
Dribbble::Team.batch_new token, html_get("/users/#{id}/teams", attrs)
|
54
|
-
end
|
55
5
|
end
|
56
6
|
end
|
data/lib/dribbble/utils.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
|
3
5
|
module Dribbble
|
@@ -5,14 +7,14 @@ module Dribbble
|
|
5
7
|
DEFAULT_ATTRIBUTES = {
|
6
8
|
page: 1,
|
7
9
|
per_page: 100
|
8
|
-
}
|
10
|
+
}.freeze
|
9
11
|
|
10
12
|
def class_name
|
11
|
-
@
|
13
|
+
@class_name ||= is_a?(Class) ? name.split('::').last.downcase : self.class.name.split('::').last.downcase
|
12
14
|
end
|
13
15
|
|
14
16
|
def pluralized_class_name
|
15
|
-
@
|
17
|
+
@pluralized_class_name ||= "#{class_name}s"
|
16
18
|
end
|
17
19
|
|
18
20
|
def full_url(path, attrs = {})
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dribbble
|
2
4
|
module Utils
|
3
5
|
module Creatable
|
@@ -17,7 +19,7 @@ module Dribbble
|
|
17
19
|
|
18
20
|
# Need to be redeclared in the model
|
19
21
|
def available_fields
|
20
|
-
|
22
|
+
raise 'You need to redeclare this methods in your model'
|
21
23
|
end
|
22
24
|
|
23
25
|
def after_create(res)
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dribbble
|
2
4
|
module Utils
|
3
5
|
module HasChildren
|
4
6
|
module ClassMethods
|
5
|
-
def has_many(*fields)
|
7
|
+
def has_many(*fields) # rubocop:disable Naming/PredicateName
|
6
8
|
if fields[1].is_a? Hash
|
7
|
-
generate_methods fields[0], fields[1][:as]
|
9
|
+
generate_methods fields[0], fields[1][:as], fields[1][:key]
|
8
10
|
else
|
9
11
|
fields.each do |field|
|
10
12
|
generate_methods field
|
@@ -12,27 +14,28 @@ module Dribbble
|
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
|
-
|
17
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
18
|
+
def generate_methods(field, klass = nil, key = nil)
|
16
19
|
singularized_field = field[0...-1]
|
17
20
|
|
18
21
|
define_method field do |attrs = {}|
|
19
|
-
klass ||= Object.const_get "Dribbble::#{
|
22
|
+
klass ||= Object.const_get "Dribbble::#{singularized_field.capitalize}"
|
20
23
|
url = "/#{pluralized_class_name}/#{id}/#{field}"
|
21
|
-
klass.batch_new token, html_get(url, attrs),
|
24
|
+
klass.batch_new token, html_get(url, attrs), key, url
|
22
25
|
end
|
23
26
|
|
24
27
|
define_method "find_#{singularized_field}" do |child_id|
|
25
|
-
klass ||= Object.const_get "Dribbble::#{
|
28
|
+
klass ||= Object.const_get "Dribbble::#{singularized_field.capitalize}"
|
26
29
|
url = "/#{pluralized_class_name}/#{id}/#{field}/#{child_id}"
|
27
30
|
klass.new token, html_get(url), url
|
28
31
|
end
|
29
32
|
|
30
33
|
define_method "create_#{singularized_field}" do |attrs = {}|
|
31
|
-
klass ||= Object.const_get "Dribbble::#{
|
34
|
+
klass ||= Object.const_get "Dribbble::#{singularized_field.capitalize}"
|
32
35
|
url = "/#{pluralized_class_name}/#{id}/#{field}"
|
33
36
|
res = html_post url do |payload|
|
34
|
-
klass.available_fields.each do |
|
35
|
-
payload[
|
37
|
+
klass.available_fields.each do |available_field|
|
38
|
+
payload[available_field] = attrs[available_field]
|
36
39
|
end
|
37
40
|
end
|
38
41
|
case res.code
|
@@ -49,8 +52,8 @@ module Dribbble
|
|
49
52
|
klass ||= Object.const_get "Dribbble::#{__method__[0...-1].capitalize}"
|
50
53
|
url = "/#{pluralized_class_name}/#{id}/#{klass.pluralized_class_name}/#{child_id}"
|
51
54
|
res = html_put url do |payload|
|
52
|
-
klass.available_fields.each do |
|
53
|
-
payload[
|
55
|
+
klass.available_fields.each do |available_field|
|
56
|
+
payload[available_field] = attrs[available_field]
|
54
57
|
end
|
55
58
|
end
|
56
59
|
klass.new token, res, url
|
@@ -59,10 +62,11 @@ module Dribbble
|
|
59
62
|
define_method "delete_#{singularized_field}" do |child_id|
|
60
63
|
klass ||= Object.const_get "Dribbble::#{__method__[0...-1].capitalize}"
|
61
64
|
res = html_delete "/#{pluralized_class_name}/#{id}/#{klass.pluralized_class_name}/#{child_id}"
|
62
|
-
res.code == 204
|
65
|
+
res.code == 204
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
69
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
66
70
|
|
67
71
|
def self.included(base)
|
68
72
|
base.extend(ClassMethods)
|
data/lib/dribbble/version.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe Dribbble::
|
4
|
-
before
|
5
|
-
@base =
|
5
|
+
describe Dribbble::Base do
|
6
|
+
before do
|
7
|
+
@base = described_class.new 'valid_token', {}
|
6
8
|
end
|
7
9
|
|
8
10
|
describe 'on #full_url_with_default_params' do
|
@@ -10,7 +12,7 @@ describe Dribbble::Client do
|
|
10
12
|
subject { @base.full_url_with_default_params '/shots' }
|
11
13
|
|
12
14
|
it 'return a valid url' do
|
13
|
-
expect(subject).to eq('https://api.dribbble.com/
|
15
|
+
expect(subject).to eq('https://api.dribbble.com/v2/shots?page=1&per_page=100')
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
@@ -18,7 +20,7 @@ describe Dribbble::Client do
|
|
18
20
|
subject { @base.full_url_with_default_params '/shots', page: 2, per_page: 10 }
|
19
21
|
|
20
22
|
it 'return a valid url' do
|
21
|
-
expect(subject).to eq('https://api.dribbble.com/
|
23
|
+
expect(subject).to eq('https://api.dribbble.com/v2/shots?page=2&per_page=10')
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -26,7 +28,7 @@ describe Dribbble::Client do
|
|
26
28
|
subject { @base.full_url_with_default_params '/shots', params1: 'custom' }
|
27
29
|
|
28
30
|
it 'return a valid url' do
|
29
|
-
expect(subject).to eq('https://api.dribbble.com/
|
31
|
+
expect(subject).to eq('https://api.dribbble.com/v2/shots?page=1&per_page=100¶ms1=custom')
|
30
32
|
end
|
31
33
|
end
|
32
34
|
end
|
@@ -36,7 +38,7 @@ describe Dribbble::Client do
|
|
36
38
|
subject { @base.full_url '/shots' }
|
37
39
|
|
38
40
|
it 'return a valid url' do
|
39
|
-
expect(subject).to eq('https://api.dribbble.com/
|
41
|
+
expect(subject).to eq('https://api.dribbble.com/v2/shots?')
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -44,7 +46,7 @@ describe Dribbble::Client do
|
|
44
46
|
subject { @base.full_url '/shots', custom: 1 }
|
45
47
|
|
46
48
|
it 'return a valid url' do
|
47
|
-
expect(subject).to eq('https://api.dribbble.com/
|
49
|
+
expect(subject).to eq('https://api.dribbble.com/v2/shots?custom=1')
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|