feat: add JSON output for query() (#262)

This makes it be enable to do this.

```bash
$ nvim --headless +'=require("frecency").query { limit = 3, json = true }' +q | jq .
[
  "/path/to/most/opened/file",
  "/path/to/second/file",
  "/path/to/third/file"
]
```

* chore: add `debug_timer` option to log in timer

* fix: wait synchronously for DB not in coroutine

* feat: add `json` option to dump JSON for DB
This commit is contained in:
JINNOUCHI Yasushi 2024-09-08 16:55:44 +09:00 committed by GitHub
parent dbca328c59
commit 3c5b61cda1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 23 additions and 4 deletions

View File

@ -9,6 +9,7 @@ local os_util = require "frecency.os_util"
---@field db_safe_mode? boolean default: true
---@field db_validate_threshold? integer default: 10
---@field debug? boolean default: false
---@field debug_timer? boolean default: false
---@field default_workspace? string default: nil
---@field disable_devicons? boolean default: false
---@field filter_delimiter? string default: ":"
@ -39,6 +40,7 @@ local Config = {}
---@field db_safe_mode boolean default: true
---@field db_validate_threshold integer default: 10
---@field debug boolean default: false
---@field debug_timer boolean default: false
---@field default_workspace? string default: nil
---@field disable_devicons boolean default: false
---@field filter_delimiter string default: ":"
@ -66,6 +68,7 @@ Config.new = function()
db_safe_mode = true,
db_validate_threshold = true,
debug = true,
debug_timer = true,
default_workspace = true,
disable_devicons = true,
filter_delimiter = true,
@ -106,6 +109,7 @@ Config.default_values = {
db_safe_mode = true,
db_validate_threshold = 10,
debug = false,
debug_timer = false,
default_workspace = nil,
disable_devicons = false,
filter_delimiter = ":",

View File

@ -1,4 +1,6 @@
local log = require "frecency.log"
local timer = require "frecency.timer"
local wait = require "frecency.wait"
local lazy_require = require "frecency.lazy_require"
local async = lazy_require "plenary.async" --[[@as FrecencyPlenaryAsync]]
@ -24,7 +26,15 @@ end
---@param key string
function Table:__index(key)
if key == "records" and not rawget(self, "is_ready") then
Table.wait_ready(self)
local is_async = not not coroutine.running()
if is_async then
Table.wait_ready(self)
else
log.debug "need wait() for wait_ready()"
wait(function()
Table.wait_ready(self)
end)
end
end
return vim.F.if_nil(rawget(self, key), Table[key])
end

View File

@ -200,6 +200,7 @@ end
---@class FrecencyQueryOpts
---@field direction? "asc"|"desc" default: "desc"
---@field json? boolean default: false
---@field limit? integer default: 100
---@field order? FrecencyQueryOrder default: "score"
---@field record? boolean default: false
@ -213,10 +214,11 @@ end
---@param opts? FrecencyQueryOpts
---@param epoch? integer
---@return FrecencyQueryEntry[]|string[]
---@return string|FrecencyQueryEntry[]|string[]
function Frecency:query(opts, epoch)
opts = vim.tbl_extend("force", {
direction = "desc",
json = false,
limit = 100,
order = "score",
record = false,
@ -235,9 +237,9 @@ function Frecency:query(opts, epoch)
return entry.path
end, entries)
if #results > opts.limit then
return vim.list_slice(results, 1, opts.limit)
results = vim.list_slice(results, 1, opts.limit)
end
return results
return opts.json and vim.json.encode(results) or results
end
---@private

View File

@ -23,6 +23,9 @@ function M.track(event)
return stats._stats.times[key] and make_key((num or 1) + 1) or key
end
stats.track(make_key())
if config.debug_timer then
log.debug(event)
end
end
end