dribbble 0.0.4 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -1
  3. data/Guardfile +0 -5
  4. data/dribbble.gemspec +0 -3
  5. data/lib/dribbble/attachment.rb +7 -0
  6. data/lib/dribbble/base.rb +64 -5
  7. data/lib/dribbble/bucket.rb +31 -0
  8. data/lib/dribbble/client.rb +0 -7
  9. data/lib/dribbble/comment.rb +4 -0
  10. data/lib/dribbble/like.rb +7 -0
  11. data/lib/dribbble/project.rb +11 -0
  12. data/lib/dribbble/shot.rb +62 -0
  13. data/lib/dribbble/team.rb +4 -0
  14. data/lib/dribbble/user.rb +47 -6
  15. data/lib/dribbble/utils/creatable.rb +33 -0
  16. data/lib/dribbble/utils/deletable.rb +21 -0
  17. data/lib/dribbble/utils/findable.rb +17 -0
  18. data/lib/dribbble/utils/has_children.rb +33 -0
  19. data/lib/dribbble/utils/updatable.rb +24 -0
  20. data/lib/dribbble/utils.rb +38 -7
  21. data/lib/dribbble/version.rb +1 -1
  22. data/spec/lib/dribbble/base_spec.rb +161 -4
  23. data/spec/lib/dribbble/bucket_spec.rb +136 -0
  24. data/spec/lib/dribbble/client_spec.rb +2 -23
  25. data/spec/lib/dribbble/project_spec.rb +45 -0
  26. data/spec/lib/dribbble/shot_spec.rb +254 -0
  27. data/spec/lib/dribbble/user_spec.rb +173 -23
  28. data/spec/spec_helper.rb +14 -17
  29. data/spec/support/dribbble.rb +159 -20
  30. data/spec/support/fixtures/attachment_success.json +9 -0
  31. data/spec/support/fixtures/attachments_success.json +11 -0
  32. data/spec/support/fixtures/bucket_created.json +8 -0
  33. data/spec/support/fixtures/bucket_success.json +8 -0
  34. data/spec/support/fixtures/bucket_updated.json +8 -0
  35. data/spec/support/fixtures/comments_success.json +37 -0
  36. data/spec/support/fixtures/current_user_success.json +25 -0
  37. data/spec/support/fixtures/followers_success.json +33 -0
  38. data/spec/support/fixtures/following_success.json +33 -0
  39. data/spec/support/fixtures/project_success.json +8 -0
  40. data/spec/support/fixtures/projects_success.json +10 -0
  41. data/spec/support/fixtures/shot_likes_success.json +33 -0
  42. data/spec/support/fixtures/shot_success.json +85 -0
  43. data/spec/support/fixtures/shot_updated.json +85 -0
  44. data/spec/support/fixtures/teams_success.json +28 -0
  45. data/spec/support/fixtures/user_likes_success.json +91 -0
  46. metadata +52 -48
  47. data/spec/factories.rb +0 -2
@@ -3,39 +3,189 @@ require 'spec_helper'
3
3
  RAW_USER = data_from_json 'user_success.json'
4
4
 
5
5
  describe Dribbble::User do
6
- before :all do
7
- @user = Dribbble::User.new 'valid_token', RAW_USER
8
- end
6
+ describe 'on instance' do
7
+ before :all do
8
+ @user = Dribbble::User.new 'valid_token', RAW_USER
9
+ end
9
10
 
10
- describe 'after initialization' do
11
- RAW_USER.each do |field, value|
12
- it "respond to #{field}" do
13
- expect(@user.send field).to eq(value)
11
+ describe 'after initialization' do
12
+ RAW_USER.each do |field, value|
13
+ it "respond to #{field}" do
14
+ expect(@user.send field).to eq(value)
15
+ end
14
16
  end
15
17
  end
16
- end
17
18
 
