Drupal

Jacob Rockowitz: It is okay for you to plan an exit strategy, we should be okay with off-boarding contributors, and everyone says goodbye

Planet Drupal - 7 May 2018 - 4:32pm

People come and go from open source projects and communities

Most people would agree that everyone should contribute something back to Open Source at some point in their careers. We have to realize that an ongoing Open Source contribution to a project can't be sustained forever. We might graduate from college, get a new job, need a break to travel, have kids, help raise grandkids, retire and even get bored with a project. While we need to improve open source sustainability, we also need to accept the reality that people continually come and go from open source projects.

Developer burnout should not be part of open source

Up until recently, I felt that 'burnout' was the only talked about method when people left the Drupal community. Up until DrupalCon, I thought that once I committed to supporting something, like a module, I was obligated indefinitely or at least until I burned-out from supporting it.

In my new year blog post title, Webform, Drupal, and Open Source...Where are we going?, I stated…

...and I don't think I am the only one.

Are we expecting too much?

Jeff Eaton's presentation titled "You Matter More Than The Cause" addresses burnout and how it impacts the sustainability of teams and he says…

I think we need to stomp out the concept of developer burnout in Open Source and equate developer burnout to poorly-managed companies and organizations.

Planning an exit strategy can prevent burnout

One of many valuable lessons I learned at Adam Goodman's Teamwork and Leadership Workshop at DrupalCon Nashville was that it’s okay to plan an exit strategy, it’s even something that can ultimately help the community and potentially...Read More

Categories: Drupal

Case-insensitive Files

New Drupal Modules - 7 May 2018 - 12:28pm

The Case Insensitive Files module allows users to use case insensitive URLs to request static files, even when Apache `mod_rewite` is used to generate SEO-friendly URLs. While this should not be necessary when using the Apache `mod_speling` module with `CheckSpelling on` and `CheckCaseOnly on`, the issue is that `mod_rewrite` has priority over `mod_speling`. So if one specifies a file with the wrong case in /sites/all/files, it handled by Drupal, which does a case-sensitive look-up and returns a 404.

Categories: Drupal

Palantir: Supporting Innovation Through Contribution

Planet Drupal - 7 May 2018 - 12:18pm
Supporting Innovation Through Contribution brandt Mon, 05/07/2018 - 14:18 George DeMet May 8, 2018

Companies, agencies, and organizations that contribute to the Drupal project and community play a key role in supporting and sustaining a culture of innovation.

Drupal has a long and rich history of supporting and sparking innovation. Drupal 8 in particular represents a fundamental shift in thinking about how websites and other digital experiences are built. With its modular architecture, improved APIs, configuration management, and native web services support, Drupal 8 is well-positioned to help connect people, technology, and information in ways that have never before been possible.

Companies, agencies, and organizations that contribute to the Drupal project and community play a key role in supporting and sustaining a culture of innovation. This contribution can take on many forms, including setting aside time for employees to contribute to the Drupal project and community, sponsoring people to work exclusively on Drupal, and donating money to sponsor Drupal initiatives and events.

Impact of Contribution on Innovation

An ever-growing body of research into open source ecosystems is shedding light into the ways that different forms of contribution have on innovation for firms who contribute as well as the projects that benefit from those contributions. Firms that contribute to Drupal are generally driven by extrinsic motivators, such as the belief that working with the community will help them develop better products, or provide them with increased visibility and status within the community, which in turn helps drive sales and/or recruit talent.

Jonathan Sims, a professor of strategy at Babson College, has spent years studying how firms in the Drupal ecosystem engage with each other and the project to promote open innovation. In a 2016 paper published in the Oxford Journal of Industrial and Corporate Change, he found that while the impacts of contribution on a firm’s productivity are usually marginal, contribution does help expand social ties and can shift strategic posture and promote innovation.

While contributing code is associated with stronger social ties and more incremental innovations, providing help or support to others in the community is associated with a more conservative strategic posture, but more radical innovations. Firms that primarily contribute code to projects like Drupal are more likely to be building on top of someone else’s work and/or collaborating with someone else to solve a shared problem. Providing help on the other hand, is much more context-dependent and is more likely to lead to new questions and possible new insights, thus providing more opportunities for radical innovation within a given domain.

The Virtuous Cycle

