├── 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 |
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 | 
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 | 
2 |
3 | [](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 wors! 😱');
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 |
--------------------------------------------------------------------------------