weneedfeed 0.17.0 → 0.19.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5a85470ed37f8724012951976f2dbe1286d5b82dabace4e9c830e6104051129
4
- data.tar.gz: 980537323111e8ebafd1d0f8496dd45edaf21be74a26aba78aa8f8439e28546d
3
+ metadata.gz: 46e0612e810a86e2c8019c59d8d3d50aa2780032b7645f310cc4650d19ccffd1
4
+ data.tar.gz: 4c73b18a0bdc400c842f47096087a4c865e5806c16204c543305d3b746c23d29
5
5
  SHA512:
6
- metadata.gz: 040be9432bb6892d33cae5f8ddc4fd2e228b028fe6e9706fbb86cf58eaf97cef5bb005353a91dda4c972fba17319428b654dab6c6d9bd0ad90b3127cc4583911
7
- data.tar.gz: c386bd0eb5fa38abda0f7e5006f90b6e77c803a9b5b2a6f5becf5ea1aa89c945ed6d07daeb1021187a5dd428eb9fd0b474d1495a34b454c0b616e50378484700
6
+ metadata.gz: e12e2d7e233db01aff6095e2120d88a0e24eadf205442985b1d404f83f2bf0a17a907e121da3f9771db6b4ebd0685f858aa1d5c670158e77a71fc6fe0b77570e
7
+ data.tar.gz: ae98d953a2f8f5007f453029bd465727794a20a19e8ac01b0ea9c8e6b4a167a101709ecce516a56c76d62d05638521ca56796f92579544aa3d64b769c48ca68e
data/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.19.1 - 2022-08-01
11
+
12
+ ### Fixed
13
+
14
+ - Fix bug when time item includes white spaces.
15
+
16
+ ## 0.19.0 - 2022-08-01
17
+
18
+ ### Added
19
+
20
+ - Support %m月%d日配信 date format
21
+
22
+ ## 0.18.0 - 2022-04-17
23
+
24
+ ### Added
25
+
26
+ - Support configurable feeds title.
27
+ - Add --port= option to server command.
28
+
10
29
  ## 0.17.0 - 2022-04-15
11
30
 
12
31
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- weneedfeed (0.17.0)
4
+ weneedfeed (0.19.1)
5
5
  activesupport
6
6
  addressable
7
7
  builder
@@ -17,7 +17,7 @@ PATH
17
17
  GEM
18
18
  remote: https://rubygems.org/
19
19
  specs:
20
- activesupport (7.0.2.3)
20
+ activesupport (7.0.3.1)
21
21
  concurrent-ruby (~> 1.0, >= 1.0.2)
22
22
  i18n (>= 1.6, < 2)
23
23
  minitest (>= 5.1)
@@ -46,8 +46,8 @@ GEM
46
46
  faraday-em_synchrony (1.0.0)
47
47
  faraday-excon (1.1.0)
48
48
  faraday-httpclient (1.0.1)
49
- faraday-multipart (1.0.3)
50
- multipart-post (>= 1.2, < 3)
49
+ faraday-multipart (1.0.4)
50
+ multipart-post (~> 2)
51
51
  faraday-net_http (1.0.1)
52
52
  faraday-net_http_persistent (1.2.0)
53
53
  faraday-patron (1.0.0)
@@ -55,34 +55,34 @@ GEM
55
55
  faraday-retry (1.0.3)
56
56
  faraday_middleware (1.2.0)
57
57
  faraday (~> 1.0)
58
- hanami-router (2.0.0.alpha5)
58
+ hanami-router (2.0.0.beta1)
59
59
  mustermann (~> 1.0)
60
60
  mustermann-contrib (~> 1.0)
61
61
  rack (~> 2.0)
62
- hansi (0.2.0)
62
+ hansi (0.2.1)
63
63
  hashdiff (1.0.1)
64
64
  hibana (0.2.0)
65
65
  hanami-router (>= 2.0.0.alpha3)
66
66
  rack
67
67
  tilt
68
- i18n (1.10.0)
68
+ i18n (1.12.0)
69
69
  concurrent-ruby (~> 1.0)
70
70
  marcel (1.0.2)
71
71
  mini_portile2 (2.8.0)