Regardless of what form contribution takes, participating in an open source ecosystem like Drupal requires that firms be open and willing to share their knowledge and intellectual property with others. Drupal project lead Dries Buytaert has discussed how companies and organizations like Pfizer and Hubert Burda Media are not only sharing Drupal contributions with their competitors, but also challenging those competitors to contribute back as well. He argues that by working together, these organizations not only gain a competitive edge, but also reap the benefits of accelerated innovation:

“Those that contribute to open source are engaging in a virtuous cycle that benefits their own projects. It is a tide that raises all boats; a model that allows progress to accelerate due to wider exposure and public input.”

We’ve seen this virtuous cycle play out countless times at Palantir. One example is from several years ago, when we found that out that on many of the projects that we worked on, clients often had a specific set of expectations around content workflow and editorial access based on their experience with other platforms, and that all too often, Drupal didn’t meet those expectations out of the box. In response to this business need, we created and released a suite of modules called Workbench that provided a unified interface and tools to enable authors and editors to focus on managing their content.

While Palantir team members did the initial heavy lifting on the code development for Workbench, over time, other firms (including some of our competitors) started using and extending the system, building on top what we had released. Thanks to the efforts of those involved in the Drupal Workflow Initiative, the moderation functionality of Workbench was added to Drupal core as the Content Moderation module, making the software better for everyone. This in turn makes Drupal a more attractive choice than competing platforms and expands the market for the firms that work with it.

Extrinsic and Intrinsic Motivation

In contrast to the external incentives that drive most firms to contribute to open source projects like Drupal, individuals are more likely to be driven by intrinsic motivators to contribute. Not only do they get to feel like they’re part of something bigger than themselves, but participating in the Drupal community is also a good way to form social ties with other like-minded people who want to see their contributions make a difference in the world.

Despite the large number of individual contributors to the Drupal project, a very small number do the majority of the work. Contribution data on Drupal.org reveals that nearly half of the people who contributed code to the project got just one credit, while the top .4% of all contributors (30 people) accounted for over 17% of the total credits.

One likely reason for this imbalance is Drupal’s reputation for having a steep learning curve. User research conducted by Whitney Hess and the Drupal Association in 2014 found that while the project is good at onboarding people at the entry level of engagement, the transition to higher levels is much more challenging and is where many people end up dropping out of the project.

Providing resources and support to help more people move up the contribution ladder helps spread the burden across more shoulders, introducing new perspectives and reducing burnout, particularly within the core developer community. Having more engaged community members also helps mitigate one of the historical hurdles to Drupal adoption, which is the shortage of skilled developer talent.

Firms that work in the Drupal ecosystem can both address the talent shortage problem and support innovation within their own organizations by supporting professional development opportunities that help their employees “level up” existing skills and pass on knowledge to less experienced team members. For many organizations, this is also a much more economical and sustainable way to build and grow a Drupal team than relying exclusively on hiring from a limited and increasingly in-demand pool of existing “rockstar” talent.

Removing Barriers to Contribution

It is vitally important for any open source project to remove barriers to contribution, whether real or perceived, because they undermine both the intrinsic motivations of individual contributors and the extrinsic motivations of companies, agencies, and other organizations. Likewise, it’s important for projects not to place too much emphasis on extrinsic motivators, as that can also undermine intrinsic motivation. In this way, recognizing different kinds of contribution can be a delicate balancing act.

Over the last few years, the Drupal Association and others have worked to help track and acknowledge more forms of contribution on Drupal.org by improvements to user and organizational profile pages, adding the ability for organizations to receive credit for work on projects and issues, and tying case studies directly to organizations as well as individual contributors. Along with paid sponsorships, these improvements enable companies and organizations who contribute to the project and community to receive greater visibility on Drupal.org, which benefits both sales and recruiting efforts.

Other forms of contribution, such as local event and user group sponsorship and organization, writing documentation, and providing mentorship are less easy to measure, but also critically important to the health of the project. In a paper presented at DrupalCon Barcelona in 2015, David Rozas, a sociologist and computer scientist who studies the technical and social aspects of technology, argued that these kinds of “community-oriented” contributions are actually more important to a project’s long-term sustainability than code contributions because they are emotional experiences that serve to strengthen the project’s sense of community.

Firms that are not in a position to contribute code to Drupal can contribute time and/or money toward efforts that help promote the project and community, such as local and regional events or Drupal Association partnership programs and special initiatives. These kinds of contributions can often have a greater impact on innovation than code alone.

