diff --git a/README.md b/README.md index 011325b..e7f30ee 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,10 @@ julia> using PublicAPI julia> apis = PublicAPI.of(PublicAPI); julia> sort!(fullname.(apis)) -3-element Vector{Tuple{Symbol, Symbol}}: +4-element Vector{Tuple{Symbol, Symbol}}: (:PublicAPI, Symbol("@public")) (:PublicAPI, Symbol("@strict")) + (:PublicAPI, :API) (:PublicAPI, :of) ``` diff --git a/docs/src/index.md b/docs/src/index.md index 5b5b47e..d87c1c0 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -5,4 +5,5 @@ PublicAPI PublicAPI.@public PublicAPI.@strict PublicAPI.of +PublicAPI.API ``` diff --git a/src/PublicAPI.jl b/src/PublicAPI.jl index 55279b4..abc37b7 100644 --- a/src/PublicAPI.jl +++ b/src/PublicAPI.jl @@ -2,14 +2,26 @@ baremodule PublicAPI export @public +module InternalPrelude +function _API end +end + macro public end macro strict end function of end +struct API + mod::Module + var::Symbol + + InternalPrelude._API(mod::Module, var::Symbol) = new(mod, var) +end + module Internal -using ..PublicAPI: PublicAPI +using ..PublicAPI.InternalPrelude: _API +using ..PublicAPI: PublicAPI, API import ..PublicAPI: @public, @strict include("registry.jl") @@ -33,5 +45,6 @@ Internal.define_docstring() @public @public @public @strict @public of +@public API end # baremodule PublicAPI diff --git a/src/query.jl b/src/query.jl index ad49082..a79a4c6 100644 --- a/src/query.jl +++ b/src/query.jl @@ -1,24 +1,28 @@ -struct API - mod::Module - var::Symbol -end - -Base.fullname(api::API) = (fullname(api.mod)..., api.var) -Base.Module(api::API) = api.mod -Base.nameof(api::API) = api.var - """ - PublicAPI.of(provider::Module; [recursive = true]) -> apis::Vector + PublicAPI.API -List public API from the `provider` module. +A value representing an API. -Each element `api` of `apis` supports the following accessor functions: +An `api::API` supports the following accessor functions: * `Module(api) :: Module`: module in which the API is defined * `nameof(api) :: Symbol`: the name of the API in the module * `fullname(api) :: Tuple{Vararg{Symbol}}`: the components of the fully-qualified name; i.e., `(:Package, :SubModule, :function)` for `Package.SubModule.function`. +""" +PublicAPI.API + +Base.fullname(api::API) = (fullname(api.mod)..., api.var) +Base.Module(api::API) = api.mod +Base.nameof(api::API) = api.var + +""" + PublicAPI.of(provider::Module; [recursive = true]) -> apis::Vector{PublicAPI.API} + +List public API from the `provider` module. + +See [`PublicAPI.API`](@ref) for methods supported by each element of `apis`. The `provider` module itself is not included in the `apis`. @@ -45,7 +49,7 @@ function PublicAPI.of(provider::Module; recursive::Bool = true) registry = getfield(m, API_REGISTRY_NAME) if registry isa Vector{Symbol} for n in registry - push!(apis, API(m, n)) + push!(apis, _API(m, n)) mayberecurse(n) end else @@ -58,7 +62,7 @@ function PublicAPI.of(provider::Module; recursive::Bool = true) end n === nameof(m) && continue # avoid the module to be listed twice if isdefined(m, n) - push!(apis, API(m, n)) + push!(apis, _API(m, n)) mayberecurse(n) else # Should error? diff --git a/test/PublicAPITests/src/test_query.jl b/test/PublicAPITests/src/test_query.jl index ff86bd6..ed655a9 100644 --- a/test/PublicAPITests/src/test_query.jl +++ b/test/PublicAPITests/src/test_query.jl @@ -6,8 +6,8 @@ import ..PublicAPITests function test_of() apis = PublicAPI.of(PublicAPI) - @test sort!(nameof.(apis)) == [Symbol("@public"), Symbol("@strict"), :of] - @test Module.(apis) == fill(PublicAPI, 3) + @test sort!(nameof.(apis)) == [Symbol("@public"), Symbol("@strict"), :API, :of] + @test Module.(apis) == fill(PublicAPI, 4) end function test_recursive()