Skip to content

Commit

Permalink
🚑: Refactor UserParser to handle "(user deleted)" case more explicitly
Browse files Browse the repository at this point in the history
- Added a private helper method `deleted_user_string?` to separate the logic for parsing the specific string `"(user deleted)"`.
- Ensured that parsing helper methods (e.g., `parse_deleted_user`, `parse_anonymous_user`) are private.
- Improved error handling in `parse_regular_user` by returning `nil` if `user_anchor` is not present.
  • Loading branch information
r74tech committed Oct 7, 2024
1 parent 7f95c3c commit f38c254
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 9 deletions.
14 changes: 14 additions & 0 deletions wikidotrb/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed
- Remove debug `puts` statement from `PageCollection` instantiation.

## [3.0.7.pre.6] - 2024-10-08

### Changed
- Refactored `UserParser.parse` to better handle the string `"(user deleted)"` as input.

### Added
- Private helper method `deleted_user_string?` to clearly separate the logic for parsing `"(user deleted)"`.

### Improved
- Made parsing helper methods (`parse_deleted_user`, `parse_anonymous_user`, `parse_guest_user`, `parse_wikidot_user`, `parse_regular_user`) private to encapsulate their functionality.

### Fixed
- Added `nil` check for `user_anchor` in `parse_regular_user` to prevent errors when user information is missing.
23 changes: 16 additions & 7 deletions wikidotrb/lib/wikidotrb/util/parser/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,34 @@ class UserParser
def self.parse(client, elem)
if elem.nil?
return nil
elsif deleted_user_string?(elem)
# Handle "(user deleted)" case
return Wikidotrb::Module::DeletedUser.new(client: client)
elsif !elem.is_a?(Nokogiri::XML::Element)
# 文字列であることを仮定し、Nokogiriで変換する
# Assume it is a string and parse it using Nokogiri
parsed_doc = Nokogiri::HTML.fragment(elem.to_s)
elem = parsed_doc.children.first
end

if elem["class"]&.include?("deleted")
# "deleted"クラスがある場合はDeletedUser
parse_deleted_user(client, elem)

elsif elem["class"]&.include?("anonymous")
# "anonymous"クラスがある場合はAnonymousUser
parse_anonymous_user(client, elem)

elsif gravatar_avatar?(elem)
# "gravatar.com"を含むsrc属性のimg要素はGuestUser
# ref: https://www.wikidot.com/more:explore-features#toc13
parse_guest_user(client, elem)

elsif elem.text.strip == "Wikidot"
# テキストが"Wikidot"の場合はWikidotUser
parse_wikidot_user(client)

else
# それ以外はUser
parse_regular_user(client, elem)
end
end

private

def self.parse_deleted_user(client, elem)
id = elem["data-id"].to_i
Wikidotrb::Module::DeletedUser.new(client: client, id: id)
Expand Down Expand Up @@ -73,6 +72,10 @@ def self.parse_wikidot_user(client)

def self.parse_regular_user(client, elem)
user_anchor = elem.css("a").last

# user_anchorがnilの場合はnilを返す
return nil if user_anchor.nil?

user_name = user_anchor.text.strip
user_unix = user_anchor["href"].to_s.gsub("http://www.wikidot.com/user:info/", "")
user_id = user_anchor["onclick"].to_s.match(/WIKIDOT.page.listeners.userInfo\((\d+)\)/)[1].to_i
Expand All @@ -90,6 +93,12 @@ def self.gravatar_avatar?(elem)
avatar_elem = elem.at_css("img")
avatar_elem && avatar_elem["src"].include?("gravatar.com")
end

# Check if the input is specifically the string "(user deleted)"
def self.deleted_user_string?(elem)
elem.is_a?(String) && elem.strip == "(user deleted)"
end

end
end
end
Expand Down
2 changes: 1 addition & 1 deletion wikidotrb/lib/wikidotrb/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module Wikidotrb
VERSION = "3.0.7.pre.5"
VERSION = "3.0.7.pre.6"
end
9 changes: 9 additions & 0 deletions wikidotrb/spec/util/parser/user_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@
end
end

context "(user deleted)の場合" do
let(:html_string) { "(user deleted)" }

it "DeletedUserオブジェクトを返すこと" do
user = described_class.parse(client, html_string)
expect(user).to be_a_kind_of(Wikidotrb::Module::DeletedUser)
end
end

context "要素がNokogiri::XML::Elementではない場合" do
let(:html_string) { "Just a string, not an element" }

Expand Down
2 changes: 1 addition & 1 deletion wikidotrb/wikidotrb.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ require_relative "lib/wikidotrb/version"

Gem::Specification.new do |spec|
spec.name = "wikidotrb"
spec.version = "3.0.7.pre.5"
spec.version = "3.0.7.pre.6"
spec.authors = ["r74tech"]
spec.email = ["[email protected]"]

Expand Down

0 comments on commit f38c254

Please sign in to comment.