kippt 2.0.1 → 3.0

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 (67) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +1 -4
  3. data/CHANGELOG.md +24 -0
  4. data/Gemfile +4 -0
  5. data/README.md +14 -4
  6. data/TODO.md +16 -0
  7. data/lib/kippt.rb +8 -3
  8. data/lib/kippt/client.rb +6 -6
  9. data/lib/kippt/clip.rb +17 -9
  10. data/lib/kippt/clip_collection.rb +2 -2
  11. data/lib/kippt/clip_likes.rb +29 -0
  12. data/lib/kippt/clips.rb +8 -37
  13. data/lib/kippt/collection.rb +1 -2
  14. data/lib/kippt/collection_resource.rb +39 -55
  15. data/lib/kippt/comment.rb +2 -4
  16. data/lib/kippt/comment_collection.rb +1 -2
  17. data/lib/kippt/comments.rb +5 -3
  18. data/lib/kippt/connection.rb +7 -3
  19. data/lib/kippt/favorite.rb +46 -0
  20. data/lib/kippt/favorites.rb +20 -0
  21. data/lib/kippt/followers.rb +6 -4
  22. data/lib/kippt/following.rb +6 -4
  23. data/lib/kippt/helpers.rb +17 -0
  24. data/lib/kippt/like.rb +4 -6
  25. data/lib/kippt/like_collection.rb +11 -0
  26. data/lib/kippt/likes.rb +2 -30
  27. data/lib/kippt/list.rb +8 -2
  28. data/lib/kippt/list_collection.rb +2 -2
  29. data/lib/kippt/lists.rb +2 -4
  30. data/lib/kippt/read_collection_resource.rb +43 -0
  31. data/lib/kippt/root_clips.rb +39 -0
  32. data/lib/kippt/saves.rb +4 -3
  33. data/lib/kippt/user.rb +10 -6
  34. data/lib/kippt/user_clips.rb +6 -26
  35. data/lib/kippt/user_collection.rb +0 -3
  36. data/lib/kippt/user_likes.rb +29 -0
  37. data/lib/kippt/user_lists.rb +0 -5
  38. data/lib/kippt/users.rb +3 -8
  39. data/lib/kippt/version.rb +1 -1
  40. data/spec/kippt/client_spec.rb +36 -2
  41. data/spec/kippt/clip_likes_spec.rb +14 -0
  42. data/spec/kippt/clip_spec.rb +89 -3
  43. data/spec/kippt/clips_spec.rb +27 -5
  44. data/spec/kippt/comment_spec.rb +1 -1
  45. data/spec/kippt/comments_spec.rb +30 -5
  46. data/spec/kippt/favorite_spec.rb +38 -0
  47. data/spec/kippt/favorites_spec.rb +18 -0
  48. data/spec/kippt/follow_relationship_spec.rb +30 -0
  49. data/spec/kippt/followers_spec.rb +6 -9
  50. data/spec/kippt/following_spec.rb +6 -9
  51. data/spec/kippt/like_spec.rb +38 -0
  52. data/spec/kippt/likes_spec.rb +21 -0
  53. data/spec/kippt/list_spec.rb +43 -10
  54. data/spec/kippt/lists_spec.rb +12 -0
  55. data/spec/kippt/saves_spec.rb +3 -3
  56. data/spec/kippt/user_clips_spec.rb +14 -2
  57. data/spec/kippt/user_likes_spec.rb +14 -0
  58. data/spec/kippt/user_lists_spec.rb +12 -0
  59. data/spec/kippt/user_spec.rb +11 -0
  60. data/spec/kippt/users_spec.rb +2 -1
  61. data/spec/shared_examples/collection.rb +117 -0
  62. data/spec/shared_examples/collection_resource.rb +13 -0
  63. data/spec/shared_examples/read_collection_resource.rb +77 -0
  64. data/spec/shared_examples/resource.rb +80 -0
  65. data/spec/spec_helper.rb +2 -298
  66. metadata +33 -26
  67. data/lib/core_ext/open_struct.rb +0 -5
