feedlr 0.1.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 +7 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.travis.yml +22 -0
- data/.yardopts +5 -0
- data/Gemfile +32 -0
- data/Guardfile +7 -0
- data/LICENSE.md +16 -0
- data/README.md +85 -0
- data/Rakefile +10 -0
- data/feedlr.gemspec +27 -0
- data/lib/feedlr.rb +34 -0
- data/lib/feedlr/base.rb +4 -0
- data/lib/feedlr/client.rb +60 -0
- data/lib/feedlr/collection.rb +15 -0
- data/lib/feedlr/error.rb +79 -0
- data/lib/feedlr/gateway/categories.rb +36 -0
- data/lib/feedlr/gateway/entries.rb +40 -0
- data/lib/feedlr/gateway/evernote.rb +37 -0
- data/lib/feedlr/gateway/facebook.rb +28 -0
- data/lib/feedlr/gateway/feeds.rb +26 -0
- data/lib/feedlr/gateway/markers.rb +195 -0
- data/lib/feedlr/gateway/microsoft.rb +30 -0
- data/lib/feedlr/gateway/mixes.rb +29 -0
- data/lib/feedlr/gateway/opml.rb +26 -0
- data/lib/feedlr/gateway/preferences.rb +25 -0
- data/lib/feedlr/gateway/profile.rb +25 -0
- data/lib/feedlr/gateway/search.rb +41 -0
- data/lib/feedlr/gateway/shorten.rb +17 -0
- data/lib/feedlr/gateway/streams.rb +42 -0
- data/lib/feedlr/gateway/subscriptions.rb +43 -0
- data/lib/feedlr/gateway/tags.rb +88 -0
- data/lib/feedlr/gateway/topics.rb +43 -0
- data/lib/feedlr/gateway/twitter.rb +29 -0
- data/lib/feedlr/mapper.rb +25 -0
- data/lib/feedlr/rate_limit.rb +21 -0
- data/lib/feedlr/request.rb +148 -0
- data/lib/feedlr/success.rb +5 -0
- data/lib/feedlr/version.rb +15 -0
- data/spec/cassettes/Feedlr_Gateway_Categories/_change_category_label/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Categories/_delete_category/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Categories/_user_categories/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Entries/_add_entry/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Entries/_user_entries/resoponds_with_hashie_object.yml +337 -0
- data/spec/cassettes/Feedlr_Gateway_Evernote/_add_to_evernote/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Evernote/_evernote_notebooks/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Evernote/_unlink_evernote/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Facebook/_facebook_suggestions/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Facebook/_unlink_facebook/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Feeds/_feeds/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_lastest_tagged_entries/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_articles_as_read/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_articles_as_unread/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_categories_as_read/with_asOf_param/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_categories_as_read/with_lastReadEntryId_param/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_feeds_as_read/with_asOf_param/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_mark_feeds_as_read/with_lastReadEntryId_param/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_sync_read_counts/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_undo_mark_categories_as_read/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_undo_mark_feeds_as_read/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Markers/_user_unread_counts/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Microsoft/_add_to_onenote/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Microsoft/_unlink_microsoft/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Mixes/_stream_most_engaging/resoponds_with_hashie_object.yml +102 -0
- data/spec/cassettes/Feedlr_Gateway_Opml/_import_opml/resoponds_with_hashie_object.yml +63 -0
- data/spec/cassettes/Feedlr_Gateway_Opml/_user_opml/resoponds_with_hashie_object.yml +80 -0
- data/spec/cassettes/Feedlr_Gateway_Preferences/_preferences/resoponds_with_hashie_object.yml +52 -0
- data/spec/cassettes/Feedlr_Gateway_Preferences/_update_preferences/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Profile/_get_profile/resoponds_with_hashie_object.yml +54 -0
- data/spec/cassettes/Feedlr_Gateway_Profile/_profile/resoponds_with_hashie_object.yml +54 -0
- data/spec/cassettes/Feedlr_Gateway_Profile/_update_profile/resoponds_with_hashie_object.yml +54 -0
- data/spec/cassettes/Feedlr_Gateway_Search/_search_feeds/resoponds_with_hashie_object.yml +303 -0
- data/spec/cassettes/Feedlr_Gateway_Search/_search_stream/resoponds_with_hashie_object.yml +1941 -0
- data/spec/cassettes/Feedlr_Gateway_Shorten/_shorten/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Streams/_stream_entries_contents/resoponds_with_hashie_object.yml +1150 -0
- data/spec/cassettes/Feedlr_Gateway_Streams/_stream_entries_ids/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Subscriptions/_add_subscription/resoponds_with_hashie_object.yml +53 -0
- data/spec/cassettes/Feedlr_Gateway_Subscriptions/_create_subscription/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Subscriptions/_delete_subscription/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Subscriptions/_update_subscription/resoponds_with_hashie_object.yml +51 -0
- data/spec/cassettes/Feedlr_Gateway_Subscriptions/_user_subscriptions/resoponds_with_hashie_object.yml +57 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_change_tag_label/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_delete_tags/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_get_tags/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_tag_entries/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_untag_entries/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Tags/_user_tags/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Topics/_add_topic/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Topics/_delete_topic/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Topics/_update_topic/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Topics/_user_topics/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Twitter/_twitter_suggestions/resoponds_with_hashie_object.yml +50 -0
- data/spec/cassettes/Feedlr_Gateway_Twitter/_unlink_twitter/resoponds_with_hashie_object.yml +50 -0
- data/spec/feedly/base_spec.rb +10 -0
- data/spec/feedly/client_spec.rb +49 -0
- data/spec/feedly/collection_spec.rb +21 -0
- data/spec/feedly/error_spec.rb +59 -0
- data/spec/feedly/feedly_spec.rb +54 -0
- data/spec/feedly/gateway/categories_spec.rb +59 -0
- data/spec/feedly/gateway/entries_spec.rb +67 -0
- data/spec/feedly/gateway/evernote_spec.rb +60 -0
- data/spec/feedly/gateway/facebook_spec.rb +36 -0
- data/spec/feedly/gateway/feeds_spec.rb +36 -0
- data/spec/feedly/gateway/markers_spec.rb +295 -0
- data/spec/feedly/gateway/microsoft_spec.rb +40 -0
- data/spec/feedly/gateway/mixes_spec.rb +27 -0
- data/spec/feedly/gateway/opml_spec.rb +57 -0
- data/spec/feedly/gateway/preferences_spec.rb +41 -0
- data/spec/feedly/gateway/profile_spec.rb +40 -0
- data/spec/feedly/gateway/search_spec.rb +43 -0
- data/spec/feedly/gateway/shorten_spec.rb +27 -0
- data/spec/feedly/gateway/streams_spec.rb +44 -0
- data/spec/feedly/gateway/subscriptions_spec.rb +87 -0
- data/spec/feedly/gateway/tags_spec.rb +129 -0
- data/spec/feedly/gateway/topics_spec.rb +77 -0
- data/spec/feedly/gateway/twitter_spec.rb +37 -0
- data/spec/feedly/mapper_spec.rb +25 -0
- data/spec/feedly/rate_limit_spec.rb +41 -0
- data/spec/feedly/request_spec.rb +74 -0
- data/spec/feedly/success_spec.rb +7 -0
- data/spec/feedly/version_spec.rb +9 -0
- data/spec/helper.rb +52 -0
- metadata +319 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Preferences API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/preferences/
|
|
6
|
+
module Preferences
|
|
7
|
+
# Get the preferences of the user
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/preferences/#get-the-preferences-of-the-user
|
|
10
|
+
# @return [Feedlr::Base]
|
|
11
|
+
def preferences
|
|
12
|
+
build_object(:get , '/preferences')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Update the preferences of the user
|
|
16
|
+
#
|
|
17
|
+
# @see http://developer.feedly.com/v3/preferences/#update-the-preferences-of-the-user
|
|
18
|
+
# @param preferences [Hash]
|
|
19
|
+
# @return [Feedlr::Base]
|
|
20
|
+
def update_preferences(preferences)
|
|
21
|
+
build_object(:post , '/preferences' , preferences)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Profile API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/profile/
|
|
6
|
+
module Profile
|
|
7
|
+
# Get the profile of the user
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/profile/#get-the-profile-of-the-user
|
|
10
|
+
# @return [Feedlr::Base]
|
|
11
|
+
def user_profile
|
|
12
|
+
build_object(:get , '/profile')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Update the profile of the user
|
|
16
|
+
#
|
|
17
|
+
# @see http://developer.feedly.com/v3/profile/#update-the-profile-of-the-user
|
|
18
|
+
# @param profile [Hash]
|
|
19
|
+
# @return [Feedlr::Base]
|
|
20
|
+
def update_profile(profile)
|
|
21
|
+
build_object(:post , '/profile' , profile)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Search API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/search/
|
|
6
|
+
module Search
|
|
7
|
+
# Find feeds based on title , url or #topic
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/search/#find-feeds-based-on-title-url-or-topic
|
|
10
|
+
# @param query [String]
|
|
11
|
+
# @param options [Hash]
|
|
12
|
+
# @option options [String] :n number of results. default value is 20
|
|
13
|
+
# @option options [String] :locale hint the search engine
|
|
14
|
+
# to return feeds in that locale (e.g. "pt" , "fr_FR")
|
|
15
|
+
# @return [Feedlr::Base]
|
|
16
|
+
def search_feeds(query , options = {})
|
|
17
|
+
build_object(:get , '/search/feeds' , { q: query }.merge(options))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Search the content of a stream (Pro only)
|
|
21
|
+
#
|
|
22
|
+
# @see http://developer.feedly.com/v3/search/#search-the-content-of-a-stream-pro-only
|
|
23
|
+
# @param stream_id [String]
|
|
24
|
+
# @param query [String]
|
|
25
|
+
# @param options [Hash]
|
|
26
|
+
# @option options [String] :count number of entries to return
|
|
27
|
+
# @option options [String] :newerThan timestamp in ms
|
|
28
|
+
# @option options [String] :continuation a continuation id is used
|
|
29
|
+
# to page through the content
|
|
30
|
+
# @option options [String] :unreadOnly boolean , default is false
|
|
31
|
+
# @option options [String] :fields a comma-separated list of fields
|
|
32
|
+
# @option options [String] :minMatches minimum number of
|
|
33
|
+
# search terms to match before
|
|
34
|
+
# @return [Feedlr::Base]
|
|
35
|
+
def search_stream(stream_id , query , options = {})
|
|
36
|
+
build_object(:get , '/search/contents',
|
|
37
|
+
{ q: query , streamId: stream_id }.merge(options))
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Shorten API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/shorten/
|
|
6
|
+
module Shorten
|
|
7
|
+
# Create a shortened URL for an entry
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/shorten/#create-a-shortened-url-for-an-entry
|
|
10
|
+
# @param entry_id [String]
|
|
11
|
+
# @return [String]
|
|
12
|
+
def shorten_entry(entry_id)
|
|
13
|
+
build_object(:get , "/shorten/entries/#{CGI.escape(entry_id) }")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Streams API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/streams/
|
|
6
|
+
module Streams
|
|
7
|
+
# Get a list of entry ids for a specific stream
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/streams/#get-a-list-of-entry-ids-for-a-specific-stream
|
|
10
|
+
# @param stream_id [String]
|
|
11
|
+
# @param options [Hash]
|
|
12
|
+
# @option options [String] :count mber of entry ids to return.
|
|
13
|
+
# default is 20. max is 10,000
|
|
14
|
+
# @option options [String] :ranked newest or oldest. default is newest
|
|
15
|
+
# @option options [String] :unreadOnly boolean default value is false
|
|
16
|
+
# @option options [String] :newerThan timestamp in ms
|
|
17
|
+
# @option options [String] :continuation a continuation id is
|
|
18
|
+
# used to page through the entry ids
|
|
19
|
+
# @return [Feedlr::Base]
|
|
20
|
+
def stream_entries_ids(stream_id , options = {})
|
|
21
|
+
build_object(:get , "/streams/#{CGI.escape(stream_id) }/ids" , options)
|
|
22
|
+
end
|
|
23
|
+
# Get the content of a stream
|
|
24
|
+
#
|
|
25
|
+
# @see http://developer.feedly.com/v3/streams/#get-the-content-of-a-stream
|
|
26
|
+
# @param stream_id [String]
|
|
27
|
+
# @param options [Hash]
|
|
28
|
+
# @option options [String] :count mber of entry ids to return.
|
|
29
|
+
# default is 20. max is 10 , 000
|
|
30
|
+
# @option options [String] :ranked newest or oldest. default is newest
|
|
31
|
+
# @option options [String] :unreadOnly boolean default value is false
|
|
32
|
+
# @option options [String] :newerThan timestamp in ms
|
|
33
|
+
# @option options [String] :continuation a continuation id
|
|
34
|
+
# is used to page through the entry ids
|
|
35
|
+
# @return [Feedlr::Base]
|
|
36
|
+
def stream_entries_contents(stream_id , options = {})
|
|
37
|
+
build_object(:get, "/streams/#{CGI.escape(stream_id)}/contents",
|
|
38
|
+
options)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Subscriptions API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/subscriptions/
|
|
6
|
+
module Subscriptions
|
|
7
|
+
# Get the user's subscriptions
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/subscriptions/#get-the-users-subscriptions
|
|
10
|
+
# @return [Feedlr::Collection]
|
|
11
|
+
def user_subscriptions
|
|
12
|
+
build_object(:get , '/subscriptions')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Subscribe to a feed
|
|
16
|
+
#
|
|
17
|
+
# @see http://developer.feedly.com/v3/subscriptions/#subscribe-to-a-feed
|
|
18
|
+
# @param subscription [Hash]
|
|
19
|
+
# @return [Feedlr::Base]
|
|
20
|
+
def add_subscription(subscription)
|
|
21
|
+
build_object(:post , '/subscriptions' , subscription)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Update an existing subscription
|
|
25
|
+
#
|
|
26
|
+
# @see http://developer.feedly.com/v3/subscriptions/#update-an-existing-subscription
|
|
27
|
+
# @param subscription [Hash]
|
|
28
|
+
# @return [Feedlr::Success]
|
|
29
|
+
def update_subscription(subscription)
|
|
30
|
+
add_subscription(subscription)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Unsubscribe from a feed
|
|
34
|
+
#
|
|
35
|
+
# @see http://developer.feedly.com/v3/subscriptions/#unsubscribe-from-a-feed
|
|
36
|
+
# @param subscription_id [String]
|
|
37
|
+
# @return [Feedlr::Success]
|
|
38
|
+
def delete_subscription(subscription_id)
|
|
39
|
+
build_object(:delete , "/subscriptions/#{CGI.escape(subscription_id) }")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Tags API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/tags/
|
|
6
|
+
module Tags
|
|
7
|
+
# Get the list of tags created by the user
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/tags/#get-the-list-of-tags-created-by-the-user
|
|
10
|
+
# @return [Feedlr::Collection]
|
|
11
|
+
def user_tags
|
|
12
|
+
build_object(:get , '/tags')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Tag an existing entry
|
|
16
|
+
#
|
|
17
|
+
# @see tag_entries
|
|
18
|
+
# @param entry_id [String]
|
|
19
|
+
# @param tags_ids [Array] list of tags ids
|
|
20
|
+
# @return [Feedlr::Success]
|
|
21
|
+
def tag_entry(entry_id , tags_ids)
|
|
22
|
+
tag_entries([entry_id] , tags_ids)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Tag multiple entries
|
|
26
|
+
#
|
|
27
|
+
# @see http://developer.feedly.com/v3/tags/#tag-multiple-entries
|
|
28
|
+
# @param entries_ids [Array] list of entries ids
|
|
29
|
+
# @param tags_ids [Array] list of tags ids
|
|
30
|
+
# @return [Feedlr::Success]
|
|
31
|
+
def tag_entries(entries_ids , tags_ids)
|
|
32
|
+
tags_query = tags_ids.map { |t| CGI.escape(t) }.join(',')
|
|
33
|
+
build_object(:put , "/tags/#{tags_query}" , entryIds: entries_ids)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Untag an existing entry
|
|
37
|
+
#
|
|
38
|
+
# @see untag_entries
|
|
39
|
+
# @param entry_id [String]
|
|
40
|
+
# @param tags_ids [Array] list of tags ids
|
|
41
|
+
# @return [Feedlr::Success]
|
|
42
|
+
def untag_entry(entry_id , tags_ids)
|
|
43
|
+
untag_entries([entry_id] , tags_ids)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Untag multiple entries
|
|
47
|
+
#
|
|
48
|
+
# @see http://developer.feedly.com/v3/tags/#untag-multiple-entries
|
|
49
|
+
# @param entries_ids [Array] list of entries ids
|
|
50
|
+
# @param tags_ids [Array] list of tags ids
|
|
51
|
+
# @return [Feedlr::Success]
|
|
52
|
+
def untag_entries(entries_ids , tags_ids)
|
|
53
|
+
tags_query = tags_ids.map { |t| CGI.escape(t) }.join(',')
|
|
54
|
+
entries_query = entries_ids.map { |t| CGI.escape(t) }.join(',')
|
|
55
|
+
build_object(:delete , "/tags/#{tags_query}/#{entries_query}")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Change a tag label
|
|
59
|
+
#
|
|
60
|
+
# @see http://developer.feedly.com/v3/tags/#change-a-tag-label
|
|
61
|
+
# @param tag_id [String]
|
|
62
|
+
# @param new_value [String] label's new value
|
|
63
|
+
# @return [Feedlr::Success]
|
|
64
|
+
def change_tag_label(tag_id , new_value)
|
|
65
|
+
build_object(:post , "/tags/#{CGI.escape(tag_id) }" , label: new_value)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Delete a tag
|
|
69
|
+
#
|
|
70
|
+
# @see delete_tags
|
|
71
|
+
# @param tag_id [String]
|
|
72
|
+
# @return [Feedlr::Success]
|
|
73
|
+
def delete_tag(tag_id)
|
|
74
|
+
delete_tags([tag_id])
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Delete tags
|
|
78
|
+
#
|
|
79
|
+
# @see http://developer.feedly.com/v3/tags/#delete-tags
|
|
80
|
+
# @param tags_ids [Array] list of ids
|
|
81
|
+
# @return [Feedlr::Success]
|
|
82
|
+
def delete_tags(tags_ids)
|
|
83
|
+
tags_query = tags_ids.map { |t| CGI.escape(t) }.join(',')
|
|
84
|
+
build_object(:delete , "/tags/#{tags_query }")
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Topics API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/topics/
|
|
6
|
+
module Topics
|
|
7
|
+
# Get the list of topics the user has added to their feedly
|
|
8
|
+
#
|
|
9
|
+
# @see http://developer.feedly.com/v3/topics/#get-the-list-of-topics-the-user-has-added-to-their-feedly
|
|
10
|
+
# @return [Feedlr::Collection]
|
|
11
|
+
def user_topics
|
|
12
|
+
build_object(:get , '/topics')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Add a topic to the user feedly account
|
|
16
|
+
#
|
|
17
|
+
# @see http://developer.feedly.com/v3/topics/#add-a-topic-to-the-user-feedly-account
|
|
18
|
+
# @param topic [Hash]
|
|
19
|
+
# @return [Feedlr::Success]
|
|
20
|
+
def add_topic(topic)
|
|
21
|
+
build_object(:post , '/topics' , topic)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Update an existing topic
|
|
25
|
+
#
|
|
26
|
+
# @see http://developer.feedly.com/v3/topics/#update-an-existing-topic
|
|
27
|
+
# @param topic [Hash]
|
|
28
|
+
# @return [Feedlr::Success]
|
|
29
|
+
def update_topic(topic)
|
|
30
|
+
build_object(:post , '/topics' , topic)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Remove a topic from a feedly account
|
|
34
|
+
#
|
|
35
|
+
# @see http://developer.feedly.com/v3/topics/#remove-a-topic-from-a-feedly-account
|
|
36
|
+
# @param topic_id [String]
|
|
37
|
+
# @return [Feedlr::Success]
|
|
38
|
+
def delete_topic(topic_id)
|
|
39
|
+
build_object(:delete , "/topics/#{CGI.escape(topic_id) }")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
module Gateway
|
|
3
|
+
# Twitter API
|
|
4
|
+
#
|
|
5
|
+
# @see http://developer.feedly.com/v3/twitter/
|
|
6
|
+
# The following API actions do not have corresponding methods in
|
|
7
|
+
# this module:
|
|
8
|
+
#
|
|
9
|
+
# * Link Twitter account
|
|
10
|
+
# * Get suggested feeds (alternate version)
|
|
11
|
+
module Twitter
|
|
12
|
+
# Unlink Twitter account
|
|
13
|
+
#
|
|
14
|
+
# @see http://developer.feedly.com/v3/twitter/#unlink-twitter-account
|
|
15
|
+
# @return [Feedlr::Success]
|
|
16
|
+
def unlink_twitter
|
|
17
|
+
build_object(:delete , '/twitter/auth')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Get suggested feeds
|
|
21
|
+
#
|
|
22
|
+
# @see http://developer.feedly.com/v3/twitter/#get-suggested-feeds
|
|
23
|
+
# @return [Feedlr::Collection]
|
|
24
|
+
def twitter_suggestions
|
|
25
|
+
build_object(:get , '/twitter/suggestions')
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'hashie'
|
|
2
|
+
require 'multi_json'
|
|
3
|
+
require_relative 'base'
|
|
4
|
+
require_relative 'collection'
|
|
5
|
+
require_relative 'success'
|
|
6
|
+
|
|
7
|
+
module Feedlr
|
|
8
|
+
# The generalized pseudo-object that is returned for all query
|
|
9
|
+
# requests.
|
|
10
|
+
# http://martinfowler.com/eaaCatalog/dataMapper.html
|
|
11
|
+
class Mapper
|
|
12
|
+
# Build the proper object depending on the response
|
|
13
|
+
# @return [Feedlr::Base, Feedlr::Success, Feedlr::Collection]
|
|
14
|
+
def self.build(data)
|
|
15
|
+
case data
|
|
16
|
+
when Hash
|
|
17
|
+
(data.size > 0) ? Feedlr::Base.new(data) : Feedlr::Success.new
|
|
18
|
+
when Array
|
|
19
|
+
Feedlr::Collection.new(data)
|
|
20
|
+
else
|
|
21
|
+
Feedlr::Success.new
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Feedlr
|
|
2
|
+
# Rate limiting object associated with responses
|
|
3
|
+
class RateLimit
|
|
4
|
+
attr_reader :count, :limit, :remaining
|
|
5
|
+
# Initializes a new object
|
|
6
|
+
#
|
|
7
|
+
# @param attrs [Hash]
|
|
8
|
+
# @option attrs [String] :x-ratelimit-count
|
|
9
|
+
# @option attrs [String] :x-ratelimit-limit
|
|
10
|
+
# @option attrs [String] :x-ratelimit-remaining
|
|
11
|
+
# @return [Feedlr::RateLimit]
|
|
12
|
+
def initialize(attrs = {})
|
|
13
|
+
@count =
|
|
14
|
+
attrs['x-ratelimit-count'].to_i if attrs['x-ratelimit-count']
|
|
15
|
+
@limit =
|
|
16
|
+
attrs['x-ratelimit-limit'].to_i if attrs['x-ratelimit-limit']
|
|
17
|
+
@remaining =
|
|
18
|
+
attrs['x-ratelimit-remaining'].to_i if attrs['x-ratelimit-remaining']
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'faraday'
|
|
2
|
+
require 'faraday_middleware'
|
|
3
|
+
require_relative 'mapper'
|
|
4
|
+
require_relative 'error'
|
|
5
|
+
|
|
6
|
+
module Feedlr
|
|
7
|
+
# Do all http requests and call the mapper
|
|
8
|
+
module Request
|
|
9
|
+
ENDPOINT = 'http://cloud.feedly.com'
|
|
10
|
+
SANDBOX_ENDPOINT = 'http://sandbox.feedly.com'
|
|
11
|
+
API_VERSION = '/v3'
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# Run an HTTP request and map the response to a domain class
|
|
16
|
+
# @param method [String] HTTP method
|
|
17
|
+
# @param path [String]
|
|
18
|
+
# @param params [Hash]
|
|
19
|
+
# @param headers [Hash]
|
|
20
|
+
# @return [Faraday::Response]
|
|
21
|
+
def build_object(method, path, params = nil, headers = nil)
|
|
22
|
+
response = send(method, path, params, headers)
|
|
23
|
+
Mapper.build(response.body)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
%w(post put).each do |method|
|
|
27
|
+
class_eval <<-RUBY , __FILE__ , __LINE__ + 1
|
|
28
|
+
def #{method}(path, params, headers)
|
|
29
|
+
request(:#{method}, path, headers) do |request|
|
|
30
|
+
if !headers || headers[:"Content-Type"].nil?
|
|
31
|
+
params = MultiJson.dump(params)
|
|
32
|
+
end
|
|
33
|
+
request.body = params if params
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
RUBY
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
%w(get delete).each do |method|
|
|
40
|
+
class_eval <<-RUBY , __FILE__ , __LINE__ + 1
|
|
41
|
+
def #{method}(path, params, headers)
|
|
42
|
+
request(:#{method}, path, headers) do |request|
|
|
43
|
+
request.params.update(params) if params
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
RUBY
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Initiate and memoize the HTTP connection object
|
|
50
|
+
# @return [Faraday::Connection]
|
|
51
|
+
def connection
|
|
52
|
+
@connection ||= Faraday.new(end_point, connection_options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Build and memoize the connection options
|
|
56
|
+
# @return [Hash]
|
|
57
|
+
def connection_options
|
|
58
|
+
@connection_options ||= {
|
|
59
|
+
builder: middleware,
|
|
60
|
+
headers: request_headers,
|
|
61
|
+
request: {
|
|
62
|
+
open_timeout: 10,
|
|
63
|
+
timeout: 30
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Build and memoize the rack middleware for the requests
|
|
69
|
+
# @return [Faraday::RackBuilder]
|
|
70
|
+
def middleware
|
|
71
|
+
@middleware ||= Faraday::RackBuilder.new do |faraday|
|
|
72
|
+
faraday.request :url_encoded
|
|
73
|
+
# Add logging
|
|
74
|
+
faraday.response(:logger, logger) unless logger.nil?
|
|
75
|
+
# Parse XML
|
|
76
|
+
faraday.response :xml, content_type: /\bxml$/
|
|
77
|
+
# Parse JSON
|
|
78
|
+
faraday.response :json, content_type: /\bjson$/
|
|
79
|
+
|
|
80
|
+
faraday.adapter :net_http
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Run the desired HTTP request, verifies it, raise excpetions in
|
|
85
|
+
# case of failure, otherwise return the response
|
|
86
|
+
# @param method [String] HTTP method
|
|
87
|
+
# @param path [String]
|
|
88
|
+
# @param headers [Hash]
|
|
89
|
+
# @return [Faraday::Response]
|
|
90
|
+
def request(method, path, headers, &block)
|
|
91
|
+
response = run_request(method, path, headers, &block)
|
|
92
|
+
logger.debug(response.inspect) unless logger.nil?
|
|
93
|
+
verify_success(response)
|
|
94
|
+
response
|
|
95
|
+
rescue Faraday::Error::TimeoutError, Timeout::Error => error
|
|
96
|
+
raise(Feedlr::Error::RequestTimeout.new, error.message)
|
|
97
|
+
rescue Faraday::Error::ClientError, JSON::ParserError => error
|
|
98
|
+
raise(Feedlr::Error.new, error.message)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Run the actual request
|
|
102
|
+
# @param method [String] HTTP method
|
|
103
|
+
# @param path [String]
|
|
104
|
+
# @param headers [Hash]
|
|
105
|
+
# @return [Faraday::Response]
|
|
106
|
+
def run_request(method, path, headers)
|
|
107
|
+
connection.send(method) do |request|
|
|
108
|
+
request.url(API_VERSION + path)
|
|
109
|
+
request.headers.update(headers) if headers
|
|
110
|
+
yield(request) if block_given?
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Check the response code and raise exceptions if needed
|
|
115
|
+
# param response [Faraday::Response]
|
|
116
|
+
# @return [void]
|
|
117
|
+
def verify_success(response)
|
|
118
|
+
status_code = response.status.to_i
|
|
119
|
+
klass = Feedlr::Error.errors[status_code]
|
|
120
|
+
fail(klass.from_response(response)) if klass
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Build and memoize the initial request headers
|
|
124
|
+
# @return [Hash]
|
|
125
|
+
def request_headers
|
|
126
|
+
return unless @headers.nil?
|
|
127
|
+
@headers = { :"Accept" => 'application/json',
|
|
128
|
+
:"Content-Type" => 'application/json',
|
|
129
|
+
:user_agent => user_agent
|
|
130
|
+
}
|
|
131
|
+
@headers[:Authorization] =
|
|
132
|
+
"OAuth #{oauth_access_token}" if oauth_access_token
|
|
133
|
+
@headers
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Build and memoize the user agent
|
|
137
|
+
# @return [String]
|
|
138
|
+
def user_agent
|
|
139
|
+
@user_agent ||= "Feedlr Ruby Gem #{Feedlr::Version}"
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Build and memoize the endpoint
|
|
143
|
+
# @return [String]
|
|
144
|
+
def end_point
|
|
145
|
+
@end_point ||= (sandbox ? SANDBOX_ENDPOINT : ENDPOINT)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|