72
- minitest (5.15.0)
73
- multipart-post (2.1.1)
74
- mustermann (1.1.1)
72
+ minitest (5.16.2)
73
+ multipart-post (2.2.3)
74
+ mustermann (1.1.2)
75
75
  ruby2_keywords (~> 0.0.1)
76
- mustermann-contrib (1.1.1)
76
+ mustermann-contrib (1.1.2)
77
77
  hansi (~> 0.2.0)
78
- mustermann (= 1.1.1)
79
- nokogiri (1.13.4)
78
+ mustermann (= 1.1.2)
79
+ nokogiri (1.13.8)
80
80
  mini_portile2 (~> 2.8.0)
81
81
  racc (~> 1.4)
82
82
  parallel (1.22.1)
83
83
  parser (3.1.2.0)
84
84
  ast (~> 2.4.1)
85
- psych (4.0.3)
85
+ psych (4.0.4)
86
86
  stringio
87
87
  public_suffix (4.0.7)
88
88
  racc (1.6.0)
@@ -125,10 +125,10 @@ GEM
125
125
  rubocop (~> 1.19)
126
126
  ruby-progressbar (1.11.0)
127
127
  ruby2_keywords (0.0.5)
128
- stringio (3.0.1)
128
+ stringio (3.0.2)
129
129
  thor (1.2.1)
130
- tilt (2.0.10)
131
- tzinfo (2.0.4)
130
+ tilt (2.0.11)
131
+ tzinfo (2.0.5)
132
132
  concurrent-ruby (~> 1.0)
133
133
  unicode-display_width (2.1.0)
134
134
  webmock (3.14.0)
data/README.md CHANGED
@@ -32,6 +32,8 @@ Weneedfeed requires `weneedfeed.yml` that describes URLs and selectors.
32
32
  ### Example
33
33
 
34
34
  ```yaml
35
+ title: Example RSS feeds
36
+
35
37
  pages:
36
38
  - id: example1
37
39
  title: Example 1
@@ -55,70 +57,75 @@ pages:
55
57
  item_title_selector: .//p[2]
56
58
  ```
57
59
 
58
- ### `id`
60
+ ### `title`
61
+
62
+ - optional (default: `"Weneedfeed"`)
63
+ - Used for feeds title on top page and OPML outline.
64
+
65
+ ### `pages.id`
59
66
 
60
67
  Feed ID.
61
68
 
62
69
  - required
63
70
  - Used for feed URL and `<link>` element in `<channel>` element.
64
71
 
65
- ### `title`
72
+ ### `pages.title`
66
73
 
67
74
  Feed title.
68
75
 
69
76
  - required
70
77
  - Used for RSS `<title>` element in `<channel>` element.
71
78
 
72
- ### `description`
79
+ ### `pages.description`
73
80
 
74
81
  Feed description.
75
82
 
76
83
  - optional
77
84
  - Used for RSS `<description>` element in `<channel>` element.
78
85
 
79
- ### `url`
86
+ ### `pages.url`
80
87
 
81
88
  HTML source URL.
82
89
 
83
90
  - required
84
91
  - Used to fetch HTML page for building feed.
85
92
 
86
- ### `item_selector`
93
+ ### `pages.item_selector`
87
94
 
88
95
  CSS or XPath selector to search each item.
89
96
 
90
97
  - required
91
98
  - Equivalent unit to RSS `<item>` element.
92
99
 
93
- ### `item_link_selector`
100
+ ### `pages.item_link_selector`
94
101
 
95
102
  CSS or XPath selector to find `<a>` element in each item.
96
103
 
97
104
  - required
98
105
  - Used for `<link>` in `<item>`.
99
106
 
100
- ### `item_title_selector`
107
+ ### `pages.item_title_selector`
101
108
 
102
109
  CSS or XPath selector to find element with title information in each item.
103
110
 
104
111
  - required
105
112
  - Used for `<title>` in `<item>`.
106
113
 
107
- ### `item_description_selector`
114
+ ### `pages.item_description_selector`
108
115
 
109
116
  CSS or XPath selector to find element with description information in each item.
110
117
 
111
118
  - optional
