From db917a650be82569fc0eaa132bebe7166a9c380e Mon Sep 17 00:00:00 2001 From: aviatesk Date: Wed, 18 Dec 2019 21:48:51 +0900 Subject: [PATCH 1/3] better documentation search: - strip module accessor - fix default mod setting: `Main` -> `"Main"` - separate body function --- src/docs.jl | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/docs.jl b/src/docs.jl index 88160273..ac4e218f 100644 --- a/src/docs.jl +++ b/src/docs.jl @@ -2,9 +2,35 @@ using DocSeeker import Markdown handle("searchdocs") do data - @destruct [mod || Main, nameOnly || false, exportedOnly || false, allPackages || false, query] = data - items = @errs DocSeeker.searchdocs(query, mod = mod, exportedonly = exportedOnly, - loaded = !allPackages, name_only = nameOnly) + @destruct [ + needle = query, + mod || "Main", + name_only = nameOnly || false, + exportedonly = exportedOnly || false, + allPackages || false + ] = data + _searchdocs( + needle; + # kwargs to be passed to `DocSeeker.searchdocs`: + # TODO: configuration for `maxreturns` + loaded = !allPackages, mod = mod, exportedonly = exportedonly, name_only = name_only + ) +end + +function _searchdocs(needle; kwargs...) + modstr = get(kwargs, :mod, "Main") + mod = getmodule(modstr) + identifiers = split(needle, '.') + head = string(identifiers[1]) + if head ≠ needle && (nextmod = getfield′(mod, head)) isa Module + # if `head` is a module, update `needle` and `mod` + nextneedle = join(identifiers[2:end], '.') + nextmod = string(nextmod) + nextkwargs = Dict(k === :mod ? k => nextmod : k => v for (k, v) in kwargs) + return _searchdocs(nextneedle; nextkwargs...) + end + + items = @errs searchdocs(needle; kwargs...) if items isa EvalError errstr = sprint(showerror, items.err) From 5bc899fa77ab7a6e6b1737576a3ece26671990e8 Mon Sep 17 00:00:00 2001 From: aviatesk Date: Thu, 19 Dec 2019 02:16:21 +0900 Subject: [PATCH 2/3] add simple tests for docs.jl: - `searchdocs` - `moduleinfo` --- src/docs.jl | 33 ++++++++++++++++++++++----------- test/docs.jl | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 test/docs.jl diff --git a/src/docs.jl b/src/docs.jl index ac4e218f..876b761f 100644 --- a/src/docs.jl +++ b/src/docs.jl @@ -9,7 +9,7 @@ handle("searchdocs") do data exportedonly = exportedOnly || false, allPackages || false ] = data - _searchdocs( + searchdocs′( needle; # kwargs to be passed to `DocSeeker.searchdocs`: # TODO: configuration for `maxreturns` @@ -17,6 +17,11 @@ handle("searchdocs") do data ) end +function searchdocs′(needle; kwargs...) + items = _searchdocs(needle; kwargs...) + return processdocs(items) +end + function _searchdocs(needle; kwargs...) modstr = get(kwargs, :mod, "Main") mod = getmodule(modstr) @@ -30,9 +35,11 @@ function _searchdocs(needle; kwargs...) return _searchdocs(nextneedle; nextkwargs...) end - items = @errs searchdocs(needle; kwargs...) + return items = @errs searchdocs(needle; kwargs...) +end - if items isa EvalError +function processdocs(items) + return if items isa EvalError errstr = sprint(showerror, items.err) err = startswith(errstr, "Please regenerate the") ? """ @@ -71,12 +78,16 @@ end handle("moduleinfo") do data @destruct [mod] = data + moduleinfo(mod) +end + +function moduleinfo(mod) d, items = getmoduleinfo(mod) items = [renderitem(i) for i in items] Dict(:doc => view(d), :items => items) end -getmoduleinfo(mod) = ispackage(mod) ? packageinfo(mod) : moduleinfo(mod) +getmoduleinfo(mod) = ispackage(mod) ? packageinfo(mod) : modinfo(mod) ispackage(mod) = Base.find_package(mod) ≠ nothing function packageinfo(mod) @@ -90,14 +101,13 @@ function packageinfo(mod) ), modulesymbols(mod) end -function moduleinfo(mod) - header = if mod ∈ ("Core", "Base", "Main") || first(split(mod, '.')) == "Base" - "## Standard module `$(mod)`" - else +function modinfo(mod) + header = (mod in ("Core", "Base", "Main") || first(split(mod, '.')) == "Base") ? + "## Standard module `$(mod)`" : "## Module `$mod`" - end * "\n---\n## Defined symbols:" |> renderMD + header *= "\n---\n## Defined symbols:" - header, modulesymbols(mod) + return renderMD(header), modulesymbols(mod) end function modulesymbols(mod) @@ -108,7 +118,8 @@ end using Logging: with_logger using .Progress: JunoProgressLogger -handle("regeneratedocs") do +handle(() -> regeneratedocs(), "regeneratedocs") +function regeneratedocs() with_logger(JunoProgressLogger()) do @errs DocSeeker.createdocsdb() end diff --git a/test/docs.jl b/test/docs.jl new file mode 100644 index 00000000..88afe7ee --- /dev/null +++ b/test/docs.jl @@ -0,0 +1,24 @@ +@testset "docs" begin + @testset "searchdocs" begin + using Atom: searchdocs′, _searchdocs + + @test !searchdocs′("sin")[:error] + # module awareness + @test all(_searchdocs("getfield′"; mod = "Atom")) do (score, docobj) + docobj.mod == "Atom" + end + # strip module accessor + @test all(_searchdocs("Atom.getfield′"; mod = "Main")) do (score, docobj) + docobj.mod == "Atom" + end + end + + @testset "moduleinfo" begin + using Atom: moduleinfo + + @test_nowarn moduleinfo("Main") + @test all(moduleinfo("Atom")[:items]) do item + item[:mod] == "Atom" + end + end +end From d5e75554b90b04fb9c18042ae12a31af397f4c3a Mon Sep 17 00:00:00 2001 From: aviatesk Date: Fri, 20 Dec 2019 20:09:01 +0900 Subject: [PATCH 3/3] more better doc filtering --- src/docs.jl | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/docs.jl b/src/docs.jl index 876b761f..6cf2d5d1 100644 --- a/src/docs.jl +++ b/src/docs.jl @@ -13,7 +13,7 @@ handle("searchdocs") do data needle; # kwargs to be passed to `DocSeeker.searchdocs`: # TODO: configuration for `maxreturns` - loaded = !allPackages, mod = mod, exportedonly = exportedonly, name_only = name_only + loaded = !allPackages, mod = getmodule(mod), exportedonly = exportedonly, name_only = name_only ) end @@ -23,19 +23,17 @@ function searchdocs′(needle; kwargs...) end function _searchdocs(needle; kwargs...) - modstr = get(kwargs, :mod, "Main") - mod = getmodule(modstr) identifiers = split(needle, '.') head = string(identifiers[1]) + mod = get(kwargs, :mod, Main) if head ≠ needle && (nextmod = getfield′(mod, head)) isa Module # if `head` is a module, update `needle` and `mod` nextneedle = join(identifiers[2:end], '.') - nextmod = string(nextmod) - nextkwargs = Dict(k === :mod ? k => nextmod : k => v for (k, v) in kwargs) + nextkwargs = Dict(k => (k === :mod ? nextmod : v) for (k, v) in kwargs) return _searchdocs(nextneedle; nextkwargs...) end - return items = @errs searchdocs(needle; kwargs...) + return @errs searchdocs(needle; kwargs...) end function processdocs(items) @@ -102,9 +100,17 @@ function packageinfo(mod) end function modinfo(mod) - header = (mod in ("Core", "Base", "Main") || first(split(mod, '.')) == "Base") ? - "## Standard module `$(mod)`" : - "## Module `$mod`" + header = "## " + header *= if mod in ("Core", "Base", "Main") + "Toplevel module:" + elseif first(split(mod, '.')) == "Core" + "Core sub module:" + elseif first(split(mod, '.')) == "Base" + "Base sub module:" + else + "Module:" + end + header *= " `$(mod)`" header *= "\n---\n## Defined symbols:" return renderMD(header), modulesymbols(mod)