readability_parser 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,10 @@
1
+ *.gem
2
+ .bundle
3
+ vendor/bundle
4
+ .ruby-version
5
+ .rbenv-vars
6
+ spec/reports
7
+ Gemfile.lock
8
+ log/*
9
+ .yardoc
10
+ doc/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --order random
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --markup markdown
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gem 'yard'
4
+
5
+ gemspec
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,12 @@
1
+ require 'ostruct'
2
+
3
+ module ReadabilityParser
4
+ class Article < OpenStruct
5
+ # Returns a ReadabilityParser::Article object
6
+ #
7
+ # @return [ReadabilityParser::Article]
8
+ def initialize(article)
9
+ super
10
+ end
11
+ end # Article
12
+ 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,3 @@
1
+ module ReadabilityParser
2
+ VERSION = "0.0.1"
3
+ 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,2 @@
1
+ require 'readability'
2
+ require 'rspec'
@@ -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,5 @@
1
+ require 'helper'
2
+
3
+ describe Readability::Article do
4
+ pending
5
+ 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,5 @@
1
+ require 'helper'
2
+
3
+ describe Readability::Connection do
4
+ pending
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ describe Readability::Error do
4
+ describe Readability::Error::ClientError do
5
+ pending
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ require 'helper'
2
+
3
+ describe Readability::Request do
4
+ pending
5
+ 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: