2019-09-19 05:51:04 +00:00
|
|
|
const DEFAULTS_DIR = normpath(joinpath(@__DIR__, "..", "templates"))
|
2019-02-05 17:31:51 +00:00
|
|
|
|
2019-08-27 11:17:15 +00:00
|
|
|
"""
|
2019-09-01 14:03:19 +00:00
|
|
|
A simple plugin that, in general, creates a single file.
|
2019-08-27 11:17:15 +00:00
|
|
|
"""
|
2019-02-05 17:31:51 +00:00
|
|
|
abstract type BasicPlugin <: Plugin end
|
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
"""
|
|
|
|
default_file(paths::AbstractString...) -> String
|
|
|
|
|
|
|
|
Return a path relative to the default template file directory (`$(contractuser(DEFAULTS_DIR))`).
|
|
|
|
"""
|
2019-02-05 17:31:51 +00:00
|
|
|
default_file(paths::AbstractString...) = joinpath(DEFAULTS_DIR, paths...)
|
|
|
|
|
2017-08-17 22:06:05 +00:00
|
|
|
"""
|
2019-08-27 14:59:25 +00:00
|
|
|
view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
2017-08-21 21:19:40 +00:00
|
|
|
|
2019-09-01 14:03:19 +00:00
|
|
|
Return the view to be passed to the text templating engine for this plugin.
|
2019-08-27 14:59:25 +00:00
|
|
|
`pkg` is the name of the package being generated.
|
2019-09-01 14:03:19 +00:00
|
|
|
|
|
|
|
For [`BasicPlugin`](@ref)s, this is used for both the plugin badges (see [`badges`](@ref)) and the template file (see [`source`](@ref)).
|
|
|
|
For other [`Plugin`](@ref)s, it is used only for badges, but you can always call it yourself as part of your [`gen_plugin`](@ref) implementation.
|
|
|
|
|
|
|
|
By default, an empty `Dict` is returned.
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
2017-08-17 22:06:05 +00:00
|
|
|
|
2019-08-27 14:59:25 +00:00
|
|
|
"""
|
|
|
|
user_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
|
|
|
|
2019-09-01 14:03:19 +00:00
|
|
|
The same as [`view`](@ref), but for use by package *users* for extension.
|
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
Values returned by this function will override those from [`view`](@ref) when the keys are the same.
|
|
|
|
"""
|
|
|
|
user_view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
2019-09-01 14:03:19 +00:00
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
"""
|
|
|
|
combined_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
2019-09-01 14:03:19 +00:00
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
This function combines [`view`](@ref) and [`user_view`](@ref) for use in text templating.
|
|
|
|
If you're doing manual file creation or text templating (i.e. writing [`Plugin`](@ref)s that are not [`BasicPlugin`](@ref)s), then you should use this function rather than either of the former two.
|
2019-09-01 14:03:19 +00:00
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
!!! note
|
|
|
|
Do not implement this function yourself!
|
|
|
|
If you're implementing a plugin, you should implement [`view`](@ref).
|
|
|
|
If you're customizing a plugin as a user, you should implement [`user_view`](@ref).
|
2019-08-27 14:59:25 +00:00
|
|
|
"""
|
2019-09-18 14:22:04 +00:00
|
|
|
function combined_view(p::Plugin, t::Template, pkg::AbstractString)
|
|
|
|
return merge(view(p, t, pkg), user_view(p, t, pkg))
|
|
|
|
end
|
2019-08-27 14:59:25 +00:00
|
|
|
|
|
|
|
"""
|
|
|
|
tags(::Plugin) -> Tuple{String, String}
|
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
Return the delimiters used for text templating.
|
2019-09-01 14:03:19 +00:00
|
|
|
See the [`Citation`](@ref) plugin for a rare case where changing the tags is necessary.
|
|
|
|
|
|
|
|
By default, the tags are `"{{"` and `"}}"`.
|
2019-08-27 14:59:25 +00:00
|
|
|
"""
|
2019-09-18 14:22:04 +00:00
|
|
|
tags(::Plugin) = "{{", "}}"
|
2019-08-27 14:59:25 +00:00
|
|
|
|
2017-08-17 22:06:05 +00:00
|
|
|
"""
|
2019-02-05 17:31:51 +00:00
|
|
|
gitignore(::Plugin) -> Vector{String}
|
2017-08-17 06:57:58 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Return patterns that should be added to `.gitignore`.
|
2019-09-01 14:03:19 +00:00
|
|
|
These are used by the [`Gitignore`](@ref) plugin.
|
|
|
|
|
|
|
|
By default, an empty list is returned.
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
gitignore(::Plugin) = String[]
|
2017-12-01 17:33:57 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
badges(::Plugin) -> Union{Badge, Vector{Badge}}
|
2017-12-01 17:33:57 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Return a list of [`Badge`](@ref)s, or just one, to be added to `README.md`.
|
2019-09-01 14:03:19 +00:00
|
|
|
These are used by the [`Readme`](@ref) plugin to add badges to the README.
|
|
|
|
|
|
|
|
By default, an empty list is returned.
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
badges(::Plugin) = Badge[]
|
2017-12-01 17:33:57 +00:00
|
|
|
|
2017-08-17 06:57:58 +00:00
|
|
|
"""
|
2019-02-05 17:31:51 +00:00
|
|
|
source(::BasicPlugin) -> Union{String, Nothing}
|
2017-08-22 16:25:00 +00:00
|
|
|
|
2019-09-01 14:03:19 +00:00
|
|
|
Return the path to a plugin's template file, or `nothing` to indicate no file.
|
|
|
|
|
|
|
|
By default, `nothing` is returned.
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
source(::BasicPlugin) = nothing
|
2017-08-17 22:06:05 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
destination(::BasicPlugin) -> String
|
2017-08-22 16:25:00 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Return the destination, relative to the package root, of a plugin's configuration file.
|
2019-09-01 14:03:19 +00:00
|
|
|
|
|
|
|
This function **must** be implemented.
|
2017-08-17 22:06:05 +00:00
|
|
|
"""
|
2019-02-05 17:31:51 +00:00
|
|
|
function destination end
|
2017-08-17 06:57:58 +00:00
|
|
|
|
2017-08-18 04:06:15 +00:00
|
|
|
"""
|
2019-09-18 14:22:04 +00:00
|
|
|
Badge(hover::AbstractString, image::AbstractString, link::AbstractString)
|
2017-08-18 04:06:15 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Container for Markdown badge data.
|
2019-09-01 14:03:19 +00:00
|
|
|
Each argument can contain placeholders (which will be filled in with values from [`combined_view`](@ref)).
|
2017-08-18 04:06:15 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
## Arguments
|
2017-08-18 04:06:15 +00:00
|
|
|
* `hover::AbstractString`: Text to appear when the mouse is hovered over the badge.
|
|
|
|
* `image::AbstractString`: URL to the image to display.
|
|
|
|
* `link::AbstractString`: URL to go to upon clicking the badge.
|
|
|
|
"""
|
2018-12-20 19:21:17 +00:00
|
|
|
struct Badge
|
|
|
|
hover::String
|
|
|
|
image::String
|
|
|
|
link::String
|
2017-08-18 04:06:15 +00:00
|
|
|
end
|
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Base.string(b::Badge) = "[)]($(b.link))"
|
2017-08-18 04:06:15 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
# Format a plugin's badges as a list of strings, with all substitutions applied.
|
2019-08-27 14:59:25 +00:00
|
|
|
function badges(p::Plugin, t::Template, pkg::AbstractString)
|
2019-02-05 17:31:51 +00:00
|
|
|
bs = badges(p)
|
|
|
|
bs isa Vector || (bs = [bs])
|
2019-08-27 14:59:25 +00:00
|
|
|
return map(b -> render_text(string(b), combined_view(p, t, pkg)), bs)
|
2019-02-05 17:31:51 +00:00
|
|
|
end
|
2017-08-18 04:06:15 +00:00
|
|
|
|
2017-08-17 06:57:58 +00:00
|
|
|
"""
|
2019-08-27 14:59:25 +00:00
|
|
|
gen_plugin(::Plugin, ::Template, pkg::AbstractString)
|
2017-08-17 06:57:58 +00:00
|
|
|
|
2019-08-27 14:59:25 +00:00
|
|
|
Perform any work associated with a plugin.
|
2019-08-27 11:17:15 +00:00
|
|
|
`pkg` is the name of the package being generated.
|
2019-09-01 14:03:19 +00:00
|
|
|
|
|
|
|
For [`Plugin`](@ref)s that are not [`BasicPlugin`](@ref)s, this is the only function that really needs to be implemented.
|
|
|
|
If you want your plugin to do anything at all during package generation, you should implement it here.
|
|
|
|
|
|
|
|
You should **not** implement this function for `BasicPlugin`s.
|
2019-02-05 17:31:51 +00:00
|
|
|
"""
|
|
|
|
gen_plugin(::Plugin, ::Template, ::AbstractString) = nothing
|
|
|
|
|
2019-08-27 14:59:25 +00:00
|
|
|
function gen_plugin(p::BasicPlugin, t::Template, pkg_dir::AbstractString)
|
2019-08-29 16:04:11 +00:00
|
|
|
source(p) === nothing && return
|
2019-08-27 14:59:25 +00:00
|
|
|
pkg = basename(pkg_dir)
|
|
|
|
path = joinpath(pkg_dir, destination(p))
|
|
|
|
text = render_plugin(p, t, pkg)
|
|
|
|
gen_file(path, text)
|
|
|
|
end
|
|
|
|
|
|
|
|
function render_plugin(p::BasicPlugin, t::Template, pkg::AbstractString)
|
2019-08-29 16:04:11 +00:00
|
|
|
return render_file(source(p), combined_view(p, t, pkg), tags(p))
|
2017-08-17 22:06:05 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
"""
|
2019-08-27 11:17:15 +00:00
|
|
|
gen_file(file::AbstractString, text::AbstractString)
|
2017-08-17 22:06:05 +00:00
|
|
|
|
2019-02-05 17:31:51 +00:00
|
|
|
Create a new file containing some given text.
|
|
|
|
Trailing whitespace is removed, and the file will end with a newline.
|
|
|
|
"""
|
|
|
|
function gen_file(file::AbstractString, text::AbstractString)
|
|
|
|
mkpath(dirname(file))
|
2019-08-29 16:04:11 +00:00
|
|
|
text = strip(join(map(rstrip, split(text, "\n")), "\n")) * "\n"
|
2019-02-05 17:31:51 +00:00
|
|
|
write(file, text)
|
|
|
|
end
|
2017-08-17 22:06:05 +00:00
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
"""
|
|
|
|
render_file(file::AbstractString view::Dict{<:AbstractString}, tags) -> String
|
|
|
|
|
|
|
|
Render a template file with the data in `view`.
|
|
|
|
`tags` should be a tuple of two strings, which are the opening and closing delimiters, or `nothing` to use the default delimiters.
|
|
|
|
"""
|
2019-08-29 16:04:11 +00:00
|
|
|
function render_file(file::AbstractString, view::Dict{<:AbstractString}, tags)
|
2019-09-18 15:27:16 +00:00
|
|
|
return render_text(read(file, String), view, tags)
|
2019-08-29 16:04:11 +00:00
|
|
|
end
|
2017-08-17 22:06:05 +00:00
|
|
|
|
2019-09-18 14:22:04 +00:00
|
|
|
"""
|
|
|
|
render_text(text::AbstractString, view::Dict{<:AbstractString}, tags=nothing) -> String
|
|
|
|
|
|
|
|
Render some text with the data in `view`.
|
|
|
|
`tags` should be a tuple of two strings, which are the opening and closing delimiters, or `nothing` to use the default delimiters.
|
|
|
|
"""
|
2019-08-27 14:59:25 +00:00
|
|
|
function render_text(text::AbstractString, view::Dict{<:AbstractString}, tags=nothing)
|
2019-09-18 15:27:16 +00:00
|
|
|
return tags === nothing ? render(text, view) : render(text, view; tags=tags)
|
2017-08-21 19:53:00 +00:00
|
|
|
end
|
2019-02-05 17:31:51 +00:00
|
|
|
|
2019-08-29 16:04:11 +00:00
|
|
|
include(joinpath("plugins", "defaults.jl"))
|
2019-02-05 17:31:51 +00:00
|
|
|
include(joinpath("plugins", "coverage.jl"))
|
|
|
|
include(joinpath("plugins", "ci.jl"))
|
|
|
|
include(joinpath("plugins", "citation.jl"))
|
|
|
|
include(joinpath("plugins", "documenter.jl"))
|