rss_feed 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +23 -0
- data/README.md +10 -0
- data/lib/rss_feed/core_ext/string_ext.rb +2 -0
- data/lib/rss_feed/core_ext/try.rb +9 -0
- data/lib/rss_feed/core_ext.rb +2 -0
- data/lib/rss_feed/open_search.rb +38 -0
- data/lib/rss_feed/open_search_query.rb +28 -0
- data/lib/rss_feed/rss_category.rb +18 -0
- data/lib/rss_feed/rss_channel.rb +177 -0
- data/lib/rss_feed/rss_channel_item.rb +73 -0
- data/lib/rss_feed/rss_cloud.rb +35 -0
- data/lib/rss_feed/rss_enclosure.rb +23 -0
- data/lib/rss_feed/rss_guid.rb +18 -0
- data/lib/rss_feed/rss_image.rb +38 -0
- data/lib/rss_feed/rss_source.rb +18 -0
- data/lib/rss_feed/rss_text_input.rb +28 -0
- data/lib/rss_feed.rb +30 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: caed8664b546d8b48b6c0b83154e6961a6fd3414
|
4
|
+
data.tar.gz: 9a8d22d3e9c4d4b95459a18d98ab986ed5824951
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7daa4da3a909178b686f973ee0fe999b0c45c6c820b162e94cda7b7f9ee2157379c6a96a26fca815bdbd74bc023469760b362872bcffc6a85bdaa09a8c4f75cf
|
7
|
+
data.tar.gz: 90baf4ce6576a6a64e96dab6ea7f42966d6b3f27e3a985330f4194f99f76939d1b9f3f38e02c6e2f3f75cf3759c3d18bfba6939b4b0cb4badf8dfba837fb26b0
|
data/CHANGELOG.md
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2011 Oliver Eilhard
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
'Software'), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
data/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# RssFeed
|
2
|
+
|
3
|
+
Convenient classes for parsing an [RSS feed](http://www.rssboard.org/rss-specification)
|
4
|
+
|
5
|
+
## Links
|
6
|
+
|
7
|
+
* [RSS 2.0 Specification](http://www.rssboard.org/rss-specification)
|
8
|
+
* [RSS 1.0 Specification](http://web.resource.org/rss/1.0/)
|
9
|
+
* [RSS on Wikipedia](http://en.wikipedia.org/wiki/RSS)
|
10
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rss_feed/open_search_query'
|
2
|
+
|
3
|
+
module RSSFeed
|
4
|
+
class OpenSearch
|
5
|
+
# Initializes the Open Search extensions.
|
6
|
+
def initialize(node)
|
7
|
+
@node = node
|
8
|
+
end
|
9
|
+
|
10
|
+
def present?
|
11
|
+
!self.total_results.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def total_results
|
15
|
+
@node.at_xpath("rss/channel/opensearch:totalResults", ::RSSFeed::NS).content.to_i rescue nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def start_index
|
19
|
+
@node.at_xpath("rss/channel/opensearch:startIndex", ::RSSFeed::NS).content.to_i rescue nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def items_per_page
|
23
|
+
@node.at_xpath("rss/channel/opensearch:itemsPerPage", ::RSSFeed::NS).content.to_i rescue nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# queries
|
27
|
+
def queries
|
28
|
+
nodes = @node.xpath("rss/channel/opensearch:Query", ::RSSFeed::NS) rescue nil
|
29
|
+
nodes.map { |node| OpenSearchQuery.new(node) } if nodes
|
30
|
+
end
|
31
|
+
|
32
|
+
# first
|
33
|
+
# previous
|
34
|
+
# next
|
35
|
+
# last
|
36
|
+
# search
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class OpenSearchQuery
|
3
|
+
# Initializes the Open Search Query element.
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
def role
|
9
|
+
@node["role"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def search_terms
|
13
|
+
@node["searchTerms"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def start_page
|
17
|
+
@node["startPage"].to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def start_index
|
21
|
+
@node["startIndex"].to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
def items_per_page
|
25
|
+
@node["itemsPerPage"].to_i
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSCategory
|
3
|
+
# Initializes the link.
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
# Identifies the domain (optional).
|
9
|
+
def domain
|
10
|
+
@node["domain"]
|
11
|
+
end
|
12
|
+
|
13
|
+
# Content of the RSS category.
|
14
|
+
def content
|
15
|
+
@node.content
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'rss_feed/core_ext'
|
5
|
+
require 'rss_feed/rss_category'
|
6
|
+
require 'rss_feed/rss_channel_item'
|
7
|
+
require 'rss_feed/rss_cloud'
|
8
|
+
require 'rss_feed/rss_guid'
|
9
|
+
require 'rss_feed/rss_image'
|
10
|
+
require 'rss_feed/rss_text_input'
|
11
|
+
require 'rss_feed/open_search'
|
12
|
+
|
13
|
+
module RSSFeed
|
14
|
+
# RSSFeed::RSSChannel is the central place for
|
15
|
+
# working with feeds in the RSS format.
|
16
|
+
#
|
17
|
+
# Opening an RSS feed from the network or a file system
|
18
|
+
# is done like this:
|
19
|
+
#
|
20
|
+
# feed = RSSFeed::RSSChannel.open(open("http://example.com/rss.xml"))
|
21
|
+
#
|
22
|
+
# If you have a file you should do:
|
23
|
+
#
|
24
|
+
# f = File.open("rss.xml")
|
25
|
+
# feed = RSSFeed::RSSChannel.open(f)
|
26
|
+
# f.close
|
27
|
+
#
|
28
|
+
# If you have an XML string you can do:
|
29
|
+
#
|
30
|
+
# feed = RSSFeed::RSSChannel.open("<rss version='1.0'> ...")
|
31
|
+
#
|
32
|
+
# One can open and parse the feed like so:
|
33
|
+
#
|
34
|
+
# RSSFeed::RSSChannel.open(...) do |feed|
|
35
|
+
# puts feed.title
|
36
|
+
# feed.items do |item|
|
37
|
+
# puts item.title
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# You can access OpenSearch extensions by using +RSSChannel.open_search+.
|
42
|
+
# Access to other embedded XML types are available by using RSSChannel.doc+
|
43
|
+
# directly. It's a +Nokogiri::XML+ instance.
|
44
|
+
#
|
45
|
+
# RSSFeed uses Nokogiri for parsing.
|
46
|
+
#
|
47
|
+
class RSSChannel
|
48
|
+
|
49
|
+
attr_reader :doc
|
50
|
+
|
51
|
+
def initialize(doc)
|
52
|
+
@doc = doc
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.open(string_or_io, url = nil, encoding = nil)
|
56
|
+
doc = Nokogiri::XML(string_or_io, url, encoding)
|
57
|
+
channel = RSSChannel.new(doc)
|
58
|
+
yield channel if block_given?
|
59
|
+
channel
|
60
|
+
end
|
61
|
+
|
62
|
+
# Title (required).
|
63
|
+
def title
|
64
|
+
@doc.at_xpath("rss/channel/title").content
|
65
|
+
end
|
66
|
+
|
67
|
+
# Link (required).
|
68
|
+
def link
|
69
|
+
@doc.at_xpath("rss/channel/link").content
|
70
|
+
end
|
71
|
+
|
72
|
+
# Description (required).
|
73
|
+
def description
|
74
|
+
@doc.at_xpath("rss/channel/description").content
|
75
|
+
end
|
76
|
+
|
77
|
+
# Language (optional).
|
78
|
+
def language
|
79
|
+
@doc.at_xpath("rss/channel/language").try(:content)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Copyright (optional).
|
83
|
+
def copyright
|
84
|
+
@doc.at_xpath("rss/channel/copyright").try(:content)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Managing editor (optional).
|
88
|
+
def managing_editor
|
89
|
+
@doc.at_xpath("rss/channel/managingEditor").try(:content)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Publication date (optional).
|
93
|
+
def pub_date
|
94
|
+
if date = @doc.at_xpath("rss/channel/pubDate").try(:content)
|
95
|
+
Time.rfc822(date)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Last build date (optional).
|
100
|
+
def last_build_date
|
101
|
+
if date = @doc.at_xpath("rss/channel/lastBuildDate").try(:content)
|
102
|
+
Time.rfc822(date)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Category (optional).
|
107
|
+
def category
|
108
|
+
if node = @doc.at_xpath("rss/channel/category")
|
109
|
+
RSSCategory.new(node)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Generator (optional).
|
114
|
+
def generator
|
115
|
+
@doc.at_xpath("rss/channel/generator").try(:content)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Documentation link (optional).
|
119
|
+
def docs
|
120
|
+
@doc.at_xpath("rss/channel/docs").try(:content)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Cloud (optional)
|
124
|
+
def cloud
|
125
|
+
if node = @doc.at_xpath("rss/channel/cloud")
|
126
|
+
RSSCloud.new(node)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Time to live in minutes (optional).
|
131
|
+
def ttl
|
132
|
+
@doc.at_xpath("rss/channel/ttl").try(:content).nonzero?
|
133
|
+
end
|
134
|
+
|
135
|
+
# Image (optional).
|
136
|
+
def image
|
137
|
+
if node = @doc.at_xpath("rss/channel/image")
|
138
|
+
RSSImage.new(node)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# PICS rating (optional).
|
143
|
+
def rating
|
144
|
+
@doc.at_xpath("rss/channel/rating").try(:content)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Text input box (optional).
|
148
|
+
def text_input
|
149
|
+
if node = @doc.at_xpath("rss/channel/textInput")
|
150
|
+
RSSTextInput.new(node)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Hint for aggregators telling them which hours they can skip (optional).
|
155
|
+
def skip_hours
|
156
|
+
@doc.at_xpath("rss/channel/skipHours").try(:content).nonzero?
|
157
|
+
end
|
158
|
+
|
159
|
+
# Hint for aggregators telling them which days they can skip (optional).
|
160
|
+
def skip_days
|
161
|
+
@doc.at_xpath("rss/channel/skipDays").try(:content).nonzero?
|
162
|
+
end
|
163
|
+
|
164
|
+
# Array of channel items (optional).
|
165
|
+
def items
|
166
|
+
nodes = @doc.xpath("rss/channel/item") || []
|
167
|
+
nodes.map { |node| RSSChannelItem.new(node) }
|
168
|
+
end
|
169
|
+
|
170
|
+
# Open Search extensions (optional)
|
171
|
+
def open_search
|
172
|
+
@open_search ||= OpenSearch.new(@doc)
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSChannelItem
|
3
|
+
|
4
|
+
attr_reader :node
|
5
|
+
|
6
|
+
def initialize(node)
|
7
|
+
@node = node
|
8
|
+
end
|
9
|
+
|
10
|
+
# Title (required).
|
11
|
+
def title
|
12
|
+
@node.at_xpath("title").content
|
13
|
+
end
|
14
|
+
|
15
|
+
# Link (required).
|
16
|
+
def link
|
17
|
+
@node.at_xpath("link").content
|
18
|
+
end
|
19
|
+
|
20
|
+
# Description (required).
|
21
|
+
def description
|
22
|
+
@node.at_xpath("description").content
|
23
|
+
end
|
24
|
+
|
25
|
+
# Email address of the author (optional).
|
26
|
+
def author
|
27
|
+
@node.at_xpath("author").try(:content)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Array of categories (optional).
|
31
|
+
def categories
|
32
|
+
if nodes = @node.xpath("category")
|
33
|
+
nodes.map { |node| RSSCategory.new(node) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Array of URLs to comments (optional).
|
38
|
+
def comments
|
39
|
+
if nodes = @node.xpath("comments")
|
40
|
+
nodes.map { |node| node.content }.compact
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Enclosure (optional).
|
45
|
+
def enclosure
|
46
|
+
if node = @node.at_xpath("enclosure")
|
47
|
+
RSSEnclosure.new(node)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# GUID (optional).
|
52
|
+
def guid
|
53
|
+
if node = @node.at_xpath("guid")
|
54
|
+
RSSGuid.new(node)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Publication date (optional).
|
59
|
+
def pub_date
|
60
|
+
if date = @node.at_xpath("pubDate").try(:content)
|
61
|
+
Time.rfc822(date)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Source (optional).
|
66
|
+
def source
|
67
|
+
if node = @node.at_xpath("source")
|
68
|
+
RSSSource.new(node)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSCloud
|
3
|
+
|
4
|
+
# Initializes the cloud element.
|
5
|
+
def initialize(node)
|
6
|
+
@node = node
|
7
|
+
end
|
8
|
+
|
9
|
+
# Domain
|
10
|
+
def domain
|
11
|
+
@node["domain"]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Port
|
15
|
+
def port
|
16
|
+
@node["port"].nonzero?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Path
|
20
|
+
def path
|
21
|
+
@node["path"]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Register procedure
|
25
|
+
def register_procedure
|
26
|
+
@node["registerProcedure"]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Protocol
|
30
|
+
def protocol
|
31
|
+
@node["protocol"]
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSEnclosure
|
3
|
+
# Initializes the enclosure element.
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
# URL (required)
|
9
|
+
def url
|
10
|
+
@node["url"]
|
11
|
+
end
|
12
|
+
|
13
|
+
# Length (required)
|
14
|
+
def length
|
15
|
+
@node["length"]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Media type (required)
|
19
|
+
def type
|
20
|
+
@node["type"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSImage
|
3
|
+
# Initializes the image element.
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
# URL (required)
|
9
|
+
def url
|
10
|
+
@node.at_xpath("url").content
|
11
|
+
end
|
12
|
+
|
13
|
+
# Title (required)
|
14
|
+
def title
|
15
|
+
@node.at_xpath("title").content
|
16
|
+
end
|
17
|
+
|
18
|
+
# Link (required)
|
19
|
+
def link
|
20
|
+
@node.at_xpath("link").content
|
21
|
+
end
|
22
|
+
|
23
|
+
# Width (optional)
|
24
|
+
def width
|
25
|
+
@node.at_xpath("width").try(:content).to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
# Height (optional)
|
29
|
+
def height
|
30
|
+
@node.at_xpath("height").try(:content).to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
# Description (optional)
|
34
|
+
def description
|
35
|
+
@node.at_xpath("description").try(:content)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RSSFeed
|
2
|
+
class RSSTextInput
|
3
|
+
# Initializes the text input element.
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
# Title (required)
|
9
|
+
def title
|
10
|
+
@node.at_xpath("title").content
|
11
|
+
end
|
12
|
+
|
13
|
+
# Description (required)
|
14
|
+
def description
|
15
|
+
@node.at_xpath("description").content
|
16
|
+
end
|
17
|
+
|
18
|
+
# Name (required)
|
19
|
+
def name
|
20
|
+
@node.at_xpath("name").content
|
21
|
+
end
|
22
|
+
|
23
|
+
# Link (required)
|
24
|
+
def link
|
25
|
+
@node.at_xpath("link").content
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/rss_feed.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Copyright (C) 2011 Oliver Eilhard
|
2
|
+
#
|
3
|
+
# This library is freely distributable under
|
4
|
+
# the terms of an MIT-style license.
|
5
|
+
# See COPYING or http://www.opensource.org/licenses/mit-license.php.
|
6
|
+
|
7
|
+
# This library is for parsing RSS feeds.
|
8
|
+
|
9
|
+
module RSSFeed
|
10
|
+
VERSION = "0.1.1"
|
11
|
+
|
12
|
+
# OpenSearch 1.1 Draft 4 namespace
|
13
|
+
NS_OPENSEARCH_11 = "http://a9.com/-/spec/opensearch/1.1/"
|
14
|
+
|
15
|
+
# Well-known namespaces for use in Nokogiri
|
16
|
+
NS = {"rss" => "", "opensearch" => NS_OPENSEARCH_11}
|
17
|
+
|
18
|
+
autoload :CoreExt, 'rss_feed/core_ext.rb'
|
19
|
+
autoload :OpenSearch, 'rss_feed/open_search.rb'
|
20
|
+
autoload :OpenSearchQuery, 'rss_feed/open_search_query.rb'
|
21
|
+
autoload :RSSChannel, 'rss_feed/rss_channel.rb'
|
22
|
+
autoload :RSSChannelItem, 'rss_feed/rss_channel_item.rb'
|
23
|
+
autoload :RSSCategory, 'rss_feed/rss_category.rb'
|
24
|
+
autoload :RSSCloud, 'rss_feed/rss_cloud.rb'
|
25
|
+
autoload :RSSEnclosure, 'rss_feed/rss_enclosure.rb'
|
26
|
+
autoload :RSSGuid, 'rss_feed/rss_guid.rb'
|
27
|
+
autoload :RSSImage, 'rss_feed/rss_image.rb'
|
28
|
+
autoload :RSSSource, 'rss_feed/rss_source.rb'
|
29
|
+
autoload :RSSTextInput, 'rss_feed/rss_text_input.rb'
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rss_feed
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Oliver Eilhard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.12'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 3.12.1
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3.12'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 3.12.1
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '12.3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '12.3'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: nokogiri
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.8'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.8.2
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '1.8'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.8.2
|
81
|
+
description: Ruby library for parsing RSS feeds.
|
82
|
+
email:
|
83
|
+
- oliver.eilhard@gmail.com
|
84
|
+
executables: []
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files:
|
87
|
+
- CHANGELOG.md
|
88
|
+
- LICENSE
|
89
|
+
- README.md
|
90
|
+
files:
|
91
|
+
- CHANGELOG.md
|
92
|
+
- LICENSE
|
93
|
+
- README.md
|
94
|
+
- lib/rss_feed.rb
|
95
|
+
- lib/rss_feed/core_ext.rb
|
96
|
+
- lib/rss_feed/core_ext/string_ext.rb
|
97
|
+
- lib/rss_feed/core_ext/try.rb
|
98
|
+
- lib/rss_feed/open_search.rb
|
99
|
+
- lib/rss_feed/open_search_query.rb
|
100
|
+
- lib/rss_feed/rss_category.rb
|
101
|
+
- lib/rss_feed/rss_channel.rb
|
102
|
+
- lib/rss_feed/rss_channel_item.rb
|
103
|
+
- lib/rss_feed/rss_cloud.rb
|
104
|
+
- lib/rss_feed/rss_enclosure.rb
|
105
|
+
- lib/rss_feed/rss_guid.rb
|
106
|
+
- lib/rss_feed/rss_image.rb
|
107
|
+
- lib/rss_feed/rss_source.rb
|
108
|
+
- lib/rss_feed/rss_text_input.rb
|
109
|
+
homepage: http://github.com/olivere/rss_feed
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options:
|
115
|
+
- "--charset=UTF-8"
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: 1.3.6
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.5.2
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Ruby library for parsing RSS feeds.
|
134
|
+
test_files: []
|