build based on 52bac95

This commit is contained in:
zeptodoctor 2020-06-18 00:26:29 +00:00
parent b40427cf9e
commit c3302ac0c5
14 changed files with 16090 additions and 2 deletions

2
stable
View File

@ -1 +1 @@
v0.7.4
v0.7.5

2
v0.7
View File

@ -1 +1 @@
v0.7.4
v0.7.5

260
v0.7.5/assets/documenter.js Normal file
View File

@ -0,0 +1,260 @@
// Generated by Documenter.jl
requirejs.config({
paths: {
'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/languages/julia.min',
'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.10.3/headroom.min',
'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min',
'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/contrib/auto-render.min',
'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min',
'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.10.3/jQuery.headroom.min',
'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min',
'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min',
'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/languages/julia-repl.min',
},
shim: {
"highlight-julia": {
"deps": [
"highlight"
]
},
"katex-auto-render": {
"deps": [
"katex"
]
},
"headroom-jquery": {
"deps": [
"jquery",
"headroom"
]
},
"highlight-julia-repl": {
"deps": [
"highlight"
]
}
}
});
////////////////////////////////////////////////////////////////////////////////
require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) {
$(document).ready(function() {
renderMathInElement(
document.body,
{
"delimiters": [
{
"left": "$",
"right": "$",
"display": false
},
{
"left": "$$",
"right": "$$",
"display": true
},
{
"left": "\\[",
"right": "\\]",
"display": true
}
]
}
);
})
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($, hljs) {
$(document).ready(function() {
hljs.initHighlighting();
})
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) {
// Manages the top navigation bar (hides it when the user starts scrolling down on the
// mobile).
window.Headroom = Headroom; // work around buggy module loading?
$(document).ready(function() {
$('#documenter .docs-navbar').headroom({
"tolerance": {"up": 10, "down": 10},
});
})
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery'], function($) {
// Modal settings dialog
$(document).ready(function() {
var settings = $('#documenter-settings');
$('#documenter-settings-button').click(function(){
settings.toggleClass('is-active');
});
// Close the dialog if X is clicked
$('#documenter-settings button.delete').click(function(){
settings.removeClass('is-active');
});
// Close dialog if ESC is pressed
$(document).keyup(function(e) {
if (e.keyCode == 27) settings.removeClass('is-active');
});
});
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery'], function($) {
// Manages the showing and hiding of the sidebar.
$(document).ready(function() {
var sidebar = $("#documenter > .docs-sidebar");
var sidebar_button = $("#documenter-sidebar-button")
sidebar_button.click(function(ev) {
ev.preventDefault();
sidebar.toggleClass('visible');
if (sidebar.hasClass('visible')) {
// Makes sure that the current menu item is visible in the sidebar.
$("#documenter .docs-menu a.is-active").focus();
}
});
$("#documenter > .docs-main").bind('click', function(ev) {
if ($(ev.target).is(sidebar_button)) {
return;
}
if (sidebar.hasClass('visible')) {
sidebar.removeClass('visible');
}
});
})
// Resizes the package name / sitename in the sidebar if it is too wide.
// Inspired by: https://github.com/davatron5000/FitText.js
$(document).ready(function() {
e = $("#documenter .docs-autofit");
function resize() {
var L = parseInt(e.css('max-width'), 10);
var L0 = e.width();
if(L0 > L) {
var h0 = parseInt(e.css('font-size'), 10);
e.css('font-size', L * h0 / L0);
// TODO: make sure it survives resizes?
}
}
// call once and then register events
resize();
$(window).resize(resize);
$(window).on('orientationchange', resize);
});
// Scroll the navigation bar to the currently selected menu item
$(document).ready(function() {
var sidebar = $("#documenter .docs-menu").get(0);
var active = $("#documenter .docs-menu .is-active").get(0);
if(typeof active !== 'undefined') {
sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15;
}
})
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery'], function($) {
function set_theme(theme) {
var active = null;
var disabled = [];
for (var i = 0; i < document.styleSheets.length; i++) {
var ss = document.styleSheets[i];
var themename = ss.ownerNode.getAttribute("data-theme-name");
if(themename === null) continue; // ignore non-theme stylesheets
// Find the active theme
if(themename === theme) active = ss;
else disabled.push(ss);
}
if(active !== null) {
active.disabled = false;
if(active.ownerNode.getAttribute("data-theme-primary") === null) {
document.getElementsByTagName('html')[0].className = "theme--" + theme;
} else {
document.getElementsByTagName('html')[0].className = "";
}
disabled.forEach(function(ss){
ss.disabled = true;
});
}
// Store the theme in localStorage
if(typeof(window.localStorage) !== "undefined") {
window.localStorage.setItem("documenter-theme", theme);
} else {
console.error("Browser does not support window.localStorage");
}
}
// Theme picker setup
$(document).ready(function() {
// onchange callback
$('#documenter-themepicker').change(function themepick_callback(ev){
var themename = $('#documenter-themepicker option:selected').attr('value');
set_theme(themename);
});
// Make sure that the themepicker displays the correct theme when the theme is retrieved
// from localStorage
if(typeof(window.localStorage) !== "undefined") {
var theme = window.localStorage.getItem("documenter-theme");
if(theme !== null) {
$('#documenter-themepicker option').each(function(i,e) {
e.selected = (e.value === theme);
})
}
}
})
})
////////////////////////////////////////////////////////////////////////////////
require(['jquery'], function($) {
// update the version selector with info from the siteinfo.js and ../versions.js files
$(document).ready(function() {
var version_selector = $("#documenter .docs-version-selector");
var version_selector_select = $("#documenter .docs-version-selector select");
version_selector_select.change(function(x) {
target_href = version_selector_select.children("option:selected").get(0).value;
window.location.href = target_href;
});
// add the current version to the selector based on siteinfo.js, but only if the selector is empty
if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) {
var option = $("<option value='#' selected='selected'>" + DOCUMENTER_CURRENT_VERSION + "</option>");
version_selector_select.append(option);
}
if (typeof DOC_VERSIONS !== 'undefined') {
var existing_versions = version_selector_select.children("option");
var existing_versions_texts = existing_versions.map(function(i,x){return x.text});
DOC_VERSIONS.forEach(function(each) {
var version_url = documenterBaseURL + "/../" + each;
var existing_id = $.inArray(each, existing_versions_texts);
// if not already in the version selector, add it as a new option,
// otherwise update the old option with the URL and enable it
if (existing_id == -1) {
var option = $("<option value='" + version_url + "'>" + each + "</option>");
version_selector_select.append(option);
} else {
var option = existing_versions[existing_id];
option.value = version_url;
option.disabled = false;
}
});
}
// only show the version selector if the selector has been populated
if (version_selector_select.children("option").length > 0) {
version_selector.toggleClass("visible");
}
})
})