18
- describe 'on #buckets' do
19
- subject do
20
- stub_dribbble_with DribbbleAPI::BucketsSuccess
21
- @user.buckets
19
+ describe 'on #buckets' do
20
+ subject do
21
+ stub_dribbble :get, '/users/483195/buckets', DribbbleAPI::BucketsSuccess
22
+ @user.buckets
23
+ end
24
+
25
+ it 'responds with buckets' do
26
+ expect(subject.size).to eq 1
27
+ expect(subject.first).to be_a Dribbble::Bucket
28
+ end
22
29
  end
23
30
 
24
- it 'responds with buckets' do
25
- expect(subject.size).to eq 1
26
- expect(subject.first).to be_a Dribbble::Bucket
31
+ describe '#followers' do
32
+ subject do
33
+ stub_dribbble :get, '/users/483195/followers', DribbbleAPI::FollowersSuccess
34
+ @user.followers
35
+ end
36
+
37
+ it 'responds with users' do
38
+ expect(subject.size).to eq 1
39
+ expect(subject.first).to be_a Dribbble::User
40
+ end
27
41
  end
28
- end
29
42
 
30
- describe "#shots" do
31
- subject do
32
- stub_dribbble_with DribbbleAPI::ShotsSuccess
33
- @user.shots
43
+ describe '#following' do
44
+ subject do
45
+ stub_dribbble :get, '/users/483195/following', DribbbleAPI::FollowingSuccess
46
+ @user.following
47
+ end
48
+
49
+ it 'responds with users' do
50
+ expect(subject.size).to eq 1
51
+ expect(subject.first).to be_a Dribbble::User
52
+ expect(subject.first.name).to eq('Dan Cederholm')
53
+ end
54
+ end
55
+
56
+ describe 'on #following?' do
57
+ describe 'for current logged user' do
58
+ describe 'on a not followed user' do
59
+ subject do
60
+ stub_dribbble :get, '/user/following/483195', DribbbleAPI::UserFollowNotFound
61
+ @user.following?
62
+ end
63
+
64
+ it 'return false' do
65
+ expect(subject).to be_falsy
66
+ end
67
+ end
68
+
69
+ describe 'on a followed user' do
70
+ subject do
71
+ stub_dribbble :get, '/user/following/483195', DribbbleAPI::UserFollowSuccess
72
+ @user.following?
73
+ end
74
+
75
+ it 'return true' do
76
+ expect(subject).to be_truthy
77
+ end
78
+ end
79
+ end
80
+
81
+ describe 'for another user' do
82
+ describe 'on a not followed user' do
83
+ subject do
84
+ stub_dribbble :get, '/users/483195/following/1', DribbbleAPI::UserFollowNotFound
85
+ @user.following? 1
86
+ end
87
+
88
+ it 'return false' do
89
+ expect(subject).to be_falsy
90
+ end
91
+ end
92
+
93
+ describe 'on a followed user' do
94
+ subject do
95
+ stub_dribbble :get, '/users/483195/following/1', DribbbleAPI::UserFollowSuccess
96
+ @user.following? 1
97
+ end
98
+
99
+ it 'return true' do
100
+ expect(subject).to be_truthy
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ describe 'on #follow!' do
107
+ subject do
108
+ stub_dribbble :put, '/users/483195/follow', DribbbleAPI::UserFollowCreated
109
+ @user.follow!
110
+ end
111
+
112
+ it 'return true' do
113
+ expect(subject).to be_truthy
114
+ end
115
+ end
116
+
117
+ describe 'on #unfollow!' do
118
+ subject do
119
+ stub_dribbble :delete, '/users/483195/follow', DribbbleAPI::UserFollowDeleted
120
+ @user.unfollow!
121
+ end
122
+
123
+ it 'return true' do
124
+ expect(subject).to be_truthy
125
+ end
126
+ end
127
+
128
+ describe '#likes' do
129
+ subject do
130
+ stub_dribbble :get, '/users/483195/likes', DribbbleAPI::UserLikesSuccess
131
+ @user.likes
132
+ end
133
+
134
+ it 'responds with shots' do
135
+ expect(subject.size).to eq 1
136
+ expect(subject.first).to be_a Dribbble::Shot
137
+ expect(subject.first.title).to eq('Sasquatch')
138
+ end
139
+ end
140
+
141
+ describe '#projects' do
142
+ subject do
143
+ stub_dribbble :get, '/users/483195/projects', DribbbleAPI::ProjectsSuccess
144
+ @user.projects
145
+ end
146
+
147
+ it 'responds with projects' do
148
+ expect(subject.size).to eq 1
149
+ expect(subject.first).to be_a Dribbble::Project
150
+ end
34
151
  end
