Skip to content

Commit

Permalink
Update and refactor Enhance job to fetch socials from GitHub (#479)
Browse files Browse the repository at this point in the history
* Update Enhance job to update socials from GitHub

* Update job to not search for profiles
  • Loading branch information
marcoroth authored Dec 2, 2024
1 parent c48a91d commit fb51af9
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 815 deletions.
4 changes: 4 additions & 0 deletions app/clients/github/user_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ def profile(username)
get("/users/#{username}")
end

def social_accounts(username)
get("/users/#{username}/social_accounts")
end

def search(q, per_page: 10, page: 1)
get("/search/users", query: {q: q, per_page: per_page, page: page})
end
Expand Down
58 changes: 34 additions & 24 deletions app/jobs/speaker/enhance_profile_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,50 @@ class Speaker::EnhanceProfileJob < ApplicationJob
limits_concurrency to: 1, key: "github_api"

def perform(speaker:, sleep: 0)
matching_profile = speaker.github.present? ? user_details(speaker.github) : search_github_profile(name: speaker.name)

if matching_profile.present?
speaker.update(
twitter: speaker.twitter.presence || matching_profile.twitter_username || "",
github: matching_profile.login,
bio: speaker.bio.presence || matching_profile.bio || "",
website: speaker.website.presence || matching_profile.blog || ""
)
return if speaker.github.blank?

profile = user_details(speaker.github)
socials = user_social_accounts(speaker.github)

twitter, mastodon, bsky, linkedin = nil, nil, nil, nil

socials.each do |social|
case social.provider
when "twitter"
twitter = social.url
when "mastodon"
mastodon = social.url
when "bluesky"
bsky = social.url
when "linkedin"
linkedin = social.url
end
end

speaker.update(
twitter: speaker.twitter.presence || twitter || "",
mastodon: speaker.mastodon.presence || mastodon || "",
bsky: speaker.bsky.presence || bsky || "",
linkedin: speaker.linkedin.presence || linkedin || "",
bio: speaker.bio.presence || profile.bio || "",
website: speaker.website.presence || profile.blog || ""
)

speaker.broadcast_about
sleep(sleep)
end

private

def search_github_profile(name:)
list_of_potential_profiles = search_github_users(q: name).parsed_body

bag_of_names = Set.new(name.downcase.split)
list_of_potential_profiles.items&.find do |profile|
request = user_details(profile.login)

github_profile = request.parsed_body

break github_profile if bag_of_names.subset?(Set.new(github_profile.name&.downcase&.split(/[ -]/)))
end
def user_details(username)
client.profile(username)
end

def user_details(username)
GitHub::UserClient.new.profile(username)
def user_social_accounts(username)
client.social_accounts(username).parsed_body
end

def search_github_users(q:, per_page: 5, page: 1)
GitHub::UserClient.new.search(q, per_page: per_page, page: page)
def client
@client ||= GitHub::UserClient.new
end
end
40 changes: 16 additions & 24 deletions test/jobs/speaker/enhance_profile_job_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,26 @@
class Speaker::EnhanceProfileJobTest < ActiveJob::TestCase
test "find aaron" do
VCR.use_cassette("speaker/enhance_profile_job_test") do
@speaker = Speaker.create!(name: "Aaron Patterson")
Speaker::EnhanceProfileJob.new.perform(speaker: @speaker)
assert_equal "tenderlove", @speaker.reload.github
assert @speaker.bio.present?
end
end
speaker = Speaker.create!(name: "Aaron Patterson", github: "tenderlove")

test "a user not found on GitHub" do
VCR.use_cassette("speaker/enhance_profile_job_test_user_not_found") do
@speaker = Speaker.create!(name: "Nathan Bibler")
Speaker::EnhanceProfileJob.new.perform(speaker: @speaker)
assert_equal "", @speaker.reload.github
end
end
Speaker::EnhanceProfileJob.new.perform(speaker: speaker)

speaker.reload

test "search Hampton Catlin" do
VCR.use_cassette("speaker/enhance_profile_job_test_search_hampton_catlin") do
@speaker = Speaker.create!(name: "Hampton Catlin")
Speaker::EnhanceProfileJob.new.perform(speaker: @speaker)
assert_equal "HamptonMakes", @speaker.reload.github
assert_equal "tenderlove", speaker.github
assert_equal "tenderlove", speaker.twitter
assert_equal "tenderlove.dev", speaker.bsky
assert_equal "https://mastodon.social/@tenderlove", speaker.mastodon

assert speaker.bio.present?
end
end

test "search Design a user with no name" do
VCR.use_cassette("speaker/enhance_profile_job_test_search_design") do
@speaker = Speaker.create!(name: "Design")
Speaker::EnhanceProfileJob.new.perform(speaker: @speaker)
assert_equal "Design-and-Code", @speaker.reload.github
end
test "a user with no GitHub handle" do
speaker = Speaker.create!(name: "Nathan Bibler")

Speaker::EnhanceProfileJob.new.perform(speaker: speaker)

assert_equal "", speaker.reload.github
end
end
70 changes: 34 additions & 36 deletions test/vcr_cassettes/speaker/enhance_profile_job_test.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit fb51af9

Please sign in to comment.