Cache reports by hledger version
This commit is contained in:
@@ -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
@@ -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,
|
||||
|
||||
@@ -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```")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user