wordprss 0.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 26a00cc252da9c6a4b536e77e959cf01417f43a9b98735cc390825b657e3e268
4
+ data.tar.gz: 4240293a107b07f3caf3d070195d48a0a49c0b07c612e3355baafc49bc364f87
5
+ SHA512:
6
+ metadata.gz: 69c087d265c9b08f227296970d36bc7c49b99f4740903cfb701bdf40d028b2f621d61f0e89fcd030e3d1329c006fa83c3789a7c861df3f9916d5d2c76dcb0bed
7
+ data.tar.gz: bf66ffce93792f8bdfbd3f6d837aae2cd0c4c5f3b81987fa4e77debed355b2a962a826bb9f0b6b347c159fa5d07af20a7907452287425851165df2540d5217da
@@ -0,0 +1,25 @@
1
+ module WordpRSS
2
+ class Channel
3
+ # Pull Wordpress RSS feed for given URL
4
+ #
5
+ # @return [WordpRSS::Feed]
6
+ def self.subscribe(url)
7
+ wordpress_url = WordpRSS::Url.parse(url)
8
+ response = WordpRSS::Request.new(wordpress_url).call
9
+
10
+ WordpRSS::Feed.new(response.body)
11
+ end
12
+
13
+ # Checks if the given URL points to the valid Wordpress RSS feed
14
+ #
15
+ # @return [Boolean]
16
+ def self.wordpress_rss_feed?(url)
17
+ wordpress_url = WordpRSS::Url.parse(url)
18
+ response = WordpRSS::Request.new(wordpress_url).call
19
+
20
+ WordpRSS::Policy.new.valid_rss_feed?(response)
21
+ rescue RestClient::NotFound
22
+ false
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require 'nokogiri'
2
+
3
+ module WordpRSS
4
+ class Feed
5
+
6
+ def initialize(body)
7
+ @body = body
8
+ end
9
+
10
+ # Returns the RSS feed title
11
+ #
12
+ # @return [String]
13
+ def title
14
+ xml.xpath("//channel").at("title").text
15
+ end
16
+
17
+ # Returns the RSS feed description
18
+ #
19
+ # @return [String]
20
+ def description
21
+ xml.xpath("//channel").at("description").text
22
+ end
23
+
24
+ # Returns a collection of the RSS feed items
25
+ #
26
+ # @return [Array<WordpRSS::Item>]
27
+ def items
28
+ xml.css("item").map do |node|
29
+ ::WordpRSS::Item.new(node)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :body
36
+
37
+ def xml
38
+ @xml ||= ::Nokogiri::XML(body)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ module WordpRSS
2
+ class InvalidURLError < StandardError
3
+ end
4
+ end
@@ -0,0 +1,55 @@
1
+ require 'pry'
2
+
3
+ module WordpRSS
4
+ class Item
5
+ def initialize(node)
6
+ @node = node
7
+ end
8
+
9
+ # Returns the item title
10
+ #
11
+ # @return [String]
12
+ def title
13
+ node.at("title").text
14
+ end
15
+
16
+ # Returns the item link
17
+ #
18
+ # @return [String]
19
+ def link
20
+ node.at("link").text
21
+ end
22
+
23
+ # Returns the item publication date
24
+ #
25
+ # @return [String]
26
+ def published_at
27
+ node.at("pubDate").text
28
+ end
29
+
30
+ # Returns the item description
31
+ #
32
+ # @return [String]
33
+ def description
34
+ node.at("description").text
35
+ end
36
+
37
+ # Returns an array of the item categories
38
+ #
39
+ # @return [Array<String>]
40
+ def tags
41
+ node.css("category").map(&:text)
42
+ end
43
+
44
+ # Returns item author
45
+ #
46
+ # @return [String]
47
+ def creator
48
+ node.elements.last.children.find { |c| c.name == "dc:creator" }.text
49
+ end
50
+
51
+ private
52
+
53
+ attr_accessor :node
54
+ end
55
+ end
@@ -0,0 +1,12 @@
1
+ module WordpRSS
2
+ class Policy
3
+ # Returns the result of the RSS feed validation. The RSS generator must be wordpress
4
+ #
5
+ # @return [Boolean]
6
+ def valid_rss_feed?(response)
7
+ xml = Nokogiri::XML(response.body)
8
+
9
+ !!(!xml.at("rss").nil? && xml.at("generator").text.to_s.match(/wordpress/i))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ require 'uri'
2
+ require 'rest-client'
3
+
4
+ module WordpRSS
5
+ class Request
6
+ def initialize(url)
7
+ @url = url
8
+ end
9
+
10
+ # Performs the request to the given URL in order to get the RSS feed contents
11
+ #
12
+ # @return [RestClient::Response]
13
+ def call
14
+ fail(WordpRSS::InvalidURLError.new("#{url} is not a valid URL")) unless url =~ URI::regexp
15
+
16
+ RestClient.get(url)
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :url
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ require 'uri'
2
+
3
+ module WordpRSS
4
+ class Url
5
+ # Parses given URL to get the version with the /feed
6
+ #
7
+ # @return [String]
8
+ def self.parse(url)
9
+ return url if url.nil? || url.match(/\/feed$/)
10
+
11
+ "#{url}/feed"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module WordpRSS
2
+ module Version
3
+ module_function
4
+
5
+ # Gem current version
6
+ #
7
+ # @return [String]
8
+ def to_s
9
+ "0.0.0.1"
10
+ end
11
+ end
12
+ end
data/lib/wordprss.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'wordprss/url'
2
+ require 'wordprss/channel'
3
+ require 'wordprss/feed'
4
+ require 'wordprss/item'
5
+ require 'wordprss/request'
6
+ require 'wordprss/invalid_url_error'
7
+ require 'wordprss/policy'
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wordprss
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Paweł Dąbrowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
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 the RSS channel of any Wordpress blog
56
+ email: dziamber@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/wordprss.rb
62
+ - lib/wordprss/channel.rb
63
+ - lib/wordprss/feed.rb
64
+ - lib/wordprss/invalid_url_error.rb
65
+ - lib/wordprss/item.rb
66
+ - lib/wordprss/policy.rb
67
+ - lib/wordprss/request.rb
68
+ - lib/wordprss/url.rb
69
+ - lib/wordprss/version.rb
70
+ homepage: http://github.com/rubyhero/wordprss
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.7.3
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Access the RSS channel of any Wordpress blog
94
+ test_files: []