From 82c0eefdbc5f327fcc07278e814f9734e1aff574 Mon Sep 17 00:00:00 2001
From: Gintautas Miselis
Date: Mon, 4 Nov 2019 09:25:51 +0200
Subject: [PATCH 1/6] Moved building phar files from Codeception repo
---
.gitignore | 5 +-
RoboFile.php | 418 ++++++++++++++++++++++++++++++------------
package/README.md | 15 ++
package/composer.json | 26 +++
package/stub.php | 9 +
5 files changed, 352 insertions(+), 121 deletions(-)
create mode 100644 package/README.md
create mode 100644 package/composer.json
create mode 100644 package/stub.php
diff --git a/.gitignore b/.gitignore
index 7bcbf5415..8b04ab601 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
_site/
+/.idea
.jekyll-metadata
+/build
/composer.lock
+/package/composer.lock
+/package/vendor
/vendor
-/.idea
\ No newline at end of file
diff --git a/RoboFile.php b/RoboFile.php
index c57d68ebc..4772eac64 100644
--- a/RoboFile.php
+++ b/RoboFile.php
@@ -12,99 +12,105 @@ class RoboFile extends \Robo\Tasks
const REPO_BLOB_URL = 'https://github.com/Codeception/Codeception/blob';
const STABLE_BRANCH = '4.0';
- function post()
- {
- $title = $this->ask("Post title");
- $file = strtolower(str_replace([' ',':'], ['-','-'], $title));
- $date = date('Y-m-d');
- $this->taskWriteToFile("_posts/$date-$file.markdown")
- ->line('---')
- ->line('layout: post')
- ->line("title: \"$title\"")
- ->line("date: $date 01:03:50")
- ->line("---\n")
- ->run();
- }
-
- function publish()
- {
- $this->taskGitStack()
- ->add('-A')
- ->commit('updated')
- ->pull()
- ->push()
- ->run();
- }
-
-
- /**
- * builds docs for specific branch
- */
- function docsBranch($branch)
- {
- $this->yell("Creating docs for $branch");
- $dir = "docs-$branch";
-
- $this->taskGitStack()
- ->cloneRepo('git@github.com:Codeception/Codeception.git', 'source')
- ->run();
-
- $this->taskGitStack()
- ->dir('source')
- ->checkout($branch)
- ->run();
-
- $this->taskCleanDir($dir)->run();
-
- $this->taskWriteToFile("_includes/doc_$branch.html")
- ->text('')
- ->text('You are viewing documentation for Codeception
'.$branch.'. ')
- ->text('Switch to
latest stable »')
- ->text('
')
- ->run();
-
-
- $indexFile = $this->taskWriteToFile($dir . '/index.md')
- ->line('---')
- ->line('layout: doc')
- ->line("title: Codeception $branch Documentation")
- ->line('---')
- ->text("\n\n{% include doc_$branch.html %}\n\n\n")
- ->line("# Codeception $branch Guides\n\n");
-
- $guides = Finder::create()
- ->ignoreVCS(true)
- ->depth('== 0')
- ->name('*.md')
- ->sortByName()
- ->in('source/docs');
-
-
- foreach ($guides as $file) {
- $contents = file_get_contents($file->getRealPath());
- $name = substr($file->getBasename(),0,-3);
- $title = preg_replace("(\d+-)", '', $name);
- if (preg_match('/^# (.*)$/m', $contents, $matches)) {
- $title = $matches[1];
- }
- $indexFile->line("* [$title](/$dir/$name)");
-
- $this->taskWriteToFile($dir . '/' . $file->getBasename())
- ->line('---')
- ->line('layout: doc')
- ->line('title: Codeception Documentation')
- ->line('---')
- ->line('')
- ->line('')
- ->text("{% include doc_$branch.html %}")
- ->line('')
- ->line('')
- ->text($contents)
- ->run();
+ function post()
+ {
+ $title = $this->ask("Post title");
+ $file = strtolower(str_replace([
+ ' ',
+ ':'
+ ], [
+ '-',
+ '-'
+ ], $title));
+ $date = date('Y-m-d');
+ $this->taskWriteToFile("_posts/$date-$file.markdown")
+ ->line('---')
+ ->line('layout: post')
+ ->line("title: \"$title\"")
+ ->line("date: $date 01:03:50")
+ ->line("---\n")
+ ->run();
+ }
+
+ function publish()
+ {
+ $this->taskGitStack()
+ ->add('-A')
+ ->commit('updated')
+ ->pull()
+ ->push()
+ ->run();
+ }
+
+
+ /**
+ * builds docs for specific branch
+ */
+ function docsBranch($branch)
+ {
+ $this->yell("Creating docs for $branch");
+ $dir = "docs-$branch";
+
+ $this->taskGitStack()
+ ->cloneRepo('git@github.com:Codeception/Codeception.git', 'source')
+ ->run();
+
+ $this->taskGitStack()
+ ->dir('source')
+ ->checkout($branch)
+ ->run();
+
+ $this->taskCleanDir($dir)->run();
+
+ $this->taskWriteToFile("_includes/doc_$branch.html")
+ ->text('')
+ ->text('You are viewing documentation for Codeception
' . $branch . '. ')
+ ->text('Switch to
latest stable »')
+ ->text('
')
+ ->run();
+
+
+ $indexFile = $this->taskWriteToFile($dir . '/index.md')
+ ->line('---')
+ ->line('layout: doc')
+ ->line("title: Codeception $branch Documentation")
+ ->line('---')
+ ->text("\n\n{% include doc_$branch.html %}\n\n\n")
+ ->line("# Codeception $branch Guides\n\n");
+
+ $guides = Finder::create()
+ ->ignoreVCS(true)
+ ->depth('== 0')
+ ->name('*.md')
+ ->sortByName()
+ ->in('source/docs');
+
+
+ foreach ($guides as $file) {
+ $contents = file_get_contents($file->getRealPath());
+ $name = substr($file->getBasename(), 0, -3);
+ $title = preg_replace("(\d+-)", '', $name);
+ if (preg_match('/^# (.*)$/m', $contents, $matches)) {
+ $title = $matches[1];
+ }
+ $indexFile->line("* [$title](/$dir/$name)");
+
+ $this->taskWriteToFile($dir . '/' . $file->getBasename())
+ ->line('---')
+ ->line('layout: doc')
+ ->line('title: Codeception Documentation')
+ ->line('---')
+ ->line('')
+ ->line('')
+ ->text("{% include doc_$branch.html %}")
+ ->line('')
+ ->line('')
+ ->text($contents)
+ ->run();
+ }
+ $indexFile->run();
+ // $this->taskDeleteDir('source')->run();
}
- $indexFile->run();
- // $this->taskDeleteDir('source')->run();
- }
/**
* @desc generates modules reference from source files
@@ -127,15 +133,15 @@ public function buildDocsModules()
$this->say("Modules");
$modules = Finder::create()->files()->name('*.php')->in(__DIR__ . '/vendor/codeception/module-*/src/Codeception/Module');
foreach ($modules as $module) {
- $moduleName = basename(substr($module, 0, -4));
- $className = 'Codeception\Module\\' . $moduleName;
- $classPath = 'Codeception/Module/' . $moduleName;
+ $moduleName = basename(substr($module, 0, -4));
+ $className = 'Codeception\Module\\' . $moduleName;
+ $classPath = 'Codeception/Module/' . $moduleName;
$repositoryName = basename(substr($module, 0, -1 * (strlen($classPath) + 9)));
//echo $classPath, " ", $repositoryName, "\n"; continue;
//TODO: take /src/$classPath.php directly from module
- $source = "https://github.com/Codeception/$repositoryName/tree/master/src/$classPath.php";
+ $source = "https://github.com/Codeception/$repositoryName/tree/master/src/$classPath.php";
$documentationFile = 'docs/modules/' . $moduleName . '.md';
- $sourceMessage = '
';
+ $sourceMessage = '
';
$this->generateDocumentationForClass($className, $documentationFile, $sourceMessage);
$this->postProcessModuleDocFile($documentationFile, $moduleName, $source);
}
@@ -145,23 +151,27 @@ private function postProcessModuleDocFile($documentationFile, $name, $source)
{
$contents = file_get_contents($documentationFile);
$contents = str_replace('## ', '### ', $contents);
- $buttons = [
+ $buttons = [
'source' => $source,
];
// building version switcher
- foreach (['3.1', '2.5', '1.8'] as $branch) {
- $buttons[$branch] = self::REPO_BLOB_URL."/$branch/docs/modules/$name.md";
+ foreach ([
+ '3.1',
+ '2.5',
+ '1.8'
+ ] as $branch) {
+ $buttons[$branch] = self::REPO_BLOB_URL . "/$branch/docs/modules/$name.md";
}
- $buttonHtml = "\n\n".'';
+ $buttonHtml = "\n\n" . '
';
foreach ($buttons as $link => $url) {
if ($link == 'source') {
$link = "
$link";
}
- $buttonHtml.= '
'.$link.'';
+ $buttonHtml .= '
' . $link . '';
}
- $buttonHtml .= '
'."\n\n";
+ $buttonHtml .= '
' . "\n\n";
- $contents = $this->postProcessStandardElements($name, $buttonHtml . $contents);
+ $contents = $this->postProcessStandardElements($name, $buttonHtml . $contents);
file_put_contents($documentationFile, $contents);
}
@@ -179,7 +189,7 @@ public function buildDocsUtils()
//JsonType is in module-rest, HttpCode - in lib-innerbrowser
foreach ($utils as $utilName => $repositoryName) {
- $className = '\Codeception\Util\\' . $utilName;
+ $className = '\Codeception\Util\\' . $utilName;
$documentationFile = 'docs/reference/' . $utilName . '.md';
$this->documentApiClass($documentationFile, $className, false, $repositoryName);
$this->postProcessFile($utilName, $documentationFile);
@@ -197,13 +207,13 @@ public function buildDocsCommands()
$commandGenerator = $this->taskGenDoc($documentationFile);
foreach ($commands as $command) {
$commandName = basename(substr($command, 0, -4));
- $className = '\Codeception\Command\\' . $commandName;
+ $className = '\Codeception\Command\\' . $commandName;
$commandGenerator->docClass($className);
}
$commandGenerator
->prepend("# Console Commands\n")
->processClassSignature(function ($r, $text) {
- return "## ".$r->getShortName();
+ return "## " . $r->getShortName();
})
->filterMethods(function (ReflectionMethod $r) {
return false;
@@ -235,7 +245,13 @@ public function buildDocsStub()
->processMethodDocBlock(
function (\ReflectionMethod $m, $doc) {
$doc = str_replace(array('@since'), array(' * available since version'), $doc);
- $doc = str_replace(array(' @', "\n@"), array(" * ", "\n * "), $doc);
+ $doc = str_replace(array(
+ ' @',
+ "\n@"
+ ), array(
+ " * ",
+ "\n * "
+ ), $doc);
return $doc;
}
)
@@ -283,8 +299,8 @@ public function buildDocsApi()
$apiClasses = ['\Codeception\Module', '\Codeception\InitTemplate'];
foreach ($apiClasses as $apiClass) {
- $name = (new ReflectionClass($apiClass))->getShortName();
- $documentationFile = 'docs/reference/' . $name . '.md';
+ $name = (new ReflectionClass($apiClass))->getShortName();
+ $documentationFile = 'docs/reference/' . $name . '.md';
$this->documentApiClass($documentationFile, $apiClass, true);
$this->postProcessFile($name, $documentationFile);
}
@@ -297,17 +313,17 @@ public function buildDocsExtensions()
$path = __DIR__ . '/vendor/codeception/codeception/ext';
$extensions = Finder::create()->files()->sortByName()->name('*.php')->in($path);
- $extGenerator= $this->taskGenDoc('_includes/extensions.md');
+ $extGenerator = $this->taskGenDoc('_includes/extensions.md');
foreach ($extensions as $extension) {
$extensionName = basename(substr($extension, 0, -4));
- $className = '\Codeception\Extension\\' . $extensionName;
+ $className = '\Codeception\Extension\\' . $extensionName;
$extGenerator->docClass($className);
}
$extGenerator
->prepend("# Official Extensions\n")
->processClassSignature(function (ReflectionClass $r, $text) {
$name = $r->getShortName();
- return "## $name\n\n[See Source](" . self::REPO_BLOB_URL."/".self::STABLE_BRANCH. "/ext/$name.php)";
+ return "## $name\n\n[See Source](" . self::REPO_BLOB_URL . "/" . self::STABLE_BRANCH . "/ext/$name.php)";
})
->filterMethods(function (ReflectionMethod $r) {
return false;
@@ -320,12 +336,12 @@ public function buildDocsExtensions()
protected function documentApiClass($file, $className, $all = false, $repositoryName = null)
{
- if ($repositoryName === null ) {
- $repositoryUrl = self::REPO_BLOB_URL."/".self::STABLE_BRANCH;
+ if ($repositoryName === null) {
+ $repositoryUrl = self::REPO_BLOB_URL . "/" . self::STABLE_BRANCH;
} else {
$repositoryUrl = 'https://github.com/Codeception/' . $repositoryName . '/blob/master';
}
- $uri = str_replace('\\', '/', $className);
+ $uri = str_replace('\\', '/', $className);
$source = $repositoryUrl . "/src$uri.php";
$this->taskGenDoc($file)
@@ -338,12 +354,12 @@ protected function documentApiClass($file, $className, $all = false, $repository
. 'Help us to improve documentation. Edit module reference'
)
->processPropertySignature(function ($r) {
- return "\n#### $" . $r->name. "\n\n";
+ return "\n#### $" . $r->name . "\n\n";
})
->processPropertyDocBlock(function ($r, $text) {
$modifiers = implode(' ', \Reflection::getModifierNames($r->getModifiers()));
- $text = ' *' . $modifiers . '* **$' . $r->name . "**\n" . $text;
- $text = preg_replace("~@(.*?)\s(.*)~", 'type `$2`', $text);
+ $text = ' *' . $modifiers . '* **$' . $r->name . "**\n" . $text;
+ $text = preg_replace("~@(.*?)\s(.*)~", 'type `$2`', $text);
return $text;
})
->processClassDocBlock(
@@ -395,7 +411,7 @@ private function postProcessStandardElements($name, $contents)
$contents = preg_replace("~```\s?(.*?)```~ms", "{% highlight yaml %}\n$1\n{% endhighlight %}", $contents);
// set default language in order not to leave unparsed code inside '```'
- $title = $name;
+ $title = $name;
$contents = "---\nlayout: doc\ntitle: " . ($title != "" ? $title . " - " : "")
. "Codeception - Documentation\n---\n\n" . $contents;
return $contents;
@@ -410,4 +426,166 @@ private function postProcessFile($pageName, $documentationFile)
$contents = $this->postProcessStandardElements($pageName, file_get_contents($documentationFile));
file_put_contents($documentationFile, $contents);
}
+
+ public function release()
+ {
+ $version = self::STABLE_BRANCH . '.' . date('Ymd');
+ $this->stopOnFail();
+
+ $this->taskFilesystemStack()->mkdir('build')->run();
+ $this->setPlatformVersionTo('7.2.0');
+ $buildFile = 'build/codecept72.phar';
+ $this->buildPhar($buildFile);
+ $releaseDir = "releases/$version";
+ $versionedFile = "$releaseDir/codecept.phar";
+ $this->taskFilesystemStack()
+ ->stopOnFail()
+ ->mkdir($releaseDir)
+ ->copy($buildFile, $versionedFile)
+ ->remove('codecept.phar')
+ ->symlink($versionedFile, 'codecept.phar')
+ ->run();
+ //filenames must be different, because Phar refuses to build second file with the same name
+ $buildFile = 'build/codecept56.phar';
+ $this->setPlatformVersionTo('5.6.0');
+ $this->buildPhar($buildFile);
+ $versionedFile = "$releaseDir/php56/codecept.phar";
+ $this->taskFilesystemStack()
+ ->stopOnFail()
+ ->mkdir("$releaseDir/php56")
+ ->copy($buildFile, $versionedFile)
+ ->remove('php56/codecept.phar')
+ ->symlink("../$versionedFile", 'php56/codecept.phar')
+ ->run();
+
+ $this->taskGitStack()
+ ->stopOnFail()
+ ->checkout('-- package/composer.json')
+ ->add('codecept.phar')
+ ->add('php56/codecept.phar')
+ ->add($releaseDir)
+ ->run();
+ $this->updateBuildsPage();
+ }
+
+ private function setPlatformVersionTo($version)
+ {
+ $this->taskComposerConfig()->workingDir('package')->set('platform.php', $version)->run();
+ $this->taskComposerUpdate()->preferDist()->optimizeAutoloader()->workingDir('package')->run();
+ }
+
+ /**
+ * @desc creates codecept.phar
+ * @throws Exception
+ */
+ public function buildPhar($targetFile)
+ {
+ $this->packPhar($targetFile);
+ $code = $this->taskExec('php ' . basename($targetFile))->dir(dirname($targetFile))->run()->getExitCode();
+ if ($code !== 0) {
+ throw new Exception("There was problem compiling phar");
+ }
+ }
+
+ private function packPhar($pharFileName)
+ {
+ $pharTask = $this->taskPackPhar($pharFileName)
+ ->compress()
+ ->stub('package/stub.php');
+
+ $finder = Finder::create()->files()
+ ->ignoreVCS(true)
+ ->name('*.php')
+ ->name('*.css')
+ ->name('*.png')
+ ->name('*.js')
+ ->name('*.css')
+ ->name('*.eot')
+ ->name('*.svg')
+ ->name('*.ttf')
+ ->name('*.wof')
+ ->name('*.woff')
+ ->name('*.woff2')
+ ->name('*.png')
+ ->name('*.tpl.dist')
+ ->name('*.html.dist')
+ ->exclude('Tests')
+ ->exclude('tests')
+ ->exclude('benchmark')
+ ->exclude('demo')
+ ->in('package/vendor');
+
+ foreach ($finder as $file) {
+ $relativePathname = $file->getRelativePathname();
+ if (strpos($relativePathname, 'codeception/') === 0) {
+ //don't remove whitespace from Codeception files
+ $pharTask->addFile('vendor/' . $relativePathname, $file->getRealPath());
+ } else {
+ $pharTask->addStripped('vendor/' . $relativePathname, $file->getRealPath());
+ }
+ }
+
+ $pharTask->addFile('codecept', 'package/vendor/codeception/codeception/package/bin');
+ $pharTask->run();
+ }
+
+ public function updateBuildsPage()
+ {
+ $sortByVersion = function (\SplFileInfo $a, \SplFileInfo $b) {
+ return version_compare($a->getBaseName(), $b->getBaseName());
+ };
+
+ $releases = array_reverse(
+ iterator_to_array(Finder::create()->depth(0)->directories()->sort($sortByVersion)->in('releases'))
+ );
+ $branch = null;
+ $releaseFile = $this->taskWriteToFile('builds.markdown')
+ ->line('---')
+ ->line('layout: page')
+ ->line('title: Codeception Builds')
+ ->line('---')
+ ->line('');
+
+ foreach ($releases as $release) {
+ $releaseName = $release->getBasename();
+ $downloadUrl = "http://codeception.com/releases/$releaseName/codecept.phar";
+
+ list($major, $minor) = explode('.', $releaseName);
+ if ("$major.$minor" != $branch) {
+ $branch = "$major.$minor";
+ $releaseFile->line("\n## $branch");
+ if ($major < 2) {
+ $releaseFile->line("*Requires: PHP 5.3 and higher + CURL*\n");
+ } elseif ($major == 2 && $minor < 4) {
+ $releaseFile->line("*Requires: PHP 5.4 and higher + CURL*\n");
+ } else {
+ $releaseFile->line("*Requires: PHP 5.6 and higher + CURL*\n");
+ }
+ $releaseFile->line("* **[Download Latest $branch Release]($downloadUrl)**");
+ }
+
+ if (file_exists("releases/$releaseName/php54/codecept.phar")) {
+ $downloadUrl2 = "http://codeception.com/releases/$releaseName/php54/codecept.phar";
+ if (version_compare($releaseName, '2.4.0', '>=')) {
+ $versionLine = "* [$releaseName for PHP 7]($downloadUrl)";
+ $versionLine .= ", [for PHP 5.6]($downloadUrl2)";
+ } elseif (version_compare($releaseName, '2.3.0', '>=')) {
+ $versionLine = "* [$releaseName for PHP 7]($downloadUrl)";
+ $versionLine .= ", [for PHP 5.4 - 5.6]($downloadUrl2)";
+ } else {
+ $versionLine = "* [$releaseName for PHP 5.6+]($downloadUrl)";
+ $versionLine .= ", [for PHP 5.4 or 5.5]($downloadUrl2)";
+ }
+ } elseif (file_exists("releases/$releaseName/php56/codecept.phar")) {
+ $versionLine = "* [$releaseName for PHP 7.2+]($downloadUrl)";
+ $downloadUrl2 = "http://codeception.com/releases/$releaseName/php56/codecept.phar";
+ $versionLine .= ", [for PHP 5.6 - 7.1]($downloadUrl2)";
+ } else {
+ $versionLine = "* [$releaseName]($downloadUrl)";
+ }
+
+ $releaseFile->line($versionLine);
+ }
+ $releaseFile->run();
+ }
}
\ No newline at end of file
diff --git a/package/README.md b/package/README.md
new file mode 100644
index 000000000..a856ec4a9
--- /dev/null
+++ b/package/README.md
@@ -0,0 +1,15 @@
+This directory contains files necessary for building Phar file
+
+Modules excluded from phar file:
+* datafactory
+* doctrine2
+* laravel5
+* lumen
+* phalcon
+* symfony
+* yii2
+* zendexpressive
+* zf2
+
+Additional dependency compared with codeception/codecepion:
+* hoa/console
\ No newline at end of file
diff --git a/package/composer.json b/package/composer.json
new file mode 100644
index 000000000..1d5261135
--- /dev/null
+++ b/package/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "codeception/phar-file",
+ "type": "project",
+ "description": "Dependencies are used to build phar-file",
+ "license":"MIT",
+
+ "require": {
+ "codeception/codeception": "4.0.x-dev | >=4.0",
+ "codeception/module-amqp": "*",
+ "codeception/module-apc": "*",
+ "codeception/module-asserts": "*",
+ "codeception/module-cli": "*",
+ "codeception/module-db": "*",
+ "codeception/module-filesystem": "*",
+ "codeception/module-ftp": "*",
+ "codeception/module-memcache": "*",
+ "codeception/module-mongodb": "*",
+ "codeception/module-phpbrowser": "*",
+ "codeception/module-queue": "*",
+ "codeception/module-redis": "*",
+ "codeception/module-rest": "*",
+ "codeception/module-sequence": "*",
+ "codeception/module-soap": "*",
+ "codeception/module-webdriver": "*"
+ }
+}
\ No newline at end of file
diff --git a/package/stub.php b/package/stub.php
new file mode 100644
index 000000000..d3ef8c7d8
--- /dev/null
+++ b/package/stub.php
@@ -0,0 +1,9 @@
+#!/usr/bin/env php
+
Date: Sat, 9 Nov 2019 20:06:13 +0200
Subject: [PATCH 2/6] Updated download pages
Deleted releases markdown page
Which hasn't been updated for 5 years
---
_includes/phar.html | 8 +++----
install.html | 17 ---------------
releases/index.markdown | 48 -----------------------------------------
thanks_php5.html | 8 +++----
thanks_php54.html | 24 ---------------------
5 files changed, 8 insertions(+), 97 deletions(-)
delete mode 100644 releases/index.markdown
delete mode 100644 thanks_php54.html
diff --git a/_includes/phar.html b/_includes/phar.html
index addd970c8..15435e799 100644
--- a/_includes/phar.html
+++ b/_includes/phar.html
@@ -3,7 +3,7 @@
@@ -37,7 +37,7 @@
@@ -50,8 +50,8 @@
-
wget https://codeception.com/php5/codecept.phardownload
-
+
wget https://codeception.com/php56/codecept.phardownload
+
diff --git a/install.html b/install.html
index 8d20f8206..efd0603b3 100644
--- a/install.html
+++ b/install.html
@@ -43,14 +43,6 @@ Composer (recommended)
php vendor/bin/codecept bootstrap
- Minimal Codeception
-
Currently Codeception installs Webdriver and Guzzle libraries as dependencies. If you don't plan to do acceptance testing, you can get minimal installation of Codeception by requiring `codeception/base`
-
- Prepare tests directory and configs
-
-
composer require codeception/base --dev
-
-
@@ -88,15 +80,6 @@ Git
php codecept run -c /path/to/demo/project
- If you want to build phar package you need to install Robo Task Runner and execute
-
-
- To generate documentation files run
-
Don't forget to send Pull Requests!
diff --git a/releases/index.markdown b/releases/index.markdown
deleted file mode 100644
index 31017b696..000000000
--- a/releases/index.markdown
+++ /dev/null
@@ -1,48 +0,0 @@
-
-## 2.0
-*Requires: PHP 5.4 and higher + CURL*
-
-* **[Download Latest 2.0 Release](http://codeception.com/releases/2.0.2/codecept.phar)**
-* [2.0.2](http://codeception.com/releases/2.0.2/codecept.phar)
-* [2.0.1](http://codeception.com/releases/2.0.1/codecept.phar)
-* [2.0.0-beta](http://codeception.com/releases/2.0.0-beta/codecept.phar)
-* [2.0.0-alpha](http://codeception.com/releases/2.0.0-alpha/codecept.phar)
-* [2.0.0-RC2](http://codeception.com/releases/2.0.0-RC2/codecept.phar)
-* [2.0.0-RC](http://codeception.com/releases/2.0.0-RC/codecept.phar)
-* [2.0.0](http://codeception.com/releases/2.0.0/codecept.phar)
-
-## 1.8
-*Requires: PHP 5.3 and higher + CURL*
-
-* **[Download Latest 1.8 Release](http://codeception.com/releases/1.8.7/codecept.phar)**
-* [1.8.7](http://codeception.com/releases/1.8.7/codecept.phar)
-* [1.8.6](http://codeception.com/releases/1.8.6/codecept.phar)
-* [1.8.5](http://codeception.com/releases/1.8.5/codecept.phar)
-* [1.8.4](http://codeception.com/releases/1.8.4/codecept.phar)
-* [1.8.3](http://codeception.com/releases/1.8.3/codecept.phar)
-* [1.8.2](http://codeception.com/releases/1.8.2/codecept.phar)
-* [1.8.1](http://codeception.com/releases/1.8.1/codecept.phar)
-* [1.8.0.1](http://codeception.com/releases/1.8.0.1/codecept.phar)
-* [1.8.0](http://codeception.com/releases/1.8.0/codecept.phar)
-
-## 1.7
-*Requires: PHP 5.3 and higher + CURL*
-
-* **[Download Latest 1.7 Release](http://codeception.com/releases/1.7.4/codecept.phar)**
-* [1.7.4](http://codeception.com/releases/1.7.4/codecept.phar)
-* [1.7.3](http://codeception.com/releases/1.7.3/codecept.phar)
-* [1.7.2](http://codeception.com/releases/1.7.2/codecept.phar)
-* [1.7.1](http://codeception.com/releases/1.7.1/codecept.phar)
-* [1.7.0.2](http://codeception.com/releases/1.7.0.2/codecept.phar)
-* [1.7.0.1](http://codeception.com/releases/1.7.0.1/codecept.phar)
-* [1.7.0](http://codeception.com/releases/1.7.0/codecept.phar)
-
-## 1.6
-*Requires: PHP 5.3 and higher + CURL*
-
-* **[Download Latest 1.6 Release](http://codeception.com/releases/1.6.9/codecept.phar)**
-* [1.6.9](http://codeception.com/releases/1.6.9/codecept.phar)
-* [1.6.8.1](http://codeception.com/releases/1.6.8.1/codecept.phar)
-* [1.6.12](http://codeception.com/releases/1.6.12/codecept.phar)
-* [1.6.11](http://codeception.com/releases/1.6.11/codecept.phar)
-* [1.6.10](http://codeception.com/releases/1.6.10/codecept.phar)
diff --git a/thanks_php5.html b/thanks_php5.html
index 3bdf75ad1..bfbb7cfa2 100644
--- a/thanks_php5.html
+++ b/thanks_php5.html
@@ -1,12 +1,12 @@
---
layout: bootstrap
title: Thanks for choosing Codeception!
-meta:
+meta:
---
-
Installation - PHAR for PHP 5.4+
+
Installation - PHAR for PHP 5.6-7.1
1. Save this file into the root of desired PHP project
@@ -18,7 +18,7 @@
Installation - PHAR for PHP 5.4+
Follow Getting Started Guide to perform configuration and write the first test.
-
Your download is on the way. Click here if you don't want to wait any longer
+
Your download is on the way. Click here if you don't want to wait any longer
-
+
\ No newline at end of file
diff --git a/thanks_php54.html b/thanks_php54.html
deleted file mode 100644
index 4252eee57..000000000
--- a/thanks_php54.html
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: bootstrap
-title: Thanks for choosing Codeception!
-meta:
----
-
-
-
-
Installation - PHAR PHP54
-
-
1. Save this file into the root of desired PHP project
-
-
2. Initialize test classes inside the root of your project
-
-
php codecept.phar bootstrap
-
-
3. Write your tests!
-
-
Follow Getting Started Guide to perform configuration and write the first test.
-
-
Your download is on the way.Click here if you don't want to wait any longer
-
-
-
From f92dad487ca5a2142993e7a73279f96bdfe4a8a7 Mon Sep 17 00:00:00 2001
From: Gintautas Miselis
Date: Fri, 15 Nov 2019 23:21:57 +0200
Subject: [PATCH 3/6] Generate hash files for current phar build
Used by phar-updater
---
RoboFile.php | 24 +++++++++++++++++++++---
package/composer.json | 6 ++++--
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/RoboFile.php b/RoboFile.php
index 4772eac64..d46a21940 100644
--- a/RoboFile.php
+++ b/RoboFile.php
@@ -433,10 +433,11 @@ public function release()
$this->stopOnFail();
$this->taskFilesystemStack()->mkdir('build')->run();
+ $releaseDir = "releases/$version";
$this->setPlatformVersionTo('7.2.0');
$buildFile = 'build/codecept72.phar';
$this->buildPhar($buildFile);
- $releaseDir = "releases/$version";
+ $this->updateVersionFile($buildFile, 'codecept.version');
$versionedFile = "$releaseDir/codecept.phar";
$this->taskFilesystemStack()
->stopOnFail()
@@ -445,10 +446,12 @@ public function release()
->remove('codecept.phar')
->symlink($versionedFile, 'codecept.phar')
->run();
+
+ $this->setPlatformVersionTo('5.6.0');
//filenames must be different, because Phar refuses to build second file with the same name
$buildFile = 'build/codecept56.phar';
- $this->setPlatformVersionTo('5.6.0');
$this->buildPhar($buildFile);
+ $this->updateVersionFile($buildFile, 'php56/codecept.version');
$versionedFile = "$releaseDir/php56/codecept.phar";
$this->taskFilesystemStack()
->stopOnFail()
@@ -462,7 +465,9 @@ public function release()
->stopOnFail()
->checkout('-- package/composer.json')
->add('codecept.phar')
+ ->add('codecept.version')
->add('php56/codecept.phar')
+ ->add('php56/codecept.version')
->add($releaseDir)
->run();
$this->updateBuildsPage();
@@ -588,4 +593,17 @@ public function updateBuildsPage()
}
$releaseFile->run();
}
-}
\ No newline at end of file
+
+ /**
+ * @param $pharFile
+ * @param $versionFile
+ */
+ private function updateVersionFile($pharFile, $versionFile)
+ {
+ $hash = sha1_file($pharFile);
+ if ($hash === false) {
+ throw new Exception('Failed to write hash to file: ' . $versionFile);
+ }
+ $this->taskWriteToFile($versionFile)->text($hash)->run();
+ }
+}
diff --git a/package/composer.json b/package/composer.json
index 1d5261135..d024e9357 100644
--- a/package/composer.json
+++ b/package/composer.json
@@ -21,6 +21,8 @@
"codeception/module-rest": "*",
"codeception/module-sequence": "*",
"codeception/module-soap": "*",
- "codeception/module-webdriver": "*"
+ "codeception/module-webdriver": "*",
+ "hoa/console": "*",
+ "padraic/phar-updater": "^1.0"
}
-}
\ No newline at end of file
+}
From 84733fcf2ea747af47e77e3a256671b49ff056e9 Mon Sep 17 00:00:00 2001
From: Gintautas Miselis
Date: Mon, 18 Nov 2019 01:12:28 +0200
Subject: [PATCH 4/6] Phar file requires codeception/codeception/app.php (#191)
---
RoboFile.php | 1 -
package/stub.php | 4 +---
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/RoboFile.php b/RoboFile.php
index d46a21940..4a033c425 100644
--- a/RoboFile.php
+++ b/RoboFile.php
@@ -530,7 +530,6 @@ private function packPhar($pharFileName)
}
}
- $pharTask->addFile('codecept', 'package/vendor/codeception/codeception/package/bin');
$pharTask->run();
}
diff --git a/package/stub.php b/package/stub.php
index d3ef8c7d8..319c42ae8 100644
--- a/package/stub.php
+++ b/package/stub.php
@@ -2,8 +2,6 @@
Date: Fri, 22 Nov 2019 10:57:41 +0200
Subject: [PATCH 5/6] Fixed build process
Also git add builds.markdown automatically
---
RoboFile.php | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/RoboFile.php b/RoboFile.php
index 4a033c425..6f7ee8e8b 100644
--- a/RoboFile.php
+++ b/RoboFile.php
@@ -461,16 +461,18 @@ public function release()
->symlink("../$versionedFile", 'php56/codecept.phar')
->run();
+ $this->updateBuildsPage();
+
$this->taskGitStack()
->stopOnFail()
->checkout('-- package/composer.json')
+ ->add('builds.markdown')
->add('codecept.phar')
->add('codecept.version')
->add('php56/codecept.phar')
->add('php56/codecept.version')
->add($releaseDir)
->run();
- $this->updateBuildsPage();
}
private function setPlatformVersionTo($version)
@@ -486,7 +488,10 @@ private function setPlatformVersionTo($version)
public function buildPhar($targetFile)
{
$this->packPhar($targetFile);
- $code = $this->taskExec('php ' . basename($targetFile))->dir(dirname($targetFile))->run()->getExitCode();
+ $dir = dirname($targetFile);
+ //the file must be named codecept.phar to be executable
+ $this->taskFilesystemStack()->copy($targetFile, $dir . '/codecept.phar')->run();
+ $code = $this->taskExec('php codecept.phar')->dir($dir)->run()->getExitCode();
if ($code !== 0) {
throw new Exception("There was problem compiling phar");
}
From d6ef0c4f86b92684cb2500d0fdad51623eb5c786 Mon Sep 17 00:00:00 2001
From: Gintautas Miselis
Date: Thu, 12 Dec 2019 10:02:00 +0200
Subject: [PATCH 6/6] Built phar files and updated Builds page
---
builds.markdown | 102 ++++++++++++----------
codecept.phar | Bin 7419068 -> 35 bytes
codecept.version | 2 +-
php56/codecept.phar | 1 +
php56/codecept.version | 1 +
releases/4.0.20191219/codecept.phar | Bin 0 -> 6462953 bytes
releases/4.0.20191219/php56/codecept.phar | Bin 0 -> 6318903 bytes
7 files changed, 57 insertions(+), 49 deletions(-)
mode change 100644 => 120000 codecept.phar
create mode 120000 php56/codecept.phar
create mode 100644 php56/codecept.version
create mode 100644 releases/4.0.20191219/codecept.phar
create mode 100644 releases/4.0.20191219/php56/codecept.phar
diff --git a/builds.markdown b/builds.markdown
index 8e3923ae0..d0a436444 100644
--- a/builds.markdown
+++ b/builds.markdown
@@ -4,88 +4,94 @@ title: Codeception Builds
---
+## 4.0
+*Requires: PHP 5.6 and higher + CURL*
+
+* **[Download Latest 4.0 Release](http://codeception.com/releases/4.0.20191219/codecept.phar)**
+* [4.0.20191219 for PHP 7.2+](http://codeception.com/releases/4.0.20191219/codecept.phar), [for PHP 5.6 - 7.1](http://codeception.com/releases/4.0.20191219/php56/codecept.phar)
+
## 3.1
*Requires: PHP 5.6 and higher + CURL*
* **[Download Latest 3.1 Release](http://codeception.com/releases/3.1.2/codecept.phar)**
-* [3.1.2](http://codeception.com/releases/3.1.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.2/php54/codecept.phar)
-* [3.1.1](http://codeception.com/releases/3.1.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.1/php54/codecept.phar)
-* [3.1.0](http://codeception.com/releases/3.1.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.0/php54/codecept.phar)
+* [3.1.2 for PHP 7](http://codeception.com/releases/3.1.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.2/php54/codecept.phar)
+* [3.1.1 for PHP 7](http://codeception.com/releases/3.1.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.1/php54/codecept.phar)
+* [3.1.0 for PHP 7](http://codeception.com/releases/3.1.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.1.0/php54/codecept.phar)
## 3.0
*Requires: PHP 5.6 and higher + CURL*
* **[Download Latest 3.0 Release](http://codeception.com/releases/3.0.3/codecept.phar)**
-* [3.0.3](http://codeception.com/releases/3.0.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.3/php54/codecept.phar)
-* [3.0.2](http://codeception.com/releases/3.0.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.2/php54/codecept.phar)
-* [3.0.1](http://codeception.com/releases/3.0.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.1/php54/codecept.phar)
-* [3.0.0](http://codeception.com/releases/3.0.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.0/php54/codecept.phar)
+* [3.0.3 for PHP 7](http://codeception.com/releases/3.0.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.3/php54/codecept.phar)
+* [3.0.2 for PHP 7](http://codeception.com/releases/3.0.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.2/php54/codecept.phar)
+* [3.0.1 for PHP 7](http://codeception.com/releases/3.0.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.1/php54/codecept.phar)
+* [3.0.0 for PHP 7](http://codeception.com/releases/3.0.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/3.0.0/php54/codecept.phar)
## 2.5
*Requires: PHP 5.6 and higher + CURL*
* **[Download Latest 2.5 Release](http://codeception.com/releases/2.5.6/codecept.phar)**
-* [2.5.6](http://codeception.com/releases/2.5.6/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.6/php54/codecept.phar)
-* [2.5.5](http://codeception.com/releases/2.5.5/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.5/php54/codecept.phar)
-* [2.5.4](http://codeception.com/releases/2.5.4/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.4/php54/codecept.phar)
-* [2.5.3](http://codeception.com/releases/2.5.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.3/php54/codecept.phar)
-* [2.5.2](http://codeception.com/releases/2.5.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.2/php54/codecept.phar)
-* [2.5.1](http://codeception.com/releases/2.5.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.1/php54/codecept.phar)
-* [2.5.0](http://codeception.com/releases/2.5.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.0/php54/codecept.phar)
+* [2.5.6 for PHP 7](http://codeception.com/releases/2.5.6/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.6/php54/codecept.phar)
+* [2.5.5 for PHP 7](http://codeception.com/releases/2.5.5/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.5/php54/codecept.phar)
+* [2.5.4 for PHP 7](http://codeception.com/releases/2.5.4/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.4/php54/codecept.phar)
+* [2.5.3 for PHP 7](http://codeception.com/releases/2.5.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.3/php54/codecept.phar)
+* [2.5.2 for PHP 7](http://codeception.com/releases/2.5.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.2/php54/codecept.phar)
+* [2.5.1 for PHP 7](http://codeception.com/releases/2.5.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.1/php54/codecept.phar)
+* [2.5.0 for PHP 7](http://codeception.com/releases/2.5.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.5.0/php54/codecept.phar)
## 2.4
*Requires: PHP 5.6 and higher + CURL*
* **[Download Latest 2.4 Release](http://codeception.com/releases/2.4.5/codecept.phar)**
-* [2.4.5](http://codeception.com/releases/2.4.5/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.5/php54/codecept.phar)
-* [2.4.4](http://codeception.com/releases/2.4.4/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.4/php54/codecept.phar)
-* [2.4.3](http://codeception.com/releases/2.4.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.3/php54/codecept.phar)
-* [2.4.2](http://codeception.com/releases/2.4.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.2/php54/codecept.phar)
-* [2.4.1](http://codeception.com/releases/2.4.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.1/php54/codecept.phar)
-* [2.4.0](http://codeception.com/releases/2.4.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.0/php54/codecept.phar)
+* [2.4.5 for PHP 7](http://codeception.com/releases/2.4.5/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.5/php54/codecept.phar)
+* [2.4.4 for PHP 7](http://codeception.com/releases/2.4.4/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.4/php54/codecept.phar)
+* [2.4.3 for PHP 7](http://codeception.com/releases/2.4.3/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.3/php54/codecept.phar)
+* [2.4.2 for PHP 7](http://codeception.com/releases/2.4.2/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.2/php54/codecept.phar)
+* [2.4.1 for PHP 7](http://codeception.com/releases/2.4.1/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.1/php54/codecept.phar)
+* [2.4.0 for PHP 7](http://codeception.com/releases/2.4.0/codecept.phar), [for PHP 5.6](http://codeception.com/releases/2.4.0/php54/codecept.phar)
## 2.3
*Requires: PHP 5.4 and higher + CURL*
* **[Download Latest 2.3 Release](http://codeception.com/releases/2.3.9/codecept.phar)**
-* [2.3.9](http://codeception.com/releases/2.3.9/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.9/php54/codecept.phar)
-* [2.3.8](http://codeception.com/releases/2.3.8/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.8/php54/codecept.phar)
-* [2.3.7](http://codeception.com/releases/2.3.7/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.7/php54/codecept.phar)
-* [2.3.6](http://codeception.com/releases/2.3.6/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.6/php54/codecept.phar)
-* [2.3.5](http://codeception.com/releases/2.3.5/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.5/php54/codecept.phar)
-* [2.3.4](http://codeception.com/releases/2.3.4/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.4/php54/codecept.phar)
-* [2.3.3](http://codeception.com/releases/2.3.3/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.3/php54/codecept.phar)
-* [2.3.2](http://codeception.com/releases/2.3.2/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.2/php54/codecept.phar)
-* [2.3.1](http://codeception.com/releases/2.3.1/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.1/php54/codecept.phar)
-* [2.3.0](http://codeception.com/releases/2.3.0/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.0/php54/codecept.phar)
+* [2.3.9 for PHP 7](http://codeception.com/releases/2.3.9/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.9/php54/codecept.phar)
+* [2.3.8 for PHP 7](http://codeception.com/releases/2.3.8/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.8/php54/codecept.phar)
+* [2.3.7 for PHP 7](http://codeception.com/releases/2.3.7/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.7/php54/codecept.phar)
+* [2.3.6 for PHP 7](http://codeception.com/releases/2.3.6/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.6/php54/codecept.phar)
+* [2.3.5 for PHP 7](http://codeception.com/releases/2.3.5/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.5/php54/codecept.phar)
+* [2.3.4 for PHP 7](http://codeception.com/releases/2.3.4/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.4/php54/codecept.phar)
+* [2.3.3 for PHP 7](http://codeception.com/releases/2.3.3/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.3/php54/codecept.phar)
+* [2.3.2 for PHP 7](http://codeception.com/releases/2.3.2/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.2/php54/codecept.phar)
+* [2.3.1 for PHP 7](http://codeception.com/releases/2.3.1/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.1/php54/codecept.phar)
+* [2.3.0 for PHP 7](http://codeception.com/releases/2.3.0/codecept.phar), [for PHP 5.4 - 5.6](http://codeception.com/releases/2.3.0/php54/codecept.phar)
## 2.2
*Requires: PHP 5.4 and higher + CURL*
* **[Download Latest 2.2 Release](http://codeception.com/releases/2.2.12/codecept.phar)**
-* [2.2.12](http://codeception.com/releases/2.2.12/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.12/php54/codecept.phar)
-* [2.2.11](http://codeception.com/releases/2.2.11/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.11/php54/codecept.phar)
-* [2.2.10](http://codeception.com/releases/2.2.10/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.10/php54/codecept.phar)
-* [2.2.9](http://codeception.com/releases/2.2.9/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.9/php54/codecept.phar)
-* [2.2.8](http://codeception.com/releases/2.2.8/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.8/php54/codecept.phar)
-* [2.2.7](http://codeception.com/releases/2.2.7/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.7/php54/codecept.phar)
-* [2.2.6](http://codeception.com/releases/2.2.6/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.6/php54/codecept.phar)
-* [2.2.5](http://codeception.com/releases/2.2.5/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.5/php54/codecept.phar)
-* [2.2.4](http://codeception.com/releases/2.2.4/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.4/php54/codecept.phar)
-* [2.2.3](http://codeception.com/releases/2.2.3/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.3/php54/codecept.phar)
-* [2.2.2](http://codeception.com/releases/2.2.2/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.2/php54/codecept.phar)
-* [2.2.1](http://codeception.com/releases/2.2.1/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.1/php54/codecept.phar)
+* [2.2.12 for PHP 5.6+](http://codeception.com/releases/2.2.12/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.12/php54/codecept.phar)
+* [2.2.11 for PHP 5.6+](http://codeception.com/releases/2.2.11/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.11/php54/codecept.phar)
+* [2.2.10 for PHP 5.6+](http://codeception.com/releases/2.2.10/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.10/php54/codecept.phar)
+* [2.2.9 for PHP 5.6+](http://codeception.com/releases/2.2.9/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.9/php54/codecept.phar)
+* [2.2.8 for PHP 5.6+](http://codeception.com/releases/2.2.8/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.8/php54/codecept.phar)
+* [2.2.7 for PHP 5.6+](http://codeception.com/releases/2.2.7/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.7/php54/codecept.phar)
+* [2.2.6 for PHP 5.6+](http://codeception.com/releases/2.2.6/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.6/php54/codecept.phar)
+* [2.2.5 for PHP 5.6+](http://codeception.com/releases/2.2.5/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.5/php54/codecept.phar)
+* [2.2.4 for PHP 5.6+](http://codeception.com/releases/2.2.4/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.4/php54/codecept.phar)
+* [2.2.3 for PHP 5.6+](http://codeception.com/releases/2.2.3/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.3/php54/codecept.phar)
+* [2.2.2 for PHP 5.6+](http://codeception.com/releases/2.2.2/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.2/php54/codecept.phar)
+* [2.2.1 for PHP 5.6+](http://codeception.com/releases/2.2.1/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.2.1/php54/codecept.phar)
## 2.1
*Requires: PHP 5.4 and higher + CURL*
* **[Download Latest 2.1 Release](http://codeception.com/releases/2.1.11/codecept.phar)**
-* [2.1.11](http://codeception.com/releases/2.1.11/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.11/php54/codecept.phar)
-* [2.1.10](http://codeception.com/releases/2.1.10/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.10/php54/codecept.phar)
-* [2.1.9](http://codeception.com/releases/2.1.9/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.9/php54/codecept.phar)
-* [2.1.8](http://codeception.com/releases/2.1.8/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.8/php54/codecept.phar)
-* [2.1.7](http://codeception.com/releases/2.1.7/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.7/php54/codecept.phar)
-* [2.1.6](http://codeception.com/releases/2.1.6/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.6/php54/codecept.phar)
+* [2.1.11 for PHP 5.6+](http://codeception.com/releases/2.1.11/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.11/php54/codecept.phar)
+* [2.1.10 for PHP 5.6+](http://codeception.com/releases/2.1.10/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.10/php54/codecept.phar)
+* [2.1.9 for PHP 5.6+](http://codeception.com/releases/2.1.9/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.9/php54/codecept.phar)
+* [2.1.8 for PHP 5.6+](http://codeception.com/releases/2.1.8/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.8/php54/codecept.phar)
+* [2.1.7 for PHP 5.6+](http://codeception.com/releases/2.1.7/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.7/php54/codecept.phar)
+* [2.1.6 for PHP 5.6+](http://codeception.com/releases/2.1.6/codecept.phar), [for PHP 5.4 or 5.5](http://codeception.com/releases/2.1.6/php54/codecept.phar)
* [2.1.5](http://codeception.com/releases/2.1.5/codecept.phar)
* [2.1.4](http://codeception.com/releases/2.1.4/codecept.phar)
* [2.1.3](http://codeception.com/releases/2.1.3/codecept.phar)
diff --git a/codecept.phar b/codecept.phar
deleted file mode 100644
index 715243a7a20abb06e896f57f815289f8d704375d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 7419068
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