247
v0.7.5/assets/search.js Normal file
View File

@ -0,0 +1,247 @@
// Generated by Documenter.jl
requirejs.config({
paths: {
'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.6/lunr.min',
'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min',
'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min',
}
});
////////////////////////////////////////////////////////////////////////////////
require(['jquery', 'lunr', 'lodash'], function($, lunr, _) {
$(document).ready(function() {
// parseUri 1.2.2
// (c) Steven Levithan <stevenlevithan.com>
// MIT License
function parseUri (str) {
var o = parseUri.options,
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
uri = {},
i = 14;
while (i--) uri[o.key[i]] = m[i] || "";
uri[o.q.name] = {};
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
if ($1) uri[o.q.name][$1] = $2;
});
return uri;
};
parseUri.options = {
strictMode: false,
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
q: {
name: "queryKey",
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
},
parser: {
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}
};
$("#search-form").submit(function(e) {
e.preventDefault()
})
// list below is the lunr 2.1.3 list minus the intersect with names(Base)
// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with)
// ideally we'd just filter the original list but it's not available as a variable
lunr.stopWordFilter = lunr.generateStopWordFilter([
'a',
'able',
'about',
'across',
'after',
'almost',
'also',
'am',
'among',
'an',
'and',
'are',
'as',
'at',
'be',
'because',
'been',
'but',
'by',
'can',
'cannot',
'could',
'dear',
'did',
'does',
'either',
'ever',
'every',
'from',
'got',
'had',
'has',
'have',
'he',
'her',
'hers',
'him',
'his',
'how',
'however',
'i',
'if',
'into',
'it',
'its',
'just',
'least',
'like',
'likely',
'may',
'me',
'might',
'most',
'must',
'my',
'neither',
'no',
'nor',
'not',
'of',
'off',
'often',
'on',
'or',
'other',
'our',
'own',
'rather',
'said',
'say',
'says',
'she',
'should',
'since',
'so',
'some',
'than',
'that',
'the',
'their',
'them',
'then',
'there',
'these',
'they',
'this',
'tis',
'to',
'too',
'twas',
'us',
'wants',
'was',
'we',
'were',
'what',
'when',
'who',
'whom',
'why',
'will',
'would',
'yet',
'you',
'your'
])
// add . as a separator, because otherwise "title": "Documenter.Anchors.add!"
// would not find anything if searching for "add!", only for the entire qualification
lunr.tokenizer.separator = /[\s\-\.]+/
// custom trimmer that doesn't strip @ and !, which are used in julia macro and function names
lunr.trimmer = function (token) {
return token.update(function (s) {
return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '')
})
}
lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter')
lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer')
var index = lunr(function () {
this.ref('location')
this.field('title',{boost: 100})
this.field('text')
documenterSearchIndex['docs'].forEach(function(e) {
this.add(e)
}, this)
})
var store = {}
documenterSearchIndex['docs'].forEach(function(e) {
store[e.location] = {title: e.title, category: e.category}
})
$(function(){
searchresults = $('#documenter-search-results');
searchinfo = $('#documenter-search-info');
searchbox = $('#documenter-search-query');
function update_search(querystring) {
tokens = lunr.tokenizer(querystring)
results = index.query(function (q) {
tokens.forEach(function (t) {
q.term(t.toString(), {
fields: ["title"],
boost: 100,
usePipeline: true,
editDistance: 0,
wildcard: lunr.Query.wildcard.NONE
})
q.term(t.toString(), {
fields: ["title"],
boost: 10,
usePipeline: true,
editDistance: 2,
wildcard: lunr.Query.wildcard.NONE
})
q.term(t.toString(), {
fields: ["text"],
boost: 1,
usePipeline: true,
editDistance: 0,
wildcard: lunr.Query.wildcard.NONE
})
})
})
searchinfo.text("Number of results: " + results.length)
searchresults.empty()
results.forEach(function(result) {
data = store[result.ref]
link = $('<a class="docs-label">'+data.title+'</a>')
link.attr('href', documenterBaseURL+'/'+result.ref)
cat = $('<span class="docs-category">('+data.category+')</span>')
li = $('<li>').append(link).append(" ").append(cat)
searchresults.append(li)
})
}
function update_search_box() {
querystring = searchbox.val()
update_search(querystring)
}
searchbox.keyup(_.debounce(update_search_box, 250))
searchbox.change(update_search_box)
search_query_uri = parseUri(window.location).queryKey["q"]
if(search_query_uri !== undefined) {
search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20'))
searchbox.val(search_query)
}
update_search_box();
})
})
})

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
// Small function to quickly swap out themes. Gets put into the <head> tag..
function set_theme_from_local_storage() {
// Browser does not support Web Storage, bail early.
if(typeof(window.localStorage) === "undefined") return;
// Get the user-picked theme from localStorage. May be `null`, which means the default
// theme.
var theme = window.localStorage.getItem("documenter-theme");
// Initialize a few variables for the loop:
//
// - active: will contain the index of the theme that should be active. Note that there
// is no guarantee that localStorage contains sane values. If `active` stays `null`
// we either could not find the theme or it is the default (primary) theme anyway.
// Either way, we then need to stick to the primary theme.
//
// - disabled: style sheets that should be disabled (i.e. all the theme style sheets
// that are not the currently active theme)
var active = null; var disabled = [];
for (var i = 0; i < document.styleSheets.length; i++) {
var ss = document.styleSheets[i];
// The <link> tag of each style sheet is expected to have a data-theme-name attribute
// which must contain the name of the theme. The names in localStorage much match this.
var themename = ss.ownerNode.getAttribute("data-theme-name");
// attribute not set => non-theme stylesheet => ignore
if(themename === null) continue;
// To distinguish the default (primary) theme, it needs to have the data-theme-primary
// attribute set.
var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null);
// If we find a matching theme (and it's not the default), we'll set active to non-null
if(!isprimary && themename === theme) active = i;
// Store the style sheets of inactive themes so that we could disable them
if(themename !== theme) disabled.push(ss);
}
if(active !== null) {
// If we did find an active theme, we'll (1) add the theme--$(theme) class to <html>
document.getElementsByTagName('html')[0].className = "theme--" + theme;
// and (2) disable all the other theme stylesheets
disabled.forEach(function(ss){
ss.disabled = true;
});
}
}
set_theme_from_local_storage();