112
119
  - Used for `<description>` in `<item>`.
113
120
 
114
- ### `item_image_selector`
121
+ ### `pages.item_image_selector`
115
122
 
116
123
  CSS or XPath selector to find `<img>`element in each item.
117
124
 
118
125
  - optional
119
126
  - Used for `<enclosure>` in `<item>`.
120
127
 
121
- ### `item_time_selector`
128
+ ### `pages.item_time_selector`
122
129
 
123
130
  CSS or XPath selector to find element with datetime information in each item.
124
131
 
@@ -154,6 +161,8 @@ Usage:
154
161
  Options:
155
162
  [--schema-path=SCHEMA_PATH] # Path to weneedfeed YAML schema file.
156
163
  # Default: weneedfeed.yml
164
+ [--port=PORT] # TCP port to bind to.
165
+ # Default: 8080
157
166
 
158
167
  Run HTTP server.
159
168
  ```
@@ -53,9 +53,16 @@ module Weneedfeed
53
53
  type: :string
54
54
  )
55
55
 
56
+ method_option(
57
+ :port,
58
+ default: '8080',
59
+ desc: 'TCP port to bind to.',
60
+ type: :string
61
+ )
62
+
56
63
  def server
57
64
  application = Weneedfeed::Application.new(schema_path: options[:schema_path])
58
- ::Rack::Handler.default.run(application)
65
+ ::Rack::Handler.default.run(application, Port: options[:port])
59
66
  end
60
67
  end
61
68
  end
@@ -7,12 +7,12 @@ module Weneedfeed
7
7
  response.content_type = 'application/xml; charset=utf-8'
8
8
  response.write(
9
9
  ::Weneedfeed::Views::ShowOpml.new(
10
- page_schemata: schema.page_schemata.sort_by(&:title),
11
10
  partial_template_path: ::File.expand_path(
12
11
  'templates/show_opml.xml.erb',
13
12
  "#{__dir__}/../../.."
14
13
  ),
15
- request: request
14
+ request: request,
15
+ schema: schema
16
16
  ).to_s
17
17
  )
18
18
  end
@@ -4,16 +4,15 @@ module Weneedfeed
4
4
  module Controllers
5
5
  class ShowTopPage < ::Weneedfeed::Controllers::Base
6
6
  def call
7
- page_schemata = schema.page_schemata.sort_by(&:title)
8
7
  response.content_type = 'text/html'
9
8
  response.write(
10
9
  ::Weneedfeed::Views::ShowTopPage.new(
11
- page_schemata: page_schemata,
12
10
  partial_template_path: ::File.expand_path(
13
11
  'templates/show_top_page.html.erb',
14
12
  "#{__dir__}/../../.."
15
13
  ),
16
- request: request
14
+ request: request,
15
+ schema: schema
17
16
  ).to_s
18
17
  )
19
18
  end
@@ -10,11 +10,17 @@ module Weneedfeed
10
10
  # @param [String] string
11
11
  # @return [Time, nil]
12
12
  def parse_time(string)
13
- ::Time.parse(string)
14
- rescue ArgumentError, RangeError
13
+ ::Time.strptime(string, '%Y年%m月%d日')
14
+ rescue ::ArgumentError
15
15
  begin
16
- ::Time.strptime(string, '%Y年%m月%d日')
16
+ time = ::Time.strptime(string, '%m月%d日')
17
+ time -= 60 * 60 * 24 * 365 if time > Time.now
18
+ time
17
19
  rescue ArgumentError
20
+ begin
21
+ ::Time.parse(string)
22
+ rescue ArgumentError, RangeError
23
+ end
18
24
  end
19
25
  end
20
26
  end
@@ -143,7 +149,7 @@ module Weneedfeed
143
149
  node = time_node
144
150
  return unless node
145
151
 
146
- node['datetime'] || node.inner_text
152
+ node['datetime'] || node.inner_text&.strip
147
153
  end
148
154
  end
149
155
  end
@@ -4,6 +4,8 @@ require 'yaml'
4
4
 
5
5
  module Weneedfeed
6
6
  class Schema
7
+ DEFAULT_TITLE = 'Weneedfeed'
8
+
7
9
  class << self
8
10
  # @param [String] schema_path
9
11
  # @return [Weneedfeed::Schema]
@@ -48,5 +50,10 @@ module Weneedfeed
48
50
  )
49
51
  end
50
52
  end
53
+
54
+ # @return [String]
55
+ def title
56
+ @raw['title'] || DEFAULT_TITLE
57
+ end
51
58
  end
52
59
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Weneedfeed
4
- VERSION = '0.17.0'
4
+ VERSION = '0.19.1'
5
5
  end
@@ -3,10 +3,10 @@
3
3
  module Weneedfeed
4
4
  module Views
5
5
  class ShowOpml < Base
6
- # @param [Array<Hash>] page_schemata
7
- def initialize(page_schemata:, **argv)
6
+ # @param [Weneedfeed::Schema] schema
7
+ def initialize(schema:, **argv)
8
8
  super(**argv)
9
- @page_schemata = page_schemata
9
+ @schema = schema
10
10
  end
11
11
 
12
12
  private
@@ -21,6 +21,11 @@ module Weneedfeed
21
21
  def feed_path(page_id:)
22
22
  "#{base_path}#{router.path(:feed, page_id: page_id)}"
23
23
  end
24
+
25
+ # @return [Array<String>]
26
+ def page_schemata
27
+ @schema.page_schemata.sort_by(&:title)
28
+ end
24
29
  end
25
30
  end
26
31
  end
@@ -3,10 +3,10 @@
3
3
  module Weneedfeed
4
4
  module Views
5
5
  class ShowTopPage < Base
6
- # @param [Array<Hash>] page_schemata
7
- def initialize(page_schemata:, **argv)
6
+ # @param [Weneedfeed::Schema] schema
7
+ def initialize(schema:, **argv)
8
8
  super(**argv)
9
- @page_schemata = page_schemata
9
+ @schema = schema
10
10
  end
11
11
 
12
12
  private
@@ -27,6 +27,11 @@ module Weneedfeed
27
27
  "#{base_path}#{router.path(:opml)}"
28
28
  end
29
29
 
30
+ # @return [Array<String>]
31
+ def page_schemata
32
+ @schema.page_schemata.sort_by(&:title)
33
+ end
34
+
30
35
  # @return [Hanami::Router]
31
36
  def router
32
37
  ::Weneedfeed::Application.router
@@ -1,11 +1,11 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <opml version="1.0">
3
3
  <head>
4
- <title>Weneedfeed</title>
4
+ <title><%= @schema.title %></title>
5
5
  </head>
6
6
  <body>
7
- <outline text="Weneedfeed" title="Weneedfeed">
8
- <% @page_schemata.each do |page_schema| %>
7
+ <outline text="<%= @schema.title %>" title="<%= @schema.title %>">
8
+ <% page_schemata.each do |page_schema| %>
9
9
  <outline type="rss" text="<%= page_schema.title %>" title="<%= page_schema.title %>" xmlUrl="<%= "#{request.base_url}#{feed_path(page_id: page_schema.id)}" %>" htmlUrl="<%= page_schema.url %>"/>
10
10
  <% end %>
11
11
  </outline>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width">
6
- <title>Weneedfeed</title>
6
+ <title><%= @schema.title %></title>
7
7
  </head>
8
8
  <body>
9
9
  <section>
@@ -11,7 +11,7 @@
11
11
  <h1>Feeds</h1>
12
12
  </header>
13
13
  <ul>
14
- <% @page_schemata.each do |page_schema| %>
14
+ <% page_schemata.each do |page_schema| %>
15
15
  <li>
16
16
  <a href="<%= feed_path(page_id: page_schema.id) %>"><%= page_schema.title %></a>
17
17
  </li>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weneedfeed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-15 00:00:00.000000000 Z
11
+ date: 2022-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -234,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
234
  - !ruby/object:Gem::Version
235
235
  version: '0'
236
236
  requirements: []
237
- rubygems_version: 3.1.4
237
+ rubygems_version: 3.3.7
238
238
  signing_key:
239
239
  specification_version: 4
240
240
  summary: Generate feeds from URL and selectors.