weneedfeed 0.6.0 → 0.8.0

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: 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