Thank You for Your Support!

Drupal boasts one of the largest and most diverse communities of any open source project, which along with a culture that supports and values contribution, has enabled it to become a leading platform for digital innovation. With the support of the companies, organizations, and individuals that use and contribute back to it every day, Drupal is poised to inspire innovation for many years to come.

Community Drupal Open Source People Workbench
Categories: Drupal

Palantir: Conscious Decoupling: The Case of Palantir.net

Planet Drupal - 7 May 2018 - 10:31am
Conscious Decoupling: The Case of Palantir.net brandt Mon, 05/07/2018 - 12:31 Ken Rickard May 9, 2018

Our new site uses VueJS to produce single page applications. By tying these applications to content creation, our content editors can create dynamic new pages without needing an engineer.

Alex Brandt recently wrote about the new redesign of the new Palantir.net site: what the goals were, what we wanted to improve, and the process by which we approached the project. I want to speak more from a development viewpoint around how we decoupled the new www.palantir.net site in order to create better relationships between content.

A major goal of our 2018 redesign was to feature more content and make it easier for people to surface topics that interest them. The strategic plan and design called for a system that allows people to filter content from the home page and other landing pages (such as our Work page).


In the modern web, people expect this filtering to take place without a page refresh. Simply select the filter and the content should update immediately.

This presents an opportunity to explore methods for achieving this effect. In addition, the following features were desired:

  • The ability to feature specific content at the top of the page
  • A process to insert content other than Drupal pages into the list display
  • A way to select what types of content appear on the page
  • A method to restrict the total count of items displayed on the page
  • The ability to add one or two filters to the page; or none at all

From the developer’s point-of-view, we also added:

  • The ability to allow editors to create and configure these dynamic pages without additional programming

The design and development of the new site followed our understanding of what “content” means to different teams. We know that understanding how to implement the design requirements isn’t enough. We had to think through how editors would interact with (and control) the content.

There is a lot of talk around “decoupled” Drupal these days — the practice of using Drupal as an editing environment and then feeding data to a front-end JavaScript application for rendering. Certainly we could have chosen to decouple the entire site. That process, however, brings extra development time and overhead. And in our case, the site isn’t large enough to gain any advantage from rapidly changing the front-end.

So instead we looked at ways to produce a dynamic application within Drupal’s template system. Our technical requirements were pretty standard:

  • A template-driven JavaScript content engine
  • Rendering logic (if/else and simple math)
  • Twig compatibility
  • A single source file that can be served from CDN or an application library

This last requirement is more a personal preference, as I don’t like long, fixed dependency chains during development. I specifically wanted a file I could drop in and use as part of the Drupal front-end.

Based on these requirements and a few basic functionality tests, we settled on the VueJS library. Vue is a well-documented, robust framework that can be run server-side or client-side. It provides DOM-manipulation, templated iteration, and an event-driven interaction API. In short, it was perfect for our needs.

Even better, you can start using it immediately:

 

At the core of Vue.js is a system that enables us to declaratively render data to the DOM using straightforward template syntax. Vue uses the handlebars syntax -- familiar to Twig users -- to define and print variables set by the application:


  {{ message }}

var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

When working with Twig, which also uses handlebars to wrap variables, we must wrap VueJS variables in the {% verbatim %} directive like so:


  {% verbatim %}{{ item.slug }}{% endverbatim %}

Unless you hardcode variables, Vue pulls all of its data via JSON, which can be provided out-of-the-box by Drupal’s Views module.

To make the application work, we needed to provide the following elements:

  • A JSON feed for content to display, with featured items at the top
  • A JSON feed for each filter to use
  • A JSON feed for insert content

The first elements -- content -- consists of two JSON directives controlled by editors. First, there is a Featured Content field that can be used to select content for the top of the page:

Editors may choose to only populate this content, and they may choose as many items as they wish. Below this content, we optionally add additional content based on type. Editors may select what types of content to add to the page. For the homepage, we include four content types:

Editors may then select which filters to use, if any are desired. Two options are available, but one can be selected. The filters may be sorted as desired.

Further, if the editor selects the Filter by Type option, the first filter will be replaced by a Content Type list taken from the selections for the current page. This technique is made easier by the dynamic nature of the VueJS application, which is expecting dynamic content. It has the added bonus of making the work future proof, as editors can add and adjust pages without additional coding.

