├── .scrutinizer.yml ├── composer.json ├── LICENSE.md ├── src ├── Range.php ├── SubnetMask.php ├── Address.php └── Block.php ├── README.md └── composer.lock /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | # .scrutinizer.yml 2 | 3 | checks: 4 | php: 5 | code_rating: true 6 | duplication: true 7 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaaulde/php-ipv4", 3 | "type": "library", 4 | "description": "PHP classes for working with IPV4 addresses and networks.", 5 | "keywords": ["ip", "ipv4", "network", "subnet", "cidr", "range", "blacklist", "whitelist", "ban"], 6 | "homepage": "https://github.com/JAAulde/php-ipv4", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "Jim Auldridge", 11 | "email": "auldridgej@gmail.com", 12 | "homepage": "http://jaaulde.com", 13 | "role": "developer" 14 | } 15 | ], 16 | "support": { 17 | "issues": "https://github.com/JAAulde/php-ipv4/issues", 18 | "source": "https://github.com/JAAulde/php-ipv4" 19 | }, 20 | "require": { 21 | "php": ">=5.3.0" 22 | }, 23 | "require-dev": { 24 | "phpunit/phpunit": "4.6.*", 25 | "satooshi/php-coveralls": "dev-master" 26 | }, 27 | "autoload": { 28 | "psr-4": { 29 | "JAAulde\\IP\\V4\\": "src/" 30 | } 31 | }, 32 | "scripts": { 33 | "test": "phpunit" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jim (JAAulde) Auldridge 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /src/Range.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright 2006-2015 Jim Auldridge 10 | * @license MIT 11 | */ 12 | class Range 13 | { 14 | /** 15 | * @var \JAAulde\IP\V4\Address The first address in the range being represented 16 | */ 17 | protected $firstAddress; 18 | /** 19 | * @var \JAAulde\IP\V4\Address The last address in the range being represented 20 | */ 21 | protected $lastAddress; 22 | 23 | /** 24 | * Constructor 25 | * 26 | * @param \JAAulde\IP\V4\Address $firstAddress The first address of the range being created 27 | * @param \JAAulde\IP\V4\Address $lastAddress The last address of the range being created 28 | * 29 | * @throws Exception 30 | */ 31 | public function __construct(Address $firstAddress, Address $lastAddress) 32 | { 33 | if ($firstAddress->get() > $lastAddress->get()) { 34 | throw new \Exception(__METHOD__.' first param, $firstAddress, cannot be higher address than second param, $lastAddress'); 35 | } 36 | 37 | $this->firstAddress = $firstAddress; 38 | $this->lastAddress = $lastAddress; 39 | } 40 | 41 | /** 42 | * Determine if a given address is contained within the range. 43 | * 44 | * @param \JAAulde\IP\V4\Address $address The address we want to know about 45 | * 46 | * @return bool 47 | */ 48 | public function contains(Address $address) 49 | { 50 | $addressValue = $address->get(); 51 | 52 | return $addressValue >= $this->firstAddress->get() && $addressValue <= $this->lastAddress->get(); 53 | } 54 | 55 | /** 56 | * Retrieve the first address in the range. 57 | * 58 | * @return \JAAulde\IP\V4\Address 59 | */ 60 | public function getFirstAddress() 61 | { 62 | return $this->firstAddress; 63 | } 64 | 65 | /** 66 | * Retrieve the last address in the range. 67 | * 68 | * @return \JAAulde\IP\V4\Address 69 | */ 70 | public function getLastAddress() 71 | { 72 | return $this->lastAddress; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/SubnetMask.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright 2006-2015 Jim Auldridge 10 | * @license MIT 11 | */ 12 | class SubnetMask extends Address 13 | { 14 | /** 15 | * Retrieve the number of host bits denoted by this mask. 16 | * 17 | * @return int 18 | */ 19 | public function getHostBitsCount() 20 | { 21 | return 32 - $this->getNetworkBitsCount(); 22 | } 23 | 24 | /** 25 | * Retrieve the number of network bits denoted by this mask. 26 | * 27 | * @return int 28 | */ 29 | public function getNetworkBitsCount() 30 | { 31 | return (int) (32 - log(($this->get() ^ ip2long('255.255.255.255')) + 1, 2)); 32 | } 33 | 34 | /** 35 | * Alias to \JAAulde\IP\V4\SubnetMask::getNetworkBitsCount. 36 | * 37 | * @uses \JAAulde\IP\V4\SubnetMask::getNetworkBitsCount 38 | * 39 | * @return int 40 | */ 41 | public function getCIDRPrefix() 42 | { 43 | return $this->getNetworkBitsCount(); 44 | } 45 | 46 | /** 47 | * Given two (2) IP (V4) addresses, calculate a CIDR prefix for the network which could contain them both. 48 | * 49 | * @param \JAAulde\IP\V4\Address $address1 50 | * @param \JAAulde\IP\V4\Address $address2 51 | */ 52 | public static function calculateCIDRToFit(Address $address1, Address $address2) 53 | { 54 | return (int) floor(32 - log(($address1->get() ^ $address2->get()) + 1, 2)); 55 | } 56 | 57 | /** 58 | * Factory method for producing a SubnetMask instance from a CIDR (slash notation) prefix size. 59 | * 60 | * @param int $prefixSize Number of network bits to be represented by the subnet mask 61 | * 62 | * @return self 63 | * 64 | * @throws Exception 65 | */ 66 | public static function fromCIDRPrefix($prefixSize) 67 | { 68 | if (!is_int($prefixSize)) { 69 | throw new \Exception(__METHOD__.' requires first param, $prefixSize, to be an integer'); 70 | } 71 | 72 | if ($prefixSize < 1 || $prefixSize > 31) { 73 | throw new \Exception(__METHOD__.' requires first param, $prefixSize, to be CIDR prefix size with value between 1 and 31 (inclusive)'); 74 | } 75 | 76 | return new self(bindec(str_repeat('1', $prefixSize).str_repeat('0', 32 - $prefixSize))); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Address.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright 2006-2015 Jim Auldridge 10 | * @license MIT 11 | */ 12 | class Address 13 | { 14 | /** 15 | * Used to request dot-notated string representation of IP from \JAAulde\IP\V4\Address::get. 16 | * 17 | * @const 18 | * 19 | * @see \JAAulde\IP\V4\Address::get 20 | */ 21 | const FORMAT_DOTTED_NOTATION = 0; 22 | /** 23 | * Used to request integer representation of IP from \JAAulde\IP\V4\Address::get. 24 | * 25 | * @const 26 | * 27 | * @see \JAAulde\IP\V4\Address::get 28 | */ 29 | const FORMAT_LONG_NOTATION = 1; 30 | 31 | /** 32 | * @var int The integer value of the address (generally produced by ip2long()) 33 | */ 34 | protected $address; 35 | 36 | /** 37 | * Constructor 38 | * 39 | * @param string|int $ip The IP address (in dot-notation-string format or integer) to be represented by the instance 40 | */ 41 | public function __construct($ip) 42 | { 43 | $this->setFromMixedSource($ip); 44 | } 45 | 46 | /** 47 | * Format and validate for given string or integer formatted IPV4 network address. 48 | * 49 | * @param string|int $ip The IP address (in dot-notation-string format or integer) to be represented by the instance 50 | * 51 | * @throws Exception 52 | */ 53 | protected function setFromMixedSource($ip) 54 | { 55 | if (is_int($ip) || is_string($ip)) { 56 | if (is_int($ip)) { 57 | /* 58 | * Convert int to dotted IP string 59 | */ 60 | $ip = long2ip($ip); 61 | } 62 | 63 | /* 64 | * We might have been given a string, or we may have converted to string. Attempt to make it an int. 65 | */ 66 | if (is_string($ip)) { 67 | $ip = ip2long($ip); 68 | } 69 | } else { 70 | $ip = false; 71 | } 72 | 73 | /* 74 | * If given an improper data type, we set the $ip to false. 75 | * Also, the conversion through ip2long() could result in it becoming false. 76 | * Either way, we want to bail out. 77 | */ 78 | if ($ip === false) { 79 | throw new \Exception(__METHOD__.' requires valid IPV4 address string in dot-notation (aaa.bbb.ccc.ddd).'); 80 | } 81 | 82 | $this->set($ip); 83 | } 84 | 85 | /** 86 | * Set the value of the address to the integer representation (compensating for addresses which converted to negative on 32bit systems). 87 | * 88 | * @param integer $address 89 | */ 90 | protected function set($address) 91 | { 92 | /* 93 | PHP notes that some IP conversions will result in negative numbers on 32Bit architectures ( http://php.net/manual/en/function.ip2long.php#refsect1-function.ip2long-notes ) 94 | We're accounting for this. See note at http://php.net/manual/en/function.ip2long.php#88345 about "Convert IP to unsigned long" 95 | */ 96 | $this->address = (int) $address + ((int) $address < 0 ? 4294967296 : 0); 97 | } 98 | 99 | /** 100 | * Get the integer or dot-notated-string representation of the address. 101 | * 102 | * @param int $format Whether to return as integer (\JAAulde\IP\V4\Address::FORMAT_LONG_NOTATION) or dot-notation-string (\JAAulde\IP\V4\Address::FORMAT_DOTTED_NOTATION) 103 | * 104 | * @return string|int 105 | */ 106 | public function get($format = self::FORMAT_LONG_NOTATION) 107 | { 108 | return $format === self::FORMAT_DOTTED_NOTATION ? long2ip($this->address) : $this->address; 109 | } 110 | 111 | /** 112 | * Output dotted notation on conversion to string. 113 | * 114 | * @uses \JAAulde\IP\V4\Address::get 115 | * 116 | * @return string 117 | */ 118 | public function __toString() 119 | { 120 | return $this->get(self::FORMAT_DOTTED_NOTATION); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/Block.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright 2006-2015 Jim Auldridge 10 | * @license MIT 11 | */ 12 | class Block extends Range 13 | { 14 | /** 15 | * @var \JAAulde\IP\V4\SubnetMask The subnet mask of the represented block 16 | */ 17 | protected $subnetMask; 18 | 19 | /** 20 | * Constructor 21 | * 22 | * @param \JAAulde\IP\V4\Address|string $a1 The base address with which the network and broadcast addresses of this block will be calculated. This can be an 23 | * an instance of \JAAulde\IP\V4\Address, in which case the second parameter will be required, or a string in dot-notated format with optional CIDR 24 | * slash prefix. If a string without CIDR slash prefix, second parameter is required. If there is a CIDR slash prefix, second parameter will be ignored. 25 | * @param \JAAulde\IP\V4\SubnetMask|int|string|\JAAulde\IP\V4\Address $a2 Optional depending on what was given as the first parameter. This is a subnet mask 26 | * to determine the size of this block, or a CIDR prefix for calculating a subnet mask, or a second \JAAulde\IP\V4\Address instance to fit into the derived 27 | * block. 28 | * 29 | * @throws Exception 30 | */ 31 | public function __construct($a1, $a2 = null) 32 | { 33 | $subnetMask = null; 34 | 35 | if (is_string($a1)) { 36 | $a1parts = explode('/', $a1, 2); 37 | $a1sub1 = $a1parts[0]; 38 | $a1sub2 = isset($a1parts[1]) ? $a1parts[1] : null; 39 | 40 | $a1 = new Address($a1sub1); 41 | 42 | if ($a1sub2 !== null) { 43 | $a2 = (int) $a1sub2; 44 | } 45 | } 46 | 47 | if ($a2 instanceof SubnetMask) { 48 | $subnetMask = $a2; 49 | } else { 50 | if ($a2 instanceof Address) { 51 | $a2 = SubnetMask::calculateCIDRToFit($a1, $a2); 52 | } 53 | 54 | if (is_string($a2) && count(explode('.', $a2)) === 4) { 55 | $subnetMask = new SubnetMask($a2); 56 | } elseif (is_int($a2) || is_string($a2)) { 57 | $subnetMask = SubnetMask::fromCIDRPrefix((int) preg_replace('/[^\d]/', '', (string) $a2)); 58 | } 59 | } 60 | 61 | if (!($subnetMask instanceof SubnetMask)) { 62 | throw new \Exception(__METHOD__.' could not derive a subnet mask. See documentation for second param, $a2.'); 63 | } 64 | 65 | $this->subnetMask = $subnetMask; 66 | 67 | parent::__construct(self::calculateNetworkAddress($a1, $subnetMask), self::calculateBroadcastAddress($a1, $subnetMask)); 68 | } 69 | 70 | /** 71 | * Determine if a given IPV4 address is this block's network address (first address in range). 72 | * 73 | * @param \JAAulde\IP\V4\Address $address The address we want to know about 74 | * 75 | * @return bool 76 | */ 77 | public function isNetworkAddress(Address $address) 78 | { 79 | return $address->get() === $this->firstAddress->get(); 80 | } 81 | 82 | /** 83 | * Determine if a given IPV4 address is this block's broadcast address (last address in range). 84 | * 85 | * @param \JAAulde\IP\V4\Address $address The address we want to know about 86 | * 87 | * @return bool 88 | */ 89 | public function isBroadcastAddress(Address $address) 90 | { 91 | return $address->get() === $this->lastAddress->get(); 92 | } 93 | 94 | /** 95 | * Retrieve the block's network address (first address in range) (Alias to \JAAulde\IP\V4\Range::getFirstAddress). 96 | * 97 | * @uses \JAAulde\IP\V4\Range::getFirstAddress 98 | * 99 | * @return \JAAulde\IP\V4\Address 100 | */ 101 | public function getNetworkAddress() 102 | { 103 | return $this->getFirstAddress(); 104 | } 105 | 106 | /** 107 | * Retrieve the block's broadcast address (last address in range). (Alias to \JAAulde\IP\V4\Range::getLastAddress). 108 | * 109 | * @uses \JAAulde\IP\V4\Range::getLastAddress 110 | * 111 | * @return \JAAulde\IP\V4\Address 112 | */ 113 | public function getBroadcastAddress() 114 | { 115 | return $this->getLastAddress(); 116 | } 117 | 118 | /** 119 | * Retrieve the block's subnet mask. 120 | * 121 | * @return \JAAulde\IP\V4\SubnetMask 122 | */ 123 | public function getSubnetMask() 124 | { 125 | return $this->subnetMask; 126 | } 127 | 128 | /** 129 | * Retrieve the total number of IPV4 addresses represented in this block. 130 | * 131 | * @return int 132 | */ 133 | public function getAddressCount() 134 | { 135 | return pow(2, $this->subnetMask->getHostBitsCount()); 136 | } 137 | 138 | /** 139 | * Retrieve the total number of usable IPV4 addresses represented in this block. 140 | * 141 | * The total number of usable addresses is generally considered to be 2 less than the total number represented by the block. 142 | * This accounts for the fact that the first and last addresses in a block are used for the network and broadcast addresses. 143 | * 144 | * @return int 145 | */ 146 | public function getUsableAddressCount() 147 | { 148 | return $this->getAddressCount() - 2; 149 | } 150 | 151 | /** 152 | * Calculate the network address of a Block given an IPV4 network address and SubnetMask. 153 | * 154 | * @param \JAAulde\IP\V4\Address $address The IP address from which a network address will be derived 155 | * @param \JAAulde\IP\V4\SubnetMask $subnetMask The subnet mask (in address form) used in the derivation 156 | * 157 | * @return \JAAulde\IP\V4\Address 158 | */ 159 | public static function calculateNetworkAddress(Address $address, SubnetMask $subnetMask) 160 | { 161 | return new Address($address->get() & $subnetMask->get()); 162 | } 163 | 164 | /** 165 | * Calculate the broadcast address of a Block given an IPV4 network address and SubnetMask. 166 | * 167 | * @param \JAAulde\IP\V4\Address $address The IP address from which a broadcast address will be derived 168 | * @param \JAAulde\IP\V4\SubnetMask $subnetMask The subnet mask (in address form) used in the derivation 169 | * 170 | * @return \JAAulde\IP\V4\Address 171 | */ 172 | public static function calculateBroadcastAddress(Address $address, SubnetMask $subnetMask) 173 | { 174 | return new Address($address->get() | ~$subnetMask->get()); 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # php-ipv4 2 | 3 | [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) 4 | [![Build Status](https://travis-ci.org/JAAulde/php-ipv4.svg?branch=master)](https://travis-ci.org/JAAulde/php-ipv4) 5 | [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/JAAulde/php-ipv4/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/JAAulde/php-ipv4/?branch=develop) 6 | [![Coverage Status](https://coveralls.io/repos/JAAulde/php-ipv4/badge.svg?branch=master)](https://coveralls.io/r/JAAulde/php-ipv4?branch=master) 7 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/JAAulde/php-ipv4.svg?style=flat-square)](https://packagist.org/packages/JAAulde/php-ipv4) 8 | [![Total Downloads](https://img.shields.io/packagist/dt/JAAulde/php-ipv4.svg?style=flat-square)](https://packagist.org/packages/JAAulde/php-ipv4) 9 | 10 | PHP classes for working with IPV4 addresses and networks. 11 | 12 | ## Install 13 | ### via [composer](https://getcomposer.org) 14 | ```bash 15 | $ composer require jaaulde/php-ipv4 16 | ``` 17 | 18 | ## Change log 19 | Please see [CHANGELOG](CHANGELOG.md) for information about what has changed recently. 20 | 21 | ## Testing 22 | ``` bash 23 | $ composer test 24 | ``` 25 | 26 | ## License 27 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 28 | 29 | ## Usage 30 | ... 31 | 32 | ## Examples 33 | _**Warning:** These examples are simplified and without context. Usage of unfiltered/unvalidated request variables (such as from `$_POST`) in these examples is not an endoresement or recommendation to do so in your own projects._ 34 | 35 | - [Hard Coded Whitelist](#user-content-hard-coded-whitelist) 36 | - [DB Driven Address Blocking](#user-content-db-driven-address-blocking) 37 | 38 | ### Hard Coded Whitelist 39 | ```php 40 | contains($client_address)) { 52 | // Client is on the whitelist, let them in 53 | } else { 54 | // Client is NOT on the whitelist, deny access 55 | } 56 | ``` 57 | 58 | ### DB Driven Address Blocking 59 | Many PHP applications allow administrators to blacklists for ranges of abusive IPs to ease moderator work loads. Most of these applications use overly complicated db schemas to store the IP addresses which represent the ranges, and use a series of string manipulations to determine if IPs fall into the banned ranges. By applying the actual math and logic involved in the IPv4 address scheme, `php-ipv4` radically simplifies all of this, and provides a more reliable filtering of IPs. 60 | 61 | An example administrator interface may offer a form something like this for entering ranges to ban: 62 | ```html 63 |
64 |

