readability_parser 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/Gemfile +5 -0
- data/README.md +90 -0
- data/Rakefile +1 -0
- data/lib/readability_parser.rb +24 -0
- data/lib/readability_parser/api/content.rb +21 -0
- data/lib/readability_parser/article.rb +12 -0
- data/lib/readability_parser/client.rb +22 -0
- data/lib/readability_parser/configuration.rb +37 -0
- data/lib/readability_parser/connection.rb +35 -0
- data/lib/readability_parser/error.rb +47 -0
- data/lib/readability_parser/request.rb +45 -0
- data/lib/readability_parser/version.rb +3 -0
- data/readability_parser.gemspec +28 -0
- data/spec/helper.rb +2 -0
- data/spec/readability/api/content_spec.rb +23 -0
- data/spec/readability/article_spec.rb +5 -0
- data/spec/readability/client_spec.rb +32 -0
- data/spec/readability/configuration_spec.rb +17 -0
- data/spec/readability/connection_spec.rb +5 -0
- data/spec/readability/error_spec.rb +7 -0
- data/spec/readability/request_spec.rb +5 -0
- data/spec/readability_spec.rb +22 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZmUzMWU5ZjU2YTlmZTM3YmIxZWE3ODk2MjE2MjEwMGMyMjg5OGZiYw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTM1ODI2YTgwMWY2ZGNiNjA0OTZiMDAyZjJhYTdiZTk1NThlYWU2Yg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NWI0ZjQzYmY0NmQ0ZmZhNjkzMjNhY2Y3ZDJkMGVlYTVlNzRhNjI2OGMyYjA0
|
10
|
+
YzA0ODM2OTY4MmE1NDkwMDRhMGQ1MWYwNDIzNGZjZTBkMWNjNjI1YjczNzc0
|
11
|
+
ZTM5MmE2MDYzM2RhYWQ5YmMzMjE4MmRkNDVkMWFjZWMxOGNiN2M=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NjE3MDViNDA2MDZhMDU0Y2U0ZDE4MDg1ZDhjYTIwMzIyNzM4MzI5ZjczYTFk
|
14
|
+
Nzk2ZjY2MzFmMTI0ODVlOWQxOTM4ZmM0MWZmYTAzYjc1NDMzNDg5NTg4NTFh
|
15
|
+
NTAyMzNlN2MzOWQ0NmQzZTA0ODY4ZjUxMmY3NDQyYzY1ZTA2YTM=
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# Readability Parser
|
2
|
+
A tiny ruby wrapper for Readability's content parser api
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
gem 'readability_parser'
|
8
|
+
|
9
|
+
And then execute:
|
10
|
+
|
11
|
+
bundle install
|
12
|
+
|
13
|
+
## Configuration
|
14
|
+
Single token usage:
|
15
|
+
```ruby
|
16
|
+
ReadabilityParser.api_token = READABILITY_API_TOKEN
|
17
|
+
```
|
18
|
+
|
19
|
+
or set multiple options with a block:
|
20
|
+
```ruby
|
21
|
+
ReadabilityParser.configure do |readability|
|
22
|
+
readability.api_token = READABILITY_API_TOKEN,
|
23
|
+
readability.format = :json
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
|
28
|
+
Make sure to set `READABILITY_API_TOKEN` in your environement variables. You can get an API key by contacting Readability's team directly, more information on their [api documentation page](https://www.readability.com/developers/api).
|
29
|
+
|
30
|
+
Multiple tokens or multithreaded usage:
|
31
|
+
```ruby
|
32
|
+
client = ReadabilityParser::Client.new(
|
33
|
+
:api_token => READABILITY_API_TOKEN
|
34
|
+
)
|
35
|
+
```
|
36
|
+
|
37
|
+
## Usage
|
38
|
+
|
39
|
+
### Parse
|
40
|
+
Parse a webpage and return its main content
|
41
|
+
```ruby
|
42
|
+
article = ReadabilityParser.parse("http://www.paulgraham.com/really.html")
|
43
|
+
=> #<ReadabilityParser::Article domain="www.paulgraham.com", next_page_id=nil, url="http://www.paulgraham.com/really.html", short_url="http://rdd.me/vki6sx0x", author=nil, excerpt="Want to start a startup? Get funded by Y Combinator . October 2009 (This essay is derived from a talk at the 2009 Startup School.) I wasn't sure what to talk about at Startup School, so I decided to...", direction="ltr", word_count=4982, total_pages=0, content="<div><td width="455"><img src="http://ep.yimg.com/ca/I/paulgraham_2135_250213" width="243" border="0" hspace="0" vspace="0" alt="What Startups Are Really Like"> ...", date_published=nil, dek=nil, lead_image_url=nil, title="What Startups Are Really Like", rendered_pages=1>
|
44
|
+
|
45
|
+
article.domain
|
46
|
+
article.author
|
47
|
+
article.url
|
48
|
+
article.short_url
|
49
|
+
article.title
|
50
|
+
article.total_pages
|
51
|
+
article.word_count
|
52
|
+
article.content
|
53
|
+
article.date_published
|
54
|
+
article.next_page_id
|
55
|
+
article.rendered_pages
|
56
|
+
```
|
57
|
+
### Format
|
58
|
+
You may specify the response format to `:json` or `:xml`, default to `:json`. Either way, the response will be parsed and returned as a `ReadabilityParser::Article` object.
|
59
|
+
|
60
|
+
## TODO
|
61
|
+
- Complete test suite
|
62
|
+
|
63
|
+
## Contributing
|
64
|
+
|
65
|
+
1. Fork it
|
66
|
+
2. [Create a topic branch](http://learn.github.com/p/branching.html)
|
67
|
+
3. Add specs for your unimplemented modifications
|
68
|
+
4. Run `bundle exec rspec`. If specs pass, return to step 3.
|
69
|
+
5. Implement your modifications
|
70
|
+
6. Run `bundle exec rspec`. If specs fail, return to step 5.
|
71
|
+
7. Commit your changes and push
|
72
|
+
8. [Submit a pull request](http://help.github.com/send-pull-requests/)
|
73
|
+
|
74
|
+
## Inspiration
|
75
|
+
Design inspired from [twitter](https://github.com/sferik/twitter) and [octokit](https://github.com/pengwynn/octokit) api wrappers.
|
76
|
+
|
77
|
+
## Author
|
78
|
+
[Philippe Dionne](http://www.phildionne.com)
|
79
|
+
|
80
|
+
## Copyright
|
81
|
+
Copyright (c) 2013 Philippe Dionne
|
82
|
+
|
83
|
+
## License
|
84
|
+
MIT License
|
85
|
+
|
86
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
87
|
+
|
88
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
89
|
+
|
90
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'readability_parser/configuration'
|
2
|
+
require 'readability_parser/client'
|
3
|
+
|
4
|
+
module ReadabilityParser
|
5
|
+
extend Configuration
|
6
|
+
class << self
|
7
|
+
# Alias for ReadabilityParser::Client.new
|
8
|
+
#
|
9
|
+
# @return [ReadabilityParser::Client]
|
10
|
+
def new(options={})
|
11
|
+
ReadabilityParser::Client.new(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Delegate to ReadabilityParser::Client
|
15
|
+
def method_missing(method, *args, &block)
|
16
|
+
return super unless new.respond_to?(method)
|
17
|
+
new.send(method, *args, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def respond_to?(method, include_private=false)
|
21
|
+
new.respond_to?(method, include_private) || super(method, include_private)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end # ReadabilityParser
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ReadabilityParser
|
2
|
+
module API
|
3
|
+
module Content
|
4
|
+
|
5
|
+
# Parse a webpage and return its main content
|
6
|
+
# Returns a ReadabilityParser::Article object
|
7
|
+
#
|
8
|
+
# Optionally pass the ID of an article as `id => "id"` in `options` to return the content for a specific DOM node
|
9
|
+
# You can also pass a `max_pages` integer to set the maximum number of pages to parse and combine. Default is 25.
|
10
|
+
#
|
11
|
+
# @param url [String] The URL of an article to return the content for
|
12
|
+
# @return [ReadabilityParser::Article]
|
13
|
+
def parse(url, options={})
|
14
|
+
params = {:url => url}
|
15
|
+
response = get('', params.merge(options))
|
16
|
+
|
17
|
+
ReadabilityParser::Article.new(response)
|
18
|
+
end
|
19
|
+
end # Content
|
20
|
+
end # API
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'readability_parser/connection'
|
2
|
+
require 'readability_parser/request'
|
3
|
+
require 'readability_parser/api/content'
|
4
|
+
require 'readability_parser/article'
|
5
|
+
|
6
|
+
|
7
|
+
module ReadabilityParser
|
8
|
+
class Client
|
9
|
+
attr_accessor *Configuration::VALID_CONFIG_KEYS
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
options = ReadabilityParser.options.merge(options)
|
13
|
+
Configuration::VALID_OPTIONS_KEYS.each do |key|
|
14
|
+
send("#{key}=", options[key])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
include ReadabilityParser::Connection
|
19
|
+
include ReadabilityParser::Request
|
20
|
+
include ReadabilityParser::API::Content
|
21
|
+
end # Client
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'readability_parser/version'
|
2
|
+
|
3
|
+
module ReadabilityParser
|
4
|
+
module Configuration
|
5
|
+
VALID_CONNECTION_KEYS = [:api_endpoint, :user_agent].freeze
|
6
|
+
VALID_OPTIONS_KEYS = [:api_token, :format].freeze
|
7
|
+
VALID_CONFIG_KEYS = VALID_CONNECTION_KEYS + VALID_OPTIONS_KEYS
|
8
|
+
|
9
|
+
DEFAULT_API_ENDPOINT = "https://readability.com/api/content/v1/parser"
|
10
|
+
DEFAULT_USER_AGENT = "ReadabilityParser Ruby Gem #{ReadabilityParser::VERSION}".freeze
|
11
|
+
DEFAULT_API_TOKEN = nil
|
12
|
+
DEFAULT_FORMAT = :json
|
13
|
+
|
14
|
+
attr_accessor *VALID_CONFIG_KEYS
|
15
|
+
|
16
|
+
def self.extended(base)
|
17
|
+
base.reset
|
18
|
+
end
|
19
|
+
|
20
|
+
# Convenience method to allow configuration options to be set in a block
|
21
|
+
def configure
|
22
|
+
yield self
|
23
|
+
end
|
24
|
+
|
25
|
+
def options
|
26
|
+
Hash[ * VALID_CONFIG_KEYS.map { |key| [key, send(key)] }.flatten ]
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset
|
30
|
+
self.api_endpoint = DEFAULT_API_ENDPOINT
|
31
|
+
self.user_agent = DEFAULT_USER_AGENT
|
32
|
+
|
33
|
+
self.api_token = DEFAULT_API_TOKEN
|
34
|
+
self.format = DEFAULT_FORMAT
|
35
|
+
end
|
36
|
+
end # Configuration
|
37
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module ReadabilityParser
|
5
|
+
module Connection
|
6
|
+
# Instantiate a Faraday::Connection
|
7
|
+
# @private
|
8
|
+
private
|
9
|
+
|
10
|
+
# Returns a Faraday::Connection object
|
11
|
+
#
|
12
|
+
# @return [Faraday::Connection]
|
13
|
+
def connection(options={})
|
14
|
+
|
15
|
+
options = {
|
16
|
+
:url => ReadabilityParser.api_endpoint
|
17
|
+
}.merge(options)
|
18
|
+
|
19
|
+
connection = Faraday.new(options) do |c|
|
20
|
+
c.use Faraday::Request::UrlEncoded # encode request params as "www-form-urlencoded"
|
21
|
+
c.use FaradayMiddleware::FollowRedirects, limit: 3
|
22
|
+
c.use Faraday::Response::RaiseError # raise exceptions on 40x, 50x responses
|
23
|
+
|
24
|
+
c.response :xml, :content_type => /\bxml$/
|
25
|
+
c.response :json, :content_type => /\bjson$/
|
26
|
+
|
27
|
+
c.adapter Faraday.default_adapter
|
28
|
+
end
|
29
|
+
|
30
|
+
connection.headers[:user_agent] = ReadabilityParser.user_agent
|
31
|
+
|
32
|
+
connection
|
33
|
+
end
|
34
|
+
end # Connection
|
35
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ReadabilityParser
|
2
|
+
class Error < StandardError
|
3
|
+
|
4
|
+
class ClientError < Error
|
5
|
+
|
6
|
+
def initialize(error=nil)
|
7
|
+
parsed_error = parse_error(error)
|
8
|
+
http_error = error.response[:status].to_i
|
9
|
+
|
10
|
+
if ERROR_MAP.has_key?(http_error)
|
11
|
+
raise ERROR_MAP[http_error].new(parsed_error[:messages])
|
12
|
+
else
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse_error(error)
|
18
|
+
JSON.parse(error.response[:body], :symbolize_names => true)
|
19
|
+
end
|
20
|
+
end # ClientError
|
21
|
+
|
22
|
+
class ConfigurationError < ReadabilityParser::Error; end
|
23
|
+
|
24
|
+
# Raised when ReadabilityParser returns a 400 HTTP status code
|
25
|
+
class BadRequest < ReadabilityParser::Error; end
|
26
|
+
|
27
|
+
# Raised when ReadabilityParser returns a 401 HTTP status code
|
28
|
+
class UnauthorizedRequest < ReadabilityParser::Error; end
|
29
|
+
|
30
|
+
# Raised when ReadabilityParser returns a 403 HTTP status code
|
31
|
+
class Forbidden < ReadabilityParser::Error; end
|
32
|
+
|
33
|
+
# Raised when ReadabilityParser returns a 404 HTTP status code
|
34
|
+
class NotFound < ReadabilityParser::Error; end
|
35
|
+
|
36
|
+
# Raised when ReadabilityParser returns a 500 HTTP status code
|
37
|
+
class InternalServerError < ReadabilityParser::Error; end
|
38
|
+
|
39
|
+
ERROR_MAP = {
|
40
|
+
400 => ReadabilityParser::Error::BadRequest,
|
41
|
+
401 => ReadabilityParser::Error::UnauthorizedRequest,
|
42
|
+
403 => ReadabilityParser::Error::Forbidden,
|
43
|
+
404 => ReadabilityParser::Error::NotFound,
|
44
|
+
500 => ReadabilityParser::Error::InternalServerError
|
45
|
+
}
|
46
|
+
end # Error
|
47
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'readability_parser/error'
|
2
|
+
|
3
|
+
module ReadabilityParser
|
4
|
+
module Request
|
5
|
+
|
6
|
+
# Performs a HTTP Get request
|
7
|
+
def get(path, params={})
|
8
|
+
request(:get, path, params)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# Returns a Faraday::Response object
|
14
|
+
#
|
15
|
+
# @return [Faraday::Response]
|
16
|
+
def request(method, path, params={})
|
17
|
+
|
18
|
+
raise ReadabilityParser::Error::ConfigurationError.new("Please configure ReadabilityParser.api_token first") if api_token.nil?
|
19
|
+
|
20
|
+
params.merge!({
|
21
|
+
:token => api_token,
|
22
|
+
:format => format
|
23
|
+
})
|
24
|
+
|
25
|
+
connection_options = {}
|
26
|
+
|
27
|
+
begin
|
28
|
+
response = connection(connection_options).send(method) do |request|
|
29
|
+
request.url(path, params)
|
30
|
+
end
|
31
|
+
rescue Faraday::Error::ClientError => error
|
32
|
+
raise ReadabilityParser::Error::ClientError.new(error)
|
33
|
+
end
|
34
|
+
|
35
|
+
# When using xml format the response is wrapped in a <response> node
|
36
|
+
if response.body['response']
|
37
|
+
# TODO: When using xml format, the response.body hash values are all strings.
|
38
|
+
# Maybe convert values to proper type?
|
39
|
+
response.body['response']
|
40
|
+
else
|
41
|
+
response.body
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end # Request
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
require 'readability_parser/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = "readability_parser"
|
9
|
+
gem.version = ReadabilityParser::VERSION
|
10
|
+
gem.authors = ["Philippe Dionne"]
|
11
|
+
gem.email = ["dionne.phil@gmail.com"]
|
12
|
+
gem.description = %q{A tiny ruby wrapper for Readability's content parser api}
|
13
|
+
gem.summary = %q{Interact with the article parsing featureset of Readability. This means grabbing an article's content based on a URL.}
|
14
|
+
gem.homepage = "https://github.com/phildionne/readability_parser"
|
15
|
+
gem.licenses = []
|
16
|
+
|
17
|
+
gem.files = `git ls-files`.split($/)
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
|
22
|
+
gem.add_dependency "faraday", "~> 0.8.4"
|
23
|
+
gem.add_dependency "faraday_middleware", "~> 0.9.0"
|
24
|
+
gem.add_dependency "hashie", "~> 1.2.0"
|
25
|
+
gem.add_dependency "multi_xml", "~> 0.5.2"
|
26
|
+
|
27
|
+
gem.add_development_dependency "rspec"
|
28
|
+
end
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Readability::API::Content do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@client = Readability::Client.new(:api_token => '12345678910')
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
Readability.reset
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".parse" do
|
14
|
+
it "fetches the content of a given uri" do
|
15
|
+
pending
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns a Readability::Article" do
|
19
|
+
pending
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Readability::Client do
|
4
|
+
|
5
|
+
after do
|
6
|
+
Readability.reset
|
7
|
+
end
|
8
|
+
|
9
|
+
context "when creating a client" do
|
10
|
+
describe "with no options" do
|
11
|
+
it "should assign client with default values" do
|
12
|
+
pending
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "with options" do
|
17
|
+
|
18
|
+
it "should accept configuration options" do
|
19
|
+
pending
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should assign the client with overiden default values" do
|
23
|
+
pending
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when using a client" do
|
29
|
+
pending
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Readability::Configuration do
|
4
|
+
|
5
|
+
after do
|
6
|
+
Readability.reset
|
7
|
+
end
|
8
|
+
|
9
|
+
Readability::Configuration::VALID_CONFIG_KEYS.each do |key|
|
10
|
+
describe ":#{key}" do
|
11
|
+
it "should return the default value" do
|
12
|
+
Readability.send(key).should be(Readability::Configuration.const_get("DEFAULT_#{key.upcase}"))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Readability do
|
4
|
+
|
5
|
+
after do
|
6
|
+
Readability.reset
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
it "is a Readability::Client" do
|
11
|
+
(Readability.new).should be_a_kind_of(Readability::Client)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".method_missing?" do
|
16
|
+
pending
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".respond_to?" do
|
20
|
+
pending
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: readability_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Philippe Dionne
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-03-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ~>
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 0.8.4
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ~>
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.8.4
|
26
|
+
name: faraday
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.9.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ~>
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.9.0
|
40
|
+
name: faraday_middleware
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.2.0
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.0
|
54
|
+
name: hashie
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.5.2
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.5.2
|
68
|
+
name: multi_xml
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
type: :development
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
name: rspec
|
83
|
+
description: A tiny ruby wrapper for Readability's content parser api
|
84
|
+
email:
|
85
|
+
- dionne.phil@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- .rspec
|
92
|
+
- .yardopts
|
93
|
+
- Gemfile
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/readability_parser.rb
|
97
|
+
- lib/readability_parser/api/content.rb
|
98
|
+
- lib/readability_parser/article.rb
|
99
|
+
- lib/readability_parser/client.rb
|
100
|
+
- lib/readability_parser/configuration.rb
|
101
|
+
- lib/readability_parser/connection.rb
|
102
|
+
- lib/readability_parser/error.rb
|
103
|
+
- lib/readability_parser/request.rb
|
104
|
+
- lib/readability_parser/version.rb
|
105
|
+
- readability_parser.gemspec
|
106
|
+
- spec/helper.rb
|
107
|
+
- spec/readability/api/content_spec.rb
|
108
|
+
- spec/readability/article_spec.rb
|
109
|
+
- spec/readability/client_spec.rb
|
110
|
+
- spec/readability/configuration_spec.rb
|
111
|
+
- spec/readability/connection_spec.rb
|
112
|
+
- spec/readability/error_spec.rb
|
113
|
+
- spec/readability/request_spec.rb
|
114
|
+
- spec/readability_spec.rb
|
115
|
+
homepage: https://github.com/phildionne/readability_parser
|
116
|
+
licenses: []
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 2.0.2
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Interact with the article parsing featureset of Readability. This means grabbing
|
138
|
+
an article's content based on a URL.
|
139
|
+
test_files:
|
140
|
+
- spec/helper.rb
|
141
|
+
- spec/readability/api/content_spec.rb
|
142
|
+
- spec/readability/article_spec.rb
|
143
|
+
- spec/readability/client_spec.rb
|
144
|
+
- spec/readability/configuration_spec.rb
|
145
|
+
- spec/readability/connection_spec.rb
|
146
|
+
- spec/readability/error_spec.rb
|
147
|
+
- spec/readability/request_spec.rb
|
148
|
+
- spec/readability_spec.rb
|
149
|
+
has_rdoc:
|