35
152
 
36
- it 'responds with buckets' do
37
- expect(subject.size).to eq 2
38
- expect(subject.first).to be_a Dribbble::Shot
153
+ describe '#shots' do
154
+ subject do
155
+ stub_dribbble :get, '/users/483195/shots', DribbbleAPI::ShotsSuccess
156
+ @user.shots
157
+ end
158
+
159
+ it 'responds with buckets' do
160
+ expect(subject.size).to eq 2
161
+ expect(subject.first).to be_a Dribbble::Shot
162
+ end
163
+ end
164
+
165
+ describe '#teams' do
166
+ subject do
167
+ stub_dribbble :get, '/users/483195/teams', DribbbleAPI::TeamsSuccess
168
+ @user.teams
169
+ end
170
+
171
+ it 'responds with teams' do
172
+ expect(subject.size).to eq 1
173
+ expect(subject.first).to be_a Dribbble::Team
174
+ end
175
+ end
176
+ end
177
+
178
+ describe 'on class' do
179
+ describe 'on #find' do
180
+ subject do
181
+ stub_dribbble :get, '/users/483195', DribbbleAPI::UserSuccess
182
+ Dribbble::User.find 'valid_token', 483_195
183
+ end
184
+
185
+ it 'return a user' do
186
+ expect(subject).to be_a Dribbble::User
187
+ expect(subject.id).to eq(483_195)
188
+ end
39
189
  end
40
190
  end
41
191
  end
data/spec/spec_helper.rb CHANGED
@@ -1,25 +1,22 @@
1
- require 'spork'
1
+ require 'dribbble'
2
+ require 'webmock/rspec'
2
3
 
3
- Spork.prefork do
4
- require 'dribbble'
5
- require 'webmock/rspec'
6
- require 'faker'
7
- require 'factory_girl'
4
+ Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each { |f| require f }
8
5
 
9
- Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each { |f| require f }
6
+ # WebMock.disable_net_connect! allow_localhost: true, allow: 'codeclimate.com'
10
7
 
11
- # WebMock.disable_net_connect! allow_localhost: true, allow: 'codeclimate.com'
12
-
13
- def stub_dribbble_with(response_class)
14
- stub_request(:any, /api\.dribbble\.com/).to_rack(response_class)
15
- end
16
-
17
- def data_from_json(json_name)
18
- JSON.parse File.open(File.dirname(__FILE__) + "/support/fixtures/#{json_name}", 'rb').read
8
+ RSpec.configure do |config|
9
+ config.before :all do
10
+ WebMock.reset!
19
11
  end
20
12
  end
21
13
 
22
- Spork.each_run do
23
- # This code will be run each time you run your specs.
14
+ def stub_dribbble(method, path, response_class)
15
+ url = /api.dribbble.com\/v1#{Regexp.escape path}(\?.*)?$/
16
+ stub_request(method, url).to_rack(response_class)
17
+ end
24
18
 
19
+ def data_from_json(json_name)
20
+ file_name = "#{File.dirname(__FILE__)}/support/fixtures/#{json_name}"
21
+ JSON.parse File.open(file_name, 'rb').read
25
22
  end
@@ -1,50 +1,189 @@
1
1
  require 'sinatra/base'