65 | 66 |
67 | 68 |

69 |

70 | 71 |
72 | 73 |

74 | 75 |
76 | ``` 77 | 78 | The receiving PHP script, `ip-ban.php` would then do something like this: 79 | ```php 80 | getFirstAddress()->get(), 118 | $blacklisted_range->getLastAddress()->get() 119 | ); 120 | ``` 121 | 122 | Finally, when we want to check if a client's IP address is one which is blocked, we can simply query like so: 123 | ```php 124 | get() 133 | ); 134 | ``` 135 | 136 | **If the above query returns a count greater than 0, you know that the client's IP address is on a ban list.** Otherwise, they're allowed to continue. It's that simple--there is no need ask for the actual data in the rows or iterate and compare. 137 | 138 | That's not all, though. A better admin interface would allow you to specify any IP and a subnet mask in dot notation or CIDR. `php-ipv4` can make that a breeze as well. Given the same DB schema as before and a form that would POST `address` and `mask` to `ip-ban.php`, you could simply: 139 | ```php 140 | getNetworkAddress()->get(), 150 | $blacklisted_network_block->getBroadcastAddress()->get() 151 | ); 152 | ``` 153 | 154 | The check for whether a client IP was blacklisted would then be identical to the already given example for such. 155 | -------------------------------------------------------------------------------- /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": "eb0f785c3d22e2ef7319696370f7a1e3", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "1.0.4", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", 21 | "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.3,<8.0-DEV" 26 | }, 27 | "require-dev": { 28 | "athletic/athletic": "~0.1.8", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpunit/phpunit": "~4.0", 32 | "squizlabs/php_codesniffer": "2.0.*@ALPHA" 33 | }, 34 | "type": "library", 35 | "extra": { 36 | "branch-alias": { 37 | "dev-master": "1.0.x-dev" 38 | } 39 | }, 40 | "autoload": { 41 | "psr-0": { 42 | "Doctrine\\Instantiator\\": "src" 43 | } 44 | }, 45 | "notification-url": "https://packagist.org/downloads/", 46 | "license": [ 47 | "MIT" 48 | ], 49 | "authors": [ 50 | { 51 | "name": "Marco Pivetta", 52 | "email": "ocramius@gmail.com", 53 | "homepage": "http://ocramius.github.com/" 54 | } 55 | ], 56 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 57 | "homepage": "https://github.com/doctrine/instantiator", 58 | "keywords": [ 59 | "constructor", 60 | "instantiate" 61 | ], 62 | "time": "2014-10-13 12:58:55" 63 | }, 64 | { 65 | "name": "guzzle/guzzle", 66 | "version": "v3.9.3", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/guzzle/guzzle3.git", 70 | "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9", 75 | "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "ext-curl": "*", 80 | "php": ">=5.3.3", 81 | "symfony/event-dispatcher": "~2.1" 82 | }, 83 | "replace": { 84 | "guzzle/batch": "self.version", 85 | "guzzle/cache": "self.version", 86 | "guzzle/common": "self.version", 87 | "guzzle/http": "self.version", 88 | "guzzle/inflection": "self.version", 89 | "guzzle/iterator": "self.version", 90 | "guzzle/log": "self.version", 91 | "guzzle/parser": "self.version", 92 | "guzzle/plugin": "self.version", 93 | "guzzle/plugin-async": "self.version", 94 | "guzzle/plugin-backoff": "self.version", 95 | "guzzle/plugin-cache": "self.version", 96 | "guzzle/plugin-cookie": "self.version", 97 | "guzzle/plugin-curlauth": "self.version", 98 | "guzzle/plugin-error-response": "self.version", 99 | "guzzle/plugin-history": "self.version", 100 | "guzzle/plugin-log": "self.version", 101 | "guzzle/plugin-md5": "self.version", 102 | "guzzle/plugin-mock": "self.version", 103 | "guzzle/plugin-oauth": "self.version", 104 | "guzzle/service": "self.version", 105 | "guzzle/stream": "self.version" 106 | }, 107 | "require-dev": { 108 | "doctrine/cache": "~1.3", 109 | "monolog/monolog": "~1.0", 110 | "phpunit/phpunit": "3.7.*", 111 | "psr/log": "~1.0", 112 | "symfony/class-loader": "~2.1", 113 | "zendframework/zend-cache": "2.*,<2.3", 114 | "zendframework/zend-log": "2.*,<2.3" 115 | }, 116 | "suggest": { 117 | "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated." 118 | }, 119 | "type": "library", 120 | "extra": { 121 | "branch-alias": { 122 | "dev-master": "3.9-dev" 123 | } 124 | }, 125 | "autoload": { 126 | "psr-0": { 127 | "Guzzle": "src/", 128 | "Guzzle\\Tests": "tests/" 129 | } 130 | }, 131 | "notification-url": "https://packagist.org/downloads/", 132 | "license": [ 133 | "MIT" 134 | ], 135 | "authors": [ 136 | { 137 | "name": "Michael Dowling", 138 | "email": "mtdowling@gmail.com", 139 | "homepage": "https://github.com/mtdowling" 140 | }, 141 | { 142 | "name": "Guzzle Community", 143 | "homepage": "https://github.com/guzzle/guzzle/contributors" 144 | } 145 | ], 146 | "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle", 147 | "homepage": "http://guzzlephp.org/", 148 | "keywords": [ 149 | "client", 150 | "curl", 151 | "framework", 152 | "http", 153 | "http client", 154 | "rest", 155 | "web service" 156 | ], 157 | "time": "2015-03-18 18:23:50" 158 | }, 159 | { 160 | "name": "phpdocumentor/reflection-docblock", 161 | "version": "2.0.4", 162 | "source": { 163 | "type": "git", 164 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 165 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" 166 | }, 167 | "dist": { 168 | "type": "zip", 169 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", 170 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", 171 | "shasum": "" 172 | }, 173 | "require": { 174 | "php": ">=5.3.3" 175 | }, 176 | "require-dev": { 177 | "phpunit/phpunit": "~4.0" 178 | }, 179 | "suggest": { 180 | "dflydev/markdown": "~1.0", 181 | "erusev/parsedown": "~1.0" 182 | }, 183 | "type": "library", 184 | "extra": { 185 | "branch-alias": { 186 | "dev-master": "2.0.x-dev" 187 | } 188 | }, 189 | "autoload": { 190 | "psr-0": { 191 | "phpDocumentor": [ 192 | "src/" 193 | ] 194 | } 195 | }, 196 | "notification-url": "https://packagist.org/downloads/", 197 | "license": [ 198 | "MIT" 199 | ], 200 | "authors": [ 201 | { 202 | "name": "Mike van Riel", 203 | "email": "mike.vanriel@naenius.com" 204 | } 205 | ], 206 | "time": "2015-02-03 12:10:50" 207 | }, 208 | { 209 | "name": "phpspec/prophecy", 210 | "version": "v1.4.1", 211 | "source": { 212 | "type": "git", 213 | "url": "https://github.com/phpspec/prophecy.git", 214 | "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373" 215 | }, 216 | "dist": { 217 | "type": "zip", 218 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", 219 | "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", 220 | "shasum": "" 221 | }, 222 | "require": { 223 | "doctrine/instantiator": "^1.0.2", 224 | "phpdocumentor/reflection-docblock": "~2.0", 225 | "sebastian/comparator": "~1.1" 226 | }, 227 | "require-dev": { 228 | "phpspec/phpspec": "~2.0" 229 | }, 230 | "type": "library", 231 | "extra": { 232 | "branch-alias": { 233 | "dev-master": "1.4.x-dev" 234 | } 235 | }, 236 | "autoload": { 237 | "psr-0": { 238 | "Prophecy\\": "src/" 239 | } 240 | }, 241 | "notification-url": "https://packagist.org/downloads/", 242 | "license": [ 243 | "MIT" 244 | ], 245 | "authors": [ 246 | { 247 | "name": "Konstantin Kudryashov", 248 | "email": "ever.zet@gmail.com", 249 | "homepage": "http://everzet.com" 250 | }, 251 | { 252 | "name": "Marcello Duarte", 253 | "email": "marcello.duarte@gmail.com" 254 | } 255 | ], 256 | "description": "Highly opinionated mocking framework for PHP 5.3+", 257 | "homepage": "https://github.com/phpspec/prophecy", 258 | "keywords": [ 259 | "Double", 260 | "Dummy", 261 | "fake", 262 | "mock", 263 | "spy", 264 | "stub" 265 | ], 266 | "time": "2015-04-27 22:15:08" 267 | }, 268 | { 269 | "name": "phpunit/php-code-coverage", 270 | "version": "2.1.5", 271 | "source": { 272 | "type": "git", 273 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 274 | "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e" 275 | }, 276 | "dist": { 277 | "type": "zip", 278 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be2286cb8c7e1773eded49d9719219e6f74f9e3e", 279 | "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e", 280 | "shasum": "" 281 | }, 282 | "require": { 283 | "php": ">=5.3.3", 284 | "phpunit/php-file-iterator": "~1.3", 285 | "phpunit/php-text-template": "~1.2", 286 | "phpunit/php-token-stream": "~1.3", 287 | "sebastian/environment": "~1.0", 288 | "sebastian/version": "~1.0" 289 | }, 290 | "require-dev": { 291 | "ext-xdebug": ">=2.1.4", 292 | "phpunit/phpunit": "~4" 293 | }, 294 | "suggest": { 295 | "ext-dom": "*", 296 | "ext-xdebug": ">=2.2.1", 297 | "ext-xmlwriter": "*" 298 | }, 299 | "type": "library", 300 | "extra": { 301 | "branch-alias": { 302 | "dev-master": "2.1.x-dev" 303 | } 304 | }, 305 | "autoload": { 306 | "classmap": [ 307 | "src/" 308 | ] 309 | }, 310 | "notification-url": "https://packagist.org/downloads/", 311 | "license": [ 312 | "BSD-3-Clause" 313 | ], 314 | "authors": [ 315 | { 316 | "name": "Sebastian Bergmann", 317 | "email": "sb@sebastian-bergmann.de", 318 | "role": "lead" 319 | } 320 | ], 321 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 322 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 323 | "keywords": [ 324 | "coverage", 325 | "testing", 326 | "xunit" 327 | ], 328 | "time": "2015-06-09 13:05:42" 329 | }, 330 | { 331 | "name": "phpunit/php-file-iterator", 332 | "version": "1.4.0", 333 | "source": { 334 | "type": "git", 335 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 336 | "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb" 337 | }, 338 | "dist": { 339 | "type": "zip", 340 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb", 341 | "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb", 342 | "shasum": "" 343 | }, 344 | "require": { 345 | "php": ">=5.3.3" 346 | }, 347 | "type": "library", 348 | "extra": { 349 | "branch-alias": { 350 | "dev-master": "1.4.x-dev" 351 | } 352 | }, 353 | "autoload": { 354 | "classmap": [ 355 | "src/" 356 | ] 357 | }, 358 | "notification-url": "https://packagist.org/downloads/", 359 | "license": [ 360 | "BSD-3-Clause" 361 | ], 362 | "authors": [ 363 | { 364 | "name": "Sebastian Bergmann", 365 | "email": "sb@sebastian-bergmann.de", 366 | "role": "lead" 367 | } 368 | ], 369 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 370 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 371 | "keywords": [ 372 | "filesystem", 373 | "iterator" 374 | ], 375 | "time": "2015-04-02 05:19:05" 376 | }, 377 | { 378 | "name": "phpunit/php-text-template", 379 | "version": "1.2.0", 380 | "source": { 381 | "type": "git", 382 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 383 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" 384 | }, 385 | "dist": { 386 | "type": "zip", 387 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 388 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 389 | "shasum": "" 390 | }, 391 | "require": { 392 | "php": ">=5.3.3" 393 | }, 394 | "type": "library", 395 | "autoload": { 396 | "classmap": [ 397 | "Text/" 398 | ] 399 | }, 400 | "notification-url": "https://packagist.org/downloads/", 401 | "include-path": [ 402 | "" 403 | ], 404 | "license": [ 405 | "BSD-3-Clause" 406 | ], 407 | "authors": [ 408 | { 409 | "name": "Sebastian Bergmann", 410 | "email": "sb@sebastian-bergmann.de", 411 | "role": "lead" 412 | } 413 | ], 414 | "description": "Simple template engine.", 415 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 416 | "keywords": [ 417 | "template" 418 | ], 419 | "time": "2014-01-30 17:20:04" 420 | }, 421 | { 422 | "name": "phpunit/php-timer", 423 | "version": "1.0.5", 424 | "source": { 425 | "type": "git", 426 | "url": "https://github.com/sebastianbergmann/php-timer.git", 427 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" 428 | }, 429 | "dist": { 430 | "type": "zip", 431 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 432 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 433 | "shasum": "" 434 | }, 435 | "require": { 436 | "php": ">=5.3.3" 437 | }, 438 | "type": "library", 439 | "autoload": { 440 | "classmap": [ 441 | "PHP/" 442 | ] 443 | }, 444 | "notification-url": "https://packagist.org/downloads/", 445 | "include-path": [ 446 | "" 447 | ], 448 | "license": [ 449 | "BSD-3-Clause" 450 | ], 451 | "authors": [ 452 | { 453 | "name": "Sebastian Bergmann", 454 | "email": "sb@sebastian-bergmann.de", 455 | "role": "lead" 456 | } 457 | ], 458 | "description": "Utility class for timing", 459 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 460 | "keywords": [ 461 | "timer" 462 | ], 463 | "time": "2013-08-02 07:42:54" 464 | }, 465 | { 466 | "name": "phpunit/php-token-stream", 467 | "version": "1.4.1", 468 | "source": { 469 | "type": "git", 470 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 471 | "reference": "eab81d02569310739373308137284e0158424330" 472 | }, 473 | "dist": { 474 | "type": "zip", 475 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330", 476 | "reference": "eab81d02569310739373308137284e0158424330", 477 | "shasum": "" 478 | }, 479 | "require": { 480 | "ext-tokenizer": "*", 481 | "php": ">=5.3.3" 482 | }, 483 | "require-dev": { 484 | "phpunit/phpunit": "~4.2" 485 | }, 486 | "type": "library", 487 | "extra": { 488 | "branch-alias": { 489 | "dev-master": "1.4-dev" 490 | } 491 | }, 492 | "autoload": { 493 | "classmap": [ 494 | "src/" 495 | ] 496 | }, 497 | "notification-url": "https://packagist.org/downloads/", 498 | "license": [ 499 | "BSD-3-Clause" 500 | ], 501 | "authors": [ 502 | { 503 | "name": "Sebastian Bergmann", 504 | "email": "sebastian@phpunit.de" 505 | } 506 | ], 507 | "description": "Wrapper around PHP's tokenizer extension.", 508 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 509 | "keywords": [ 510 | "tokenizer" 511 | ], 512 | "time": "2015-04-08 04:46:07" 513 | }, 514 | { 515 | "name": "phpunit/phpunit", 516 | "version": "4.6.10", 517 | "source": { 518 | "type": "git", 519 | "url": "https://github.com/sebastianbergmann/phpunit.git", 520 | "reference": "7b5fe98b28302a8b25693b2298bca74463336975" 521 | }, 522 | "dist": { 523 | "type": "zip", 524 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b5fe98b28302a8b25693b2298bca74463336975", 525 | "reference": "7b5fe98b28302a8b25693b2298bca74463336975", 526 | "shasum": "" 527 | }, 528 | "require": { 529 | "ext-dom": "*", 530 | "ext-json": "*", 531 | "ext-pcre": "*", 532 | "ext-reflection": "*", 533 | "ext-spl": "*", 534 | "php": ">=5.3.3", 535 | "phpspec/prophecy": "~1.3,>=1.3.1", 536 | "phpunit/php-code-coverage": "~2.0,>=2.0.11", 537 | "phpunit/php-file-iterator": "~1.4", 538 | "phpunit/php-text-template": "~1.2", 539 | "phpunit/php-timer": "~1.0", 540 | "phpunit/phpunit-mock-objects": "~2.3", 541 | "sebastian/comparator": "~1.1", 542 | "sebastian/diff": "~1.2", 543 | "sebastian/environment": "~1.2", 544 | "sebastian/exporter": "~1.2", 545 | "sebastian/global-state": "~1.0", 546 | "sebastian/version": "~1.0", 547 | "symfony/yaml": "~2.1|~3.0" 548 | }, 549 | "suggest": { 550 | "phpunit/php-invoker": "~1.1" 551 | }, 552 | "bin": [ 553 | "phpunit" 554 | ], 555 | "type": "library", 556 | "extra": { 557 | "branch-alias": { 558 | "dev-master": "4.6.x-dev" 559 | } 560 | }, 561 | "autoload": { 562 | "classmap": [ 563 | "src/" 564 | ] 565 | }, 566 | "notification-url": "https://packagist.org/downloads/", 567 | "license": [ 568 | "BSD-3-Clause" 569 | ], 570 | "authors": [ 571 | { 572 | "name": "Sebastian Bergmann", 573 | "email": "sebastian@phpunit.de", 574 | "role": "lead" 575 | } 576 | ], 577 | "description": "The PHP Unit Testing framework.", 578 | "homepage": "https://phpunit.de/", 579 | "keywords": [ 580 | "phpunit", 581 | "testing", 582 | "xunit" 583 | ], 584 | "time": "2015-06-03 05:03:30" 585 | }, 586 | { 587 | "name": "phpunit/phpunit-mock-objects", 588 | "version": "2.3.3", 589 | "source": { 590 | "type": "git", 591 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 592 | "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7" 593 | }, 594 | "dist": { 595 | "type": "zip", 596 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7", 597 | "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7", 598 | "shasum": "" 599 | }, 600 | "require": { 601 | "doctrine/instantiator": "~1.0,>=1.0.2", 602 | "php": ">=5.3.3", 603 | "phpunit/php-text-template": "~1.2" 604 | }, 605 | "require-dev": { 606 | "phpunit/phpunit": "~4.4" 607 | }, 608 | "suggest": { 609 | "ext-soap": "*" 610 | }, 611 | "type": "library", 612 | "extra": { 613 | "branch-alias": { 614 | "dev-master": "2.3.x-dev" 615 | } 616 | }, 617 | "autoload": { 618 | "classmap": [ 619 | "src/" 620 | ] 621 | }, 622 | "notification-url": "https://packagist.org/downloads/", 623 | "license": [ 624 | "BSD-3-Clause" 625 | ], 626 | "authors": [ 627 | { 628 | "name": "Sebastian Bergmann", 629 | "email": "sb@sebastian-bergmann.de", 630 | "role": "lead" 631 | } 632 | ], 633 | "description": "Mock Object library for PHPUnit", 634 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 635 | "keywords": [ 636 | "mock", 637 | "xunit" 638 | ], 639 | "time": "2015-05-29 05:19:18" 640 | }, 641 | { 642 | "name": "psr/log", 643 | "version": "1.0.0", 644 | "source": { 645 | "type": "git", 646 | "url": "https://github.com/php-fig/log.git", 647 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" 648 | }, 649 | "dist": { 650 | "type": "zip", 651 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", 652 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", 653 | "shasum": "" 654 | }, 655 | "type": "library", 656 | "autoload": { 657 | "psr-0": { 658 | "Psr\\Log\\": "" 659 | } 660 | }, 661 | "notification-url": "https://packagist.org/downloads/", 662 | "license": [ 663 | "MIT" 664 | ], 665 | "authors": [ 666 | { 667 | "name": "PHP-FIG", 668 | "homepage": "http://www.php-fig.org/" 669 | } 670 | ], 671 | "description": "Common interface for logging libraries", 672 | "keywords": [ 673 | "log", 674 | "psr", 675 | "psr-3" 676 | ], 677 | "time": "2012-12-21 11:40:51" 678 | }, 679 | { 680 | "name": "satooshi/php-coveralls", 681 | "version": "dev-master", 682 | "source": { 683 | "type": "git", 684 | "url": "https://github.com/satooshi/php-coveralls.git", 685 | "reference": "2fbf803803d179ab1082807308a67bbd5a760c70" 686 | }, 687 | "dist": { 688 | "type": "zip", 689 | "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/2fbf803803d179ab1082807308a67bbd5a760c70", 690 | "reference": "2fbf803803d179ab1082807308a67bbd5a760c70", 691 | "shasum": "" 692 | }, 693 | "require": { 694 | "ext-json": "*", 695 | "ext-simplexml": "*", 696 | "guzzle/guzzle": ">=2.7", 697 | "php": ">=5.3", 698 | "psr/log": "1.0.0", 699 | "symfony/config": ">=2.0", 700 | "symfony/console": ">=2.0", 701 | "symfony/stopwatch": ">=2.2", 702 | "symfony/yaml": ">=2.0" 703 | }, 704 | "require-dev": { 705 | "apigen/apigen": "2.8.*@stable", 706 | "pdepend/pdepend": "dev-master as 2.0.0", 707 | "phpmd/phpmd": "dev-master", 708 | "phpunit/php-invoker": ">=1.1.0,<1.2.0", 709 | "phpunit/phpunit": "3.7.*@stable", 710 | "sebastian/finder-facade": "dev-master", 711 | "sebastian/phpcpd": "1.4.*@stable", 712 | "squizlabs/php_codesniffer": "1.4.*@stable", 713 | "theseer/fdomdocument": "dev-master" 714 | }, 715 | "suggest": { 716 | "symfony/http-kernel": "Allows Symfony integration" 717 | }, 718 | "bin": [ 719 | "composer/bin/coveralls" 720 | ], 721 | "type": "library", 722 | "extra": { 723 | "branch-alias": { 724 | "dev-master": "0.7-dev" 725 | } 726 | }, 727 | "autoload": { 728 | "psr-0": { 729 | "Satooshi\\Component": "src/", 730 | "Satooshi\\Bundle": "src/" 731 | } 732 | }, 733 | "notification-url": "https://packagist.org/downloads/", 734 | "license": [ 735 | "MIT" 736 | ], 737 | "authors": [ 738 | { 739 | "name": "Kitamura Satoshi", 740 | "email": "with.no.parachute@gmail.com", 741 | "homepage": "https://www.facebook.com/satooshi.jp" 742 | } 743 | ], 744 | "description": "PHP client library for Coveralls API", 745 | "homepage": "https://github.com/satooshi/php-coveralls", 746 | "keywords": [ 747 | "ci", 748 | "coverage", 749 | "github", 750 | "test" 751 | ], 752 | "time": "2014-11-11 15:35:34" 753 | }, 754 | { 755 | "name": "sebastian/comparator", 756 | "version": "1.1.1", 757 | "source": { 758 | "type": "git", 759 | "url": "https://github.com/sebastianbergmann/comparator.git", 760 | "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" 761 | }, 762 | "dist": { 763 | "type": "zip", 764 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", 765 | "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", 766 | "shasum": "" 767 | }, 768 | "require": { 769 | "php": ">=5.3.3", 770 | "sebastian/diff": "~1.2", 771 | "sebastian/exporter": "~1.2" 772 | }, 773 | "require-dev": { 774 | "phpunit/phpunit": "~4.4" 775 | }, 776 | "type": "library", 777 | "extra": { 778 | "branch-alias": { 779 | "dev-master": "1.1.x-dev" 780 | } 781 | }, 782 | "autoload": { 783 | "classmap": [ 784 | "src/" 785 | ] 786 | }, 787 | "notification-url": "https://packagist.org/downloads/", 788 | "license": [ 789 | "BSD-3-Clause" 790 | ], 791 | "authors": [ 792 | { 793 | "name": "Jeff Welch", 794 | "email": "whatthejeff@gmail.com" 795 | }, 796 | { 797 | "name": "Volker Dusch", 798 | "email": "github@wallbash.com" 799 | }, 800 | { 801 | "name": "Bernhard Schussek", 802 | "email": "bschussek@2bepublished.at" 803 | }, 804 | { 805 | "name": "Sebastian Bergmann", 806 | "email": "sebastian@phpunit.de" 807 | } 808 | ], 809 | "description": "Provides the functionality to compare PHP values for equality", 810 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 811 | "keywords": [ 812 | "comparator", 813 | "compare", 814 | "equality" 815 | ], 816 | "time": "2015-01-29 16:28:08" 817 | }, 818 | { 819 | "name": "sebastian/diff", 820 | "version": "1.3.0", 821 | "source": { 822 | "type": "git", 823 | "url": "https://github.com/sebastianbergmann/diff.git", 824 | "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" 825 | }, 826 | "dist": { 827 | "type": "zip", 828 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", 829 | "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", 830 | "shasum": "" 831 | }, 832 | "require": { 833 | "php": ">=5.3.3" 834 | }, 835 | "require-dev": { 836 | "phpunit/phpunit": "~4.2" 837 | }, 838 | "type": "library", 839 | "extra": { 840 | "branch-alias": { 841 | "dev-master": "1.3-dev" 842 | } 843 | }, 844 | "autoload": { 845 | "classmap": [ 846 | "src/" 847 | ] 848 | }, 849 | "notification-url": "https://packagist.org/downloads/", 850 | "license": [ 851 | "BSD-3-Clause" 852 | ], 853 | "authors": [ 854 | { 855 | "name": "Kore Nordmann", 856 | "email": "mail@kore-nordmann.de" 857 | }, 858 | { 859 | "name": "Sebastian Bergmann", 860 | "email": "sebastian@phpunit.de" 861 | } 862 | ], 863 | "description": "Diff implementation", 864 | "homepage": "http://www.github.com/sebastianbergmann/diff", 865 | "keywords": [ 866 | "diff" 867 | ], 868 | "time": "2015-02-22 15:13:53" 869 | }, 870 | { 871 | "name": "sebastian/environment", 872 | "version": "1.2.2", 873 | "source": { 874 | "type": "git", 875 | "url": "https://github.com/sebastianbergmann/environment.git", 876 | "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" 877 | }, 878 | "dist": { 879 | "type": "zip", 880 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", 881 | "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", 882 | "shasum": "" 883 | }, 884 | "require": { 885 | "php": ">=5.3.3" 886 | }, 887 | "require-dev": { 888 | "phpunit/phpunit": "~4.4" 889 | }, 890 | "type": "library", 891 | "extra": { 892 | "branch-alias": { 893 | "dev-master": "1.3.x-dev" 894 | } 895 | }, 896 | "autoload": { 897 | "classmap": [ 898 | "src/" 899 | ] 900 | }, 901 | "notification-url": "https://packagist.org/downloads/", 902 | "license": [ 903 | "BSD-3-Clause" 904 | ], 905 | "authors": [ 906 | { 907 | "name": "Sebastian Bergmann", 908 | "email": "sebastian@phpunit.de" 909 | } 910 | ], 911 | "description": "Provides functionality to handle HHVM/PHP environments", 912 | "homepage": "http://www.github.com/sebastianbergmann/environment", 913 | "keywords": [ 914 | "Xdebug", 915 | "environment", 916 | "hhvm" 917 | ], 918 | "time": "2015-01-01 10:01:08" 919 | }, 920 | { 921 | "name": "sebastian/exporter", 922 | "version": "1.2.0", 923 | "source": { 924 | "type": "git", 925 | "url": "https://github.com/sebastianbergmann/exporter.git", 926 | "reference": "84839970d05254c73cde183a721c7af13aede943" 927 | }, 928 | "dist": { 929 | "type": "zip", 930 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", 931 | "reference": "84839970d05254c73cde183a721c7af13aede943", 932 | "shasum": "" 933 | }, 934 | "require": { 935 | "php": ">=5.3.3", 936 | "sebastian/recursion-context": "~1.0" 937 | }, 938 | "require-dev": { 939 | "phpunit/phpunit": "~4.4" 940 | }, 941 | "type": "library", 942 | "extra": { 943 | "branch-alias": { 944 | "dev-master": "1.2.x-dev" 945 | } 946 | }, 947 | "autoload": { 948 | "classmap": [ 949 | "src/" 950 | ] 951 | }, 952 | "notification-url": "https://packagist.org/downloads/", 953 | "license": [ 954 | "BSD-3-Clause" 955 | ], 956 | "authors": [ 957 | { 958 | "name": "Jeff Welch", 959 | "email": "whatthejeff@gmail.com" 960 | }, 961 | { 962 | "name": "Volker Dusch", 963 | "email": "github@wallbash.com" 964 | }, 965 | { 966 | "name": "Bernhard Schussek", 967 | "email": "bschussek@2bepublished.at" 968 | }, 969 | { 970 | "name": "Sebastian Bergmann", 971 | "email": "sebastian@phpunit.de" 972 | }, 973 | { 974 | "name": "Adam Harvey", 975 | "email": "aharvey@php.net" 976 | } 977 | ], 978 | "description": "Provides the functionality to export PHP variables for visualization", 979 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 980 | "keywords": [ 981 | "export", 982 | "exporter" 983 | ], 984 | "time": "2015-01-27 07:23:06" 985 | }, 986 | { 987 | "name": "sebastian/global-state", 988 | "version": "1.0.0", 989 | "source": { 990 | "type": "git", 991 | "url": "https://github.com/sebastianbergmann/global-state.git", 992 | "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" 993 | }, 994 | "dist": { 995 | "type": "zip", 996 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", 997 | "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", 998 | "shasum": "" 999 | }, 1000 | "require": { 1001 | "php": ">=5.3.3" 1002 | }, 1003 | "require-dev": { 1004 | "phpunit/phpunit": "~4.2" 1005 | }, 1006 | "suggest": { 1007 | "ext-uopz": "*" 1008 | }, 1009 | "type": "library", 1010 | "extra": { 1011 | "branch-alias": { 1012 | "dev-master": "1.0-dev" 1013 | } 1014 | }, 1015 | "autoload": { 1016 | "classmap": [ 1017 | "src/" 1018 | ] 1019 | }, 1020 | "notification-url": "https://packagist.org/downloads/", 1021 | "license": [ 1022 | "BSD-3-Clause" 1023 | ], 1024 | "authors": [ 1025 | { 1026 | "name": "Sebastian Bergmann", 1027 | "email": "sebastian@phpunit.de" 1028 | } 1029 | ], 1030 | "description": "Snapshotting of global state", 1031 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1032 | "keywords": [ 1033 | "global state" 1034 | ], 1035 | "time": "2014-10-06 09:23:50" 1036 | }, 1037 | { 1038 | "name": "sebastian/recursion-context", 1039 | "version": "1.0.0", 1040 | "source": { 1041 | "type": "git", 1042 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1043 | "reference": "3989662bbb30a29d20d9faa04a846af79b276252" 1044 | }, 1045 | "dist": { 1046 | "type": "zip", 1047 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", 1048 | "reference": "3989662bbb30a29d20d9faa04a846af79b276252", 1049 | "shasum": "" 1050 | }, 1051 | "require": { 1052 | "php": ">=5.3.3" 1053 | }, 1054 | "require-dev": { 1055 | "phpunit/phpunit": "~4.4" 1056 | }, 1057 | "type": "library", 1058 | "extra": { 1059 | "branch-alias": { 1060 | "dev-master": "1.0.x-dev" 1061 | } 1062 | }, 1063 | "autoload": { 1064 | "classmap": [ 1065 | "src/" 1066 | ] 1067 | }, 1068 | "notification-url": "https://packagist.org/downloads/", 1069 | "license": [ 1070 | "BSD-3-Clause" 1071 | ], 1072 | "authors": [ 1073 | { 1074 | "name": "Jeff Welch", 1075 | "email": "whatthejeff@gmail.com" 1076 | }, 1077 | { 1078 | "name": "Sebastian Bergmann", 1079 | "email": "sebastian@phpunit.de" 1080 | }, 1081 | { 1082 | "name": "Adam Harvey", 1083 | "email": "aharvey@php.net" 1084 | } 1085 | ], 1086 | "description": "Provides functionality to recursively process PHP variables", 1087 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1088 | "time": "2015-01-24 09:48:32" 1089 | }, 1090 | { 1091 | "name": "sebastian/version", 1092 | "version": "1.0.5", 1093 | "source": { 1094 | "type": "git", 1095 | "url": "https://github.com/sebastianbergmann/version.git", 1096 | "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4" 1097 | }, 1098 | "dist": { 1099 | "type": "zip", 1100 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", 1101 | "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", 1102 | "shasum": "" 1103 | }, 1104 | "type": "library", 1105 | "autoload": { 1106 | "classmap": [ 1107 | "src/" 1108 | ] 1109 | }, 1110 | "notification-url": "https://packagist.org/downloads/", 1111 | "license": [ 1112 | "BSD-3-Clause" 1113 | ], 1114 | "authors": [ 1115 | { 1116 | "name": "Sebastian Bergmann", 1117 | "email": "sebastian@phpunit.de", 1118 | "role": "lead" 1119 | } 1120 | ], 1121 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1122 | "homepage": "https://github.com/sebastianbergmann/version", 1123 | "time": "2015-02-24 06:35:25" 1124 | }, 1125 | { 1126 | "name": "symfony/config", 1127 | "version": "v2.7.0", 1128 | "source": { 1129 | "type": "git", 1130 | "url": "https://github.com/symfony/Config.git", 1131 | "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4" 1132 | }, 1133 | "dist": { 1134 | "type": "zip", 1135 | "url": "https://api.github.com/repos/symfony/Config/zipball/537e9912063e66aa70cbcddd7d6e6e8db61d98e4", 1136 | "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4", 1137 | "shasum": "" 1138 | }, 1139 | "require": { 1140 | "php": ">=5.3.9", 1141 | "symfony/filesystem": "~2.3" 1142 | }, 1143 | "require-dev": { 1144 | "symfony/phpunit-bridge": "~2.7" 1145 | }, 1146 | "type": "library", 1147 | "extra": { 1148 | "branch-alias": { 1149 | "dev-master": "2.7-dev" 1150 | } 1151 | }, 1152 | "autoload": { 1153 | "psr-4": { 1154 | "Symfony\\Component\\Config\\": "" 1155 | } 1156 | }, 1157 | "notification-url": "https://packagist.org/downloads/", 1158 | "license": [ 1159 | "MIT" 1160 | ], 1161 | "authors": [ 1162 | { 1163 | "name": "Fabien Potencier", 1164 | "email": "fabien@symfony.com" 1165 | }, 1166 | { 1167 | "name": "Symfony Community", 1168 | "homepage": "https://symfony.com/contributors" 1169 | } 1170 | ], 1171 | "description": "Symfony Config Component", 1172 | "homepage": "https://symfony.com", 1173 | "time": "2015-05-15 13:33:16" 1174 | }, 1175 | { 1176 | "name": "symfony/console", 1177 | "version": "v2.7.0", 1178 | "source": { 1179 | "type": "git", 1180 | "url": "https://github.com/symfony/Console.git", 1181 | "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399" 1182 | }, 1183 | "dist": { 1184 | "type": "zip", 1185 | "url": "https://api.github.com/repos/symfony/Console/zipball/7f0bec04961c61c961df0cb8c2ae88dbfd83f399", 1186 | "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399", 1187 | "shasum": "" 1188 | }, 1189 | "require": { 1190 | "php": ">=5.3.9" 1191 | }, 1192 | "require-dev": { 1193 | "psr/log": "~1.0", 1194 | "symfony/event-dispatcher": "~2.1", 1195 | "symfony/phpunit-bridge": "~2.7", 1196 | "symfony/process": "~2.1" 1197 | }, 1198 | "suggest": { 1199 | "psr/log": "For using the console logger", 1200 | "symfony/event-dispatcher": "", 1201 | "symfony/process": "" 1202 | }, 1203 | "type": "library", 1204 | "extra": { 1205 | "branch-alias": { 1206 | "dev-master": "2.7-dev" 1207 | } 1208 | }, 1209 | "autoload": { 1210 | "psr-4": { 1211 | "Symfony\\Component\\Console\\": "" 1212 | } 1213 | }, 1214 | "notification-url": "https://packagist.org/downloads/", 1215 | "license": [ 1216 | "MIT" 1217 | ], 1218 | "authors": [ 1219 | { 1220 | "name": "Fabien Potencier", 1221 | "email": "fabien@symfony.com" 1222 | }, 1223 | { 1224 | "name": "Symfony Community", 1225 | "homepage": "https://symfony.com/contributors" 1226 | } 1227 | ], 1228 | "description": "Symfony Console Component", 1229 | "homepage": "https://symfony.com", 1230 | "time": "2015-05-29 16:22:24" 1231 | }, 1232 | { 1233 | "name": "symfony/event-dispatcher", 1234 | "version": "v2.7.0", 1235 | "source": { 1236 | "type": "git", 1237 | "url": "https://github.com/symfony/EventDispatcher.git", 1238 | "reference": "687039686d0e923429ba6e958d0baa920cd5d458" 1239 | }, 1240 | "dist": { 1241 | "type": "zip", 1242 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/687039686d0e923429ba6e958d0baa920cd5d458", 1243 | "reference": "687039686d0e923429ba6e958d0baa920cd5d458", 1244 | "shasum": "" 1245 | }, 1246 | "require": { 1247 | "php": ">=5.3.9" 1248 | }, 1249 | "require-dev": { 1250 | "psr/log": "~1.0", 1251 | "symfony/config": "~2.0,>=2.0.5", 1252 | "symfony/dependency-injection": "~2.6", 1253 | "symfony/expression-language": "~2.6", 1254 | "symfony/phpunit-bridge": "~2.7", 1255 | "symfony/stopwatch": "~2.3" 1256 | }, 1257 | "suggest": { 1258 | "symfony/dependency-injection": "", 1259 | "symfony/http-kernel": "" 1260 | }, 1261 | "type": "library", 1262 | "extra": { 1263 | "branch-alias": { 1264 | "dev-master": "2.7-dev" 1265 | } 1266 | }, 1267 | "autoload": { 1268 | "psr-4": { 1269 | "Symfony\\Component\\EventDispatcher\\": "" 1270 | } 1271 | }, 1272 | "notification-url": "https://packagist.org/downloads/", 1273 | "license": [ 1274 | "MIT" 1275 | ], 1276 | "authors": [ 1277 | { 1278 | "name": "Fabien Potencier", 1279 | "email": "fabien@symfony.com" 1280 | }, 1281 | { 1282 | "name": "Symfony Community", 1283 | "homepage": "https://symfony.com/contributors" 1284 | } 1285 | ], 1286 | "description": "Symfony EventDispatcher Component", 1287 | "homepage": "https://symfony.com", 1288 | "time": "2015-05-02 15:21:08" 1289 | }, 1290 | { 1291 | "name": "symfony/filesystem", 1292 | "version": "v2.7.0", 1293 | "source": { 1294 | "type": "git", 1295 | "url": "https://github.com/symfony/Filesystem.git", 1296 | "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba" 1297 | }, 1298 | "dist": { 1299 | "type": "zip", 1300 | "url": "https://api.github.com/repos/symfony/Filesystem/zipball/ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", 1301 | "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", 1302 | "shasum": "" 1303 | }, 1304 | "require": { 1305 | "php": ">=5.3.9" 1306 | }, 1307 | "require-dev": { 1308 | "symfony/phpunit-bridge": "~2.7" 1309 | }, 1310 | "type": "library", 1311 | "extra": { 1312 | "branch-alias": { 1313 | "dev-master": "2.7-dev" 1314 | } 1315 | }, 1316 | "autoload": { 1317 | "psr-4": { 1318 | "Symfony\\Component\\Filesystem\\": "" 1319 | } 1320 | }, 1321 | "notification-url": "https://packagist.org/downloads/", 1322 | "license": [ 1323 | "MIT" 1324 | ], 1325 | "authors": [ 1326 | { 1327 | "name": "Fabien Potencier", 1328 | "email": "fabien@symfony.com" 1329 | }, 1330 | { 1331 | "name": "Symfony Community", 1332 | "homepage": "https://symfony.com/contributors" 1333 | } 1334 | ], 1335 | "description": "Symfony Filesystem Component", 1336 | "homepage": "https://symfony.com", 1337 | "time": "2015-05-15 13:33:16" 1338 | }, 1339 | { 1340 | "name": "symfony/stopwatch", 1341 | "version": "v2.7.0", 1342 | "source": { 1343 | "type": "git", 1344 | "url": "https://github.com/symfony/Stopwatch.git", 1345 | "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce" 1346 | }, 1347 | "dist": { 1348 | "type": "zip", 1349 | "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/7702945bceddc0e1f744519abb8a2baeb94bd5ce", 1350 | "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce", 1351 | "shasum": "" 1352 | }, 1353 | "require": { 1354 | "php": ">=5.3.9" 1355 | }, 1356 | "require-dev": { 1357 | "symfony/phpunit-bridge": "~2.7" 1358 | }, 1359 | "type": "library", 1360 | "extra": { 1361 | "branch-alias": { 1362 | "dev-master": "2.7-dev" 1363 | } 1364 | }, 1365 | "autoload": { 1366 | "psr-4": { 1367 | "Symfony\\Component\\Stopwatch\\": "" 1368 | } 1369 | }, 1370 | "notification-url": "https://packagist.org/downloads/", 1371 | "license": [ 1372 | "MIT" 1373 | ], 1374 | "authors": [ 1375 | { 1376 | "name": "Fabien Potencier", 1377 | "email": "fabien@symfony.com" 1378 | }, 1379 | { 1380 | "name": "Symfony Community", 1381 | "homepage": "https://symfony.com/contributors" 1382 | } 1383 | ], 1384 | "description": "Symfony Stopwatch Component", 1385 | "homepage": "https://symfony.com", 1386 | "time": "2015-05-02 15:21:08" 1387 | }, 1388 | { 1389 | "name": "symfony/yaml", 1390 | "version": "v2.7.0", 1391 | "source": { 1392 | "type": "git", 1393 | "url": "https://github.com/symfony/Yaml.git", 1394 | "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" 1395 | }, 1396 | "dist": { 1397 | "type": "zip", 1398 | "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", 1399 | "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", 1400 | "shasum": "" 1401 | }, 1402 | "require": { 1403 | "php": ">=5.3.9" 1404 | }, 1405 | "require-dev": { 1406 | "symfony/phpunit-bridge": "~2.7" 1407 | }, 1408 | "type": "library", 1409 | "extra": { 1410 | "branch-alias": { 1411 | "dev-master": "2.7-dev" 1412 | } 1413 | }, 1414 | "autoload": { 1415 | "psr-4": { 1416 | "Symfony\\Component\\Yaml\\": "" 1417 | } 1418 | }, 1419 | "notification-url": "https://packagist.org/downloads/", 1420 | "license": [ 1421 | "MIT" 1422 | ], 1423 | "authors": [ 1424 | { 1425 | "name": "Fabien Potencier", 1426 | "email": "fabien@symfony.com" 1427 | }, 1428 | { 1429 | "name": "Symfony Community", 1430 | "homepage": "https://symfony.com/contributors" 1431 | } 1432 | ], 1433 | "description": "Symfony Yaml Component", 1434 | "homepage": "https://symfony.com", 1435 | "time": "2015-05-02 15:21:08" 1436 | } 1437 | ], 1438 | "aliases": [], 1439 | "minimum-stability": "stable", 1440 | "stability-flags": { 1441 | "satooshi/php-coveralls": 20 1442 | }, 1443 | "prefer-stable": false, 1444 | "prefer-lowest": false, 1445 | "platform": { 1446 | "php": ">=5.3.0" 1447 | }, 1448 | "platform-dev": [] 1449 | } 1450 | --------------------------------------------------------------------------------