dribbble 0.0.4 → 1.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ ]