newsblurry 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +81 -0
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +7 -0
- data/README.md +24 -0
- data/Rakefile +22 -0
- data/lib/newsblurry/connection.rb +67 -0
- data/lib/newsblurry/feed.rb +12 -0
- data/lib/newsblurry/feed_parser.rb +20 -0
- data/lib/newsblurry/story.rb +17 -0
- data/lib/newsblurry/story_parser.rb +21 -0
- data/lib/newsblurry/version.rb +3 -0
- data/lib/newsblurry.rb +10 -0
- data/newsblurry.gemspec +26 -0
- data/spec/fixtures/feed_1641.txt +14 -0
- data/spec/fixtures/feeds.txt +13 -0
- data/spec/fixtures/mark_as_read_1095_cdeec3.txt +11 -0
- data/spec/fixtures/unread_feed_story_hashes.txt +11 -0
- data/spec/newsblurry/connection_spec.rb +68 -0
- data/spec/newsblurry/feed_parser_spec.rb +41 -0
- data/spec/newsblurry/feed_spec.rb +33 -0
- data/spec/newsblurry/story_parser_spec.rb +30 -0
- data/spec/newsblurry/story_spec.rb +57 -0
- data/spec/newsblurry/version_spec.rb +7 -0
- data/spec/spec_helper.rb +11 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2f2046f72b33788e1164f9dc67f29dd6ed621fe0
|
4
|
+
data.tar.gz: 58dd9af17bf01649f2cabc6e64157298337dcc0f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a2543e9a04d8bbe80c4e0e2062f0c340a16f74a880d6fda27842876e63aaf8cb61349156f23ab6c4182b924d73e220f07620f1ee77ea5abaaffdf954405a37a5
|
7
|
+
data.tar.gz: 8b8f3b6c35e9f8f0378cb71a355e32f253c9e534d9a64b79be13a2c391c894cc66381c6345b8bc5f4de74c079d8bf2426ee01f59621b5af8a1a62f319f6744a5
|
data/.gitignore
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#----------------------------------------------------------------------------
|
2
|
+
# Ignore these files when commiting to a git repository.
|
3
|
+
#
|
4
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
5
|
+
#
|
6
|
+
# The original version of this file is found here:
|
7
|
+
# https://github.com/RailsApps/rails3-application-templates/raw/master/files/gitignore.txt
|
8
|
+
#
|
9
|
+
# Corrections? Improvements? Create a GitHub issue:
|
10
|
+
# http://github.com/RailsApps/rails3-application-templates/issues
|
11
|
+
#----------------------------------------------------------------------------
|
12
|
+
|
13
|
+
# bundler state
|
14
|
+
/.bundle
|
15
|
+
/vendor/bundle
|
16
|
+
./vendor
|
17
|
+
|
18
|
+
# minimal Rails specific artifacts
|
19
|
+
db/*.sqlite3
|
20
|
+
/log/*.log
|
21
|
+
/log/*.pid
|
22
|
+
/tmp
|
23
|
+
|
24
|
+
# various artifacts
|
25
|
+
**.war
|
26
|
+
*.rbc
|
27
|
+
*.sassc
|
28
|
+
*.log
|
29
|
+
.rspec
|
30
|
+
.redcar/
|
31
|
+
.sass-cache
|
32
|
+
/config/config.yml
|
33
|
+
/config/mail.yml
|
34
|
+
/coverage.data
|
35
|
+
/coverage/
|
36
|
+
/db/*.javadb/
|
37
|
+
/db/*.sqlite3-journal
|
38
|
+
/doc/api/
|
39
|
+
/doc/app/
|
40
|
+
/doc/features.html
|
41
|
+
/doc/specs.html
|
42
|
+
/public/cache
|
43
|
+
/public/stylesheets/compiled
|
44
|
+
/public/assets/[^.]*
|
45
|
+
/public/uploads/[^.]*
|
46
|
+
/public/stylesheets/*.css
|
47
|
+
/public/system
|
48
|
+
/spec/tmp/*
|
49
|
+
/cache
|
50
|
+
/capybara*
|
51
|
+
/capybara-*.html
|
52
|
+
/gems
|
53
|
+
/rerun.txt
|
54
|
+
/specifications
|
55
|
+
/tags
|
56
|
+
.env
|
57
|
+
Gemfile.lock
|
58
|
+
|
59
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
60
|
+
# or operating system, you probably want to add a global ignore instead:
|
61
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
62
|
+
#
|
63
|
+
# Here are some files you may want to ignore globally:
|
64
|
+
|
65
|
+
# scm revert files
|
66
|
+
**.orig
|
67
|
+
|
68
|
+
# Mac finder artifacts
|
69
|
+
.DS_Store
|
70
|
+
|
71
|
+
# Netbeans project directory
|
72
|
+
/nbproject/
|
73
|
+
|
74
|
+
# RubyMine project files
|
75
|
+
.idea
|
76
|
+
|
77
|
+
# Textmate project files
|
78
|
+
/*.tmproj
|
79
|
+
|
80
|
+
# vim artifacts
|
81
|
+
**.swp
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Newsblurry
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/newsblurry.png)](https://rubygems.org/gems/newsblurry)
|
4
|
+
[![Dependency Status](https://gemnasium.com/jgeiger/newsblurry.png)](https://gemnasium.com/jgeiger/newsblurry)
|
5
|
+
[![Build Status](https://travis-ci.org/jgeiger/newsblurry.png)](https://travis-ci.org/jgeiger/newsblurry)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/jgeiger/newsblurry.png)](https://codeclimate.com/github/jgeiger/newsblurry)
|
7
|
+
|
8
|
+
## Description
|
9
|
+
|
10
|
+
Connect to Newsblur
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
Add this line to your Gemfile
|
14
|
+
|
15
|
+
gem 'newsblurry'
|
16
|
+
|
17
|
+
And then:
|
18
|
+
|
19
|
+
bundle
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
## License
|
24
|
+
Released under the MIT License
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
task :default => :spec
|
5
|
+
|
6
|
+
def bundle_exec(command)
|
7
|
+
sh %Q{bundle update && bundle exec #{command}}
|
8
|
+
end
|
9
|
+
|
10
|
+
def bundle_install_dependencies
|
11
|
+
sh %Q{bundle install --path vendor/bundle}
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Run all specs"
|
15
|
+
task "spec" do
|
16
|
+
bundle_exec("rspec spec")
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Install dependencies"
|
20
|
+
task "dependencies" do
|
21
|
+
bundle_install_dependencies
|
22
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Newsblurry
|
2
|
+
class Connection
|
3
|
+
include HTTParty
|
4
|
+
base_uri 'https://www.newsblur.com'
|
5
|
+
disable_rails_query_string_format
|
6
|
+
|
7
|
+
debug_output
|
8
|
+
|
9
|
+
def initialize(username, password)
|
10
|
+
options = { body: { username: username, password: password } }
|
11
|
+
response = post_request('/api/login', options)
|
12
|
+
@cookie = response.headers['set-cookie']
|
13
|
+
end
|
14
|
+
|
15
|
+
def unread_stories
|
16
|
+
feed_array = feeds
|
17
|
+
unread_feed_story_hashes.keys.flat_map do |feed_id|
|
18
|
+
feed = feed_array.find { |f| f.id == feed_id.to_i }
|
19
|
+
unread_stories_for_feed(feed)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def mark_as_read(story_hash)
|
24
|
+
options = { body: { story_hash: story_hash } }
|
25
|
+
post_request('/reader/mark_story_hashes_as_read', options)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def feeds
|
31
|
+
response = get_request('/reader/feeds')
|
32
|
+
FeedParser.new(response['feeds']).feeds
|
33
|
+
end
|
34
|
+
|
35
|
+
def unread_stories_for_feed(feed)
|
36
|
+
options = {
|
37
|
+
query: {
|
38
|
+
read_filter: 'unread', include_story_content: false
|
39
|
+
}
|
40
|
+
}
|
41
|
+
response = get_request("/reader/feed/#{feed.id}", options)
|
42
|
+
StoryParser.new(feed, response['stories']).stories
|
43
|
+
end
|
44
|
+
|
45
|
+
def unread_feed_story_hashes
|
46
|
+
response = get_request('/reader/unread_story_hashes')
|
47
|
+
response['unread_feed_story_hashes']
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_request(url, options = {})
|
51
|
+
options.merge!(headers)
|
52
|
+
self.class.get(url, options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def post_request(url, options = {})
|
56
|
+
options.merge!(headers)
|
57
|
+
self.class.post(url, options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def headers
|
61
|
+
{ headers: {
|
62
|
+
'User-Agent' => "#{self.class.name} - #{Newsblurry::VERSION}",
|
63
|
+
'Cookie' => @cookie || '' }
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Newsblurry
|
2
|
+
class FeedParser
|
3
|
+
|
4
|
+
attr_reader :feeds
|
5
|
+
|
6
|
+
def initialize(feeds_hash)
|
7
|
+
@feeds = []
|
8
|
+
@feeds_hash = feeds_hash
|
9
|
+
parse_feeds
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse_feeds
|
15
|
+
@feeds = @feeds_hash.values.map do |value|
|
16
|
+
Newsblurry::Feed.new(value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Newsblurry
|
2
|
+
class Story
|
3
|
+
|
4
|
+
attr_reader :title, :link, :hash, :published_at,
|
5
|
+
:feed_title, :feed_link, :feed_address
|
6
|
+
|
7
|
+
def initialize(feed, story_hash)
|
8
|
+
@title = story_hash['story_title']
|
9
|
+
@link = story_hash['story_permalink']
|
10
|
+
@hash = story_hash['story_hash']
|
11
|
+
@published_at = DateTime.parse(story_hash['story_date'])
|
12
|
+
@feed_title = feed.title
|
13
|
+
@feed_link = feed.link
|
14
|
+
@feed_address = feed.address
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Newsblurry
|
2
|
+
class StoryParser
|
3
|
+
|
4
|
+
attr_reader :stories
|
5
|
+
|
6
|
+
def initialize(feed, story_hashes)
|
7
|
+
@stories = []
|
8
|
+
@feed = feed
|
9
|
+
@story_hashes = story_hashes
|
10
|
+
parse_stories
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def parse_stories
|
16
|
+
@stories = @story_hashes.map do |story_hash|
|
17
|
+
Newsblurry::Story.new(@feed, story_hash)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/newsblurry.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'newsblurry/version'
|
3
|
+
|
4
|
+
module Newsblurry
|
5
|
+
autoload :Connection, 'newsblurry/connection'
|
6
|
+
autoload :Feed, 'newsblurry/feed'
|
7
|
+
autoload :Story, 'newsblurry/story'
|
8
|
+
autoload :FeedParser, 'newsblurry/feed_parser'
|
9
|
+
autoload :StoryParser, 'newsblurry/story_parser'
|
10
|
+
end
|
data/newsblurry.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "newsblurry/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'newsblurry'
|
7
|
+
s.version = Newsblurry::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
|
10
|
+
s.authors = ['Joey Geiger']
|
11
|
+
s.email = 'jgeiger@gmail.com'
|
12
|
+
s.homepage = 'http://github.com/jgeiger/newsblurry'
|
13
|
+
|
14
|
+
s.summary = 'Newsblurry is a Ruby client to access the Newsblur API.'
|
15
|
+
s.description = 'Access your Newsblur feed using Ruby.'
|
16
|
+
s.licenses = ["MIT"]
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.add_dependency 'httparty'
|
23
|
+
|
24
|
+
s.add_development_dependency 'webmock'
|
25
|
+
s.add_development_dependency 'pry'
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: gunicorn/0.17.4
|
3
|
+
Date: Wed, 09 Oct 2013 04:16:59 GMT
|
4
|
+
Transfer-Encoding: chunked
|
5
|
+
Connection: close
|
6
|
+
Expires: Wed, 09 Oct 2013 04:16:59 GMT
|
7
|
+
Vary: Cookie, Accept-Encoding
|
8
|
+
Last-Modified: Wed, 09 Oct 2013 04:16:59 GMT
|
9
|
+
Cache-Control: max-age=0
|
10
|
+
X-Nelson: Dad didn't leave... When he comes back from the store, he's going to wave those pop-tarts right in your face!
|
11
|
+
Content-Type: application/json
|
12
|
+
X-gunicorn-server: app06
|
13
|
+
|
14
|
+
{"updated": "43 minutes", "authenticated": true, "feed_tags": [], "feed_authors": [], "elapsed_time": 0.04, "feed_id": 1641, "stories": [{"story_authors": "Jerod Santo", "intelligence": {"feed": 0, "tags": 0, "author": 0, "title": 0}, "story_permalink": "http://feedproxy.google.com/~r/thechangelog/~3/3Hgy1mKZWsg/", "reply_count": 0, "comment_user_ids": [], "story_timestamp": "1381180513", "share_user_ids": [], "story_hash": "1641:aaae79", "id": "http://thechangelog.com/?p=6697", "comment_count": null, "story_tags": ["links", "activerecord", "postgresql", "rails", "ruby"], "share_count": null, "friend_comments": [], "story_date": "2013-10-07 21:15:13", "short_parsed_date": "07 Oct 2013, 4:15pm", "guid_hash": "aaae79", "image_urls": ["http://feeds.feedburner.com/~ff/thechangelog?d=yIl2AUoC8zA", "http://feeds.feedburner.com/~ff/thechangelog?d=7Q72WNTAKBA", "http://feeds.feedburner.com/~ff/thechangelog?i=3Hgy1mKZWsg:sXiRXBXQvaQ:V_sGLiPBpWU", "http://feeds.feedburner.com/~ff/thechangelog?d=qj6IDK7rITs", "http://feeds.feedburner.com/~ff/thechangelog?i=3Hgy1mKZWsg:sXiRXBXQvaQ:gIN9vFwOqvQ", "http://feeds.feedburner.com/~r/thechangelog/~4/3Hgy1mKZWsg"], "story_feed_id": 1641, "long_parsed_date": "Monday, October 7th, 2013 4:15pm", "public_comments": [], "read_status": 0, "story_title": "Use Rails with the db schema you always wanted"}], "result": "ok", "message": null, "classifiers": {"authors": {}, "feeds": {}, "titles": {}, "tags": {}}, "user_profiles": []}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: gunicorn/0.17.4
|
3
|
+
Date: Wed, 09 Oct 2013 04:16:59 GMT
|
4
|
+
Transfer-Encoding: chunked
|
5
|
+
Expires: Wed, 09 Oct 2013 04:16:59 GMT
|
6
|
+
Vary: Cookie, Accept-Encoding
|
7
|
+
Last-Modified: Wed, 09 Oct 2013 04:16:59 GMT
|
8
|
+
Cache-Control: max-age=0
|
9
|
+
X-Nelson: Dad didn't leave... When he comes back from the store, he's going to wave those pop-tarts right in your face!
|
10
|
+
Content-Type: application/json
|
11
|
+
X-gunicorn-server: app06
|
12
|
+
|
13
|
+
{"folders": [834, 693769, 4443494, 1675, 2678, 1700, 183814, 123960, 159238, 4425070, 882290, 588670, 1076, 1710, 165, 236715, 1084, 1095, 1641, 162717, 175738, 238176, 169], "authenticated": true, "social_profile": {"website": "", "following_user_ids": [], "following_count": 0, "shared_stories_count": 0, "private": false, "large_photo_url": "https://www.gravatar.com/avatar/0e7d5331c8315f1cdba91506ed360195", "id": "social:194625", "feed_address": "http://www.newsblur.com/social/rss/194625/jgeiger", "user_id": 194625, "feed_link": "http://jgeiger.newsblur.com", "follower_user_ids": [], "location": "", "popular_publishers": null, "follower_count": 0, "username": "jgeiger", "bio": "", "average_stories_per_month": 0, "feed_title": "jgeiger's blurblog", "photo_service": "gravatar", "stories_last_month": 0, "photo_url": "https://www.gravatar.com/avatar/0e7d5331c8315f1cdba91506ed360195", "num_subscribers": 0, "protected": false}, "user_profile": {"hide_getting_started": true, "preferences": {"keyboard_verticalarrows": "story", "read_story_delay": "0", "feed_view_single_story": "0", "story_styling": "sans-serif", "story_share_kippt": false, "truncate_story": "social", "story_share_delicious": false, "hide_story_changes": "1", "default_view": "feed", "story_share_evernote": false, "story_share_diigo": false, "hide_public_comments": false, "default_read_filter": "all", "story_share_facebook": true, "folder_counts": false, "story_share_twitter": true, "story_share_readability": false, "story_pane_anchor": "south", "intro_page": "4", "space_scroll_spacing": "40", "open_feed_action": "0", "ssl": "0", "new_window": "1", "animations": true, "story_size": "s", "story_share_googleplus": false, "arrow_scroll_spacing": "100", "story_share_instapaper": true, "default_order": "newest", "story_share_pinboard": false, "story_share_readitlater": false, "feed_order": "ALPHABETICAL", "title_counts": true, "show_tooltips": "1", "story_share_tumblr": false, "keyboard_horizontalarrows": "view"}, "tutorial_finished": false, "has_setup_feeds": true, "is_premium": false, "dashboard_date": "2013-06-17 14:43:47.980382", "has_trained_intelligence": false, "has_found_friends": false}, "starred_count": 0, "result": "ok", "feeds": {"1084": {"subs": 1357, "favicon_url": "http://icons.newsblur.com/1084.png", "is_push": true, "feed_opens": 8, "id": 1084, "ps": 0, "feed_link": "http://www.rubyinside.com", "updated_seconds_ago": 36633, "favicon_fetching": false, "ng": 0, "favicon_border": "a97175", "nt": 0, "not_yet_fetched": false, "updated": "10 hours", "s3_icon": true, "feed_address": "http://feeds.feedburner.com/RubyInside", "feed_title": "Ruby Inside", "favicon_fade": "ffbac0", "favicon_color": "e2979d", "active": true, "fetched_once": true, "favicon_text_color": "white", "subscribed": true, "num_subscribers": 1357, "s3_page": false, "min_to_decay": 696}, "1641": {"subs": 1098, "favicon_url": "http://icons.newsblur.com/1641.png", "is_push": true, "feed_opens": 42, "id": 1641, "ps": 0, "feed_link": "http://thechangelog.com", "updated_seconds_ago": 879, "favicon_fetching": false, "ng": 0, "favicon_border": "2e332a", "nt": 1, "not_yet_fetched": false, "updated": "14 minutes", "s3_icon": true, "feed_address": "http://feeds.feedburner.com/thechangelog", "feed_title": "The Changelog", "favicon_fade": "61675b", "favicon_color": "3e4438", "active": true, "fetched_once": true, "favicon_text_color": "white", "subscribed": true, "num_subscribers": 1098, "s3_page": false, "min_to_decay": 192}, "588670": {"subs": 81, "favicon_url": "http://icons.newsblur.com/588670.png", "is_push": false, "feed_opens": 65, "id": 588670, "ps": 0, "feed_link": "http://pivotallabs.com", "updated_seconds_ago": 145, "favicon_fetching": false, "ng": 0, "favicon_border": "6993ac", "nt": 1, "not_yet_fetched": false, "updated": "2 minutes", "s3_icon": true, "feed_address": "http://pivotallabs.com/feed/", "feed_title": "Pivotal Labs", "favicon_fade": "b0e7ff", "favicon_color": "8dc4e6", "active": true, "fetched_once": true, "favicon_text_color": "black", "subscribed": true, "num_subscribers": 81, "s3_page": false, "min_to_decay": 4}}, "social_services": {"facebook": {"syncing": false, "facebook_picture_url": null, "facebook_uid": null}, "twitter": {"twitter_username": null, "syncing": false, "twitter_picture_url": null, "twitter_uid": null}, "gravatar": {"gravatar_picture_url": "https://www.gravatar.com/avatar/0e7d5331c8315f1cdba91506ed360195"}, "appdotnet": {"syncing": false, "appdotnet_uid": null, "appdotnet_picture_url": null}, "upload": {"upload_picture_url": null}}, "categories": null, "social_feeds": []}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: gunicorn/0.17.4
|
3
|
+
Date: Wed, 09 Oct 2013 04:16:59 GMT
|
4
|
+
Transfer-Encoding: chunked
|
5
|
+
Connection: close
|
6
|
+
X-Nelson: Dad didn't leave... When he comes back from the store, he's going to wave those pop-tarts right in your face!
|
7
|
+
Content-Type: application/json
|
8
|
+
X-gunicorn-server: app06
|
9
|
+
Vary: Cookie
|
10
|
+
|
11
|
+
{"code": 1, "authenticated": true, "friend_user_ids": [], "feed_ids": ["1095"], "result": "ok", "story_hashes": ["1095:cdeec3"]}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: gunicorn/0.17.4
|
3
|
+
Date: Wed, 09 Oct 2013 04:16:59 GMT
|
4
|
+
Transfer-Encoding: chunked
|
5
|
+
Connection: close
|
6
|
+
X-Nelson: Dad didn't leave... When he comes back from the store, he's going to wave those pop-tarts right in your face!
|
7
|
+
Content-Type: application/json
|
8
|
+
X-gunicorn-server: app06
|
9
|
+
Vary: Cookie
|
10
|
+
|
11
|
+
{"unread_feed_story_hashes": {"1641": ["1641:cb0caf", "1641:aaae79"]}, "authenticated": true, "result": "ok"}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Newsblurry::Connection do
|
4
|
+
context '#initialize' do
|
5
|
+
it 'logs the user in' do
|
6
|
+
username = 'test'
|
7
|
+
password = 'test'
|
8
|
+
|
9
|
+
stub_request(:post, 'https://www.newsblur.com/api/login')
|
10
|
+
.with(
|
11
|
+
body: 'password=test&username=test',
|
12
|
+
headers: {
|
13
|
+
'Cookie' => '',
|
14
|
+
'User-Agent' => 'Newsblurry::Connection - 0.0.1'
|
15
|
+
}
|
16
|
+
)
|
17
|
+
|
18
|
+
connection = Newsblurry::Connection.new(username, password)
|
19
|
+
expect(connection.class).to eq(Newsblurry::Connection)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when accessing the API' do
|
24
|
+
before do
|
25
|
+
stub_request(:post, 'https://www.newsblur.com/api/login')
|
26
|
+
@connection = Newsblurry::Connection.new('test', 'test')
|
27
|
+
end
|
28
|
+
|
29
|
+
context '#unread_stories' do
|
30
|
+
it 'returns an array of unread Newsblurry::Story' do
|
31
|
+
feeds_file = File.new('spec/fixtures/feeds.txt')
|
32
|
+
stub_request(:get, 'https://www.newsblur.com/reader/feeds')
|
33
|
+
.to_return(feeds_file)
|
34
|
+
|
35
|
+
hashes_file = File.new('spec/fixtures/unread_feed_story_hashes.txt')
|
36
|
+
stub_request(
|
37
|
+
:get,
|
38
|
+
'https://www.newsblur.com/reader/unread_story_hashes'
|
39
|
+
).to_return(hashes_file)
|
40
|
+
|
41
|
+
feed_file = File.new('spec/fixtures/feed_1641.txt')
|
42
|
+
stub_request(:get, 'https://www.newsblur.com/reader/feed/1641')
|
43
|
+
.with(query: { include_story_content: false, read_filter: 'unread' })
|
44
|
+
.to_return(feed_file)
|
45
|
+
|
46
|
+
unread_stories = @connection.unread_stories
|
47
|
+
|
48
|
+
titles = ['Use Rails with the db schema you always wanted']
|
49
|
+
expect(unread_stories.map(&:title)).to match_array(titles)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context '#mark_as_read' do
|
54
|
+
it 'marks the Newsblurry::Story as read' do
|
55
|
+
file = File.new('spec/fixtures/mark_as_read_1095_cdeec3.txt')
|
56
|
+
stub_request(
|
57
|
+
:post,
|
58
|
+
'https://www.newsblur.com/reader/mark_story_hashes_as_read'
|
59
|
+
).with(body: 'story_hash=1095%3Acdeec3').to_return(file)
|
60
|
+
|
61
|
+
story_hash_string = '1095:cdeec3'
|
62
|
+
response = @connection.mark_as_read(story_hash_string)
|
63
|
+
|
64
|
+
expect(response['feed_ids']).to eq(['1095'])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Newsblurry::FeedParser do
|
4
|
+
before do
|
5
|
+
@ruby_feed_hash = {
|
6
|
+
'id' => 1084,
|
7
|
+
'feed_link' => 'http://www.rubyinside.com',
|
8
|
+
'feed_address' => 'http://feeds.feedburner.com/RubyInside',
|
9
|
+
'feed_title' => 'Ruby Inside'
|
10
|
+
}
|
11
|
+
@pivotal_feed_hash = {
|
12
|
+
'id' => 588_670,
|
13
|
+
'feed_link' => 'http://pivotallabs.com',
|
14
|
+
'feed_address' => 'http://pivotallabs.com/feed/',
|
15
|
+
'feed_title' => 'Pivotal Labs'
|
16
|
+
}
|
17
|
+
@changelog_feed_hash = {
|
18
|
+
'id' => 1641,
|
19
|
+
'feed_link' => 'http://thechangelog.com',
|
20
|
+
'feed_address' => 'http://feeds.feedburner.com/thechangelog',
|
21
|
+
'feed_title' => 'The Changelog',
|
22
|
+
}
|
23
|
+
feeds_hash = {
|
24
|
+
'1084' => @ruby_feed_hash,
|
25
|
+
'588670' => @pivotal_feed_hash,
|
26
|
+
'1641' => @changelog_feed_hash
|
27
|
+
}
|
28
|
+
@feed_parser = Newsblurry::FeedParser.new(feeds_hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns the feeds in an array' do
|
32
|
+
ruby_feed = Newsblurry::Feed.new(@ruby_feed_hash)
|
33
|
+
pivotal_feed = Newsblurry::Feed.new(@pivotal_feed_hash)
|
34
|
+
changelog_feed = Newsblurry::Feed.new(@changelog_feed_hash)
|
35
|
+
parsed_feed_title_array = [changelog_feed.title,
|
36
|
+
pivotal_feed.title,
|
37
|
+
ruby_feed.title]
|
38
|
+
titles = @feed_parser.feeds.map(&:title)
|
39
|
+
expect(titles).to match_array(parsed_feed_title_array)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Newsblurry::Feed do
|
4
|
+
before do
|
5
|
+
feed_hash = {
|
6
|
+
'id' => 1084,
|
7
|
+
'feed_link' => 'http://www.rubyinside.com',
|
8
|
+
'feed_address' => 'http://feeds.feedburner.com/RubyInside',
|
9
|
+
'feed_title' => 'Ruby Inside'
|
10
|
+
}
|
11
|
+
@feed = Newsblurry::Feed.new(feed_hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets the id' do
|
15
|
+
id = 1084
|
16
|
+
expect(@feed.id).to eq(id)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets the link' do
|
20
|
+
link = 'http://www.rubyinside.com'
|
21
|
+
expect(@feed.link).to eq(link)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets the title' do
|
25
|
+
title = 'Ruby Inside'
|
26
|
+
expect(@feed.title).to eq(title)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets the address' do
|
30
|
+
address = 'http://feeds.feedburner.com/RubyInside'
|
31
|
+
expect(@feed.address).to eq(address)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Newsblurry::StoryParser do
|
4
|
+
before do
|
5
|
+
story_hashes = [
|
6
|
+
{
|
7
|
+
'story_permalink' => 'http://feedproxy.google.com/~r/thechangelog/',
|
8
|
+
'story_hash' => '1641:aaae79',
|
9
|
+
'id' => 'http://thechangelog.com/?p=6697',
|
10
|
+
'story_date' => '2013-10-07 21:15:13',
|
11
|
+
'story_feed_id' => 1641,
|
12
|
+
'story_title' => 'Use Rails with the db schema you always wanted'
|
13
|
+
}
|
14
|
+
]
|
15
|
+
feed_hash = {
|
16
|
+
'id' => 1641,
|
17
|
+
'feed_link' => 'http://www.thechangelog.com',
|
18
|
+
'feed_address' => 'http://feeds.thechangelog.com',
|
19
|
+
'feed_title' => 'The Changelog'
|
20
|
+
}
|
21
|
+
feed = Newsblurry::Feed.new(feed_hash)
|
22
|
+
@story_parser = Newsblurry::StoryParser.new(feed, story_hashes)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns the stories in an array' do
|
26
|
+
parsed_title_array = ['Use Rails with the db schema you always wanted']
|
27
|
+
titles = @story_parser.stories.map(&:title)
|
28
|
+
expect(titles).to match_array(parsed_title_array)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Newsblurry::Story do
|
4
|
+
before do
|
5
|
+
story_hash = {
|
6
|
+
'story_title' => 'Broken lives of Fukushima',
|
7
|
+
'story_permalink' => 'http://feeds.boston.com/c/35022/story01.htm',
|
8
|
+
'story_hash' => '1095:67324d',
|
9
|
+
'story_date' => '2013-10-07 23:54:16'
|
10
|
+
}
|
11
|
+
|
12
|
+
feed_hash = {
|
13
|
+
'id' => 1095,
|
14
|
+
'feed_link' => 'http://boston.com',
|
15
|
+
'feed_address' => 'http://feeds.boston.com',
|
16
|
+
'feed_title' => 'The Big Picture'
|
17
|
+
}
|
18
|
+
|
19
|
+
feed = Newsblurry::Feed.new(feed_hash)
|
20
|
+
@story = Newsblurry::Story.new(feed, story_hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'sets the link' do
|
24
|
+
link = 'http://feeds.boston.com/c/35022/story01.htm'
|
25
|
+
expect(@story.link).to eq(link)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns the title' do
|
29
|
+
title = 'Broken lives of Fukushima'
|
30
|
+
expect(@story.title).to eq(title)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns the hash' do
|
34
|
+
hash = '1095:67324d'
|
35
|
+
expect(@story.hash).to eq(hash)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns the published_at' do
|
39
|
+
published_at = '2013-10-07 23:54:16'
|
40
|
+
expect(@story.published_at).to eq(DateTime.parse(published_at))
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns the feed_title' do
|
44
|
+
feed_title = 'The Big Picture'
|
45
|
+
expect(@story.feed_title).to eq(feed_title)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns the feed_link' do
|
49
|
+
feed_link = 'http://boston.com'
|
50
|
+
expect(@story.feed_link).to eq(feed_link)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns the feed_address' do
|
54
|
+
feed_address = 'http://feeds.boston.com'
|
55
|
+
expect(@story.feed_address).to eq(feed_address)
|
56
|
+
end
|
57
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/newsblurry')
|
2
|
+
|
3
|
+
require 'pry'
|
4
|
+
require 'webmock/rspec'
|
5
|
+
|
6
|
+
WebMock.disable_net_connect!
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
+
config.run_all_when_everything_filtered = true
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: newsblurry
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joey Geiger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: webmock
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Access your Newsblur feed using Ruby.
|
56
|
+
email: jgeiger@gmail.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- .gitignore
|
62
|
+
- .rubocop.yml
|
63
|
+
- CHANGELOG.md
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/newsblurry.rb
|
68
|
+
- lib/newsblurry/connection.rb
|
69
|
+
- lib/newsblurry/feed.rb
|
70
|
+
- lib/newsblurry/feed_parser.rb
|
71
|
+
- lib/newsblurry/story.rb
|
72
|
+
- lib/newsblurry/story_parser.rb
|
73
|
+
- lib/newsblurry/version.rb
|
74
|
+
- newsblurry.gemspec
|
75
|
+
- spec/fixtures/feed_1641.txt
|
76
|
+
- spec/fixtures/feeds.txt
|
77
|
+
- spec/fixtures/mark_as_read_1095_cdeec3.txt
|
78
|
+
- spec/fixtures/unread_feed_story_hashes.txt
|
79
|
+
- spec/newsblurry/connection_spec.rb
|
80
|
+
- spec/newsblurry/feed_parser_spec.rb
|
81
|
+
- spec/newsblurry/feed_spec.rb
|
82
|
+
- spec/newsblurry/story_parser_spec.rb
|
83
|
+
- spec/newsblurry/story_spec.rb
|
84
|
+
- spec/newsblurry/version_spec.rb
|
85
|
+
- spec/spec_helper.rb
|
86
|
+
homepage: http://github.com/jgeiger/newsblurry
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata: {}
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.0.3
|
107
|
+
signing_key:
|
108
|
+
specification_version: 4
|
109
|
+
summary: Newsblurry is a Ruby client to access the Newsblur API.
|
110
|
+
test_files: []
|