Sign in

Open source developer, working with Drupal and building Drupal Commerce.

GitHub Actions has made continuous integration seamless. Not because it is a superior product — I am by and far a huge fan of CircleCI — but because of its ease in integration. TravisCI was a huge breakthrough in continuous integration for open source projects. Instead of running a private Jenkins server, you could connect your GitHub repo to TravisCI and start building on each commit. However, both TravisCI, CircleCI, and other continuous integration tools require a multi-step setup. GitHub Actions (for better or worse) bypasses this.

Normally you need to commit your pipeline configuration files — .travis.yml, .circleci/config.yaml, etc…


Five years and two months ago, I joined Commerce Guys, which was primarily focused on building Not long after joining, Ryan, Bojan, and I spun Commerce Guys out of to refocus on Drupal Commerce. In that time, we created Drupal Commerce 2 for Drupal 8, grew from a scrappy team of three to a team of 16, rebranded the company to Centarro, and found new ways to grow the company and the open source project sustainably. After five incredible years of product and community development, I’m ready to start a new adventure.

This decision took a lot of…

I use DDEV-Local for my local development stack. DDEV leverages mkcert for trusted local development certificates. The mkcert tool has been a missing component in my local development stack for a long time. And, the best part, it has worked without any problems. Until this week. My coworker said that a script I wrote was not working — it kept failing saying that the remote certificate could not be validated. However, cURL had no complaints, nor did any web browser. I chalked it up as “works on my machine 🤷‍♂️.” Until today 😬.

I was working on the follow up…

This is the first of two blogs detailing how to build a middleware leveraging ReactPHP to consume data from an API, normalize it, and then push that data into Drupal through JSON:API. In this example will be grabbing data from the PokéAPI. In the second blog post, we will take the data and create Pokémon nodes on a Drupal site.

The purpose of the middleware is to avoid putting this logic into the Drupal codebase. Drupal has an amazingly robust Migration API for consuming data and processing data to create content. Every Drupal site I have ever worked on —…

The other week, I was asked about how I maintain my PHPUnit config file for my Drupal projects. When running Drupal’s PHPUnit test suites, you typically copy and modify the distribution phpunit.xml.dist file which lives in the web/core subdirectory. There is just one problem. This directory is technically a vendor directory and is replaced during any updates to the drupal/core dependency of your Drupal project. Every minor version will cause your file to reset, or anytime you install dependencies if Drupal core is patched.

One thing I noticed is that since I first followed your tuts a while back, my…

Drupal has four PHPUnit test suites: Unit, Kernel, Functional, and FunctionalJavascript. Each test suite offers various levels of integration with the Drupal code base.

  • Unit tests are stateless
  • Kernel tests allow for minimal Drupal bootstrapping for stateful testing with the database
  • Functional tests perform a full Drupal installation and allow interacting with Drupal through a mocked browser
  • FunctionalJavascript tests perform a full Drupal installation and allow interacting with Drupal through WebDriver.

There are tradeoffs between each test suite. Unit tests require mocking of a lot of classes in exchange for speed and not needing a database connection. Kernel tests allow…

This past Sunday I did a livestream where I tried out the new issue forks functionality on The feature is currently beta and project maintainers need to opt-in for the functionality. At the moment you can create a repository fork for an issue, create a work branch, and commit to that branch. You will need to manually create a patch to be uploaded, as Merge Requests with issues are still being worked on (the Drupal Association Infrastructure team is hoping to have this available for DrupalCon Global!)

When you view an issue that supports issue forks, there will…

On Sunday I did my first live stream where I upgraded my personal site to Drupal 9. It was a fun experience and I learned a few things — both for streaming and upgrading.

I managed to deploy a broken version of my site because I blindly trusted Composer metadata would prevent incompatible modules from allowing Drupal 9 to install. I was wrong. I forgot to use the Upgrade Status module to check if all of my contrib modules were compatible. I forgot to test the deploy and upgrade locally. 🤦‍♂️ Oops. Everything is fine, now. …

I use the Content Moderation module on my personal site to managed my publication workflow. One of my pet peeves if when I accidentally forget to adjust a blog post’s creation timestamp once published. Sometimes it is only a few hours old, sometimes it is a week. I finally sat down to fix this small annoyance. Only to find out fixing it wasn’t as simple as I would have thought.

I am fairly used to working with the State Machine module, as it is a backbone in Drupal Commerce for order workflows. We have Workflows, States, and Transitions in State…

I write a lot of tests for all of my Drupal code. I try to live by Test Driven Development. It delivers cleaner code. It helps define your architecture without full implementation details. I also despise clicking and manually testing things.

However, testing in Drupal is still somewhat painful. Time. Since so many things require the database tests can get slow. Even the Kernel test suite which uses a most minimally bootstrapped environment.

Because of this, I’m a huge fan of using mocked objects. If you’re not familiar with mocking in tests, check out the documentation for using Prophecy

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store