Group pages within their own directory

Add `pages` as it's own content type, and move all page content into
the appropriate directory.

Any references to `layout` in the YAML front matter has also been
removed as it's implied by the content type. Except for `about.md`
which does explicity use a different layout.
This commit is contained in:
Oliver Davies 2019-10-18 07:12:25 +01:00
parent a9132738af
commit d97621c42c
18 changed files with 2 additions and 16 deletions

6
source/_pages/404.md Normal file
View file

@ -0,0 +1,6 @@
---
title: Page Not Found
permalink: /404.html
use: [posts]
---
Please [contact me](/contact/) and let me know.

26
source/_pages/about.md Normal file
View file

@ -0,0 +1,26 @@
---
layout: front
title: About Me
meta:
og:
title: 'Oliver Davies - Full Stack Developer, System Administrator, PHP and Drupal specialist'
description: 'The personal website and blog of Oliver Davies, a Full Stack Developer and System Administrator from Wales, UK.'
type: website
permalink: /
---
<div class="mb-4 w-32"><img src="/images/me-precedent.jpg" alt="Picture of Oliver" class="rounded-full border border-gray"/></div>
Hi, I'm Oliver Davies (aka [opdavies](https://www.google.com/#q=opdavies)).
Im a {{ site.work.role }} at [{{site.companies[site.work.company].name}}]({{site.companies[site.work.company].url}}) and a part-time freelance Web Developer based in Wales, UK.
Ive been a Developer since 2007 and specialise in using Drupal, Symfony and Vue.js, though I also use other technologies including Laravel and Sculpin.
I use Ansible for server provisioning and application deployments.
Im an [Acquia certified](https://certification.acquia.com/user/1647756) Drupal 8 Grand Master, and Webmaster and Documentation Maintainer on [Drupal.org](https://www.drupal.org).
I was previously a Developer for the [{{site.companies.drupal_association.name}}]({{site.companies.drupal_association.url}}).
I regularly [give talks](/talks) at user groups and conferences,
and am an organiser of the [{{site.events.php_south_wales.name}}]({{site.events.php_south_wales.url}}) user group.
I enjoy contributing to open source, and maintain a variety of different projects.
You can see these on my [Drupal.org]({{site.drupalorg.url}}) and [GitHub]({{site.github.url}}) accounts.

View file

@ -0,0 +1,9 @@
---
title: Accessibility
use: [posts]
---
# Accessibility
I have made as much effort as possible to make this website accessible to all users.
If you have any suggestions to improve the site, please [contact me](/contact/).

View file

@ -0,0 +1,16 @@
---
title: Company Information
meta:
description: 'Company information for Oliver Davies Ltd.'
use: [posts]
---
# Company Information
Company name
: Oliver Davies Ltd (previously Oliver Davies Web Development Ltd)
Registered address
: 106 Rowan Way, Malpas, Newport, NP20 6JN
Company number
: 8017706

View file

@ -0,0 +1,6 @@
---
title: Thanks!
permalink: contact/thanks/
use: [posts]
---
Your email has been sent. You should receive a response within the next working day.

View file

@ -0,0 +1,42 @@
---
title: Contact
use: [posts]
honeypot_field: Qr4W7oB25C
---
{% block content %}
<div class="mt-2 mb-6">
<p>To send me an email, complete the form below.</p>
</div>
<form name="contact" method="POST" netlify-honeypot="{{ page.honeypot_field }}" data-netlify="true" class="spaced-y-4">
<div class="spaced-y-1">
<label for="name" class="block">Name</label>
<input type="text" class="w-full p-2 border border--grey" id="name" name="name" required />
</div>
<div class="spaced-y-1">
<label for="email" class="block">Email</label>
<input type="email" class="w-full p-2 border border--grey" id="email" name="email" required />
</div>
<div class="spaced-y-1">
<label for="subject" class="block">Subject</label>
<input type="text" class="w-full p-2 border border--grey" id="subject" name="subject" required />
</div>
<div class="spaced-y-1">
<label for="message" class="block">Message</label>
<textarea id="message" class="w-full p-2 border border--grey" rows="5" name="message" required></textarea>
</div>
<p class="hidden">
<label>Dont fill this out if you're human: <input name="{{ page.honeypot_field }}" /></label>
</p>
<div>
<button class="button" type="submit">Send email</button>
</div>
<input type="hidden" name="_next" value="{{ site.url }}/contact/thanks" />
</form>
{% endblock %}

22
source/_pages/dev.md Normal file
View file

@ -0,0 +1,22 @@
---
title: Developing this Website (WIP)
---
This site is built with [Sculpin][], a static site generator written in PHP, that generates a static HTML website from Markdown files and Twig templates. You can see the [source code on GitHub].
## Extending Sculpin
- Custom Twig extensions
- https://github.com/opdavies/sculpin-twig-markdown-bundle
- https://github.com/opdavies/sculpin-gist-embed-bundle
- https://github.com/opdavies/sculpin-content-generator-bundle
## Front End
On the front-end, I have used [PostCSS][] rather than Sass or Less, and [Tailwind CSS] for all of the styling, and some [Vue.js][] for the navbar and toggling the navigation menu on mobile. These are compiled with [Webpack Encore][] - a wrapper around Webpack, provided by Symfony.
[PostCSS]: https://postcss.org
[Sculpin]: https://sculpin.io
[source code on GitHub]: https://github.com/opdavies/oliverdavies.uk
[Tailwind CSS]: https://tailwindcss.com
[Vue.js]: https://vuejs.org
[Webpack Encore]: https://github.com/symfony/webpack-encore

View file

@ -0,0 +1,175 @@
---
title: Experience
use: [posts]
experiences:
- company: horse_country
location: Cwmbran, Wales
role: Web Developer
start: 2010
end: 2011
description: |
Maintaining and adding new features to the Horse & Country TV website (Drupal 6).
- company: proctors
location: Bristol, England
role: 'PHP Developer'
start: 2011
end: 2012
description: |
Website development, mainly with Drupal and PHP, including the agencys first Drupal 7 project.
- company: nomensa
location: Bristol, England
role: 'Contract Drupal Developer / Application Developer & System Administrator'
start: 2012
end: 2013
description: |
Drupal 7 website development and Linux server administration.
I originally started as a contractor, and later took a staff role.
- company: precedent
location: Cardiff, Wales
role: Senior Drupal Developer
start: 2013
end: 2014
description: |
Drupal 7 website development, including site building, theming, module development, data migration and server configuration.
- company: drupal_association
role: Drupal.org Developer
location: Remote
start: 2014
end: July 2015
description: |
Maintaining and improving Drupal.org - the home of the Drupal community.
Speaking at user groups and DrupalCamps to promote the Drupal Association.
- company: microserve
location: Bristol, England
role: Senior Drupal Developer
start: July 2015
end: November 2015
description: |
Full-stack Drupal development, focussing on data migration.
Lead Developer of the [road.cc](http://road.cc) rebuild project onto Drupal 7, including working with non-Drupal PHP applications and utilising of Symfony components, and interacting with Drupal via REST.
Community and contribution advocate.
- company: cti
role: Lead Drupal Developer
location: Remote
start: November 2015
end: May 2016
description: |
Working on various Drupal 7 projects for clients including Greater London Authority (http://www.london.gov.uk), British Land and British Council, as well as various retainer contracts.
Working on internal Drupal 8 learning initiatives, focussing on custom module development and data migration.
Initial development of a CLI application for generating new and auditing existing codebases to ensure consistency across projects. This uses various Symfony components - mainly the Console and Filesystem components.
- company: appnovation
location: Cardiff, Wales
role: Senior Drupal Developer
start: May 2016
end: March 2017
description: |
Drupal 7 and 8 site building, custom module development and theming.
Part of various pre-sales teams, including the companys first UK Drupal 8 project and first FTSE 100 client.
- company: develop_me
location: Bristol, UK
role: Coding Fellowship Mentor
start: May 2018
end: March 2019
- company: microserve
location: Bristol, England
role: Senior Drupal Developer
start: March 2017
end: May 2019
description: |
Drupal 8 site building, custom module development, theming, data migrations.
Drupal 7 site building, custom module development, theming.
First Acquia certified Drupal 8 Developer and back-end specialist.
- company: freelance
location: Remote
role: 'Web Developer & System Administrator'
start: 2007
end: ~
featured: true
description: |
Working on Drupal and Symfony development, maintenance and support projects in my spare time.
Administration of Debian, Ubuntu and CentOS servers, and configuration using Puppet, or more recently, Ansible.
- company: inviqa
location: Remote
role: Senior Engineer
start: May 2019
end: ~
---
{% macro roleText(experience) %}
{{- experience.role }}
from {{ experience.start }}
to {{ experience.end|default('Present') -}}
{%- if experience.location %}
({{ experience.location }})
{%- endif %}.
{% endmacro %}
{% macro companyUrl(site, company) %}
{{ company.url ~ '?utm_source=' ~ site.short_url ~ '&utm_medium=experience' }}
{% endmacro %}
{% macro companyLogoUrl(company) %}
{{- '/images/experience/' ~ company.logo -}}
{% endmacro %}
{% block content %}
{% import _self as helpers %}
<div class="spaced-y-12">
{% for experience in page.experiences|reverse %}
{% set company = site.companies[experience.company] %}
<div>
<div class="flex flex-row justify-between">
<div>
<h2 class="text-lg mb-0">{{ company.name }}</h2>
<div class="mb-4">
{% if company.url -%}
<a class="inline-block text-sm mb-1" href="{{ helpers.companyUrl(site, company) }}">
{{- company.url -}}
</a>
{%- endif %}
<div class="text-sm text-gray-600">
{{ helpers.roleText(experience) }}
</div>
</div>
{% if experience.description %}
<div class="markup spaced-y-4">
{{ experience.description|markdown }}
</div>
{% endif %}
</div>
{% if company.logo %}
<div class="flex-none mt-2 mb-4 ml-4 w-16 sm:w-24 lg:w-32">
<img src="{{ helpers.companyLogoUrl(company) }}" alt="{{ company.name }} logo">
</div>
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% endblock %}

View file

@ -0,0 +1,168 @@
---
title: Open Source
projects:
drupal:
- name: Accessibility (a11y) Checklist
description: Similar to the SEO Checklist and QA Checklist modules, this module provides a checklist of accessibilty-related modules and tasks to perform on a Drupal site.
url: https://www.drupal.org/project/a11y_checklist
versions: [7]
- name: Block ARIA Landmark Roles
description: Inspired by Block Class, this module adds additional elements to the block configuration forms that allow users to assign a ARIA landmark role to a block.
url: https://www.drupal.org/project/block_aria_landmark_roles
versions: [7]
- name: Breadcrumbs by Path
description: A light-weight module which simply builds breadcrumb trails based on a URL alias.
url: https://www.drupal.org/project/breadcrumbs_by_path
versions: [7]
- name: Collection class
description: Integrates Laravels Collection class into Drupal 7.
url: https://www.drupal.org/project/collection_class
versions: [7]
- name: Comment Hide Subject
description: Hides the comment subject if the "Allow comment title" checkbox is unchecked for that node type.
url: https://www.drupal.org/project/comment_hide_subject
versions: [7]
- name: Commerce Cart Empty Paths
description: This module allows site administrators to define multiple paths, and when a user visits a non-declared page, their shopping cart is emptied.
url: https://www.drupal.org/project/commerce_cart_empty_paths
versions: [7]
- name: Copyright Block
description: Creates a block that allows you to configure a copyright message that automatically updates using the current year from the server that your site is hosted on.
url: https://www.drupal.org/project/copyright_block
versions: [7, 8]
- name: Image Style Class
description: Adds classes onto each rendered image showing the image style name.
url: https://www.drupal.org/project/image_style_class
versions: [7]
- name: Mapify
description: A module to make the implementation of mapify.js into Drupal 7 relatively simple.
url: https://www.drupal.org/project/mapify
versions: [7]
- name: Node Comment Block
description: This module moves the comments for a node into a moveable block.
url: https://www.drupal.org/project/node_comment_block
versions: [7]
- name: Null User
description: Adds a NullUser class for simpler code with less conditions.
url: https://www.drupal.org/project/null_user
versions: [8]
- name: Override Node Options
description: Allows permissions to be set to each field within the Authoring information and Publishing options field sets on the node form.
url: https://www.drupal.org/project/override_node_options
versions: [7, 8]
- name: Pathauto Menu Link
description: Forces an update of the Pathauto-generated path when a menu link item has been updated. Useful if you use parent menu links to generate paths.
url: https://www.drupal.org/project/pathauto_menu_link
versions: [7, 8]
- name: Private Message Queue
description: Adds the ability to queue private messages for sending.
url: https://www.drupal.org/project/private_message_queue
versions: [8]
- name: 'Rules Block/Unblock User'
description: Adds rules events, as well as some default rules, for when a user account is blocked or unblocked.
url: https://www.drupal.org/project/rules_block_user
versions: [7]
- name: SpeakerDeck Field
description: Adds a field for embedding content from SpeakerDeck.
url: https://www.drupal.org/project/speakerdeck_field
versions: [8]
- name: System User
description: Adds the ability to identify and retrieve system users.
url: https://www.drupal.org/project/system_user
versions: [7, 8]
- name: Toggle Optional Fields
description: Creates a simplified node form by allowing for the hiding and toggling of optional fields.
url: https://www.drupal.org/project/toggle_optional_fields
versions: [7]
- name: Webform ARIA
description: Adds ARIA support to forms created using the Webform module.
url: https://www.drupal.org/project/webform_aria
versions: [7]
- name: WP Blog Migrate
description: Convert your existing Drupal blog into the WP Blog module by re-assigning the content type for existing nodes and moving any existing tags into the WP Blog taxonomy vocabulary.
url: https://www.drupal.org/project/wp_blog_migrate
versions: [7]
sculpin:
- name: oliverdavies.uk
description: The source code for this website, which is built with Sculpin.
url: https://github.com/opdavies/oliverdavies.uk
- name: Sculpin Content Generator Bundle
description: Provides new Sculpin commands for generating new content.
url: https://github.com/opdavies/sculpin-content-generator-bundle
- name: Sculpin Gist Bundle
description: Allows for embedding GitHub Gists into a Sculpin site.
url: https://github.com/opdavies/sculpin-gist-embed-bundle
- name: Sculpin Skeleton
description: A skeleton project for the Sculpin static site generator.
url: https://github.com/opdavies/sculpin-skeleton
- name: Sculpin Twig Markdown Bundle
description: Enables rendering content from markdown, using Sculpins core markdown parser.
url: https://github.com/opdavies/sculpin-twig-markdown-bundle
- name: Sculpin Twig Sort by Field Bundle
description: Enables sorting an array by a certain field on each item.
url: https://github.com/opdavies/sculpin-twig-sort-by-field-bundle
php:
- name: Drupal Meetups Twitterbot
description: A Twitter bot that retweets posts about Drupal meetups.
url: https://github.com/opdavies/drupal-meetups-twitterbot
- name: Drupal VM CLI
description: A command line tool for Drupal VM.
url: https://github.com/opdavies/drupal-vm-cli
active: false
- name: Gmail Filter Builder
description: Allows you to define Gmail filters in PHP using a fluent API, and then generate XML that you can import into Gmail's filter settings.
url: https://github.com/opdavies/gmail-filter-builder
---
<p>I have written, open-sourced, and maintain a number of Drupal modules, Sculpin bundles and PHP projects - as well as the source code for this website! Here is some information about each project and a link to its project page.</p>
<div class="mb-4">
<h2>Drupal</h2>
{% include 'opensource/projects' with {
projects: page.projects.drupal
} %}
</div>
<div class="mb-4">
<h2>Sculpin</h2>
{% include 'opensource/projects' with {
projects: page.projects.sculpin
} %}
</div>
<div>
<h2>PHP</h2>
{% include 'opensource/projects' with {
projects: page.projects.php
} %}
</div>

View file

@ -0,0 +1,99 @@
---
title: Podcasts
podcasts:
howtocodewell:
name: How to Code Well
url: https://howtocodewell.fm
talking_drupal:
name: Talking Drupal
url: http://talkingdrupal.com
thatpodcast:
name: That Podcast
url: https://thatpodcast.io
episodes:
- title: 'Episode #175 - Automated Testing'
description: I joined the Talking Drupal team to discuss automated testing.
podcast: talking_drupal
date: 2018-09-05
url: http://talkingdrupal.com/175
audio: true
- title: 'Episode #204 - A Few Things'
description: I joined the Talking Drupal team again, where we discussed Drupal updates, conferences and more.
podcast: talking_drupal
date: 2019-03-25
url: http://talkingdrupal.com/204
audio: true
- title: What's new in Drupal 8+
description: Talking about Drupal, open source, Drupal 7 vs Drupal 8, module development, testing and more.
podcast: howtocodewell
date: 2019-04-12
url: https://howtocodewell.fm/episode/15-whats-new-in-drupal-8-plus-oliver-davies-interview
audio: true
video: true
- title: 'Episode 60 - The One Where We Talk Twig, Drupal, and Sculpin'
description: I joined Beau and Dave to talk about various topics including Drupal, the Sculpin static site generator, Twig, Tailwind CSS and Symfony.
podcast: thatpodcast
date: 2019-07-01
url: https://thatpodcast.io/episodes/episode-60-the-one-where-we-talk-twig-drupal-and-sculpin-with-oliver-davies
audio: true
- title: Static Site Generators
description: |
Talking again with Peter Fisher, this time about static site generators. We talk about what they are, when you should and shouldnt use them, and how to use them with a content management system like Drupal.
podcast: howtocodewell
date: 2019-07-19
url: https://howtocodewell.fm/episode/29-what-are-static-site-generators-oliver-davies
audio: true
video: true
---
{% macro episodeTitle(podcast, episode) -%}
{{ podcast.name }}: {{ episode.title }}
{%- endmacro %}
{% import _self as helpers %}
<header class="markup">
<p class="text-lg">As well as <a href="{{ site.menus.main.articles.href }}">writing posts</a> and <a href="{{ site.menus.main.talks.href }}">giving talks</a>, I also enjoy being on podcasts and speaking about interesting topics.</p>
<p class="text-lg">Here are the podcasts that Ive been on, including <a href="{{ page.podcasts.talking_drupal.url }}">{{ page.podcasts.talking_drupal.name }}</a> and <a href="{{ page.podcasts.howtocodewell.url }}">{{ page.podcasts.howtocodewell.name }}</a>.</p>
</header>
<div class="mt-10 spaced-y-10">
{% for episode in page.episodes|reverse %}
{% set podcast = page.podcasts[episode.podcast] %}
<article>
<h2 class="text-lg">
{% if episode.url %}
<a href="{{ episode.url }}" class="text-inherit" tabindex="-1">
{{ helpers.episodeTitle(podcast, episode) }}
</a>
{% else %}
{{ helpers.episodeTitle(podcast, episode) }}
{% endif %}
</h2>
<time class="text-sm text-gray-800 block mt-px mb-2" datetime="{{ episode.date|date('Y-m-d') }}">
{{ episode.date|date('jS F Y') }}
</time>
<div class="markup">
{{ episode.description|markdown }}
</div>
{% if episode.url %}
<a href="{{ episode.url }}" class="inline-block mt-2 text-sm text-gray-600 hover:text-gray-800 focus:text-gray-800">
{% if episode.video %}
Watch {{ episode.video and episode.audio ? 'or listen to' }}
{% elseif episode.audio %}
Listen to
{% endif %} this
<span class="visuallyhidden">{{ podcast.name }}</span>
episode &rarr;
</a>
{% endif %}
</article>
{% endfor %}
</div>

View file

@ -0,0 +1,57 @@
---
title: Projects
projects:
- title: Rebuilding Acquia
description: A clone of Acquias hosting dashboard, built with Vue.js and Tailwind CSS.
url: https://github.com/opdavies/rebuilding-acquia
- title: Rebuilding Bartik
description: A clone of Bartik (Drupals default theme), built with Vue.js and Tailwind CSS.
url: https://github.com/opdavies/rebuilding-bartik
- title: Joind.in Winner Picker
description: A Symfony 4 application that determines a randomly selected winner from a section of feedback left on Joind.in. Developed on behalf of the PHP South West (PHPSW) user group.
url: https://github.com/opdavies/joindin-winner-picker-new
- title: Drupal.org API library
description: A PHP library for interacting with the Drupal.org API.
url: https://github.com/opdavies/drupalorg-api-php
- title: Drupal Meetups Twitterbot
description: A Symfony 4 application for retweeting tweets about Drupal meetups.
url: https://github.com/opdavies/sculpin-skeleton
- title: Gmail Filter Builder
description: A library for writing Gmail filters in PHP, then exporting them to importable XML.
url: https://github.com/opdavies/gmail-filter-builder
- title: Sculpin Skeleton
description: A skeleton project for the Sculpin static site generator.
url: https://github.com/opdavies/sculpin-skeleton
---
<div class="spaced-y-4">
<p class="lead">Here are some of the open source projects that Ive written or currently maintain.</p>
<p class="lead">For the full list, see my <a href="{{ site.github.url }}">GitHub</a> and <a href="{{ site.drupalorg.url_new }}">Drupal.org</a> profiles.</p>
</div>
<div class="mt-8 spaced-y-10">
{% for project in page.projects %}
<article>
<h2 class="text-lg">
<a class="text-inherit" href="{{ project.url }}" tabindex="-1">
{{ project.title }}
</a>
</h2>
<p class="mt-1">{{ project.description }}</p>
<p class="mt-2 text-sm">
<a class="text-gray-600 hover:text-black" href="{{ project.url }}">
Find out more
<span class="visuallyhidden">about {{ project.title }}</span>
&rarr;
</a>
</p>
</article>
{% endfor %}
</div>

View file

@ -0,0 +1,37 @@
---
---
<div class="markup" markdown="1">
# Speaker Info
## Bio
[Oliver Davies][1] ([@opdavies][2]) has been building websites since 2007, and speaking at meetups and conferences since 2012. He is a Full Stack Developer and an Acquia certified Drupal Grand Master, who also has
experience with DevOps and systems administration as well as development with Symfony, Laravel, Sculpin and Vue.js.
He is a {{ site.work.role }} at [{{ site.companies[site.work.company].name }}][3], a Drupal core contributor and mentor, and an open source and contribution advocate.
He regularly blogs and gives talks about web development and systems administration, maintains and contributes to various open source projects, and co-organises DrupalCamp Bristol as well as the Drupal Bristol, PHP South West and PHP South Wales user groups.
## Photos
- <https://www.dropbox.com/s/den3ww3lpve08fa/precedent_thumb.jpg>
- <https://www.dropbox.com/s/etrahx3hq2vpqcb/phpnw17.png>
## Some Events Ive Spoken At
- DrupalCamp Brighton 2015
- DrupalCamp Bristol 2016
- DrupalCamp Dublin 2017
- DrupalCamp London (2014, 2015, 2016, 2017, 2019)
- DrupalCamp North 2015
- Nomad PHP
- PHP North West 2017 (10 year anniversary)
- PHP South Coast 2016
- PHP UK Conference 2018
- WordCamp Bristol 2019
</div>
[1]: {{site.url}}
[2]: {{site.twitter.url}}
[3]: {{site.companies[site.work.company].url}}

15
source/_pages/stream.md Normal file
View file

@ -0,0 +1,15 @@
---
title: Live Streaming
---
I like try and do some live coding when I can, whether Im working on a side project, my own website or some open source code. You can find my [stream link on YouTube][0], or view some previous streams below:
## Stream Playlists
- [Miscellaneous coding live streams][1]
{# - [Building the PHP South Wales website][2] #}
{# - [Using PHP to generate Gmail Filter XML with the Gmail Filter Builder][3] #}
[0]: {{site.youtube.stream.url}}
[1]: https://www.youtube.com/playlist?list=PLHn41Ay7w7kcWbjrYaiqXlfrqi_teTJE8
[2]: https://www.youtube.com/playlist?list=PLHn41Ay7w7keUxBa-6TNn0_xz27ZfLD5f
[3]: https://www.youtube.com/playlist?list=PLHn41Ay7w7keRp47rXEx9his-oA8kk4-v

View file

@ -0,0 +1,45 @@
---
title: Talks
meta:
description: 'Information about previous and upcoming talks that Oliver has presented at conferences and user groups'
use: [talks]
talks:
- title: 'Drupal and the LDAP module'
description: A review and demonstration of some of the recent single sign-on work that I did using Drupals LDAP module.
events:
- event: swdug
date: 2013-07-10
- title: 'About the Drupal Association'
description: An impromptu talk about what the Drupal Association is, and what work Ive been doing since I joined the Association staff.
events:
- event: swdug
date: 2014-08-19
- title: 'Automated testing with Drupal 8 and PHPUnit'
description: A workshop that I gave to teach others about automated testing in Drupal 8.
type: Workshop
events:
- event: drupal_bristol
date: 2018-06-27
---
{% block content %}
{% set talks = getTalks(page.talks|merge(data.talks)) %}
<header>
<p class="lead">
After giving my first talk in September 2012, I have now given {{ talks|pastEvents|length }} presentations at various conferences and meetups,
on topics including PHP, Drupal, Git, CSS and systems administration.
</p>
</header>
<div class="spaced-y-10 mt-6">
{% include 'talks/upcoming' with {
talks: talks|upcomingTalks,
} %}
{% include 'talks/past' with {
talks: talks|pastTalks,
} %}
</div>
{% endblock %}

7
source/_pages/terms.md Normal file
View file

@ -0,0 +1,7 @@
---
title: Development Terms
use: [posts]
---
# Development Terms
TODO

View file

@ -0,0 +1,49 @@
---
title: 'Test Driven Drupal: The Book'
mailchimp_url: 'https://oliverdavi.us18.list-manage.com/subscribe/post?u=b4ac8dd177796d37b93f9c285&amp;id=033c84e0d5'
contact_email: 'oliver@testdrivendrupal.com'
---
{% block content %}
<div class="markup spaced-y-4 mb-6" markdown="1">
Having [given talks][1] and workshops, been a guest on podcasts and [written articles][0] about automated testing in Drupal, Im currently in the planning phase of a book and potentially some accompanying screencasts about it, focussing on Drupal 8.
Im still thinking about what use-cases to cover and examples to include, but here are some of the things Im considering:
- What things to test, and what not to test
- The different types of available tests, and when to use each
- How to write testable code
- What happens when I run a test?
- How to run tests in the Drupal UI
- How to run tests with the `run-tests.sh` script
- How to install, configure and run tests with PHPUnit in Drupal 8
- Viewing HTML from run tests
- How to write your first test
- Debugging tests
- How to organise your test files
- Selecting the right base class and using test traits
- Writing your own base test classes, traits and assertions
- Managing dependencies for your tests (fields, configuration)
- Creating users, checking access with roles and permissions
- Creating pages and blocks with Views and testing the output
- Creating pages with routes and controllers and testing the output
- Testing custom plugins
- Testing queuing items and processing queues
- Testing sending emails
- Testing custom Twig filters and functions
<!-- - Testing data migrations -->
<!-- - Building and testing APIs using RESTful web services module -->
- Running tests as part of your continuous integration pipeline
Ill most likely be publishing it via Leanpub, and will be sending free chapters, early-bird discounts and links to screencasts and blog posts as I write the book to subscribers of the mailing list.
If you have questions or would like to suggest something for me to include in the book, please <a href="mailto:{{ page.contact_email }}">contact me</a>.
**Enter your email address to subscribe to the Test Driven Drupal mailing list and be notified of any updates.**
</div>
{% include 'pages/book/signup-form' %}
{% endblock %}
[0]: /articles/tags/testing
[1]: /talks/tdd-test-driven-drupal
[2]: /contact

View file

@ -0,0 +1,100 @@
---
title: Testimonials
use: [posts]
testimonials:
- name: Ed Welsby
image: ed-welsby.png
role: Senior Developer at <a class="text-blue-600 inline-block" href="http://www.proctors.co.uk">Proctor & Stevenson</a>
text: |
Oliver was great to work with, he has a solid knowledge of the various aspects of web development and never minded helping me out with Linux commands!
- name: Brian Healy
image: brian-healy.png
role: Director of Business Development at <a class="text-blue-600 inline-block" href="http://tincan.co.uk">Tincan</a>.
text: |
Oliver was fantastic to work with - pro-active and highly responsive, he worked well remotely and as part of a project team. His understanding of the project requirement(s) and ability to translate it into working code was essential and he delivered.
- name: Marlon Duncanson
role: 'Brand & Web Specialist'
text: |
Oliver is a great guy and really easy to work with. He really goes the extra mile to make sure the project is done properly. I would recommend him and will not hesitate to use him again in future.
- name: Brian Hartwell
role: Interactive Creative Director
text: |
Oliver was great to work with. He has expert knowledge with Drupal and delivered exactly what we were looking for on time. He's understanding, friendly and easy to get along with. I would enjoy working with him again in the future.
- name: Daniel Easterbrook
role: Digital Strategy Consultant
text: |
Oliver is seasoned Drupal and all round highly skilled and experienced web developer. I have worked with Oliver on an important project where he was reliable, prompt and ensured strict client deadline delivery and confidentiality at all times.
- name: James Chapman
role: Director at <a class="text-blue-600 inline-block" href="http://www.developmentdoneright.co.uk">Development Done Right</a>
image: james-chapman.png
text: |
We used Oliver on a number of occasions throughout 2012 and I have to say we've been delighted with his work. His skills working with Drupal are excellent particularly with custom module development and we wouldnt hesitate to recommend him others.
- name: Léonie Watson
role: >
Director of Accessibility at <a class="text-blue-600 inline-block" href="http://www.nomensa.com">Nomensa</a>
image: leonie-watson.jpg
text: |
Oliver is a flexible and hardworking developer, with a terrific knowledge of Drupal. He promotes accessibility best practice within the Drupal community, and is always happy to share his knowledge with other people.
- name: Holly Ross
role: >
Executive Director at the <a class="text-blue-600 inline-block" href="https://assoc.drupal.org">Drupal Association</a>
image: holly-ross.png
text: |
Oliver has been an outstanding contributor to the Drupal Association team. He is a talented developer who writes great code and applies his curiosity and love of learning to every project. He is also a fantastic team member, who gives to the team as much as he gets.
Oliver is the embodiment of everything good about the Drupal community.
- name: Josh Mitchell
role: CTO at the <a class="text-blue-600 inline-block" href="https://assoc.drupal.org">Drupal Association</a>
image: josh-mitchell.png
text: |
Oliver is a skilled Drupal developer with a passion for the Drupal community. As his direct supervisor, I was able to watch Oliver grow with the Drupal Association and contribute an amazing amount of effort and integrity to all of his work.
Everything we have thrown at Oliver, he has approached with an open and flexible mind that has allowed him to work on a wide range of projects and features for Drupal products.
- name: Chris Jarvis
image: chris-jarvis.jpg
role: Developer at <a class="text-blue-600 inline-block" href="https://microserve.io">Microserve</a>
text: |
Oliver is an amazing colleague, he's professional, full of knowledge and I could not recommend him more.
---
{% block content %}
<div class="spaced-y-12">
{% for testimonial in page.testimonials|reverse %}
<article class="flex flex-row-reverse items-center">
{% if testimonial.image %}
<div class="flex-none">
<img
src="{{ site.url }}/images/testimonials/{{ testimonial.image }}"
alt="{{ testimonial.name }}"
class="with-border with-padding rounded-full w-16 h-16 ml-4"
>
</div>
{% endif %}
<div class="flex-1">
<div class="mb-3">
<h2 class="mb-1 leading-none">{{ testimonial.name }}</h2>
{% if testimonial.role %}
<div class="text-gray-600 text-sm">
{{ testimonial.role|raw }}
</div>
{% endif %}
</div>
<div class="markup">
{{ testimonial.text|markdown }}
</div>
</div>
</article>
{% endfor %}
</div>
{% endblock %}