Lastly, editors can add “insert” content to the page. These inserts are Drupal Paragraphs -- custom fielded micro-content -- that optionally appear sprinkled through the content.

These inserts leverage Vue’s logic handling and template system. Here is a code snippet for the inserts:

 
   
     
       
          {% verbatim %}{{ item.link_text | decode }}{% endverbatim %}
          {% verbatim %}{{ item.slug | decode }}{% endverbatim %}
       
     

   
   
     
       
         
            {% verbatim %}{{ item.slug | decode }}{% endverbatim %}
         
         
            {% verbatim %}{{ item.author | decode }}{% endverbatim %}
             
               
                {% verbatim %}{{ item.link_text | decode }}{% endverbatim %}
               

             
             
                {% verbatim %}{{ item.link_text | decode }}{% endverbatim %}
             
           
         
       
     
   
   
     
       
          {% verbatim %}{{ item.slug | decode }}{% endverbatim %}
          {% verbatim %}{{ item.link_text | decode }}{% endverbatim %}
       
     
   
 

The v-if directive at the start tells the application to only render the entire template if the parent_id property is present. Since that property is unique to Paragraphs, this template is skipped when rendering a blog post or case study.

In cases of content types, we have a standard output from our JSON feed, so one template covers all use-cases:

 
 
   
   
      {% verbatim %}{{ item.type }}{% endverbatim %}
      {% verbatim %}{{ item.title | decode }}{% endverbatim %}
     
   
   
      {% verbatim %}{{ item.dates | decode }}{% endverbatim %}
      {% verbatim %}{{ item.location | decode }}{% endverbatim %}
   
   
     
      {% verbatim %}By {{ item.author_display }}{% endverbatim %}
   
   
      {% verbatim %}{{ getLinkText(item.type) }}{% endverbatim %}
   
   

 
 

Note the v-bind directive here. Vue cannot parse variables directly in HTML tag properties, so it uses this syntax to interact with the DOM and rewrite the element.

Other nice features include adding method calls like {{ getLinkText(item.type) }} that let Vue perform complex calculations on data elements. We also use Vue’s extensible filter system {{ item.summary | decode }} to perform actions like HTML escaping.

For instance, we pass the index position, content type, and background image (if present) to the getClass() method of our application:

// Get proper class for each cell.
getClass: function(index, type, image) {
  var $class = '';
  if (index == 2 || index == 5 || (index > 12 && index % 5 == 1)) {
    $class = $class + ' grid-item--lg';
  }
  if (type == 'Case Study') {
    $class = $class + ' grid-item--cs grid-item--dark';
  }
  else if (type == 'Collection') {
    $class = $class + ' grid-item--collection';
    if (index % 2 == 1) {
      $class = $class + ' grid-item--dark';
    }
  }
  else {
   $class = $class + ' grid-item--default';
  }
  if (image === undefined || image.length === 0) {
    if (index % 2 == 1) {
      return $class + ' grid-item--dark';
    }
    return $class;
  }
  return $class + ' grid-item--dark';
},

This technique lets us provide the light and dark backgrounds that make the design pop.

The end result is exactly what we need to deliver the experience the audience expects. And we get all that within a sustainable, extensible platform.

Is a decoupled Drupal site right for you? For us, a dynamic (yet not fully decoupled) instance made the most sense to improve the experience for our site users. We’d love to discuss whether or not the same flexibility would be beneficial for your site. Drop us a line via our contact form, or reach out via Twitter (@palantir).

Design Development Drupal Site Building
Categories: Drupal

Token or

New Drupal Modules - 7 May 2018 - 8:07am

This module makes it possible to use tokens separated by a pipe. It returns the first one that matches.

[node:field_og_image:entity:url|node:field_header_image:entity:url]

Categories: Drupal

Lucius Digital: Lucius launches Drupal platform for SOS Children's Villages

Planet Drupal - 7 May 2018 - 8:03am
The new platform for SOS Children's Villages was recently launched, after 3 sprints with a lead time of 3 months and a team of 6 people on average, we are proud to announce this new platform.
Categories: Drupal

Splash Screenshot

New Drupal Modules - 7 May 2018 - 6:40am

DESCRIPTION
Allows the management of one or more "Splash Screens screenshot", which are modal popups. If they accept or reject the offer, the modal will close. (If they select Do not Show Again, then a cookie is set so as to avoid futher display.) You may define path for the splae offer , and you have to create only one offer for the page. So you con't create two offer for the same page.

