Add consistent helper to transform language, editor, and OS names

This commit is contained in:
Zach Latta
2025-10-22 15:36:09 +00:00
parent cb61761644
commit 7e52dfb2ca
5 changed files with 88 additions and 21 deletions

View File

@@ -179,6 +179,12 @@ class Api::Hackatime::V1::HackatimeController < ApplicationController
# Format the data for each category # Format the data for each category
category_durations.map do |name, duration| category_durations.map do |name, duration|
name = name.presence || "unknown" name = name.presence || "unknown"
name = case category
when "editor" then ApplicationController.helpers.display_editor_name(name)
when "operating_system" then ApplicationController.helpers.display_os_name(name)
when "language" then ApplicationController.helpers.display_language_name(name)
else name
end
percent = ((duration / total_duration) * 100).round(2) percent = ((duration / total_duration) * 100).round(2)
hours = duration.to_i / 3600 hours = duration.to_i / 3600
minutes = (duration.to_i % 3600) / 60 minutes = (duration.to_i % 3600) / 60

View File

@@ -56,8 +56,8 @@ class StaticPagesController < ApplicationController
.uniq .uniq
.sort_by { |_, count| -count } .sort_by { |_, count| -count }
@todays_languages = language_counts.map(&:first) @todays_languages = language_counts.map(&:first).map { |language| ApplicationController.helpers.display_language_name(language) }
@todays_editors = editor_counts.map(&:first) @todays_editors = editor_counts.map(&:first).map { |editor| ApplicationController.helpers.display_editor_name(editor) }
@todays_duration = current_user.heartbeats.today.duration_seconds @todays_duration = current_user.heartbeats.today.duration_seconds
if @todays_duration > 1.minute if @todays_duration > 1.minute
@@ -260,7 +260,17 @@ class StaticPagesController < ApplicationController
result[filter] = group_by_time.sort_by { |k, v| v } result[filter] = group_by_time.sort_by { |k, v| v }
.reverse.map(&:first) .reverse.map(&:first)
.compact_blank .compact_blank
.map { |k| %i[operating_system editor].include?(filter) ? k.capitalize : k } .map { |k|
if filter == :editor
ApplicationController.helpers.display_editor_name(k)
elsif filter == :operating_system
ApplicationController.helpers.display_os_name(k)
elsif filter == :language
ApplicationController.helpers.display_language_name(k)
else
k
end
}
.uniq .uniq
if params[filter].present? if params[filter].present?
@@ -294,6 +304,11 @@ class StaticPagesController < ApplicationController
&.first &.first
end end
# Transform top editor, OS, and language names
result["top_editor"] = ApplicationController.helpers.display_editor_name(result["top_editor"]) if result["top_editor"]
result["top_operating_system"] = ApplicationController.helpers.display_os_name(result["top_operating_system"]) if result["top_operating_system"]
result["top_language"] = ApplicationController.helpers.display_language_name(result["top_language"]) if result["top_language"]
# Prepare project durations data # Prepare project durations data
result[:project_durations] = filtered_heartbeats result[:project_durations] = filtered_heartbeats
.group(:project) .group(:project)
@@ -319,7 +334,13 @@ class StaticPagesController < ApplicationController
.sort_by { |_, duration| -duration } .sort_by { |_, duration| -duration }
.first(10) .first(10)
.map { |k, v| .map { |k, v|
label = %i[language category].include?(filter) ? k : k.capitalize label = case filter
when :editor then ApplicationController.helpers.display_editor_name(k)
when :operating_system then ApplicationController.helpers.display_os_name(k)
when :language then ApplicationController.helpers.display_language_name(k)
when :category then k
else k.capitalize
end
[ label, v ] [ label, v ]
} }
.to_h unless result["singular_#{filter}"] .to_h unless result["singular_#{filter}"]

View File

