Package: bas-style-kit-jinja-templates
BAS Style Kit Jinja TemplatesA set ofJinja2templates implementing theBAS Style Kit.InstallationPip packageThe recommended way to install these templates is via its PyPi package,bas-style-kit-jekyll-templates.Note:Since version 0.7.0, this package requires Jinja 3.0 or greater for compatibility with Flask 2.0.UsageQuickstartFor a typical Flask application add this wherever your Flask application is defined:fromflaskimportFlask,render_templatefromjinja2importPrefixLoader,PackageLoader,FileSystemLoaderfrombas_style_kit_jinja_templatesimportBskTemplatesapp=Flask(__name__)app.jinja_loader=PrefixLoader({'app':FileSystemLoader('templates'),'bas_style_kit':PackageLoader('bas_style_kit_jinja_templates'),})app.config['BSK_TEMPLATES']=BskTemplates()# Required/recommended settingsapp.config['BSK_TEMPLATES'].site_title='Example service'app.config['BSK_TEMPLATES'].site_description='Service to act as an example'app.config['BSK_TEMPLATES'].bsk_site_nav_brand_text='Example service'app.config['BSK_TEMPLATES'].bsk_site_development_phase='beta'app.config['BSK_TEMPLATES'].bsk_site_feedback_href='/feedback'app.config['BSK_TEMPLATES'].bsk_site_footer_policies_cookies_href='/legal/cookies'app.config['BSK_TEMPLATES'].bsk_site_footer_policies_copyright_href='/legal/copyright'app.config['BSK_TEMPLATES'].bsk_site_footer_policies_privacy_href='/legal/privacy'# Optional - add a custom CSS file with a relative URLapp.config['BSK_TEMPLATES'].site_styles.append({'href':'/css/app.css'})# Optional - add a custom JS file with a SRI valueapp.config['BSK_TEMPLATES'].site_scripts.append({'href':'https://example.com/js/example.js','integrity':'abc123'})# Optional - enable Google Analyticsapp.config['BSK_TEMPLATES'].site_analytics['id']='1234'# Optional - choose between the `bsk-container` (used by default) and `bsk-container-fluid` layout containerapp.config['BSK_TEMPLATES'].bsk_container_classes=['bsk-container']# Optional - add navigation menu itemsapp.config['BSK_TEMPLATES'].bsk_site_nav_primary.append({'value':'Item','href':'#'})app.config['BSK_TEMPLATES'].bsk_site_nav_secondary.append({'value':'Dropdown','items':[{'value':'Sub-item 1','href':'#','target':'_blank'}]})app.config['BSK_TEMPLATES'].bsk_site_nav_launcher.append({'value':'Related service','href':'https://example.com'})@app.route('/')defindex():# noinspection PyUnresolvedReferencesreturnrender_template(f"app/index.j2")See theJinja setupsection for other ways of loading templates.Whereapp/index.j2is a view located intemplates/index.j2which extends an application layout:{% extends 'app/layouts/app.j2' %}
{% block main_content %}
<p>Index view content...</p>
{% endblock %}This layout in turn extends a layout provided by this package:{% extends 'bas_style_kit/layouts/bsk_standard.j2' %}Using a page patternTo create a page in an application based on aPage pattern, such as thepage not foundpattern, create a template (e.g.templates/errors/404.j2) with the following:{% extends 'bas_style_kit/patterns/bsk_page-not-found.j2' %}To use this template as the 404 error handler in a Flask application for example:@app.errorhandler(404)defpage_not_found(e):# note that we set the 404 status explicitlyreturnrender_template('app/errors/404.j2'),404Using a component patternTo use aComponent pattern, such as theORCID iDpattern, import and call the relevant Macro:{% from "bas_style_kit/macros/bsk_pattern_orcid_id.j2" import pattern_orcid_id %}