The module was born as a way to advertise a website companion app and offer a button to download, but it's generalized nature has the potential for many other applications.

Categories: Drupal

Views Entity Form Field

New Drupal Modules - 7 May 2018 - 6:25am

Add form field widgets to a view to edit multiple entities at one time.

Categories: Drupal

Telstra Messaging API

New Drupal Modules - 7 May 2018 - 5:50am

Telstra is an Australian telecommunication company, is providing 1000 SMS/MMS for free per month.

Send and receive SMS and MMS messages using Telstra’s enterprise grade Messaging API. Get your dedicated Australian number, and start sending and receiving messages today.

Maintainers of this module are not affiliated with Telstra Corporation Limited.

Categories: Drupal

mobile_forum

New Drupal Modules - 7 May 2018 - 3:23am
Summary

mobile_forum module provides the server side APIs required by DrupalForum mobile app to connect to your site.

How to install

The module has the following dependencies. You have to install the dependencies first. After installing them, you can install the module.

App features

Drupal Forum is a native mobile app that provides easy-to-use UI for android devices to use the Forums of your website. It contains features such as

Categories: Drupal

Datetime Popup

New Drupal Modules - 7 May 2018 - 2:40am

Date time picker form element using the pickadate.js Plugin and ceate a custome field type of Date and Time Picker. So that anyone can easily add date and time or datetime picker.

It supports date/time and date fields. You can use it on Datetime and Date fields.

Categories: Drupal

Hotkeys for Save

New Drupal Modules - 6 May 2018 - 2:32pm

Do you often edit content or other site data?
Do you get tired of scrolling endless down to the Save button?
If so, this module allows you to use hotkeys Ctrl+S (Win) and Cmd+S (Mac) instead of clicking on the Save button.

The term "Save button" should be understood in a general sense. So, the submit button may have other names, such as:

Categories: Drupal

Twig field

New Drupal Modules - 6 May 2018 - 11:22am

A simple module that provides Twig field type.

Categories: Drupal

Ban By Geo Location

New Drupal Modules - 6 May 2018 - 10:41am

Ban by geoip location data

Categories: Drupal

Oliver Davies: Creating a Custom PHPUnit Command for Docksal

Planet Drupal - 5 May 2018 - 5:00pm

This week I’ve started writing some custom commands for my Drupal projects that use Docksal, including one to easily run PHPUnit tests in Drupal 8. This is the process of how I created this command.

Categories: Drupal

Oliver Davies: Creating a Custom PHPUnit Command for Docksal

Planet Drupal - 5 May 2018 - 5:00pm
What is Docksal?

Docksal is a local Docker-based development environment for Drupal projects and other frameworks and CMSes. It is our standard tool for local environments for projects at Microserve.

There was a great talk recently at Drupaldelphia about Docksal.

Why write a custom command?

One of the things that Docksal offers (and is covered in the talk) is the ability to add custom commands to the Docksal’s fin CLI, either globally or as part of your project.

As an advocate of automated testing and TDD practitioner, I write a lot of tests and run PHPUnit numerous times a day. I’ve also given talks and have written other posts on this site relating to testing in Drupal.

There are a couple of ways to run PHPUnit with Docksal. The first is to use fin bash to open a shell into the container, move into the docroot directory if needed, and run the phpunit command.

fin bash cd /var/www/docroot ../vendor/bin/phpunit -c core modules/custom

Alternatively, it can be run from the host machine using fin exec.

cd docroot fin exec '../vendor/bin/phpunit -c core modules/custom'

Both of these options require multiple steps as we need to be in the docroot directory where the Drupal code is located before the command can be run, and both have quite long commands to run PHPUnit itself - some of which is repeated every time.

By adding a custom command, I intend to:

  1. Make it easier to get set up to run PHPUnit tests - i.e. setting up a phpunit.xml file.
  2. Make it easier to run the tests that we’d written by shortening the command and making it so it can be run anywhere within our project.

I also hoped to make it project agnostic so that I could add it onto any project and immediately run it.

Creating the command

Each command is a file located within the .docksal/commands directory. The filename is the name of the command (e.g. phpunit) with no file extension.

To create the file, run this from the same directory where your .docksal directory is:

mkdir -p .docksal/commands touch .docksal/commands/phpunit