135
v0.7.5/developer/index.html Normal file

File diff suppressed because one or more lines are too long

2
v0.7.5/index.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
v0.7.5/search/index.html Normal file
View File

@ -0,0 +1,2 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Search · PkgTemplates.jl</title><link rel="canonical" href="https://invenia.github.io/PkgTemplates.jl/search/"/><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit">PkgTemplates.jl</span></div><form class="docs-search" action><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../user/">User Guide</a></li><li><a class="tocitem" href="../developer/">Developer Guide</a></li><li><a class="tocitem" href="../migrating/">Migrating To PkgTemplates 0.7+</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Search</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Search</a></li></ul></nav><div class="docs-right"><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article><p id="documenter-search-info">Loading search...</p><ul id="documenter-search-results"></ul></article></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Thursday 18 June 2020 00:26">Thursday 18 June 2020</span>. Using Julia version 1.4.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><script src="../search_index.js"></script><script src="../assets/search.js"></script></html>

3
v0.7.5/search_index.js Normal file

File diff suppressed because one or more lines are too long

1
v0.7.5/siteinfo.js Normal file
View File

@ -0,0 +1 @@
var DOCUMENTER_CURRENT_VERSION = "v0.7.5";

152
v0.7.5/user/index.html Normal file
View File

@ -0,0 +1,152 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>User Guide · PkgTemplates.jl</title><link rel="canonical" href="https://invenia.github.io/PkgTemplates.jl/user/"/><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit">PkgTemplates.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>User Guide</a><ul class="internal"><li><a class="tocitem" href="#Template-1"><span>Template</span></a></li><li><a class="tocitem" href="#Plugins-1"><span>Plugins</span></a></li><li><a class="tocitem" href="#A-More-Complicated-Example-1"><span>A More Complicated Example</span></a></li><li><a class="tocitem" href="#Custom-Template-Files-1"><span>Custom Template Files</span></a></li><li><a class="tocitem" href="#Extending-Existing-Plugins-1"><span>Extending Existing Plugins</span></a></li><li><a class="tocitem" href="#Saving-Templates-1"><span>Saving Templates</span></a></li></ul></li><li><a class="tocitem" href="../developer/">Developer Guide</a></li><li><a class="tocitem" href="../migrating/">Migrating To PkgTemplates 0.7+</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>User Guide</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>User Guide</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/invenia/PkgTemplates.jl/blob/master/docs/src/user.md#L" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="PkgTemplates-User-Guide-1"><a class="docs-heading-anchor" href="#PkgTemplates-User-Guide-1">PkgTemplates User Guide</a><a class="docs-heading-anchor-permalink" href="#PkgTemplates-User-Guide-1" title="Permalink"></a></h1><ul><li><a href="#PkgTemplates-User-Guide-1">PkgTemplates User Guide</a></li><ul><li><a href="#Template-1">Template</a></li><li><a href="#Plugins-1">Plugins</a></li><li><a href="#A-More-Complicated-Example-1">A More Complicated Example</a></li><li><a href="#Custom-Template-Files-1">Custom Template Files</a></li><li><a href="#Extending-Existing-Plugins-1">Extending Existing Plugins</a></li><li><a href="#Saving-Templates-1">Saving Templates</a></li></ul></ul><p>Using PkgTemplates is straightforward. Just create a <a href="#PkgTemplates.Template"><code>Template</code></a>, and call it on a package name to generate that package:</p><pre><code class="language-julia">using PkgTemplates
t = Template()
t(&quot;MyPkg&quot;)</code></pre><h2 id="Template-1"><a class="docs-heading-anchor" href="#Template-1">Template</a><a class="docs-heading-anchor-permalink" href="#Template-1" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Template" href="#PkgTemplates.Template"><code>PkgTemplates.Template</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Template(; kwargs...)</code></pre><p>A configuration used to generate packages.</p><p><strong>Keyword Arguments</strong></p><p><strong>User Options</strong></p><ul><li><code>user::AbstractString=&quot;username&quot;</code>: GitHub (or other code hosting service) username. The default value comes from the global Git config (<code>github.user</code>). If no value is obtained, many plugins that use this value will not work.</li><li><code>authors::Union{AbstractString, Vector{&lt;:AbstractString}}=&quot;name &lt;email&gt; and contributors&quot;</code>: Package authors. Like <code>user</code>, it takes its default value from the global Git config (<code>user.name</code> and <code>user.email</code>).</li></ul><p><strong>Package Options</strong></p><ul><li><code>dir::AbstractString=&quot;~/.julia/dev&quot;</code>: Directory to place packages in.</li><li><code>host::AbstractString=&quot;github.com&quot;</code>: URL to the code hosting service where packages will reside.</li><li><code>julia::VersionNumber=v&quot;1.0.0&quot;</code>: Minimum allowed Julia version.</li></ul><p><strong>Template Plugins</strong></p><ul><li><code>plugins::Vector{&lt;:Plugin}=Plugin[]</code>: A list of <a href="../developer/#PkgTemplates.Plugin"><code>Plugin</code></a>s used by the template. The default plugins are <a href="#PkgTemplates.ProjectFile"><code>ProjectFile</code></a>, <a href="#PkgTemplates.SrcDir"><code>SrcDir</code></a>, <a href="#PkgTemplates.Tests"><code>Tests</code></a>, <a href="#PkgTemplates.Readme"><code>Readme</code></a>, <a href="#PkgTemplates.License"><code>License</code></a>, <a href="#PkgTemplates.Git"><code>Git</code></a>, <a href="#PkgTemplates.CompatHelper"><code>CompatHelper</code></a>, and <a href="#PkgTemplates.TagBot"><code>TagBot</code></a>. To disable a default plugin, pass in the negated type: <code>!PluginType</code>. To override a default plugin instead of disabling it, pass in your own instance.</li></ul><p><strong>Interactive Mode</strong></p><ul><li><code>interactive::Bool=false</code>: In addition to specifying the template options with keywords, you can also build up a template by following a set of prompts. To create a template interactively, set this keyword to <code>true</code>. See also the similar <a href="#PkgTemplates.generate"><code>generate</code></a> function.</li></ul><hr/><p>To create a package from a <code>Template</code>, use the following syntax:</p><pre><code class="language-julia">julia&gt; t = Template();
julia&gt; t(&quot;PkgName&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/template.jl#LL28-L71">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.generate" href="#PkgTemplates.generate"><code>PkgTemplates.generate</code></a><span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">generate([pkg::AbstractString]) -&gt; Template</code></pre><p>Shortcut for <code>Template(; interactive=true)(pkg)</code>. If no package name is supplied, you will be prompted for one.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/interactive.jl#LL1-L6">source</a></section></article><h2 id="Plugins-1"><a class="docs-heading-anchor" href="#Plugins-1">Plugins</a><a class="docs-heading-anchor-permalink" href="#Plugins-1" title="Permalink"></a></h2><p>Plugins add functionality to <code>Template</code>s. There are a number of plugins available to automate common boilerplate tasks.</p><h3 id="Default-Plugins-1"><a class="docs-heading-anchor" href="#Default-Plugins-1">Default Plugins</a><a class="docs-heading-anchor-permalink" href="#Default-Plugins-1" title="Permalink"></a></h3><p>These plugins are included by default. They can be overridden by supplying another value, or disabled by negating the type (<code>!Type</code>), both as elements of the <code>plugins</code> keyword.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.ProjectFile" href="#PkgTemplates.ProjectFile"><code>PkgTemplates.ProjectFile</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">ProjectFile(; version=v&quot;0.1.0&quot;)</code></pre><p>Creates a <code>Project.toml</code>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>version::VersionNumber</code>: The initial version of created packages.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.SrcDir" href="#PkgTemplates.SrcDir"><code>PkgTemplates.SrcDir</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">SrcDir(; file=&quot;~/build/invenia/PkgTemplates.jl/templates/src/module.jl&quot;)</code></pre><p>Creates a module entrypoint.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>src/&lt;module&gt;.jl</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Tests" href="#PkgTemplates.Tests"><code>PkgTemplates.Tests</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Tests(; file=&quot;~/build/invenia/PkgTemplates.jl/templates/test/runtests.jl&quot;, project=false)</code></pre><p>Sets up testing for packages.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>runtests.jl</code>.</li><li><code>project::Bool</code>: Whether or not to create a new project for tests (<code>test/Project.toml</code>). See <a href="https://julialang.github.io/Pkg.jl/v1/creating-packages/#Test-specific-dependencies-in-Julia-1.2-and-above-1">here</a> for more details.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Managing test dependencies with <code>test/Project.toml</code> is only supported in Julia 1.2 and later.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Readme" href="#PkgTemplates.Readme"><code>PkgTemplates.Readme</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Readme(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/README.md&quot;,
destination=&quot;README.md&quot;,
inline_badges=false,
)</code></pre><p>Creates a <code>README</code> file that contains badges for other included plugins.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the <code>README</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, values of <code>&quot;README&quot;</code> or <code>&quot;README.rst&quot;</code> might be desired.</li><li><code>inline_badges::Bool</code>: Whether or not to put the badges on the same line as the package name.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.License" href="#PkgTemplates.License"><code>PkgTemplates.License</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">License(; name=&quot;MIT&quot;, path=nothing, destination=&quot;LICENSE&quot;)</code></pre><p>Creates a license file.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>name::AbstractString</code>: Name of a license supported by PkgTemplates. Available licenses can be seen <a href="https://github.com/invenia/PkgTemplates.jl/tree/master/templates/licenses">here</a>.</li><li><code>path::Union{AbstractString, Nothing}</code>: Path to a custom license file. This keyword takes priority over <code>name</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, <code>&quot;LICENSE.md&quot;</code> might be desired.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/plugins/license.jl#LL1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Git" href="#PkgTemplates.Git"><code>PkgTemplates.Git</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Git(;
ignore=String[],
name=nothing,
email=nothing,
branch=nothing,
ssh=false,
jl=true,
manifest=false,
gpgsign=false,
)</code></pre><p>Creates a Git repository and a <code>.gitignore</code> file.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>ignore::Vector{&lt;:AbstractString}</code>: Patterns to add to the <code>.gitignore</code>. See also: <a href="../developer/#PkgTemplates.gitignore"><code>gitignore</code></a>.</li><li><code>name::AbstractString</code>: Your real name, if you have not set <code>user.name</code> with Git.</li><li><code>email::AbstractString</code>: Your email address, if you have not set <code>user.email</code> with Git.</li><li><code>branch::AbstractString</code>: The desired name of the repository&#39;s default branch.</li><li><code>ssh::Bool</code>: Whether or not to use SSH for the remote. If left unset, HTTPS is used.</li><li><code>jl::Bool</code>: Whether or not to add a <code>.jl</code> suffix to the remote URL.</li><li><code>manifest::Bool</code>: Whether or not to commit <code>Manifest.toml</code>.</li><li><code>gpgsign::Bool</code>: Whether or not to sign commits with your GPG key. This option requires that the Git CLI is installed, and for you to have a GPG key associated with your committer identity.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L27">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.CompatHelper" href="#PkgTemplates.CompatHelper"><code>PkgTemplates.CompatHelper</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">CompatHelper(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/github/workflows/CompatHelper.yml&quot;,
destination=&quot;CompatHelper.yml&quot;,
cron=&quot;0 0 * * *&quot;,
)</code></pre><p>Integrates your packages with <a href="https://github.com/bcbi/CompatHelper.jl">CompatHelper</a> via GitHub Actions.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the workflow file.</li><li><code>destination::AbstractString</code>: Destination of the workflow file, relative to <code>.github/workflows</code>.</li><li><code>cron::AbstractString</code>: Cron expression for the schedule interval.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.TagBot" href="#PkgTemplates.TagBot"><code>PkgTemplates.TagBot</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">TagBot(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/github/workflows/TagBot.yml&quot;,
destination=&quot;TagBot.yml&quot;,
cron=&quot;0 0 * * *&quot;,
token=Secret(&quot;GITHUB_TOKEN&quot;),
ssh=nothing,
ssh_password=nothing,
changelog=nothing,
changelog_ignore=nothing,
gpg=nothing,
gpg_password=nothing,
registry=nothing,
branches=nothing,
dispatch=nothing,
dispatch_delay=nothing,
)</code></pre><p>Adds GitHub release support via <a href="https://github.com/JuliaRegistries/TagBot">TagBot</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the workflow file.</li><li><code>destination::AbstractString</code>: Destination of the workflow file, relative to <code>.github/workflows</code>.</li><li><code>cron::AbstractString</code>: Cron expression for the schedule interval.</li><li><code>token::Secret</code>: Name of the token secret to use.</li><li><code>ssh::Secret</code>: Name of the SSH private key secret to use.</li><li><code>ssh_password::Secret</code>: Name of the SSH key password secret to use.</li><li><code>changelog::AbstractString</code>: Custom changelog template.</li><li><code>changelog_ignore::Vector{&lt;:AbstractString}</code>: Issue/pull request labels to ignore in the changelog.</li><li><code>gpg::Secret</code>: Name of the GPG private key secret to use.</li><li><code>gpg_password::Secret</code>: Name of the GPG private key password secret to use.</li><li><code>registry::AbstractString</code>: Custom registry, in the format <code>owner/repo</code>.</li><li><code>branches::Bool</code>: Whether not to enable the <code>branches</code> option.</li><li><code>dispatch::Bool</code>: Whether or not to enable the <code>dispatch</code> option.</li><li><code>dispatch_delay::Int</code>: Number of minutes to delay for dispatch events.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L35">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Secret" href="#PkgTemplates.Secret"><code>PkgTemplates.Secret</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Secret(name::AbstractString)</code></pre><p>Represents a GitHub repository secret. When converted to a string, yields <code>${{ secrets.&lt;name&gt; }}</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/plugin.jl#LL87-L92">source</a></section></article><h3 id="Continuous-Integration-(CI)-1"><a class="docs-heading-anchor" href="#Continuous-Integration-(CI)-1">Continuous Integration (CI)</a><a class="docs-heading-anchor-permalink" href="#Continuous-Integration-(CI)-1" title="Permalink"></a></h3><p>These plugins will create the configuration files of common CI services for you.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.AppVeyor" href="#PkgTemplates.AppVeyor"><code>PkgTemplates.AppVeyor</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">AppVeyor(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/appveyor.yml&quot;,
x86=false,
coverage=true,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;, &quot;nightly&quot;],
)</code></pre><p>Integrates your packages with <a href="https://appveyor.com">AppVeyor</a> via <a href="https://github.com/JuliaCI/Appveyor.jl">AppVeyor.jl</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.appveyor.yml</code>.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit systems, in addition to the default 64-bit builds.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L18">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.CirrusCI" href="#PkgTemplates.CirrusCI"><code>PkgTemplates.CirrusCI</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">CirrusCI(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/cirrus.yml&quot;,
image=&quot;freebsd-12-0-release-amd64&quot;,
coverage=true,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;, &quot;nightly&quot;],
)</code></pre><p>Integrates your packages with <a href="https://cirrus-ci.org">Cirrus CI</a> via <a href="https://github.com/ararslan/CirrusCI.jl">CirrusCI.jl</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.cirrus.yml</code>.</li><li><code>image::AbstractString</code>: The FreeBSD image to be used.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Code coverage submission from Cirrus CI is not yet supported by <a href="https://github.com/JuliaCI/Coverage.jl">Coverage.jl</a>.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L21">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.DroneCI" href="#PkgTemplates.DroneCI"><code>PkgTemplates.DroneCI</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">DroneCI(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/drone.star&quot;,
amd64=true,
arm=false,
arm64=false,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;],
)</code></pre><p>Integrates your packages with <a href="https://drone.io">Drone CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.drone.star</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, you might want to generate a <code>.drone.yml</code> instead of the default Starlark file.</li><li><code>amd64::Bool</code>: Whether or not to run builds on AMD64.</li><li><code>arm::Bool</code>: Whether or not to run builds on ARM (32-bit).</li><li><code>arm64::Bool</code>: Whether or not to run builds on ARM64.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Nightly Julia is not supported.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.GitHubActions" href="#PkgTemplates.GitHubActions"><code>PkgTemplates.GitHubActions</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GitHubActions(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/github/workflows/ci.yml&quot;,
destination=&quot;ci.yml&quot;,
linux=true,
osx=true,
windows=true,
x64=true,
x86=false,
coverage=true,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;, &quot;nightly&quot;],
)</code></pre><p>Integrates your packages with <a href="https://github.com/features/actions">GitHub Actions</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the workflow file.</li><li><code>destination::AbstractString</code>: Destination of the workflow file, relative to <code>.github/workflows</code>.</li><li><code>linux::Bool</code>: Whether or not to run builds on Linux.</li><li><code>osx::Bool</code>: Whether or not to run builds on OSX (MacOS).</li><li><code>windows::Bool</code>: Whether or not to run builds on Windows.</li><li><code>x64::Bool</code>: Whether or not to run builds on 64-bit architecture.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit architecture.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. Another code coverage plugin such as <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>If using coverage plugins, don&#39;t forget to manually add your API tokens as secrets, as described <a href="https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#creating-encrypted-secrets">here</a>.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L31">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.GitLabCI" href="#PkgTemplates.GitLabCI"><code>PkgTemplates.GitLabCI</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GitLabCI(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/gitlab-ci.yml&quot;,
coverage=true,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;],
)</code></pre><p>Integrates your packages with <a href="https://docs.gitlab.com/ce/ci">GitLab CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.gitlab-ci.yml</code>.</li><li><code>coverage::Bool</code>: Whether or not to compute code coverage.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><p><strong>GitLab Pages</strong></p><p>Documentation can be generated by including a <code>Documenter{GitLabCI}</code> plugin. See <a href="#PkgTemplates.Documenter"><code>Documenter</code></a> for more information.</p><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Nightly Julia is not supported.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.TravisCI" href="#PkgTemplates.TravisCI"><code>PkgTemplates.TravisCI</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">TravisCI(;
file=&quot;~/build/invenia/PkgTemplates.jl/templates/travis.yml&quot;,
linux=true,
osx=true,
windows=true,
x64=true,
x86=false,
arm64=false,
coverage=true,
extra_versions=[&quot;1.0&quot;, &quot;1.4&quot;, &quot;nightly&quot;],
)</code></pre><p>Integrates your packages with <a href="https://travis-ci.com">Travis CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.travis.yml</code>.</li><li><code>linux::Bool</code>: Whether or not to run builds on Linux.</li><li><code>osx::Bool</code>: Whether or not to run builds on OSX (MacOS).</li><li><code>windows::Bool</code>: Whether or not to run builds on Windows.</li><li><code>x64::Bool</code>: Whether or not to run builds on 64-bit architecture.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit architecture.</li><li><code>arm64::Bool</code>: Whether or not to run builds on the ARM64 architecture.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. Another code coverage plugin such as <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L26">source</a></section></article><h3 id="Code-Coverage-1"><a class="docs-heading-anchor" href="#Code-Coverage-1">Code Coverage</a><a class="docs-heading-anchor-permalink" href="#Code-Coverage-1" title="Permalink"></a></h3><p>These plugins will enable code coverage reporting from CI.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Codecov" href="#PkgTemplates.Codecov"><code>PkgTemplates.Codecov</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Codecov(; file=nothing)</code></pre><p>Sets up code coverage submission from CI to <a href="https://codecov.io">Codecov</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::Union{AbstractString, Nothing}</code>: Template file for <code>.codecov.yml</code>, or <code>nothing</code> to create no file.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Coveralls" href="#PkgTemplates.Coveralls"><code>PkgTemplates.Coveralls</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Coveralls(; file=nothing)</code></pre><p>Sets up code coverage submission from CI to <a href="https://coveralls.io">Coveralls</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::Union{AbstractString, Nothing}</code>: Template file for <code>.coveralls.yml</code>, or <code>nothing</code> to create no file.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L8">source</a></section></article><h3 id="Documentation-1"><a class="docs-heading-anchor" href="#Documentation-1">Documentation</a><a class="docs-heading-anchor-permalink" href="#Documentation-1" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Documenter" href="#PkgTemplates.Documenter"><code>PkgTemplates.Documenter</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Documenter{T&lt;:Union{TravisCI, GitLabCI, GitHubActions, NoDeploy}}(;
make_jl=&quot;~/build/invenia/PkgTemplates.jl/templates/docs/make.jl&quot;,
index_md=&quot;~/build/invenia/PkgTemplates.jl/templates/docs/src/index.md&quot;,
assets=String[],
canonical_url=make_canonical(T),
makedocs_kwargs=Dict{Symbol, Any}(),
)</code></pre><p>Sets up documentation generation via <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a>. Documentation deployment depends on <code>T</code>, where <code>T</code> is some supported CI plugin, or <code>Nothing</code> to only support local documentation builds.</p><p><strong>Supported Type Parameters</strong></p><ul><li><code>GitHubActions</code>: Deploys documentation to <a href="https://pages.github.com">GitHub Pages</a> with the help of <a href="#PkgTemplates.GitHubActions"><code>GitHubActions</code></a>.</li><li><code>TravisCI</code>: Deploys documentation to <a href="https://pages.github.com">GitHub Pages</a> with the help of <a href="#PkgTemplates.TravisCI"><code>TravisCI</code></a>.</li><li><code>GitLabCI</code>: Deploys documentation to <a href="https://pages.gitlab.com">GitLab Pages</a> with the help of <a href="#PkgTemplates.GitLabCI"><code>GitLabCI</code></a>.</li><li><code>NoDeploy</code> (default): Does not set up documentation deployment.</li></ul><p><strong>Keyword Arguments</strong></p><ul><li><code>make_jl::AbstractString</code>: Template file for <code>make.jl</code>.</li><li><code>index_md::AbstractString</code>: Template file for <code>index.md</code>.</li><li><code>assets::Vector{&lt;:AbstractString}</code>: Extra assets for the generated site.</li><li><code>canonical_url::Union{Function, Nothing}</code>: A function to generate the site&#39;s canonical URL. The default value will compute GitHub Pages and GitLab Pages URLs for <a href="#PkgTemplates.TravisCI"><code>TravisCI</code></a> and <a href="#PkgTemplates.GitLabCI"><code>GitLabCI</code></a>, respectively. If set to <code>nothing</code>, no canonical URL is set.</li><li><code>makedocs_kwargs::Dict{Symbol}</code>: Extra keyword arguments to be inserted into <code>makedocs</code>.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>If deploying documentation with Travis CI, don&#39;t forget to complete <a href="https://juliadocs.github.io/Documenter.jl/stable/man/hosting/#SSH-Deploy-Keys-1">the required configuration</a>.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/plugins/documenter.jl#LL10-L45">source</a></section></article><h3 id="Miscellaneous-1"><a class="docs-heading-anchor" href="#Miscellaneous-1">Miscellaneous</a><a class="docs-heading-anchor-permalink" href="#Miscellaneous-1" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Develop" href="#PkgTemplates.Develop"><code>PkgTemplates.Develop</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Develop()</code></pre><p>Adds generated packages to the current environment by <code>dev</code>ing them. See the Pkg documentation <a href="https://julialang.github.io/Pkg.jl/v1/managing-packages/#Developing-packages-1">here</a> for more details.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/plugins/develop.jl#LL1-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Citation" href="#PkgTemplates.Citation"><code>PkgTemplates.Citation</code></a><span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Citation(; file=&quot;~/build/invenia/PkgTemplates.jl/templates/CITATION.bib&quot;, readme=false)</code></pre><p>Creates a <code>CITATION.bib</code> file for citing package repositories.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>CITATION.bib</code>.</li><li><code>readme::Bool</code>: Whether or not to include a section about citing in the README.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/44fa15b1502a45eac76c9017af94332d4557b251/base/#L0-L8">source</a></section></article><h2 id="A-More-Complicated-Example-1"><a class="docs-heading-anchor" href="#A-More-Complicated-Example-1">A More Complicated Example</a><a class="docs-heading-anchor-permalink" href="#A-More-Complicated-Example-1" title="Permalink"></a></h2><p>Here are a few example templates that use the options and plugins explained above.</p><p>This one includes plugins suitable for a project hosted on GitHub, and some other customizations:</p><pre><code class="language-julia">Template(;
user=&quot;my-username&quot;,
dir=&quot;~/code&quot;,
authors=&quot;Acme Corp&quot;,
julia=v&quot;1.1&quot;,
plugins=[
License(; name=&quot;MPL&quot;),
Git(; manifest=true, ssh=true),
GitHubActions(; x86=true),
Codecov(),
Documenter{GitHubActions}(),
Develop(),
],
)</code></pre><p>Here&#39;s one that works well for projects hosted on GitLab:</p><pre><code class="language-julia">Template(;
user=&quot;my-username&quot;,
host=&quot;gitlab.com&quot;,
plugins=[
GitLabCI(),
Documenter{GitLabCI}(),
],
)</code></pre><h2 id="Custom-Template-Files-1"><a class="docs-heading-anchor" href="#Custom-Template-Files-1">Custom Template Files</a><a class="docs-heading-anchor-permalink" href="#Custom-Template-Files-1" title="Permalink"></a></h2><div class="admonition is-info"><header class="admonition-header">Templates vs Templating</header><div class="admonition-body"><p>This documentation refers plenty to <a href="#PkgTemplates.Template"><code>Template</code></a>s, the package&#39;s main type, but it also refers to &quot;template files&quot; and &quot;text templating&quot;, which are plaintext files with placeholders to be filled with data, and the technique of filling those placeholders with data, respectively.</p><p>These concepts should be familiar if you&#39;ve used <a href="https://palletsprojects.com/p/jinja">Jinja</a> or <a href="https://mustache.github.io">Mustache</a> (Mustache is the particular flavour used by PkgTemplates, via <a href="https://github.com/jverzani/Mustache.jl">Mustache.jl</a>). Please keep the difference between these two things in mind!</p></div></div><p>Many plugins support a <code>file</code> argument or similar, which sets the path to the template file to be used for generating files. Each plugin has a sensible default that should make sense for most people, but you might have a specialized workflow that requires a totally different template file.</p><p>If that&#39;s the case, a basic understanding of <a href="https://mustache.github.io">Mustache</a>&#39;s syntax is required. Here&#39;s an example template file:</p><pre><code class="language-none">Hello, {{{name}}}.
{{#weather}}
It&#39;s {{{weather}}} outside.
{{/weather}}
{{^weather}}
I don&#39;t know what the weather outside is.
{{/weather}}
{{#has_things}}
I have the following things:
{{/has_things}}
{{#things}}
- Here&#39;s a thing: {{{.}}}
{{/things}}
{{#people}}
- {{{name}}} is {{{mood}}}
{{/people}}</code></pre><p>In the first section, <code>name</code> is a key, and its value replaces <code>{{{name}}}</code>.</p><p>In the second section, <code>weather</code>&#39;s value may or may not exist. If it does exist, then &quot;It&#39;s weather outside&quot; is printed. Otherwise, &quot;I don&#39;t know what the weather outside is&quot; is printed. Mustache uses a notion of &quot;truthiness&quot; similar to Python or JavaScript, where values of <code>nothing</code>, <code>false</code>, or empty collections are all considered to not exist.</p><p>In the third section, <code>has_things</code>&#39; value is printed if it&#39;s truthy. Then, if the <code>things</code> list is truthy (i.e. not empty), its values are each printed on their own line. The reason that we have two separate keys is that <code>{{#things}}</code> iterates over the whole <code>things</code> list, even when there are no <code>{{{.}}}</code> placeholders, which would duplicate &quot;I have the following things:&quot; <code>n</code> times.</p><p>The fourth section iterates over the <code>people</code> list, but instead of using the <code>{{{.}}}</code> placeholder, we have <code>name</code> and <code>mood</code>, which are keys or fields of the list elements. Most types are supported here, including <code>Dict</code>s and structs. <code>NamedTuple</code>s require you to use <code>{{{:name}}}</code> instead of the normal <code>{{{name}}}</code>, though.</p><p>You might notice that some curlies are in groups of two (<code>{{key}}</code>), and some are in groups of three (<code>{{{key}}}</code>). Whenever we want to subtitute in a value, using the triple curlies disables HTML escaping, which we rarely want for the types of files we&#39;re creating. If you do want escaping, just use the double curlies. And if you&#39;re using different delimiters, for example <code>&lt;&lt;foo&gt;&gt;</code>, use <code>&lt;&lt;&amp;foo&gt;&gt;</code> to disable escaping.</p><p>Assuming the following view:</p><pre><code class="language-julia">struct Person; name::String; mood::String; end
things = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]
view = Dict(
&quot;name&quot; =&gt; &quot;Chris&quot;,
&quot;weather&quot; =&gt; &quot;sunny&quot;,
&quot;has_things&quot; =&gt; !isempty(things),
&quot;things&quot; =&gt; things,
&quot;people&quot; =&gt; [Person(&quot;John&quot;, &quot;happy&quot;), Person(&quot;Jane&quot;, &quot;sad&quot;)],
)</code></pre><p>Our example template would produce this:</p><pre><code class="language-none">Hello, Chris.
It&#39;s sunny outside.
I have the following things:
- Here&#39;s a thing: a
- Here&#39;s a thing: b
- Here&#39;s a thing: c
- John is happy
- Jane is sad</code></pre><h2 id="Extending-Existing-Plugins-1"><a class="docs-heading-anchor" href="#Extending-Existing-Plugins-1">Extending Existing Plugins</a><a class="docs-heading-anchor-permalink" href="#Extending-Existing-Plugins-1" title="Permalink"></a></h2><p>Most of the existing plugins generate a file from a template file. If you want to use custom template files, you may run into situations where the data passed into the templating engine is not sufficient. In this case, you can look into implementing <a href="#PkgTemplates.user_view"><code>user_view</code></a> to supply whatever data is necessary for your use case.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.user_view" href="#PkgTemplates.user_view"><code>PkgTemplates.user_view</code></a><span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">user_view(::Plugin, ::Template, pkg::AbstractString) -&gt; Dict{String, Any}</code></pre><p>The same as <a href="../developer/#PkgTemplates.view"><code>view</code></a>, but for use by package <em>users</em> for extension.</p><p>Values returned by this function will override those from <a href="../developer/#PkgTemplates.view"><code>view</code></a> when the keys are the same.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/52bac95d66895ff9b60fd3ea1e5e37ca04847835/src/plugin.jl#LL127-L134">source</a></section></article><p>For example, suppose you were using the <a href="#PkgTemplates.Readme"><code>Readme</code></a> plugin with a custom template file that looked like this:</p><pre><code class="language-md"># {{PKG}}
Created on *{{TODAY}}*.</code></pre><p>The <a href="../developer/#PkgTemplates.view"><code>view</code></a> function supplies a value for <code>PKG</code>, but it does not supply a value for <code>TODAY</code>. Rather than override <a href="../developer/#PkgTemplates.view"><code>view</code></a>, we can implement this function to get both the default values and whatever else we need to add.</p><pre><code class="language-julia">user_view(::Readme, ::Template, ::AbstractString) = Dict(&quot;TODAY&quot; =&gt; today())</code></pre><h2 id="Saving-Templates-1"><a class="docs-heading-anchor" href="#Saving-Templates-1">Saving Templates</a><a class="docs-heading-anchor-permalink" href="#Saving-Templates-1" title="Permalink"></a></h2><p>One of the main reasons for PkgTemplates&#39; existence is for new packages to be consistent. This means using the same template more than once, so we want a way to save a template to be used later.</p><p>Here&#39;s my recommendation for loading a template whenever it&#39;s needed:</p><pre><code class="language-julia">function template()
@eval using PkgTemplates
Template(; #= ... =#)
end</code></pre><p>Add this to your <code>startup.jl</code>, and you can create your template from anywhere, without incurring any startup cost.</p><p>Another strategy is to write the string representation of the template to a Julia file:</p><pre><code class="language-julia">const t = Template(; #= ... =#)
open(&quot;template.jl&quot;, &quot;w&quot;) do io
println(io, &quot;using PkgTemplates&quot;)
sprint(show, io, t)
end</code></pre><p>Then the template is just an <code>include</code> away:</p><pre><code class="language-julia">const t = include(&quot;template.jl&quot;)</code></pre><p>The only disadvantage to this approach is that the saved template is much less human-readable than code you wrote yourself.</p><p>One more method of saving templates is to simply use the Serialization package in the standard library:</p><pre><code class="language-julia">const t = Template(; #= ... =#)
using Serialization
open(io -&gt; serialize(io, t), &quot;template.bin&quot;, &quot;w&quot;)</code></pre><p>Then simply <code>deserialize</code> to load:</p><pre><code class="language-julia">using Serialization
const t = open(deserialize, &quot;template.bin&quot;)</code></pre><p>This approach has the same disadvantage as the previous one, and the serialization format is not guaranteed to be stable across Julia versions.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../developer/">Developer Guide »</a></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Thursday 18 June 2020 00:26">Thursday 18 June 2020</span>. Using Julia version 1.4.2.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>