2
2
 
3
+ class String
4
+ def underscore
5
+ self.gsub(/::/, '/').
6
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
7
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
8
+ tr("-", "_").
9
+ downcase
10
+ end
11
+ end
12
+
3
13
  module DribbbleAPI
4
14
  class Base < Sinatra::Base
15
+ get '/*' do
16
+ json_response
17
+ end
18
+
19
+ post '/*' do
20
+ json_response
21
+ end
22
+
23
+ put '/*' do
24
+ json_response
25
+ end
26
+
27
+ delete '/*' do
28
+ json_response
29
+ end
30
+
5
31
  protected
6
32
 
7
- def json_response(response_code, file_name)
33
+ def json_file_name
34
+ @json_file_name ||= self.class.name.split('::').last.underscore
35
+ end
36
+
37
+ def json_response
8
38
  content_type :json
9
- status response_code
10
- File.open(File.dirname(__FILE__) + '/fixtures/' + file_name, 'rb').read
39
+ status status_code
40
+ headers response_headers
41
+ file_name = "#{File.dirname(__FILE__)}/fixtures/#{json_file_name}.json"
42
+
43
+ return {}.to_json unless File.exist? file_name
44
+
45
+ File.open(file_name, 'rb')
46
+ end
47
+
48
+ def response_headers
49
+ {}
11
50
  end
12
51
  end
13
52
 
14
- class UserSuccess < Base
15
- get '/*' do
16
- json_response 200, 'user_success.json'
53
+ class Found < Base
54
+ def status_code
55
+ 200
17
56
  end
18
57
  end
19
58
 
20
- class BucketsSuccess < Base
21
- get '/*' do
22
- json_response 200, 'buckets_success.json'
59
+ class Updated < Found
60
+ end
61
+
62
+ class Created < Base
63
+ def status_code
64
+ 201
23
65
  end
24
66
  end
25
67
 
26
- class ShotsSuccess < Base
27
- get '/*' do
28
- json_response 200, 'shots_success.json'
68
+ class Accepted < Base
69
+ def status_code
70
+ 202
29
71
  end
30
72
  end
31
73
 
32
- class Created < Base
33
- post '/*' do
34
- status 202
35
- {}.to_json
74
+ class Deleted < Base
75
+ def status_code
76
+ 204
36
77
  end
37
78
  end
38
79
 
80
+ class NoContent < Deleted
81
+ end
82
+
39
83
  class NotFound < Base
40
- get '/*' do
41
- json_response 404, 'not_found.json'
84
+ def status_code
85
+ 404
42
86
  end
43
87
  end
44
88
 
45
89
  class Unauthorized < Base
46
- get '/*' do
47
- json_response 401, 'unauthorized.json'
90
+ def status_code
91
+ 401
92
+ end
93
+ end
94
+
95
+ class AttachmentsSuccess < Found
96
+ end
97
+
98
+ class AttachmentSuccess < Found
99
+ end
100
+
101
+ class CommentsSuccess < Found
102
+ end
103
+
104
+ class CurrentUserSuccess < Found
105
+ end
106
+
107
+ class BucketSuccess < Found
108
+ end
109
+
110
+ class BucketCreated < Created
111
+ end
112
+
113
+ class BucketUpdated < Updated
114
+ end
115
+
116
+ class BucketDeleted < Deleted
117
+ end
118
+
119
+ class BucketsSuccess < Found
120
+ end
121
+
122
+ class FollowersSuccess < Found
123
+ end
124
+
125
+ class FollowingSuccess < Found
126
+ end
127
+
128
+ class UserFollowSuccess < Found
129
+ end
130
+
131
+ class UserFollowNotFound < NotFound
132
+ end
133
+
134
+ class UserFollowCreated < NoContent
135
+ end
136
+
137
+ class UserFollowDeleted < Deleted
138
+ end
139
+
140
+ class UserLikesSuccess < Found
141
+ end
142
+
143
+ class ProjectSuccess < Found
144
+ end
145
+
146
+ class ProjectsSuccess < Found
147
+ end
148
+
149
+ class ShotUpdated < Updated
150
+ end
151
+
152
+ class ShotDeleted < Deleted
153
+ end
154
+
155
+ class ShotSuccess < Found
156
+ end
157
+
158
+ class ShotAccepted < Accepted
159
+ def response_headers
160
+ {
161
+ 'Location' => 'https://api.dribbble.com/v1/shots/471756'
162
+ }
48
163
  end
