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.
- checksums.yaml +4 -4
 - data/.travis.yml +7 -1
 - data/Guardfile +0 -5
 - data/dribbble.gemspec +0 -3
 - data/lib/dribbble/attachment.rb +7 -0
 - data/lib/dribbble/base.rb +64 -5
 - data/lib/dribbble/bucket.rb +31 -0
 - data/lib/dribbble/client.rb +0 -7
 - data/lib/dribbble/comment.rb +4 -0
 - data/lib/dribbble/like.rb +7 -0
 - data/lib/dribbble/project.rb +11 -0
 - data/lib/dribbble/shot.rb +62 -0
 - data/lib/dribbble/team.rb +4 -0
 - data/lib/dribbble/user.rb +47 -6
 - data/lib/dribbble/utils/creatable.rb +33 -0
 - data/lib/dribbble/utils/deletable.rb +21 -0
 - data/lib/dribbble/utils/findable.rb +17 -0
 - data/lib/dribbble/utils/has_children.rb +33 -0
 - data/lib/dribbble/utils/updatable.rb +24 -0
 - data/lib/dribbble/utils.rb +38 -7
 - data/lib/dribbble/version.rb +1 -1
 - data/spec/lib/dribbble/base_spec.rb +161 -4
 - data/spec/lib/dribbble/bucket_spec.rb +136 -0
 - data/spec/lib/dribbble/client_spec.rb +2 -23
 - data/spec/lib/dribbble/project_spec.rb +45 -0
 - data/spec/lib/dribbble/shot_spec.rb +254 -0
 - data/spec/lib/dribbble/user_spec.rb +173 -23
 - data/spec/spec_helper.rb +14 -17
 - data/spec/support/dribbble.rb +159 -20
 - data/spec/support/fixtures/attachment_success.json +9 -0
 - data/spec/support/fixtures/attachments_success.json +11 -0
 - data/spec/support/fixtures/bucket_created.json +8 -0
 - data/spec/support/fixtures/bucket_success.json +8 -0
 - data/spec/support/fixtures/bucket_updated.json +8 -0
 - data/spec/support/fixtures/comments_success.json +37 -0
 - data/spec/support/fixtures/current_user_success.json +25 -0
 - data/spec/support/fixtures/followers_success.json +33 -0
 - data/spec/support/fixtures/following_success.json +33 -0
 - data/spec/support/fixtures/project_success.json +8 -0
 - data/spec/support/fixtures/projects_success.json +10 -0
 - data/spec/support/fixtures/shot_likes_success.json +33 -0
 - data/spec/support/fixtures/shot_success.json +85 -0
 - data/spec/support/fixtures/shot_updated.json +85 -0
 - data/spec/support/fixtures/teams_success.json +28 -0
 - data/spec/support/fixtures/user_likes_success.json +91 -0
 - metadata +52 -48
 - 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 
     | 
    
         
            -
               
     | 
| 
       7 
     | 
    
         
            -
                 
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
              describe 'on instance' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                before :all do
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @user = Dribbble::User.new 'valid_token', RAW_USER
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
       25 
     | 
    
         
            -
                   
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
       37 
     | 
    
         
            -
                   
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 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 ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'dribbble'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'webmock/rspec'
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
            # WebMock.disable_net_connect! allow_localhost: true, allow: 'codeclimate.com'
         
     | 
| 
       10 
7 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
               
     | 
| 
      
 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
         
     | 
    
        data/spec/support/dribbble.rb
    CHANGED
    
    | 
         @@ -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  
     | 
| 
      
 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  
     | 
| 
       10 
     | 
    
         
            -
                   
     | 
| 
      
 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  
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
                   
     | 
| 
      
 53 
     | 
    
         
            +
              class Found < Base
         
     | 
| 
      
 54 
     | 
    
         
            +
                def status_code
         
     | 
| 
      
 55 
     | 
    
         
            +
                  200
         
     | 
| 
       17 
56 
     | 
    
         
             
                end
         
     | 
| 
       18 
57 
     | 
    
         
             
              end
         
     | 
| 
       19 
58 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
              class  
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 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  
     | 
| 
       27 
     | 
    
         
            -
                 
     | 
| 
       28 
     | 
    
         
            -
                   
     | 
| 
      
 68 
     | 
    
         
            +
              class Accepted < Base
         
     | 
| 
      
 69 
     | 
    
         
            +
                def status_code
         
     | 
| 
      
 70 
     | 
    
         
            +
                  202
         
     | 
| 
       29 
71 
     | 
    
         
             
                end
         
     | 
| 
       30 
72 
     | 
    
         
             
              end
         
     | 
| 
       31 
73 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
              class  
     | 
| 
       33 
     | 
    
         
            -
                 
     | 
| 
       34 
     | 
    
         
            -
                   
     | 
| 
       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 
     | 
    
         
            -
                 
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
      
 84 
     | 
    
         
            +
                def status_code
         
     | 
| 
      
 85 
     | 
    
         
            +
                  404
         
     | 
| 
       42 
86 
     | 
    
         
             
                end
         
     | 
| 
       43 
87 
     | 
    
         
             
              end
         
     | 
| 
       44 
88 
     | 
    
         | 
| 
       45 
89 
     | 
    
         
             
              class Unauthorized < Base
         
     | 
| 
       46 
     | 
    
         
            -
                 
     | 
| 
       47 
     | 
    
         
            -
                   
     | 
| 
      
 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,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 & 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 & 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 & 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 
     | 
    
         
            +
            ]
         
     |