Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
3a7a4f6498 | |||
c342596868 | |||
a0b598d38e |
1
.envrc
|
@ -1 +0,0 @@
|
||||||
use flake
|
|
|
@ -1,2 +0,0 @@
|
||||||
# Move source files into an `src` directory.
|
|
||||||
51c5f5759d667821fc94b9ed170de9a43dfbc848
|
|
8
.gitignore
vendored
|
@ -1,8 +0,0 @@
|
||||||
# Nix.
|
|
||||||
/.direnv/
|
|
||||||
/result
|
|
||||||
|
|
||||||
# pdfpc.
|
|
||||||
/**/*.pdfpc
|
|
||||||
|
|
||||||
/**/*.pdf
|
|
|
@ -1,5 +0,0 @@
|
||||||
vim.keymap.set("n", "<leader>ta", '_iTextAnnotation "<Esc>A"<Esc>j')
|
|
||||||
vim.keymap.set("v", "<leader>ta", ':norm ITextAnnotation "<Esc>gv:norm A"<Esc>')
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<Left>", "gT")
|
|
||||||
vim.keymap.set("n", "<Right>", "gt")
|
|
|
@ -1,4 +0,0 @@
|
||||||
Talks and Presentations by Oliver Davies
|
|
||||||
########################################
|
|
||||||
|
|
||||||
The source files for `my presentation slides <https://www.oliverdavies.uk/presentations>`_, written in reStructuredText and compiled using `rst2pdf <https://rst2pdf.org>`_.
|
|
Before Width: | Height: | Size: 20 KiB |
|
@ -1,27 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
||||||
|
|
||||||
Result
|
|
||||||
======
|
|
||||||
|
|
||||||
- Easier and faster to create and onboard projects.
|
|
||||||
- One canonical source of truth.
|
|
||||||
- Easy to add new features and fixes for all projects.
|
|
||||||
- Automation is easier due to consistency (e.g. Docker Compose service names).
|
|
||||||
|
|
||||||
Thanks!
|
|
||||||
=======
|
|
||||||
|
|
||||||
References:
|
|
||||||
|
|
||||||
- https://opdavi.es/build-configs
|
|
||||||
- https://github.com/opdavies/docker-example-drupal
|
|
||||||
- https://github.com/opdavies/docker-example-drupal-commerce-kickstart
|
|
||||||
- https://github.com/opdavies/docker-example-drupal-localgov
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
Me:
|
|
||||||
|
|
||||||
- https://www.oliverdavies.uk
|
|
|
@ -1,52 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
||||||
|
|
||||||
Overriding Values
|
|
||||||
=================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
php:
|
|
||||||
version: 8.1-fpm-bullseye
|
|
||||||
# Disable PHPCS, PHPStan and PHPUnit.
|
|
||||||
phpcs: false
|
|
||||||
phpstan: false
|
|
||||||
phpunit: false
|
|
||||||
|
|
||||||
# Ignore more directories from Git.
|
|
||||||
git:
|
|
||||||
ignore:
|
|
||||||
- /bin/
|
|
||||||
- /libraries/
|
|
||||||
- /web/profiles/contrib/
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Drupal Commerce Kickstart demo. No custom modules to test, and additional paths to ignore from Git."
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
dockerfile:
|
|
||||||
stages:
|
|
||||||
build:
|
|
||||||
# What additional directories do we need?
|
|
||||||
extra_directories:
|
|
||||||
- config
|
|
||||||
- patches
|
|
||||||
- scripts
|
|
||||||
|
|
||||||
commands:
|
|
||||||
- composer validate --strict
|
|
||||||
- composer install
|
|
||||||
|
|
||||||
# What additional PHP extensions do we need?
|
|
||||||
extensions:
|
|
||||||
install: [bcmath]
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Extra directories and PHP extensions that need to be added".
|
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
Example
|
|
||||||
=======
|
|
||||||
|
|
||||||
build.yaml:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
name: my-example-project
|
|
||||||
type: drupal
|
|
||||||
language: php
|
|
||||||
|
|
||||||
php:
|
|
||||||
version: 8.1-fpm-bullseye
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
Dockerfile:
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Abstract the project-specific values and configuration into this file."
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
FROM php:8.1-fpm-bullseye AS base
|
|
||||||
|
|
||||||
Configuring a Project
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
php:
|
|
||||||
version: 8.1-fpm-bullseye
|
|
||||||
|
|
||||||
# Which PHPCS standards should be used and on which paths?
|
|
||||||
phpcs:
|
|
||||||
paths: [web/modules/custom]
|
|
||||||
standards: [Drupal, DrupalPractice]
|
|
||||||
|
|
||||||
# What level should PHPStan run and on what paths?
|
|
||||||
phpstan:
|
|
||||||
level: max
|
|
||||||
paths: [web/modules/custom]
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
docker-compose:
|
|
||||||
# Which Docker Compose services do we need?
|
|
||||||
services:
|
|
||||||
- database
|
|
||||||
- php
|
|
||||||
- web
|
|
||||||
|
|
||||||
dockerfile:
|
|
||||||
stages:
|
|
||||||
build:
|
|
||||||
# What commands do we need to run?
|
|
||||||
commands:
|
|
||||||
- composer validate --strict
|
|
||||||
- composer install
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
web:
|
|
||||||
type: nginx # nginx, apache, caddy
|
|
||||||
|
|
||||||
database:
|
|
||||||
type: mariadb # mariadb, mysql
|
|
||||||
version: 10
|
|
||||||
|
|
||||||
# Where is Drupal located?
|
|
||||||
drupal:
|
|
||||||
docroot: web # web, docroot, null
|
|
||||||
|
|
||||||
experimental:
|
|
||||||
createGitHubActionsConfiguration: true
|
|
||||||
runGitHooksBeforePush: true
|
|
||||||
useNewDatabaseCredentials: true
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Experimental opt-in features that I want to trial on certain projects or to disable non-applicable features - e.g. GitHub Actions on Bitbucket."
|
|
||||||
|
|
||||||
PageBreak
|
|
|
@ -1,300 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak titlePage
|
|
||||||
|
|
||||||
.. class:: centredtitle
|
|
||||||
|
|
||||||
Build Configs internals
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
|
|
||||||
src/
|
|
||||||
Action/
|
|
||||||
CreateFinalConfigurationData.php
|
|
||||||
CreateListOfFilesToGenerate.php
|
|
||||||
GenerateConfigurationFiles.php
|
|
||||||
ValidateConfigurationData.php
|
|
||||||
Command/
|
|
||||||
GenerateCommand.php
|
|
||||||
InitCommand.php
|
|
||||||
DataTransferObject/
|
|
||||||
ConfigDto.php
|
|
||||||
TemplateFile.php
|
|
||||||
Enum/
|
|
||||||
Language.php
|
|
||||||
ProjectType.php
|
|
||||||
WebServer.php
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
protected function configure(): void
|
|
||||||
$this
|
|
||||||
->addOption(
|
|
||||||
name: 'config-file',
|
|
||||||
shortcut: ['c'],
|
|
||||||
mode: InputOption::VALUE_REQUIRED,
|
|
||||||
description: 'The path to the project\'s build.yaml file',
|
|
||||||
default: 'build.yaml',
|
|
||||||
)
|
|
||||||
->addOption(
|
|
||||||
name: 'output-dir',
|
|
||||||
shortcut: ['o'],
|
|
||||||
mode: InputOption::VALUE_REQUIRED,
|
|
||||||
description: 'The directory to create files in',
|
|
||||||
default: '.',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
||||||
{
|
|
||||||
$io = new SymfonyStyle($input, $output);
|
|
||||||
|
|
||||||
$configFile = $input->getOption(name: 'config-file');
|
|
||||||
$outputDir = $input->getOption(name: 'output-dir');
|
|
||||||
}
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
|
|
||||||
$pipelines = [
|
|
||||||
new CreateFinalConfigurationData(),
|
|
||||||
|
|
||||||
new ValidateConfigurationData(),
|
|
||||||
|
|
||||||
new CreateListOfFilesToGenerate(),
|
|
||||||
|
|
||||||
new GenerateConfigurationFiles(
|
|
||||||
$this->filesystem,
|
|
||||||
$this->twig,
|
|
||||||
$outputDir,
|
|
||||||
),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Collection<int,TemplateFile> $generatedFiles
|
|
||||||
* @var ConfigDto $configurationData
|
|
||||||
*/
|
|
||||||
[$configurationData, $generatedFiles] = (new Pipeline())
|
|
||||||
->send($configFile)
|
|
||||||
->through($pipelines)
|
|
||||||
->thenReturn();
|
|
||||||
|
|
||||||
$io->info("Building configuration for {$configurationData->name}.");
|
|
||||||
|
|
||||||
$io->write('Generated files:');
|
|
||||||
$io->listing(static::getListOfFiles(filesToGenerate: $generatedFiles)->toArray());
|
|
||||||
|
|
||||||
return Command::SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
// CreateFinalConfigurationData.php
|
|
||||||
|
|
||||||
public function handle(string $configFile, \Closure $next) {
|
|
||||||
{
|
|
||||||
$configurationData = Yaml::parseFile(filename: $configFile);
|
|
||||||
|
|
||||||
$configurationData = array_replace_recursive(
|
|
||||||
Yaml::parseFile(filename: __DIR__ . '/../../resources/build.defaults.yaml'),
|
|
||||||
$configurationData,
|
|
||||||
);
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
return $next($configurationData);
|
|
||||||
}
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
// ValidateConfigurationData.php
|
|
||||||
|
|
||||||
public function handle(array $configurationData, \Closure $next)
|
|
||||||
{
|
|
||||||
// Convert the input to a configuration data object.
|
|
||||||
$normalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
|
|
||||||
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
|
|
||||||
|
|
||||||
$configurationDataDto = $serializer->deserialize(
|
|
||||||
json_encode($configurationData),
|
|
||||||
ConfigDto::class,
|
|
||||||
'json',
|
|
||||||
);
|
|
||||||
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
// ValidateConfigurationData.php
|
|
||||||
|
|
||||||
public function handle(array $configurationData, \Closure $next)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
|
|
||||||
$validator = Validation::createValidatorBuilder()
|
|
||||||
->enableAnnotationMapping()
|
|
||||||
->getValidator();
|
|
||||||
$violations = $validator->validate($configurationDataDto);
|
|
||||||
|
|
||||||
if (0 < $violations->count()) {
|
|
||||||
throw new \RuntimeException('Configuration is invalid.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $next([$configurationData, $configurationDataDto]);
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
// ConfigDto.php
|
|
||||||
|
|
||||||
#[Assert\Collection(
|
|
||||||
allowExtraFields: false,
|
|
||||||
fields: ['docroot' => new Assert\Choice([null, 'web', 'docroot'])],
|
|
||||||
)]
|
|
||||||
public array $drupal;
|
|
||||||
|
|
||||||
#[Assert\Collection([
|
|
||||||
'ignore' => new Assert\Optional([
|
|
||||||
new Assert\All([
|
|
||||||
new Assert\Type('string'),
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
])]
|
|
||||||
public array $git;
|
|
||||||
|
|
||||||
#[Assert\Choice(choices: ['javascript', 'php', 'typescript'])]
|
|
||||||
public string $language;
|
|
||||||
|
|
||||||
#[Assert\NotBlank]
|
|
||||||
#[Assert\Type('string')]
|
|
||||||
public string $name;
|
|
||||||
|
|
||||||
#[Assert\Type('string')]
|
|
||||||
public string $projectRoot;
|
|
||||||
|
|
||||||
#[Assert\Choice(choices: [
|
|
||||||
'drupal',
|
|
||||||
'fractal',
|
|
||||||
'php-library',
|
|
||||||
'symfony',
|
|
||||||
])]
|
|
||||||
public string $type;
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:startinline: true
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
// CreateListOfFilesToGenerate.php
|
|
||||||
|
|
||||||
public function handle(array $configurationDataAndDto, \Closure $next)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var ConfigDto $configDto,
|
|
||||||
* @var array<string,mixed> $configurationData
|
|
||||||
*/
|
|
||||||
[$configurationData, $configDto] = $configurationDataAndDto;
|
|
||||||
|
|
||||||
/** @var Collection<int, TemplateFile> */
|
|
||||||
$filesToGenerate = collect();
|
|
||||||
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:startinline: true
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
// CreateListOfFilesToGenerate.php
|
|
||||||
|
|
||||||
public function handle(array $configurationDataAndDto, \Closure $next)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
|
|
||||||
if (!isset($configDto->php['phpunit']) || $configDto->php['phpunit'] !== false) {
|
|
||||||
|
|
||||||
$filesToGenerate->push(
|
|
||||||
new TemplateFile(
|
|
||||||
data: 'drupal/phpunit.xml.dist',
|
|
||||||
name: 'phpunit.xml.dist',
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
return $next([$configurationData, $configDto, $filesToGenerate]);
|
|
||||||
}
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:linenos:
|
|
||||||
:startinline: true
|
|
||||||
|
|
||||||
// GenerateConfigurationFiles.php
|
|
||||||
|
|
||||||
public function handle(array $filesToGenerateAndConfigurationData, \Closure $next)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
|
|
||||||
$filesToGenerate->each(function(TemplateFile $templateFile) use ($configurationData): void {
|
|
||||||
if ($templateFile->path !== null) {
|
|
||||||
if (!$this->filesystem->exists($templateFile->path)) {
|
|
||||||
$this->filesystem->mkdir("{$this->outputDir}/{$templateFile->path}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$sourceFile = "{$templateFile->data}.twig";
|
|
||||||
|
|
||||||
$outputFile = collect([$this->outputDir, $templateFile->path, $templateFile->name])
|
|
||||||
->filter()->implode('/');
|
|
||||||
|
|
||||||
$this->filesystem->dumpFile($outputFile, $this->twig->render($sourceFile, $configurationData));
|
|
||||||
});
|
|
||||||
|
|
||||||
return $next([$configurationDataDto, $filesToGenerate]);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
||||||
|
|
||||||
What is "Build Configs"?
|
|
||||||
========================
|
|
||||||
|
|
||||||
- Command-line tool.
|
|
||||||
- Inspired by Workspace, name from the TheAltF4Stream.
|
|
||||||
- Built with Symfony.
|
|
||||||
- Creates and manages build configuration files.
|
|
||||||
- Customisable per-project.
|
|
||||||
- Drupal, PHP library, Fractal (TypeScript).
|
|
||||||
- "Sprint zero in a box".
|
|
||||||
|
|
||||||
What Problem Does it Solve?
|
|
||||||
===========================
|
|
||||||
|
|
||||||
- I work on multiple similar projects.
|
|
||||||
- Different configuration values - e.g. ``web`` vs. ``docroot``.
|
|
||||||
- Different versions of PHP, node, etc.
|
|
||||||
- Different Docker Compose (``fpm`` vs. ``apache`` images).
|
|
||||||
- Each project was separate.
|
|
||||||
- Difficult to add new features and fix bugs across all projects.
|
|
||||||
- Inconsistencies across projects.
|
|
||||||
- Out of the box solutions didn't seem like the best fit.
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Multiple projects with similar but different configurations."
|
|
||||||
TextAnnotation ""
|
|
||||||
TextAnnotation "Out of the box solutions tend to focus on one technology, could be hard to customise, and usually had more than I nedeed."
|
|
||||||
TextAnnotation ""
|
|
||||||
TextAnnotation "Start small and build up instead of removing additional things."
|
|
||||||
TextAnnotation ""
|
|
||||||
TextAnnotation "More opportunities to learn the underlying technologies."
|
|
||||||
|
|
||||||
How Does it Work?
|
|
||||||
=================
|
|
||||||
|
|
||||||
.. image:: diagram.png
|
|
||||||
:width: 18cm
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Canonical templates and project-specific configuration goes in, templates come out."
|
|
||||||
|
|
||||||
What Files Does it Generate?
|
|
||||||
============================
|
|
||||||
|
|
||||||
- Dockerfile, Docker Compose, Nix Flake, php.ini, NGINX default.conf.
|
|
||||||
- ``run`` file.
|
|
||||||
- PHPUnit, PHPCS, PHPStan.
|
|
||||||
- GitHub Actions workflow.
|
|
||||||
- Git hooks.
|
|
|
@ -1,117 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
||||||
|
|
||||||
Dockerfile.twig
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
FROM php:{{ php.version }} AS base
|
|
||||||
|
|
||||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
|
||||||
RUN which composer && composer -V
|
|
||||||
|
|
||||||
ARG DOCKER_UID=1000
|
|
||||||
ENV DOCKER_UID="${DOCKER_UID}"
|
|
||||||
|
|
||||||
WORKDIR {{ project_root }}
|
|
||||||
|
|
||||||
RUN adduser --disabled-password --uid "${DOCKER_UID}" app \
|
|
||||||
&& chown app:app -R {{ project_root }}
|
|
||||||
|
|
||||||
Dockerfile.twig
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
{% if dockerfile.stages.build.extensions.install %}
|
|
||||||
RUN docker-php-ext-install
|
|
||||||
{{ dockerfile.stages.build.extensions.install|join(' ') }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
COPY --chown=app:app phpunit.xml* ./
|
|
||||||
|
|
||||||
{% if dockerfile.stages.build.extra_files %}
|
|
||||||
COPY --chown=app:app {{ dockerfile.stages.build.extra_files|join(" ") }} ./
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for directory in dockerfile.stages.build.extra_directories %}
|
|
||||||
COPY --chown=app:app {{ directory }} {{ directory }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
docker-compose.yaml.twig
|
|
||||||
========================
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
services:
|
|
||||||
{% if "web" in dockerCompose.services %}
|
|
||||||
web:
|
|
||||||
<<: [*default-proxy, *default-app]
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
target: web
|
|
||||||
depends_on:
|
|
||||||
- php
|
|
||||||
profiles: [web]
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
phpstan.neon.dist.twig
|
|
||||||
======================
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
level: {{ php.phpstan.level }}
|
|
||||||
excludePaths:
|
|
||||||
- *Test.php
|
|
||||||
- *TestBase.php
|
|
||||||
paths:
|
|
||||||
{% for path in php.phpstan.paths -%}
|
|
||||||
- {{ path }}
|
|
||||||
{%- endfor %}
|
|
||||||
|
|
||||||
{% if php.phpstan.baseline %}
|
|
||||||
includes:
|
|
||||||
- phpstan-baseline.neon
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
phpunit.xml.dist.twig
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
<phpunit
|
|
||||||
beStrictAboutChangesToGlobalState="true"
|
|
||||||
beStrictAboutOutputDuringTests="false"
|
|
||||||
beStrictAboutTestsThatDoNotTestAnything="true"
|
|
||||||
bootstrap="{{ drupal.docroot }}/core/tests/bootstrap.php"
|
|
||||||
cacheResult="false"
|
|
||||||
colors="true"
|
|
||||||
failOnWarning="true"
|
|
||||||
printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter"
|
|
||||||
>
|
|
||||||
|
|
||||||
phpunit.xml.dist.twig
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. code-block:: twig
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
<testsuites>
|
|
||||||
<testsuite name="functional">
|
|
||||||
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Functional</directory>
|
|
||||||
</testsuite>
|
|
||||||
<testsuite name="kernel">
|
|
||||||
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Kernel</directory>
|
|
||||||
</testsuite>
|
|
||||||
<testsuite name="unit">
|
|
||||||
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Unit</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
|
@ -1,29 +0,0 @@
|
||||||
.. footer:: @opdavies
|
|
||||||
|
|
||||||
Building "Build Configs"
|
|
||||||
########################
|
|
||||||
|
|
||||||
.. class:: titleslideinfo
|
|
||||||
|
|
||||||
Oliver Davies (@opdavies)
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
.. class:: titleslideinfo
|
|
||||||
|
|
||||||
https://opdavi.es/bco
|
|
||||||
|
|
||||||
.. include:: ./sections/intro.rst
|
|
||||||
.. include:: ./sections/example.rst
|
|
||||||
.. include:: ./sections/customisation.rst
|
|
||||||
.. include:: ./sections/templates.rst
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak titlePage
|
|
||||||
|
|
||||||
.. class:: centredtitle
|
|
||||||
|
|
||||||
Demo
|
|
||||||
|
|
||||||
.. include:: ./sections/conclusion.rst
|
|
|
@ -1,4 +0,0 @@
|
||||||
Building and presenting slide decks with rst2pdf
|
|
||||||
################################################
|
|
||||||
|
|
||||||
https://www.oliverdavies.uk/talks/building-presenting-slide-decks-rst2pdf
|
|
|
@ -1,12 +0,0 @@
|
||||||
rst2pdf slides.rst
|
|
||||||
|
|
||||||
|
|
||||||
rst2pdf slides.rst --break-level 1 --stylesheets main
|
|
||||||
|
|
||||||
|
|
||||||
rst2pdf slides.rst \
|
|
||||||
--output slides.pdf \
|
|
||||||
--stylesheets main \
|
|
||||||
--break-level 1 \
|
|
||||||
--fit-background-mode scale \
|
|
||||||
--extension-module preprocess
|
|
|
@ -1,4 +0,0 @@
|
||||||
.. code-block:: javascript
|
|
||||||
:include: code/additional-config-options.txt
|
|
||||||
:hl_lines: 2 3 4
|
|
||||||
:linenos:
|
|
|
@ -1 +0,0 @@
|
||||||
.. include:: sections/intro.rst
|
|
|
@ -1,3 +0,0 @@
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak standardPage
|
|
|
@ -1,6 +0,0 @@
|
||||||
pageTemplates:
|
|
||||||
standardPage:
|
|
||||||
frames: []
|
|
||||||
[3%, 3%, 92%, 92%]
|
|
||||||
showFooter: true
|
|
||||||
showHeader: false
|
|
|
@ -1,29 +0,0 @@
|
||||||
linkColor: #24608a
|
|
||||||
|
|
||||||
styles:
|
|
||||||
normal:
|
|
||||||
fontSize: 24
|
|
||||||
leading: 32
|
|
||||||
textColor: #383745
|
|
||||||
|
|
||||||
bodytext:
|
|
||||||
alignment: TA_LEFT
|
|
||||||
|
|
||||||
heading:
|
|
||||||
fontSize: 20
|
|
||||||
spaceAfter: 16
|
|
||||||
textColor: #24608a
|
|
||||||
|
|
||||||
title:
|
|
||||||
fontSize: 300%
|
|
||||||
parent: heading
|
|
||||||
textColor: white
|
|
||||||
|
|
||||||
bullet-list:
|
|
||||||
commands: []
|
|
||||||
[LEFTPADDING, [0, 0], [1, -1], 10]
|
|
||||||
[RIGHTPADDING, [0, 0], [1, -1], 0]
|
|
||||||
[VALIGN, [0, 0], [-1, -1], TOP]
|
|
||||||
colWidths: ["20", null]
|
|
||||||
textColor: #aaaaaa
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
Building and presenting slide decks with rst2pdf
|
|
||||||
################################################
|
|
||||||
|
|
||||||
.. class:: titleslideinfo
|
|
||||||
|
|
||||||
Oliver Davies (@opdavies)
|
|
||||||
|
|
||||||
|
|
||||||
What is rst2pdf?
|
|
||||||
================
|
|
||||||
|
|
||||||
* "Use a text editor. Make a PDF."
|
|
||||||
* reStructuredText to PDF
|
|
||||||
* Each slide is a page
|
|
|
@ -1,14 +0,0 @@
|
||||||
.. image:: images/editing.png
|
|
||||||
:width: 20cm
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: php
|
|
||||||
:startinline: true
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
echo 'Hello world!';
|
|
||||||
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "This is a speaker note."
|
|
|
@ -1,8 +0,0 @@
|
||||||
nodemon --ext rst,style,txt --exec "
|
|
||||||
rst2pdf slides.rst \
|
|
||||||
--output slides.pdf \
|
|
||||||
--stylesheets main \
|
|
||||||
--break-level 1 \
|
|
||||||
--fit-background-mode scale \
|
|
||||||
--extension-module preprocess
|
|
||||||
"
|
|
Before Width: | Height: | Size: 225 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 119 KiB |
|
@ -1,169 +0,0 @@
|
||||||
.. footer:: @opdavies
|
|
||||||
|
|
||||||
Building and presenting slide decks with rst2pdf
|
|
||||||
################################################
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
.. class:: titleslideinfo
|
|
||||||
|
|
||||||
Oliver Davies (@opdavies)
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Gave my first talk in 2012."
|
|
||||||
TextAnnotation "A talk about a tool (rst2pdf) that I've been using for the last couple of talks."
|
|
||||||
|
|
||||||
.. page:: standardPage
|
|
||||||
|
|
||||||
What have I used before?
|
|
||||||
========================
|
|
||||||
|
|
||||||
* **UI based:** Keynote, Google Slides, slides.com
|
|
||||||
* **HTML/JavaScript:** reveal.js
|
|
||||||
* **Markdown:** Deckset, Marp, reveal-md
|
|
||||||
|
|
||||||
What is rst2pdf?
|
|
||||||
================
|
|
||||||
|
|
||||||
* "Use a text editor. Make a PDF."
|
|
||||||
* reStructuredText to PDF
|
|
||||||
* Each slide is a page
|
|
||||||
* Page templates for layouts
|
|
||||||
* Not just for slide decks
|
|
||||||
* Table of contents, page numbers, headers, footers
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Use the tools you're familiar with."
|
|
||||||
TextAnnotation "Similar to Markdown."
|
|
||||||
TextAnnotation "Primarily used for technical documentation within the Python community."
|
|
||||||
TextAnnotation "Now maintained by PHPers Rob Allen and Lorna Jane Mitchell."
|
|
||||||
TextAnnotation "Breaks at titles automatically, or you can add manual page breaks."
|
|
||||||
|
|
||||||
Advantages
|
|
||||||
==========
|
|
||||||
|
|
||||||
* Easy to start a new presentation, or update an existing one
|
|
||||||
* Version controllable
|
|
||||||
* Portable
|
|
||||||
* Content is searchable
|
|
||||||
* Easy to re-use content and/or styling
|
|
||||||
* Slides uploaded to SpeakerDeck straight away
|
|
||||||
|
|
||||||
.. page:: imagePage
|
|
||||||
|
|
||||||
.. image:: images/editing.png
|
|
||||||
:width: 23cm
|
|
||||||
|
|
||||||
.. page:: standardPage
|
|
||||||
|
|
||||||
Useful reStructuredText
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. code-block:: rst
|
|
||||||
:include: code/useful-rst-1.txt
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
Useful reStructuredText
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. code-block:: rst
|
|
||||||
:include: code/useful-rst-2.txt
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
Page Templates
|
|
||||||
==============
|
|
||||||
|
|
||||||
main.style:
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
:include: code/page-templates-style.txt
|
|
||||||
|
|
||||||
slides.rst:
|
|
||||||
|
|
||||||
.. code-block:: rst
|
|
||||||
:include: code/page-templates-rst.txt
|
|
||||||
|
|
||||||
Keeping things organised
|
|
||||||
========================
|
|
||||||
|
|
||||||
Split slides into different sections:
|
|
||||||
|
|
||||||
.. code-block:: rst
|
|
||||||
:include: code/includes-sections.txt
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
Including code snippets from separate files:
|
|
||||||
|
|
||||||
.. code-block:: rst
|
|
||||||
:include: code/includes-code.txt
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
TextAnnotation "Includes!"
|
|
||||||
|
|
||||||
Styling
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
:include: code/styling.txt
|
|
||||||
:linenos:
|
|
||||||
|
|
||||||
Building
|
|
||||||
========
|
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
:include: code/building.txt
|
|
||||||
|
|
||||||
Watching
|
|
||||||
========
|
|
||||||
|
|
||||||
Re-compiling when something changes.
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
:include: code/watching.txt
|
|
||||||
|
|
||||||
Presenting
|
|
||||||
==========
|
|
||||||
|
|
||||||
``pdfpc`` - PDF presenter console
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
|
|
||||||
pdfpc slides.pdf
|
|
||||||
|
|
||||||
.. page:: imagePage
|
|
||||||
|
|
||||||
.. image:: images/pdfpc-1.png
|
|
||||||
:width: 23cm
|
|
||||||
|
|
||||||
.. raw:: pdf
|
|
||||||
|
|
||||||
PageBreak
|
|
||||||
|
|
||||||
.. image:: images/pdfpc-2.png
|
|
||||||
:width: 23cm
|
|
||||||
|
|
||||||
.. page:: standardPage
|
|
||||||
|
|
||||||
Thanks!
|
|
||||||
=======
|
|
||||||
|
|
||||||
References:
|
|
||||||
|
|
||||||
* https://rst2pdf.org
|
|
||||||
* https://github.com/rst2pdf/rst2pdf
|
|
||||||
* https://github.com/opdavies/talks
|
|
||||||
* https://oliverdavies.link/lorna-rst2pdf-talk
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
Me:
|
|
||||||
|
|
||||||
* https://www.oliverdavies.uk
|
|
|
@ -1 +0,0 @@
|
||||||
use flake
|
|
10
building-static-websites-sculpin/demo/.gitignore
vendored
|
@ -1,10 +0,0 @@
|
||||||
/output_*/
|
|
||||||
|
|
||||||
/.phpunit.cache
|
|
||||||
/.phpunit.result.cache
|
|
||||||
|
|
||||||
# Nix
|
|
||||||
/.direnv/
|
|
||||||
|
|
||||||
# Composer
|
|
||||||
/vendor/
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
export PATH="${PATH}:./vendor"
|
|
||||||
|
|
||||||
tmux new-window -dn shell
|
|
||||||
tmux new-window -dn server
|
|
||||||
|
|
||||||
tmux send-keys -t server "sculpin generate --server --watch" Enter
|
|
||||||
|
|
||||||
xdg-open http://localhost:8000
|
|
||||||
|
|
||||||
nvim
|
|
|
@ -1,7 +0,0 @@
|
||||||
sculpin_content_types:
|
|
||||||
# speakers:
|
|
||||||
# permalink: /speakers/:basename/
|
|
||||||
# talks:
|
|
||||||
# permalink: /talks/:basename/
|
|
||||||
posts:
|
|
||||||
enabled: false
|
|
|
@ -1,2 +0,0 @@
|
||||||
name: 'My New Sculpin Site'
|
|
||||||
locale: en
|
|
|
@ -1,2 +0,0 @@
|
||||||
imports:
|
|
||||||
- sculpin_site.yml
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
export PATH="$PATH:./vendor/bin"
|
|
||||||
|
|
||||||
sculpin generate "$@"
|
|
|
@ -1,3 +0,0 @@
|
||||||
---
|
|
||||||
name: demo
|
|
||||||
template: php-sculpin
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
rm -rfv output_* vendor
|
|
|
@ -1,10 +0,0 @@
|
||||||
{
|
|
||||||
"require": {
|
|
||||||
"sculpin/sculpin": "^3.0"
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"allow-plugins": {
|
|
||||||
"sculpin/sculpin-theme-composer-plugin": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
3607
building-static-websites-sculpin/demo/composer.lock
generated
27
building-static-websites-sculpin/demo/flake.lock
generated
|
@ -1,27 +0,0 @@
|
||||||
{
|
|
||||||
"nodes": {
|
|
||||||
"nixpkgs": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1740828860,
|
|
||||||
"narHash": "sha256-cjbHI+zUzK5CPsQZqMhE3npTyYFt9tJ3+ohcfaOF/WM=",
|
|
||||||
"owner": "nixos",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "303bd8071377433a2d8f76e684ec773d70c5b642",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nixos",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": "nixpkgs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "root",
|
|
||||||
"version": 7
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
{
|
|
||||||
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
|
||||||
|
|
||||||
outputs = inputs:
|
|
||||||
let
|
|
||||||
system = "x86_64-linux";
|
|
||||||
pkgs = import inputs.nixpkgs { inherit system; };
|
|
||||||
in
|
|
||||||
{
|
|
||||||
devShells.${system}.default =
|
|
||||||
with pkgs;
|
|
||||||
mkShell {
|
|
||||||
buildInputs = [
|
|
||||||
nodePackages.browser-sync
|
|
||||||
|
|
||||||
(php83.buildEnv {
|
|
||||||
extraConfig = ''
|
|
||||||
error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED
|
|
||||||
'';
|
|
||||||
})
|
|
||||||
|
|
||||||
php83Packages.composer
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="{{ site.locale|default('en') }}">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>{{ site.name|default('Sculpin Skeleton') }}</title>
|
|
||||||
<link rel="stylesheet" href="/css/styles.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
{% block content_wrapper %}
|
|
||||||
<h1>{{ page.title }}</h1>
|
|
||||||
|
|
||||||
{% block content %}{% endblock %}
|
|
||||||
{% endblock %}
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,5 +0,0 @@
|
||||||
{% extends 'base' %}
|
|
||||||
|
|
||||||
{% block content_wrapper %}
|
|
||||||
<h1>{{ page.name }}</h1>
|
|
||||||
{% endblock %}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{% extends 'base' %}
|
|
||||||
|
|
||||||
{% block content_wrapper %}
|
|
||||||
<h1>{{ page.title }}</h1>
|
|
||||||
{% endblock %}
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Ciaran McNulty
|
|
||||||
imageUrl: /images/ciaran.jpg
|
|
||||||
---
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Dan Leech
|
|
||||||
imageUrl: /images/highres_257208698.jpeg
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: Dave Liddament
|
|
||||||
imageUrl: /images/highres_203797572.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
Director and Developer at Lamp Bristol. PHP, Java and Python software developer.
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Derick Rethans
|
|
||||||
imageUrl: /images/highres_276685584.jpeg
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: James Titcumb
|
|
||||||
imageUrl: /images/highres_134740252.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
James is the founder of the UK based PHP Hampshire user group, a Zend Certified Engineer and Development Manager at Protected.co.uk.
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: Mike Karthauser
|
|
||||||
imageUrl: /images/highres_80709042.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
Dev since '98. PHP since '03.
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Naomi Gotts
|
|
||||||
imageUrl: /images/highres_311941362.jpeg
|
|
||||||
---
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Nigel Dunn
|
|
||||||
imageUrl: /images/highres_131268052.jpeg
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: Oliver Davies
|
|
||||||
imageUrl: /images/highres_317091329.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
Full Stack Software Consultant. Drupal and PHP expert.
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: Rob Allen
|
|
||||||
imageUrl: /images/highres_312615346.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
PHP developer from Worcester.
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
name: Robin Hodson
|
|
||||||
imageUrl: /images/highres_243972257.jpeg
|
|
||||||
---
|
|
||||||
|
|
||||||
Ready to look for coding/hardware work post-lockdown, now largely recovered from stressful experiences. Accepted work from the government in September/October; currently realigning goals plus getting things I've been working on a bit more tangible.
|
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
name: Ryan Lee
|
|
||||||
imageUrl: /images/highres_273691940.jpeg
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Behaviour Driven Development (BDD) in Practice
|
|
||||||
date: 2022-09-14
|
|
||||||
speakers:
|
|
||||||
- Ciaran McNulty
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Building "Build Configs"
|
|
||||||
date: 2023-11-08
|
|
||||||
speakers:
|
|
||||||
- Oliver Davies
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Introducing Domain Driven Design
|
|
||||||
date: 2024-01-10
|
|
||||||
speakers:
|
|
||||||
- Rob Allen
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: 'FPGA^2: An open-source FPGA'
|
|
||||||
date: 2024-02-14
|
|
||||||
speakers:
|
|
||||||
- Robin Hodson
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Go for PHP
|
|
||||||
date: 2023-02-08
|
|
||||||
speakers:
|
|
||||||
- Dan Leech
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: What's new in PHP 8.*
|
|
||||||
date: 2023-02-11
|
|
||||||
speakers:
|
|
||||||
- Derick Rethans
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Building Static Websites with PHP and Sculpin
|
|
||||||
date: 2024-02-14
|
|
||||||
speakers:
|
|
||||||
- Oliver Davies
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: What is TDD and why should I care?
|
|
||||||
date: 2023-07-12
|
|
||||||
speakers:
|
|
||||||
- Naomi Gotts
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Terraform from a dev’s perspective
|
|
||||||
date: 2023-10-11
|
|
||||||
speakers:
|
|
||||||
- Nigel Dunn
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Testing Legacy
|
|
||||||
date: 2023-11-08
|
|
||||||
speakers:
|
|
||||||
- Mike Karthauser
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Building Better TUIs (with PHP)
|
|
||||||
date: 2023-11-08
|
|
||||||
speakers:
|
|
||||||
- Dan Leech
|
|
||||||
---
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
title: Thoughts on Ubiquitous Language
|
|
||||||
date: 2023-11-08
|
|
||||||
speakers:
|
|
||||||
- Rob Allen
|
|
||||||
---
|
|
|
@ -1,5 +0,0 @@
|
||||||
.container {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 768px;
|
|
||||||
padding: 0 1rem;
|
|
||||||
}
|
|
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 1.7 MiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 758 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 794 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 7.2 KiB |
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
layout: base
|
|
||||||
title: Hello, World!
|
|
||||||
---
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
export PATH="$PATH:./vendor/bin"
|
|
||||||
|
|
||||||
sculpin generate --server --watch "$@"
|
|
|
@ -1,4 +0,0 @@
|
||||||
Building static websites with Sculpin
|
|
||||||
#####################################
|
|
||||||
|
|
||||||
https://www.oliverdavies.uk/talks/building-static-websites-sculpin
|
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
name: oliverdavies.uk
|
|
||||||
menu_links:
|
|
||||||
- { title: Home, href: / }
|
|
||||||
- { title: About, href: /about }
|
|
|
@ -1,10 +0,0 @@
|
||||||
---
|
|
||||||
title: My Daily Email Archive
|
|
||||||
layout: default
|
|
||||||
use:
|
|
||||||
- daily_email
|
|
||||||
---
|
|
||||||
|
|
||||||
{% for email in data.daily_emails %}
|
|
||||||
<p>{{ email.title }}</p>
|
|
||||||
{% endfor %}
|
|
|
@ -1,12 +0,0 @@
|
||||||
---
|
|
||||||
...
|
|
||||||
testimonials:
|
|
||||||
- { name: ..., role: ..., text: ..., url: ... }
|
|
||||||
- { name: ..., role: ..., text: ..., url: ... }
|
|
||||||
- { name: ..., role: ..., text: ..., url: ... }
|
|
||||||
---
|
|
||||||
|
|
||||||
{% for testimonial in page.testimonials %}
|
|
||||||
<h2>{{ testimonial.name }} - {{ testimonial.role }}</h2>
|
|
||||||
<p>{{ testimonial.text }}</p>
|
|
||||||
{% endfor %}
|
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
layout: post
|
|
||||||
title: New blog post
|
|
||||||
draft: yes
|
|
||||||
---
|
|
|
@ -1,9 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Hello!</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<p>Hello, World!</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
layout: default
|
|
||||||
title: Hello!
|
|
||||||
---
|
|
||||||
|
|
||||||
Hello, World!
|
|
|
@ -1,11 +0,0 @@
|
||||||
{# source/_layouts/base.html.twig #}
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="{{ site.locale|default('en') }}">
|
|
||||||
<head>
|
|
||||||
<title>{{ site.name|default('Sculpin Skeleton') }}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
{% block body %}{% endblock %}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,7 +0,0 @@
|
||||||
{# source/_layouts/page.html.twig #}
|
|
||||||
|
|
||||||
{% extends 'base' %}
|
|
||||||
|
|
||||||
{% block body %}
|
|
||||||
{% block content %}{% endblock %}
|
|
||||||
{% endblock %}
|
|
|
@ -1,13 +0,0 @@
|
||||||
app/
|
|
||||||
config/
|
|
||||||
sculpin_kernel.yml
|
|
||||||
sculpin_site.yml
|
|
||||||
composer.json
|
|
||||||
composer.lock
|
|
||||||
output_dev/
|
|
||||||
output_prod/
|
|
||||||
source/
|
|
||||||
_includes/
|
|
||||||
_templates/
|
|
||||||
index.md
|
|
||||||
vendor/
|
|
|
@ -1,8 +0,0 @@
|
||||||
{{ 'today' }}
|
|
||||||
|
|
||||||
{{ 'today'|date }}
|
|
||||||
|
|
||||||
{{ 'today'|date('Y') }}
|
|
||||||
|
|
||||||
{{ 'today'|date('Y') - 2007 }} # 18 (years of experience)
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
---
|
|
||||||
title: Building Static Websites with Sculpin
|
|
||||||
events:
|
|
||||||
- name: PHP Berkshire
|
|
||||||
date: 2024-08-28
|
|
||||||
location: Reading, UK
|
|
||||||
url: https://www.meetup.com/php-berkshire/events/301850284
|
|
||||||
- name: BrumPHP
|
|
||||||
date: 2024-05-23
|
|
||||||
location: Birmingham, UK
|
|
||||||
url: https://www.eventbrite.com/e/brumphp-23rd-may-2024-tickets-803037766577
|
|
||||||
---
|
|
||||||
// end yaml
|
|
||||||
|
|
||||||
// start twig
|
|
||||||
{% set talkCount = 0 %}
|
|
||||||
|
|
||||||
{% for talk in data.talks %}
|
|
||||||
{% for event in talk.events if 'today'|date('U') >= event.date|date('U') %}
|
|
||||||
{% set talkCount = talkCount + 1 %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<p>I have given {{ talkCount }} talks.</p>
|
|
|
@ -1,15 +0,0 @@
|
||||||
{% set talks = site.talks|filter(talk => talk.speaker == page.name) %}
|
|
||||||
|
|
||||||
{% if talks is not empty %}
|
|
||||||
<section>
|
|
||||||
<h2>Talks by {{ page.name }}</h2>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<ul>
|
|
||||||
{% for talk in talks %}
|
|
||||||
<li><a href="#0">{{ talk.title }}</a></li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endif %}
|
|
|
@ -1,8 +0,0 @@
|
||||||
- Adding a new page (`/talks`)
|
|
||||||
- Adding a new menu link
|
|
||||||
- Adding a new content type (talks)
|
|
||||||
- Add a new talk
|
|
||||||
- Show how to use page-level variables, adding events to a talk
|
|
||||||
- Adding the talks page to the menu
|
|
||||||
- Active menu link styling?
|
|
||||||
- Generating a production version of the site
|
|
Before Width: | Height: | Size: 12 KiB |