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
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzljMzEzMTM0MmY0YTIxNTkwOTMzMDkzYzM4YmM5ZWU0ZmZjODYyYQ==
5
+ data.tar.gz: !binary |-
6
+ ZTAwMDNhNTJmYzU4NmM2MGVmYzJkNGRkZTNlYTFjZWNkMjFjMTg4ZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YTlhOWNlZWVhNmIxOWIwMDg4NDkxMmY0ZDg5M2ExMmI2YzE1MGJlZDg5OTQz
10
+ ZDkxMTQ1MDM5MThlYzNlNmQxMDk0MzYxZWM3NDVkN2FmMTY4NWRmZjFkNTBh
11
+ OWNmYzVlMDQ0ZTdlY2MwOGFhYTZhNWViMTRiY2M2Yzg2NDMwZmE=
12
+ data.tar.gz: !binary |-
13
+ MjMxZjYxMmU1MjMyNTFjODRlNzQ4MTVkNDZmOTRjYzc3ZWJkNjAyZTgwNGQw
14
+ MjkwMTdkOWNkYzQyNzNjNjg5NzNiZTQxMGUyNTIzYTdlYTc3YTk0Y2IyZmZi
15
+ ZWJmMGU3MzA1MTkwMTNhMDUwM2YxNGM2ZWJiYTU1MjBjNjQ4MTg=
@@ -1,10 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.3
5
4
  - 2.0.0
6
- - jruby-18mode
7
5
  - jruby-19mode