This will create a new, empty .docksal/commands/phpunit file, and now the phpunit command is now listed under "Custom commands" when we run fin.

You can write commands with any interpreter. I’m going to use bash, so I’ll add the shebang to the top of the file.

#!/usr/bin/env bash

With this in place, I can now run fin phpunit, though there is no output displayed or actions performed as the rest of the file is empty.

Adding a description and help text

Currently the description for our command when we run fin is the default "No description" text. I’d like to add something more relevant, so I’ll start by adding a new description.

fin interprets lines starting with ## as documentation - the first of which it uses as the description.

#!/usr/bin/env bash ## Run automated PHPUnit tests.

Now when I run it, I see the new description.

Any additional lines are used as help text with running fin help phpunit. Here I’ll add an example command to demonstrate how to run it as well as some more in-depth text about what the command will do.

#!/usr/bin/env bash ## Run automated PHPUnit tests. ## ## Usage: fin phpunit <args> ## ## If a core/phpunit.xml file does not exist, copy one from elsehwere. ## Then run the tests.

Now when I run fin help phpunit, I see the new help text.

Adding some content Setting the target

As I want the commands to be run within Docksal’s "cli" container, I can specify that with exec_target. If one isn’t specified, the commands are run locally on the host machine.

#: exec_target = cli Available variables

These variables are provided by fin and are available to use within any custom commands:

  • PROJECT_ROOT - The absolute path to the nearest .docksal directory.
  • DOCROOT - name of the docroot folder.
  • VIRTUAL_HOST - the virtual host name for the project. Such as myproject.docksal.
  • DOCKER_RUNNING - (string) "true" or "false".

Note: If the DOCROOT variable is not defined within the cli container, ensure that it’s added to the environment variables in .docksal/docksal.yml. For example:

version: "2.1" services: cli: environment: - DOCROOT Running phpunit

When you run the phpunit command, there are number of options you can pass to it such as --filter, --testsuite and --group, as well as the path to the tests to execute, such as modules/custom.

I wanted to still be able to do this by running fin phpunit <args> so the commands can be customised when executed. However, as the first half of the command (../vendor/bin/phpunit -c core) is consistent, I can wrap that within my custom command and not need to type it every time.

By using "$@" I can capture any additional arguments, such as the test directory path, and append them to the command to execute.

I’m using $PROJECT_ROOT to prefix the command with the absolute path to phpunit so that I don’t need to be in that directory when I run the custom command, and $DOCROOT to always enter the sub-directory where Drupal is located. In this case, it’s "docroot" though I also use "web" and I’ve seen various others used.

DOCROOT_PATH="${PROJECT_ROOT}/${DOCROOT}" DRUPAL_CORE_PATH="${DOCROOT_PATH}/core" # If there is no phpunit.xml file, copy one from elsewhere. # Otherwise run the tests. ${PROJECT_ROOT}/vendor/bin/phpunit -c ${DRUPAL_CORE_PATH} "$@"

For example, fin phpunit modules/custom would execute /var/www/vendor/bin/phpunit -c /var/www/docroot/core modules/custom within the container.

I can then wrap this within a condition so that the tests are only run when a phpunit.xml file exists, as it is required for them to run successfully.

if [ ! -e ${DRUPAL_CORE_PATH}/phpunit.xml ]; then # If there is no phpunit.xml file, copy one from elsewhere. else ${PROJECT_ROOT}/vendor/bin/phpunit -c ${DRUPAL_CORE_PATH} "$@" fi Creating phpunit.xml - step 1

My first thought was that if a phpunit.xml file doesn’t exist was to duplicate core’s phpunit.xml.dist file. However this isn’t enough to run the tests, as values such as SIMPLETEST_BASE_URL, SIMPLETEST_DB and BROWSERTEST_OUTPUT_DIRECTORY need to be populated.

As the tests wouldn't run at this point, I’ve exited early and displayed a message to the user to edit the new phpunit.xml file and run fin phpunit again.

if [ ! -e ${DRUPAL_CORE_PATH}/phpunit.xml ]; then echo "Copying ${DRUPAL_CORE_PATH}/phpunit.xml.dist to ${DRUPAL_CORE_PATH}/phpunit.xml." echo "Please edit it's values as needed and re-run 'fin phpunit'." cp ${DRUPAL_CORE_PATH}/phpunit.xml.dist ${DRUPAL_CORE_PATH}/phpunit.xml exit 1; else ${PROJECT_ROOT}/vendor/bin/phpunit -c ${DRUPAL_CORE_PATH} "$@" fi

