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_safe_mode? boolean default: true
---@field db_validate_threshold? integer default: 10 ---@field db_validate_threshold? integer default: 10
---@field debug? boolean default: false ---@field debug? boolean default: false
---@field debug_timer? boolean default: false
---@field default_workspace? string default: nil ---@field default_workspace? string default: nil
---@field disable_devicons? boolean default: false ---@field disable_devicons? boolean default: false
---@field filter_delimiter? string default: ":" ---@field filter_delimiter? string default: ":"
@ -39,6 +40,7 @@ local Config = {}
---@field db_safe_mode boolean default: true ---@field db_safe_mode boolean default: true
---@field db_validate_threshold integer default: 10 ---@field db_validate_threshold integer default: 10
---@field debug boolean default: false ---@field debug boolean default: false
---@field debug_timer boolean default: false
---@field default_workspace? string default: nil ---@field default_workspace? string default: nil
---@field disable_devicons boolean default: false ---@field disable_devicons boolean default: false
---@field filter_delimiter string default: ":" ---@field filter_delimiter string default: ":"
@ -66,6 +68,7 @@ Config.new = function()
db_safe_mode = true, db_safe_mode = true,
db_validate_threshold = true, db_validate_threshold = true,
debug = true, debug = true,
debug_timer = true,
default_workspace = true, default_workspace = true,
disable_devicons = true, disable_devicons = true,
filter_delimiter = true, filter_delimiter = true,
@ -106,6 +109,7 @@ Config.default_values = {
db_safe_mode = true, db_safe_mode = true,
db_validate_threshold = 10, db_validate_threshold = 10,
debug = false, debug = false,
debug_timer = false,
default_workspace = nil, default_workspace = nil,
disable_devicons = false, disable_devicons = false,
filter_delimiter = ":", filter_delimiter = ":",

View File

@ -1,4 +1,6 @@
local log = require "frecency.log"
local timer = require "frecency.timer" local timer = require "frecency.timer"
local wait = require "frecency.wait"
local lazy_require = require "frecency.lazy_require" local lazy_require = require "frecency.lazy_require"
local async = lazy_require "plenary.async" --[[@as FrecencyPlenaryAsync]] local async = lazy_require "plenary.async" --[[@as FrecencyPlenaryAsync]]
@ -24,7 +26,15 @@ end
---@param key string ---@param key string
function Table:__index(key) function Table:__index(key)
if key == "records" and not rawget(self, "is_ready") then 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 end
return vim.F.if_nil(rawget(self, key), Table[key]) return vim.F.if_nil(rawget(self, key), Table[key])
end end

View File

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