@@ -1,39 +1,19 @@
1
- require "kippt/connection"
2
- require "kippt/collection_resource"
3
- require "kippt/clip_collection"
4
- require "kippt/clip"
5
-
6
- class Kippt::UserClips
7
- include Kippt::CollectionResource
1
+ require_relative "clips"
8
2
 
3
+ class Kippt::UserClips < Kippt::Clips
9
4
  attr_reader :user
10
5
 
11
- def self.valid_filter_parameters
12
- [:limit, :offset]
13
- end
14
-
15
6
  def initialize(client, user)
16
- @client = client
17
- @user = user
18
- end
19
-
20
- def object_class
21
- Kippt::Clip
22
- end
23
-
24
- def collection_class
25
- Kippt::ClipCollection
26
- end
7
+ @user = user
27
8
 
28
- def base_uri
29
- "users/#{user.id}/clips"
9
+ super(client, "users/#{user.id}/clips")
30
10
  end
31
11
 
32
12
  def favorites
33
- Kippt::ClipCollection.new(client.get("#{base_uri}/favorites").body, client)
13
+ Kippt::Clips.new(client, "#{base_uri}/favorites")
34
14
  end
35
15
 
36
16
  def likes
37
- Kippt::ClipCollection.new(client.get("#{base_uri}/likes").body, client)
17
+ Kippt::Clips.new(client, "#{base_uri}/likes")
38
18
  end
39
19
  end
@@ -1,6 +1,3 @@
1
- require "kippt/collection"
2
- require "kippt/user"
3
-
4
1
  class Kippt::UserCollection
5
2
  include Kippt::Collection
6
3
 
@@ -0,0 +1,29 @@
1
+ require_relative "read_collection_resource"
2
+
3
+ # For fetching user's public likes.
4
+ class Kippt::UserLikes
5
+ include Kippt::ReadCollectionResource
6
+
7
+ attr_reader :user
8
+
9
+ def initialize(client, user)
10
+ @client = client
11
+ @user = user
12
+ end
13
+
14
+ def self.valid_filter_parameters
15
+ [:limit, :offset, :include_data]
16
+ end
17
+
18
+ def object_class
19
+ Kippt::Clip
20
+ end
21
+
22
+ def collection_class
23
+ Kippt::ClipCollection
24
+ end
25
+
26
+ def base_uri
27
+ "users/#{user.id}/clips/likes"
28
+ end
29
+ end
@@ -1,8 +1,3 @@
1
- require "kippt/connection"
2
- require "kippt/collection_resource"
3
- require "kippt/list_collection"
4
- require "kippt/list"
5
-
6
1
  # Loads public lists for a user.
7
2
  class Kippt::UserLists
8
3
  include Kippt::CollectionResource
@@ -1,10 +1,7 @@
1
- require "kippt/connection"
2
- require "kippt/collection_resource"
3
- require "kippt/user_collection"
4
- require "kippt/user"
1
+ require_relative "user_collection"
5
2
 
6
3
  class Kippt::Users
7
- include Kippt::CollectionResource
4
+ include Kippt::ReadCollectionResource
8
5
  VALID_SEARCH_PARAMETERS = [:q]
9
6
 
10
7
  def initialize(client)
@@ -29,9 +26,7 @@ class Kippt::Users
29
26
 
30
27
  def search(parameters)
31
28
  if parameters.is_a?(String)
32
- Kippt::UserCollection.new(
33
- client.get("#{base_uri}/search", {:q => parameters}).body,
34
- client)
29
+ search({:q => parameters})
35
30
  else
36
31
  validate_search_parameters(parameters)
37
32
 
@@ -1,3 +1,3 @@
1
1
  module Kippt
2
- VERSION = "2.0.1"
2
+ VERSION = "3.0"
3
3
  end
@@ -67,6 +67,17 @@ describe Kippt::Client do
67
67
  end
68
68
  end
69
69
  end
