itest5ch 2.0.2 → 3.0.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: 9ffc402943f4d3ed1305811dc61ab4244ee3161ad0d3869595a7cc948d2770ee
4
- data.tar.gz: 8c6e4a00a213cb850adab8a005b785b38fe3aa1d28d3396028a39b617ba69ec4
3
+ metadata.gz: 0641134f599867c1e3f69db58c99a3b46e9e457ff38c881aba4a87a5cc7f4364
4
+ data.tar.gz: ab3929820f060926521fca695f458e8bc55ad11c569fa52af63df45f3221b6a9
5
5
  SHA512:
6
- metadata.gz: f58d7cfc2a58e5308db214a174d494294ad1c19e00176784a4d0978761d12dedcd4d3dc143da455a49052115ea51936415da8f648e7f71d16c6087814473cdb2
7
- data.tar.gz: 8da16e1403957284e3f84cff3e1b31b2dca28aa5a48a2b214b75ca1e2725b612145f211139ff46fd95b9c8c40def4059400d76913e8ca2d86c411e116ca568d1
6
+ metadata.gz: eb1c92f3c8ace5743bab3b3b4fc7759e1345fdb3cc00d106c2b9d319c92cdac42c77b5fdeecf8ddd7d3d595b10712278b0fa29a1c0834285f4033cf101bdd318
7
+ data.tar.gz: 6f1e7e0269af8773fb6667449198943321530807aa35c9fa475e4621029d120c60e71bb37d6bdb1367146e3963210f48e1c574a2de972d0e95b8cbbf7db50a48
@@ -0,0 +1,10 @@
1
+ # c.f. https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
2
+ version: 2
3
+
4
+ updates:
5
+ - package-ecosystem: github-actions
6
+ directory: /
7
+ schedule:
8
+ interval: weekly
9
+ assignees:
10
+ - sue445
@@ -0,0 +1,59 @@
1
+ # Simple workflow for deploying static content to GitHub Pages
2
+ name: Deploy static content to Pages
3
+
4
+ on:
5
+ # Runs on pushes targeting the default branch
6
+ push:
7
+ branches:
8
+ - master
9
+
10
+ # Allows you to run this workflow manually from the Actions tab
11
+ workflow_dispatch:
12
+
13
+ # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
14
+ permissions:
15
+ contents: read
16
+ pages: write
17
+ id-token: write
18
+
19
+ # Allow one concurrent deployment
20
+ concurrency:
21
+ group: "pages"
22
+ cancel-in-progress: true
23
+
24
+ jobs:
25
+ # Single deploy job since we're just deploying
26
+ deploy:
27
+ environment:
28
+ name: github-pages
29
+ url: ${{ steps.deployment.outputs.page_url }}
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - name: Checkout
33
+ uses: actions/checkout@v4
34
+
35
+ - uses: ruby/setup-ruby@v1
36
+ with:
37
+ ruby-version: ruby
38
+ bundler-cache: true
39
+
40
+ - run: bundle exec yard
41
+
42
+ - name: Setup Pages
43
+ uses: actions/configure-pages@v5
44
+ - name: Upload artifact
45
+ uses: actions/upload-pages-artifact@v3
46
+ with:
47
+ # Upload entire repository
48
+ path: './doc'
49
+ - name: Deploy to GitHub Pages
50
+ id: deployment
51
+ uses: actions/deploy-pages@main
52
+
53
+ - name: Slack Notification (not success)
54
+ uses: act10ns/slack@v2
55
+ if: "! success()"
56
+ continue-on-error: true
57
+ with:
58
+ status: ${{ job.status }}
59
+ webhook-url: ${{ secrets.SLACK_WEBHOOK }}
@@ -0,0 +1,86 @@
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ types:
9
+ - opened
10
+ - synchronize
11
+ - reopened
12
+ schedule:
13
+ - cron: "0 10 * * 5" # JST 19:00 (Fri)
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ubuntu-latest
18
+
19
+ strategy:
20
+ fail-fast: false
21
+
22
+ matrix:
23
+ ruby:
24
+ - "2.7"
25
+ - "3.0"
26
+ - "3.1"
27
+ - "3.2"
28
+ - "3.3"
29
+ - "3.4"
30
+
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+
34
+ - uses: ruby/setup-ruby@v1
35
+ with:
36
+ ruby-version: ${{ matrix.ruby }}
37
+ bundler-cache: true
38
+
39
+ - name: bundle update
40
+ run: |
41
+ set -xe
42
+ bundle config path vendor/bundle
43
+ bundle update --jobs $(nproc) --retry 3
44
+
45
+ - name: Setup Code Climate Test Reporter
46
+ uses: aktions/codeclimate-test-reporter@v1
47
+ with:
48
+ codeclimate-test-reporter-id: ${{ secrets.CC_TEST_REPORTER_ID }}
49
+ command: before-build
50
+ continue-on-error: true
51
+
52
+ - run: bundle exec rspec
53
+
54
+ - name: Teardown Code Climate Test Reporter
55
+ uses: aktions/codeclimate-test-reporter@v1
56
+ with:
57
+ codeclimate-test-reporter-id: ${{ secrets.CC_TEST_REPORTER_ID }}
58
+ command: after-build
59
+ if: always()
60
+ continue-on-error: true
61
+
62
+ - run: bundle exec rubocop
63
+
64
+ - name: Slack Notification (not success)
65
+ uses: act10ns/slack@v2
66
+ if: "! success()"
67
+ continue-on-error: true
68
+ with:
69
+ status: ${{ job.status }}
70
+ webhook-url: ${{ secrets.SLACK_WEBHOOK }}
71
+ matrix: ${{ toJson(matrix) }}
72
+
73
+ notify:
74
+ needs:
75
+ - test
76
+
77
+ runs-on: ubuntu-latest
78
+
79
+ steps:
80
+ - name: Slack Notification (success)
81
+ uses: act10ns/slack@v2
82
+ if: always()
83
+ continue-on-error: true
84
+ with:
85
+ status: ${{ job.status }}
86
+ webhook-url: ${{ secrets.SLACK_WEBHOOK }}
data/.rubocop.yml CHANGED
@@ -4,20 +4,26 @@ inherit_gem:
4
4
  - "config/rspec.yml"