However this isn’t as streamlined as I originally wanted as it still requires the user to perform an additional step before the tests can run.

Creating phpunit.xml - step 2

My second idea was to keep a pre-configured file within the project repository, and to copy that into the expected location. That approach would mean that the project specific values would already be populated, as well as any customisations made to the default settings. I decided on .docksal/drupal/core/phpunit.xml to be the potential location.

Also, if this file is copied then we can go ahead and run the tests straight away rather than needing to exit early.

If a pre-configured file doesn’t exist, then we can default back to copying phpunit.xml.dist.

To avoid duplication, I created a reusable run_tests() function so it could be executed in either scenario.

run_tests() { ${PROJECT_ROOT}/vendor/bin/phpunit -c ${DRUPAL_CORE_PATH} "$@" } if [ ! -e ${DRUPAL_CORE_PATH}/phpunit.xml ]; then if [ -e "${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml" ]; then echo "Copying ${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml to ${DRUPAL_CORE_PATH}/phpunit.xml" cp "${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml" ${DRUPAL_CORE_PATH}/phpunit.xml run_tests "$@" else echo "Copying ${DRUPAL_CORE_PATH}/phpunit.xml.dist to ${DRUPAL_CORE_PATH}/phpunit.xml." echo "Please edit it's values as needed and re-run 'fin phpunit'." cp ${DRUPAL_CORE_PATH}/phpunit.xml.dist ${DRUPAL_CORE_PATH}/phpunit.xml exit 1; fi else run_tests "$@" fi

This means that I can execute less steps and run a much shorter command compared to the original, and even if someone didn’t have a phpunit.xml file created they could have copied into place and have tests running with only one command.

The finished file #!/usr/bin/env bash #: exec_target = cli ## Run automated PHPUnit tests. ## ## Usage: fin phpunit <args> ## ## If a core/phpunit.xml file does not exist, one is copied from ## .docksal/core/phpunit.xml if that file exists, or copied from the default ## core/phpunit.xml.dist file. DOCROOT_PATH="${PROJECT_ROOT}/${DOCROOT}" DRUPAL_CORE_PATH="${DOCROOT_PATH}/core" run_tests() { ${PROJECT_ROOT}/vendor/bin/phpunit -c ${DRUPAL_CORE_PATH} "$@" } if [ ! -e ${DRUPAL_CORE_PATH}/phpunit.xml ]; then if [ -e "${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml" ]; then echo "Copying ${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml to ${DRUPAL_CORE_PATH}/phpunit.xml" cp "${PROJECT_ROOT}/.docksal/drupal/core/phpunit.xml" ${DRUPAL_CORE_PATH}/phpunit.xml run_tests "$@" else echo "Copying phpunit.xml.dist to phpunit.xml" echo "Please edit it's values as needed and re-run 'fin phpunit'." cp ${DRUPAL_CORE_PATH}/phpunit.xml.dist ${DRUPAL_CORE_PATH}/phpunit.xml exit 0; fi else run_tests "$@" fi

It’s currently available as a GitHub Gist, though I’m planning on moving it into a public GitHub repository either on my personal account or the Microserve organisation, for people to either use as examples or to download and use directly.

I’ve also started to add other commands to projects such as config-export to standardise the way to export configuration from Drupal 8, run Drupal 7 tests with SimpleTest, and compile front-end assets like CSS within custom themes.

I think it’s a great way to shorten existing commands, or to group multiple commands into one like in this case, and I can see a lot of other potential uses for it during local development and continuous integration. Also being able to run one command like fin init and have it set up everything for your project is very convenient and a big time saver!

Resources
Categories: Drupal

Marquee

New Drupal Modules - 5 May 2018 - 3:46pm
Introduction

The Marquee module implements a custom field formatter to turn text fields into vastly superior and technically impressive scrolling marquees.

Categories: Drupal

Commerce Nordea

New Drupal Modules - 5 May 2018 - 3:06pm
Categories: Drupal

Commerce Verifone

New Drupal Modules - 5 May 2018 - 2:45pm
Categories: Drupal

A-Frame Extra

New Drupal Modules - 5 May 2018 - 2:23pm
Categories: Drupal

Pages

Subscribe to As If Productions aggregator - Drupal