├── .gitignore ├── .travis.yml ├── phpunit.xml.dist ├── .editorconfig ├── composer.json ├── test ├── data │ ├── missingNodes.json │ └── small.json └── Overpass2GeojsonTest.php ├── README.md ├── lib └── Overpass2Geojson.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.4 5 | 6 | before_script: 7 | - composer install 8 | 9 | script: phpunit 10 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ./test 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 4 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mediasuitenz/overpass2geojson", 3 | "description": "Convert overpass JSON to GeoJSON", 4 | "license": "MIT", 5 | "require": {}, 6 | "require-dev": { 7 | "phpunit/phpunit": "~4.5.0" 8 | }, 9 | "autoload": { 10 | "classmap": ["lib/"] 11 | }, 12 | "config": { 13 | "process-timeout": 900 14 | }, 15 | "scripts": { 16 | "test": "./vendor/bin/phpunit" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /test/data/missingNodes.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 0.6, 3 | "generator": "Overpass API", 4 | "osm3s": { 5 | "timestamp_osm_base": "2015-03-16T05:09:02Z", 6 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 7 | }, 8 | "elements": [ 9 | { 10 | "type": "node", 11 | "id": 31813685, 12 | "lat": -43.5309652, 13 | "lon": 172.6396892 14 | }, 15 | { 16 | "type": "node", 17 | "id": 11111111, 18 | "lat": -43.5309812, 19 | "lon": 172.6421908, 20 | "tags": { 21 | "ccc": "cyclingpath" 22 | } 23 | }, 24 | { 25 | "type": "node", 26 | "id": 31064366, 27 | "lat": -43.5309800, 28 | "lon": 172.6427486 29 | }, 30 | { 31 | "type": "node", 32 | "id": 31064363, 33 | "lat": -43.5309786, 34 | "lon": 172.6433114 35 | }, 36 | { 37 | "type": "node", 38 | "id": 31064368, 39 | "lat": -43.5309823, 40 | "lon": 172.6433613, 41 | "tags": { 42 | "ccc": "cyclingpath", 43 | "chchsid": "24", 44 | "highway": "traffic_signals" 45 | } 46 | }, 47 | { 48 | "type": "way", 49 | "id": 4830778, 50 | "nodes": [ 51 | 31064347, 52 | 31813685 53 | ], 54 | "tags": { 55 | "access": "yes", 56 | "ccc": "cyclingpath", 57 | "foot": "yes", 58 | "highway": "residential", 59 | "maxspeed": "50", 60 | "name": "Worcester Street" 61 | } 62 | }, 63 | { 64 | "type": "way", 65 | "id": 4830782, 66 | "nodes": [ 67 | 31064347, 68 | 31064365, 69 | 31064366, 70 | 31064363, 71 | 31064368 72 | ], 73 | "tags": { 74 | "ccc": "cyclingpath", 75 | "highway": "footway" 76 | } 77 | } 78 | ] 79 | } 80 | -------------------------------------------------------------------------------- /test/data/small.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 0.6, 3 | "generator": "Overpass API", 4 | "osm3s": { 5 | "timestamp_osm_base": "2015-03-16T05:09:02Z", 6 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 7 | }, 8 | "elements": [ 9 | { 10 | "type": "node", 11 | "id": 31064347, 12 | "lat": -43.5309816, 13 | "lon": 172.6420391 14 | }, 15 | { 16 | "type": "node", 17 | "id": 31813685, 18 | "lat": -43.5309652, 19 | "lon": 172.6396892, 20 | "tags": { 21 | "chchsid": "66", 22 | "highway": "traffic_signals", 23 | "source": "https://drive.google.com/file/d/0Bw_Qy6oHnvlKZnZ5Zl8wUzhQNkU/edit?usp=sharing" 24 | } 25 | }, 26 | { 27 | "type": "node", 28 | "id": 31064365, 29 | "lat": -43.5309812, 30 | "lon": 172.6421908, 31 | "tags": { 32 | "ccc": "cyclingpath" 33 | } 34 | }, 35 | { 36 | "type": "node", 37 | "id": 31064366, 38 | "lat": -43.5309800, 39 | "lon": 172.6427486 40 | }, 41 | { 42 | "type": "node", 43 | "id": 31064363, 44 | "lat": -43.5309786, 45 | "lon": 172.6433114 46 | }, 47 | { 48 | "type": "node", 49 | "id": 31064368, 50 | "lat": -43.5309823, 51 | "lon": 172.6433613, 52 | "tags": { 53 | "ccc": "cyclingpath", 54 | "chchsid": "24", 55 | "highway": "traffic_signals" 56 | } 57 | }, 58 | { 59 | "type": "way", 60 | "id": 4830778, 61 | "nodes": [ 62 | 31064347, 63 | 31813685 64 | ], 65 | "tags": { 66 | "access": "yes", 67 | "ccc": "cyclingpath", 68 | "foot": "yes", 69 | "highway": "residential", 70 | "maxspeed": "50", 71 | "name": "Worcester Street" 72 | } 73 | }, 74 | { 75 | "type": "way", 76 | "id": 4830782, 77 | "nodes": [ 78 | 31064347, 79 | 31064365, 80 | 31064366, 81 | 31064363, 82 | 31064368 83 | ] 84 | } 85 | ] 86 | } 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Overpass 2 GeoJSON 2 | ================== 3 | 4 | [![Media Suite](http://mediasuite.co.nz/ms-badge.png)](http://mediasuite.co.nz) 5 | 6 | [![Build Status](https://travis-ci.org/mediasuitenz/Overpass2Geojson.svg)](https://travis-ci.org/mediasuitenz/Overpass2Geojson) 7 | 8 | `composer require mediasuitenz/Overpass2Geojson` 9 | 10 | PHP modules to convert Overpass API JSON output to GeoJSON format 11 | 12 | **Note:** this currently only converts either OSM ways and their nodes into a FeatureCollection of Features that have LineString geometries, or OSM nodes into a FeatureCollection of Point features. 13 | 14 | With the ways conversion, if any ways reference nodes that aren't also in the input, those nodes will be ignored. If there are less than 2 nodes for any way, that way will not produce a Feature as LineStrings must have more than 2 coordinates. 15 | 16 | To create a Polygon instead of a LineString you can pass true as the 3rd argument to `Overpass2Geojson::convertWays`, or set `Overpass2Geojson::polygon = true;` before using the utility. 17 | 18 | ## Example 19 | 20 | ### Overpass query 21 | ``` 22 | [out:json][timeout:25]; 23 | // gather results 24 | ( 25 | // all with highway tag 26 | way["highway"] 27 | // within bounding box 28 | (-43.5594542,172.6998653,-43.5548322,172.708076); 29 | // recursively get all nodes for the resultant ways (contains the lat/lon whereas ways don't) 30 | node(w)->.x; 31 | ); 32 | out; 33 | ``` 34 | 35 | ### PHP 36 | ```php 37 | // Example from above 38 | $url = 'http://overpass.osm.rambler.ru/cgi/interpreter?data=[out:json][timeout:25];%20(%20way[%22highway%22]%20(-43.5594542,172.6998653,-43.5548322,172.708076);%20node(w)-%3E.x;%20);%20out;'; 39 | 40 | // cURL the API 41 | $ch = curl_init(); 42 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 43 | curl_setopt($ch, CURLOPT_URL, $url); 44 | $osmJsonData = curl_exec($ch); 45 | 46 | // convert accepts JSON string or array e.g. from json_decode($osmJsonData, true); 47 | 48 | $geojson = Overpass2Geojson::convertWays($osmJsonData); // Returns JSON encoded string 49 | $geojson = Overpass2Geojson::convertWays($osmJsonData, false); // Returns array with GeoJSON structure 50 | $geojson = Overpass2Geojson::convertNodes($osmJsonData); 51 | ``` 52 | 53 | Example input (from overpass) 54 | ```json 55 | { 56 | "elements": [ 57 | { 58 | "type": "node", 59 | "id": 31064347, 60 | "lat": -43.5309816, 61 | "lon": 172.6420391 62 | }, 63 | { 64 | "type": "node", 65 | "id": 31813685, 66 | "lat": -43.5309652, 67 | "lon": 172.6396892, 68 | "tags": { 69 | "highway": "traffic_signals", 70 | } 71 | }, 72 | { 73 | "type": "way", 74 | "id": 4830778, 75 | "nodes": [ 76 | 31064347, 77 | 31813685 78 | ], 79 | "tags": { 80 | "highway": "residential", 81 | "maxspeed": "50", 82 | "name": "Worcester Street" 83 | } 84 | } 85 | ] 86 | } 87 | ``` 88 | 89 | Example output from Overpass2Geojson::convertWays 90 | ```json 91 | { 92 | "type": "FeatureCollection", 93 | "features": [ 94 | { 95 | "type": "Feature", 96 | "geometry": { 97 | "type": "LineString", 98 | "coordinates": [ 99 | [ 100 | 172.6420391, 101 | -43.5309816 102 | ], 103 | [ 104 | 172.6396892, 105 | -43.5309652 106 | ] 107 | ] 108 | }, 109 | "properties": { 110 | "highway": "residential", 111 | "maxspeed": "50", 112 | "name": "Worcester Street" 113 | } 114 | } 115 | ] 116 | } 117 | ``` 118 | 119 | Example output from Overpass2Geojson::convertNodes 120 | ```json 121 | { 122 | "type": "FeatureCollection", 123 | "features": [ 124 | { 125 | "type": "Feature", 126 | "properties": [], 127 | "geometry": { 128 | "type": "Point", 129 | "coordinates": [ 130 | 172.6420391, 131 | -43.5309816 132 | ] 133 | } 134 | }, 135 | { 136 | "type": "Feature", 137 | "properties": { 138 | "highway": "traffic_signals" 139 | }, 140 | "geometry": { 141 | "type": "Point", 142 | "coordinates": [ 143 | 172.6396892, 144 | -43.5309652 145 | ] 146 | } 147 | } 148 | ] 149 | } 150 | ``` 151 | -------------------------------------------------------------------------------- /lib/Overpass2Geojson.php: -------------------------------------------------------------------------------- 1 | 'FeatureCollection', 26 | 'features' => array(), 27 | ); 28 | foreach ($inputArray['elements'] as $osmItem) { 29 | if (isset($osmItem['type']) && $osmItem['type'] === 'way') { 30 | $feature = self::createWayFeature($osmItem, $nodes); 31 | if ($feature) { 32 | $output['features'][] = $feature; 33 | } 34 | } 35 | } 36 | return $encode ? json_encode($output) : $output; 37 | } 38 | 39 | /** 40 | * Converts a JSON string or decoded array into a GeoJSON string or array. 41 | * This creates a Point feature for each supplied node, ignoring ways. 42 | * @param mixed $input JSON string or array 43 | * @param boolean $encode whether to encode output as string 44 | * @return mixed false if failed, otherwise GeoJSON string or array 45 | */ 46 | public static function convertNodes($input, $encode = true) { 47 | $inputArray = self::validateInput($input); 48 | $nodes = self::collectNodes($inputArray['elements']); 49 | $output = array( 50 | 'type' => 'FeatureCollection', 51 | 'features' => array(), 52 | ); 53 | foreach ($nodes as $node) { 54 | $output['features'][] = array( 55 | 'type' => 'Feature', 56 | 'properties' => isset($node['tags']) ? $node['tags'] : array(), 57 | 'geometry' => array( 58 | 'type' => 'Point', 59 | 'coordinates' => array($node['lon'], $node['lat']), 60 | ), 61 | ); 62 | } 63 | return $encode ? json_encode($output) : $output; 64 | } 65 | 66 | private static function validateInput($input) { 67 | if (is_array($input)) { 68 | $inputArray = $input; 69 | } else if (is_string($input)) { 70 | $inputArray = json_decode($input, true); 71 | } else { 72 | return false; 73 | } 74 | if (!is_array($inputArray) || 75 | !isset($inputArray['elements']) || 76 | !is_array($inputArray['elements'])) { 77 | 78 | return false; 79 | } 80 | return $inputArray; 81 | } 82 | 83 | /** 84 | * Creates an array of nodes indexed by node id 85 | * @param array $elements OSM items 86 | * @return array nodes e.g. [id => {lon, lat, tags}, ...] 87 | */ 88 | public static function collectNodes($elements) { 89 | $nodes = array(); 90 | if (!is_array($elements)) { 91 | return $nodes; 92 | } 93 | foreach ($elements as $osmItem) { 94 | if (isset($osmItem['type']) && $osmItem['type'] === 'node') { 95 | if (isset($osmItem['id']) && isset($osmItem['lat']) && isset($osmItem['lon'])) { 96 | $nodes[$osmItem['id']] = $osmItem; 97 | } 98 | } 99 | } 100 | return $nodes; 101 | } 102 | 103 | /** 104 | * Creates a Feature array with geometry from matching nodes 105 | * @param array $way OSM way 106 | * @param array $nodes OSM node coordinates indexed by id 107 | * @return mixed false if invalid feature otherwise 108 | * array GeoJSON Feature with LineString or Polygon geometry 109 | */ 110 | public static function createWayFeature($way, $nodes) { 111 | $coords = array(); 112 | if (isset($way['nodes'])) { 113 | foreach ($way['nodes'] as $nodeId) { 114 | if (isset($nodes[$nodeId])) { 115 | $coords[] = array($nodes[$nodeId]['lon'], $nodes[$nodeId]['lat']); 116 | } 117 | } 118 | } 119 | if (count($coords) >= 2) { 120 | return array( 121 | 'type' => 'Feature', 122 | 'geometry' => array( 123 | 'type' => self::$polygon ? 'Polygon' : 'LineString', 124 | 'coordinates' => self::$polygon ? [$coords] : $coords, 125 | ), 126 | 'properties' => isset($way['tags']) ? array_merge($way['tags'], ["id"=>$way['id']]) : ["id"=>$way['id']], 127 | ); 128 | } 129 | return false; 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /test/Overpass2GeojsonTest.php: -------------------------------------------------------------------------------- 1 | assertSame(false, $output, 'Should return false when given null'); 9 | 10 | $input = 42; 11 | $output = Overpass2Geojson::convertWays($input, true); 12 | $this->assertSame(false, $output, 'Should return false when given something not a string'); 13 | 14 | $input = ''; 15 | $output = Overpass2Geojson::convertWays($input, true); 16 | $this->assertSame(false, $output, 'Should return false when given an empty string'); 17 | 18 | $input = '{}'; 19 | $output = Overpass2Geojson::convertWays($input, true); 20 | $this->assertSame(false, $output, 'Should return false when given json without elements'); 21 | 22 | $input = array(); 23 | $output = Overpass2Geojson::convertWays($input, true); 24 | $this->assertSame(false, $output, 'Should return false when given an array without elements'); 25 | 26 | $input = '{ "elements": [] }'; 27 | $output = Overpass2Geojson::convertWays($input, true); 28 | $this->assertTrue(is_string($output), 'Should return a string when given valid json'); 29 | 30 | $input = array('elements' => array()); 31 | $output = Overpass2Geojson::convertWays($input, true); 32 | $this->assertTrue(is_string($output), 'Should return a string when given a valid array'); 33 | } 34 | 35 | public function testConvertArrayInputValidation() { 36 | 37 | $input = null; 38 | $output = Overpass2Geojson::convertWays($input, false); 39 | $this->assertSame(false, $output, 'Should return false when given null'); 40 | 41 | $input = 42; 42 | $output = Overpass2Geojson::convertWays($input, false); 43 | $this->assertSame(false, $output, 'Should return false when given something not a string'); 44 | 45 | $input = ''; 46 | $output = Overpass2Geojson::convertWays($input, false); 47 | $this->assertSame(false, $output, 'Should return false when given an empty string'); 48 | 49 | $input = '{}'; 50 | $output = Overpass2Geojson::convertWays($input, false); 51 | $this->assertSame(false, $output, 'Should return false when given json without elements'); 52 | 53 | $input = array(); 54 | $output = Overpass2Geojson::convertWays($input, false); 55 | $this->assertSame(false, $output, 'Should return false when given an array without elements'); 56 | 57 | $input = '{ "elements": [] }'; 58 | $output = Overpass2Geojson::convertWays($input, false); 59 | $this->assertTrue(is_array($output), 'Should return an array when given valid json'); 60 | 61 | $input = array('elements' => array()); 62 | $output = Overpass2Geojson::convertWays($input, false); 63 | $this->assertTrue(is_array($output), 'Should return an array when given a valid array'); 64 | } 65 | 66 | public function testOutputIsGeojsonArray() { 67 | 68 | $input = array('elements' => array()); 69 | $output = Overpass2Geojson::convertWays($input, false); 70 | 71 | $this->assertTrue(isset($output['type']), 'Should return geojson with a type'); 72 | $this->assertEquals('FeatureCollection', $output['type'], 'Should return geojson with type FeatureCollection'); 73 | 74 | $this->assertTrue(isset($output['features']), 'Should return geojson with features'); 75 | $this->assertTrue(is_array($output['features']), 'Should return geojson with features array'); 76 | } 77 | 78 | public function testCollectNodes() { 79 | $input = null; 80 | $output = Overpass2Geojson::collectNodes($input); 81 | $this->assertTrue(is_array($output), 'Should return an array'); 82 | 83 | $input = array( 84 | array('type' => 'node'), 85 | array('type' => 'node', 'id' => 12314513113, 'lat' => 123.4567, 'lon' => -13.13415), 86 | array('type' => 'way'), 87 | array('type' => 'node', 'id' => 13542524325, 'lat' => 151.1341, 'lon' => 32.26244), 88 | ); 89 | $output = Overpass2Geojson::collectNodes($input); 90 | $this->assertTrue(is_array($output), 'Should return an array'); 91 | $this->assertSame(2, count($output), 'Should have an entry for each valid node'); 92 | 93 | $this->assertTrue(isset($output['12314513113']), 'Should be indexed by node id'); 94 | $this->assertSame($input[1], $output['12314513113'], 'Should have original coordinates'); 95 | 96 | $this->assertTrue(isset($output['13542524325']), 'Should be indexed by node id'); 97 | $this->assertSame($input[3], $output['13542524325'], 'Should have original coordinates'); 98 | } 99 | 100 | public function testSmallDataset() { 101 | 102 | $input = file_get_contents(__DIR__ . '/data/small.json'); 103 | $output = Overpass2Geojson::convertWays($input, false); 104 | 105 | $this->assertSame(2, count($output['features']), 'Should return 2 features'); 106 | 107 | $feature1 = $output['features'][0]; 108 | $feature2 = $output['features'][1]; 109 | $this->assertTrue(isset($feature1['type']), 'A feature should have type'); 110 | $this->assertSame('Feature', $feature1['type'], 'A feature should have type Feature'); 111 | 112 | $this->assertTrue(isset($feature1['geometry']), 'A feature should have geometry'); 113 | $this->assertTrue(is_array($feature1['geometry']), 'A feature should have a geometry array'); 114 | 115 | $this->assertTrue(isset($feature1['geometry']['type']), 'Geometry should have a type'); 116 | $this->assertSame('LineString', $feature1['geometry']['type'], 'Geometry should have type LineString'); 117 | 118 | $this->assertTrue(isset($feature1['properties']), 'A feature should have a properties array'); 119 | $tags = array( 120 | "access" => "yes", 121 | "ccc" => "cyclingpath", 122 | "foot" => "yes", 123 | "highway" => "residential", 124 | "maxspeed" => "50", 125 | "name" => "Worcester Street"); 126 | $this->assertSame($feature1['properties'], $tags, 'A feature\'s property array should contain all of its tags'); 127 | 128 | $this->assertTrue(isset($feature1['geometry']['coordinates']), 'Geometry should have coordinates'); 129 | $this->assertTrue(is_array($feature1['geometry']['coordinates']), 'Geometry should have a coordinates array'); 130 | 131 | $this->assertSame(2, count($feature1['geometry']['coordinates']), 'Feature should have same number of coordinates as original way'); 132 | $this->assertSame(5, count($feature2['geometry']['coordinates']), 'Feature should have same number of coordinates as original way'); 133 | 134 | $coords1 = $feature1['geometry']['coordinates']; 135 | $this->assertTrue(is_array($coords1[0]), 'Each coordinate should be an array'); 136 | $this->assertTrue(is_array($coords1[1]), 'Each coordinate should be an array'); 137 | 138 | $this->assertSame(array(172.6420391, -43.5309816), $coords1[0], 'Coordinate should match the original node coordinate'); 139 | $this->assertSame(array(172.6396892, -43.5309652), $coords1[1], 'Coordinate should match the original node coordinate'); 140 | } 141 | 142 | public function testIncompleteData() { 143 | $input = file_get_contents(__DIR__ . '/data/missingNodes.json'); 144 | $output = Overpass2Geojson::convertWays($input, false); 145 | 146 | $this->assertSame(1, count($output['features']), 'Should only create a feature for ways with more than 1 node'); 147 | $coords = $output['features'][0]['geometry']['coordinates']; 148 | $this->assertSame(3, count($coords), 'Feature should have as many coordinates as exist in data'); 149 | $this->assertSame(array(172.6427486, -43.5309800), $coords[0], 'Coordinate should match the original node coordinate'); 150 | } 151 | 152 | public function testConvertNodes() { 153 | 154 | $input = file_get_contents(__DIR__ . '/data/small.json'); 155 | $output = Overpass2Geojson::convertNodes($input, false); 156 | 157 | $this->assertSame(6, count($output['features']), 'Should return 6 features'); 158 | 159 | $feature1 = $output['features'][0]; 160 | $feature2 = $output['features'][1]; 161 | $this->assertTrue(isset($feature1['type']), 'A feature should have type'); 162 | $this->assertSame('Feature', $feature1['type'], 'A feature should have type Feature'); 163 | 164 | $this->assertTrue(isset($feature1['geometry']), 'A feature should have geometry'); 165 | $this->assertTrue(is_array($feature1['geometry']), 'A feature should have a geometry array'); 166 | 167 | $this->assertTrue(isset($feature1['geometry']['type']), 'Geometry should have a type'); 168 | $this->assertSame('Point', $feature1['geometry']['type'], 'Geometry should have type Point'); 169 | 170 | $this->assertTrue(isset($feature1['geometry']['coordinates']), 'Geometry should have coordinates'); 171 | $this->assertTrue(is_array($feature1['geometry']['coordinates']), 'Geometry should have a coordinates array'); 172 | 173 | $this->assertSame(2, count($feature1['geometry']['coordinates']), 'First Point should have 2 coordinates'); 174 | $this->assertSame(2, count($feature2['geometry']['coordinates']), 'Second Point should have 2 coordinates'); 175 | 176 | $coords1 = $feature1['geometry']['coordinates']; 177 | $this->assertTrue(is_numeric($coords1[0]), 'Each coordinate should be a number'); 178 | $this->assertTrue(is_numeric($coords1[1]), 'Each coordinate should be a number'); 179 | 180 | $this->assertSame(172.6420391, $coords1[0], 'Coordinate should match the original node coordinate'); 181 | $this->assertSame(-43.5309816, $coords1[1], 'Coordinate should match the original node coordinate'); 182 | 183 | $this->assertTrue(isset($feature1['properties']), 'Feature should have properties'); 184 | $this->assertTrue(isset($feature2['properties']), 'Feature should have properties'); 185 | $this->assertTrue(is_array($feature1['properties']), 'Feature should have a properties array'); 186 | $this->assertTrue(is_array($feature2['properties']), 'Feature should have a properties array'); 187 | 188 | $this->assertSame(0, count($feature1['properties']), 'First feature should have no property values'); 189 | $this->assertSame(3, count($feature2['properties']), 'Second feature should have 3 properties matching original node'); 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "766f1d07b7fd8576a15b8f513daa5b69", 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": "phpdocumentor/reflection-docblock", 66 | "version": "2.0.4", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 70 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", 75 | "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "php": ">=5.3.3" 80 | }, 81 | "require-dev": { 82 | "phpunit/phpunit": "~4.0" 83 | }, 84 | "suggest": { 85 | "dflydev/markdown": "~1.0", 86 | "erusev/parsedown": "~1.0" 87 | }, 88 | "type": "library", 89 | "extra": { 90 | "branch-alias": { 91 | "dev-master": "2.0.x-dev" 92 | } 93 | }, 94 | "autoload": { 95 | "psr-0": { 96 | "phpDocumentor": [ 97 | "src/" 98 | ] 99 | } 100 | }, 101 | "notification-url": "https://packagist.org/downloads/", 102 | "license": [ 103 | "MIT" 104 | ], 105 | "authors": [ 106 | { 107 | "name": "Mike van Riel", 108 | "email": "mike.vanriel@naenius.com" 109 | } 110 | ], 111 | "time": "2015-02-03 12:10:50" 112 | }, 113 | { 114 | "name": "phpspec/prophecy", 115 | "version": "v1.3.1", 116 | "source": { 117 | "type": "git", 118 | "url": "https://github.com/phpspec/prophecy.git", 119 | "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9" 120 | }, 121 | "dist": { 122 | "type": "zip", 123 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/9ca52329bcdd1500de24427542577ebf3fc2f1c9", 124 | "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9", 125 | "shasum": "" 126 | }, 127 | "require": { 128 | "doctrine/instantiator": "~1.0,>=1.0.2", 129 | "phpdocumentor/reflection-docblock": "~2.0" 130 | }, 131 | "require-dev": { 132 | "phpspec/phpspec": "~2.0" 133 | }, 134 | "type": "library", 135 | "extra": { 136 | "branch-alias": { 137 | "dev-master": "1.2.x-dev" 138 | } 139 | }, 140 | "autoload": { 141 | "psr-0": { 142 | "Prophecy\\": "src/" 143 | } 144 | }, 145 | "notification-url": "https://packagist.org/downloads/", 146 | "license": [ 147 | "MIT" 148 | ], 149 | "authors": [ 150 | { 151 | "name": "Konstantin Kudryashov", 152 | "email": "ever.zet@gmail.com", 153 | "homepage": "http://everzet.com" 154 | }, 155 | { 156 | "name": "Marcello Duarte", 157 | "email": "marcello.duarte@gmail.com" 158 | } 159 | ], 160 | "description": "Highly opinionated mocking framework for PHP 5.3+", 161 | "homepage": "http://phpspec.org", 162 | "keywords": [ 163 | "Double", 164 | "Dummy", 165 | "fake", 166 | "mock", 167 | "spy", 168 | "stub" 169 | ], 170 | "time": "2014-11-17 16:23:49" 171 | }, 172 | { 173 | "name": "phpunit/php-code-coverage", 174 | "version": "2.0.15", 175 | "source": { 176 | "type": "git", 177 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 178 | "reference": "34cc484af1ca149188d0d9e91412191e398e0b67" 179 | }, 180 | "dist": { 181 | "type": "zip", 182 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67", 183 | "reference": "34cc484af1ca149188d0d9e91412191e398e0b67", 184 | "shasum": "" 185 | }, 186 | "require": { 187 | "php": ">=5.3.3", 188 | "phpunit/php-file-iterator": "~1.3", 189 | "phpunit/php-text-template": "~1.2", 190 | "phpunit/php-token-stream": "~1.3", 191 | "sebastian/environment": "~1.0", 192 | "sebastian/version": "~1.0" 193 | }, 194 | "require-dev": { 195 | "ext-xdebug": ">=2.1.4", 196 | "phpunit/phpunit": "~4" 197 | }, 198 | "suggest": { 199 | "ext-dom": "*", 200 | "ext-xdebug": ">=2.2.1", 201 | "ext-xmlwriter": "*" 202 | }, 203 | "type": "library", 204 | "extra": { 205 | "branch-alias": { 206 | "dev-master": "2.0.x-dev" 207 | } 208 | }, 209 | "autoload": { 210 | "classmap": [ 211 | "src/" 212 | ] 213 | }, 214 | "notification-url": "https://packagist.org/downloads/", 215 | "license": [ 216 | "BSD-3-Clause" 217 | ], 218 | "authors": [ 219 | { 220 | "name": "Sebastian Bergmann", 221 | "email": "sb@sebastian-bergmann.de", 222 | "role": "lead" 223 | } 224 | ], 225 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 226 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 227 | "keywords": [ 228 | "coverage", 229 | "testing", 230 | "xunit" 231 | ], 232 | "time": "2015-01-24 10:06:35" 233 | }, 234 | { 235 | "name": "phpunit/php-file-iterator", 236 | "version": "1.3.4", 237 | "source": { 238 | "type": "git", 239 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 240 | "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" 241 | }, 242 | "dist": { 243 | "type": "zip", 244 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", 245 | "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", 246 | "shasum": "" 247 | }, 248 | "require": { 249 | "php": ">=5.3.3" 250 | }, 251 | "type": "library", 252 | "autoload": { 253 | "classmap": [ 254 | "File/" 255 | ] 256 | }, 257 | "notification-url": "https://packagist.org/downloads/", 258 | "include-path": [ 259 | "" 260 | ], 261 | "license": [ 262 | "BSD-3-Clause" 263 | ], 264 | "authors": [ 265 | { 266 | "name": "Sebastian Bergmann", 267 | "email": "sb@sebastian-bergmann.de", 268 | "role": "lead" 269 | } 270 | ], 271 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 272 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 273 | "keywords": [ 274 | "filesystem", 275 | "iterator" 276 | ], 277 | "time": "2013-10-10 15:34:57" 278 | }, 279 | { 280 | "name": "phpunit/php-text-template", 281 | "version": "1.2.0", 282 | "source": { 283 | "type": "git", 284 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 285 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" 286 | }, 287 | "dist": { 288 | "type": "zip", 289 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 290 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 291 | "shasum": "" 292 | }, 293 | "require": { 294 | "php": ">=5.3.3" 295 | }, 296 | "type": "library", 297 | "autoload": { 298 | "classmap": [ 299 | "Text/" 300 | ] 301 | }, 302 | "notification-url": "https://packagist.org/downloads/", 303 | "include-path": [ 304 | "" 305 | ], 306 | "license": [ 307 | "BSD-3-Clause" 308 | ], 309 | "authors": [ 310 | { 311 | "name": "Sebastian Bergmann", 312 | "email": "sb@sebastian-bergmann.de", 313 | "role": "lead" 314 | } 315 | ], 316 | "description": "Simple template engine.", 317 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 318 | "keywords": [ 319 | "template" 320 | ], 321 | "time": "2014-01-30 17:20:04" 322 | }, 323 | { 324 | "name": "phpunit/php-timer", 325 | "version": "1.0.5", 326 | "source": { 327 | "type": "git", 328 | "url": "https://github.com/sebastianbergmann/php-timer.git", 329 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" 330 | }, 331 | "dist": { 332 | "type": "zip", 333 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 334 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 335 | "shasum": "" 336 | }, 337 | "require": { 338 | "php": ">=5.3.3" 339 | }, 340 | "type": "library", 341 | "autoload": { 342 | "classmap": [ 343 | "PHP/" 344 | ] 345 | }, 346 | "notification-url": "https://packagist.org/downloads/", 347 | "include-path": [ 348 | "" 349 | ], 350 | "license": [ 351 | "BSD-3-Clause" 352 | ], 353 | "authors": [ 354 | { 355 | "name": "Sebastian Bergmann", 356 | "email": "sb@sebastian-bergmann.de", 357 | "role": "lead" 358 | } 359 | ], 360 | "description": "Utility class for timing", 361 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 362 | "keywords": [ 363 | "timer" 364 | ], 365 | "time": "2013-08-02 07:42:54" 366 | }, 367 | { 368 | "name": "phpunit/php-token-stream", 369 | "version": "1.4.0", 370 | "source": { 371 | "type": "git", 372 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 373 | "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74" 374 | }, 375 | "dist": { 376 | "type": "zip", 377 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74", 378 | "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74", 379 | "shasum": "" 380 | }, 381 | "require": { 382 | "ext-tokenizer": "*", 383 | "php": ">=5.3.3" 384 | }, 385 | "require-dev": { 386 | "phpunit/phpunit": "~4.2" 387 | }, 388 | "type": "library", 389 | "extra": { 390 | "branch-alias": { 391 | "dev-master": "1.4-dev" 392 | } 393 | }, 394 | "autoload": { 395 | "classmap": [ 396 | "src/" 397 | ] 398 | }, 399 | "notification-url": "https://packagist.org/downloads/", 400 | "license": [ 401 | "BSD-3-Clause" 402 | ], 403 | "authors": [ 404 | { 405 | "name": "Sebastian Bergmann", 406 | "email": "sebastian@phpunit.de" 407 | } 408 | ], 409 | "description": "Wrapper around PHP's tokenizer extension.", 410 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 411 | "keywords": [ 412 | "tokenizer" 413 | ], 414 | "time": "2015-01-17 09:51:32" 415 | }, 416 | { 417 | "name": "phpunit/phpunit", 418 | "version": "4.5.0", 419 | "source": { 420 | "type": "git", 421 | "url": "https://github.com/sebastianbergmann/phpunit.git", 422 | "reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5" 423 | }, 424 | "dist": { 425 | "type": "zip", 426 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5b578d3865a9128b9c209b011fda6539ec06e7a5", 427 | "reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5", 428 | "shasum": "" 429 | }, 430 | "require": { 431 | "ext-dom": "*", 432 | "ext-json": "*", 433 | "ext-pcre": "*", 434 | "ext-reflection": "*", 435 | "ext-spl": "*", 436 | "php": ">=5.3.3", 437 | "phpspec/prophecy": "~1.3.1", 438 | "phpunit/php-code-coverage": "~2.0", 439 | "phpunit/php-file-iterator": "~1.3.2", 440 | "phpunit/php-text-template": "~1.2", 441 | "phpunit/php-timer": "~1.0.2", 442 | "phpunit/phpunit-mock-objects": "~2.3", 443 | "sebastian/comparator": "~1.1", 444 | "sebastian/diff": "~1.1", 445 | "sebastian/environment": "~1.2", 446 | "sebastian/exporter": "~1.2", 447 | "sebastian/global-state": "~1.0", 448 | "sebastian/version": "~1.0", 449 | "symfony/yaml": "~2.0" 450 | }, 451 | "suggest": { 452 | "phpunit/php-invoker": "~1.1" 453 | }, 454 | "bin": [ 455 | "phpunit" 456 | ], 457 | "type": "library", 458 | "extra": { 459 | "branch-alias": { 460 | "dev-master": "4.5.x-dev" 461 | } 462 | }, 463 | "autoload": { 464 | "classmap": [ 465 | "src/" 466 | ] 467 | }, 468 | "notification-url": "https://packagist.org/downloads/", 469 | "license": [ 470 | "BSD-3-Clause" 471 | ], 472 | "authors": [ 473 | { 474 | "name": "Sebastian Bergmann", 475 | "email": "sebastian@phpunit.de", 476 | "role": "lead" 477 | } 478 | ], 479 | "description": "The PHP Unit Testing framework.", 480 | "homepage": "https://phpunit.de/", 481 | "keywords": [ 482 | "phpunit", 483 | "testing", 484 | "xunit" 485 | ], 486 | "time": "2015-02-05 15:51:19" 487 | }, 488 | { 489 | "name": "phpunit/phpunit-mock-objects", 490 | "version": "2.3.0", 491 | "source": { 492 | "type": "git", 493 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 494 | "reference": "c63d2367247365f688544f0d500af90a11a44c65" 495 | }, 496 | "dist": { 497 | "type": "zip", 498 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65", 499 | "reference": "c63d2367247365f688544f0d500af90a11a44c65", 500 | "shasum": "" 501 | }, 502 | "require": { 503 | "doctrine/instantiator": "~1.0,>=1.0.1", 504 | "php": ">=5.3.3", 505 | "phpunit/php-text-template": "~1.2" 506 | }, 507 | "require-dev": { 508 | "phpunit/phpunit": "~4.3" 509 | }, 510 | "suggest": { 511 | "ext-soap": "*" 512 | }, 513 | "type": "library", 514 | "extra": { 515 | "branch-alias": { 516 | "dev-master": "2.3.x-dev" 517 | } 518 | }, 519 | "autoload": { 520 | "classmap": [ 521 | "src/" 522 | ] 523 | }, 524 | "notification-url": "https://packagist.org/downloads/", 525 | "license": [ 526 | "BSD-3-Clause" 527 | ], 528 | "authors": [ 529 | { 530 | "name": "Sebastian Bergmann", 531 | "email": "sb@sebastian-bergmann.de", 532 | "role": "lead" 533 | } 534 | ], 535 | "description": "Mock Object library for PHPUnit", 536 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 537 | "keywords": [ 538 | "mock", 539 | "xunit" 540 | ], 541 | "time": "2014-10-03 05:12:11" 542 | }, 543 | { 544 | "name": "sebastian/comparator", 545 | "version": "1.1.1", 546 | "source": { 547 | "type": "git", 548 | "url": "https://github.com/sebastianbergmann/comparator.git", 549 | "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" 550 | }, 551 | "dist": { 552 | "type": "zip", 553 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", 554 | "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", 555 | "shasum": "" 556 | }, 557 | "require": { 558 | "php": ">=5.3.3", 559 | "sebastian/diff": "~1.2", 560 | "sebastian/exporter": "~1.2" 561 | }, 562 | "require-dev": { 563 | "phpunit/phpunit": "~4.4" 564 | }, 565 | "type": "library", 566 | "extra": { 567 | "branch-alias": { 568 | "dev-master": "1.1.x-dev" 569 | } 570 | }, 571 | "autoload": { 572 | "classmap": [ 573 | "src/" 574 | ] 575 | }, 576 | "notification-url": "https://packagist.org/downloads/", 577 | "license": [ 578 | "BSD-3-Clause" 579 | ], 580 | "authors": [ 581 | { 582 | "name": "Jeff Welch", 583 | "email": "whatthejeff@gmail.com" 584 | }, 585 | { 586 | "name": "Volker Dusch", 587 | "email": "github@wallbash.com" 588 | }, 589 | { 590 | "name": "Bernhard Schussek", 591 | "email": "bschussek@2bepublished.at" 592 | }, 593 | { 594 | "name": "Sebastian Bergmann", 595 | "email": "sebastian@phpunit.de" 596 | } 597 | ], 598 | "description": "Provides the functionality to compare PHP values for equality", 599 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 600 | "keywords": [ 601 | "comparator", 602 | "compare", 603 | "equality" 604 | ], 605 | "time": "2015-01-29 16:28:08" 606 | }, 607 | { 608 | "name": "sebastian/diff", 609 | "version": "1.2.0", 610 | "source": { 611 | "type": "git", 612 | "url": "https://github.com/sebastianbergmann/diff.git", 613 | "reference": "5843509fed39dee4b356a306401e9dd1a931fec7" 614 | }, 615 | "dist": { 616 | "type": "zip", 617 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7", 618 | "reference": "5843509fed39dee4b356a306401e9dd1a931fec7", 619 | "shasum": "" 620 | }, 621 | "require": { 622 | "php": ">=5.3.3" 623 | }, 624 | "require-dev": { 625 | "phpunit/phpunit": "~4.2" 626 | }, 627 | "type": "library", 628 | "extra": { 629 | "branch-alias": { 630 | "dev-master": "1.2-dev" 631 | } 632 | }, 633 | "autoload": { 634 | "classmap": [ 635 | "src/" 636 | ] 637 | }, 638 | "notification-url": "https://packagist.org/downloads/", 639 | "license": [ 640 | "BSD-3-Clause" 641 | ], 642 | "authors": [ 643 | { 644 | "name": "Kore Nordmann", 645 | "email": "mail@kore-nordmann.de" 646 | }, 647 | { 648 | "name": "Sebastian Bergmann", 649 | "email": "sebastian@phpunit.de" 650 | } 651 | ], 652 | "description": "Diff implementation", 653 | "homepage": "http://www.github.com/sebastianbergmann/diff", 654 | "keywords": [ 655 | "diff" 656 | ], 657 | "time": "2014-08-15 10:29:00" 658 | }, 659 | { 660 | "name": "sebastian/environment", 661 | "version": "1.2.1", 662 | "source": { 663 | "type": "git", 664 | "url": "https://github.com/sebastianbergmann/environment.git", 665 | "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7" 666 | }, 667 | "dist": { 668 | "type": "zip", 669 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7", 670 | "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7", 671 | "shasum": "" 672 | }, 673 | "require": { 674 | "php": ">=5.3.3" 675 | }, 676 | "require-dev": { 677 | "phpunit/phpunit": "~4.3" 678 | }, 679 | "type": "library", 680 | "extra": { 681 | "branch-alias": { 682 | "dev-master": "1.2.x-dev" 683 | } 684 | }, 685 | "autoload": { 686 | "classmap": [ 687 | "src/" 688 | ] 689 | }, 690 | "notification-url": "https://packagist.org/downloads/", 691 | "license": [ 692 | "BSD-3-Clause" 693 | ], 694 | "authors": [ 695 | { 696 | "name": "Sebastian Bergmann", 697 | "email": "sebastian@phpunit.de" 698 | } 699 | ], 700 | "description": "Provides functionality to handle HHVM/PHP environments", 701 | "homepage": "http://www.github.com/sebastianbergmann/environment", 702 | "keywords": [ 703 | "Xdebug", 704 | "environment", 705 | "hhvm" 706 | ], 707 | "time": "2014-10-25 08:00:45" 708 | }, 709 | { 710 | "name": "sebastian/exporter", 711 | "version": "1.2.0", 712 | "source": { 713 | "type": "git", 714 | "url": "https://github.com/sebastianbergmann/exporter.git", 715 | "reference": "84839970d05254c73cde183a721c7af13aede943" 716 | }, 717 | "dist": { 718 | "type": "zip", 719 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", 720 | "reference": "84839970d05254c73cde183a721c7af13aede943", 721 | "shasum": "" 722 | }, 723 | "require": { 724 | "php": ">=5.3.3", 725 | "sebastian/recursion-context": "~1.0" 726 | }, 727 | "require-dev": { 728 | "phpunit/phpunit": "~4.4" 729 | }, 730 | "type": "library", 731 | "extra": { 732 | "branch-alias": { 733 | "dev-master": "1.2.x-dev" 734 | } 735 | }, 736 | "autoload": { 737 | "classmap": [ 738 | "src/" 739 | ] 740 | }, 741 | "notification-url": "https://packagist.org/downloads/", 742 | "license": [ 743 | "BSD-3-Clause" 744 | ], 745 | "authors": [ 746 | { 747 | "name": "Jeff Welch", 748 | "email": "whatthejeff@gmail.com" 749 | }, 750 | { 751 | "name": "Volker Dusch", 752 | "email": "github@wallbash.com" 753 | }, 754 | { 755 | "name": "Bernhard Schussek", 756 | "email": "bschussek@2bepublished.at" 757 | }, 758 | { 759 | "name": "Sebastian Bergmann", 760 | "email": "sebastian@phpunit.de" 761 | }, 762 | { 763 | "name": "Adam Harvey", 764 | "email": "aharvey@php.net" 765 | } 766 | ], 767 | "description": "Provides the functionality to export PHP variables for visualization", 768 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 769 | "keywords": [ 770 | "export", 771 | "exporter" 772 | ], 773 | "time": "2015-01-27 07:23:06" 774 | }, 775 | { 776 | "name": "sebastian/global-state", 777 | "version": "1.0.0", 778 | "source": { 779 | "type": "git", 780 | "url": "https://github.com/sebastianbergmann/global-state.git", 781 | "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" 782 | }, 783 | "dist": { 784 | "type": "zip", 785 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", 786 | "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", 787 | "shasum": "" 788 | }, 789 | "require": { 790 | "php": ">=5.3.3" 791 | }, 792 | "require-dev": { 793 | "phpunit/phpunit": "~4.2" 794 | }, 795 | "suggest": { 796 | "ext-uopz": "*" 797 | }, 798 | "type": "library", 799 | "extra": { 800 | "branch-alias": { 801 | "dev-master": "1.0-dev" 802 | } 803 | }, 804 | "autoload": { 805 | "classmap": [ 806 | "src/" 807 | ] 808 | }, 809 | "notification-url": "https://packagist.org/downloads/", 810 | "license": [ 811 | "BSD-3-Clause" 812 | ], 813 | "authors": [ 814 | { 815 | "name": "Sebastian Bergmann", 816 | "email": "sebastian@phpunit.de" 817 | } 818 | ], 819 | "description": "Snapshotting of global state", 820 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 821 | "keywords": [ 822 | "global state" 823 | ], 824 | "time": "2014-10-06 09:23:50" 825 | }, 826 | { 827 | "name": "sebastian/recursion-context", 828 | "version": "1.0.0", 829 | "source": { 830 | "type": "git", 831 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 832 | "reference": "3989662bbb30a29d20d9faa04a846af79b276252" 833 | }, 834 | "dist": { 835 | "type": "zip", 836 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", 837 | "reference": "3989662bbb30a29d20d9faa04a846af79b276252", 838 | "shasum": "" 839 | }, 840 | "require": { 841 | "php": ">=5.3.3" 842 | }, 843 | "require-dev": { 844 | "phpunit/phpunit": "~4.4" 845 | }, 846 | "type": "library", 847 | "extra": { 848 | "branch-alias": { 849 | "dev-master": "1.0.x-dev" 850 | } 851 | }, 852 | "autoload": { 853 | "classmap": [ 854 | "src/" 855 | ] 856 | }, 857 | "notification-url": "https://packagist.org/downloads/", 858 | "license": [ 859 | "BSD-3-Clause" 860 | ], 861 | "authors": [ 862 | { 863 | "name": "Jeff Welch", 864 | "email": "whatthejeff@gmail.com" 865 | }, 866 | { 867 | "name": "Sebastian Bergmann", 868 | "email": "sebastian@phpunit.de" 869 | }, 870 | { 871 | "name": "Adam Harvey", 872 | "email": "aharvey@php.net" 873 | } 874 | ], 875 | "description": "Provides functionality to recursively process PHP variables", 876 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 877 | "time": "2015-01-24 09:48:32" 878 | }, 879 | { 880 | "name": "sebastian/version", 881 | "version": "1.0.4", 882 | "source": { 883 | "type": "git", 884 | "url": "https://github.com/sebastianbergmann/version.git", 885 | "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b" 886 | }, 887 | "dist": { 888 | "type": "zip", 889 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b", 890 | "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b", 891 | "shasum": "" 892 | }, 893 | "type": "library", 894 | "autoload": { 895 | "classmap": [ 896 | "src/" 897 | ] 898 | }, 899 | "notification-url": "https://packagist.org/downloads/", 900 | "license": [ 901 | "BSD-3-Clause" 902 | ], 903 | "authors": [ 904 | { 905 | "name": "Sebastian Bergmann", 906 | "email": "sebastian@phpunit.de", 907 | "role": "lead" 908 | } 909 | ], 910 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 911 | "homepage": "https://github.com/sebastianbergmann/version", 912 | "time": "2014-12-15 14:25:24" 913 | }, 914 | { 915 | "name": "symfony/yaml", 916 | "version": "v2.6.4", 917 | "target-dir": "Symfony/Component/Yaml", 918 | "source": { 919 | "type": "git", 920 | "url": "https://github.com/symfony/Yaml.git", 921 | "reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8" 922 | }, 923 | "dist": { 924 | "type": "zip", 925 | "url": "https://api.github.com/repos/symfony/Yaml/zipball/60ed7751671113cf1ee7d7778e691642c2e9acd8", 926 | "reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8", 927 | "shasum": "" 928 | }, 929 | "require": { 930 | "php": ">=5.3.3" 931 | }, 932 | "type": "library", 933 | "extra": { 934 | "branch-alias": { 935 | "dev-master": "2.6-dev" 936 | } 937 | }, 938 | "autoload": { 939 | "psr-0": { 940 | "Symfony\\Component\\Yaml\\": "" 941 | } 942 | }, 943 | "notification-url": "https://packagist.org/downloads/", 944 | "license": [ 945 | "MIT" 946 | ], 947 | "authors": [ 948 | { 949 | "name": "Symfony Community", 950 | "homepage": "http://symfony.com/contributors" 951 | }, 952 | { 953 | "name": "Fabien Potencier", 954 | "email": "fabien@symfony.com" 955 | } 956 | ], 957 | "description": "Symfony Yaml Component", 958 | "homepage": "http://symfony.com", 959 | "time": "2015-01-25 04:39:26" 960 | } 961 | ], 962 | "aliases": [], 963 | "minimum-stability": "stable", 964 | "stability-flags": [], 965 | "prefer-stable": false, 966 | "platform": [], 967 | "platform-dev": [] 968 | } 969 | --------------------------------------------------------------------------------