@@ -139,4 +139,46 @@ module ApplicationHelper
"All Time" "All Time"
end end
end end
def display_editor_name(editor)
return "Unknown" if editor.blank?
case editor.downcase
when "vscode" then "VS Code"
when "pycharm" then "PyCharm"
when "intellij" then "IntelliJ IDEA"
when "webstorm" then "WebStorm"
when "phpstorm" then "PhpStorm"
when "datagrip" then "DataGrip"
when "ktexteditor" then "Kate"
when "android studio" then "Android Studio"
when "visual studio" then "Visual Studio"
when "sublime text" then "Sublime Text"
when "iterm2" then "iTerm2"
else editor.capitalize
end
end
def display_os_name(os)
return "Unknown" if os.blank?
case os.downcase
when "darwin" then "macOS"
when "macos" then "macOS"
else os.capitalize
end
end
def display_language_name(language)
return "Unknown" if language.blank?
case language.downcase
when "typescript" then "TypeScript"
when "javascript" then "JavaScript"
when "json" then "JSON"
when "sql" then "SQL"
when "yaml" then "YAML"
else language.capitalize
end
end
end end

View File

@@ -27,7 +27,7 @@
<div class="stat-card"> <div class="stat-card">
<div class="stat-label">TOP LANGUAGE</div> <div class="stat-label">TOP LANGUAGE</div>
<div class="stat-value" data-stat="top_language"> <div class="stat-value" data-stat="top_language">
<%= @top_language || "Unknown" %> <%= display_language_name(@top_language) || "Unknown" %>
<% if @singular_language %> <% if @singular_language %>
<span class="super"><%= FlavorText.obvious.sample %></span> <span class="super"><%= FlavorText.obvious.sample %></span>
<% end %> <% end %>
@@ -37,7 +37,7 @@
<div class="stat-card"> <div class="stat-card">
<div class="stat-label">TOP OS</div> <div class="stat-label">TOP OS</div>
<div class="stat-value" data-stat="top_operating_system"> <div class="stat-value" data-stat="top_operating_system">
<%= @top_operating_system || "Unknown" %> <%= display_os_name(@top_operating_system) || "Unknown" %>
<% if @singular_operating_system %> <% if @singular_operating_system %>
<span class="super"><%= FlavorText.obvious.sample %></span> <span class="super"><%= FlavorText.obvious.sample %></span>
<% end %> <% end %>
@@ -47,7 +47,7 @@
<div class="stat-card"> <div class="stat-card">
<div class="stat-label">TOP EDITOR</div> <div class="stat-label">TOP EDITOR</div>
<div class="stat-value" data-stat="top_editor"> <div class="stat-value" data-stat="top_editor">
<%= @top_editor || "Unknown" %> <%= display_editor_name(@top_editor) || "Unknown" %>
<% if @singular_editor %> <% if @singular_editor %>
<span class="super"><%= FlavorText.obvious.sample %></span> <span class="super"><%= FlavorText.obvious.sample %></span>
<% end %> <% end %>

View File

@@ -60,7 +60,7 @@ class WakatimeService
result = [] result = []
@scope.group(group_by).duration_seconds.each do |key, value| @scope.group(group_by).duration_seconds.each do |key, value|
result << { result << {
name: key.presence || "Other", name: transform_display_name(group_by, key),
total_seconds: value, total_seconds: value,
text: ApplicationController.helpers.short_time_simple(value), text: ApplicationController.helpers.short_time_simple(value),
hours: value / 3600, hours: value / 3600,
@@ -111,20 +111,18 @@ class WakatimeService
{ os: "", editor: "", err: "failed to parse user agent string" } { os: "", editor: "", err: "failed to parse user agent string" }
end end
def categorize_os(os)
case os.downcase
when "win" then "Windows"
when "darwin" then "MacOS"
when os.include?("windows") then "Windows"
else os.capitalize
end
end
def categorize_editor(editor) def transform_display_name(group_by, key)
case editor.downcase value = key.presence || "Other"
when "vscode" then "VSCode" case group_by
when "KTextEditor" then "Kate" when :editor
else editor.capitalize ApplicationController.helpers.display_editor_name(value)
when :operating_system
ApplicationController.helpers.display_os_name(value)
when :language
ApplicationController.helpers.display_language_name(value)
else
value
end end
end end