70
+
71
+ context "when response status is 500" do
72
+ it "raises Kippt::APIError with unknown response text" do
73
+ stub_request(:get, "https://bob:secret@kippt.com/error_path").
74
+ to_return(:status => 500, :body => "500 Everything is broken")
75
+
76
+ expect {
77
+ subject.get("/error_path")
78
+ }.to raise_error(Kippt::APIError, "Unknown response from Kippt: 500 Everything is broken")
79
+ end
80
+ end
70
81
  end
71
82
 
72
83
  describe "#account" do
@@ -79,6 +90,15 @@ describe Kippt::Client do
79
90
  account = subject.account
80
91
  account.should be_a(Kippt::User)
81
92
  end
93
+
94
+ context "when asked for api token" do
95
+ it "asks for the token from the server" do
96
+ subject.should_receive(:get).with("account?include_data=api_token").and_return(
97
+ stub :body => {}
98
+ )
99
+ account = subject.account(true)
100
+ end
101
+ end
82
102
  end
83
103
 
84
104
  describe "#lists" do
@@ -93,9 +113,9 @@ describe Kippt::Client do
93
113
  describe "#clips" do
94
114
  subject { Kippt::Client.new(:username => "bob", :password => "secret") }
95
115
 
96
- it "returns a Kippt::Clips instance" do
116
+ it "returns a Kippt::RootClips instance" do
97
117
  clips = subject.clips
98
- clips.should be_a(Kippt::Clips)
118
+ clips.should be_a(Kippt::RootClips)
99
119
  end
100
120
  end
101
121
 
@@ -108,6 +128,20 @@ describe Kippt::Client do
108
128
  end
109
129
  end
110
130
 
131
+ describe "#collection_resource_for" do
132
+ subject { Kippt::Client.new(valid_user_credentials) }
133
+
134
+ it "returns instance of the resource class" do
135
+ subject.collection_resource_for(Kippt::Clip, {}).should be_a(Kippt::Clip)
136
+ end
137
+
138
+ it "passes itself and the passed arguments as parameters" do
139
+ resource_class = double :resource
140
+ resource_class.should_receive(:new).with(:option1, :option2, subject)
141
+ subject.collection_resource_for(resource_class, :option1, :option2)
142
+ end
143
+ end
144
+
111
145
  describe "#resource_from_url" do
112
146
  subject { Kippt::Client.new(valid_user_credentials) }
113
147
 
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+ require "kippt/clip_likes"
3
+
4
+ describe Kippt::ClipLikes do
5
+ let(:client) { Kippt::Client.new(valid_user_credentials) }
6
+ subject { Kippt::Clip.new({:id => 10}, client).likes }
7
+ let(:base_uri) { "clips/10/likes" }
8
+ let(:singular_fixture) { "user" }
9
+ let(:collection_fixture) { "users" }
10
+ let(:collection_class) { Kippt::UserCollection }
11
+ let(:resource_class) { Kippt::User }
12
+
13
+ it_behaves_like "read collection resource"
14
+ end
@@ -92,17 +92,83 @@ describe Kippt::Clip do
92
92
  "count" => 2, "data" => [{}]
93
93
  }} }
94
94
 
95
- it "returns true" do
95
+ it "returns false" do
96
96
  subject.all_comments_embedded?.should be_false
97
97
  end
98
98
  end
99
99
  end
100
100
 
