Lots of documentation
Still WIP though.
This commit is contained in:
parent
493c54a948
commit
65f5eff29b
14
.travis.yml
14
.travis.yml
@ -27,11 +27,15 @@ matrix:
|
|||||||
julia: 1.0
|
julia: 1.0
|
||||||
- stage: Documentation
|
- stage: Documentation
|
||||||
julia: 1.0
|
julia: 1.0
|
||||||
script: julia --project=docs -e '
|
script:
|
||||||
using Pkg;
|
- git config --global user.name Your-Name
|
||||||
Pkg.develop(PackageSpec(; path=pwd()));
|
- git config --global user.email your-email
|
||||||
Pkg.instantiate();
|
- git config --global github.user your-username
|
||||||
include("docs/make.jl");'
|
- julia --project=docs -e '
|
||||||
|
using Pkg;
|
||||||
|
Pkg.develop(PackageSpec(; path=pwd()));
|
||||||
|
Pkg.instantiate();
|
||||||
|
include("docs/make.jl");'
|
||||||
after_success: skip
|
after_success: skip
|
||||||
after_success: julia -e '
|
after_success: julia -e '
|
||||||
using Pkg;
|
using Pkg;
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
# PkgTemplates
|
# PkgTemplates
|
||||||
|
|
||||||
[](https://invenia.github.io/PkgTemplates.jl/stable)
|
[](https://invenia.github.io/PkgTemplates.jl/stable)
|
||||||
[](https://invenia.github.io/PkgTemplates.jl/dev)
|
[](https://invenia.github.io/PkgTemplates.jl/dev)
|
||||||
[](https://travis-ci.org/invenia/PkgTemplates.jl)
|
[](https://travis-ci.org/invenia/PkgTemplates.jl)
|
||||||
[](https://codecov.io/gh/invenia/PkgTemplates.jl)
|
[](https://codecov.io/gh/invenia/PkgTemplates.jl)
|
||||||
|
|
||||||
**PkgTemplates creates new Julia packages in an easy, repeatable, and customizable way.**
|
**PkgTemplates creates new Julia packages in an easy, repeatable, and customizable way.**
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Assuming you have the relatively standard Git options `user.name`, `user.email` and `github.user` set up globally with `git config --global`, creating a `Template` is as simple as:
|
Assuming you have the relatively standard Git options `user.name`, `user.email` and `github.user` set up globally with `git config --global`, creating a `Template` is as simple as:
|
||||||
|
|
||||||
```jl
|
```jl
|
||||||
@ -31,7 +29,7 @@ t = Template(;
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
Once you have a `Template`, yoy can createa packages with ease:
|
Once you have a template, you can create packages with ease:
|
||||||
|
|
||||||
```jl
|
```jl
|
||||||
t("MyPkg")
|
t("MyPkg")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Documenter
|
using Documenter
|
||||||
using PkgTemplates
|
using PkgTemplates: PkgTemplates
|
||||||
|
|
||||||
makedocs(;
|
makedocs(;
|
||||||
modules=[PkgTemplates],
|
modules=[PkgTemplates],
|
||||||
@ -11,7 +11,8 @@ makedocs(;
|
|||||||
assets=String[],
|
assets=String[],
|
||||||
),
|
),
|
||||||
pages=[
|
pages=[
|
||||||
"Home" => "index.md",
|
"Home" => "user.md",
|
||||||
|
"Developer Guide" => "developer.md",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
31
docs/src/developer.md
Normal file
31
docs/src/developer.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
```@meta
|
||||||
|
CurrentModule = PkgTemplates
|
||||||
|
```
|
||||||
|
|
||||||
|
# PkgTemplates Developer Guide
|
||||||
|
|
||||||
|
PkgTemplates can be easily extended by adding new [`Plugin`](@ref)s.
|
||||||
|
|
||||||
|
## The `Plugin` Interface
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
gen_plugin
|
||||||
|
gitignore
|
||||||
|
badges
|
||||||
|
Badge
|
||||||
|
view
|
||||||
|
user_view
|
||||||
|
combined_view
|
||||||
|
tags
|
||||||
|
```
|
||||||
|
|
||||||
|
## The `BasicPlugin` Interface
|
||||||
|
|
||||||
|
While subtyping [`Plugin`](@ref) gives you complete freedom, it's not always necessary.
|
||||||
|
For more constrained cases, a simpler API exists.
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
BasicPlugin
|
||||||
|
source
|
||||||
|
destination
|
||||||
|
```
|
@ -1,8 +0,0 @@
|
|||||||
# PkgTemplates
|
|
||||||
|
|
||||||
```@index
|
|
||||||
```
|
|
||||||
|
|
||||||
```@autodocs
|
|
||||||
Modules = [PkgTemplates]
|
|
||||||
```
|
|
67
docs/src/user.md
Normal file
67
docs/src/user.md
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
```@meta
|
||||||
|
CurrentModule = PkgTemplates
|
||||||
|
```
|
||||||
|
|
||||||
|
# PkgTemplates User Guide
|
||||||
|
|
||||||
|
Using PkgTemplates is straightforward.
|
||||||
|
Just create a [`Template`](@ref), and call it on a package name to generate that package.
|
||||||
|
|
||||||
|
## Template
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Template
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
Plugins are PkgTemplates' source of customization and extensibility.
|
||||||
|
Add plugins to your templates to enable extra pieces of repository setup.
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Plugin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Defaults
|
||||||
|
|
||||||
|
These plugins are included in [`Template`](@ref)s by default.
|
||||||
|
They can be overridden by supplying another value via the `plugins` keyword, or disabled by supplying the type via the `disable_defaults` keyword.
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Gitignore
|
||||||
|
License
|
||||||
|
Readme
|
||||||
|
Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Continuous Integration (CI)
|
||||||
|
|
||||||
|
These plugins will create the configuration files of common CI services for you.
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
AppVeyor
|
||||||
|
CirrusCI
|
||||||
|
GitLabCI
|
||||||
|
TravisCI
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code Coverage
|
||||||
|
|
||||||
|
These plugins will enable code coverage reporting from CI.
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Codecov
|
||||||
|
Coveralls
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Documenter
|
||||||
|
```
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
|
||||||
|
```@docs
|
||||||
|
Citation
|
||||||
|
```
|
@ -35,6 +35,5 @@ abstract type Plugin end
|
|||||||
include("template.jl")
|
include("template.jl")
|
||||||
include("generate.jl")
|
include("generate.jl")
|
||||||
include("plugin.jl")
|
include("plugin.jl")
|
||||||
# include("interactive.jl")
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -12,10 +12,16 @@ badge_order() = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
A simple plugin that, in general, manages a single file.
|
A simple plugin that, in general, creates a single file.
|
||||||
For example, most CI services reply on one configuration file.
|
|
||||||
|
|
||||||
TODO: Dev guide.
|
You needn't implement [`gen_plugin`](@ref) for your subtypes.
|
||||||
|
Instead, you're left to implement a couple of much simpler functions:
|
||||||
|
|
||||||
|
- [`source`](@ref)
|
||||||
|
- [`destination`](@ref)
|
||||||
|
|
||||||
|
For examples, see the plugins in the [Continuous Integration (CI)](@ref) and [Code Coverage](@ref) sections.
|
||||||
|
For an example of a plugin that creates a file and then does some additional work, see [`Tests`](@ref).
|
||||||
"""
|
"""
|
||||||
abstract type BasicPlugin <: Plugin end
|
abstract type BasicPlugin <: Plugin end
|
||||||
|
|
||||||
@ -25,16 +31,40 @@ default_file(paths::AbstractString...) = joinpath(DEFAULTS_DIR, paths...)
|
|||||||
"""
|
"""
|
||||||
view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
||||||
|
|
||||||
Return the string replacements to be made for this plugin.
|
Return the view to be passed to the text templating engine for this plugin.
|
||||||
`pkg` is the name of the package being generated.
|
`pkg` is the name of the package being generated.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
For more information on templating with Mustache, see the [Mustache.jl](https://github.com/jverzani/Mustache.jl) documentation.
|
||||||
"""
|
"""
|
||||||
view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
user_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
user_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
||||||
|
|
||||||
The same as [`view`](@ref), but for use only by package *users* for extension.
|
The same as [`view`](@ref), but for use by package *users* for extension.
|
||||||
TODO better explanation
|
|
||||||
|
For example, suppose you were using the [`Readme`](@ref) with a custom template file that looked like this:
|
||||||
|
|
||||||
|
```md
|
||||||
|
# {{PKG}}
|
||||||
|
|
||||||
|
Created on *{{TODAY}}*.
|
||||||
|
```
|
||||||
|
|
||||||
|
The [`view`](@ref) function supplies a value for `PKG`, but it does not supply a value for `TODAY`.
|
||||||
|
Rather than override [`view`](@ref), we can implement this function to get both the default values and whatever else we need to add.
|
||||||
|
|
||||||
|
```julia
|
||||||
|
user_view(::Readme, ::Template, ::AbstractString) = Dict("TODAY" => today())
|
||||||
|
```
|
||||||
|
|
||||||
|
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}()
|
user_view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
||||||
|
|
||||||
@ -42,6 +72,9 @@ user_view(::Plugin, ::Template, ::AbstractString) = Dict{String, Any}()
|
|||||||
tags(::Plugin) -> Tuple{String, String}
|
tags(::Plugin) -> Tuple{String, String}
|
||||||
|
|
||||||
Return the tags used for Mustache templating.
|
Return the tags used for Mustache templating.
|
||||||
|
See the [`Citation`](@ref) plugin for a rare case where changing the tags is necessary.
|
||||||
|
|
||||||
|
By default, the tags are `"{{"` and `"}}"`.
|
||||||
"""
|
"""
|
||||||
tags(::Plugin) = ("{{", "}}")
|
tags(::Plugin) = ("{{", "}}")
|
||||||
|
|
||||||
@ -49,6 +82,9 @@ tags(::Plugin) = ("{{", "}}")
|
|||||||
gitignore(::Plugin) -> Vector{String}
|
gitignore(::Plugin) -> Vector{String}
|
||||||
|
|
||||||
Return patterns that should be added to `.gitignore`.
|
Return patterns that should be added to `.gitignore`.
|
||||||
|
These are used by the [`Gitignore`](@ref) plugin.
|
||||||
|
|
||||||
|
By default, an empty list is returned.
|
||||||
"""
|
"""
|
||||||
gitignore(::Plugin) = String[]
|
gitignore(::Plugin) = String[]
|
||||||
|
|
||||||
@ -56,13 +92,18 @@ gitignore(::Plugin) = String[]
|
|||||||
badges(::Plugin) -> Union{Badge, Vector{Badge}}
|
badges(::Plugin) -> Union{Badge, Vector{Badge}}
|
||||||
|
|
||||||
Return a list of [`Badge`](@ref)s, or just one, to be added to `README.md`.
|
Return a list of [`Badge`](@ref)s, or just one, to be added to `README.md`.
|
||||||
|
These are used by the [`Readme`](@ref) plugin to add badges to the README.
|
||||||
|
|
||||||
|
By default, an empty list is returned.
|
||||||
"""
|
"""
|
||||||
badges(::Plugin) = Badge[]
|
badges(::Plugin) = Badge[]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
source(::BasicPlugin) -> Union{String, Nothing}
|
source(::BasicPlugin) -> Union{String, Nothing}
|
||||||
|
|
||||||
Return the path to a plugin's configuration file template, or `nothing` to indicate no file.
|
Return the path to a plugin's template file, or `nothing` to indicate no file.
|
||||||
|
|
||||||
|
By default, `nothing` is returned.
|
||||||
"""
|
"""
|
||||||
source(::BasicPlugin) = nothing
|
source(::BasicPlugin) = nothing
|
||||||
|
|
||||||
@ -70,6 +111,8 @@ source(::BasicPlugin) = nothing
|
|||||||
destination(::BasicPlugin) -> String
|
destination(::BasicPlugin) -> String
|
||||||
|
|
||||||
Return the destination, relative to the package root, of a plugin's configuration file.
|
Return the destination, relative to the package root, of a plugin's configuration file.
|
||||||
|
|
||||||
|
This function **must** be implemented.
|
||||||
"""
|
"""
|
||||||
function destination end
|
function destination end
|
||||||
|
|
||||||
@ -77,7 +120,7 @@ function destination end
|
|||||||
Badge(hover::AbstractString, image::AbstractString, link::AbstractString) -> Badge
|
Badge(hover::AbstractString, image::AbstractString, link::AbstractString) -> Badge
|
||||||
|
|
||||||
Container for Markdown badge data.
|
Container for Markdown badge data.
|
||||||
Each argument can contain placeholders.
|
Each argument can contain placeholders (which will be filled in with values from [`combined_view`](@ref)).
|
||||||
|
|
||||||
## Arguments
|
## Arguments
|
||||||
* `hover::AbstractString`: Text to appear when the mouse is hovered over the badge.
|
* `hover::AbstractString`: Text to appear when the mouse is hovered over the badge.
|
||||||
@ -104,6 +147,11 @@ end
|
|||||||
|
|
||||||
Perform any work associated with a plugin.
|
Perform any work associated with a plugin.
|
||||||
`pkg` is the name of the package being generated.
|
`pkg` is the name of the package being generated.
|
||||||
|
|
||||||
|
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.
|
||||||
"""
|
"""
|
||||||
gen_plugin(::Plugin, ::Template, ::AbstractString) = nothing
|
gen_plugin(::Plugin, ::Template, ::AbstractString) = nothing
|
||||||
|
|
||||||
@ -120,6 +168,15 @@ function render_plugin(p::BasicPlugin, t::Template, pkg::AbstractString)
|
|||||||
return render_file(source(p), combined_view(p, t, pkg), tags(p))
|
return render_file(source(p), combined_view(p, t, pkg), tags(p))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
combined_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}
|
||||||
|
|
||||||
|
This function combines [`view`](@ref) and [`user_view`](@ref) for use in text templating.
|
||||||
|
If you're doing manual creation (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.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
You should **not** implement this function yourself.
|
||||||
|
"""
|
||||||
function combined_view(p::Plugin, t::Template, pkg::AbstractString)
|
function combined_view(p::Plugin, t::Template, pkg::AbstractString)
|
||||||
return merge(view(p, t, pkg), user_view(p, t, pkg))
|
return merge(view(p, t, pkg), user_view(p, t, pkg))
|
||||||
end
|
end
|
||||||
|
@ -1,15 +1,45 @@
|
|||||||
const VersionsOrStrings = Vector{Union{VersionNumber, String}}
|
# Strip everything but the major and minor release from a version number.
|
||||||
const ALLOWED_FAILURES = ["1.3", "nightly"] # TODO: Update this list with new RCs.
|
|
||||||
const DEFAULT_CI_VERSIONS = VersionsOrStrings([VERSION, default_version(), "nightly"])
|
|
||||||
|
|
||||||
format_version(v::VersionNumber) = "$(v.major).$(v.minor)"
|
format_version(v::VersionNumber) = "$(v.major).$(v.minor)"
|
||||||
format_version(v::AbstractString) = string(v)
|
format_version(v::AbstractString) = string(v)
|
||||||
|
|
||||||
|
const ALLOWED_FAILURES = ["1.3", "nightly"] # TODO: Update this list with new RCs.
|
||||||
|
const DEFAULT_CI_VERSIONS = map(format_version, [default_version(), VERSION, "nightly"])
|
||||||
|
const EXTRA_VERSIONS_DOC = "- `extra_versions::Vector`: Extra Julia versions to test, as strings or `VersionNumber`s."
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
collect_versions(t::Template, versions::Vector) -> Vector{String}
|
||||||
|
|
||||||
|
Combine the [`Template`](@ref)'s Julia version and some other versions, and format them as `major.minor`.
|
||||||
|
This is useful for creating lists of versions to be included in CI configurations.
|
||||||
|
"""
|
||||||
function collect_versions(t::Template, versions::Vector)
|
function collect_versions(t::Template, versions::Vector)
|
||||||
vs = map(format_version, [t.julia_version, versions...])
|
vs = map(format_version, [t.julia_version, versions...])
|
||||||
return sort(unique(vs))
|
return sort(unique(vs))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
TravisCI(;
|
||||||
|
file="$(contractuser(default_file("travis.yml")))",
|
||||||
|
linux=true,
|
||||||
|
osx=true,
|
||||||
|
windows=true,
|
||||||
|
x86=false,
|
||||||
|
coverage=true,
|
||||||
|
extra_versions=$DEFAULT_CI_VERSIONS,
|
||||||
|
) -> TravisCI
|
||||||
|
|
||||||
|
Integrates your packages with [Travis CI](https://travis-ci.com).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for `.travis.yml`.
|
||||||
|
- `linux::Bool`: Whether or not to run builds on Linux.
|
||||||
|
- `osx::Bool`: Whether or not to run builds on OSX (MacOS).
|
||||||
|
- `windows::Bool`: Whether or not to run builds on Windows.
|
||||||
|
- `x86::Bool`: Whether or not to run builds on 32-bit systems, in addition to the default 64-bit builds.
|
||||||
|
- `coverage::Bool`: Whether or not to publish code coverage (another code coverage plugin such as [`Codecov`](@ref) must also be included).
|
||||||
|
$EXTRA_VERSIONS_DOC
|
||||||
|
"""
|
||||||
@with_kw struct TravisCI <: BasicPlugin
|
@with_kw struct TravisCI <: BasicPlugin
|
||||||
file::String = default_file("travis.yml")
|
file::String = default_file("travis.yml")
|
||||||
linux::Bool = true
|
linux::Bool = true
|
||||||
@ -17,7 +47,7 @@ end
|
|||||||
windows::Bool = true
|
windows::Bool = true
|
||||||
x86::Bool = false
|
x86::Bool = false
|
||||||
coverage::Bool = true
|
coverage::Bool = true
|
||||||
extra_versions::VersionsOrStrings = DEFAULT_CI_VERSIONS
|
extra_versions::Vector = DEFAULT_CI_VERSIONS
|
||||||
end
|
end
|
||||||
|
|
||||||
source(p::TravisCI) = p.file
|
source(p::TravisCI) = p.file
|
||||||
@ -35,7 +65,6 @@ function view(p::TravisCI, t::Template, pkg::AbstractString)
|
|||||||
p.osx && push!(os, "osx")
|
p.osx && push!(os, "osx")
|
||||||
p.windows && push!(os, "windows")
|
p.windows && push!(os, "windows")
|
||||||
|
|
||||||
|
|
||||||
versions = collect_versions(t, p.extra_versions)
|
versions = collect_versions(t, p.extra_versions)
|
||||||
allow_failures = filter(in(versions), ALLOWED_FAILURES)
|
allow_failures = filter(in(versions), ALLOWED_FAILURES)
|
||||||
|
|
||||||
@ -64,11 +93,27 @@ function view(p::TravisCI, t::Template, pkg::AbstractString)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
AppVeyor(;
|
||||||
|
file="$(contractuser(default_file("appveyor.yml")))",
|
||||||
|
x86=false,
|
||||||
|
coverage=true,
|
||||||
|
extra_versions=$DEFAULT_CI_VERSIONS,
|
||||||
|
) -> AppVeyor
|
||||||
|
|
||||||
|
Integrates your packages with [AppVeyor](https://appveyor.com) via [AppVeyor.jl](https://github.com/JuliaCI/Appveyor.jl).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for `.appveyor.yml`.
|
||||||
|
- `x86::Bool`: Whether or not to run builds on 32-bit systems, in addition to the default 64-bit builds.
|
||||||
|
- `coverage::Bool`: Whether or not to publish code coverage ([`Codecov`](@ref) must also be included).
|
||||||
|
$EXTRA_VERSIONS_DOC
|
||||||
|
"""
|
||||||
@with_kw struct AppVeyor <: BasicPlugin
|
@with_kw struct AppVeyor <: BasicPlugin
|
||||||
file::String = default_file("appveyor.yml")
|
file::String = default_file("appveyor.yml")
|
||||||
x86::Bool = false
|
x86::Bool = false
|
||||||
coverage::Bool = true
|
coverage::Bool = true
|
||||||
extra_versions::VersionsOrStrings = DEFAULT_CI_VERSIONS
|
extra_versions::Vector = DEFAULT_CI_VERSIONS
|
||||||
end
|
end
|
||||||
|
|
||||||
source(p::AppVeyor) = p.file
|
source(p::AppVeyor) = p.file
|
||||||
@ -98,11 +143,30 @@ function view(p::AppVeyor, t::Template, pkg::AbstractString)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
CirrusCI(;
|
||||||
|
file="$(contractuser(default_file("cirrus.yml")))",
|
||||||
|
image="freebsd-12-0-release-amd64",
|
||||||
|
coverage=true,
|
||||||
|
extra_versions=$DEFAULT_CI_VERSIONS,
|
||||||
|
) -> CirrusCI
|
||||||
|
|
||||||
|
Integrates your packages with [Cirrus CI](https://cirrus-ci.org) via [CirrusCI.jl](https://github.com/ararslan/CirrusCI.jl).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for `.cirrus.yml`.
|
||||||
|
- `image::AbstractString`: The FreeBSD image to be used.
|
||||||
|
- `coverage::Bool`: Whether or not to publish code coverage ([`Codecov`](@ref) must also be included).
|
||||||
|
$EXTRA_VERSIONS_DOC
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Code coverage submission from Cirrus CI is not yet supported by [Coverage.jl](https://github.com/JuliaCI/Coverage.jl).
|
||||||
|
"""
|
||||||
@with_kw struct CirrusCI <: BasicPlugin
|
@with_kw struct CirrusCI <: BasicPlugin
|
||||||
file::String = default_file("cirrus.yml")
|
file::String = default_file("cirrus.yml")
|
||||||
image::String = "freebsd-12-0-release-amd64"
|
image::String = "freebsd-12-0-release-amd64"
|
||||||
coverage::Bool = true
|
coverage::Bool = true
|
||||||
extra_versions::VersionsOrStrings = DEFAULT_CI_VERSIONS
|
extra_versions::Vector = DEFAULT_CI_VERSIONS
|
||||||
end
|
end
|
||||||
|
|
||||||
source(p::CirrusCI) = p.file
|
source(p::CirrusCI) = p.file
|
||||||
@ -126,11 +190,32 @@ function view(p::CirrusCI, t::Template, pkg::AbstractString)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
GitLabCI(;
|
||||||
|
file="$(contractuser(default_file("gitlab-ci.yml")))",
|
||||||
|
coverage=true,
|
||||||
|
extra_versions=$DEFAULT_CI_VERSIONS,
|
||||||
|
) -> GitLabCI
|
||||||
|
|
||||||
|
Integrates your packages with [GitLab CI](https://docs.gitlab.com/ce/ci/).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for `.gitlab-ci.yml`.
|
||||||
|
- `coverage::Bool`: Whether or not to compute code coverage.
|
||||||
|
$EXTRA_VERSIONS_DOC
|
||||||
|
|
||||||
|
## GitLab Pages
|
||||||
|
Documentation can be generated by including a `Documenter{GitLabCI}` plugin.
|
||||||
|
See [`Documenter`](@ref) for more information.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Nightly Julia is not supported.
|
||||||
|
"""
|
||||||
@with_kw struct GitLabCI <: BasicPlugin
|
@with_kw struct GitLabCI <: BasicPlugin
|
||||||
file::String = default_file("gitlab-ci.yml")
|
file::String = default_file("gitlab-ci.yml")
|
||||||
coverage::Bool = true
|
coverage::Bool = true
|
||||||
# Nightly has no Docker image.
|
# Nightly has no Docker image.
|
||||||
extra_versions::VersionsOrStrings = [VERSION, default_version()]
|
extra_versions::Vector = map(format_version, [default_version(), VERSION])
|
||||||
end
|
end
|
||||||
|
|
||||||
gitignore(p::GitLabCI) = p.coverage ? COVERAGE_GITIGNORE : String[]
|
gitignore(p::GitLabCI) = p.coverage ? COVERAGE_GITIGNORE : String[]
|
||||||
@ -163,5 +248,12 @@ function view(p::GitLabCI, t::Template, pkg::AbstractString)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
is_ci(::Type{T}) -> Bool
|
||||||
|
|
||||||
|
Determine whether or not `T` is a CI plugin.
|
||||||
|
If you are adding a CI plugin, you should implement this function and return `true`.
|
||||||
|
"""
|
||||||
is_ci(::Type) = false
|
is_ci(::Type) = false
|
||||||
is_ci(::Type{<:Union{AppVeyor, TravisCI, CirrusCI, GitLabCI}}) = true
|
is_ci(::Type{<:Union{AppVeyor, TravisCI, CirrusCI, GitLabCI}}) = true
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
"""
|
"""
|
||||||
Citation(; readme_section::Bool=false) -> Citation
|
Citation(;
|
||||||
|
file="$(contractuser(default_file("CITATION.bib")))",
|
||||||
|
readme=false,
|
||||||
|
) -> Citation
|
||||||
|
|
||||||
Add `Citation` to a [`Template`](@ref)'s plugin list to generate a `CITATION.bib` file.
|
Creates a `CITATION.bib` file for citing package repositories.
|
||||||
If `readme` is set, then `README.md` will contain a section about citing.
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for `CITATION.bib`.
|
||||||
|
- `readme::Bool`: Whether or not to include a section about citing in the README.
|
||||||
"""
|
"""
|
||||||
@with_kw struct Citation <: BasicPlugin
|
@with_kw struct Citation <: BasicPlugin
|
||||||
file::String = default_file("CITATION.bib")
|
file::String = default_file("CITATION.bib")
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
const COVERAGE_GITIGNORE = ["*.jl.cov", "*.jl.*.cov", "*.jl.mem"]
|
const COVERAGE_GITIGNORE = ["*.jl.cov", "*.jl.*.cov", "*.jl.mem"]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Codecov(; file=nothing) -> Codecov
|
||||||
|
|
||||||
|
Sets up code coverage submission from CI to [Codecov](https://codecov.io).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::Union{AbstractString, Nothing}`: Template file for `.codecov.yml`, or `nothing` to create no file.
|
||||||
|
"""
|
||||||
@with_kw struct Codecov <: BasicPlugin
|
@with_kw struct Codecov <: BasicPlugin
|
||||||
file::Union{String, Nothing} = nothing
|
file::Union{String, Nothing} = nothing
|
||||||
end
|
end
|
||||||
@ -13,6 +21,14 @@ badges(::Codecov) = Badge(
|
|||||||
"https://codecov.io/gh/{{USER}}/{{PKG}}.jl",
|
"https://codecov.io/gh/{{USER}}/{{PKG}}.jl",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Coveralls(; file=nothing) -> Coverallls
|
||||||
|
|
||||||
|
Sets up code coverage submission from CI to [Coveralls](https://coveralls.io).
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::Union{AbstractString, Nothing}`: Template file for `.coveralls.yml`, or `nothing` to create no file.
|
||||||
|
"""
|
||||||
@with_kw struct Coveralls <: BasicPlugin
|
@with_kw struct Coveralls <: BasicPlugin
|
||||||
file::Union{String, Nothing} = nothing
|
file::Union{String, Nothing} = nothing
|
||||||
end
|
end
|
||||||
@ -28,5 +44,11 @@ badges(::Coveralls) = Badge(
|
|||||||
|
|
||||||
gitignore(::Union{Codecov, Coveralls}) = COVERAGE_GITIGNORE
|
gitignore(::Union{Codecov, Coveralls}) = COVERAGE_GITIGNORE
|
||||||
|
|
||||||
|
"""
|
||||||
|
is_coverage(::Type{T}) -> Bool
|
||||||
|
|
||||||
|
Determine whether or not `T` is a coverage plugin.
|
||||||
|
If you are adding a coverage plugin, you should implement this function and return `true`.
|
||||||
|
"""
|
||||||
is_coverage(::Type) = false
|
is_coverage(::Type) = false
|
||||||
is_coverage(::Type{<:Union{Codecov, Coveralls}}) = true
|
is_coverage(::Type{<:Union{Codecov, Coveralls}}) = true
|
||||||
|
@ -14,6 +14,22 @@ const LICENSES = Dict(
|
|||||||
"EUPL-1.2+" => "European Union Public Licence, Version 1.2+",
|
"EUPL-1.2+" => "European Union Public Licence, Version 1.2+",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Readme(;
|
||||||
|
file="$(contractuser(default_file("README.md")))",
|
||||||
|
destination="README.md",
|
||||||
|
inline_badges=false,
|
||||||
|
) -> Readme,
|
||||||
|
|
||||||
|
Creates a `README` file.
|
||||||
|
By default, it includes badges for other included plugins
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for the `README`.
|
||||||
|
- `destination::AbstractString`: File destination, relative to the repository root.
|
||||||
|
For example, values of `"README"` or `"README.rst"` might be desired.
|
||||||
|
- `inline_badges::Bool`: Whether or not to put the badges on the same line as the package name.
|
||||||
|
"""
|
||||||
@with_kw struct Readme <: BasicPlugin
|
@with_kw struct Readme <: BasicPlugin
|
||||||
file::String = default_file("README.md")
|
file::String = default_file("README.md")
|
||||||
destination::String = "README.md"
|
destination::String = "README.md"
|
||||||
@ -47,6 +63,17 @@ function view(p::Readme, t::Template, pkg::AbstractString)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
License(; name="MIT", destination="LICENSE") -> License
|
||||||
|
|
||||||
|
Creates a license file.
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `name::AbstractString`: Name of the desired license.
|
||||||
|
Available licenses can be seen [here](https://github.com/invenia/PkgTemplates.jl/tree/master/licenses).
|
||||||
|
- `destination::AbstractString`: File destination, relative to the repository root.
|
||||||
|
For example, `"LICENSE.md"` might be desired.
|
||||||
|
"""
|
||||||
struct License <: Plugin
|
struct License <: Plugin
|
||||||
path::String
|
path::String
|
||||||
destination::String
|
destination::String
|
||||||
@ -56,12 +83,14 @@ struct License <: Plugin
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Look up a license and throw an error if it doesn't exist.
|
||||||
function license_path(license::AbstractString)
|
function license_path(license::AbstractString)
|
||||||
path = joinpath(LICENSE_DIR, license)
|
path = joinpath(LICENSE_DIR, license)
|
||||||
isfile(path) || throw(ArgumentError("License '$license' is not available"))
|
isfile(path) || throw(ArgumentError("License '$license' is not available"))
|
||||||
return path
|
return path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Read a license's text.
|
||||||
read_license(license::AbstractString) = string(readchomp(license_path(license)))
|
read_license(license::AbstractString) = string(readchomp(license_path(license)))
|
||||||
|
|
||||||
function render_plugin(p::License, t::Template)
|
function render_plugin(p::License, t::Template)
|
||||||
@ -76,6 +105,15 @@ function gen_plugin(p::License, t::Template, pkg_dir::AbstractString)
|
|||||||
gen_file(joinpath(pkg_dir, p.destination), render_plugin(p, t))
|
gen_file(joinpath(pkg_dir, p.destination), render_plugin(p, t))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
Gitignore(; ds_store=true, dev=true) -> Gitignore
|
||||||
|
|
||||||
|
Creates a `.gitignore` file.
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `ds_store::Bool`: Whether or not to ignore MacOS's `.DS_Store` files.
|
||||||
|
- `dev::Bool`: Whether or not to ignore the directory of locally-developed packages.
|
||||||
|
"""
|
||||||
@with_kw struct Gitignore <: Plugin
|
@with_kw struct Gitignore <: Plugin
|
||||||
ds_store::Bool = true
|
ds_store::Bool = true
|
||||||
dev::Bool = true
|
dev::Bool = true
|
||||||
@ -96,6 +134,14 @@ function gen_plugin(p::Gitignore, t::Template, pkg_dir::AbstractString)
|
|||||||
t.git && gen_file(joinpath(pkg_dir, ".gitignore"), render_plugin(p, t))
|
t.git && gen_file(joinpath(pkg_dir, ".gitignore"), render_plugin(p, t))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
Tests(; file="$(contractuser(default_file("runtests.jl")))" -> Tests
|
||||||
|
|
||||||
|
Sets up testing for packages.
|
||||||
|
|
||||||
|
## Keyword Arguments
|
||||||
|
- `file::AbstractString`: Template file for the `runtests.jl`.
|
||||||
|
"""
|
||||||
@with_kw struct Tests <: BasicPlugin
|
@with_kw struct Tests <: BasicPlugin
|
||||||
file::String = default_file("runtests.jl")
|
file::String = default_file("runtests.jl")
|
||||||
end
|
end
|
||||||
|
@ -2,23 +2,23 @@ const DOCUMENTER_UUID = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
Documenter{T<:Union{TravisCI, GitLabCI, Nothing}}(;
|
Documenter{T<:Union{TravisCI, GitLabCI, Nothing}}(;
|
||||||
assets::Vector{<:AbstractString}=String[],
|
make_jl="$(contractuser(default_file("make.jl")))",
|
||||||
makedocs_kwargs::Dict{Symbol}=Dict(),
|
index_md="$(contractuser(default_file("index.md")))",
|
||||||
canonical_url::Union{Function, Nothing}=nothing,
|
assets=String[],
|
||||||
make_jl::AbstractString="$(contractuser(default_file("make.jl")))",
|
canonical_url=,
|
||||||
index_md::AbstractString="$(contractuser(default_file("index.md")))",
|
makedocs_kwargs=Dict{Symbol, Any}(),
|
||||||
) -> Documenter{T}
|
) -> Documenter{T}
|
||||||
|
|
||||||
The `Documenter` plugin adds support for documentation generation via [Documenter.jl](https://github.com/JuliaDocs/Documenter.jl).
|
Sets up documentation generation via [Documenter.jl](https://github.com/JuliaDocs/Documenter.jl).
|
||||||
Documentation deployment depends on `T`, where `T` is some supported CI plugin, or `Nothing` to only support local documentation builds.
|
Documentation deployment depends on `T`, where `T` is some supported CI plugin, or `Nothing` to only support local documentation builds.
|
||||||
|
|
||||||
## Keyword Arguments
|
## Keyword Arguments
|
||||||
TODO
|
- `make_jl::AbstractString`: Template file for `make.jl`.
|
||||||
- `assets::Vector{<:AbstractString}=String[]`:
|
- `index_md::AbstractString`: Template file for `index.md`.
|
||||||
- `makedocs_kwargs::Dict{Symbol}=Dict{Symbol, Any}()`:
|
- `assets::Vector{<:AbstractString}`: Extra assets for the generated site.
|
||||||
- `canonical_url::Union{Function, Nothing}=nothing`:
|
- `canonical_url::Union{Function, Nothing}`: A function to generate the documentation site's canonical URL.
|
||||||
- `index_md::AbstractString`
|
The default value will compute GitHub Pages and GitLab Pages URLs for [`TravisCI`](@ref) and [`GitLabCI`](@ref), respectively.
|
||||||
- `make_jl::AbstractString`
|
- `makedocs_kwargs::Dict{Symbol}`: Extra keyword arguments to be inserted into `makedocs`.
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
If deploying documentation with Travis CI, don't forget to complete the required configuration.
|
If deploying documentation with Travis CI, don't forget to complete the required configuration.
|
||||||
|
@ -10,9 +10,9 @@ function default_authors()
|
|||||||
end
|
end
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Template(; interactive::Bool=false, kwargs...) -> Template
|
Template(; kwargs...) -> Template
|
||||||
|
|
||||||
Records common information used to generate a package.
|
A configuration used to generate packages.
|
||||||
|
|
||||||
## Keyword Arguments
|
## Keyword Arguments
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user