All RPGs and Storygames by Tod Foley are now available at DrivethruRPG and RPGnow. Bring these games to your table!
This blog has been quiet for the last year and a half, because I don’t like to announce things until I feel comfortable recommending them. Until today!
Since July 2016, API-First Drupal became my primary focus, because Dries felt this was one of the most important areas for Drupal’s future. Together with the community, I triaged the issue queue, and helped determine the most important bugs to fix and improvements to add. That’s how we ended up with REST: top priorities for Drupal … plan issues for each Drupal 8 minor:
- 8.2.x — results (25% of release notes issues)
- 8.3.x — results (10% of release notes issues)
- 8.4.x — results (14% of release notes issues)
- 8.5.x — in progress!
If you want to see what’s going on, start following that last issue. Whenever there’s news, I post a new comment there.
But enough background. This blog post is not an update on the entire API-First Initiative, it’s about a particular milestone.100% integration test coverage!
The biggest problem we encountered while working on rest.module, serialization.module and hal.module was unknown BC breaks 1. Because in case of a REST API, the HTTP response is the API. What is a bug fix for person X is a BC break for person Y. The existing test coverage was rather thin, and was often only testing “the happy path”: the simplest possible case. That’s why we would often accidentally introduce BC breaks.
Hence the clear need for really thorough functional (integration) test coverage2, which was completed almost exactly a year ago. We added EntityResourceTestBase, which tests dozens of scenarios3 in a generic way4, and used that to test the 9 entity types, that already had some REST test coverage, more thoroughly than before.
But we had to bring this to all entity types in Drupal core … and covering all 41 entity types in Drupal core was completed exactly a week ago!
The test coverage revealed bugs for almost every entity type. (Most of them are fixed by now.)
Tip: Subclass that base test class for your custom entity types, and easily get full REST test coverage — 41 examples available!Guaranteed to remain at 100%
We added EntityResourceRestTestCoverageTest, which verifies that we have test coverage for all permutations of:
- entity type
- format: json + xml + hal_json
- authentication: cookie + basic_auth + anon
It is now impossible to add new entity types without also adding solid REST test coverage!
If you forget that test coverage, you’ll find an ASCII-art llama talking to you:
Good people of #Drupal, I present unto you the greatest method of all time. https://github.com/drupal/drupal/blob/8.5.x/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php#L141 pic.twitter.com/TiWLPt7duH— webcsillag (@webchick) December 8, 2017
That is why we can finally say that Drupal is really API-First!
So many people have helped! In random order: rogierbom, alexpott, harings_rob, himanshu-dixit, webflo, tedbow, xjm, yoroy, timmillwood, gaurav.kapoor, Gábor Hojtsy, brentschuddinck, Sam152, seanB, Berdir, larowlan, Yogesh Pawar, jibran, catch, sumanthkumarc, amateescu, andypost, dawehner, naveenvalecha, tstoeckler — thank you all!5
Special thanks to three people I omitted above, because they’re not well known in the Drupal community, and totally deserve the spotlight here, for their impressive contribution to making this happen:
- arshadcn from the U.S. — helped on loads of the test coverage issues, often posting so many patches I had trouble keeping up!
- vaplas from Bulgaria — helped on almost every test coverage issue, and posted an epic comment on the three most important submilestones, making everyone smile: one, two, three
- jamesdesq from the U.K. — helped on many of of the test coverage issues, and wrote an amazing blog post titled How I learned to stop worrying and love Drupal contribution about his experience. One of those issues was his very first core patch!
That’s thirty contributors without whom this would not have happened!
And of course thanks to my employer, Acquia, for allowing me to work on this full-time!Next
What is going to be the next big milestone we hit? That’s impossible to say, because it depends on the chains of blocking issues that we encounter. It could be support for modifying and creating config entities, it could be support for translations, it could be that all major serialization gaps are fixed, it could be file uploads, or it could be ensuring all normalizers work in both rest.module & jsonapi.module …
The future will tell, follow along!
Backwards Compatibility. ↩︎
Including helpful error responses when unauthenticated, unauthorized or just a bad request. This vastly improves DX: no need to be a Drupal expert to talk to a REST API powered by Drupal! ↩︎
It is designed to be subclassed for an entity type, and then there are subclasses of that for every format + authentication combination. ↩︎
And this is just from all the per-entity type test issues, I didn’t look at the blockers and blockers of blockers. ↩︎
Provides a Drupal Console command which can generate a composer.json from your installed Drupal code base, which can be used to regenerate that code base by running composer install. Embrace the future!
To use, install Drupal Console. Then install this module, and run this command from inside your Drupal root:$ drupal make:composer
This will output the contents of the generated composer.json. To save it to a file, pipe it:
This module contains a behavior plugin for the Paragraphs module. This plugin allows you to select a different view mode for the paragraph in the content add/edit form.
LakeDrops Drupal Consulting, Development and Hosting: 3 minutes: Starting Drupal 8 project with a composer template
Starting a new Drupal 8 project with the LakeDrops composer template only takes less than 3 minutes. And in that short period of time you're note only getting the code base but also a number of extra benefits:
Today’s guest article is by Chris Baker, who talks about the role of dreams in gaming. – Never quite awake John
Most of us experience dreams as we sleep, but do your player characters have dreams? A dream can be a pleasant reminder of times past, a previously unexpressed desire or, possibly, an omen or a deeper, more troubling experience. Dreams are an opportunity for a GM to further character development in a “low risk” environment. A dream can be used to give the flavour of an impending encounter – especially if that encounter is one where the party is unprepared or has underestimated the hazard of the situation. A dream can also help a character examine their past or relive an important experience.
They can also be used to foreshadow an impending plot development or, if beneficial, help the players circle back on an item or event that has gone overlooked. The dream does not need to fit the current plot or situation. It could inform that situation, of course, or prepare a player or party for a sense of deja vu. A dream could comfort the afflicted as much as it can afflict the comfortable. A dream can be an encounter or an event (or both).What is a dream?
As dreamers know, there are few rules when it comes to dreams. They need not follow logic or the classical unities of time, space and character. In fact, most dreams have a tinge of the unreal while being very immediate and compelling.
Despite the unlimited possibilities, a GM should be mindful that dreams are often fast paced and brief, even if they contain many scenes. There is no need for a supporting logic – you can skip from the youthful sunny day in the backyard to confronting a nameless terror as an older version of the character.
Personally, I would avoid the “you die in your sleep, you die in real life” conundrum. Your players may have that belief, which may heighten the stakes for them, but I would not recommend that you actually follow that rule. Likewise, damage taken in a dream state should not be imposed on the character. There are exceptions, such as the dream being a malicious manifestation of an enemy, but dreams should likely be a safe space for everyone, including the GM.The Dream Itself
As GM, you control all the variables within the dream. The character (or characters) can be fully-equipped, partially-equipped or not equipped at all. They can be dressed for a social situation or clinging to a blanket (or shrubbery) for modesty’s sake. Their favoured weapon may be stuck in a scabbard or completely discharged. They may even be attending their own funeral.
As a GM, you should consider the use of the dream as part of the individual or group story arc. This may help you to reinforce a plot point or foreshadow a new arrival. There is no reason why a party cannot share a dream – especially if that dream is a “sending” by another creature, a patron or other “interested observer.”
Dreams can also be interrupted. For example, Samuel Coleridge was dreaming his great poem Xanadu when he was interrupted by an unexpected visitor. Imagine a situation where a character (or characters) are about to learn a key piece of information when they are woken by the housekeeping staff bringing fresh towels.“We are the stuff that dreams are made of.”
Dreams can be a powerful tool for a GM. They can help course-correct a party in a more gentle fashion than the old railroad. They can offer insight into a character or situation. Dreams are also mysterious and can fit into almost any RPG scenario.
One final caution. The television series Dallas wrote off two seasons of their show as “a dream” by one of the principle characters. While this might be an inventive way to reboot a stale campaign – taking the characters back to an earlier “fork in the road” – it did not save the show.
Have you used dreams in your games? How did you handle dream logic vs game rules? What did doing dream sequences add to the game?
My tenure with the Ægir Project only dates back about 7 or 8 years. I can’t speak first-hand about its inception and those early days. So, I’ll leave that to some of the previous core team members, many of whom are publishing blog posts of their own.New look for www.aegirproject.org
As part of the run-up to Ægir’s 10-year anniversary, we built a new site for the project, which we released today. It will hopefully do more justice to Ægir’s capabilities. In addition to the re-vamped design, we added a blog section, to make it easier for the core team to communicate with the community. So keep an eye on this space for more news in the coming weeks.Ægir has come a long way in 10 years
When I first tried to use Ægir (way back at version 0.3), I couldn’t even get all the way through the installation. Luckily, I happened to live in Montréal, not too far from Koumbit, which, at the time, was a hub of Ægir development. I dropped in and introduced myself to Antoine Beaupré; then one of Ægir’s lead developers.
One of his first questions was how far into the installation process I’d reached. As it turns out, he frequently asked this question when approached about Ægir. It helped him gauge how serious poeple were about running it. Back then, you pretty much needed to be a sysadmin to effectively operate it.
A few months, Antoine had wrapped the installation scripts in Debian packaging, making installation a breeze. By that point I was hooked.Free Software is a core value
Fast forward a couple years to DrupalCon Chicago. This was a time of upheaval in the Drupal community, as Drupal 7.0 was on the cusp of release, and Development Seed had announced their intention to leave the Drupal community altogether. This had far-reaching consequences for Ægir, since Development Seed had been the primary company sponsoring development, and employing project founder and lead developer Adrian Rossouw.
While in Chicago I met with Eric Gundersen, CEO of DevSeed, to talk about the future of Ægir. Whereas DevSeed had sold their flagship Drupal product, OpenAtrium, to another company, Eric was very clear that they wanted to pass on stewardship of Ægir to Koumbit, due in large part to our dedication to Free Software, and deep systems-level knowledge.Community contributions are key
Since then Ægir has grown a lot. Here is one of the more interesting insights from OpenHub’s Ægir page:Very large, active development team Over the past twelve months, 35 developers contributed new code to Aegir Hosting System. This is one of the largest open-source teams in the world, and is in the top 2% of all project teams on Open Hub.
To help visualize all these contributions, we produced a video using Gource. It represents the efforts of no less than 136 developers over the past 10 years. It spans the various components of Aegir Core, along with “Golden” contrib and other major sub-systems.
Of course, many other community members have contributed in other ways over the year. These include (but aren’t limited to) filing bug reports and testing patches, improving our documentation, answering other users’ questions on IRC, and giving presentations at local meetups.The Future
The core team has been discussing options for re-architecting Ægir to modernize the codebase and address some structural issues. In the past few months, this activity has heated up. In order to simultaneously ensure ongoing maintenance of our stable product, and to simplify innovation of future ones, the core team decided to divide responsibilities across 3 branch maintainers.
Herman van Rink (helmo) has taken up maintenance of our stable 3.x branch. He’s handled the majority of release engineering for the project for the past couple years, so we can be very confident in the ongoing stability and quality of Ægir 3.
Jon Pugh, on the other hand, has adopted the 4.x branch, with the primary goal of de-coupling Ægir from Drush. This is driven largely by upstream decisions (in both Drupal and Drush) that would make continuing with our current approach increasingly difficult. He has made significant progress on porting Provision (Ægir’s back-end) to Symfony. Keep an eye out for further news on that front.
For my part, I’m pursuing a more radical departure from our current architecture, re-writing Ægir from scratch atop Drupal 8 and Ansible with a full-featured (Celery/RabbitMQ) task queue in between. This promises to make Ægir significantly more flexible, which is being borne out in recent progress on the new system. While Ægir 5 will be a completely new code-base, the most of the workflows, security model and default interface will be familiar. Once it has proven itself, we can start pursuing other exciting options, like Kubernetes and OpenStack support.
So, with 10 years behind us, the future certainly looks Bryght*.
* Bryght was the company where Adrian Rossouw began work on “hostmaster” that would eventually become the Ægir Hosting System.