weneedfeed 0.6.0 → 0.8.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65814d68cfaf1936de388ce721e3aee49a0e4641c0ecd6ae2afb72c858fbd8f4
4
- data.tar.gz: ed124803cfb9589dd3b8e44169454b07623a2460a7ac2412c1946d08e51d590f
3
+ metadata.gz: a2634d6a72650518bf2845381116e208a65fbb9f067b6e19f58352bb46ecb5ba
4
+ data.tar.gz: 1ccc6647e1a02d34af10460b34d5cd594eb5a184cbe18e2244d45637a38d9d96
5
5
  SHA512:
6
- metadata.gz: 486e7af49032ebf8124d6360cd835ec5ede778c4dc6911259fcee753247166ef6c53e3468bb3c386a3e2d794b3939685795c230a4ff24e65a67e615c5b39a800
7
- data.tar.gz: 636f09f3860a1a7a16bf425facd29988e7037ae35a9ab8a11b8a37118339c9bdf750336eb01b8c36e2bee0d8b81ed2b1a9846269096428b702c09b27b873617a
6
+ metadata.gz: 18d069fc8460e37e79b67869bd91f64d28f865d052c4464d6f169f811ad32c27698ccad3235f4b7f047160cd68341f56a576701758bb367d9766e9f8d46dc9c3
7
+ data.tar.gz: b4f5e74955365a5184b90ea2ce877b0f548e55da5a9eb55e1f92ad64e66f0426397fb441ccda7d4a678ec5c9acb2b4f782c0185fdbe511139b53087b0e6e0a05
@@ -18,5 +18,3 @@ jobs:
18
18
  - uses: r7kamura/rubocop-problem-matchers-action@v1
19
19
  - run: bundle exec rubocop --parallel
20
20
  - run: bundle exec rspec --force-color
21
-
22
-
@@ -1,4 +1,8 @@
1
+ require:
2
+ - rubocop-rspec
3
+
1
4
  AllCops:
5
+ NewCops: enable
2
6
  TargetRubyVersion: 2.5
3
7
 
4
8
  Lint/SuppressedException:
@@ -7,8 +11,20 @@ Lint/SuppressedException:
7
11
  Metrics:
8
12
  Enabled: false
9
13
 
14
+ RSpec/ImplicitSubject:
15
+ Enabled: false
16
+
17
+ RSpec/MultipleExpectations:
18
+ Enabled: false
19
+
20
+ RSpec/NamedSubject:
21
+ Enabled: false
22
+
10
23
  Style/Documentation:
11
24
  Enabled: false
12
25
 
13
26
  Style/TrailingCommaInArguments:
14
27
  Enabled: false
28
+
29
+ Style/TrailingCommaInHashLiteral:
30
+ Enabled: false
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.8.0 - 2020-11-25
11
+
12
+ ### Added
13
+
14
+ - Add page description for writing channel description.
15
+
16
+ ### Changed
17
+
18
+ - Change channel link content from feeds index URL to page URL.
19
+
20
+ ## 0.7.2 - 2020-11-25
21
+
22
+ ### Fixed
23
+
24
+ - Fix time parse error by HTML entities handling.
25
+
26
+ ## 0.7.1 - 2020-11-25
27
+
28
+ ### Fixed
29
+
30
+ - Fix error when no title element found.
31
+
32
+ ## 0.7.0 - 2020-11-23
33
+
34
+ ### Added
35
+
36
+ - Convert JSON response into XML.
37
+
38
+ ### Fixed
39
+
40
+ - Fix bug that item_description_selector is not used.
41
+
42
+ ## 0.6.1 - 2020-11-15
43
+
44
+ ### Changed
45
+
46
+ - Require hibana 0.2 or later.
47
+
48
+ ### Fixed
49
+
50
+ - Fix installation error caused by hanami-router version restriction.
51
+
52
+ ### Removed
53
+
54
+ - Remove direct dependency on hanami-router.
55
+
10
56
  ## 0.6.0 - 2020-11-15
