├── vendor ├── imgix │ └── imgix-php │ │ ├── .gitignore │ │ ├── src │ │ ├── Imgix │ │ │ ├── ShardStrategy.php │ │ │ ├── UrlBuilder.php │ │ │ └── UrlHelper.php │ │ └── autoload.php │ │ ├── .travis.yml │ │ ├── composer.json │ │ ├── LICENSE │ │ ├── tests │ │ └── Imgix │ │ │ └── Tests │ │ │ ├── UrlHelperTest.php │ │ │ └── UrlBuilderTest.php │ │ ├── README.md │ │ └── composer.lock ├── composer │ ├── autoload_psr4.php │ ├── autoload_classmap.php │ ├── autoload_namespaces.php │ ├── autoload_static.php │ ├── LICENSE │ ├── installed.json │ ├── autoload_real.php │ └── ClassLoader.php └── autoload.php ├── resources ├── icon.png └── icon.svg ├── config.php ├── composer.json ├── variables └── ImgixVariable.php ├── elementactions └── Imgix_PurgeElementAction.php ├── LICENSE.txt ├── tasks ├── Imgix_PurgeUrlTask.php └── Imgix_PurgeTask.php ├── composer.lock ├── ImgixPlugin.php ├── services └── ImgixService.php ├── README.md └── models └── ImgixModel.php /vendor/imgix/imgix-php/.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjelfull/imgix/HEAD/resources/icon.png -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/src/Imgix/ShardStrategy.php: -------------------------------------------------------------------------------- 1 | '', 5 | 'imgixDomains' => [ 6 | // Example: 7 | // 'assetSourceHandle' => 'assetSourceHandle.imgix.net' 8 | ], 9 | // 'lazyLoadPrefix' => 'data-' 10 | ]; 11 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sjelfull/imgix", 3 | "type": "craft-plugin", 4 | "description": "Use Imgix with Craft 2.x", 5 | "require": { 6 | "imgix/imgix-php": "^1.1", 7 | "composer/installers": "~1.0" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | array($vendorDir . '/imgix/imgix-php/src'), 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "imgix/imgix-php", 3 | "description": "A PHP client library for generating URLs with imgix.", 4 | "type": "library", 5 | "version": "1.1.0", 6 | "keywords": [ 7 | "imgix" 8 | ], 9 | "require": { 10 | "php": ">=5.3" 11 | }, 12 | "require-dev": { 13 | "phpunit/phpunit": "*" 14 | }, 15 | "autoload": { 16 | "psr-0": { 17 | "Imgix\\": "src/" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /variables/ImgixVariable.php: -------------------------------------------------------------------------------- 1 | imgix->transformImage($asset, $transforms, $defaultOptions); 21 | } 22 | 23 | public function getImgixUrl ($asset) 24 | { 25 | return craft()->imgix->getImgixUrl($asset); 26 | } 27 | } -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | 11 | array ( 12 | 'Imgix\\' => 13 | array ( 14 | 0 => __DIR__ . '/..' . '/imgix/imgix-php/src', 15 | ), 16 | ), 17 | ); 18 | 19 | public static function getInitializer(ClassLoader $loader) 20 | { 21 | return \Closure::bind(function () use ($loader) { 22 | $loader->prefixesPsr0 = ComposerStaticInite3dcf06ee49c63ac249c1b4f85e4f4c4::$prefixesPsr0; 23 | 24 | }, null, ClassLoader::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/src/autoload.php: -------------------------------------------------------------------------------- 1 | tasks->createTask('Imgix_Purge', 'Purging images', [ 'assetIds' => $criteria->ids() ]); 31 | 32 | $this->setMessage(Craft::t('Purging images')); 33 | 34 | return true; 35 | } 36 | } -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 Superbig 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) 2016 Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /tasks/Imgix_PurgeUrlTask.php: -------------------------------------------------------------------------------- 1 | AttributeType::Mixed, 27 | ); 28 | } 29 | 30 | /** 31 | * @return string 32 | */ 33 | public function getDescription () 34 | { 35 | return 'Imgix Purge'; 36 | } 37 | 38 | /** 39 | * @return int 40 | */ 41 | public function getTotalSteps () 42 | { 43 | return count($this->getSettings()->urls); 44 | } 45 | 46 | /** 47 | * @param int $step 48 | * 49 | * @return bool 50 | */ 51 | public function runStep ($step) 52 | { 53 | craft()->imgix->purgeUrl($this->getSettings()->urls[ $step ]); 54 | 55 | return true; 56 | } 57 | } -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "imgix/imgix-php", 4 | "version": "1.1.0", 5 | "version_normalized": "1.1.0.0", 6 | "source": { 7 | "type": "git", 8 | "url": "https://github.com/imgix/imgix-php.git", 9 | "reference": "6caef36aec0a80ba5c79d1cc2859c703f12d1494" 10 | }, 11 | "dist": { 12 | "type": "zip", 13 | "url": "https://api.github.com/repos/imgix/imgix-php/zipball/6caef36aec0a80ba5c79d1cc2859c703f12d1494", 14 | "reference": "6caef36aec0a80ba5c79d1cc2859c703f12d1494", 15 | "shasum": "" 16 | }, 17 | "require": { 18 | "php": ">=5.3" 19 | }, 20 | "require-dev": { 21 | "phpunit/phpunit": "*" 22 | }, 23 | "time": "2016-02-25 19:46:23", 24 | "type": "library", 25 | "installation-source": "dist", 26 | "autoload": { 27 | "psr-0": { 28 | "Imgix\\": "src/" 29 | } 30 | }, 31 | "notification-url": "https://packagist.org/downloads/", 32 | "description": "A PHP client library for generating URLs with imgix.", 33 | "keywords": [ 34 | "imgix" 35 | ] 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tasks/Imgix_PurgeTask.php: -------------------------------------------------------------------------------- 1 | AttributeType::Mixed, 27 | ); 28 | } 29 | 30 | /** 31 | * @return string 32 | */ 33 | public function getDescription () 34 | { 35 | return 'Imgix Purge'; 36 | } 37 | 38 | /** 39 | * @return int 40 | */ 41 | public function getTotalSteps () 42 | { 43 | return count($this->getSettings()->assetIds); 44 | } 45 | 46 | /** 47 | * @param int $step 48 | * 49 | * @return bool 50 | */ 51 | public function runStep ($step) 52 | { 53 | $asset = craft()->assets->getFileById($this->getSettings()->assetIds[ $step ]); 54 | 55 | if ( $asset && craft()->imgix->shouldUpdate($asset) ) { 56 | craft()->imgix->purge($asset); 57 | } 58 | 59 | return true; 60 | } 61 | } -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Zebrafish Labs Inc. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | Redistributions of source code must retain the above copyright notice, 8 | this list of conditions and the following disclaimer. 9 | 10 | Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 18 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 | POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/tests/Imgix/Tests/UrlHelperTest.php: -------------------------------------------------------------------------------- 1 | 500); 9 | $uh = new URLHelper("imgix-library-secure-test-source.imgix.net", "dog.jpg", "http", "EHFQXiZhxP4wA2c4", $params); 10 | 11 | $this->assertEquals("http://imgix-library-secure-test-source.imgix.net/dog.jpg?w=500&s=e4eb402d12bbdf267bf0fc5588170d56", $uh->getURL()); 12 | } 13 | 14 | public function testHelperBuildSignedURLWithHashMapAndNoParams() { 15 | $params = array(); 16 | $uh = new URLHelper("imgix-library-secure-test-source.imgix.net", "dog.jpg", "http", "EHFQXiZhxP4wA2c4", $params); 17 | 18 | $this->assertEquals("http://imgix-library-secure-test-source.imgix.net/dog.jpg?s=2b0bc99b1042e3c1c9aae6598acc3def", $uh->getURL()); 19 | } 20 | 21 | public function testHelperBuildSignedURLWithHashSetterParams() { 22 | $uh = new URLHelper("imgix-library-secure-test-source.imgix.net", "dog.jpg", "http", "EHFQXiZhxP4wA2c4"); 23 | $uh->setParameter("w", 500); 24 | $this->assertEquals("http://imgix-library-secure-test-source.imgix.net/dog.jpg?w=500&s=e4eb402d12bbdf267bf0fc5588170d56", $uh->getURL()); 25 | } 26 | 27 | public function testHelperBuildSignedURLWithHashSetterParamsHttps() { 28 | $uh = new URLHelper("imgix-library-secure-test-source.imgix.net", "dog.jpg", "https", "EHFQXiZhxP4wA2c4"); 29 | $uh->setParameter("w", 500); 30 | $this->assertEquals("https://imgix-library-secure-test-source.imgix.net/dog.jpg?w=500&s=e4eb402d12bbdf267bf0fc5588170d56", $uh->getURL()); 31 | } 32 | } 33 | 34 | ?> 35 | -------------------------------------------------------------------------------- /vendor/composer/autoload_real.php: -------------------------------------------------------------------------------- 1 | = 50600 && !defined('HHVM_VERSION'); 27 | if ($useStaticLoader) { 28 | require_once __DIR__ . '/autoload_static.php'; 29 | 30 | call_user_func(\Composer\Autoload\ComposerStaticInite3dcf06ee49c63ac249c1b4f85e4f4c4::getInitializer($loader)); 31 | } else { 32 | $map = require __DIR__ . '/autoload_namespaces.php'; 33 | foreach ($map as $namespace => $path) { 34 | $loader->set($namespace, $path); 35 | } 36 | 37 | $map = require __DIR__ . '/autoload_psr4.php'; 38 | foreach ($map as $namespace => $path) { 39 | $loader->setPsr4($namespace, $path); 40 | } 41 | 42 | $classMap = require __DIR__ . '/autoload_classmap.php'; 43 | if ($classMap) { 44 | $loader->addClassMap($classMap); 45 | } 46 | } 47 | 48 | $loader->register(true); 49 | 50 | return $loader; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /resources/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "502bbef9048efb13732beb5ae92fc29e", 8 | "content-hash": "85418cdcc1d8a401c5f84bce4268f2ae", 9 | "packages": [ 10 | { 11 | "name": "imgix/imgix-php", 12 | "version": "1.1.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/imgix/imgix-php.git", 16 | "reference": "6caef36aec0a80ba5c79d1cc2859c703f12d1494" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/imgix/imgix-php/zipball/6caef36aec0a80ba5c79d1cc2859c703f12d1494", 21 | "reference": "6caef36aec0a80ba5c79d1cc2859c703f12d1494", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.3" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "*" 29 | }, 30 | "type": "library", 31 | "autoload": { 32 | "psr-0": { 33 | "Imgix\\": "src/" 34 | } 35 | }, 36 | "notification-url": "https://packagist.org/downloads/", 37 | "description": "A PHP client library for generating URLs with imgix.", 38 | "keywords": [ 39 | "imgix" 40 | ], 41 | "time": "2016-02-25 19:46:23" 42 | } 43 | ], 44 | "packages-dev": [], 45 | "aliases": [], 46 | "minimum-stability": "stable", 47 | "stability-flags": [], 48 | "prefer-stable": false, 49 | "prefer-lowest": false, 50 | "platform": [], 51 | "platform-dev": [] 52 | } 53 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/src/Imgix/UrlBuilder.php: -------------------------------------------------------------------------------- 1 | domains = array($domains); 18 | } else { 19 | $this->domains = $domains; 20 | } 21 | 22 | if (sizeof($this->domains) === 0) { 23 | throw new \InvalidArgumentException("UrlBuilder requires at least one domain"); 24 | } 25 | 26 | $this->useHttps = $useHttps; 27 | $this->signKey = $signKey; 28 | $this->shardStrategy = $shardStrategy; 29 | $this->includeLibraryParam = $includeLibraryParam; 30 | } 31 | 32 | public function setShardStrategy($start) { 33 | $this->shardStrategy = $start; 34 | } 35 | 36 | public function setSignKey($key) { 37 | $this->signKey = $key; 38 | } 39 | 40 | public function setUseHttps($useHttps) { 41 | $this->useHttps = $useHttps; 42 | } 43 | 44 | public function createURL($path, $params=array()) { 45 | $scheme = $this->useHttps ? "https" : "http"; 46 | 47 | if ($this->shardStrategy === ShardStrategy::CRC) { 48 | $index = self::unsigned_crc32($path) % sizeof($this->domains); 49 | $domain = $this->domains[$index]; 50 | } else if ($this->shardStrategy === ShardStrategy::CYCLE) { 51 | $this->shardCycleNextIndex = ($this->shardCycleNextIndex + 1) % sizeof($this->domains); 52 | $domain = $this->domains[$this->shardCycleNextIndex]; 53 | } else { 54 | $domain = $this->domains[0]; 55 | } 56 | 57 | if ($this->includeLibraryParam) { 58 | $params['ixlib'] = "php-" . $this->currentVersion; 59 | } 60 | 61 | $uh = new UrlHelper($domain, $path, $scheme, $this->signKey, $params); 62 | 63 | return $uh->getURL(); 64 | } 65 | 66 | // force unsigned int since 32-bit systems can return a signed integer 67 | // see warning here: http://php.net/manual/en/function.crc32.php 68 | public static function unsigned_crc32($v) { 69 | return intval(sprintf("%u", crc32($v))); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/src/Imgix/UrlHelper.php: -------------------------------------------------------------------------------- 1 | domain = $domain; 15 | $this->path = substr($path, 0, 4) === "http" ? urlencode($path) : $path; 16 | $this->path = substr($this->path, 0, 1) !== "/" ? ("/" . $this->path) : $this->path; 17 | $this->scheme = $scheme; 18 | $this->signKey = $signKey; 19 | $this->params = $params; 20 | } 21 | 22 | public function setParameter($key, $value) { 23 | if ($key && ($value || $value === 0)) { 24 | $this->params[$key] = $value; 25 | } else { 26 | if (array_key_exists($key, $this->params)) { 27 | unset($this->params[$key]); 28 | } 29 | } 30 | } 31 | 32 | public function deleteParamter($key) { 33 | $this->deleteParamter($key, ""); 34 | } 35 | 36 | public function getURL() { 37 | $queryPairs = array(); 38 | 39 | if ($this->params) { 40 | ksort($this->params); 41 | 42 | foreach ($this->params as $key => $val) { 43 | if (substr($key, -2) == '64') { 44 | $encodedVal = self::base64url_encode($val); 45 | } else { 46 | $encodedVal = rawurlencode($val); 47 | } 48 | 49 | $queryPairs[] = rawurlencode($key) . "=" . $encodedVal; 50 | } 51 | } 52 | 53 | $query = join("&", $queryPairs); 54 | if ($query) { 55 | $query = '?' . $query; 56 | } 57 | 58 | if ($this->signKey) { 59 | $toSign = $this->signKey . $this->path . $query; 60 | $sig = md5($toSign); 61 | if ($query) { 62 | $query .= "&s=" . $sig; 63 | } else { 64 | $query = "?s=" . $sig; 65 | } 66 | } 67 | 68 | $url_parts = array('scheme' => $this->scheme, 'host' => $this->domain, 'path' => $this->path, 'query' => $query); 69 | 70 | return self::joinURL($url_parts); 71 | } 72 | 73 | private static function base64url_encode($data) { 74 | return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 75 | } 76 | 77 | private static function joinURL($parts) { 78 | $url = $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . $parts['query']; 79 | 80 | return $url; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /ImgixPlugin.php: -------------------------------------------------------------------------------- 1 | imgix->isPurgeEnabled()) { 26 | craft()->on('elements.onBeforeSaveElement', function (Event $event) { 27 | $element = $event->params['element']; 28 | 29 | if ( !$event->params['isNewElement'] && craft()->imgix->shouldUpdate($element) ) { 30 | craft()->imgix->onSaveAsset($event->params['element']); 31 | } 32 | }); 33 | 34 | craft()->on('assets.onDeleteAsset', function (Event $event) { 35 | $asset = $event->params['asset']; 36 | 37 | if ( craft()->imgix->shouldUpdate($asset) ) { 38 | craft()->imgix->onDeleteAsset($asset); 39 | } 40 | }); 41 | } 42 | } 43 | 44 | /** 45 | * @return mixed 46 | */ 47 | public function getName () 48 | { 49 | return Craft::t('Imgix'); 50 | } 51 | 52 | /** 53 | * @return mixed 54 | */ 55 | public function getDescription () 56 | { 57 | return Craft::t('Imgix is awesome'); 58 | } 59 | 60 | /** 61 | * @return string 62 | */ 63 | public function getDocumentationUrl () 64 | { 65 | return 'https://superbig.co/plugins/imgix'; 66 | } 67 | 68 | /** 69 | * @return string 70 | */ 71 | public function getReleaseFeedUrl () 72 | { 73 | return 'https://superbig.co/plugins/imgix/feed'; 74 | } 75 | 76 | /** 77 | * @return string 78 | */ 79 | public function getVersion () 80 | { 81 | return '1.0.7'; 82 | } 83 | 84 | /** 85 | * @return string 86 | */ 87 | public function getSchemaVersion () 88 | { 89 | return '1.0.0'; 90 | } 91 | 92 | /** 93 | * @return string 94 | */ 95 | public function getDeveloper () 96 | { 97 | return 'Superbig'; 98 | } 99 | 100 | /** 101 | * @return string 102 | */ 103 | public function getDeveloperUrl () 104 | { 105 | return 'https://superbig.co'; 106 | } 107 | 108 | public function addAssetActions () 109 | { 110 | $actions = []; 111 | 112 | if (craft()->imgix->isPurgeEnabled()) { 113 | $actions[] = 'Imgix_Purge'; 114 | } 115 | 116 | return $actions; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /services/ImgixService.php: -------------------------------------------------------------------------------- 1 | getSetting('imgixDomain'); 28 | 29 | $this->builder = new UrlBuilder($imgixDomain); 30 | } 31 | 32 | public function onSaveAsset(AssetFileModel $asset) 33 | { 34 | try { 35 | craft()->tasks->createTask('Imgix_Purge', 'Purging images', ['assetIds' => [$asset->id]]); 36 | } catch (\Exception $e) { 37 | ImgixPlugin::log('Error when creating task: ' . $e->getMessage(), LogLevel::Error); 38 | } 39 | } 40 | 41 | public function onDeleteAsset(AssetFileModel $asset) 42 | { 43 | try { 44 | craft()->tasks->createTask('Imgix_PurgeUrl', 'Purging images', ['urls' => [$this->getImgixUrl($asset)]]); 45 | } catch (\Exception $e) { 46 | ImgixPlugin::log('Error when creating task: ' . $e->getMessage(), LogLevel::Error); 47 | } 48 | } 49 | 50 | /** 51 | */ 52 | public function transformImage($asset = null, $transforms = null, $defaultOptions = []) 53 | { 54 | if (!$asset) { 55 | return null; 56 | } 57 | 58 | $pathsModel = new ImgixModel($asset, $transforms, $defaultOptions); 59 | 60 | return $pathsModel; 61 | } 62 | 63 | public function shouldUpdate($element) 64 | { 65 | return $element->getElementType() === 'Asset' && $element->kind === 'image' && ($element->extension !== 'svg' && $element->mimeType !== 'image/svg+xml'); 66 | } 67 | 68 | public function purge(AssetFileModel $asset) 69 | { 70 | $url = $this->getImgixUrl($asset); 71 | 72 | ImgixPlugin::log(Craft::t('Purging asset #{id}: {url}', [ 73 | 'id' => $asset->id, 'url' => $url 74 | ], LogLevel::Trace)); 75 | 76 | return $this->purgeUrl($url); 77 | } 78 | 79 | public function purgeUrl($url = null) 80 | { 81 | try { 82 | $client = new Client(); 83 | $request = $client->post('https://api.imgix.com/v2/image/purger', [], [ 84 | 'url' => UrlHelper::stripQueryString($url), 85 | ], [ 86 | 'timeout' => 15, 87 | ]); 88 | $request->setAuth($this->getSetting('apiKey')); 89 | 90 | return $request->send(); 91 | } catch (\Exception $e) { 92 | ImgixPlugin::log(Craft::t('Failed to purge {url}', [ 93 | 'url' => $url 94 | ]), LogLevel::Error); 95 | 96 | return true; 97 | } 98 | } 99 | 100 | public function getImgixUrl(AssetFileModel $asset) 101 | { 102 | $source = $asset->source; 103 | $sourceHandle = $source->handle; 104 | $domains = $this->getSetting('imgixDomains'); 105 | $domain = array_key_exists($sourceHandle, $domains) ? $domains[ $sourceHandle ] : null; 106 | 107 | if (!$domain) { 108 | return null; 109 | } 110 | 111 | $builder = new UrlBuilder($domain); 112 | 113 | return $builder->createURL($asset->path); 114 | } 115 | 116 | public function getSetting($setting) 117 | { 118 | return craft()->config->get($setting, 'imgix'); 119 | } 120 | 121 | public function isPurgeEnabled() 122 | { 123 | return !empty($this->getSetting('apiKey')); 124 | } 125 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Imgix plugin for Craft CMS 2 | 3 | > This is the Craft 2 version, and is deprecated. The Craft 3+ version is available here: https://github.com/sjelfull/craft3-imgix 4 | 5 | Imgix is awesome 6 | 7 | ![Screenshot](resources/icon.png) 8 | 9 | ## Installation 10 | 11 | To install Imgix, follow these steps: 12 | 13 | 1. Download & unzip the file and place the `imgix` directory into your `craft/plugins` directory 14 | 2. Install plugin in the Craft Control Panel under Settings > Plugins 15 | 4. The plugin folder should be named `imgix` for Craft to see it. 16 | 17 | Imgix works on Craft 2.4.x and Craft 2.5.x. 18 | 19 | ## Configuring Imgix 20 | 21 | Copy `config.php` into Crafts `config` folder and rename it to `imgix.php`. 22 | 23 | Then map your Asset Source handle to your Imgix domain, according to the example. 24 | 25 | This plugin will lookup the Asset image's source handle, and figure out which Imgix domain to use. If a URL string is passed, it will use the first domain in the config file. 26 | 27 | To purge images automatically on deletion/save or manually, you have to add your API key to the config file. 28 | 29 | ## Using Imgix 30 | 31 | ```twig 32 | {% set transforms = [ 33 | { 34 | width: 400, 35 | height: 300 36 | }, 37 | { 38 | width: 940, 39 | height: 520 40 | }, 41 | { 42 | width: 1400, 43 | }, 44 | ] %} 45 | 46 | {% set defaultOptions = { 47 | sharp: 10 48 | } %} 49 | 50 | {% set firstImage = craft.imgix.transformImage( asset, { width: 400, height: 350 }) %} 51 | {% set secondImage = craft.imgix.transformImage( asset, transforms) %} 52 | {% set thirdImage = craft.imgix.transformImage( asset, { width: 1920, ratio: 16/9}) %} 53 | {% set fourthImage = craft.imgix.transformImage( asset, transforms, defaultOptions) } 54 | 55 | {# Image tag #} 56 | {{ firstImage.img() }} 57 | 58 | {# Get url for the first image #} 59 | {{ firstImage.getUrl() }} 60 | 61 | {# Image tag w/ srcset + tag attributes #} 62 | {{ secondImage.srcset({ width: 700 }) }} 63 | 64 | {# Image tag w/ srcset + default options for each transform #} 65 | {{ fourthImage.srcset( {} ) }} 66 | 67 | {# Image tag w/ lazyload #} 68 | {{ firstImage.img({ lazyLoad: true }) }} 69 | 70 | {# Image tag w/ srcset + lazyLoad #} 71 | {{ secondImage.srcset({ lazyLoad: true }) }} 72 | 73 | {# See transformed results #} 74 | {{ dump(secondImage.transformed) }} 75 | ``` 76 | 77 | To use with Element API, you can call the service directly: 78 | 79 | ```php 80 | [ 85 | 'news.json' => [ 86 | 'elementType' => ElementType::Entry, 87 | 'criteria' => ['section' => 'news'], 88 | 'transformer' => function(EntryModel $entry) { 89 | $asset = $entry->featuredImage->first(); 90 | $featuredImage = craft()->imgix->transformImage( $asset, [ 'width' => 400, 'height' => 350 ]); 91 | return [ 92 | 'title' => $entry->title, 93 | 'url' => $entry->url, 94 | 'jsonUrl' => UrlHelper::getUrl("news/{$entry->id}.json"), 95 | 'summary' => $entry->summary, 96 | 'featuredImage' => $featuredImage, 97 | ]; 98 | }, 99 | ], 100 | ] 101 | ]; 102 | ``` 103 | ## Lazy loading 104 | 105 | To replace `src` and `srcset` with `data-src` and `data-srcset` for lazy loading, add the `lazyLoad` attribute to to `transformImage()`. 106 | 107 | If you need to prefix with something other than `data-`, you can set the configuration value `lazyLoadPrefix` in `craft/config/imgix.php`. 108 | 109 | ## Imgix Roadmap 110 | 111 | - Clean it up 112 | - Add documentation 113 | - Look into improving srcset/API 114 | 115 | ## Imgix Changelog 116 | 117 | ### 1.0.0 -- 2017.04.03 118 | 119 | * Initial release 120 | 121 | Brought to you by [Superbig](https://superbig.co) 122 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/README.md: -------------------------------------------------------------------------------- 1 | ![imgix logo](https://assets.imgix.net/imgix-logo-web-2014.pdf?page=2&fm=png&w=200&h=200) 2 | 3 | [![Build Status](https://travis-ci.org/imgix/imgix-php.png?branch=master)](https://travis-ci.org/imgix/imgix-php) 4 | 5 | A PHP client library for generating URLs with imgix. imgix is a high-performance 6 | distributed image processing service. More information can be found at 7 | [http://www.imgix.com](http://www.imgix.com). 8 | 9 | 10 | ## Dependencies 11 | 12 | The tests have a few external dependencies. To install those: 13 | 14 | ```bash 15 | phpunit --bootstrap src/autoload.php tests/tests.php 16 | ``` 17 | 18 | ## Installation 19 | 20 | ### Standalone 21 | 22 | Just copy the files to your project, and include the `src/autoload.php` file. We recommend using Composer if at all possible. 23 | 24 | ### Using Composer 25 | 26 | Define the following requirement in your `composer.json` file: 27 | 28 | ```json 29 | { 30 | "require": { 31 | "imgix/imgix-php": "dev-master" 32 | } 33 | } 34 | ``` 35 | 36 | And include the global `vendor/autoload.php` autoloader. 37 | 38 | ## Basic Usage 39 | 40 | To begin creating imgix URLs programmatically, simply add the php files to your project (an example autoloader is also provided). The URL builder can be reused to create URLs for any 41 | images on the domains it is provided. 42 | 43 | ```php 44 | use Imgix\UrlBuilder; 45 | 46 | $builder = new UrlBuilder("demos.imgix.net"); 47 | $params = array("w" => 100, "h" => 100); 48 | echo $builder->createURL("bridge.png", $params); 49 | 50 | // Prints out: 51 | // http://demos.imgix.net/bridge.png?h=100&w=100 52 | ``` 53 | 54 | For HTTPS support, simply use the setter `setUseHttps` on the builder 55 | 56 | ```php 57 | use Imgix\UrlBuilder; 58 | 59 | $builder = new UrlBuilder("demos.imgix.net"); 60 | $builder->setUseHttps(true); 61 | $params = array("w" => 100, "h" => 100); 62 | echo $builder->createURL("bridge.png", $params); 63 | 64 | // Prints out 65 | // https://demos.imgix.net/bridge.png?h=100&w=100 66 | ``` 67 | 68 | ## Signed URLs 69 | 70 | To produce a signed URL, you must enable secure URLs on your source and then 71 | provide your signature key to the URL builder. 72 | 73 | ```php 74 | use Imgix\UrlBuilder; 75 | 76 | $builder = new UrlBuilder("demos.imgix.net"); 77 | $builder->setSignKey("test1234"); 78 | $params = array("w" => 100, "h" => 100); 79 | echo $builder->createURL("bridge.png", $params); 80 | 81 | // Prints out: 82 | // http://demos.imgix.net/bridge.png?h=100&w=100&s=bb8f3a2ab832e35997456823272103a4 83 | ``` 84 | 85 | ## Domain Sharded URLs 86 | 87 | Domain sharding enables you to spread image requests across multiple domains. 88 | This allows you to bypass the requests-per-host limits of browsers. We 89 | recommend 2-3 domain shards maximum if you are going to use domain sharding. 90 | 91 | In order to use domain sharding, you need to add multiple domains to your 92 | source. You then provide an array of these domains to a builder. 93 | 94 | ```php 95 | use Imgix\UrlBuilder; 96 | 97 | $domains = array("demos-1.imgix.net", "demos-2.imgix.net", "demos-3.imgix.net"); 98 | $builder = new URLBuilder($domains); 99 | $params = array("w" => 100, "h" => 100); 100 | echo $builder->createURL("bridge.png", $params); 101 | echo $builder->createURL("flower.png", $params); 102 | 103 | // Prints out: 104 | // http://demos-1.imgix.net/bridge.png?h=100&w=100 105 | // http://demos-2.imgix.net/flower.png?h=100&w=100 106 | ``` 107 | 108 | 109 | By default, shards are calculated using a checksum so that the image path 110 | always resolves to the same domain. This improves caching in the browser. 111 | However, you can supply a different strategy that cycles through domains 112 | instead. For example: 113 | 114 | ```php 115 | use Imgix\UrlBuilder; 116 | use Imgix\ShardStrategy; 117 | 118 | $domains = array("demos-1.imgix.net", "demos-2.imgix.net", "demos-3.imgix.net"); 119 | $builder = new URLBuilder($domains); 120 | $builder->setShardStrategy(ShardStrategy::CYCLE); 121 | $params = array("w" => 100, "h" => 100); 122 | echo $builder->createURL("bridge.png", $params); 123 | echo $builder->createURL("bridge.png", $params); 124 | echo $builder->createURL("bridge.png", $params); 125 | echo $builder->createURL("bridge.png", $params); 126 | 127 | // Prints out: 128 | // http://demos-1.imgix.net/bridge.png?h=100&w=100 129 | // http://demos-2.imgix.net/bridge.png?h=100&w=100 130 | // http://demos-3.imgix.net/bridge.png?h=100&w=100 131 | // http://demos-1.imgix.net/bridge.png?h=100&w=100 132 | ``` 133 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/tests/Imgix/Tests/UrlBuilderTest.php: -------------------------------------------------------------------------------- 1 | setShardStrategy(ShardStrategy::CYCLE); 24 | 25 | for ($i = 0; $i < 100; $i++) { 26 | $used = array(); 27 | foreach ($domains as $domain) { 28 | $url = $ub->createURL("chester.png"); 29 | $curDomain = parse_url($url)["host"]; 30 | $this->assertFalse(in_array($curDomain, $used)); 31 | $used[] = $curDomain; 32 | } 33 | } 34 | } 35 | 36 | public function testExamplePlain() { 37 | $builder = new UrlBuilder("demos.imgix.net", false, "", ShardStrategy::CRC, false); 38 | 39 | $params = array("w" => 100, "h" => 100); 40 | $url = $builder->createURL("bridge.png", $params); 41 | 42 | $this->assertEquals("http://demos.imgix.net/bridge.png?h=100&w=100", $url); 43 | } 44 | 45 | public function testExamplePlainHttps() { 46 | $builder = new UrlBuilder("demos.imgix.net", false, "", ShardStrategy::CRC, false); 47 | 48 | $builder->setUseHttps(true); 49 | $params = array("w" => 100, "h" => 100); 50 | $url = $builder->createURL("bridge.png", $params); 51 | 52 | $this->assertEquals("https://demos.imgix.net/bridge.png?h=100&w=100", $url); 53 | } 54 | 55 | public function testExamplePlainSecure() { 56 | $builder = new UrlBuilder("demos.imgix.net", false, "", ShardStrategy::CRC, false); 57 | $builder->setSignKey("test1234"); 58 | $params = array("w" => 100, "h" => 100); 59 | $url = $builder->createURL("bridge.png", $params); 60 | 61 | $this->assertEquals("http://demos.imgix.net/bridge.png?h=100&w=100&s=bb8f3a2ab832e35997456823272103a4", $url); 62 | } 63 | 64 | public function testParamKeysAreEscaped() { 65 | $builder = new UrlBuilder("demo.imgix.net", true, "", ShardStrategy::CRC, false); 66 | $params = array("hello world" => "interesting"); 67 | $url = $builder->createURL("demo.png", $params); 68 | 69 | $this->assertEquals("https://demo.imgix.net/demo.png?hello%20world=interesting", $url); 70 | } 71 | 72 | public function testParamValuesAreEscaped() { 73 | $builder = new UrlBuilder("demo.imgix.net", true, "", ShardStrategy::CRC, false); 74 | $params = array("hello_world" => '/foo"><'); 75 | $url = $builder->createURL("demo.png", $params); 76 | 77 | $this->assertEquals("https://demo.imgix.net/demo.png?hello_world=%2Ffoo%22%3E%3Cscript%3Ealert%28%22hacked%22%29%3C%2Fscript%3E%3C", $url); 78 | } 79 | 80 | public function testBase64ParamVariantsAreBase64Encoded() { 81 | $builder = new UrlBuilder("demo.imgix.net", true, "", ShardStrategy::CRC, false); 82 | $params = array("txt64" => 'I cannøt belîév∑ it wors! 😱'); 83 | $url = $builder->createURL("~text", $params); 84 | 85 | $this->assertEquals("https://demo.imgix.net/~text?txt64=SSBjYW5uw7h0IGJlbMOuw6l24oiRIGl0IHdvcu-jv3MhIPCfmLE", $url); 86 | } 87 | 88 | public function testWithFullyQualifiedUrl() { 89 | $builder = new UrlBuilder("demos.imgix.net", true, "", ShardStrategy::CRC, false); 90 | $builder->setSignKey("test1234"); 91 | $url = $builder->createUrl("http://media.giphy.com/media/jCMq0p94fgBIk/giphy.gif"); 92 | 93 | $this->assertEquals("https://demos.imgix.net/http%3A%2F%2Fmedia.giphy.com%2Fmedia%2FjCMq0p94fgBIk%2Fgiphy.gif?s=54c35ea3a066357b06bc553ee9975ec9", $url); 94 | } 95 | 96 | public function testWithFullyQualifiedUrlWithSpaces() { 97 | $builder = new UrlBuilder("demos.imgix.net", true, "", ShardStrategy::CRC, false); 98 | $builder->setSignKey("test1234"); 99 | $url = $builder->createUrl("https://my-demo-site.com/files/133467012/avatar icon.png"); 100 | 101 | $this->assertEquals("https://demos.imgix.net/https%3A%2F%2Fmy-demo-site.com%2Ffiles%2F133467012%2Favatar+icon.png?s=1f65f21dab7da2d3c104dfaf898ce8cc", $url); 102 | } 103 | 104 | public function testWithFullyQualifiedUrlWithParams() { 105 | $builder = new UrlBuilder("demos.imgix.net", true, "", ShardStrategy::CRC, false); 106 | $builder->setSignKey("test1234"); 107 | $url = $builder->createUrl("https://my-demo-site.com/files/133467012/avatar icon.png?some=chill¶ms=1"); 108 | 109 | $this->assertEquals("https://demos.imgix.net/https%3A%2F%2Fmy-demo-site.com%2Ffiles%2F133467012%2Favatar+icon.png%3Fsome%3Dchill%26params%3D1?s=970429e4d150c4609142f4c0a86089c9", $url); 110 | } 111 | 112 | public function testInclusionOfLibraryVersionParam() { 113 | $builder = new UrlBuilder("demos.imgix.net", true); 114 | $url = $builder->createUrl("https://my-demo-site.com/files/133467012/avatar icon.png?some=chill¶ms=1"); 115 | $composerFileJson = json_decode(file_get_contents("./composer.json"), true); 116 | $version = $composerFileJson['version']; 117 | 118 | $this->assertEquals("https://demos.imgix.net/https%3A%2F%2Fmy-demo-site.com%2Ffiles%2F133467012%2Favatar+icon.png%3Fsome%3Dchill%26params%3D1?ixlib=php-" . $version, $url); 119 | } 120 | } 121 | ?> 122 | -------------------------------------------------------------------------------- /models/ImgixModel.php: -------------------------------------------------------------------------------- 1 | 'w', 131 | 'height' => 'h', 132 | 'max-height' => 'max-h', 133 | 'max-width' => 'max-w', 134 | 'min-height' => 'min-h', 135 | 'max-width' => 'min-w', 136 | ); 137 | protected $transforms; 138 | protected $imagePath; 139 | protected $builder; 140 | protected $defaultOptions; 141 | protected $lazyLoadPrefix; 142 | 143 | /** 144 | * Constructor 145 | * 146 | * @param $image 147 | * 148 | * @throws Exception 149 | */ 150 | public function __construct ($image, $transforms = null, $defaultOptions = [ ]) 151 | { 152 | parent::__construct(); 153 | 154 | $this->lazyLoadPrefix = craft()->imgix->getSetting('lazyLoadPrefix') ?: 'data-'; 155 | if ( get_class($image) == 'Craft\AssetFileModel' or get_class($image) == 'Craft\FocusPoint_AssetFileModel' ) { 156 | $source = $image->source; 157 | $sourceHandle = $source->handle; 158 | $domains = craft()->imgix->getSetting('imgixDomains'); 159 | $domain = array_key_exists($sourceHandle, $domains) ? $domains[ $sourceHandle ] : null; 160 | 161 | $this->builder = new UrlBuilder($domain); 162 | $this->builder->setUseHttps(true); 163 | $this->imagePath = $image->path; 164 | $this->transforms = $transforms; 165 | $this->defaultOptions = $defaultOptions; 166 | 167 | $this->transform($transforms); 168 | } 169 | elseif ( gettype($image) === 'string' ) { 170 | $domains = craft()->imgix->getSetting('imgixDomains'); 171 | $firstHandle = array_keys($domains); 172 | $domain = $domains[ $firstHandle ]; 173 | $this->builder = new UrlBuilder($domain); 174 | $this->imagePath = $image; 175 | $this->transforms = $transforms; 176 | $this->defaultOptions = $defaultOptions; 177 | 178 | $this->transform($transforms); 179 | } 180 | else { 181 | throw new Exception(Craft::t('An unknown image object was used.')); 182 | } 183 | } 184 | 185 | public function img ($attributes = null) 186 | { 187 | if ( $image = $this->getAttribute('transformed') ) { 188 | if ( $image && isset($image['url']) ) { 189 | $lazyLoad = false; 190 | if ( isset($attributes['lazyLoad']) ) { 191 | $lazyLoad = $attributes['lazyLoad']; 192 | unset($attributes['lazyLoad']); // unset to remove it from the html output 193 | } 194 | $tagAttributes = $this->getTagAttributes($attributes); 195 | 196 | return TemplateHelper::getRaw('lazyLoadPrefix : '' ) .'src="' . $image['url'] . '" ' . $tagAttributes . ' />'); 197 | } 198 | } 199 | 200 | return null; 201 | } 202 | 203 | public function getUrl () 204 | { 205 | if ( $image = $this->getAttribute('transformed') ) { 206 | if ( $image && isset($image['url']) ) { 207 | return $image['url']; 208 | } 209 | } 210 | 211 | return null; 212 | } 213 | 214 | public function srcset ($attributes = []) 215 | { 216 | if ( $images = $this->getAttribute('transformed') ) { 217 | $widths = [ ]; 218 | $result = ''; 219 | 220 | foreach ($images as $image) { 221 | $keys = array_keys($image); 222 | $width = $image['width'] ?? $image['w'] ?? null; 223 | 224 | if ( $width && !isset($widths[ $width ]) ) { 225 | $withs[ $width ] = true; 226 | $result .= $image['url'] . ' ' . $width . 'w, '; 227 | } 228 | } 229 | 230 | $srcset = substr($result, 0, strlen($result) - 2); 231 | $lazyLoad = false; 232 | if ( isset($attributes['lazyLoad']) ) { 233 | $lazyLoad = $attributes['lazyLoad']; 234 | unset($attributes['lazyLoad']); // unset to remove it from the html output 235 | } 236 | $tagAttributes = $this->getTagAttributes($attributes); 237 | 238 | return TemplateHelper::getRaw('lazyLoadPrefix : '' ) .'src="' . $images[0]['url'] . '" '. ( $lazyLoad ? $this->lazyLoadPrefix : '' ) .'srcset="' . $srcset . '" ' . $tagAttributes . ' />'); 239 | } 240 | 241 | return null; 242 | } 243 | 244 | protected function transform ($transforms) 245 | { 246 | if ( !$transforms ) { 247 | return null; 248 | } 249 | 250 | if ( isset($transforms[0]) ) { 251 | $images = [ ]; 252 | foreach ($transforms as $transform) { 253 | $transform = array_merge($transform, $this->defaultOptions); 254 | $transform = $this->translateAttributes($transform); 255 | $transform = $this->calculateTargetSizeFromRatio($transform); 256 | $url = $this->buildTransform($this->imagePath, $transform); 257 | $images[] = array_merge($transform, [ 'url' => $url ]); 258 | } 259 | $this->setAttribute('transformed', $images); 260 | } 261 | else { 262 | $transforms = array_merge($transforms, $this->defaultOptions); 263 | $transforms = $this->translateAttributes($transforms); 264 | $transforms = $this->calculateTargetSizeFromRatio($transforms); 265 | $url = $this->buildTransform($this->imagePath, $transforms); 266 | $image = array_merge($transforms, [ 'url' => $url ]); 267 | $this->setAttribute('transformed', $image); 268 | } 269 | } 270 | 271 | /** 272 | * @return array 273 | */ 274 | protected function defineAttributes () 275 | { 276 | return array_merge(parent::defineAttributes(), array( 277 | 'transformed' => array( AttributeType::Mixed, 'default' => null ), 278 | )); 279 | } 280 | 281 | private function buildTransform ($filename, $parameters) 282 | { 283 | return $this->builder->createURL($filename, $parameters); 284 | } 285 | 286 | private function translateAttributes ($attributes) 287 | { 288 | $translatedAttributes = [ ]; 289 | 290 | foreach ($attributes as $key => $setting) { 291 | if ( array_key_exists($key, $this->attributesTranslate) ) { 292 | $key = $this->attributesTranslate[ $key ]; 293 | } 294 | 295 | $translatedAttributes[ $key ] = $setting; 296 | } 297 | 298 | return $translatedAttributes; 299 | } 300 | 301 | private function getTagAttributes ($attributes) 302 | { 303 | if ( !$attributes ) { 304 | return ''; 305 | } 306 | 307 | $tagAttributes = ''; 308 | 309 | foreach ($attributes as $key => $attribute) { 310 | $tagAttributes .= ' ' . $key . '="' . $attribute . '"'; 311 | } 312 | 313 | return $tagAttributes; 314 | } 315 | 316 | protected function calculateTargetSizeFromRatio($transform) 317 | { 318 | if ( ! isset($transform['ratio'])) { 319 | return $transform; 320 | } 321 | $ratio = (float)$transform['ratio']; 322 | 323 | $w = isset($transform['w']) ? $transform['w'] : null; 324 | $h = isset($transform['h']) ? $transform['h'] : null; 325 | 326 | // If both sizes and ratio is specified, let ratio take control based on width 327 | if ($w and $h) { 328 | $transform['h'] = round($w / $ratio); 329 | } else { 330 | if ($w) { 331 | $transform['h'] = round($w / $ratio); 332 | } elseif ($h) { 333 | $transform['w'] = round($h * $ratio); 334 | } else { 335 | // TODO: log that neither w nor h is specified with ratio 336 | // no idea what to do, return 337 | return $transform; 338 | } 339 | } 340 | unset($transform['ratio']); // remove the ratio setting so that it doesn't gets processed in the URL 341 | 342 | return $transform; 343 | } 344 | } -------------------------------------------------------------------------------- /vendor/composer/ClassLoader.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer\Autoload; 14 | 15 | /** 16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. 17 | * 18 | * $loader = new \Composer\Autoload\ClassLoader(); 19 | * 20 | * // register classes with namespaces 21 | * $loader->add('Symfony\Component', __DIR__.'/component'); 22 | * $loader->add('Symfony', __DIR__.'/framework'); 23 | * 24 | * // activate the autoloader 25 | * $loader->register(); 26 | * 27 | * // to enable searching the include path (eg. for PEAR packages) 28 | * $loader->setUseIncludePath(true); 29 | * 30 | * In this example, if you try to use a class in the Symfony\Component 31 | * namespace or one of its children (Symfony\Component\Console for instance), 32 | * the autoloader will first look for the class under the component/ 33 | * directory, and it will then fallback to the framework/ directory if not 34 | * found before giving up. 35 | * 36 | * This class is loosely based on the Symfony UniversalClassLoader. 37 | * 38 | * @author Fabien Potencier 39 | * @author Jordi Boggiano 40 | * @see http://www.php-fig.org/psr/psr-0/ 41 | * @see http://www.php-fig.org/psr/psr-4/ 42 | */ 43 | class ClassLoader 44 | { 45 | // PSR-4 46 | private $prefixLengthsPsr4 = array(); 47 | private $prefixDirsPsr4 = array(); 48 | private $fallbackDirsPsr4 = array(); 49 | 50 | // PSR-0 51 | private $prefixesPsr0 = array(); 52 | private $fallbackDirsPsr0 = array(); 53 | 54 | private $useIncludePath = false; 55 | private $classMap = array(); 56 | private $classMapAuthoritative = false; 57 | private $missingClasses = array(); 58 | 59 | public function getPrefixes() 60 | { 61 | if (!empty($this->prefixesPsr0)) { 62 | return call_user_func_array('array_merge', $this->prefixesPsr0); 63 | } 64 | 65 | return array(); 66 | } 67 | 68 | public function getPrefixesPsr4() 69 | { 70 | return $this->prefixDirsPsr4; 71 | } 72 | 73 | public function getFallbackDirs() 74 | { 75 | return $this->fallbackDirsPsr0; 76 | } 77 | 78 | public function getFallbackDirsPsr4() 79 | { 80 | return $this->fallbackDirsPsr4; 81 | } 82 | 83 | public function getClassMap() 84 | { 85 | return $this->classMap; 86 | } 87 | 88 | /** 89 | * @param array $classMap Class to filename map 90 | */ 91 | public function addClassMap(array $classMap) 92 | { 93 | if ($this->classMap) { 94 | $this->classMap = array_merge($this->classMap, $classMap); 95 | } else { 96 | $this->classMap = $classMap; 97 | } 98 | } 99 | 100 | /** 101 | * Registers a set of PSR-0 directories for a given prefix, either 102 | * appending or prepending to the ones previously set for this prefix. 103 | * 104 | * @param string $prefix The prefix 105 | * @param array|string $paths The PSR-0 root directories 106 | * @param bool $prepend Whether to prepend the directories 107 | */ 108 | public function add($prefix, $paths, $prepend = false) 109 | { 110 | if (!$prefix) { 111 | if ($prepend) { 112 | $this->fallbackDirsPsr0 = array_merge( 113 | (array) $paths, 114 | $this->fallbackDirsPsr0 115 | ); 116 | } else { 117 | $this->fallbackDirsPsr0 = array_merge( 118 | $this->fallbackDirsPsr0, 119 | (array) $paths 120 | ); 121 | } 122 | 123 | return; 124 | } 125 | 126 | $first = $prefix[0]; 127 | if (!isset($this->prefixesPsr0[$first][$prefix])) { 128 | $this->prefixesPsr0[$first][$prefix] = (array) $paths; 129 | 130 | return; 131 | } 132 | if ($prepend) { 133 | $this->prefixesPsr0[$first][$prefix] = array_merge( 134 | (array) $paths, 135 | $this->prefixesPsr0[$first][$prefix] 136 | ); 137 | } else { 138 | $this->prefixesPsr0[$first][$prefix] = array_merge( 139 | $this->prefixesPsr0[$first][$prefix], 140 | (array) $paths 141 | ); 142 | } 143 | } 144 | 145 | /** 146 | * Registers a set of PSR-4 directories for a given namespace, either 147 | * appending or prepending to the ones previously set for this namespace. 148 | * 149 | * @param string $prefix The prefix/namespace, with trailing '\\' 150 | * @param array|string $paths The PSR-4 base directories 151 | * @param bool $prepend Whether to prepend the directories 152 | * 153 | * @throws \InvalidArgumentException 154 | */ 155 | public function addPsr4($prefix, $paths, $prepend = false) 156 | { 157 | if (!$prefix) { 158 | // Register directories for the root namespace. 159 | if ($prepend) { 160 | $this->fallbackDirsPsr4 = array_merge( 161 | (array) $paths, 162 | $this->fallbackDirsPsr4 163 | ); 164 | } else { 165 | $this->fallbackDirsPsr4 = array_merge( 166 | $this->fallbackDirsPsr4, 167 | (array) $paths 168 | ); 169 | } 170 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) { 171 | // Register directories for a new namespace. 172 | $length = strlen($prefix); 173 | if ('\\' !== $prefix[$length - 1]) { 174 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 175 | } 176 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 177 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 178 | } elseif ($prepend) { 179 | // Prepend directories for an already registered namespace. 180 | $this->prefixDirsPsr4[$prefix] = array_merge( 181 | (array) $paths, 182 | $this->prefixDirsPsr4[$prefix] 183 | ); 184 | } else { 185 | // Append directories for an already registered namespace. 186 | $this->prefixDirsPsr4[$prefix] = array_merge( 187 | $this->prefixDirsPsr4[$prefix], 188 | (array) $paths 189 | ); 190 | } 191 | } 192 | 193 | /** 194 | * Registers a set of PSR-0 directories for a given prefix, 195 | * replacing any others previously set for this prefix. 196 | * 197 | * @param string $prefix The prefix 198 | * @param array|string $paths The PSR-0 base directories 199 | */ 200 | public function set($prefix, $paths) 201 | { 202 | if (!$prefix) { 203 | $this->fallbackDirsPsr0 = (array) $paths; 204 | } else { 205 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; 206 | } 207 | } 208 | 209 | /** 210 | * Registers a set of PSR-4 directories for a given namespace, 211 | * replacing any others previously set for this namespace. 212 | * 213 | * @param string $prefix The prefix/namespace, with trailing '\\' 214 | * @param array|string $paths The PSR-4 base directories 215 | * 216 | * @throws \InvalidArgumentException 217 | */ 218 | public function setPsr4($prefix, $paths) 219 | { 220 | if (!$prefix) { 221 | $this->fallbackDirsPsr4 = (array) $paths; 222 | } else { 223 | $length = strlen($prefix); 224 | if ('\\' !== $prefix[$length - 1]) { 225 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 226 | } 227 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 228 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 229 | } 230 | } 231 | 232 | /** 233 | * Turns on searching the include path for class files. 234 | * 235 | * @param bool $useIncludePath 236 | */ 237 | public function setUseIncludePath($useIncludePath) 238 | { 239 | $this->useIncludePath = $useIncludePath; 240 | } 241 | 242 | /** 243 | * Can be used to check if the autoloader uses the include path to check 244 | * for classes. 245 | * 246 | * @return bool 247 | */ 248 | public function getUseIncludePath() 249 | { 250 | return $this->useIncludePath; 251 | } 252 | 253 | /** 254 | * Turns off searching the prefix and fallback directories for classes 255 | * that have not been registered with the class map. 256 | * 257 | * @param bool $classMapAuthoritative 258 | */ 259 | public function setClassMapAuthoritative($classMapAuthoritative) 260 | { 261 | $this->classMapAuthoritative = $classMapAuthoritative; 262 | } 263 | 264 | /** 265 | * Should class lookup fail if not found in the current class map? 266 | * 267 | * @return bool 268 | */ 269 | public function isClassMapAuthoritative() 270 | { 271 | return $this->classMapAuthoritative; 272 | } 273 | 274 | /** 275 | * Registers this instance as an autoloader. 276 | * 277 | * @param bool $prepend Whether to prepend the autoloader or not 278 | */ 279 | public function register($prepend = false) 280 | { 281 | spl_autoload_register(array($this, 'loadClass'), true, $prepend); 282 | } 283 | 284 | /** 285 | * Unregisters this instance as an autoloader. 286 | */ 287 | public function unregister() 288 | { 289 | spl_autoload_unregister(array($this, 'loadClass')); 290 | } 291 | 292 | /** 293 | * Loads the given class or interface. 294 | * 295 | * @param string $class The name of the class 296 | * @return bool|null True if loaded, null otherwise 297 | */ 298 | public function loadClass($class) 299 | { 300 | if ($file = $this->findFile($class)) { 301 | includeFile($file); 302 | 303 | return true; 304 | } 305 | } 306 | 307 | /** 308 | * Finds the path to the file where the class is defined. 309 | * 310 | * @param string $class The name of the class 311 | * 312 | * @return string|false The path if found, false otherwise 313 | */ 314 | public function findFile($class) 315 | { 316 | // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 317 | if ('\\' == $class[0]) { 318 | $class = substr($class, 1); 319 | } 320 | 321 | // class map lookup 322 | if (isset($this->classMap[$class])) { 323 | return $this->classMap[$class]; 324 | } 325 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { 326 | return false; 327 | } 328 | 329 | $file = $this->findFileWithExtension($class, '.php'); 330 | 331 | // Search for Hack files if we are running on HHVM 332 | if (false === $file && defined('HHVM_VERSION')) { 333 | $file = $this->findFileWithExtension($class, '.hh'); 334 | } 335 | 336 | if (false === $file) { 337 | // Remember that this class does not exist. 338 | $this->missingClasses[$class] = true; 339 | } 340 | 341 | return $file; 342 | } 343 | 344 | private function findFileWithExtension($class, $ext) 345 | { 346 | // PSR-4 lookup 347 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; 348 | 349 | $first = $class[0]; 350 | if (isset($this->prefixLengthsPsr4[$first])) { 351 | foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { 352 | if (0 === strpos($class, $prefix)) { 353 | foreach ($this->prefixDirsPsr4[$prefix] as $dir) { 354 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { 355 | return $file; 356 | } 357 | } 358 | } 359 | } 360 | } 361 | 362 | // PSR-4 fallback dirs 363 | foreach ($this->fallbackDirsPsr4 as $dir) { 364 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { 365 | return $file; 366 | } 367 | } 368 | 369 | // PSR-0 lookup 370 | if (false !== $pos = strrpos($class, '\\')) { 371 | // namespaced class name 372 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) 373 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); 374 | } else { 375 | // PEAR-like class name 376 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; 377 | } 378 | 379 | if (isset($this->prefixesPsr0[$first])) { 380 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { 381 | if (0 === strpos($class, $prefix)) { 382 | foreach ($dirs as $dir) { 383 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 384 | return $file; 385 | } 386 | } 387 | } 388 | } 389 | } 390 | 391 | // PSR-0 fallback dirs 392 | foreach ($this->fallbackDirsPsr0 as $dir) { 393 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 394 | return $file; 395 | } 396 | } 397 | 398 | // PSR-0 include paths. 399 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { 400 | return $file; 401 | } 402 | 403 | return false; 404 | } 405 | } 406 | 407 | /** 408 | * Scope isolated include. 409 | * 410 | * Prevents access to $this/self from included files. 411 | */ 412 | function includeFile($file) 413 | { 414 | include $file; 415 | } 416 | -------------------------------------------------------------------------------- /vendor/imgix/imgix-php/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "2db3e45a890c8427470b50f276ff8c5e", 8 | "content-hash": "25e5315d6dc6d453c165ccc5d1f6e82f", 9 | "packages": [], 10 | "packages-dev": [ 11 | { 12 | "name": "doctrine/instantiator", 13 | "version": "1.0.5", 14 | "source": { 15 | "type": "git", 16 | "url": "https://github.com/doctrine/instantiator.git", 17 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 18 | }, 19 | "dist": { 20 | "type": "zip", 21 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 22 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 23 | "shasum": "" 24 | }, 25 | "require": { 26 | "php": ">=5.3,<8.0-DEV" 27 | }, 28 | "require-dev": { 29 | "athletic/athletic": "~0.1.8", 30 | "ext-pdo": "*", 31 | "ext-phar": "*", 32 | "phpunit/phpunit": "~4.0", 33 | "squizlabs/php_codesniffer": "~2.0" 34 | }, 35 | "type": "library", 36 | "extra": { 37 | "branch-alias": { 38 | "dev-master": "1.0.x-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Marco Pivetta", 53 | "email": "ocramius@gmail.com", 54 | "homepage": "http://ocramius.github.com/" 55 | } 56 | ], 57 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 58 | "homepage": "https://github.com/doctrine/instantiator", 59 | "keywords": [ 60 | "constructor", 61 | "instantiate" 62 | ], 63 | "time": "2015-06-14 21:17:01" 64 | }, 65 | { 66 | "name": "myclabs/deep-copy", 67 | "version": "1.5.0", 68 | "source": { 69 | "type": "git", 70 | "url": "https://github.com/myclabs/DeepCopy.git", 71 | "reference": "e3abefcd7f106677fd352cd7c187d6c969aa9ddc" 72 | }, 73 | "dist": { 74 | "type": "zip", 75 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e3abefcd7f106677fd352cd7c187d6c969aa9ddc", 76 | "reference": "e3abefcd7f106677fd352cd7c187d6c969aa9ddc", 77 | "shasum": "" 78 | }, 79 | "require": { 80 | "php": ">=5.4.0" 81 | }, 82 | "require-dev": { 83 | "doctrine/collections": "1.*", 84 | "phpunit/phpunit": "~4.1" 85 | }, 86 | "type": "library", 87 | "autoload": { 88 | "psr-4": { 89 | "DeepCopy\\": "src/DeepCopy/" 90 | } 91 | }, 92 | "notification-url": "https://packagist.org/downloads/", 93 | "license": [ 94 | "MIT" 95 | ], 96 | "description": "Create deep copies (clones) of your objects", 97 | "homepage": "https://github.com/myclabs/DeepCopy", 98 | "keywords": [ 99 | "clone", 100 | "copy", 101 | "duplicate", 102 | "object", 103 | "object graph" 104 | ], 105 | "time": "2015-11-07 22:20:37" 106 | }, 107 | { 108 | "name": "phpdocumentor/reflection-docblock", 109 | "version": "2.0.4", 110 | "source": { 111 | "type": "git", 112 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 113 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" 114 | }, 115 | "dist": { 116 | "type": "zip", 117 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", 118 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", 119 | "shasum": "" 120 | }, 121 | "require": { 122 | "php": ">=5.3.3" 123 | }, 124 | "require-dev": { 125 | "phpunit/phpunit": "~4.0" 126 | }, 127 | "suggest": { 128 | "dflydev/markdown": "~1.0", 129 | "erusev/parsedown": "~1.0" 130 | }, 131 | "type": "library", 132 | "extra": { 133 | "branch-alias": { 134 | "dev-master": "2.0.x-dev" 135 | } 136 | }, 137 | "autoload": { 138 | "psr-0": { 139 | "phpDocumentor": [ 140 | "src/" 141 | ] 142 | } 143 | }, 144 | "notification-url": "https://packagist.org/downloads/", 145 | "license": [ 146 | "MIT" 147 | ], 148 | "authors": [ 149 | { 150 | "name": "Mike van Riel", 151 | "email": "mike.vanriel@naenius.com" 152 | } 153 | ], 154 | "time": "2015-02-03 12:10:50" 155 | }, 156 | { 157 | "name": "phpspec/prophecy", 158 | "version": "v1.6.0", 159 | "source": { 160 | "type": "git", 161 | "url": "https://github.com/phpspec/prophecy.git", 162 | "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" 163 | }, 164 | "dist": { 165 | "type": "zip", 166 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", 167 | "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", 168 | "shasum": "" 169 | }, 170 | "require": { 171 | "doctrine/instantiator": "^1.0.2", 172 | "php": "^5.3|^7.0", 173 | "phpdocumentor/reflection-docblock": "~2.0", 174 | "sebastian/comparator": "~1.1", 175 | "sebastian/recursion-context": "~1.0" 176 | }, 177 | "require-dev": { 178 | "phpspec/phpspec": "~2.0" 179 | }, 180 | "type": "library", 181 | "extra": { 182 | "branch-alias": { 183 | "dev-master": "1.5.x-dev" 184 | } 185 | }, 186 | "autoload": { 187 | "psr-0": { 188 | "Prophecy\\": "src/" 189 | } 190 | }, 191 | "notification-url": "https://packagist.org/downloads/", 192 | "license": [ 193 | "MIT" 194 | ], 195 | "authors": [ 196 | { 197 | "name": "Konstantin Kudryashov", 198 | "email": "ever.zet@gmail.com", 199 | "homepage": "http://everzet.com" 200 | }, 201 | { 202 | "name": "Marcello Duarte", 203 | "email": "marcello.duarte@gmail.com" 204 | } 205 | ], 206 | "description": "Highly opinionated mocking framework for PHP 5.3+", 207 | "homepage": "https://github.com/phpspec/prophecy", 208 | "keywords": [ 209 | "Double", 210 | "Dummy", 211 | "fake", 212 | "mock", 213 | "spy", 214 | "stub" 215 | ], 216 | "time": "2016-02-15 07:46:21" 217 | }, 218 | { 219 | "name": "phpunit/php-code-coverage", 220 | "version": "3.2.1", 221 | "source": { 222 | "type": "git", 223 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 224 | "reference": "a58f95ae76fe201b571fad3e8370a50c4368678c" 225 | }, 226 | "dist": { 227 | "type": "zip", 228 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a58f95ae76fe201b571fad3e8370a50c4368678c", 229 | "reference": "a58f95ae76fe201b571fad3e8370a50c4368678c", 230 | "shasum": "" 231 | }, 232 | "require": { 233 | "php": "^5.6 || ^7.0", 234 | "phpunit/php-file-iterator": "~1.3", 235 | "phpunit/php-text-template": "~1.2", 236 | "phpunit/php-token-stream": "^1.4.2", 237 | "sebastian/code-unit-reverse-lookup": "~1.0", 238 | "sebastian/environment": "^1.3.2", 239 | "sebastian/version": "~1.0|~2.0" 240 | }, 241 | "require-dev": { 242 | "ext-xdebug": ">=2.1.4", 243 | "phpunit/phpunit": "~5" 244 | }, 245 | "suggest": { 246 | "ext-dom": "*", 247 | "ext-xdebug": ">=2.2.1", 248 | "ext-xmlwriter": "*" 249 | }, 250 | "type": "library", 251 | "extra": { 252 | "branch-alias": { 253 | "dev-master": "3.2.x-dev" 254 | } 255 | }, 256 | "autoload": { 257 | "classmap": [ 258 | "src/" 259 | ] 260 | }, 261 | "notification-url": "https://packagist.org/downloads/", 262 | "license": [ 263 | "BSD-3-Clause" 264 | ], 265 | "authors": [ 266 | { 267 | "name": "Sebastian Bergmann", 268 | "email": "sb@sebastian-bergmann.de", 269 | "role": "lead" 270 | } 271 | ], 272 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 273 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 274 | "keywords": [ 275 | "coverage", 276 | "testing", 277 | "xunit" 278 | ], 279 | "time": "2016-02-18 07:31:12" 280 | }, 281 | { 282 | "name": "phpunit/php-file-iterator", 283 | "version": "1.4.1", 284 | "source": { 285 | "type": "git", 286 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 287 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" 288 | }, 289 | "dist": { 290 | "type": "zip", 291 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 292 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 293 | "shasum": "" 294 | }, 295 | "require": { 296 | "php": ">=5.3.3" 297 | }, 298 | "type": "library", 299 | "extra": { 300 | "branch-alias": { 301 | "dev-master": "1.4.x-dev" 302 | } 303 | }, 304 | "autoload": { 305 | "classmap": [ 306 | "src/" 307 | ] 308 | }, 309 | "notification-url": "https://packagist.org/downloads/", 310 | "license": [ 311 | "BSD-3-Clause" 312 | ], 313 | "authors": [ 314 | { 315 | "name": "Sebastian Bergmann", 316 | "email": "sb@sebastian-bergmann.de", 317 | "role": "lead" 318 | } 319 | ], 320 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 321 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 322 | "keywords": [ 323 | "filesystem", 324 | "iterator" 325 | ], 326 | "time": "2015-06-21 13:08:43" 327 | }, 328 | { 329 | "name": "phpunit/php-text-template", 330 | "version": "1.2.1", 331 | "source": { 332 | "type": "git", 333 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 334 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 335 | }, 336 | "dist": { 337 | "type": "zip", 338 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 339 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 340 | "shasum": "" 341 | }, 342 | "require": { 343 | "php": ">=5.3.3" 344 | }, 345 | "type": "library", 346 | "autoload": { 347 | "classmap": [ 348 | "src/" 349 | ] 350 | }, 351 | "notification-url": "https://packagist.org/downloads/", 352 | "license": [ 353 | "BSD-3-Clause" 354 | ], 355 | "authors": [ 356 | { 357 | "name": "Sebastian Bergmann", 358 | "email": "sebastian@phpunit.de", 359 | "role": "lead" 360 | } 361 | ], 362 | "description": "Simple template engine.", 363 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 364 | "keywords": [ 365 | "template" 366 | ], 367 | "time": "2015-06-21 13:50:34" 368 | }, 369 | { 370 | "name": "phpunit/php-timer", 371 | "version": "1.0.7", 372 | "source": { 373 | "type": "git", 374 | "url": "https://github.com/sebastianbergmann/php-timer.git", 375 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" 376 | }, 377 | "dist": { 378 | "type": "zip", 379 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 380 | "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", 381 | "shasum": "" 382 | }, 383 | "require": { 384 | "php": ">=5.3.3" 385 | }, 386 | "type": "library", 387 | "autoload": { 388 | "classmap": [ 389 | "src/" 390 | ] 391 | }, 392 | "notification-url": "https://packagist.org/downloads/", 393 | "license": [ 394 | "BSD-3-Clause" 395 | ], 396 | "authors": [ 397 | { 398 | "name": "Sebastian Bergmann", 399 | "email": "sb@sebastian-bergmann.de", 400 | "role": "lead" 401 | } 402 | ], 403 | "description": "Utility class for timing", 404 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 405 | "keywords": [ 406 | "timer" 407 | ], 408 | "time": "2015-06-21 08:01:12" 409 | }, 410 | { 411 | "name": "phpunit/php-token-stream", 412 | "version": "1.4.8", 413 | "source": { 414 | "type": "git", 415 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 416 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" 417 | }, 418 | "dist": { 419 | "type": "zip", 420 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 421 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 422 | "shasum": "" 423 | }, 424 | "require": { 425 | "ext-tokenizer": "*", 426 | "php": ">=5.3.3" 427 | }, 428 | "require-dev": { 429 | "phpunit/phpunit": "~4.2" 430 | }, 431 | "type": "library", 432 | "extra": { 433 | "branch-alias": { 434 | "dev-master": "1.4-dev" 435 | } 436 | }, 437 | "autoload": { 438 | "classmap": [ 439 | "src/" 440 | ] 441 | }, 442 | "notification-url": "https://packagist.org/downloads/", 443 | "license": [ 444 | "BSD-3-Clause" 445 | ], 446 | "authors": [ 447 | { 448 | "name": "Sebastian Bergmann", 449 | "email": "sebastian@phpunit.de" 450 | } 451 | ], 452 | "description": "Wrapper around PHP's tokenizer extension.", 453 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 454 | "keywords": [ 455 | "tokenizer" 456 | ], 457 | "time": "2015-09-15 10:49:45" 458 | }, 459 | { 460 | "name": "phpunit/phpunit", 461 | "version": "5.2.9", 462 | "source": { 463 | "type": "git", 464 | "url": "https://github.com/sebastianbergmann/phpunit.git", 465 | "reference": "b12b9c37e382c096b93c3f26e7395775f59a5eea" 466 | }, 467 | "dist": { 468 | "type": "zip", 469 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b12b9c37e382c096b93c3f26e7395775f59a5eea", 470 | "reference": "b12b9c37e382c096b93c3f26e7395775f59a5eea", 471 | "shasum": "" 472 | }, 473 | "require": { 474 | "ext-dom": "*", 475 | "ext-json": "*", 476 | "ext-pcre": "*", 477 | "ext-reflection": "*", 478 | "ext-spl": "*", 479 | "myclabs/deep-copy": "~1.3", 480 | "php": "^5.6 || ^7.0", 481 | "phpspec/prophecy": "^1.3.1", 482 | "phpunit/php-code-coverage": "^3.2.1", 483 | "phpunit/php-file-iterator": "~1.4", 484 | "phpunit/php-text-template": "~1.2", 485 | "phpunit/php-timer": ">=1.0.6", 486 | "phpunit/phpunit-mock-objects": ">=3.0.5", 487 | "sebastian/comparator": "~1.1", 488 | "sebastian/diff": "~1.2", 489 | "sebastian/environment": "~1.3", 490 | "sebastian/exporter": "~1.2", 491 | "sebastian/global-state": "~1.0", 492 | "sebastian/resource-operations": "~1.0", 493 | "sebastian/version": "~1.0|~2.0", 494 | "symfony/yaml": "~2.1|~3.0" 495 | }, 496 | "suggest": { 497 | "phpunit/php-invoker": "~1.1" 498 | }, 499 | "bin": [ 500 | "phpunit" 501 | ], 502 | "type": "library", 503 | "extra": { 504 | "branch-alias": { 505 | "dev-master": "5.2.x-dev" 506 | } 507 | }, 508 | "autoload": { 509 | "classmap": [ 510 | "src/" 511 | ] 512 | }, 513 | "notification-url": "https://packagist.org/downloads/", 514 | "license": [ 515 | "BSD-3-Clause" 516 | ], 517 | "authors": [ 518 | { 519 | "name": "Sebastian Bergmann", 520 | "email": "sebastian@phpunit.de", 521 | "role": "lead" 522 | } 523 | ], 524 | "description": "The PHP Unit Testing framework.", 525 | "homepage": "https://phpunit.de/", 526 | "keywords": [ 527 | "phpunit", 528 | "testing", 529 | "xunit" 530 | ], 531 | "time": "2016-02-19 11:43:07" 532 | }, 533 | { 534 | "name": "phpunit/phpunit-mock-objects", 535 | "version": "3.0.6", 536 | "source": { 537 | "type": "git", 538 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 539 | "reference": "49bc700750196c04dd6bc2c4c99cb632b893836b" 540 | }, 541 | "dist": { 542 | "type": "zip", 543 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/49bc700750196c04dd6bc2c4c99cb632b893836b", 544 | "reference": "49bc700750196c04dd6bc2c4c99cb632b893836b", 545 | "shasum": "" 546 | }, 547 | "require": { 548 | "doctrine/instantiator": "^1.0.2", 549 | "php": ">=5.6", 550 | "phpunit/php-text-template": "~1.2", 551 | "sebastian/exporter": "~1.2" 552 | }, 553 | "require-dev": { 554 | "phpunit/phpunit": "~5" 555 | }, 556 | "suggest": { 557 | "ext-soap": "*" 558 | }, 559 | "type": "library", 560 | "extra": { 561 | "branch-alias": { 562 | "dev-master": "3.0.x-dev" 563 | } 564 | }, 565 | "autoload": { 566 | "classmap": [ 567 | "src/" 568 | ] 569 | }, 570 | "notification-url": "https://packagist.org/downloads/", 571 | "license": [ 572 | "BSD-3-Clause" 573 | ], 574 | "authors": [ 575 | { 576 | "name": "Sebastian Bergmann", 577 | "email": "sb@sebastian-bergmann.de", 578 | "role": "lead" 579 | } 580 | ], 581 | "description": "Mock Object library for PHPUnit", 582 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 583 | "keywords": [ 584 | "mock", 585 | "xunit" 586 | ], 587 | "time": "2015-12-08 08:47:06" 588 | }, 589 | { 590 | "name": "sebastian/code-unit-reverse-lookup", 591 | "version": "1.0.0", 592 | "source": { 593 | "type": "git", 594 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 595 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" 596 | }, 597 | "dist": { 598 | "type": "zip", 599 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 600 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 601 | "shasum": "" 602 | }, 603 | "require": { 604 | "php": ">=5.6" 605 | }, 606 | "require-dev": { 607 | "phpunit/phpunit": "~5" 608 | }, 609 | "type": "library", 610 | "extra": { 611 | "branch-alias": { 612 | "dev-master": "1.0.x-dev" 613 | } 614 | }, 615 | "autoload": { 616 | "classmap": [ 617 | "src/" 618 | ] 619 | }, 620 | "notification-url": "https://packagist.org/downloads/", 621 | "license": [ 622 | "BSD-3-Clause" 623 | ], 624 | "authors": [ 625 | { 626 | "name": "Sebastian Bergmann", 627 | "email": "sebastian@phpunit.de" 628 | } 629 | ], 630 | "description": "Looks up which function or method a line of code belongs to", 631 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 632 | "time": "2016-02-13 06:45:14" 633 | }, 634 | { 635 | "name": "sebastian/comparator", 636 | "version": "1.2.0", 637 | "source": { 638 | "type": "git", 639 | "url": "https://github.com/sebastianbergmann/comparator.git", 640 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" 641 | }, 642 | "dist": { 643 | "type": "zip", 644 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", 645 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", 646 | "shasum": "" 647 | }, 648 | "require": { 649 | "php": ">=5.3.3", 650 | "sebastian/diff": "~1.2", 651 | "sebastian/exporter": "~1.2" 652 | }, 653 | "require-dev": { 654 | "phpunit/phpunit": "~4.4" 655 | }, 656 | "type": "library", 657 | "extra": { 658 | "branch-alias": { 659 | "dev-master": "1.2.x-dev" 660 | } 661 | }, 662 | "autoload": { 663 | "classmap": [ 664 | "src/" 665 | ] 666 | }, 667 | "notification-url": "https://packagist.org/downloads/", 668 | "license": [ 669 | "BSD-3-Clause" 670 | ], 671 | "authors": [ 672 | { 673 | "name": "Jeff Welch", 674 | "email": "whatthejeff@gmail.com" 675 | }, 676 | { 677 | "name": "Volker Dusch", 678 | "email": "github@wallbash.com" 679 | }, 680 | { 681 | "name": "Bernhard Schussek", 682 | "email": "bschussek@2bepublished.at" 683 | }, 684 | { 685 | "name": "Sebastian Bergmann", 686 | "email": "sebastian@phpunit.de" 687 | } 688 | ], 689 | "description": "Provides the functionality to compare PHP values for equality", 690 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 691 | "keywords": [ 692 | "comparator", 693 | "compare", 694 | "equality" 695 | ], 696 | "time": "2015-07-26 15:48:44" 697 | }, 698 | { 699 | "name": "sebastian/diff", 700 | "version": "1.4.1", 701 | "source": { 702 | "type": "git", 703 | "url": "https://github.com/sebastianbergmann/diff.git", 704 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 705 | }, 706 | "dist": { 707 | "type": "zip", 708 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 709 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 710 | "shasum": "" 711 | }, 712 | "require": { 713 | "php": ">=5.3.3" 714 | }, 715 | "require-dev": { 716 | "phpunit/phpunit": "~4.8" 717 | }, 718 | "type": "library", 719 | "extra": { 720 | "branch-alias": { 721 | "dev-master": "1.4-dev" 722 | } 723 | }, 724 | "autoload": { 725 | "classmap": [ 726 | "src/" 727 | ] 728 | }, 729 | "notification-url": "https://packagist.org/downloads/", 730 | "license": [ 731 | "BSD-3-Clause" 732 | ], 733 | "authors": [ 734 | { 735 | "name": "Kore Nordmann", 736 | "email": "mail@kore-nordmann.de" 737 | }, 738 | { 739 | "name": "Sebastian Bergmann", 740 | "email": "sebastian@phpunit.de" 741 | } 742 | ], 743 | "description": "Diff implementation", 744 | "homepage": "https://github.com/sebastianbergmann/diff", 745 | "keywords": [ 746 | "diff" 747 | ], 748 | "time": "2015-12-08 07:14:41" 749 | }, 750 | { 751 | "name": "sebastian/environment", 752 | "version": "1.3.3", 753 | "source": { 754 | "type": "git", 755 | "url": "https://github.com/sebastianbergmann/environment.git", 756 | "reference": "6e7133793a8e5a5714a551a8324337374be209df" 757 | }, 758 | "dist": { 759 | "type": "zip", 760 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df", 761 | "reference": "6e7133793a8e5a5714a551a8324337374be209df", 762 | "shasum": "" 763 | }, 764 | "require": { 765 | "php": ">=5.3.3" 766 | }, 767 | "require-dev": { 768 | "phpunit/phpunit": "~4.4" 769 | }, 770 | "type": "library", 771 | "extra": { 772 | "branch-alias": { 773 | "dev-master": "1.3.x-dev" 774 | } 775 | }, 776 | "autoload": { 777 | "classmap": [ 778 | "src/" 779 | ] 780 | }, 781 | "notification-url": "https://packagist.org/downloads/", 782 | "license": [ 783 | "BSD-3-Clause" 784 | ], 785 | "authors": [ 786 | { 787 | "name": "Sebastian Bergmann", 788 | "email": "sebastian@phpunit.de" 789 | } 790 | ], 791 | "description": "Provides functionality to handle HHVM/PHP environments", 792 | "homepage": "http://www.github.com/sebastianbergmann/environment", 793 | "keywords": [ 794 | "Xdebug", 795 | "environment", 796 | "hhvm" 797 | ], 798 | "time": "2015-12-02 08:37:27" 799 | }, 800 | { 801 | "name": "sebastian/exporter", 802 | "version": "1.2.1", 803 | "source": { 804 | "type": "git", 805 | "url": "https://github.com/sebastianbergmann/exporter.git", 806 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e" 807 | }, 808 | "dist": { 809 | "type": "zip", 810 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", 811 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e", 812 | "shasum": "" 813 | }, 814 | "require": { 815 | "php": ">=5.3.3", 816 | "sebastian/recursion-context": "~1.0" 817 | }, 818 | "require-dev": { 819 | "phpunit/phpunit": "~4.4" 820 | }, 821 | "type": "library", 822 | "extra": { 823 | "branch-alias": { 824 | "dev-master": "1.2.x-dev" 825 | } 826 | }, 827 | "autoload": { 828 | "classmap": [ 829 | "src/" 830 | ] 831 | }, 832 | "notification-url": "https://packagist.org/downloads/", 833 | "license": [ 834 | "BSD-3-Clause" 835 | ], 836 | "authors": [ 837 | { 838 | "name": "Jeff Welch", 839 | "email": "whatthejeff@gmail.com" 840 | }, 841 | { 842 | "name": "Volker Dusch", 843 | "email": "github@wallbash.com" 844 | }, 845 | { 846 | "name": "Bernhard Schussek", 847 | "email": "bschussek@2bepublished.at" 848 | }, 849 | { 850 | "name": "Sebastian Bergmann", 851 | "email": "sebastian@phpunit.de" 852 | }, 853 | { 854 | "name": "Adam Harvey", 855 | "email": "aharvey@php.net" 856 | } 857 | ], 858 | "description": "Provides the functionality to export PHP variables for visualization", 859 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 860 | "keywords": [ 861 | "export", 862 | "exporter" 863 | ], 864 | "time": "2015-06-21 07:55:53" 865 | }, 866 | { 867 | "name": "sebastian/global-state", 868 | "version": "1.1.1", 869 | "source": { 870 | "type": "git", 871 | "url": "https://github.com/sebastianbergmann/global-state.git", 872 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 873 | }, 874 | "dist": { 875 | "type": "zip", 876 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 877 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 878 | "shasum": "" 879 | }, 880 | "require": { 881 | "php": ">=5.3.3" 882 | }, 883 | "require-dev": { 884 | "phpunit/phpunit": "~4.2" 885 | }, 886 | "suggest": { 887 | "ext-uopz": "*" 888 | }, 889 | "type": "library", 890 | "extra": { 891 | "branch-alias": { 892 | "dev-master": "1.0-dev" 893 | } 894 | }, 895 | "autoload": { 896 | "classmap": [ 897 | "src/" 898 | ] 899 | }, 900 | "notification-url": "https://packagist.org/downloads/", 901 | "license": [ 902 | "BSD-3-Clause" 903 | ], 904 | "authors": [ 905 | { 906 | "name": "Sebastian Bergmann", 907 | "email": "sebastian@phpunit.de" 908 | } 909 | ], 910 | "description": "Snapshotting of global state", 911 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 912 | "keywords": [ 913 | "global state" 914 | ], 915 | "time": "2015-10-12 03:26:01" 916 | }, 917 | { 918 | "name": "sebastian/recursion-context", 919 | "version": "1.0.2", 920 | "source": { 921 | "type": "git", 922 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 923 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791" 924 | }, 925 | "dist": { 926 | "type": "zip", 927 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", 928 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791", 929 | "shasum": "" 930 | }, 931 | "require": { 932 | "php": ">=5.3.3" 933 | }, 934 | "require-dev": { 935 | "phpunit/phpunit": "~4.4" 936 | }, 937 | "type": "library", 938 | "extra": { 939 | "branch-alias": { 940 | "dev-master": "1.0.x-dev" 941 | } 942 | }, 943 | "autoload": { 944 | "classmap": [ 945 | "src/" 946 | ] 947 | }, 948 | "notification-url": "https://packagist.org/downloads/", 949 | "license": [ 950 | "BSD-3-Clause" 951 | ], 952 | "authors": [ 953 | { 954 | "name": "Jeff Welch", 955 | "email": "whatthejeff@gmail.com" 956 | }, 957 | { 958 | "name": "Sebastian Bergmann", 959 | "email": "sebastian@phpunit.de" 960 | }, 961 | { 962 | "name": "Adam Harvey", 963 | "email": "aharvey@php.net" 964 | } 965 | ], 966 | "description": "Provides functionality to recursively process PHP variables", 967 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 968 | "time": "2015-11-11 19:50:13" 969 | }, 970 | { 971 | "name": "sebastian/resource-operations", 972 | "version": "1.0.0", 973 | "source": { 974 | "type": "git", 975 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 976 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 977 | }, 978 | "dist": { 979 | "type": "zip", 980 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 981 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 982 | "shasum": "" 983 | }, 984 | "require": { 985 | "php": ">=5.6.0" 986 | }, 987 | "type": "library", 988 | "extra": { 989 | "branch-alias": { 990 | "dev-master": "1.0.x-dev" 991 | } 992 | }, 993 | "autoload": { 994 | "classmap": [ 995 | "src/" 996 | ] 997 | }, 998 | "notification-url": "https://packagist.org/downloads/", 999 | "license": [ 1000 | "BSD-3-Clause" 1001 | ], 1002 | "authors": [ 1003 | { 1004 | "name": "Sebastian Bergmann", 1005 | "email": "sebastian@phpunit.de" 1006 | } 1007 | ], 1008 | "description": "Provides a list of PHP built-in functions that operate on resources", 1009 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1010 | "time": "2015-07-28 20:34:47" 1011 | }, 1012 | { 1013 | "name": "sebastian/version", 1014 | "version": "2.0.0", 1015 | "source": { 1016 | "type": "git", 1017 | "url": "https://github.com/sebastianbergmann/version.git", 1018 | "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5" 1019 | }, 1020 | "dist": { 1021 | "type": "zip", 1022 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", 1023 | "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", 1024 | "shasum": "" 1025 | }, 1026 | "require": { 1027 | "php": ">=5.6" 1028 | }, 1029 | "type": "library", 1030 | "extra": { 1031 | "branch-alias": { 1032 | "dev-master": "2.0.x-dev" 1033 | } 1034 | }, 1035 | "autoload": { 1036 | "classmap": [ 1037 | "src/" 1038 | ] 1039 | }, 1040 | "notification-url": "https://packagist.org/downloads/", 1041 | "license": [ 1042 | "BSD-3-Clause" 1043 | ], 1044 | "authors": [ 1045 | { 1046 | "name": "Sebastian Bergmann", 1047 | "email": "sebastian@phpunit.de", 1048 | "role": "lead" 1049 | } 1050 | ], 1051 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1052 | "homepage": "https://github.com/sebastianbergmann/version", 1053 | "time": "2016-02-04 12:56:52" 1054 | }, 1055 | { 1056 | "name": "symfony/yaml", 1057 | "version": "v3.0.2", 1058 | "source": { 1059 | "type": "git", 1060 | "url": "https://github.com/symfony/yaml.git", 1061 | "reference": "3cf0709d7fe936e97bee9e954382e449003f1d9a" 1062 | }, 1063 | "dist": { 1064 | "type": "zip", 1065 | "url": "https://api.github.com/repos/symfony/yaml/zipball/3cf0709d7fe936e97bee9e954382e449003f1d9a", 1066 | "reference": "3cf0709d7fe936e97bee9e954382e449003f1d9a", 1067 | "shasum": "" 1068 | }, 1069 | "require": { 1070 | "php": ">=5.5.9" 1071 | }, 1072 | "type": "library", 1073 | "extra": { 1074 | "branch-alias": { 1075 | "dev-master": "3.0-dev" 1076 | } 1077 | }, 1078 | "autoload": { 1079 | "psr-4": { 1080 | "Symfony\\Component\\Yaml\\": "" 1081 | }, 1082 | "exclude-from-classmap": [ 1083 | "/Tests/" 1084 | ] 1085 | }, 1086 | "notification-url": "https://packagist.org/downloads/", 1087 | "license": [ 1088 | "MIT" 1089 | ], 1090 | "authors": [ 1091 | { 1092 | "name": "Fabien Potencier", 1093 | "email": "fabien@symfony.com" 1094 | }, 1095 | { 1096 | "name": "Symfony Community", 1097 | "homepage": "https://symfony.com/contributors" 1098 | } 1099 | ], 1100 | "description": "Symfony Yaml Component", 1101 | "homepage": "https://symfony.com", 1102 | "time": "2016-02-02 13:44:19" 1103 | } 1104 | ], 1105 | "aliases": [], 1106 | "minimum-stability": "stable", 1107 | "stability-flags": [], 1108 | "prefer-stable": false, 1109 | "prefer-lowest": false, 1110 | "platform": { 1111 | "php": ">=5.3" 1112 | }, 1113 | "platform-dev": [] 1114 | } 1115 | --------------------------------------------------------------------------------