development workflow tools for open-source php libraries
TRANSCRIPT
{
"name": "drupal/lcache",
"description": "LCache module.",
"type": "drupal-module",
"license": "GPLv2",
"require": {
"lcache/lcache": "0.3.*"
}
}
● Add a minimal composer.json to module
● Use Composer to manage Drupal site
○ drupal-composer/drupal-project
HOWEVER, we also need:
● Collaboration● Reproducibility● Analysis of
○ Test coverage○ Code Quality○ Open Source License Compliance
● Documentation
Collaborate with other engineers across multiple branches.Keep a record of all work done. Integrate With All Of The Things.
Run tests andother tasks.
Calculate test coverage.
Analyze code complexity.
Track dependency versions and licenses.
Package manager for composer.
Publish documentation site from markdown.
$ git clone … working-copy
$ cd working-copy
$ git checkout -b mywork
$ git add -A .
$ git commit -m "Awesomesauce."
$ git push origin mywork
### Steps to reproduce
What did you do?
### Expected behavior
Tell us what should happen
### Actual behavior
Tell us what happens instead
### Overview
This pull request:
- [ ] Fixes a bug
- [ ] Adds a feature
- [ ] Breaks backwards compat
- [ ] Has tests covering changes
### Description
Any additional information.
.github/pull_request_template.md.github/issue_template.md
{ "name": "consolidation/bootstrap", "description": "Locate and bootstrap components ...", "autoload":{ "psr-4":{ "Consolidation\\Bootstrap\\": "src" } }, "require": { "php": ">=5.5.0", "psr/log": "~1.0", "symfony/console": "~2.5|~3.0" }, "extra": { "branch-alias": { "dev-master": "1.x-dev" } }}
●
○○
●
○ phpunit.xml.dist○○ composer install --prefer dist
○○○ composer.lock○ Provide scripts to run tests locally
https://travis-ci.org
<phpunit bootstrap="vendor/autoload.php" colors="true"> <testsuites> <testsuite name="annotation-command"> <directory prefix="test" suffix=".php">tests</directory> </testsuite> </testsuites></phpunit>
language: php
php: - 7.0 - 5.6 - 5.5 - 5.4
before_script: - composer install --prefer-dist
script: - vendor/bin/phpunit - vendor/bin/phpcs --standard=PSR2 -n src
branches: # Only test the master branch and SemVer tags. only: - master - /^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+.*$/
matrix: include: - php: 7.0 env: deps=highest - php: 5.6 - php: 5.5 - php: 5.4 env: deps=lowest
before_script: - if [ -z "$deps" ]; then composer install --prefer-dist; fi; - if [ "$deps" = "lowest" ]; then composer update --prefer-dist --prefer-lowest -n; fi; - if [ "$deps" = "highest" ]; then composer update --prefer-dist -n; fi;
https://blog.wyrihaximus.net/2015/06/test-lowest-current-and-highest-possible-on-travis/
Define a box.json file to define phar contents, then run:
$ composer require kherge/box$ vendor/bin/box build .
{ "alias": "robo.phar", "chmod": "0755", "compactors": ["Herrera\\Box\\Compactor\\Php"], "directories": ["src"], "files": ["RoboFile.php"], "finder": [ { "name": [ "*.php", "*.exe", "GeneratedWrapper.tmpl" ], "exclude": [ "test", "tests", "Test", "Tests", "Tester" ], "in": "vendor" } ], "git-commit": "git-commit", "git-version": "git-version", "output": "robo.phar", "main": "robo", "stub": true}
https://github.com/consolidation/Robo/pull/411
# Prior to a deploy, build a fresh robo.phar
before_deploy:
- vendor/bin/box build .
deploy:
provider: releases
api_key:
secure: REPLACE_WITH_OAUTH_TOKEN
file: robo.phar
skip_cleanup: true
on:
tags: true
https://help.github.com/articles/creating-an-access-token-for-command-line-use/
{ "name": "consolidation/annotated-command", "scripts": { "phar": "vendor/bin/box build .", "cs": "phpcs --standard=PSR2 -n src", "cbf": "phpcbf --standard=PSR2 -n src", "unit": "SHELL_INTERACTIVE=true phpunit --colors=always", "test": [ "@unit", "@cs" ] }}
<phpunit bootstrap="vendor/autoload.php" colors="true"> … <logging> <!-- <log type="coverage-html" target="build/logs/coverage" lowUpperBound="35" highLowerBound="70"/> --> <log type="coverage-clover" target="build/logs/clover.xml"/> </logging> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter></phpunit>
{ "name": "consolidation/annotated-command", "description": "Initialize Symfony Console commands …", "license": "MIT", "authors": [ { "name": "Greg Anderson", "email": "[email protected]" } ],
… }
$ composer licensesName: consolidation/roboVersion: 1.x-devLicenses: MITDependencies:
Name Version License consolidation/annotated-command 2.4.3 MIT consolidation/log 1.0.3 MIT consolidation/output-formatters 3.1.7 MIT container-interop/container-interop 1.2.0 MIT guzzle/guzzle v3.8.1 MIT guzzlehttp/psr7 1.4.1 MIT jakubledl/dissect v1.0.1 unlicense league/container 2.3.0 MIT myclabs/deep-copy 1.6.0 MIT patchwork/jsqueeze v2.0.5 (Apache-2.0 or GPL-2.0)
https://poser.pugx.orghttps://…#tab-licenses
[![License](https://poser.pugx.org/ORG/PROJECT/license.png)](https://www.versioneye.com/user/projects/ID#tab-licenses)
$ composer require victorjonsson/markdowndocs$ vendor/bin/phpdoc-md phpdoc-md generate src > docs/api.md$ git add docs/api.md$ git commit -m "Add API documentation."
OH NO! It’s not automated!
● ReadTheDocs is a python service; it can’t run php.
● Can’t easily build from Travis and commit back to the repository, as that would create a separate commit (not part of the release, might cause another test run, etc.)
●○
●○
●○
Install Sami$ curl --output $HOME/bin/sami.phar http://get.sensiolabs.org/sami.phar
In .travis.ymlafter_success: # Publish updated API documentation on every push to the master branch - git config --global user.email $GITHUB_USER_EMAIL - git config --global user.name "Travis LCache Documentation Bot" - sami.phar --ansi update sami-config.php - git clone --branch=gh-pages https://${TOKEN}@github.com/org/proj work - rm -rf work/api - cp -R docs/api work/api - cd work - git add -A api - git commit -m "API docs from $TRAVIS_BUILD_NUMBER/$TRAVIS_COMMIT" - git push