49
164
  end
165
+
166
+ class ShotLikeSuccess < Found
167
+ end
168
+
169
+ class ShotLikeNotFound < NotFound
170
+ end
171
+
172
+ class ShotLikeCreated < Created
173
+ end
174
+
175
+ class ShotLikeDeleted < Deleted
176
+ end
177
+
178
+ class ShotLikesSuccess < Found
179
+ end
180
+
181
+ class ShotsSuccess < Found
182
+ end
183
+
184
+ class TeamsSuccess < Found
185
+ end
186
+
187
+ class UserSuccess < Found
188
+ end
50
189
  end
@@ -0,0 +1,9 @@
1
+ {
2
+ "id" : 206165,
3
+ "url" : "https://d13yacurqjgara.cloudfront.net/users/1/screenshots/1412410/attachments/206165/weathered-ball-detail.jpg",
4
+ "thumbnail_url" : "https://d13yacurqjgara.cloudfront.net/users/1/screenshots/1412410/attachments/206165/thumbnail/weathered-ball-detail.jpg",
5
+ "size" : 116375,
6
+ "content_type" : "image/jpeg",
7
+ "views_count" : 325,
8
+ "created_at" : "2014-02-07T16:35:09Z"
9
+ }
@@ -0,0 +1,11 @@
1
+ [
2
+ {
3
+ "id" : 206165,
4
+ "url" : "https://d13yacurqjgara.cloudfront.net/users/1/screenshots/1412410/attachments/206165/weathered-ball-detail.jpg",
5
+ "thumbnail_url" : "https://d13yacurqjgara.cloudfront.net/users/1/screenshots/1412410/attachments/206165/thumbnail/weathered-ball-detail.jpg",
6
+ "size" : 116375,
7
+ "content_type" : "image/jpeg",
8
+ "views_count" : 325,
9
+ "created_at" : "2014-02-07T16:35:09Z"
10
+ }
11
+ ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "id" : 2754,
3
+ "name" : "Great Marks",
4
+ "description" : "Collecting superb brand marks from the <a href=\"https://dribbble.com\">Dribbbleverse</a>.",
5
+ "shots_count" : 251,
6
+ "created_at" : "2011-05-20T21:05:55Z",
7
+ "updated_at" : "2014-02-21T16:37:12Z"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id" : 2754,
3
+ "name" : "Great Marks",
4
+ "description" : "Collecting superb brand marks from the <a href=\"https://dribbble.com\">Dribbbleverse</a>.",
5
+ "shots_count" : 251,
6
+ "created_at" : "2011-05-20T21:05:55Z",
7
+ "updated_at" : "2014-02-21T16:37:12Z"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id" : 2754,
3
+ "name" : "Bucket title",
4
+ "description" : "Bucket description",
5
+ "shots_count" : 251,
6
+ "created_at" : "2011-05-20T21:05:55Z",
7
+ "updated_at" : "2014-02-21T16:37:12Z"
8
+ }
@@ -0,0 +1,37 @@
1
+ [
2
+ {
3
+ "id" : 1145736,
4
+ "body" : "<p>Could he somehow make the shape of an \"S\" with his arms? I feel like i see potential for some hidden shapes in here...</p>\n\n<p>Looks fun!\n</p>",
5
+ "likes_count" : 1,
6
+ "likes_url" : "https://api.dribbble.com/v1/shots/471756/comments/1145736/likes",
7
+ "created_at" : "2012-03-15T04:24:39Z",
8
+ "updated_at" : "2012-03-15T04:24:39Z",
9
+ "user" : {
10
+ "id" : 1,
11
+ "name" : "Dan Cederholm",
12
+ "username" : "simplebits",
13
+ "html_url" : "https://dribbble.com/simplebits",
14
+ "avatar_url" : "https://d13yacurqjgara.cloudfront.net/users/1/avatars/normal/dc.jpg?1371679243",
15
+ "bio" : "Co-founder &amp; designer of <a href=\"https://dribbble.com/dribbble\">@Dribbble</a>. Principal of SimpleBits. Aspiring clawhammer banjoist.",
16
+ "location" : "Salem, MA",
17
+ "links" : {
18
+ "web" : "http://simplebits.com",
19
+ "twitter" : "https://twitter.com/simplebits"
20
+ },
21
+ "followers_count" : 29262,
22
+ "followings_count" : 1728,
23
+ "likes_count" : 34954,
24
+ "shots_count" : 214,
25
+ "type" : "User",
26
+ "pro" : true,
27
+ "buckets_url" : "https://dribbble.com/v1/users/1/buckets",
28
+ "followers_url" : "https://dribbble.com/v1/users/1/followers",
29
+ "following_url" : "https://dribbble.com/v1/users/1/following",
30
+ "likes_url" : "https://dribbble.com/v1/users/1/likes",
31
+ "shots_url" : "https://dribbble.com/v1/users/1/shots",
32
+ "teams_url" : "https://dribbble.com/v1/users/1/teams",
33
+ "created_at" : "2009-07-08T02:51:22Z",
34
+ "updated_at" : "2014-02-22T17:10:33Z"
35
+ }
36
+ }
37
+ ]
@@ -0,0 +1,25 @@
1
+ {
2
+ "id" : 8008135,
3
+ "name" : "Charley D.",
4
+ "username" : "Calyhre",
5
+ "html_url" : "https://dribbble.com/Calyhre",
6
+ "avatar_url" : "https://d13yacurqjgara.cloudfront.net/users/483195/avatars/normal/493064787.png?1390292526",
7
+ "bio" : "",
8
+ "location" : null,
9
+ "links" : {},
10
+ "followers_count" : 1,
11
+ "followings_count" : 4,
12
+ "likes_count" : 4,
13
+ "shots_count" : 0,
14
+ "type" : "Player",
15
+ "pro" : false,
16
+ "buckets_url" : "https://api.dribbble.com/v1/users/483195/buckets",
17
+ "followers_url" : "https://api.dribbble.com/v1/users/483195/followers",
18
+ "following_url" : "https://api.dribbble.com/v1/users/483195/following",
19
+ "likes_url" : "https://api.dribbble.com/v1/users/483195/likes",
20
+ "projects_url" : "https://api.dribbble.com/v1/users/483195/projects",
21
+ "shots_url" : "https://api.dribbble.com/v1/users/483195/shots",
22
+ "teams_url" : "https://api.dribbble.com/v1/users/483195/teams",
23
+ "created_at" : "2014-01-21T08:22:06Z",
24
+ "updated_at" : "2014-09-29T19:39:00Z"
25
+ }
@@ -0,0 +1,33 @@
1
+ [
2
+ {
3
+ "id" : 9843830,
4
+ "created_at" : "2014-02-21T15:41:14Z",
5
+ "follower" : {
6
+ "id" : 1,
7
+ "name" : "Dan Cederholm",
8
+ "username" : "simplebits",
9
+ "html_url" : "https://dribbble.com/simplebits",
10
+ "avatar_url" : "https://d13yacurqjgara.cloudfront.net/users/1/avatars/normal/dc.jpg?1371679243",
11
+ "bio" : "Co-founder &amp; designer of <a href=\"https://dribbble.com/dribbble\">@Dribbble</a>. Principal of SimpleBits. Aspiring clawhammer banjoist.",
12
+ "location" : "Salem, MA",
13
+ "links" : {
14
+ "web" : "http://simplebits.com",
15
+ "twitter" : "https://twitter.com/simplebits"
16
+ },
17
+ "followers_count" : 29262,
18
+ "followings_count" : 1728,
19
+ "likes_count" : 34954,
20
+ "shots_count" : 214,
21
+ "type" : "User",
22
+ "pro" : true,
23
+ "buckets_url" : "https://dribbble.com/v1/users/1/buckets",
24
+ "followers_url" : "https://dribbble.com/v1/users/1/followers",
25
+ "following_url" : "https://dribbble.com/v1/users/1/following",
26
+ "likes_url" : "https://dribbble.com/v1/users/1/likes",
27
+ "shots_url" : "https://dribbble.com/v1/users/1/shots",
28
+ "teams_url" : "https://dribbble.com/v1/users/1/teams",
29
+ "created_at" : "2009-07-08T02:51:22Z",
30
+ "updated_at" : "2014-02-22T17:10:33Z"
31
+ }
32
+ }
33
+ ]
@@ -0,0 +1,33 @@
1
+ [
2
+ {
3
+ "id" : 9843830,
4
+ "created_at" : "2014-02-21T15:41:14Z",
5
+ "followee" : {
6
+ "id" : 1,
7
+ "name" : "Dan Cederholm",
8
+ "username" : "simplebits",
9
+ "html_url" : "https://dribbble.com/simplebits",
10
+ "avatar_url" : "https://d13yacurqjgara.cloudfront.net/users/1/avatars/normal/dc.jpg?1371679243",
11
+ "bio" : "Co-founder &amp; designer of <a href=\"https://dribbble.com/dribbble\">@Dribbble</a>. Principal of SimpleBits. Aspiring clawhammer banjoist.",
12
+ "location" : "Salem, MA",
13
+ "links" : {
14
+ "web" : "http://simplebits.com",
15
+ "twitter" : "https://twitter.com/simplebits"
16
+ },
17
+ "followers_count" : 29262,
18
+ "followings_count" : 1728,
19
+ "likes_count" : 34954,
20
+ "shots_count" : 214,
21
+ "type" : "User",
22
+ "pro" : true,
23
+ "buckets_url" : "https://dribbble.com/v1/users/1/buckets",
24
+ "followers_url" : "https://dribbble.com/v1/users/1/followers",
25
+ "following_url" : "https://dribbble.com/v1/users/1/following",
26
+ "likes_url" : "https://dribbble.com/v1/users/1/likes",
27
+ "shots_url" : "https://dribbble.com/v1/users/1/shots",
28
+ "teams_url" : "https://dribbble.com/v1/users/1/teams",
29
+ "created_at" : "2009-07-08T02:51:22Z",
30
+ "updated_at" : "2014-02-22T17:10:33Z"
31
+ }
32
+ }
33
+ ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "id" : 3,
3
+ "name" : "Web Standards Sherpa",
4
+ "description" : "I did visual design and art direction for this project, working with the <a href=\"http://webstandards.org\">Web Standards Project</a> and Microsoft.",
5
+ "shots_count" : 4,
6
+ "created_at" : "2011-04-14T03:43:47Z",
7
+ "updated_at" : "2012-04-04T22:39:53Z"
8
+ }
@@ -0,0 +1,10 @@
1
+ [
2
+ {
3
+ "id" : 3,
4
+ "name" : "Web Standards Sherpa",
5
+ "description" : "I did visual design and art direction for this project, working with the <a href=\"http://webstandards.org\">Web Standards Project</a> and Microsoft.",
6
+ "shots_count" : 4,
7
+ "created_at" : "2011-04-14T03:43:47Z",
8
+ "updated_at" : "2012-04-04T22:39:53Z"
9
+ }
10
+ ]