11
57
 
12
58
  ### Changed
data/Gemfile CHANGED
@@ -9,4 +9,5 @@ gem 'rack-test'
9
9
  gem 'rake', '~> 12.0'
10
10
  gem 'rspec'
11
11
  gem 'rubocop'
12
+ gem 'rubocop-rspec'
12
13
  gem 'webmock'
@@ -1,10 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- weneedfeed (0.6.0)
4
+ weneedfeed (0.8.0)
5
+ activesupport
6
+ builder
5
7
  faraday
6
- hanami-router (= 2.0.0.alpha3)
7
- hibana
8
+ faraday_middleware
9
+ hibana (>= 0.2)
8
10
  nokogiri
9
11
  rack-capture (>= 0.4.0)
10
12
  thor
@@ -12,25 +14,38 @@ PATH
12
14
  GEM
13
15
  remote: https://rubygems.org/
14
16
  specs:
17
+ activesupport (6.0.3.4)
18
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
+ i18n (>= 0.7, < 2)
20
+ minitest (~> 5.1)
21
+ tzinfo (~> 1.1)
22
+ zeitwerk (~> 2.2, >= 2.2.2)
15
23
  addressable (2.7.0)
16
24
  public_suffix (>= 2.0.2, < 5.0)
17
25
  ast (2.4.1)
26
+ builder (3.2.4)
27
+ concurrent-ruby (1.1.7)
18
28
  crack (0.4.4)
19
29
  diff-lcs (1.4.4)
20
30
  faraday (1.1.0)
21
31
  multipart-post (>= 1.2, < 3)
22
32
  ruby2_keywords
33
+ faraday_middleware (1.0.0)
34
+ faraday (~> 1.0)
23
35
  hanami-router (2.0.0.alpha3)
24
36
  mustermann (~> 1.0)
25
37
  mustermann-contrib (~> 1.0)
26
38
  rack (~> 2.0)
27
39
  hansi (0.2.0)
28
40
  hashdiff (1.0.1)
29
- hibana (0.1.1)
30
- hanami-router
41
+ hibana (0.2.0)
42
+ hanami-router (>= 2.0.0.alpha3)
31
43
  rack
32
44
  tilt
45
+ i18n (1.8.5)
46
+ concurrent-ruby (~> 1.0)
33
47
  mini_portile2 (2.4.0)
48
+ minitest (5.14.2)
34
49
  multipart-post (2.1.1)
35
50
  mustermann (1.1.1)
36
51
  ruby2_keywords (~> 0.0.1)
@@ -39,7 +54,7 @@ GEM
39
54
  mustermann (= 1.1.1)
40
55
  nokogiri (1.10.10)
41
56
  mini_portile2 (~> 2.4.0)
42
- parallel (1.19.2)
57
+ parallel (1.20.1)
43
58
  parser (2.7.2.0)
44
59
  ast (~> 2.4.1)
45
60
  public_suffix (4.0.6)
@@ -65,26 +80,33 @@ GEM
65
80
  diff-lcs (>= 1.2.0, < 2.0)
66
81
  rspec-support (~> 3.9.0)
67
82
  rspec-support (3.9.4)
68
- rubocop (1.0.0)
83
+ rubocop (1.4.0)
69
84
  parallel (~> 1.10)
70
85
  parser (>= 2.7.1.5)
71
86
  rainbow (>= 2.2.2, < 4.0)
72
87
  regexp_parser (>= 1.8)
73
88
  rexml
74
- rubocop-ast (>= 0.6.0)
89
+ rubocop-ast (>= 1.1.1)
75
90
  ruby-progressbar (~> 1.7)
76
91
  unicode-display_width (>= 1.4.0, < 2.0)
77
- rubocop-ast (1.1.0)
92
+ rubocop-ast (1.1.1)
78
93
  parser (>= 2.7.1.5)