5
5
 
6
6
  AllCops:
7
- TargetRubyVersion: 2.5
7
+ TargetRubyVersion: 2.7
8
8
  # uncomment if use rails cops
9
9
  # TargetRailsVersion: 5.1
10
10
  NewCops: enable
11
11
  SuggestExtensions: false
12
12
 
13
- require:
13
+ plugins:
14
14
  - rubocop-performance
15
15
  - rubocop-rspec
16
16
 
17
+ Gemspec/DevelopmentDependencies:
18
+ EnforcedStyle: gemspec
19
+
20
+ Layout/ClassStructure:
21
+ Enabled: false
22
+
17
23
  Layout/HashAlignment:
18
24
  EnforcedColonStyle: table
19
25
 
20
- RSpec/FilePath:
26
+ RSpec/SpecFilePathFormat:
21
27
  Exclude:
22
28
  - spec/integration_spec.rb
23
29
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  ## master
2
- [full changelog](http://github.com/sue445/itest5ch/compare/v2.0.2...master)
2
+ [full changelog](http://github.com/sue445/itest5ch/compare/v3.0.0...master)
3
+
4
+ ## v3.0.0
5
+ [full changelog](http://github.com/sue445/itest5ch/compare/v2.0.2...v3.0.0)
6
+
7
+ ### BREAKING CHANGES :bomb:
8
+ * Migrate from hpricot to nokogiri
9
+ * https://github.com/sue445/itest5ch/pull/109
10
+ * Requires Ruby 2.7+
11
+ * https://github.com/sue445/itest5ch/pull/110
3
12
 
4
13
  ## v2.0.2
5
14
  [full changelog](http://github.com/sue445/itest5ch/compare/v2.0.1...v2.0.2)
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  5ch (a.k.a. 2ch) reader via http://itest.5ch.net/
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/itest5ch.svg)](https://badge.fury.io/rb/itest5ch)
6
- [![CircleCI](https://circleci.com/gh/sue445/itest5ch/tree/master.svg?style=svg)](https://circleci.com/gh/sue445/itest5ch/tree/master)
6
+ [![test](https://github.com/sue445/itest5ch/actions/workflows/test.yml/badge.svg)](https://github.com/sue445/itest5ch/actions/workflows/test.yml)
7
7
  [![Coverage Status](https://coveralls.io/repos/github/sue445/itest5ch/badge.svg)](https://coveralls.io/github/sue445/itest5ch)
8
8
  [![Maintainability](https://api.codeclimate.com/v1/badges/14a81b3f7da11e475242/maintainability)](https://codeclimate.com/github/sue445/itest5ch/maintainability)
9
9
 
data/itest5ch.gemspec CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = spec.homepage
18
18
  spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
19
+ spec.metadata["documentation_uri"] = "https://sue445.github.io/itest5ch/"
19
20
  spec.metadata["rubygems_mfa_required"] = "true"
20
21
 
21
22
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -25,10 +26,10 @@ Gem::Specification.new do |spec|
25
26
  spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
26
27
  spec.require_paths = ["lib"]
27
28
 
28
- spec.required_ruby_version = ">= 2.5.0"
29
+ spec.required_ruby_version = ">= 2.7.0"
29
30
 
30
- spec.add_dependency "hpricot"
31
31
  spec.add_dependency "htmlentities"
32
+ spec.add_dependency "nokogiri"
32
33
 
33
34
  spec.add_development_dependency "activesupport"
34
35
  spec.add_development_dependency "bundler", ">= 1.16"
@@ -38,11 +39,12 @@ Gem::Specification.new do |spec|
38
39
  spec.add_development_dependency "rspec", "~> 3.0"
39
40
  spec.add_development_dependency "rspec-its"
40
41
  spec.add_development_dependency "rspec-parameterized"
41
- spec.add_development_dependency "rubocop", "1.8.0"
42
+ spec.add_development_dependency "rubocop", "1.74.0"
42
43
  spec.add_development_dependency "rubocop_auto_corrector"
43
- spec.add_development_dependency "rubocop-performance", "1.9.2"
44
- spec.add_development_dependency "rubocop-rspec", "2.1.0"
44
+ spec.add_development_dependency "rubocop-performance", "1.24.0"
45
+ spec.add_development_dependency "rubocop-rspec", "3.5.0"
45
46
  spec.add_development_dependency "simplecov", "< 0.18.0"
47
+ spec.add_development_dependency "term-ansicolor", "!= 1.11.1" # ref. https://github.com/flori/term-ansicolor/issues/41
46
48
  spec.add_development_dependency "unparser", ">= 0.4.5"
47
49
  spec.add_development_dependency "webmock"
48
50
  spec.add_development_dependency "yard"
@@ -8,11 +8,15 @@ module Itest5ch
8
8
  #
9
9
  # @return [Hash<String, Array<Itest5ch::Board>>] key: category name, value: boards
10
10
  def all
11
- doc = Hpricot(get_html(BOARDS_URL))
11
+ doc = Nokogiri::HTML.parse(get_html(BOARDS_URL))
12
12
 
13
13
  doc.search("//div[@id='bbsmenu']//ul[@class='pure-menu-list']").
14
14
  reject {|ul| ul["id"] == "history" }.each_with_object({}) do |ul, categories|
15
- category_name = ul.at("/li[@class='pure-menu-item pure-menu-selected']").inner_text.strip
15
+ category_node = ul.at_xpath("li[contains(@class, 'pure-menu-item') and contains(@class, 'pure-menu-selected')]")
16
+ next unless category_node
17
+
18
+ category_name = category_node.text.strip
19
+
16
20
  categories[category_name] = get_boards(ul)
17
21
  end
18
22
  end
@@ -20,17 +24,22 @@ module Itest5ch
20
24
  private
21
25
 
22
26
  def get_boards(ul)
23
- ul.search("/li").select {|li| board_element?(li) }.each_with_object([]) do |li, boards|
24
- url = URI.join(BOARDS_URL, li.at("/a")["href"]).to_s
25
- name = li.inner_text.strip
27
+ ul.xpath("li").select {|li| board_element?(li) }.each_with_object([]) do |li, boards|
28
+ link = li.at_xpath("a")
29
+ next unless link
30
+
31
+ url = URI.join(BOARDS_URL, link["href"]).to_s
32
+ name = li.text.strip
26
33
 
27
34
  boards << Board.new(url, name: name)
28
35
  end
29
36
  end
30
37
 
31
38
  def board_element?(li)
32
- return false unless li["class"].include?("pure-menu-item")
33
- return false if li["class"].include?("pure-menu-selected")
39
+ klass = li["class"].to_s
40
+
41
+ return false unless klass.include?("pure-menu-item")
42
+ return false if klass.include?("pure-menu-selected")
34
43
 
35
44
  true
36
45
  end
@@ -1,3 +1,3 @@
1
1
  module Itest5ch
2
- VERSION = "2.0.2".freeze
2
+ VERSION = "3.0.0".freeze
3
3
  end
data/lib/itest5ch.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "itest5ch/version"
2
- require "hpricot"
2
+ require "nokogiri"
3
3
  require "htmlentities"
4
4
 
5
5
  module Itest5ch
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itest5ch
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sue445
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2021-11-20 00:00:00.000000000 Z
10
+ date: 2025-03-24 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: hpricot
13
+ name: htmlentities
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
@@ -25,7 +24,7 @@ dependencies:
25
24
  - !ruby/object:Gem::Version
26
25
  version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
- name: htmlentities
27
+ name: nokogiri
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
@@ -156,14 +155,14 @@ dependencies:
156
155
  requirements:
157
156
  - - '='
158
157
  - !ruby/object:Gem::Version
159
- version: 1.8.0
158
+ version: 1.74.0
160
159
  type: :development
161
160
  prerelease: false
162
161
  version_requirements: !ruby/object:Gem::Requirement
163
162
  requirements:
164
163
  - - '='
165
164
  - !ruby/object:Gem::Version
166
- version: 1.8.0
165
+ version: 1.74.0
167
166
  - !ruby/object:Gem::Dependency
168
167
  name: rubocop_auto_corrector
169
168
  requirement: !ruby/object:Gem::Requirement
@@ -184,28 +183,28 @@ dependencies:
184
183
  requirements:
185
184
  - - '='
186
185
  - !ruby/object:Gem::Version
187
- version: 1.9.2
186
+ version: 1.24.0
188
187
  type: :development
189
188
  prerelease: false
190
189
  version_requirements: !ruby/object:Gem::Requirement
191
190
  requirements:
192
191
  - - '='
193
192
  - !ruby/object:Gem::Version
194
- version: 1.9.2
193
+ version: 1.24.0
195
194
  - !ruby/object:Gem::Dependency
196
195
  name: rubocop-rspec
197
196
  requirement: !ruby/object:Gem::Requirement
198
197
  requirements:
199
198
  - - '='
200
199
  - !ruby/object:Gem::Version
201
- version: 2.1.0
200
+ version: 3.5.0
202
201
  type: :development
203
202
  prerelease: false
204
203
  version_requirements: !ruby/object:Gem::Requirement
205
204
  requirements:
206
205
  - - '='
207
206
  - !ruby/object:Gem::Version
208
- version: 2.1.0
207
+ version: 3.5.0
209
208
  - !ruby/object:Gem::Dependency
210
209
  name: simplecov
211
210
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +219,20 @@ dependencies:
220
219
  - - "<"
221
220
  - !ruby/object:Gem::Version
222
221
  version: 0.18.0
222
+ - !ruby/object:Gem::Dependency
223
+ name: term-ansicolor
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "!="
227
+ - !ruby/object:Gem::Version
228
+ version: 1.11.1
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "!="
234
+ - !ruby/object:Gem::Version
235
+ version: 1.11.1
223
236
  - !ruby/object:Gem::Dependency
224
237
  name: unparser
225
238
  requirement: !ruby/object:Gem::Requirement
@@ -269,8 +282,10 @@ executables: []
269
282
  extensions: []
270
283
  extra_rdoc_files: []
271
284
  files:
272
- - ".circleci/config.yml"
273
285
  - ".coveralls.yml"
286
+ - ".github/dependabot.yml"
287
+ - ".github/workflows/pages.yml"
288
+ - ".github/workflows/test.yml"
274
289
  - ".gitignore"
275
290
  - ".rspec"
276
291
  - ".rubocop.yml"
@@ -299,8 +314,8 @@ metadata:
299
314
  homepage_uri: https://github.com/sue445/itest5ch
300
315
  source_code_uri: https://github.com/sue445/itest5ch
301
316
  changelog_uri: https://github.com/sue445/itest5ch/blob/master/CHANGELOG.md
317
+ documentation_uri: https://sue445.github.io/itest5ch/
302
318
  rubygems_mfa_required: 'true'
303
- post_install_message:
304
319
  rdoc_options: []
305
320
  require_paths:
306
321
  - lib
@@ -308,15 +323,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
308
323
  requirements:
309
324
  - - ">="
310
325
  - !ruby/object:Gem::Version
311
- version: 2.5.0
326
+ version: 2.7.0
312
327
  required_rubygems_version: !ruby/object:Gem::Requirement
313
328
  requirements:
314
329
  - - ">="
315
330
  - !ruby/object:Gem::Version
316
331
  version: '0'
317
332
  requirements: []
318
- rubygems_version: 3.2.22
319
- signing_key:
333
+ rubygems_version: 3.6.2
320
334
  specification_version: 4
321
335
  summary: 5ch (a.k.a. 2ch) reader via itest.5ch.net
322
336
  test_files: []
data/.circleci/config.yml DELETED
@@ -1,90 +0,0 @@
1
- # Ruby CircleCI 2.0 configuration file
2
- #
3
- # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
- #
5
- version: 2.1
6
-
7
- orbs:
8
- codeclimate: sue445/codeclimate@volatile
9
- slack: circleci/slack@3
10
-
11
- executors:
12
- ruby:
13
- parameters:
14
- tag:
15
- type: string
16
- default: "latest"
17
- docker:
18
- - image: ruby:<< parameters.tag >>
19
- environment:
20
- # c.f. https://github.com/ffaker/ffaker/issues/277#issuecomment-263519146
21
- LANG: en_US.UTF-8
22
- LANGUAGE: en_US.UTF-8
23
- LC_ALL: C.UTF-8
24
-
25
- BUNDLE_PATH: vendor/bundle
26
- BUNDLE_JOBS: 4
27
- CC_TEST_REPORTER_ID: d91e7c9665019f1574eb4c5a3de1547c80bc3062e3c297282f106501a3c5c694
28
- working_directory: ~/app
29
-
30
- commands:
31
- bundle_install:
32
- steps:
33
- - run: bundle config --local path vendor/bundle
34
- - run: bundle install --jobs=4 --retry=3
35
-
36
- jobs:
37
- rspec:
38
- parameters:
39
- version:
40
- type: string
41
- executor:
42
- name: ruby
43
- tag: << parameters.version >>
44
- steps:
45
- - checkout
46
- - run: ruby --version
47
- - run: bundle --version
48
- - run: gem --version
49
- - bundle_install
50
- - codeclimate/with-cc-test-reporter:
51
- after_build_args: "--coverage-input-type simplecov"
52
- steps:
53
- - run: bundle exec rspec
54
- - slack/notify-on-failure
55
-
56
- rubocop:
57
- executor:
58
- name: ruby
59
-
60
- steps:
61
- - checkout
62
- - bundle_install
63
- - run: bundle exec rubocop
64
- - slack/notify-on-failure
65
-
66
- build_jobs: &build_jobs
67
- - rspec:
68
- matrix:
69
- parameters:
70
- version:
71
- - "2.5"
72
- - "2.6"
73
- - "2.7"
74
- - "3.0"
75
- - rubocop
76
-
77
- workflows:
78
- version: 2
79
-
80
- build:
81
- jobs: *build_jobs
82
-
83
- weekly_build:
84
- triggers:
85
- - schedule:
86
- cron: "00 10 * * 5" # JST 19:00 (Fri)
87
- filters:
88
- branches:
89
- only: master
90
- jobs: *build_jobs