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.
- checksums.yaml +15 -0
- data/.travis.yml +1 -4
- data/CHANGELOG.md +24 -0
- data/Gemfile +4 -0
- data/README.md +14 -4
- data/TODO.md +16 -0
- data/lib/kippt.rb +8 -3
- data/lib/kippt/client.rb +6 -6
- data/lib/kippt/clip.rb +17 -9
- data/lib/kippt/clip_collection.rb +2 -2
- data/lib/kippt/clip_likes.rb +29 -0
- data/lib/kippt/clips.rb +8 -37
- data/lib/kippt/collection.rb +1 -2
- data/lib/kippt/collection_resource.rb +39 -55
- data/lib/kippt/comment.rb +2 -4
- data/lib/kippt/comment_collection.rb +1 -2
- data/lib/kippt/comments.rb +5 -3
- data/lib/kippt/connection.rb +7 -3
- data/lib/kippt/favorite.rb +46 -0
- data/lib/kippt/favorites.rb +20 -0
- data/lib/kippt/followers.rb +6 -4
- data/lib/kippt/following.rb +6 -4
- data/lib/kippt/helpers.rb +17 -0
- data/lib/kippt/like.rb +4 -6
- data/lib/kippt/like_collection.rb +11 -0
- data/lib/kippt/likes.rb +2 -30
- data/lib/kippt/list.rb +8 -2
- data/lib/kippt/list_collection.rb +2 -2
- data/lib/kippt/lists.rb +2 -4
- data/lib/kippt/read_collection_resource.rb +43 -0
- data/lib/kippt/root_clips.rb +39 -0
- data/lib/kippt/saves.rb +4 -3
- data/lib/kippt/user.rb +10 -6
- data/lib/kippt/user_clips.rb +6 -26
- data/lib/kippt/user_collection.rb +0 -3
- data/lib/kippt/user_likes.rb +29 -0
- data/lib/kippt/user_lists.rb +0 -5
- data/lib/kippt/users.rb +3 -8
- data/lib/kippt/version.rb +1 -1
- data/spec/kippt/client_spec.rb +36 -2
- data/spec/kippt/clip_likes_spec.rb +14 -0
- data/spec/kippt/clip_spec.rb +89 -3
- data/spec/kippt/clips_spec.rb +27 -5
- data/spec/kippt/comment_spec.rb +1 -1
- data/spec/kippt/comments_spec.rb +30 -5
- data/spec/kippt/favorite_spec.rb +38 -0
- data/spec/kippt/favorites_spec.rb +18 -0
- data/spec/kippt/follow_relationship_spec.rb +30 -0
- data/spec/kippt/followers_spec.rb +6 -9
- data/spec/kippt/following_spec.rb +6 -9
- data/spec/kippt/like_spec.rb +38 -0
- data/spec/kippt/likes_spec.rb +21 -0
- data/spec/kippt/list_spec.rb +43 -10
- data/spec/kippt/lists_spec.rb +12 -0
- data/spec/kippt/saves_spec.rb +3 -3
- data/spec/kippt/user_clips_spec.rb +14 -2
- data/spec/kippt/user_likes_spec.rb +14 -0
- data/spec/kippt/user_lists_spec.rb +12 -0
- data/spec/kippt/user_spec.rb +11 -0
- data/spec/kippt/users_spec.rb +2 -1
- data/spec/shared_examples/collection.rb +117 -0
- data/spec/shared_examples/collection_resource.rb +13 -0
- data/spec/shared_examples/read_collection_resource.rb +77 -0
- data/spec/shared_examples/resource.rb +80 -0
- data/spec/spec_helper.rb +2 -298
- metadata +33 -26
- data/lib/core_ext/open_struct.rb +0 -5
data/lib/kippt/comment.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
require "kippt/user"
|
3
|
-
require "kippt/clip"
|
1
|
+
require_relative "comments"
|
4
2
|
|
5
3
|
class Kippt::Comment
|
6
4
|
include Kippt::Resource
|
@@ -12,7 +10,7 @@ class Kippt::Comment
|
|
12
10
|
|
13
11
|
attr_reader :clip
|
14
12
|
|
15
|
-
def initialize(attributes = {},
|
13
|
+
def initialize(attributes = {}, clip = nil, client = nil)
|
16
14
|
super(attributes, client)
|
17
15
|
@clip = clip
|
18
16
|
end
|
data/lib/kippt/comments.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative "comment_collection"
|
2
|
+
require_relative "comment"
|
3
3
|
|
4
4
|
class Kippt::Comments
|
5
5
|
include Kippt::CollectionResource
|
@@ -27,7 +27,7 @@ class Kippt::Comments
|
|
27
27
|
"clips/#{clip.id}/comments"
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def fetch(options = {})
|
31
31
|
validate_collection_options(options)
|
32
32
|
|
33
33
|
if options.empty? && @clip.all_comments_embedded?
|
@@ -37,6 +37,8 @@ class Kippt::Comments
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
alias all fetch
|
41
|
+
|
40
42
|
def build(attributes = {})
|
41
43
|
object_class.new(attributes, client, clip)
|
42
44
|
end
|
data/lib/kippt/connection.rb
CHANGED
@@ -9,7 +9,7 @@ module Kippt::Connection
|
|
9
9
|
begin
|
10
10
|
MultiJson.load(body) unless body.strip.empty?
|
11
11
|
rescue MultiJson::DecodeError
|
12
|
-
|
12
|
+
body
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -63,8 +63,12 @@ module Kippt::Connection
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
if response.status == 401
|
67
|
-
|
66
|
+
if response.status == 401 || (500..599).include?(response.status)
|
67
|
+
if response.body && response.body["message"]
|
68
|
+
raise Kippt::APIError.new(response.body["message"])
|
69
|
+
else
|
70
|
+
raise Kippt::APIError.new("Unknown response from Kippt: #{response.body}")
|
71
|
+
end
|
68
72
|
end
|
69
73
|
|
70
74
|
response
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative "favorites"
|
2
|
+
|
3
|
+
class Kippt::Favorite
|
4
|
+
attr_reader :clip, :errors
|
5
|
+
|
6
|
+
def initialize(clip, client)
|
7
|
+
@client = client
|
8
|
+
@errors = []
|
9
|
+
@clip = clip
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def collection_resource_class
|
17
|
+
Kippt::Favorites
|
18
|
+
end
|
19
|
+
|
20
|
+
def writable_attributes_hash
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def save
|
25
|
+
@errors = []
|
26
|
+
response = collection_resource.save_resource(self)
|
27
|
+
if response[:error_message]
|
28
|
+
errors << response[:error_message]
|
29
|
+
end
|
30
|
+
response[:success]
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy
|
34
|
+
collection_resource.destroy_resource(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def collection_resource
|
40
|
+
@collection_resource ||= client.collection_resource_for(collection_resource_class, clip)
|
41
|
+
end
|
42
|
+
|
43
|
+
def client
|
44
|
+
@client
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This class is only meant to be used by Kippt::Favorite class for favoriting
|
2
|
+
# and unfavoriting clips.
|
3
|
+
class Kippt::Favorites
|
4
|
+
include Kippt::CollectionResource
|
5
|
+
|
6
|
+
attr_reader :clip
|
7
|
+
|
8
|
+
def initialize(client, clip)
|
9
|
+
@client = client
|
10
|
+
@clip = clip
|
11
|
+
end
|
12
|
+
|
13
|
+
def base_uri
|
14
|
+
"clips/#{clip.id}/favorites"
|
15
|
+
end
|
16
|
+
|
17
|
+
def destroy_resource(resource)
|
18
|
+
client.delete(base_uri).success?
|
19
|
+
end
|
20
|
+
end
|
data/lib/kippt/followers.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
require "kippt/user_collection"
|
3
|
-
require "kippt/user"
|
1
|
+
require_relative "user_collection"
|
4
2
|
|
5
3
|
class Kippt::Followers
|
6
|
-
include Kippt::
|
4
|
+
include Kippt::ReadCollectionResource
|
7
5
|
|
8
6
|
attr_reader :user
|
9
7
|
|
8
|
+
def self.valid_filter_parameters
|
9
|
+
[:limit, :offset]
|
10
|
+
end
|
11
|
+
|
10
12
|
def initialize(client, user)
|
11
13
|
@client = client
|
12
14
|
@user = user
|
data/lib/kippt/following.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
require "kippt/user_collection"
|
3
|
-
require "kippt/user"
|
1
|
+
require_relative "user_collection"
|
4
2
|
|
5
3
|
class Kippt::Following
|
6
|
-
include Kippt::
|
4
|
+
include Kippt::ReadCollectionResource
|
7
5
|
|
8
6
|
attr_reader :user
|
9
7
|
|
8
|
+
def self.valid_filter_parameters
|
9
|
+
[:limit, :offset]
|
10
|
+
end
|
11
|
+
|
10
12
|
def initialize(client, user)
|
11
13
|
@client = client
|
12
14
|
@user = user
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kippt::Helpers
|
2
|
+
private
|
3
|
+
|
4
|
+
def assert_valid_keys(hash, *valid_keys)
|
5
|
+
valid_keys.flatten!
|
6
|
+
hash.each_key do |k|
|
7
|
+
raise ArgumentError.new("Unrecognized argument: #{k}") unless valid_keys.include?(k)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def symbolize_keys! hash
|
12
|
+
hash.keys.each do |key|
|
13
|
+
hash[(key.to_sym rescue key) || key] = hash.delete(key)
|
14
|
+
end
|
15
|
+
hash
|
16
|
+
end
|
17
|
+
end
|
data/lib/kippt/like.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
1
|
+
require_relative "likes"
|
2
2
|
|
3
3
|
class Kippt::Like
|
4
|
-
|
4
|
+
attr_reader :clip, :errors
|
5
|
+
|
6
|
+
def initialize(clip, client)
|
5
7
|
@client = client
|
6
8
|
@errors = []
|
7
9
|
@clip = clip
|
@@ -41,8 +43,4 @@ class Kippt::Like
|
|
41
43
|
def client
|
42
44
|
@client
|
43
45
|
end
|
44
|
-
|
45
|
-
def clip
|
46
|
-
@clip
|
47
|
-
end
|
48
46
|
end
|
data/lib/kippt/likes.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require "kippt/like"
|
4
|
-
|
1
|
+
# This class is only meant to be used by Kippt::Like class for liking and
|
2
|
+
# unliking clips.
|
5
3
|
class Kippt::Likes
|
6
4
|
include Kippt::CollectionResource
|
7
5
|
|
@@ -12,36 +10,10 @@ class Kippt::Likes
|
|
12
10
|
@clip = clip
|
13
11
|
end
|
14
12
|
|
15
|
-
def self.valid_filter_parameters
|
16
|
-
[]
|
17
|
-
end
|
18
|
-
|
19
|
-
def object_class
|
20
|
-
Kippt::User
|
21
|
-
end
|
22
|
-
|
23
|
-
def collection_class
|
24
|
-
Kippt::UserCollection
|
25
|
-
end
|
26
|
-
|
27
13
|
def base_uri
|
28
14
|
"clips/#{clip.id}/likes"
|
29
15
|
end
|
30
16
|
|
31
|
-
def all(options = {})
|
32
|
-
validate_collection_options(options)
|
33
|
-
|
34
|
-
if options.empty? && @clip.all_likes_embedded?
|
35
|
-
collection_class.new({"objects" => @clip.likes_data}, client)
|
36
|
-
else
|
37
|
-
collection_class.new(client.get(base_uri, options).body, client)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def build
|
42
|
-
Kippt::Like.new(client, clip)
|
43
|
-
end
|
44
|
-
|
45
17
|
def destroy_resource(resource)
|
46
18
|
client.delete(base_uri).success?
|
47
19
|
end
|
data/lib/kippt/list.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "clips"
|
2
2
|
|
3
3
|
class Kippt::List
|
4
4
|
include Kippt::Resource
|
@@ -22,7 +22,13 @@ class Kippt::List
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def clips
|
25
|
-
Kippt::
|
25
|
+
Kippt::Clips.new(client, "lists/#{id}/clips")
|
26
|
+
end
|
27
|
+
|
28
|
+
def following?
|
29
|
+
response = client.get("#{resource_uri}relationship")
|
30
|
+
raise Kippt::APIError.new("There was an error with the request: #{response.body["message"]}") unless response.success?
|
31
|
+
response.body["following"]
|
26
32
|
end
|
27
33
|
|
28
34
|
def follow
|
data/lib/kippt/lists.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Kippt::ReadCollectionResource
|
2
|
+
include Kippt::Helpers
|
3
|
+
|
4
|
+
# For certain objects you can get extra data by giving option `include_data`.
|
5
|
+
# For example with clips you can add `include_data: "list,via"`.
|
6
|
+
def fetch(options = {})
|
7
|
+
validate_collection_options(options)
|
8
|
+
|
9
|
+
collection_class.new(client.get(base_uri, options).body, client)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias all fetch
|
13
|
+
|
14
|
+
# For certain objects you can get extra data by giving option `include_data`.
|
15
|
+
# For example with clips you can add `include_data: "list,via"`.
|
16
|
+
def [](resource_id, options = {})
|
17
|
+
response = client.get("#{base_uri}/#{resource_id}", options)
|
18
|
+
if response.success?
|
19
|
+
object_class.new(response.body, client)
|
20
|
+
else
|
21
|
+
raise Kippt::APIError.new("Resource could not be loaded: #{response.body["message"]}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
alias find []
|
26
|
+
|
27
|
+
def collection_from_url(url)
|
28
|
+
raise ArgumentError.new("The parameter URL can't be blank") if url.nil? || url == ""
|
29
|
+
|
30
|
+
collection_class.new(client.get(url).body, client)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def validate_collection_options(options)
|
36
|
+
symbolize_keys! options
|
37
|
+
assert_valid_keys options, self.class.valid_filter_parameters
|
38
|
+
end
|
39
|
+
|
40
|
+
def client
|
41
|
+
@client
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative "clips"
|
2
|
+
|
3
|
+
# The root "/clips" resource that exposes features like feed, favorites and
|
4
|
+
# search.
|
5
|
+
class Kippt::RootClips < Kippt::Clips
|
6
|
+
VALID_SEARCH_PARAMETERS = [:q, :list, :is_starred]
|
7
|
+
|
8
|
+
def initialize(client)
|
9
|
+
super(client, "clips")
|
10
|
+
end
|
11
|
+
|
12
|
+
def feed
|
13
|
+
Kippt::Clips.new(client, "clips/feed")
|
14
|
+
end
|
15
|
+
|
16
|
+
def favorites
|
17
|
+
Kippt::Clips.new(client, "clips/favorites")
|
18
|
+
end
|
19
|
+
|
20
|
+
def search(parameters)
|
21
|
+
if parameters.is_a?(String)
|
22
|
+
search({:q => parameters})
|
23
|
+
else
|
24
|
+
validate_search_parameters(parameters)
|
25
|
+
|
26
|
+
Kippt::ClipCollection.new(
|
27
|
+
client.get("search/clips", parameters).body,
|
28
|
+
client)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def validate_search_parameters(parameters)
|
35
|
+
parameters.each do |key, value|
|
36
|
+
raise ArgumentError.new("'#{key}' is not a valid search parameter") unless VALID_SEARCH_PARAMETERS.include?(key)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/kippt/saves.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require "kippt/user"
|
1
|
+
require_relative "user_collection"
|
3
2
|
|
4
3
|
class Kippt::Saves
|
5
4
|
attr_reader :clip
|
@@ -13,10 +12,12 @@ class Kippt::Saves
|
|
13
12
|
Kippt::UserCollection
|
14
13
|
end
|
15
14
|
|
16
|
-
def
|
15
|
+
def fetch(options = {})
|
17
16
|
collection_class.new({"objects" => @clip.saves_data}, client)
|
18
17
|
end
|
19
18
|
|
19
|
+
alias all fetch
|
20
|
+
|
20
21
|
private
|
21
22
|
|
22
23
|
def client
|
data/lib/kippt/user.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require_relative "users"
|
2
|
+
require_relative "followers"
|
3
|
+
require_relative "following"
|
4
|
+
require_relative "follow_relationship"
|
5
|
+
require_relative "user_lists"
|
6
|
+
require_relative "user_likes"
|
7
7
|
|
8
8
|
class Kippt::User
|
9
9
|
include Kippt::Resource
|
@@ -36,6 +36,10 @@ class Kippt::User
|
|
36
36
|
Kippt::Following.new(client, self)
|
37
37
|
end
|
38
38
|
|
39
|
+
def likes
|
40
|
+
Kippt::UserLikes.new(client, self)
|
41
|
+
end
|
42
|
+
|
39
43
|
# Tells if authenticated user is following the user.
|
40
44
|
def following?
|
41
45
|
Kippt::FollowRelationship.new(client, self).following?
|