Cache reports by hledger version

This commit is contained in:
2026-09-27 16:08:48 +02:00
parent 3dea524dd9
commit 4749020bc3
3 changed files with 30 additions and 4 deletions
@@ -28,7 +28,8 @@ module ::Hledger
end
first_post = @topic.first_post
cache_key = cache_key_for(first_post, report_type, begin_date, end_date)
runner = Hledger::Runner.new
cache_key = cache_key_for(runner, first_post, report_type, begin_date, end_date)
if (cached = Discourse.cache.read(cache_key))
return render(json: cached)
@@ -41,7 +42,7 @@ module ::Hledger
begin_date: begin_date,
end_date: end_date,
},
runner: Hledger::Runner.new,
runner: runner,
) do
on_success do |report:|
Discourse.cache.write(cache_key, report, expires_in: CACHE_TTL)
@@ -103,7 +104,7 @@ module ::Hledger
:invalid
end
def cache_key_for(first_post, report_type, begin_date, end_date)
def cache_key_for(runner, first_post, report_type, begin_date, end_date)
[
"hledger",
@topic.id,
@@ -112,6 +113,7 @@ module ::Hledger
begin_date,
end_date,
SiteSetting.hledger_path,
runner.version,
].join(":")
end
+15 -1
View File
@@ -41,7 +41,7 @@ module Hledger
def version
return @version if defined?(@version)
@version = detect_version
@version = detect_version_cached
end
def execute(argv, stdin_data: nil)
@@ -183,6 +183,20 @@ module Hledger
result.stdout[/\d+\.\d+(?:\.\d+)?/]
end
# The version is part of the report cache key, so remember it to avoid a
# `--version` subprocess on every request.
def detect_version_cached
return detect_version if @path.blank?
key = "hledger:version:#{@path}"
cached = Discourse.cache.read(key)
return cached if cached
detected = detect_version
Discourse.cache.write(key, detected, expires_in: 10.minutes) if detected
detected
end
def failure_result
Result.new(
success: false,
+10
View File
@@ -129,6 +129,16 @@ RSpec.describe Hledger::ReportsController do
expect(response.status).to eq(422)
end
it "includes the hledger version in the cache key" do
get_report("accounts")
expect(response.parsed_body.dig("meta", "hledger_version")).to eq("1.52.1")
allow(Hledger::Runner).to receive(:new).and_return(StubHledgerRunner.new(version: "1.53.0"))
get_report("accounts")
expect(response.parsed_body.dig("meta", "hledger_version")).to eq("1.53.0")
end
it "rejects journals with include directives" do
post.update!(raw: "```hledger\ninclude /etc/passwd\n```")