8
- - rbx-18mode
9
- - rbx-19mode
6
+ - rbx-2.2.2
10
7
  script: bundle exec rspec spec
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0 / December 23, 2013
4
+
5
+ Changes all fetching to paginated HTTP endpoints to return a proxy so that you can control
6
+ what you load. This causes breaking changes on some parts of the API.
7
+
8
+ Adds method to get check if the authenticated user is following a list (`List#following?`).
9
+
10
+ Adds support for fetching clips by URL or created after time.
11
+
12
+ Adds support for favoriting and unfavoriting a clip.
13
+
14
+ Adds new `#fetch` method that works like `#all` but better reflects the use of the method.
15
+
16
+ Removes `#total_count` on fetched collections because it's been deprecated:
17
+ https://github.com/kippt/api-documentation/blob/c104158674e55a4c103b93ccd41233e9a6daea0a/basics/pagination.md
18
+
19
+ Improves test coverage.
20
+
21
+ Deprecates support for Ruby 1.8.7.
22
+
23
+ ## 2.0.1 / August 6, 2013
24
+
25
+ Adds ability to fetch the clips for a list. Contributed by [Darep](https://github.com/Darep).
26
+
3
27
  ## 2.0 / July 7, 2013
4
28
 
5
29
  After being long time in development this update adds support for all the
data/Gemfile CHANGED
@@ -6,5 +6,9 @@ platform :jruby do
6
6
  gem "jruby-openssl"
7
7
  end
8
8
 
9
+ group :test do
10
+ gem 'rubysl', platform: :rbx
11
+ end
12
+
9
13
  # Specify your gem's dependencies in kippt.gemspec
10
14
  gemspec
data/README.md CHANGED
@@ -80,7 +80,7 @@ Get all the lists:
80
80
 
81
81
  ```ruby
82
82
  client = Kippt::Client.new(username: "vesan", token: "2544d6bfddf5893ec8617")
83
- lists = client.lists.all # Returns Kippt::ListCollection
83
+ lists = client.lists.fetch # Returns Kippt::ListCollection
84
84
  ```
85
85
 
86
86
  Get single list:
@@ -96,6 +96,10 @@ Get single lists’s clips:
96
96
  ```ruby
97
97
  client = Kippt::Client.new(username: "vesan", token: "2544d6bfddf5893ec8617")
98
98
  list_id = 10
99
+ list = client.lists[list_id].clips # Returns a Kippt::ClipCollection
100
+
101
+ # OR
102
+
99
103
  list = Kippt::List.new({ id: list_id }, client)
100
104
  list.clips # Returns a Kippt::ClipCollection
101
105
  ```
@@ -105,7 +109,13 @@ list.clips # Returns a Kippt::ClipCollection
105
109
 
106
110
  ```ruby
107
111
  client = Kippt::Client.new(username: "vesan", token: "2544d6bfddf5893ec8617")
108
- clips = client.clips.all # Returns Kippt::ClipCollection
112
+ client.clips.fetch # Returns Kippt::ClipCollection
113
+
114
+ # Returns first page of clips for an URL
115
+ client.clips.fetch(url: "https://github.com/vesan/kippt")
116
+
117
+ # Returns first page of clips added in the last day
118
+ client.clips.fetch(since: Time.now.to_i - 86400)
109
119
  ```
110
120
 
111
121
  Both ListCollection and ClipCollection are Enumerable.
@@ -117,7 +127,7 @@ Lists and clips are paginated:
117
127
 
118
128
  ```ruby
119
129
  client = Kippt::Client.new(username: "vesan", token: "2544d6bfddf5893ec8617")
120
- clips = client.clips.all
130
+ clips = client.clips.fetch
121
131
 
122
132
  clips.total_count
123
133
  clips.offset
@@ -136,7 +146,7 @@ clips.previous_page # Returns new Kippt::ClipCollection
136
146
  Limit and offset can be controlled manually:
137
147
 
138
148
  ```ruby
139
- client.clips.all(limit: 25, offset: 50)
149
+ client.clips.fetch(limit: 25, offset: 50)
140
150
  ```
141
151
 
142
152
 
data/TODO.md CHANGED
@@ -2,6 +2,22 @@
2
2
  * [DONE] Timestamps as time
3
3
  * Better exceptions
4
4
 
5
+ # 3.0
6
+
7
+ * [DONE] Add support for favorites
8
+ * [DONE] Add support for filtering clips by URL
9
+ * [DONE] Any other filtering that is missing?
10
+ * [DONE] Convert to return proxy:
11
+ ** [DONE] list.clips
12
+ ** [DONE] clip.comments
13
+ ** [DONE] clip.likes
14
+ ** [DONE] clip.saves
15
+ ** [DONE] clips.feed
16
+ ** [DONE] user_clips.favorites
17
+ * [DONE] Check that all end points have the same filtering capabilities
18
+ * [DONE] Refactors users.search
19
+ * [DONE] Make sure likes make sense. Now User & Like objects are somehow mixed.
20
+
5
21
  # Clip
6
22
 
7
23
  * [DONE] Getting the feed of authenticated user
@@ -1,8 +1,13 @@
1
- require "kippt/version"
2
- require "core_ext/open_struct"
1
+ require_relative "kippt/version"
3
2
  require "faraday"
4
3
  require "faraday_middleware"
5
- require "kippt/client"
4
+
5
+ require_relative "kippt/helpers"
6
+ require_relative "kippt/resource"
7
+ require_relative "kippt/collection_resource"
8
+ require_relative "kippt/collection"
9
+ require_relative "kippt/user"
10
+ require_relative "kippt/client"
6
11
 
7
12
  module Kippt
8
13
  class APIError < StandardError; end
@@ -1,7 +1,7 @@
1
- require "kippt/connection"
2
- require "kippt/clips"
3
- require "kippt/lists"
4
- require "kippt/users"
1
+ require_relative "connection"
2
+ require_relative "root_clips"
3
+ require_relative "lists"
4
+ require_relative "users"
5
5
 
6
6
  class Kippt::Client
7
7
  include Kippt::Connection
@@ -52,7 +52,7 @@ class Kippt::Client
52
52
  end
53
53
 
54
54
  def clips
55
- Kippt::Clips.new(self)
55
+ Kippt::RootClips.new(self)
56
56
  end
57
57
 
58
58
  def users
@@ -60,7 +60,7 @@ class Kippt::Client
60
60
  end
61
61
 
62
62
  def collection_resource_for(resource_class, *options)
63
- resource_class.new(*([self] + options))
63
+ resource_class.new(*(options + [self]))
64
64
  end
65
65
 
66
66
  def resource_from_url(resource_class, url)
@@ -1,9 +1,9 @@
1
- require "kippt/resource"
2
- require "kippt/list"
3
- require "kippt/comments"
4
- require "kippt/likes"
5
- require "kippt/saves"
6
- require "kippt/user"
1
+ require_relative "comments"
2
+ require_relative "clip_likes"
3
+ require_relative "like"
4
+ require_relative "saves"
5
+ require_relative "list"
6
+ require_relative "favorite"
7
7
 
8
8
  class Kippt::Clip
9
9
  include Kippt::Resource
@@ -53,7 +53,7 @@ class Kippt::Clip
53
53
  end
54
54
 
55
55
  def likes
56
- Kippt::Likes.new(client, self)
56
+ Kippt::ClipLikes.new(client, self)
57
57
  end
58
58
 
59
59
  def all_likes_embedded?
@@ -81,10 +81,18 @@ class Kippt::Clip
81
81
  end
82
82
 
83
83
  def like
84
- Kippt::Like.new(client, self).save
84
+ Kippt::Like.new(self, client).save
85
85
  end
86
86
 
87
87
  def unlike
88
- Kippt::Like.new(client, self).destroy
88
+ Kippt::Like.new(self, client).destroy
89
+ end
90
+
91
+ def favorite
92
+ Kippt::Favorite.new(self, client).save
93
+ end
94
+
95
+ def unfavorite
96
+ Kippt::Favorite.new(self, client).destroy
89
97
  end
90
98
  end
@@ -1,5 +1,5 @@
1
- require "kippt/collection"
2
- require "kippt/clip"
1
+ require_relative "collection"
2
+ require_relative "clip"
3
3
 
4
4
  class Kippt::ClipCollection
5
5
  include Kippt::Collection
@@ -0,0 +1,29 @@
1
+ require_relative "read_collection_resource"
2
+
3
+ # For fetching clip's likes.
4
+ class Kippt::ClipLikes
5
+ include Kippt::ReadCollectionResource
6
+
7
+ attr_reader :clip
8
+
9
+ def initialize(client, clip)
10
+ @client = client
11
+ @clip = clip
12
+ end
13
+
14
+ def self.valid_filter_parameters
15
+ [:limit, :offset]
16
+ end
17
+
18
+ def object_class
19
+ Kippt::User
20
+ end
21
+
22
+ def collection_class
23
+ Kippt::UserCollection
24
+ end
25
+
26
+ def base_uri
27
+ "clips/#{clip.id}/likes"
28
+ end
29
+ end
@@ -1,18 +1,19 @@
1
- require "kippt/connection"
2
- require "kippt/collection_resource"
3
- require "kippt/clip_collection"
4
- require "kippt/clip"
1
+ require_relative "clip_collection"
2
+ require_relative "clip"
5
3
 
4
+ # Generic clip proxy. Used to wrap endpoints that return clips as JSON.
6
5
  class Kippt::Clips
7
6
  include Kippt::CollectionResource
8
- VALID_SEARCH_PARAMETERS = [:q, :list, :is_starred]
9
7
 
10
- def initialize(client)
8
+ attr_reader :base_uri
9
+
10
+ def initialize(client, base_uri)
11
11
  @client = client
12
+ @base_uri = base_uri
12
13
  end
13
14
 
14
15
  def self.valid_filter_parameters
15
- [:limit, :offset, :is_read_later, :is_starred]
16
+ [:limit, :offset, :is_read_later, :is_starred, :url, :since, :include_data]
16
17
  end
17
18
 
18
19
  def object_class
@@ -22,34 +23,4 @@ class Kippt::Clips
22
23
  def collection_class
23
24
  Kippt::ClipCollection
24
25
  end
25
-
26
- def base_uri
27
- "clips"
28
- end
29
-
30
- def feed
31
- Kippt::ClipCollection.new(client.get("clips/feed").body, client)
32
- end
33
-
34
- def search(parameters)
35
- if parameters.is_a?(String)
36
- Kippt::ClipCollection.new(
37
- client.get("search/clips", {:q => parameters}).body,
38
- client)
39
- else
40
- validate_search_parameters(parameters)
41
-
42
- Kippt::ClipCollection.new(
43
- client.get("search/clips", parameters).body,
44
- client)
45
- end
46
- end
47
-
48
- private
49
-
50
- def validate_search_parameters(parameters)
51
- parameters.each do |key, value|
52
- raise ArgumentError.new("'#{key}' is not a valid search parameter") unless VALID_SEARCH_PARAMETERS.include?(key)
53
- end
54
- end
55
26
  end
@@ -1,7 +1,7 @@
1
1
  module Kippt::Collection
2
2
  include Enumerable
3
3
 
4
- attr_reader :total_count, :limit, :offset
4
+ attr_reader :limit, :offset
5
5
 
6
6
  def initialize(data, client = nil)
7
7
  meta = data.fetch("meta") { {} }
@@ -9,7 +9,6 @@ module Kippt::Collection
9
9
  @offset = meta.fetch("offset") { nil }
10
10
  @next = meta.fetch("next") { nil }
11
11
  @previous = meta.fetch("previous") { nil }
12
- @total_count = meta.fetch("total_count") { nil }
13
12
 
14
13
  @client = client
15
14
 
@@ -1,76 +1,60 @@
1
- module Kippt::CollectionResource
2
- # For certain objects you can get extra data by giving option `include_data`.
3
- # For example with clips you can add `include_data: "list,via"`.
4
- def all(options = {})
5
- validate_collection_options(options)
1
+ require_relative "read_collection_resource"
6
2
 
7
- collection_class.new(client.get(base_uri, options).body, client)
8
- end
3
+ module Kippt
4
+ module CollectionResource
5
+ include Kippt::ReadCollectionResource
9
6
 
10
- def build(attributes = {})
11
- object_class.new(attributes, client)
12
- end
7
+ class SaveResponse
8
+ attr_reader :response
13
9
 
14
- def create(attributes = {})
15
- build(attributes).save
16
- end
10
+ def initialize(response)
11
+ @response = response
12
+ end
17
13
 
18
- # For certain objects you can get extra data by giving option `include_data`.
19
- # For example with clips you can add `include_data: "list,via"`.
20
- def [](resource_id, options = {})
21
- response = client.get("#{base_uri}/#{resource_id}", options)
22
- if response.success?
23
- object_class.new(response.body, client)
24
- else
25
- raise Kippt::APIError.new("Resource could not be loaded: #{response.body["message"]}")
26
- end
27
- end
14
+ def [](key)
15
+ return @save_response[key] if @save_response
28
16
 
29
- alias find []
17
+ @save_response = {success: response.success?, resource: response.body}
18
+ if response.body["message"]
19
+ @save_response[:error_message] = response.body["message"]
20
+ end
30
21
 
31
- def collection_from_url(url)
32
- raise ArgumentError.new("The parameter URL can't be blank") if url.nil? || url == ""
22
+ @save_response[key]
23
+ end
33
24
 
34
- collection_class.new(client.get(url).body, client)
35
- end
25
+ def success?
26
+ self[:success]
27
+ end
28
+ end
36
29
 
37
- def save_resource(object)
38
- if object.id
39
- response = client.put("#{base_uri}/#{object.id}", :data => writable_parameters_from(object))
40
- else
41
- response = client.post("#{base_uri}", :data => writable_parameters_from(object))
30
+ def build(attributes = {})
31
+ object_class.new(attributes, client)
42
32
  end
43
33
 
44
- save_response = {:success => response.success?}
45
- save_response[:resource] = response.body
46
- if response.body["message"]
47
- save_response[:error_message] = response.body["message"]
34
+ def create(attributes = {})
35
+ build(attributes).save
48
36
  end
49
37
 
50
- save_response
51
- end
38
+ def save_resource(object)
39
+ if object.id
40
+ response = client.put("#{base_uri}/#{object.id}", :data => writable_parameters_from(object))
41
+ else
42
+ response = client.post("#{base_uri}", :data => writable_parameters_from(object))
43
+ end
52
44
 
53
- def destroy_resource(resource)
54
- if resource.id
55
- client.delete("#{base_uri}/#{resource.id}").success?
45
+ SaveResponse.new(response)
56
46
  end
57
- end
58
47
 
59
- private
60
-
61
- def validate_collection_options(options)
62
- options.each do |key, _|
63
- unless self.class.valid_filter_parameters.include?(key)
64
- raise ArgumentError.new("Unrecognized argument: #{key}")
48
+ def destroy_resource(resource)
49
+ if resource.id
50
+ client.delete("#{base_uri}/#{resource.id}").success?
65
51
  end
66
52
  end
67
- end
68
53
 
69
- def writable_parameters_from(resource)
70
- resource.writable_attributes_hash
71
- end
54
+ private
72
55
 
73
- def client
74
- @client
56
+ def writable_parameters_from(resource)
57
+ resource.writable_attributes_hash
58
+ end
75
59
  end
76
60
  end