101
+ describe "#likes" do
102
+ it "returns Kippt::ClipLikes" do
103
+ subject.likes.should be_a Kippt::ClipLikes
104
+ end
105
+
106
+ it "returns object where clip is set" do
107
+ subject.likes.clip.should eq subject
108
+ end
109
+ end
110
+
111
+ describe "#all_likes_embedded?" do
112
+ context "when like count and number of like objects matches" do
113
+ let(:data) { {"likes" => {
114
+ "count" => 2, "data" => [{}, {}]
115
+ }} }
116
+
117
+ it "returns true" do
118
+ subject.all_likes_embedded?.should be_true
119
+ end
120
+ end
121
+
122
+ context "when like count and number of like objects doesn't match" do
123
+ let(:data) { {"likes" => {
124
+ "count" => 2, "data" => [{}]
125
+ }} }
126
+
127
+ it "returns false" do
128
+ subject.all_likes_embedded?.should be_false
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "#likes_count" do
134
+ it "returns the likes count from the response" do
135
+ subject.likes_count.should eq 0
136
+ end
137
+ end
138
+
139
+ describe "#likes_data" do
140
+ it "returns the likes data from the response" do
141
+ subject.likes_data.should eq []
142
+ end
143
+ end
144
+
145
+ describe "#saves" do
146
+ it "returns Kippt::Saves" do
147
+ subject.saves.should be_a Kippt::Saves
148
+ end
149
+
150
+ it "returns object where clip is set" do
151
+ subject.saves.clip.should eq subject
152
+ end
153
+ end
154
+
155
+ describe "#saves_count" do
156
+ it "returns the saves count from the response" do
157
+ subject.saves_count.should eq 0
158
+ end
159
+ end
160
+
161
+ describe "#saves_data" do
162
+ it "returns the saves data from the response" do
163
+ subject.saves_data.should eq []
164
+ end
165
+ end
166
+
101
167
  describe "#like" do
102
168
  let(:like) { stub :like }
103
169
 
104
170
  it "instantiates a Kippt::Like and saves it" do
105
- Kippt::Like.should_receive(:new).with(client, subject).and_return(like)
171
+ Kippt::Like.should_receive(:new).with(subject, client).and_return(like)
106
172
  like.should_receive(:save)
107
173
  subject.like
108
174
  end
@@ -112,9 +178,29 @@ describe Kippt::Clip do
112
178
  let(:like) { stub :like }
113
179
 
114
180
  it "instantiates a Kippt::Like and destroys it" do
115
- Kippt::Like.should_receive(:new).with(client, subject).and_return(like)
181
+ Kippt::Like.should_receive(:new).with(subject, client).and_return(like)
116
182
  like.should_receive(:destroy)
117
183
  subject.unlike
118
184
  end
119
185
  end
186
+
187
+ describe "#favorite" do
188
+ let(:favorite) { stub :favorite }
189
+
190
+ it "instantiates a Kippt::Favorite and saves it" do
191
+ Kippt::Favorite.should_receive(:new).with(subject, client).and_return(favorite)
192
+ favorite.should_receive(:save)
193
+ subject.favorite
194
+ end
195
+ end
196
+
197
+ describe "#unlike" do
198
+ let(:favorite) { stub :favorite }
199
+
200
+ it "instantiates a Kippt::Favorite and destroys it" do
201
+ Kippt::Favorite.should_receive(:new).with(subject, client).and_return(favorite)
202
+ favorite.should_receive(:destroy)
203
+ subject.unfavorite
204
+ end
205
+ end
120
206
  end
@@ -6,18 +6,40 @@ describe Kippt::Clips do
6
6
  subject { client.clips }
7
7
  let(:base_uri) { "clips" }
8
8
  let(:singular_fixture) { "clip" }
9
+ let(:collection_fixture) { "clips" }
9
10
  let(:collection_class) { Kippt::ClipCollection }
10
11
  let(:resource_class) { Kippt::Clip }
11
12
 
12
13
  it_behaves_like "collection resource"
13
14
 
15
+ describe "#build" do
16
+ it "returns new resource" do
17
+ subject.build.should be_a(resource_class)
18
+ end
19
+
20
+ it "accepts parameters" do
21
+ subject.object_class.should_receive(:new).with({:an => "attribute"}, client)
22
+ subject.build(:an => "attribute")
23
+ end
24
+ end
25
+
14
26
  describe "#feed" do
15
27
  subject { Kippt::Client.new(valid_user_credentials).clips }
16
28
 