<p>{{ pattern_orcid_id('https://sandbox.orcid.org/0000-0001-8373-6934') }}</p>Using custom CSS/JSNon-Style Kit CSS an/or JavaScript resources can be included either as references to files, or as inline content.Note:This won't work if you are using theBlank layout.CSS resources are outputted in thestyles block, at the end of the<head>elementJS resources are outputted in thescripts block, at the end of the<body>elementUsing custom CSS/JS filesCSS files are added as a resource object to thesite_stylesproperty of theBskTemplatesclass instanceJS files are added as a resource object to thesite_scriptsproperty of theBskTemplatesclass instanceFiles will be included after the Style Kit's own resources (where a Style Kit layout is used) to ensure they have
priority.Each file reference consists of an object with these properties:PropertyData TypeRequiredAllowed ValuesExample ValuehrefStringYesAny URL/css/app.css/https://example.com/js/app.jsintegrityStringNoAny SRI valuesha256-ClILH8AIH4CkAybtlKhzqqQUYR4eSDiNTK5LIWfF4qQ=For example (using a Flask application with acss/app.cssfile with the defaultstatic files route):app.config['bsk_templates']=BskTemplates()app.config['bsk_templates'].site_styles.append({'href':'/static/css/app.css'})Theintegrityproperty is used to specify aSubresource Integrity (SRI)value for
a resource. If specified anintegrityattribute and will be added to the generated markup. Acrossoriginattribute will also be added forCross-Origin Resource Sharing (CORS)support with a
hard-coded, anonymous, value.Using custom CSS/JS inline contentCSS content should be appended to thestyles blockJS content should be appended to thescripts blockinline content will be added after any files to ensure they have priorityNote:To append to a block use{{ super() }}, rather than replacing the contents of a block.For example (using a Jinja template):{% block scripts %}
    {{ super() }}
    console.log('jQuery version: ' + jQuery.fn.jquery);
{% endblock %}Navigation menu itemsWhen using thebsk_standard layout, anavbaris
included as part of the 'standard header', which consists of a cookie banner, navbar and site development phase banner.This navbar consists of three menus (and other elements, documented elsewhere):a primary navigation menu - aligned left, afterbrand elementsa secondary navigation menu - aligned right, before the launcher menua navigation launcher menu - aligned right, after the secondary navigation menuThe navigation launcher is a restricted menu, used to link to other BAS websites and applications. By default it
contains links to theBAS public websiteand theBAS data catalogue.
Other websites and applications can be added as well where relevant.primary navigation menu items should be added to theBskTemplates.bsk_site_nav_primaryvariablesecondary navigation menu items should be added to theBskTemplates.bsk_site_nav_secondaryvariablenavigation launcher menu items should be added to theBskTemplates.bsk_site_nav_launchervariableThe primary and secondary navigation menu's support:navbar itemsnavbar drop-down menusnavbar drop-down menu itemsThe navigation launcher menu, which is implemented as a drop-down menu, supports:navbar drop-down menu itemsMenu item objects have the following properties:PropertyData TypeRequiredAllowed ValuesExample ValueNotesvalueStringYesAny stringAbout-hrefStringYesAny URL/about/https://www.example.com/aboutIgnored ifitemssetitemsArrayNoArray of menu item objects-Ignored for navigation launcher itemsAnyStringNoAs per attribute-Arbitrary attribute/value key/valuesNote:Theitemsproperty is only recursed once, deeper objects will be ignored.For example (using a Flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_primary.push({'value':'Item','href':'/about'})app.config['BSK_TEMPLATES'].bsk_site_nav_primary.push({'value':'Another Item','href':'#','target':'_blank'})app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_secondary.push({'value':'Dropdown','items':[{'value':'Sub-item 1','href':'https://www.example.com'}]})app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_launcher.push({'value':'Related service','href':'https://example.com'})Active navigation itemsThese templates will automatically add the.bsk-activeclass to the relevant navigation item, and if relevant,
sub-item, where itshrefattribute exactly matches the current URL given by{{ request.path }}.For example for a navigation item{'value': 'About', 'href': '/about'}, when visitinghttps://www.example/about,
the about navigation item will be made active, as the current path/aboutmatches thehrefattribute.This support doesn't support URL patterns, such as/foo/{id}where{id}is a dynamic value. In these cases theactive_nav_itemvariable can be set to thehrefvalue of a navigation item to make it active explicitly.For example (using flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_primary.push({'value':'Foo','href':'/foo'})@app.route('/foo/<foo_id>')deffoo_details(foo_id:str):foo=get_foo(foo_id)returnrender_template(f"app/views/foo-details.j2",foo=foo,active_nav_item='/foo')Navbar brandingNavbars are used to display the name/identity of a website or application, to remind users where they are. These
elements are referred to as 'brand' elements within the Style Kit.Supported brand elements:brand text- set using theBskTemplates.bsk_site_nav_brand_textpropertybrand image- set using theBskTemplates.bsk_site_nav_brand_img_hrefpropertyBrand elements can be used together or individually, with fix classes applied automatically as needed.Brand elements are linked to a location specified by thebsk_attributes.site_nav_brand_hrefvariable, which should be,
and is by default, the index of each website or application (i.e./).For example (using a Flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_brand_text='Example service'app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_nav_brand_img_href='/assets/img/navbar-brand-img.png'Site development phaseThe site development phase indicates the stage of development for a website or application, e.g. alpha or live.
Conventional phases are described in theStyle Kit documentation.For websites or applications that are not firmly in the 'live' phase, a banner should be shown to inform users and
request feedback. This forms part of the 'standard header' of cookie banner, navbar and site development phase banner.In these templates, theBskTemplates.bsk_site_development_phaseproperty is used to specify the current phase for a
website or application. When using thebsk_standard layoutthe banner will be shown automatically.To disable this banner, use thelive-stable. Strictly speaking this isn't a real phase but is recommended by these
templates to distinguish between a newly released or mature and well-established website or application.For example (using a Flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_development_phase='beta'Experimental site phaseWhere a website or application is in a staging environment, or otherwise used for development/testing activities, the
site phase can be set toexperimentalto use the conventionalexperimental phase.For example (using a Flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_development_phase='experimental'Google AnalyticsTo include the Google Analytics universal tracking library (gtag), set theBskTemplates.bsk_site_analytics['id']property to relevant Google Analytics property ID.Note:When used the anonymise IP option in Google Analytics is enabled by default.For example (using a Flask application):app.config['BSK_TEMPLATES']=BskTemplates()app.config['BSK_TEMPLATES'].bsk_site_analytics['id']='UA-12345678'Footer contentAdd custom footer content to thefooter_contentblock. It will be shown between thedividerandGovernancefooter components.It is recommended to include aspacercomponent after any
footer content to balance the whitespace within the footer.For example:{% block footer_content %}
<div>Footer content</div>
<div role="separator" class="bsk-footer-spacer"></div>
{% endblock %}You can also set custom classes on the footer element by appending to thebsk_footer_classeslist, or replacing all
classes by overriding the list.PatternsPatternsdemonstrate preferred ways to ask information from, or
provide information to, end users for various tasks.There are two types of pattern used in the Style Kit and these templates:Pages- standalone pages designed to be used with or without customisationComponents- inline elements designed to be used without customisation usingMacrosPage patternsPage patterns define content for common pages such asPage not found(404) pages.These templates implement page patterns as layouts/views. Blocks can be used to provide required or additional
information as needed.Page not found patternFor example:(basic variant){% extends 'bas_style_kit/patterns/bsk_page-not-found.j2' %}Problem with this service patternBlocks:pattern_content: General content, including contact information.For example:(basic variant){% extends 'bas_style_kit/patterns/bsk_problem-with-service.j2' %}

{% block pattern_content %}
<p>Contact the <a href="mailto:team@example.com">Example team</a> for more information.</p>
{% endblock %}Service unavailable patternVariables:availability: Set toreplacedfor thereplacedvariant.
Set toclosedfor theclosedvariant.Blocks:pattern_content: General content, including contact information.For example:(basic variant){% extends 'bas_style_kit/patterns/bsk_service-unavailable.j2' %}

{% block pattern_content %}
Contact the <a href="mailto:servicedesk.bas.ac.uk">BAS IT Service Desk</a> for more information.
{% endblock %}(closed variant){% extends 'bas_style_kit/patterns/bsk_service-unavailable.j2' %}

{% set availability = 'closed' %}

{% block pattern_content %}
Contact the <a href="mailto:servicedesk.bas.ac.uk">BAS IT Service Desk</a> for more information.
{% endblock %}Start patternVariables:call_to_action_url: Set to the href the call to action button should go tocall_to_action_variant: Set todefaultfor a standard 'start now' call to action button
Set tosign-in-microsoftfor a combined 'sign-in to continue' and 'start now' buttonBlocks:pattern_content_uses: Set to an unordered list of items for the 'use this service to:' listpattern_content: General content, including 'more information' for contact information and 'before you begin' section if neededFor example:(basic variant){% extends 'bas_style_kit/patterns/bsk_start.j2' %}

{% set call_to_action_url = '#' %}

{% block pattern_content_uses %}
<ul>
    <li>A task</li>
    <li>Another task</li>
</ul>
{% endblock %}

{% block pattern_content %}
    <section class="bsk-before-you-start">
        <h2 class="bsk-h3">Before you start</h2>
        <p>Before you start information</p>
    </section>
    <section class="bsk-more-information">
        <h2 class="bsk-h3">More information</h2>
        <p>Contact the <a href="mailto:servicedesk.bas.ac.uk">BAS IT Service Desk</a> for more information.</p>
    </section>
{% endblock %}(more information variant){% extends 'bas_style_kit/patterns/bsk_start.j2' %}

{% set call_to_action_url = '#' %}
{% set call_to_action_variant = 'sign-in-microsoft' %}

{% block pattern_content_uses %}
    <ul>
        <li>A task</li>
        <li>Another task</li>
    </ul>
{% endblock %}

{% block pattern_content %}
    <section class="bsk-before-you-start">
        <h2 class="bsk-h3">Before you start</h2>
        <p>Before you start information</p>
    </section>
    <section class="bsk-more-information">
        <h2 class="bsk-h3">More information</h2>
        <p>Contact the <a href="mailto:servicedesk.bas.ac.uk">BAS IT Service Desk</a> for more information.</p>
        <p>More information</p>
    </section>
{% endblock %}Sign-in (Microsoft) patternVariables:call_to_action_url: Set to the href the call to action button should go toBlocks:pattern_content: Additional, optional, content if neededFor example:(basic variant){% extends 'bas_style_kit/patterns/bsk_sign-in-microsoft.j2' %}

{% set call_to_action_url = '#' %}Component patternsThese templates include macros for all component patterns. Macro parameters are used for customising each instance of
the component.Note:Macro parameters are positional, meaning you need to ensure values are provided in the right order to work.
See theStyle Kit documentationfor general information on using these patterns.Item type header patternParameters:item_type: The type or kind of thing the item is, e.g. if the item is a person, it's type is 'person'.item_title: A label specific to the item, e.g. if the item is a person their name.{{ pattern_item_type_header('Item type', 'Item title') }}For example:{{ pattern_item_type_header('Person', 'Connie Watson') }}ORCID ID patternParameters:orcid_id: The ORCID iD of an individual as a URL{{ pattern_orcid_id('orcid_id') }}For example:{{ pattern_orcid_id('https://sandbox.orcid.org/0000-0001-8373-6934') }}ComponentsAll components are located in thebas_style_kit_jinja_templatespackage. Variables are
defined inbas_style_kit_jinja_templates/__init__.py, with all other components defined inbas_style_kit_jinja_templates//templates/.Components that are specific to the Style Kit are prefixed withbsk--orbsk_.Jinja setupThese templates require aPrefixLoaderandPackageLoaderJinja loaderto be loaded into an application:loader=PrefixLoader({'bas_style_kit':PackageLoader('bas-style-kit-jekyll-templates')})To setVariablevalues used in these templates, aBskTemplatesclass instance is needed. These templates
assume this instance will be available in Jinja's environment asconfig.BSK_TEMPLATESFor Flask applications this will occur automatically by adding the class instance to theFlask config object:app.config['BSK_TEMPLATES']=BskTemplates()Typically applications have their own templates too, which can be loaded under a different prefix (such asapp) using
a relevant loader, such as the defaultFileSystemloader.loader=PrefixLoader({'app':FileSystemLoader('templates'),'bas_style_kit':PackageLoader('bas-style-kit-jekyll-templates')})Or aPackageLoader(this assumes there is a package namedfooand that has a module conventionally namedtemplates:loader=PrefixLoader({'app':PackageLoader('foo'),'bas_style_kit':PackageLoader('bas-style-kit-jekyll-templates')})In either case, use of aPrefixLoadermeans references to resources should include a prefix and a deliminator
(/by default).For example calling an application layout would change from:{% extends "layouts/base.j2" %}To:{% extends "app/layouts/base.j2" %}Or to use a layout from these templates:{% extends "bas_style_kit/layouts/bsk_base.j2" %}LayoutsLayouts are 'base' templates from which views or other layouts inherit. Layouts in these templates are hierarchical,
with each layout extending the last in this order:blank.j2: lowest level layout, intentionally as minimal as possible and not intended for direct use, unless
non-HTML output is neededhtml.j2: defines a minimal, accessible, HTML5 structure with some recommended best practices for cross-platform
compatibilitybsk_base.j2: intentionally implements the BAS Style Kit as minimally as possible and not intended for direct use,
unless thebsk_standard.j2layout is unsuitablebsk_standard.j2: defines an opinionated, conventional, page layout with a 'standard' header/footer, recommended as
a base for application/website layoutsLayouts can be used using theextendkeyword and defining content in the relevant block:LayoutContent Blockblank.j2contenthtml.j2main_contentbsk_base.j2main_contentbsk_standard.j2main_contentFor example:{% extends 'bas_style_kit/layouts/bsk_standard.j2' %}

{% block main_content %}
Layout content
{% endblock %}BlocksBlocksare used for template inheritance and provide
a logical structure/hierarchy.Blocks are defined inLayouts, typically with default content usingIncludes. Some blocks are
empty, designed for user content or extensibility.To implement or override a block, redefine it in a template or view:{% block example_block %}
content ...
{% endblock %}To append to a block, without overriding its existing content, use the special{{ super() }}variable:{% block example_block %}
{{ super() }}
content ...
{% endblock %}IncludesIncludesare used for organising content, to make management
easier, and to allow common elements to be used in multiple places, typically inBlocks.For example the content needed forusing Google Analyticsis encapsulated in thebody--analytics-script.j2include.MacrosMacrosare used to provide configurable, reusable, functionality.They are used within other components, such as thenavigation menusmacro for processing
primary and secondary navigation menus the same way, and to implementComponent patterns.VariablesVarious elements in these templates are configurable, such as the name of the application or website, or the CSS/JS
resources to include. A Python classBskTemplatesis used to configure these elements and which should be passed to
theJinja environment.These variables should be changed or set for each website or application:site_title: Name of the application or websitesite_description: Description of the application or websitesite_analytics.id: Google Analytics property IDbsk_site_nav_brand_text: Name of the application or websitebsk_site_nav_primary:Primary navigation menu itemsbsk_site_development_phase:Site development phasebsk_site_feedback_href: URL ormailto:value for application or website feedbackbsk_site_footer_policies_cookies_href: URL to application or website cookies policybsk_site_footer_policies_copyright_href: URL to application or website copyright noticebsk_site_footer_policies_privacy_href: URL to application or website privacy policyThese variables may, but don't need to be, changed or set for each website or application:site_styles: Array of additional CSS filessite_scripts: Array of additional JS filescontainer_classes: Array of non-Style Kit classes which set the layout of content, including main content and headers/footers which
should align the same waymain_content_classes: Array of non-Style Kit classes which should only be applied to main page contentbsk_container_classes: Array of Style Kit classes which should set the layout of content, including main content and headers/footers which
should align the same waybsk_main_content_classes: Array of Style Kit classes which should only be applied to main page contentbsk_footer_classes: Array of Style Kit classes which should be applied to the standard footer elementbsk_site_favicon: Name of theFaviconto include (valid options: [default])bsk_site_nav_secondary:Secondary navigation menu itemsbsk_site_nav_brand_img_href: URL toNavbar brand imagebsk_site_nav_brand_href: URL forNavbar brand elements, which should be the index or home of the application or websitebsk_site_nav_launcher:Navigation launcher itemsThese variables do not normally, and should not, need to be changed or set:site_back_to_top_target_id: ID of the anchor element representing the top of the current page/viewsite_main_content_target_id: ID of the element representing the main content in a page/view (i.e. skipping navigation elements)bsk_site_footer_ogl_symbol_a_href: URL to the Open Government Licence symbolbsk_site_footer_ogl_text_href: URL to the Open Government Licence text (i.e. the actual licence)bsk_site_footer_ogl_text_version: Version of the Open Government Licence usedThese variables must not be changed and should be treated as read only:templates_version: Version of these templatesbsk_version: Version of the Style Kit used by these templatesDevelopmentThese templates are developed as a Python librarybas_style_kit_jinja_templates. A bundled Flask application
(app.py) is used to simulate its usage.Development environmentGit andPoetryare required to set up a local development environment of this application.Note:If you usePyenv, this project sets a local Python version for consistency.If you have access to theBAS GitLab instance:# clone from the BAS GitLab instance if possible$gitclonehttps://gitlab.data.bas.ac.uk/web-apps/bsk/bas-style-kit-jinja2-templates.git# alternatively, clone from the GitHub mirror$gitclonehttps://github.com/antarctica/bas-style-kit-jinja-templates.git# setup virtual environment$cdbas-style-kit-jinja2-templates
$poetryinstallTo run the bundled Flask app:$poetryrunflaskrunThen visit:localhost:5000.Code StylePEP-8 style and formatting guidelines must be used for this project, except the 80 character line limit.Blackis used for formatting, configured inpyproject.tomland enforced as part ofPython code linting.Black can be integrated with a range of editors, such asPyCharm, to apply formatting
automatically when saving files.To apply formatting manually:$poetryrunblacksrc/app.pyCode LintingFlake8and various extensions are used to lint Python files. Specific checks, and any
configuration options, are documented in the./.flake8config file.To check files manually:$poetryrunflake8src/Checks are run automatically inContinuous Integration.DependenciesPython dependencies for this project are managed withPoetryinpyproject.toml.Non-code files, such as static files, can also be included in thePython packageusing theincludekey inpyproject.toml.Adding new dependenciesTo add a new (development) dependency:$poetryadd(--dev)[dependency]Then update the Docker image used for CI/CD builds and push to the BAS Docker Registry (which is provided by GitLab):$dockerbuild-fgitlab-ci.Dockerfile-tdocker-registry.data.bas.ac.uk/web-apps/bsk/bas-style-kit-jinja2-templates:latest.
$dockerpushdocker-registry.data.bas.ac.uk/web-apps/bsk/bas-style-kit-jinja2-templates:latestUpdating dependencies$poetryupdateSee the instructions above to update the Docker image used in CI/CD.Dependency vulnerability checksTheSafetypackage is used to check dependencies against known vulnerabilities.IMPORTANT!As with all security tools, Safety is an aid for spotting common mistakes, not a guarantee of secure
code. In particular this is using the free vulnerability database, which is updated less frequently than paid options.This is a good tool for spotting low-hanging fruit in terms of vulnerabilities. It isn't a substitute for proper
vetting of dependencies, or a proper audit of potential issues by security professionals. If in any doubt you MUST seek
proper advice.Checks are run automatically inContinuous Integration.To check locally:$poetryexport--without-hashes-frequirements.txt|poetryrunsafetycheck--full-report--stdinStatic security scanningTo ensure the security of this API, source code is checked againstBanditand enforced as part ofPython code linting.Warning:Bandit is a static analysis tool and can't check for issues that are only be detectable when running the
application. As with all security tools, Bandit is an aid for spotting common mistakes, not a guarantee of secure code.To check manually:$poetryrunbandit-rsrc/app.pyChecks are run automatically inContinuous Integration.TestingContinuous IntegrationAll commits will trigger a Continuous Integration process using GitLab's CI/CD platform, configured in.gitlab-ci.yml.Pip dependencies are alsochecked and monitored for vulnerabilities.DistributionThis project is distributed as a Python package, hosted inPyPi.Source and binary packages are built and published automatically usingPoetryinContinuous Deployment.Note:Except for tagged releases, Python packages built in CD will use0.0.0as a version to indicate they are
not formal releases.Continuous DeploymentA Continuous Deployment process using GitLab's CI/CD platform is configured in.gitlab-ci.yml.Release procedureAt release:create areleasebranchclose release in CHANGELOG.mdbump the package version as needed inpyproject.tomlpush changes, merge thereleasebranch intomainand tag with versionThe project will be built and published to PyPi automatically throughContinuous Deployment.After release:create anext-releasebranchbumptemplates_versionvariable inbas_style_kit_jinja_templates/__init__.pypush changes and merge thenext-releasebranch intomasterFeedbackThe maintainer of this project is the BAS Web & Applications Team, they can be contacted at:servicedesk@bas.ac.uk.Issue trackingThis project uses issue tracking, see theIssue trackerfor more information.Note:Read & write access to this issue tracker is restricted. Contact the project maintainer to request access.LicenceCopyright (c) 2019-2022 UK Research and Innovation (UKRI), British Antarctic Survey.Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.