94
+ rubocop-rspec (2.0.0)
95
+ rubocop (~> 1.0)
96
+ rubocop-ast (>= 1.1.0)
79
97
  ruby-progressbar (1.10.1)
80
98
  ruby2_keywords (0.0.2)
81
99
  thor (1.0.1)
100
+ thread_safe (0.3.6)
82
101
  tilt (2.0.10)
102
+ tzinfo (1.2.8)
103
+ thread_safe (~> 0.1)
83
104
  unicode-display_width (1.7.0)
84
105
  webmock (3.9.3)
85
106
  addressable (>= 2.3.6)
86
107
  crack (>= 0.3.2)
87
108
  hashdiff (>= 0.4.0, < 2.0.0)
109
+ zeitwerk (2.4.1)
88
110
 
89
111
  PLATFORMS
90
112
  ruby
@@ -94,6 +116,7 @@ DEPENDENCIES
94
116
  rake (~> 12.0)
95
117
  rspec
96
118
  rubocop
119
+ rubocop-rspec
97
120
  webmock
98
121
  weneedfeed!
99
122
 
data/README.md CHANGED
@@ -34,7 +34,8 @@ You need to write a schema file named with `weneedfeed.yml` to use this gem.
34
34
  ```yaml
35
35
  pages:
36
36
  - id: example1
37
- title: Example feed with CSS Selector
37
+ title: Example 1
38
+ description: Example feed with CSS Selector
38
39
  url: http://example.com/1
39
40
  item_selector: li
40
41
  item_description_selector: p:nth-child(3)
@@ -42,7 +43,8 @@ pages:
42
43
  item_time_selector: time
43
44
  item_title_selector: p:nth-child(2)
44
45
  - id: example2
45
- title: Example feed with XPath
46
+ title: Example 2
47
+ description: Example feed with XPath
46
48
  url: http://example.com/2
47
49
  item_selector: //li
48
50
  item_description_selector: .//p[3]
@@ -56,7 +58,7 @@ pages:
56
58
  Feed ID.
57
59
 
58
60
  - required
59
- - Used for feed URL.
61
+ - Used for feed URL and `<link>` element in `<channel>` element.
60
62
 
61
63
  ### `title`
62
64
 
@@ -65,6 +67,13 @@ Feed title.
65
67
  - required
66
68
  - Used for RSS `<title>` element in `<channel>` element.
67
69
 
70
+ ### `description`
71
+
72
+ Feed description.
73
+
74
+ - optional
75
+ - Used for RSS `<description>` element in `<channel>` element.
76
+
68
77
  ### `url`
69
78
 
70
79
  HTML source URL.
@@ -7,6 +7,7 @@ module Weneedfeed
7
7
  autoload :Capture, 'weneedfeed/capture'
8
8
  autoload :Command, 'weneedfeed/command'
9
9
  autoload :Controllers, 'weneedfeed/controllers'
10
+ autoload :FaradayResponseMiddleware, 'weneedfeed/faraday_response_middleware'
10
11
  autoload :Helpers, 'weneedfeed/helpers'
11
12
  autoload :Item, 'weneedfeed/item'
12
13
  autoload :Page, 'weneedfeed/page'
@@ -11,6 +11,7 @@ module Weneedfeed
11
11
  end
12
12
 
13
13
  scraping = ::Weneedfeed::Scraping.new(
14
+ description: page_schema.description,
14
15
  item_description_selector: page_schema.item_description_selector,
15
16
  item_link_selector: page_schema.item_link_selector,
16
17
  item_time_selector: page_schema.item_time_selector,
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/array/conversions'
4
+ require 'active_support/core_ext/hash/conversions'
5
+ require 'faraday'
6
+ require 'faraday_middleware/response_middleware'
7
+ require 'json'
8
+
9
+ module Weneedfeed
10
+ class FaradayResponseMiddleware < ::FaradayMiddleware::ResponseMiddleware
11
+ define_parser do |body, options|
12
+ options ||= {}
13
+ options = { dasherize: false }.merge(options)
14
+ object = ::JSON.parse(body)
15
+ object.to_xml(options)
16
+ end
17
+
18
+ # @note Overriding.
19
+ def parse_response?(env)
20
+ env.response.headers['Content-Type'].to_s.include?('application/json')
21
+ end
22
+ end
23
+ end
@@ -48,10 +48,21 @@ module Weneedfeed
48
48
  def link
49
49
  ::URI.join(
50
50
  @url,
51
- @node.at(@link_selector)['href']
51
+ link_path_or_url
52
52
  ).to_s
53
53
  end
54
54
 
55
+ # @return [Nokogiri::Node, nil]
56
+ def link_node
57
+ @node.at(@link_selector)
58
+ end
59
+
60
+ # @return [String, nil]
61
+ def link_path_or_url
62
+ node = link_node
63
+ node['href'] || node.inner_text
64
+ end
65
+
55
66
  # @return [Time, nil]
56
67
  def time
57
68
  return unless @time_selector
@@ -62,9 +73,9 @@ module Weneedfeed
62
73
  self.class.parse_time(string)
63
74
  end
64
75
 
65
- # @return [String]
76
+ # @return [String, nil]
66
77
  def title
67
- @node.at(@title_selector).inner_text
78
+ @node.at(@title_selector)&.inner_text
68
79
  end
69
80
 
70
81
  private
@@ -79,7 +90,7 @@ module Weneedfeed
79
90
  node = time_node
80
91
  return unless node
81
92
 
82
- node['datetime'] || node.inner_html
93
+ node['datetime'] || node.inner_text
83
94
  end
84
95
  end
85
96
  end
@@ -2,12 +2,16 @@
2
2
 
3
3
  module Weneedfeed
4
4
  class Page
5
+ # @return [String, nil]
6
+ attr_reader :description
7
+
5
8
  # @return [String]
6
9
  attr_reader :title
7
10
 
8
11
  # @return [String]
9
12
  attr_reader :url
10
13
 
14
+ # @param [String, nil] description
11
15
  # @param [String, nil] item_description_selector
12
16
  # @param [String] item_link_selector
13
17
  # @param [String, nil] item_time_selector
@@ -17,6 +21,7 @@ module Weneedfeed
17
21
  # @param [String] title
18
22
  # @param [String] url
19
23
  def initialize(
24
+ description:,
20
25
  item_description_selector:,
21
26
  item_link_selector:,
22
27
  item_time_selector:,
@@ -26,6 +31,7 @@ module Weneedfeed
26
31
  title:,
27
32
  url:
28
33
  )
34
+ @description = description
29
35
  @item_description_selector = item_description_selector
30
36
  @item_link_selector = item_link_selector
31
37
  @item_time_selector = item_time_selector
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Weneedfeed
4
4
  PageSchema = Struct.new(
5
+ :description,
5
6
  :id,
6
7
  :item_description_selector,
7
8
  :item_link_selector,
@@ -24,7 +24,9 @@ module Weneedfeed
24
24
  def page_schemata
25
25
  @raw['pages'].map do |hash|
26
26
  ::Weneedfeed::PageSchema.new(
27
+ description: hash['description'],
27
28
  id: hash['id'],
29
+ item_description_selector: hash['item_description_selector'],
28
30
  item_link_selector: hash['item_link_selector'],
29
31
  item_time_selector: hash['item_time_selector'],
30
32
  item_title_selector: hash['item_title_selector'],
@@ -5,6 +5,16 @@ require 'nokogiri'
5
5
 
6
6
  module Weneedfeed
7
7
  class Scraping
8
+ class << self
9
+ # @return [Faraday::Connection]
10
+ def faraday_connection
11
+ @faraday_connection ||= ::Faraday.new do |connection|
12
+ connection.use ::Weneedfeed::FaradayResponseMiddleware
13
+ end
14
+ end
15
+ end
16
+
17
+ # @param [String, nil] description
8
18
  # @param [String, nil] item_description_selector
9
19
  # @param [String] item_link_selector
10
20
  # @param [String, nil] item_time_selector
@@ -13,6 +23,7 @@ module Weneedfeed
13
23
  # @param [String] title
14
24
  # @param [String] url
15
25
  def initialize(
26
+ description:,
16
27
  item_description_selector:,
17
28
  item_link_selector:,
18
29
  item_time_selector:,
@@ -21,6 +32,7 @@ module Weneedfeed
21
32
  title:,
22
33
  url:
23
34
  )
35
+ @description = description
24
36
  @item_description_selector = item_description_selector
25
37
  @item_link_selector = item_link_selector
26
38
  @item_time_selector = item_time_selector
@@ -33,6 +45,7 @@ module Weneedfeed
33
45
  # @return [Weneedfeed::Page]
34
46
  def call
35
47
  ::Weneedfeed::Page.new(
48
+ description: @description,
36
49
  node: parsed_body,
37
50
  item_description_selector: @item_description_selector,
38
51
  item_selector: @item_selector,
@@ -48,12 +61,12 @@ module Weneedfeed
48
61
 
49
62
  # @return [Nokogiri::Node]
50
63
  def parsed_body
51
- ::Nokogiri::HTML.parse(response.body)
64
+ ::Nokogiri::XML.parse(response.body)
52
65
  end
53
66
 
54
67
  # @return [Faraday::Response]
55
68
  def response
56
- ::Faraday.get(@url)
69
+ self.class.faraday_connection.get(@url)
57
70
  end
58
71
  end
59
72
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Weneedfeed
4
- VERSION = '0.6.0'
4
+ VERSION = '0.8.0'
5
5
  end
@@ -4,9 +4,9 @@
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}#{top_page_path}" %></link>
7
+ <link><%= "#{@page.url}" %></link>
8
8
  <atom:link href="<%= "#{request.base_url}#{request.path}" %>" rel="self"/>
9
- <description><![CDATA[Recent content on <%= @page.title %>]]></description>
9
+ <description><![CDATA[<%= @page.description %>]]></description>
10
10
  <lastBuildDate><%= Time.now.rfc822 %></lastBuildDate>
11
11
  <% items.each do |item| %>
12
12
  <item>
@@ -25,9 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ['lib']
27
27
 
28
+ spec.add_runtime_dependency 'activesupport'
29
+ spec.add_runtime_dependency 'builder'
28
30
  spec.add_runtime_dependency 'faraday'
29
- spec.add_runtime_dependency 'hanami-router', '2.0.0.alpha3'
30
- spec.add_runtime_dependency 'hibana'
31
+ spec.add_runtime_dependency 'faraday_middleware'
32
+ spec.add_runtime_dependency 'hibana', '>= 0.2'
31
33
  spec.add_runtime_dependency 'nokogiri'
32
34
  spec.add_runtime_dependency 'rack-capture', '>= 0.4.0'
33
35
  spec.add_runtime_dependency 'thor'
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weneedfeed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-15 00:00:00.000000000 Z
11
+ date: 2020-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,21 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: hanami-router
28
+ name: builder
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0.alpha3
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.0.alpha3
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: hibana
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday_middleware
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: hibana
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0.2'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: nokogiri
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +151,7 @@ files:
123
151
  - lib/weneedfeed/controllers/base.rb
124
152
  - lib/weneedfeed/controllers/show_feed.rb
125
153
  - lib/weneedfeed/controllers/show_top_page.rb
154
+ - lib/weneedfeed/faraday_response_middleware.rb
126
155
  - lib/weneedfeed/helpers.rb
127
156
  - lib/weneedfeed/helpers/parameters.rb
128
157
  - lib/weneedfeed/item.rb