17
- it "returns ClipCollection" do
18
- stub_get("/clips/feed").
19
- to_return(:status => 200, :body => fixture("feed.json"))
20
- subject.feed.should be_a Kippt::ClipCollection
29
+ it "returns Clips" do
30
+ feed = subject.feed
31
+ feed.should be_a Kippt::Clips
32
+ feed.base_uri.should eq "clips/feed"
33
+ end
34
+ end
35
+
36
+ describe "#favorites" do
37
+ subject { Kippt::Client.new(valid_user_credentials).clips }
38
+
39
+ it "returns Clips" do
40
+ feed = subject.favorites
41
+ feed.should be_a Kippt::Clips
42
+ feed.base_uri.should eq "clips/favorites"
21
43
  end
22
44
  end
23
45
 
@@ -83,7 +105,7 @@ describe Kippt::Clips do
83
105
 
84
106
  clip = Kippt::Clip.new(:url => "http://kiskolabs.com")
85
107
  response = subject.save_resource(clip)
86
- response[:success].should be_false
108
+ response.success?.should be_false
87
109
  response[:error_message].should eq "No good."
88
110
  end
89
111
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "kippt/comment"
3
3
 
4
4
  describe Kippt::Comment do
5
- subject { Kippt::Comment.new(data, client, clip) }
5
+ subject { Kippt::Comment.new(data, clip, client) }
6
6
  let(:client) { Kippt::Client.new(valid_user_credentials) }
7
7
  let(:clip) { stub(:clip) }
8
8
  let(:collection_resource_class) { Kippt::Comments }
@@ -10,28 +10,54 @@ describe Kippt::Comments do
10
10
  let(:collection_class) { Kippt::CommentCollection }
11
11
  let(:resource_class) { Kippt::Comment }
12
12
 
13
+ it_behaves_like "collection resource"
14
+
13
15
  def collection_fixture
14
16
  base_uri.split("/").last
15
17
  end
16
18
 
17
- describe "#all" do
19
+ describe "#build" do
20
+ it "returns new resource" do
21
+ subject.build.should be_a(resource_class)
22
+ end
23
+
24
+ it "accepts parameters" do
25
+ subject.object_class.should_receive(:new).with({:an => "attribute"}, client, clip)
26
+ subject.build({:an => "attribute"})
27
+ end
28
+ end
29
+
30
+
31
+ describe "#fetch" do
18
32
  it "returns collection class" do
19
33
  stub_get("/#{base_uri}").
20
34
  to_return(:status => 200, :body => fixture("#{collection_fixture}.json"))
21
- all_resources = subject.all
35
+ all_resources = subject.fetch
22
36
  all_resources.is_a? collection_class
23
37
  end
24
38
 
25
39
  it "accepts limit and offset options" do
26
40
  stub_get("/#{base_uri}?limit=10&offset=100").
27
41
  to_return(:status => 200, :body => fixture("#{collection_fixture}.json"))
28
- resources = subject.all(:limit => 10, :offset => 100)
42
+ resources = subject.fetch(:limit => 10, :offset => 100)
43
+ end
44
+
45
+ context "when comments are embedded" do
46
+ let(:clip) { stub :clip,
47
+ id: 100,
48
+ all_comments_embedded?: true,
49
+ comments_data: [{body: "Embedded body"}] }
50
+
51
+ it "uses the embedded data to create comments" do
52
+ comments = subject.fetch
53
+ comments.first.body.should eq "Embedded body"
54
+ end
29
55
  end
30
56
 
31
57
  context "when passed unrecognized arguments" do
32
58
  it "raises error" do
33
59
  lambda {
34
- subject.all(:foobar => true)
60
+ subject.fetch(:foobar => true)
35
61
  }.should raise_error(
36
62
  ArgumentError, "Unrecognized argument: foobar")
37
63
  end
@@ -57,7 +83,6 @@ describe Kippt::Comments do
57
83
  to_return(:status => 404, :body => {"message" => "Resource not found."})
58
84
  lambda {
59
85
  subject[10]
60
- subject.all(:foobar => true)
61
86
  }.should raise_error(
62
87
  Kippt::APIError, "Resource could not be loaded: Resource not found.")
63
88
  end