weneedfeed 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +1 -1
- data/README.md +46 -16
- data/lib/weneedfeed/command.rb +2 -2
- data/lib/weneedfeed/controllers/show_feed.rb +5 -5
- data/lib/weneedfeed/controllers/show_top_page.rb +3 -1
- data/lib/weneedfeed/item.rb +16 -16
- data/lib/weneedfeed/page.rb +20 -20
- data/lib/weneedfeed/scraping.rb +20 -20
- data/lib/weneedfeed/version.rb +1 -1
- data/lib/weneedfeed/views/show_feed.rb +10 -0
- data/templates/show_feed.xml.erb +1 -1
- data/weneedfeed.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adfe67e7ae534a35ab0e8c7ae33272c9046187564304700e7b6eec52dd671d03
|
4
|
+
data.tar.gz: f4081b96371d71f0833ae6bf16e63d2719e4d341c9d23f8e17ab543f538ba6ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e58d4b58d0813ecdbe5c995acbf8e4a2b55c3598fb81967b0a169fcdb72ebc7ee6717bd39fcc95c043b88345cb6396f2221aa507a0cae2a0a07b1936f3442751
|
7
|
+
data.tar.gz: b521aba54d499732ec09fc93de7d77ed642de53aaf828f49683b5f66c3616c781ed79675fbfb0df7a6aca4854897f57c92d2da09c0ad0f375bab12f71cdff7dd
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## Unreleased
|
9
9
|
|
10
|
+
## 0.4.0 - 2020-11-08
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Add CSS selector support.
|
15
|
+
|
16
|
+
### Changed
|
17
|
+
|
18
|
+
- Change schema key from `xpath` to `selectors`.
|
19
|
+
- Change item_link_selector target from href attribute to a element.
|
20
|
+
- Change some argument names from `_xpath` to `_selector`.
|
21
|
+
- Change `weneedfeed build` description.
|
22
|
+
- Change `weneedfeed server` description.
|
23
|
+
- Change channel link from feed URL to top page URL.
|
24
|
+
- Sort top page feeds by its title.
|
25
|
+
|
10
26
|
## 0.3.0 - 2020-11-08
|
11
27
|
|
12
28
|
### Added
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![](https://badge.fury.io/rb/weneedfeed.svg)](https://rubygems.org/gems/weneedfeed)
|
4
4
|
[![](https://github.com/r7kamura/weneedfeed/workflows/test/badge.svg)](https://github.com/r7kamura/weneedfeed/actions?query=workflow%3Atest)
|
5
5
|
|
6
|
-
Generate feeds from URL and
|
6
|
+
Generate feeds from URL and selectors.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -27,14 +27,25 @@ gem install weneedfeed
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
|
30
|
+
### Schema
|
31
|
+
|
32
|
+
Write `weneedfeed.yml`.
|
31
33
|
|
32
34
|
```yaml
|
33
35
|
pages:
|
34
|
-
|
35
|
-
title: example
|
36
|
-
url: http://example.com/
|
37
|
-
|
36
|
+
example1:
|
37
|
+
title: example site 1
|
38
|
+
url: http://example.com/1
|
39
|
+
selectors:
|
40
|
+
item: li
|
41
|
+
item_description: p:nth-child(3)
|
42
|
+
item_link: a
|
43
|
+
item_time: time[datetime]
|
44
|
+
item_title: p:nth-child(2)
|
45
|
+
example2:
|
46
|
+
title: example site 2
|
47
|
+
url: http://example.com/2
|
48
|
+
selectors:
|
38
49
|
item: //li
|
39
50
|
item_description: .//p[3]
|
40
51
|
item_link: .//a/@href
|
@@ -42,21 +53,40 @@ pages:
|
|
42
53
|
item_title: .//p[2]
|
43
54
|
```
|
44
55
|
|
45
|
-
|
56
|
+
### Build
|
46
57
|
|
47
|
-
|
48
|
-
|
58
|
+
Run `weneedfeed build` to build static files.
|
59
|
+
|
60
|
+
```
|
61
|
+
Usage:
|
62
|
+
weneedfeed build --base-url=BASE_URL
|
63
|
+
|
64
|
+
Options:
|
65
|
+
--base-url=BASE_URL # Base URL where to locate built files. (e.g. `"https://user.github.io/repo"`)
|
66
|
+
[--schema-path=SCHEMA_PATH] # Path to weneedfeed YAML schema file.
|
67
|
+
# Default: weneedfeed.yml
|
68
|
+
|
69
|
+
Build static files.
|
70
|
+
```
|
71
|
+
|
72
|
+
### Server
|
73
|
+
|
74
|
+
Run `weneedfeed server` to run HTTP server.
|
75
|
+
|
76
|
+
```
|
77
|
+
Usage:
|
78
|
+
weneedfeed server
|
79
|
+
|
80
|
+
Options:
|
81
|
+
[--schema-path=SCHEMA_PATH] # Path to weneedfeed YAML schema file.
|
82
|
+
# Default: weneedfeed.yml
|
49
83
|
|
50
|
-
|
51
|
-
base_url: 'https://user.github.io/repo',
|
52
|
-
schema_path: 'schema.yml'
|
53
|
-
)
|
84
|
+
Run HTTP server.
|
54
85
|
```
|
55
86
|
|
56
|
-
|
87
|
+
## GitHub Actions Integration
|
57
88
|
|
58
|
-
-
|
59
|
-
- output/feeds/example.xml
|
89
|
+
Use [weneedfeed-action](https://github.com/r7kamura/weneedfeed-action) for invoking weneedfeed on GitHub Actions.
|
60
90
|
|
61
91
|
## Development
|
62
92
|
|
data/lib/weneedfeed/command.rb
CHANGED
@@ -16,7 +16,7 @@ module Weneedfeed
|
|
16
16
|
|
17
17
|
desc(
|
18
18
|
'build',
|
19
|
-
'Build static files
|
19
|
+
'Build static files.'
|
20
20
|
)
|
21
21
|
|
22
22
|
method_option(
|
@@ -44,7 +44,7 @@ module Weneedfeed
|
|
44
44
|
|
45
45
|
desc(
|
46
46
|
'server',
|
47
|
-
'Run HTTP server'
|
47
|
+
'Run HTTP server.'
|
48
48
|
)
|
49
49
|
|
50
50
|
method_option(
|
@@ -20,11 +20,11 @@ module Weneedfeed
|
|
20
20
|
end
|
21
21
|
|
22
22
|
scraping = ::Weneedfeed::Scraping.new(
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
item_description_selector: properties['selectors']['item_description'],
|
24
|
+
item_link_selector: properties['selectors']['item_link'],
|
25
|
+
item_time_selector: properties['selectors']['item_time'],
|
26
|
+
item_title_selector: properties['selectors']['item_title'],
|
27
|
+
item_selector: properties['selectors']['item'],
|
28
28
|
title: properties['title'],
|
29
29
|
url: properties['url']
|
30
30
|
)
|
data/lib/weneedfeed/item.rb
CHANGED
@@ -15,38 +15,38 @@ module Weneedfeed
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
# @param [String]
|
19
|
-
# @param [String]
|
18
|
+
# @param [String] description_selector
|
19
|
+
# @param [String] link_selector
|
20
20
|
# @param [Nokogiri::Node] node
|
21
|
-
# @param [String]
|
22
|
-
# @param [String]
|
21
|
+
# @param [String] time_selector
|
22
|
+
# @param [String] title_selector
|
23
23
|
# @param [String] url
|
24
24
|
def initialize(
|
25
|
-
|
26
|
-
|
25
|
+
description_selector:,
|
26
|
+
link_selector:,
|
27
27
|
node:,
|
28
|
-
|
29
|
-
|
28
|
+
time_selector:,
|
29
|
+
title_selector:,
|
30
30
|
url:
|
31
31
|
)
|
32
|
-
@
|
33
|
-
@
|
32
|
+
@description_selector = description_selector
|
33
|
+
@link_selector = link_selector
|
34
34
|
@node = node
|
35
|
-
@
|
36
|
-
@
|
35
|
+
@time_selector = time_selector
|
36
|
+
@title_selector = title_selector
|
37
37
|
@url = url
|
38
38
|
end
|
39
39
|
|
40
40
|
# @return [String, nil]
|
41
41
|
def description
|
42
|
-
@node.
|
42
|
+
@node.at(@description_selector).inner_html
|
43
43
|
end
|
44
44
|
|
45
45
|
# @return [String]
|
46
46
|
def link
|
47
47
|
::URI.join(
|
48
48
|
@url,
|
49
|
-
@node.
|
49
|
+
@node.at(@link_selector)['href']
|
50
50
|
).to_s
|
51
51
|
end
|
52
52
|
|
@@ -57,14 +57,14 @@ module Weneedfeed
|
|
57
57
|
|
58
58
|
# @return [String, nil]
|
59
59
|
def title
|
60
|
-
@node.
|
60
|
+
@node.at(@title_selector).inner_text
|
61
61
|
end
|
62
62
|
|
63
63
|
private
|
64
64
|
|
65
65
|
# @return [String]
|
66
66
|
def time_string
|
67
|
-
@node.
|
67
|
+
@node.at(@time_selector).inner_html
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
data/lib/weneedfeed/page.rb
CHANGED
@@ -8,29 +8,29 @@ module Weneedfeed
|
|
8
8
|
# @return [String]
|
9
9
|
attr_reader :url
|
10
10
|
|
11
|
-
# @param [String]
|
12
|
-
# @param [String]
|
13
|
-
# @param [String]
|
14
|
-
# @param [String]
|
15
|
-
# @param [String]
|
11
|
+
# @param [String] item_description_selector
|
12
|
+
# @param [String] item_link_selector
|
13
|
+
# @param [String] item_time_selector
|
14
|
+
# @param [String] item_title_selector
|
15
|
+
# @param [String] item_selector
|
16
16
|
# @param [Nokogiri::Node] node
|
17
17
|
# @param [String] title
|
18
18
|
# @param [String] url
|
19
19
|
def initialize(
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
item_description_selector:,
|
21
|
+
item_link_selector:,
|
22
|
+
item_time_selector:,
|
23
|
+
item_title_selector:,
|
24
|
+
item_selector:,
|
25
25
|
node:,
|
26
26
|
title:,
|
27
27
|
url:
|
28
28
|
)
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@
|
32
|
-
@
|
33
|
-
@
|
29
|
+
@item_description_selector = item_description_selector
|
30
|
+
@item_link_selector = item_link_selector
|
31
|
+
@item_time_selector = item_time_selector
|
32
|
+
@item_title_selector = item_title_selector
|
33
|
+
@item_selector = item_selector
|
34
34
|
@node = node
|
35
35
|
@title = title
|
36
36
|
@url = url
|
@@ -38,13 +38,13 @@ module Weneedfeed
|
|
38
38
|
|
39
39
|
# @return [Array<Weneedfeed::Item>]
|
40
40
|
def items
|
41
|
-
@node.
|
41
|
+
@node.search(@item_selector).map do |node|
|
42
42
|
::Weneedfeed::Item.new(
|
43
|
-
|
44
|
-
|
43
|
+
description_selector: @item_description_selector,
|
44
|
+
link_selector: @item_link_selector,
|
45
45
|
node: node,
|
46
|
-
|
47
|
-
|
46
|
+
time_selector: @item_time_selector,
|
47
|
+
title_selector: @item_title_selector,
|
48
48
|
url: @url
|
49
49
|
)
|
50
50
|
end
|
data/lib/weneedfeed/scraping.rb
CHANGED
@@ -5,27 +5,27 @@ require 'nokogiri'
|
|
5
5
|
|
6
6
|
module Weneedfeed
|
7
7
|
class Scraping
|
8
|
-
# @param [String]
|
9
|
-
# @param [String]
|
10
|
-
# @param [String]
|
11
|
-
# @param [String]
|
12
|
-
# @param [String]
|
8
|
+
# @param [String] item_description_selector
|
9
|
+
# @param [String] item_link_selector
|
10
|
+
# @param [String] item_time_selector
|
11
|
+
# @param [String] item_title_selector
|
12
|
+
# @param [String] item_selector
|
13
13
|
# @param [String] title
|
14
14
|
# @param [String] url
|
15
15
|
def initialize(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
item_description_selector:,
|
17
|
+
item_link_selector:,
|
18
|
+
item_time_selector:,
|
19
|
+
item_title_selector:,
|
20
|
+
item_selector:,
|
21
21
|
title:,
|
22
22
|
url:
|
23
23
|
)
|
24
|
-
@
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
28
|
-
@
|
24
|
+
@item_description_selector = item_description_selector
|
25
|
+
@item_link_selector = item_link_selector
|
26
|
+
@item_time_selector = item_time_selector
|
27
|
+
@item_title_selector = item_title_selector
|
28
|
+
@item_selector = item_selector
|
29
29
|
@title = title
|
30
30
|
@url = url
|
31
31
|
end
|
@@ -34,11 +34,11 @@ module Weneedfeed
|
|
34
34
|
def call
|
35
35
|
::Weneedfeed::Page.new(
|
36
36
|
node: parsed_body,
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
item_description_selector: @item_description_selector,
|
38
|
+
item_selector: @item_selector,
|
39
|
+
item_link_selector: @item_link_selector,
|
40
|
+
item_time_selector: @item_time_selector,
|
41
|
+
item_title_selector: @item_title_selector,
|
42
42
|
title: @title,
|
43
43
|
url: @url
|
44
44
|
)
|
data/lib/weneedfeed/version.rb
CHANGED
@@ -11,6 +11,11 @@ module Weneedfeed
|
|
11
11
|
|
12
12
|
private
|
13
13
|
|
14
|
+
# @return [String]
|
15
|
+
def top_page_path
|
16
|
+
request.path.delete_suffix(router.path(:feed, page_name: page_name))
|
17
|
+
end
|
18
|
+
|
14
19
|
# @return [Enumerable<Weneedfeed::Item>]
|
15
20
|
def items
|
16
21
|
@page.items.sort_by do |item|
|
@@ -22,6 +27,11 @@ module Weneedfeed
|
|
22
27
|
def page_name
|
23
28
|
request.env['router.params'][:page_name]
|
24
29
|
end
|
30
|
+
|
31
|
+
# @return [Hanami::Router]
|
32
|
+
def router
|
33
|
+
::Weneedfeed::Application.router
|
34
|
+
end
|
25
35
|
end
|
26
36
|
end
|
27
37
|
end
|
data/templates/show_feed.xml.erb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
5
5
|
<channel>
|
6
6
|
<title><![CDATA[<%= @page.title %>]]></title>
|
7
|
-
<link><%= "#{request.base_url}#{
|
7
|
+
<link><%= "#{request.base_url}#{top_page_path}" %></link>
|
8
8
|
<atom:link href="<%= "#{request.base_url}#{request.path}" %>" rel="self"/>
|
9
9
|
<description><![CDATA[Recent content on <%= @page.title %>]]></description>
|
10
10
|
<lastBuildDate><%= Time.now.rfc822 %></lastBuildDate>
|
data/weneedfeed.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Ryo Nakamura']
|
9
9
|
spec.email = ['r7kamura@gmail.com']
|
10
10
|
|
11
|
-
spec.summary = 'Generate feeds from URL and
|
11
|
+
spec.summary = 'Generate feeds from URL and selectors.'
|
12
12
|
spec.homepage = 'https://github.com/r7kamura/weneedfeed'
|
13
13
|
spec.license = 'MIT'
|
14
14
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weneedfeed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
@@ -142,5 +142,5 @@ requirements: []
|
|
142
142
|
rubygems_version: 3.1.2
|
143
143
|
signing_key:
|
144
144
|
specification_version: 4
|
145
|
-
summary: Generate feeds from URL and
|
145
|
+
summary: Generate feeds from URL and selectors.
|
146
146
|
test_files: []
|