├── .gitignore ├── phpunit.xml ├── composer.json ├── tests └── AngryCreative │ ├── CoreTest.php │ ├── PluginTest.php │ └── ThemeTest.php ├── README.md ├── src └── AngryCreative │ ├── Core.php │ ├── Theme.php │ ├── Plugin.php │ ├── T10ns.php │ └── PostUpdateLanguageUpdate.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | vendor/ 3 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ./tests/AngryCreative 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Angrycreative/composer-plugin-language-update", 3 | "description": "Update translations for WP core, themes and plugins where managed by composer.", 4 | "keywords": [ 5 | "WordPress", 6 | "Composer", 7 | "Plugins", 8 | "Themes" 9 | ], 10 | "homepage": "https://angrycreative.com", 11 | "version": "0.1.2", 12 | "license": "GPL-2.0+", 13 | "authors": [ 14 | { 15 | "name": "Angry Creative AB", 16 | "email": "hej@angrycreative.se", 17 | "homepage": "https://angrycreative.se" 18 | }, 19 | { 20 | "name": "Richard Sweeney", 21 | "email": "richard.sweeney@angrycreative.se", 22 | "homepage": "https://angrycreative.se" 23 | } 24 | ], 25 | "autoload": { 26 | "psr-4": {"AngryCreative\\": "src/AngryCreative"} 27 | }, 28 | "require": { 29 | "php": ">=7.0", 30 | "guzzlehttp/guzzle": "~6.0" 31 | }, 32 | "require-dev": { 33 | "phpunit/phpunit": "*" 34 | }, 35 | "scripts": { 36 | "test": [ 37 | "@composer install", 38 | "phpunit" 39 | ], 40 | "tests": [ 41 | "@composer run test" 42 | ] 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /tests/AngryCreative/CoreTest.php: -------------------------------------------------------------------------------- 1 | assertEquals( $dir . '/languages', $core->get_dest_path( 'core', $dir ) ); 23 | 24 | $result = $core->fetch_t10ns(); 25 | $this->assertInternalType( 'array', $result ); 26 | $this->assertNotEmpty( $result ); 27 | 28 | $this->assertFileExists( $core->get_dest_path( 'core', $dir ) ); 29 | $this->assertFileExists( $core->get_dest_path( 'core', $dir ) . '/sv_SE.mo' ); 30 | $this->assertFileExists( $core->get_dest_path( 'core', $dir ) . '/sv_SE.po' ); 31 | $this->assertFileExists( $core->get_dest_path( 'core', $dir ) . '/admin-sv_SE.mo' ); 32 | $this->assertFileExists( $core->get_dest_path( 'core', $dir ) . '/admin-sv_SE.po' ); 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /tests/AngryCreative/PluginTest.php: -------------------------------------------------------------------------------- 1 | assertInternalType( 'array', $plugin->get_languages() ); 23 | $this->assertNotEmpty( $plugin->get_languages() ); 24 | 25 | $this->assertInternalType( 'array', $plugin->get_t10ns() ); 26 | $this->assertNotEmpty( $plugin->get_t10ns() ); 27 | 28 | $this->assertEquals( $dir . '/languages/plugins', $plugin->get_dest_path( 'plugin', $dir ) ); 29 | 30 | $result = $plugin->fetch_t10ns(); 31 | $this->assertInternalType( 'array', $result ); 32 | $this->assertNotEmpty( $result ); 33 | 34 | $this->assertFileExists( $plugin->get_dest_path( 'plugin', $dir ) ); 35 | $this->assertFileExists( $plugin->get_dest_path( 'plugin', $dir ) . '/redirection-sv_SE.mo' ); 36 | $this->assertFileExists( $plugin->get_dest_path( 'plugin', $dir ) . '/redirection-sv_SE.po' ); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /tests/AngryCreative/ThemeTest.php: -------------------------------------------------------------------------------- 1 | assertInternalType( 'array', $theme->get_languages() ); 23 | $this->assertNotEmpty( $theme->get_languages() ); 24 | $this->assertEquals( $theme->get_languages(), [ 'sv_SE' ] ); 25 | 26 | $this->assertInternalType( 'array', $theme->get_t10ns() ); 27 | $this->assertNotEmpty( $theme->get_t10ns() ); 28 | 29 | $this->assertEquals( $dir . '/languages/themes', $theme->get_dest_path( 'theme', $dir ) ); 30 | 31 | $result = $theme->fetch_t10ns(); 32 | $this->assertInternalType( 'array', $result ); 33 | $this->assertNotEmpty( $result ); 34 | 35 | $this->assertFileExists( $theme->get_dest_path( 'theme', $dir ) ); 36 | $this->assertFileExists( $theme->get_dest_path( 'theme', $dir ) . '/twentytwelve-sv_SE.mo' ); 37 | $this->assertFileExists( $theme->get_dest_path( 'theme', $dir ) . '/twentytwelve-sv_SE.po' ); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Composer Auto Language Updates 2 | 3 | This package will automatically update translations for WordPress core, themes & plugins when you install or update them via composer.* 4 | 5 | Made with :heart: by [Angry Creative](https://angrycreative.se) in Sweden. 6 | 7 | *\* This only works if the translations are available via the WordPress API.* 8 | 9 | ## Installation instructions 10 | 11 | #### 1. Add this repository as a composer dependency 12 | 13 | First, add this .git repo to the `repositories` array in your sites main `composer.json` file. 14 | 15 | ```json 16 | { 17 | "type": "git", 18 | "url": "https://github.com/Angrycreative/composer-plugin-language-update.git" 19 | } 20 | ``` 21 | 22 | #### 2. Require the package. 23 | 24 | Run `composer require Angrycreative/composer-plugin-language-update:"*"`. 25 | 26 | #### 3. Define the languages used on your site and the path to your wp-content directory. 27 | 28 | This can be done by adding the following parameters to the extras object in your sites' main `composer.json` file. 29 | 30 | ```json 31 | "extra": { 32 | "wordpress-languages": [ "sv_SE", "en_GB", "da_DK" ], 33 | "wordpress-path-to-content-dir": "public/wp-content" 34 | } 35 | ``` 36 | 37 | (We need to add a list of locales manually as this operation cannot rely on having a connection to the database available). 38 | 39 | #### 4. Add the required composer install hooks. 40 | 41 | Add the following lines to the `scripts` section of your `composer.json`. 42 | 43 | ```json 44 | "scripts": { 45 | "post-package-install": [ 46 | "AngryCreative\\PostUpdateLanguageUpdate::install_t10ns" 47 | ], 48 | "post-package-update": [ 49 | "AngryCreative\\PostUpdateLanguageUpdate::update_t10ns" 50 | ] 51 | } 52 | ``` 53 | 54 | That's it. Next time you run a `composer update|install` the translations for the relevant packages will be installed automatically. 55 | 56 | ### Tests 57 | 58 | If you're testing, this package must be installed as a part of WordPress installation. You should ideally remove the entire `wp-content/languages` directory, so as to make sure the package behaves as expected. 59 | 60 | Obviously you should probably do this on seperate branch, so you don't remove t10ns accidentaly when you run the tests. 61 | 62 | `cd` into the packagage directory and run `composer test`. 63 | 64 | You **may** need to run the tests as root to avoid permissions errors when creating the directories. 65 | 66 | ### WTF? 67 | 68 | #### I can haz missing translation plz? 69 | 70 | This only works if the t10ns are found on the WordPress API, eg. https://api.wordpress.org/translations/plugins/1.0/?slug=redirection&version=2.7.3 71 | 72 | #### I can haz clean up after you? 73 | 74 | At the moment the translations are _not_ removed on `composer uninstall`. Pull requests welcome! 75 | 76 | #### I can haz missing feature plz? 77 | 78 | Sure thing! This is GitHub so just make us a pull request and we'll work together on making that happen. 79 | -------------------------------------------------------------------------------- /src/AngryCreative/Core.php: -------------------------------------------------------------------------------- 1 | version = $version; 66 | $this->languages = $languages; 67 | $this->wp_content_path = $wp_content_path; 68 | 69 | try { 70 | $this->t10ns = $this->get_available_t10ns( $this->api_url, $this->version ); 71 | } catch ( \Exception $e ) { 72 | throw new \Exception( $e->getMessage() ); 73 | } 74 | } 75 | 76 | /** 77 | * @return array 78 | */ 79 | public function get_languages() : array { 80 | return $this->languages; 81 | } 82 | 83 | /** 84 | * @return array 85 | */ 86 | public function get_t10ns() : array { 87 | return $this->t10ns; 88 | } 89 | 90 | /** 91 | * Fetch all available t10ns for Core. 92 | * 93 | * @return array 94 | */ 95 | public function fetch_t10ns() : array { 96 | $results = []; 97 | 98 | foreach ( $this->languages as $language ) { 99 | try { 100 | $this->fetch_core_t10ns( $language ); 101 | $results[] = $language; 102 | 103 | } catch ( \Exception $e ) { 104 | // Maybe we should do something here?! 105 | } 106 | } 107 | 108 | return $results; 109 | } 110 | 111 | /** 112 | * Fetch and move core t10ns to the correct directory. 113 | * 114 | * @param string $language Eg. 'sv_SE'. 115 | * 116 | * @throws \Exception 117 | * @return bool 118 | */ 119 | protected function fetch_core_t10ns( $language ) : bool { 120 | $has_updated = false; 121 | 122 | foreach ( $this->t10ns as $t10n ) { 123 | if ( $t10n->language !== $language ) { 124 | continue; 125 | } 126 | 127 | try { 128 | $this->download_and_move_t10ns( 'core', $t10n->package, $this->wp_content_path ); 129 | $has_updated = true; 130 | 131 | } catch ( \Exception $e ) { 132 | throw new \Exception( $e->getMessage() ); 133 | 134 | } 135 | } 136 | 137 | return $has_updated; 138 | } 139 | 140 | } 141 | -------------------------------------------------------------------------------- /src/AngryCreative/Theme.php: -------------------------------------------------------------------------------- 1 | slug = $slug; 69 | $this->version = $version; 70 | $this->languages = $languages; 71 | $this->wp_content_path = $wp_content_path; 72 | 73 | try { 74 | $this->t10ns = $this->get_available_t10ns( $this->api_url, $this->version, $this->slug ); 75 | } catch ( \Exception $e ) { 76 | throw new \Exception( $e->getMessage() ); 77 | } 78 | } 79 | 80 | /** 81 | * @return array 82 | */ 83 | public function get_languages() : array { 84 | return $this->languages; 85 | } 86 | 87 | /** 88 | * @return array 89 | */ 90 | public function get_t10ns() : array { 91 | return $this->t10ns; 92 | } 93 | 94 | /** 95 | * Fetch all available t10ns for a theme. 96 | * 97 | * @return array 98 | */ 99 | public function fetch_t10ns() : array { 100 | $results = []; 101 | 102 | foreach ( $this->languages as $language ) { 103 | try { 104 | $result = $this->fetch_theme_t10ns( $language ); 105 | if ( $result ) { 106 | $results[] = $language; 107 | } 108 | } catch ( \Exception $e ) { 109 | // Maybe we should do something here?! 110 | } 111 | } 112 | 113 | return $results; 114 | } 115 | 116 | /** 117 | * Fetch and move a themes' t10ns to the correct 118 | * directory. 119 | * 120 | * @param string $language (locale) Eg. 'sv_SE'. 121 | * 122 | * @return bool True if the t10ns could be downloaded, or false. 123 | * 124 | * @throws \Exception 125 | */ 126 | protected function fetch_theme_t10ns( $language ) : bool { 127 | $has_updated = false; 128 | foreach ( $this->t10ns as $t10n ) { 129 | if ( $t10n->language !== $language ) { 130 | continue; 131 | } 132 | 133 | try { 134 | $this->download_and_move_t10ns( 'theme', $t10n->package, $this->wp_content_path ); 135 | $has_updated = true; 136 | 137 | } catch ( \Exception $e ) { 138 | throw new \Exception( $e->getMessage() ); 139 | 140 | } 141 | } 142 | 143 | return $has_updated; 144 | } 145 | 146 | } 147 | -------------------------------------------------------------------------------- /src/AngryCreative/Plugin.php: -------------------------------------------------------------------------------- 1 | slug = $slug; 74 | $this->version = $version; 75 | $this->languages = $languages; 76 | $this->wp_content_path = $wp_content_path; 77 | 78 | if ( empty( $this->languages ) || empty( $this->wp_content_path ) ) { 79 | throw new \Exception( 'Languages or wp_content_path empty' ); 80 | } 81 | 82 | try { 83 | $this->t10ns = $this->get_available_t10ns( $this->api_url, $this->version, $this->slug ); 84 | } catch ( \Exception $e ) { 85 | throw new \Exception( $e->getMessage() ); 86 | } 87 | } 88 | 89 | /** 90 | * @return array 91 | */ 92 | public function get_languages() : array { 93 | return $this->languages; 94 | } 95 | 96 | /** 97 | * @return array 98 | */ 99 | public function get_t10ns() : array { 100 | return $this->t10ns; 101 | } 102 | 103 | /** 104 | * Fetch all available t10ns for a plugin. 105 | * 106 | * @throws \Exception 107 | * @return array 108 | */ 109 | public function fetch_t10ns() : array { 110 | $results = []; 111 | 112 | foreach ( $this->languages as $language ) { 113 | try { 114 | $result = $this->fetch_plugin_t10ns( $language ); 115 | if ( $result ) { 116 | $results[] = $language; 117 | } 118 | } catch ( \Exception $e ) { 119 | // Maybe we should do something here?! 120 | } 121 | } 122 | 123 | return $results; 124 | } 125 | 126 | /** 127 | * Fetch and move a plugins' t10ns to the correct 128 | * directory. 129 | * 130 | * @param string $language Eg. 'sv_SE'. 131 | * 132 | * @throws \Exception 133 | * @return bool True if the t10ns could be downloaded, or false. 134 | */ 135 | protected function fetch_plugin_t10ns( $language ) : bool { 136 | $has_updated = false; 137 | foreach ( $this->t10ns as $t10n ) { 138 | if ( $t10n->language !== $language ) { 139 | continue; 140 | } 141 | 142 | try { 143 | $this->download_and_move_t10ns( 'plugin', $t10n->package, $this->wp_content_path ); 144 | $has_updated = true; 145 | 146 | } catch ( \Exception $e ) { 147 | throw new \Exception( $e->getMessage() ); 148 | 149 | } 150 | } 151 | 152 | return $has_updated; 153 | } 154 | 155 | } 156 | -------------------------------------------------------------------------------- /src/AngryCreative/T10ns.php: -------------------------------------------------------------------------------- 1 | request( 'GET', $api_url, [ 40 | 'query' => $query, 41 | ] ); 42 | 43 | if ( 200 !== $response->getStatusCode() ) { 44 | throw new \Exception( 'Got status code ' . $response->getStatusCode() ); 45 | } 46 | 47 | $body = json_decode( $response->getBody() ); 48 | 49 | if ( empty( $body->translations ) ) { 50 | throw new \Exception( 'No t10ns found' ); 51 | } 52 | 53 | return $body->translations; 54 | } 55 | 56 | /** 57 | * Fetch the available t10ns for the relevant languages via the API. 58 | * 59 | * @return array 60 | */ 61 | abstract public function fetch_t10ns() : array; 62 | 63 | /** 64 | * Get the destination path for a type of object: either 65 | * 'plugin', 'theme' or 'core'. 66 | * 67 | * This will also create the directory if if doesn't exist. 68 | * 69 | * @param string $type The object type. 70 | * @param string $wp_content_path The path to the wp_content directory. 71 | * 72 | * @throws \Exception 73 | * @return string path to the destination directory. 74 | */ 75 | public function get_dest_path( $type = 'plugin', $wp_content_path ) : string { 76 | $dest_path = $wp_content_path . '/languages'; 77 | 78 | if ( ! file_exists( $dest_path ) ) { 79 | $result = mkdir( $dest_path, 0775 ); 80 | if ( ! $result ) { 81 | throw new \Exception( 'Failed to create directory at: ' . $dest_path ); 82 | } 83 | } 84 | 85 | $path = ''; 86 | switch ( $type ) { 87 | case 'plugin' : 88 | $path = '/plugins'; 89 | break; 90 | 91 | case 'theme' : 92 | $path = '/themes'; 93 | break; 94 | } 95 | 96 | $dest_path .= $path; 97 | 98 | if ( ! file_exists( $dest_path ) ) { 99 | $result = mkdir( $dest_path, 0775 ); 100 | if ( ! $result ) { 101 | throw new \Exception( 'Failed to create directory at: ' . $dest_path ); 102 | } 103 | } 104 | 105 | return $dest_path; 106 | } 107 | 108 | /** 109 | * Download a zipped file of t10ns. 110 | * 111 | * @param string $url the URL to the zipped t10ns. 112 | * 113 | * @throws \Exception 114 | * @return string Path to the downloaded files. 115 | */ 116 | public function download_t10ns( $url ) : string { 117 | $client = new Client(); 118 | $tmp_name = sys_get_temp_dir() . '/' . basename( $url ); 119 | $request = $client->request( 'GET', $url, [ 120 | 'sink' => $tmp_name, 121 | ] ); 122 | 123 | if ( 200 !== $request->getStatusCode() ) { 124 | throw new \Exception( 'T10ns not found' ); 125 | } 126 | 127 | return $tmp_name; 128 | } 129 | 130 | /** 131 | * Unpack the downloaded t10ns and move to the correct path. 132 | * 133 | * @param string $t10n_files Path to the zipped t10n files. 134 | * @param string $dest_path Path to expand the zipped files to. 135 | * 136 | * @throws \Exception 137 | */ 138 | public function unpack_and_more_archived_t10ns( $t10n_files, $dest_path ) { 139 | $zip = new \ZipArchive(); 140 | 141 | if ( true === $zip->open( $t10n_files ) ) { 142 | for ( $i = 0; $i < $zip->numFiles; $i++ ) { 143 | $ok = $zip->extractTo( $dest_path, [ $zip->getNameIndex( $i ) ] ); 144 | if ( false === $ok ) { 145 | throw new \Exception( 'There was an error moving the translation to the destination directory' ); 146 | } 147 | } 148 | $zip->close(); 149 | 150 | } else { 151 | throw new \Exception( 'The was an error unzipping or moving the t10n files' ); 152 | 153 | } 154 | } 155 | 156 | /** 157 | * Download t10ns, unzip them and move to the relevant directory. 158 | * 159 | * @param string $package_type The package type, currently only 'plugin', 'theme', or 'core'. 160 | * @param string $package_url The URL for the package t10ns. 161 | * @param string $wp_content_path The Path to the wp_content directory. 162 | * 163 | * @throws \Exception 164 | */ 165 | public function download_and_move_t10ns( $package_type = 'plugin', $package_url, $wp_content_path ) { 166 | try { 167 | $dest_path = $this->get_dest_path( $package_type, $wp_content_path ); 168 | 169 | try { 170 | $t10n_files = $this->download_t10ns( $package_url ); 171 | 172 | try { 173 | $this->unpack_and_more_archived_t10ns( $t10n_files, $dest_path ); 174 | 175 | } catch ( \Exception $e ) { 176 | throw new \Exception( $e->getMessage() ); 177 | } 178 | } catch ( \Exception $e ) { 179 | throw new \Exception( $e->getMessage() ); 180 | } 181 | } catch ( \Exception $e ) { 182 | throw new \Exception( $e->getMessage() ); 183 | } 184 | } 185 | 186 | } 187 | -------------------------------------------------------------------------------- /src/AngryCreative/PostUpdateLanguageUpdate.php: -------------------------------------------------------------------------------- 1 | getOperation()->getPackage() ); 49 | 50 | } catch ( \Exception $e ) { 51 | self::$event->getIO()->writeError( $e->getMessage() ); 52 | } 53 | } 54 | 55 | /** 56 | * Update t10ns when a package is updated 57 | * 58 | * @param PackageEvent $event 59 | */ 60 | public static function update_t10ns( PackageEvent $event ) { 61 | self::$event = $event; 62 | 63 | try { 64 | self::set_config(); 65 | self::get_t10ns_for_package( self::$event->getOperation()->getTargetPackage() ); 66 | 67 | } catch ( \Exception $e ) { 68 | self::$event->getIO()->writeError( $e->getMessage() ); 69 | } 70 | } 71 | 72 | /** 73 | * Set the config 74 | * 75 | * @throws \Exception 76 | */ 77 | protected static function set_config() { 78 | $extra = self::$event->getComposer()->getPackage()->getExtra(); 79 | 80 | if ( ! empty( $extra['wordpress-languages'] ) ) { 81 | self::$languages = $extra['wordpress-languages']; 82 | } 83 | 84 | if ( ! empty( $extra['wordpress-path-to-content-dir'] ) ) { 85 | self::$wp_content_path = dirname( dirname( dirname( dirname( dirname( __DIR__ ) ) ) ) ) . '/' . $extra['wordpress-path-to-content-dir']; 86 | } 87 | 88 | if ( empty( self::$languages ) || empty( self::$wp_content_path ) ) { 89 | throw new \Exception( 'Oops :( Did you forget to add the wordpress-langagues or path to content dir to the extra section of your composer.json?' ); 90 | } 91 | } 92 | 93 | /** 94 | * Get t10ns for a package, where applicable. 95 | * 96 | * @param PackageInterface $package 97 | */ 98 | protected static function get_t10ns_for_package( PackageInterface $package ) { 99 | switch ( $package->getType() ) { 100 | case 'wordpress-plugin': 101 | $slug = str_replace( 'wpackagist-plugin/', '', $package->getName() ); 102 | 103 | self::update_plugin_t10ns( $slug, $package->getVersion() ); 104 | break; 105 | 106 | case 'wordpress-theme': 107 | $slug = str_replace( 'wpackagist-theme/', '', $package->getName() ); 108 | 109 | self::update_theme_t10ns( $slug, $package->getVersion() ); 110 | break; 111 | 112 | case 'package': 113 | if ( 'johnpbloch/wordpress' === $package->getName() ) { 114 | self::update_core_t10ns( $package->getVersion() ); 115 | } 116 | break; 117 | 118 | } 119 | } 120 | 121 | /** 122 | * @param string $slug Plugin slug. 123 | * @param string $version Plugin version. 124 | */ 125 | protected static function update_plugin_t10ns( $slug, $version ) { 126 | try { 127 | $plugin_t10ns = new Plugin( $slug, $version, self::$languages, self::$wp_content_path ); 128 | $results = $plugin_t10ns->fetch_t10ns(); 129 | 130 | if ( empty( $results ) ) { 131 | self::$event->getIO()->write( "No translations updated for plugin: {$slug}" ); 132 | 133 | } else { 134 | foreach ( $results as $result ) { 135 | self::$event->getIO()->write( "Updated translation {$result} for plugin: {$slug}" ); 136 | } 137 | } 138 | } catch ( \Exception $e ) { 139 | self::$event->getIO()->writeError( $e->getMessage() ); 140 | 141 | } 142 | } 143 | 144 | /** 145 | * @param string $slug Theme slug. 146 | * @param string $version Theme version. 147 | */ 148 | protected static function update_theme_t10ns( $slug, $version ) { 149 | try { 150 | $theme_t10ns = new Theme( $slug, $version, self::$languages, self::$wp_content_path ); 151 | $results = $theme_t10ns->fetch_t10ns(); 152 | 153 | if ( empty( $results ) ) { 154 | self::$event->getIO()->write( "No translations updated for theme: {$slug}" ); 155 | 156 | } else { 157 | foreach ( $results as $result ) { 158 | self::$event->getIO()->write( "Updated translation {$result} for theme: {$slug}" ); 159 | } 160 | } 161 | } catch ( \Exception $e ) { 162 | self::$event->getIO()->writeError( $e->getMessage() ); 163 | 164 | } 165 | } 166 | 167 | /** 168 | * Update|Install core t10ns. 169 | * 170 | * @param string $version Core version. 171 | */ 172 | protected static function update_core_t10ns( $version ) { 173 | try { 174 | $core = new Core( $version, self::$languages, self::$wp_content_path ); 175 | $results = $core->fetch_t10ns(); 176 | 177 | if ( empty( $results ) ) { 178 | self::$event->getIO()->write( "No translations updated for core v.{$version}" ); 179 | 180 | } else { 181 | foreach ( $results as $result ) { 182 | self::$event->getIO()->write( "Updated translation {$result} for core v.{$version}" ); 183 | } 184 | } 185 | } catch ( \Exception $e ) { 186 | self::$event->getIO()->writeError( $e->getMessage() ); 187 | 188 | } 189 | } 190 | 191 | /** 192 | * Remove t10ns on uninstall. 193 | * 194 | * @param PackageEvent $event 195 | * 196 | * @todo maybe implement this? 197 | */ 198 | public static function remove_t10ns( PackageEvent $event ) { 199 | self::$event = $event; 200 | exit; 201 | } 202 | 203 | } 204 | -------------------------------------------------------------------------------- /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 | "content-hash": "022975e80f962dd23148025c1eb3b4e0", 8 | "packages": [ 9 | { 10 | "name": "guzzlehttp/guzzle", 11 | "version": "6.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/guzzle/guzzle.git", 15 | "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", 20 | "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "guzzlehttp/promises": "^1.0", 25 | "guzzlehttp/psr7": "^1.4", 26 | "php": ">=5.5" 27 | }, 28 | "require-dev": { 29 | "ext-curl": "*", 30 | "phpunit/phpunit": "^4.0 || ^5.0", 31 | "psr/log": "^1.0" 32 | }, 33 | "suggest": { 34 | "psr/log": "Required for using the Log middleware" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "6.2-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "files": [ 44 | "src/functions_include.php" 45 | ], 46 | "psr-4": { 47 | "GuzzleHttp\\": "src/" 48 | } 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Michael Dowling", 57 | "email": "mtdowling@gmail.com", 58 | "homepage": "https://github.com/mtdowling" 59 | } 60 | ], 61 | "description": "Guzzle is a PHP HTTP client library", 62 | "homepage": "http://guzzlephp.org/", 63 | "keywords": [ 64 | "client", 65 | "curl", 66 | "framework", 67 | "http", 68 | "http client", 69 | "rest", 70 | "web service" 71 | ], 72 | "time": "2017-06-22T18:50:49+00:00" 73 | }, 74 | { 75 | "name": "guzzlehttp/promises", 76 | "version": "v1.3.1", 77 | "source": { 78 | "type": "git", 79 | "url": "https://github.com/guzzle/promises.git", 80 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 81 | }, 82 | "dist": { 83 | "type": "zip", 84 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 85 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 86 | "shasum": "" 87 | }, 88 | "require": { 89 | "php": ">=5.5.0" 90 | }, 91 | "require-dev": { 92 | "phpunit/phpunit": "^4.0" 93 | }, 94 | "type": "library", 95 | "extra": { 96 | "branch-alias": { 97 | "dev-master": "1.4-dev" 98 | } 99 | }, 100 | "autoload": { 101 | "psr-4": { 102 | "GuzzleHttp\\Promise\\": "src/" 103 | }, 104 | "files": [ 105 | "src/functions_include.php" 106 | ] 107 | }, 108 | "notification-url": "https://packagist.org/downloads/", 109 | "license": [ 110 | "MIT" 111 | ], 112 | "authors": [ 113 | { 114 | "name": "Michael Dowling", 115 | "email": "mtdowling@gmail.com", 116 | "homepage": "https://github.com/mtdowling" 117 | } 118 | ], 119 | "description": "Guzzle promises library", 120 | "keywords": [ 121 | "promise" 122 | ], 123 | "time": "2016-12-20T10:07:11+00:00" 124 | }, 125 | { 126 | "name": "guzzlehttp/psr7", 127 | "version": "1.4.2", 128 | "source": { 129 | "type": "git", 130 | "url": "https://github.com/guzzle/psr7.git", 131 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" 132 | }, 133 | "dist": { 134 | "type": "zip", 135 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 136 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 137 | "shasum": "" 138 | }, 139 | "require": { 140 | "php": ">=5.4.0", 141 | "psr/http-message": "~1.0" 142 | }, 143 | "provide": { 144 | "psr/http-message-implementation": "1.0" 145 | }, 146 | "require-dev": { 147 | "phpunit/phpunit": "~4.0" 148 | }, 149 | "type": "library", 150 | "extra": { 151 | "branch-alias": { 152 | "dev-master": "1.4-dev" 153 | } 154 | }, 155 | "autoload": { 156 | "psr-4": { 157 | "GuzzleHttp\\Psr7\\": "src/" 158 | }, 159 | "files": [ 160 | "src/functions_include.php" 161 | ] 162 | }, 163 | "notification-url": "https://packagist.org/downloads/", 164 | "license": [ 165 | "MIT" 166 | ], 167 | "authors": [ 168 | { 169 | "name": "Michael Dowling", 170 | "email": "mtdowling@gmail.com", 171 | "homepage": "https://github.com/mtdowling" 172 | }, 173 | { 174 | "name": "Tobias Schultze", 175 | "homepage": "https://github.com/Tobion" 176 | } 177 | ], 178 | "description": "PSR-7 message implementation that also provides common utility methods", 179 | "keywords": [ 180 | "http", 181 | "message", 182 | "request", 183 | "response", 184 | "stream", 185 | "uri", 186 | "url" 187 | ], 188 | "time": "2017-03-20T17:10:46+00:00" 189 | }, 190 | { 191 | "name": "psr/http-message", 192 | "version": "1.0.1", 193 | "source": { 194 | "type": "git", 195 | "url": "https://github.com/php-fig/http-message.git", 196 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 197 | }, 198 | "dist": { 199 | "type": "zip", 200 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 201 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 202 | "shasum": "" 203 | }, 204 | "require": { 205 | "php": ">=5.3.0" 206 | }, 207 | "type": "library", 208 | "extra": { 209 | "branch-alias": { 210 | "dev-master": "1.0.x-dev" 211 | } 212 | }, 213 | "autoload": { 214 | "psr-4": { 215 | "Psr\\Http\\Message\\": "src/" 216 | } 217 | }, 218 | "notification-url": "https://packagist.org/downloads/", 219 | "license": [ 220 | "MIT" 221 | ], 222 | "authors": [ 223 | { 224 | "name": "PHP-FIG", 225 | "homepage": "http://www.php-fig.org/" 226 | } 227 | ], 228 | "description": "Common interface for HTTP messages", 229 | "homepage": "https://github.com/php-fig/http-message", 230 | "keywords": [ 231 | "http", 232 | "http-message", 233 | "psr", 234 | "psr-7", 235 | "request", 236 | "response" 237 | ], 238 | "time": "2016-08-06T14:39:51+00:00" 239 | }, 240 | { 241 | "name": "symfony/yaml", 242 | "version": "v3.3.10", 243 | "source": { 244 | "type": "git", 245 | "url": "https://github.com/symfony/yaml.git", 246 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46" 247 | }, 248 | "dist": { 249 | "type": "zip", 250 | "url": "https://api.github.com/repos/symfony/yaml/zipball/8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", 251 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", 252 | "shasum": "" 253 | }, 254 | "require": { 255 | "php": "^5.5.9|>=7.0.8" 256 | }, 257 | "require-dev": { 258 | "symfony/console": "~2.8|~3.0" 259 | }, 260 | "suggest": { 261 | "symfony/console": "For validating YAML files using the lint command" 262 | }, 263 | "type": "library", 264 | "extra": { 265 | "branch-alias": { 266 | "dev-master": "3.3-dev" 267 | } 268 | }, 269 | "autoload": { 270 | "psr-4": { 271 | "Symfony\\Component\\Yaml\\": "" 272 | }, 273 | "exclude-from-classmap": [ 274 | "/Tests/" 275 | ] 276 | }, 277 | "notification-url": "https://packagist.org/downloads/", 278 | "license": [ 279 | "MIT" 280 | ], 281 | "authors": [ 282 | { 283 | "name": "Fabien Potencier", 284 | "email": "fabien@symfony.com" 285 | }, 286 | { 287 | "name": "Symfony Community", 288 | "homepage": "https://symfony.com/contributors" 289 | } 290 | ], 291 | "description": "Symfony Yaml Component", 292 | "homepage": "https://symfony.com", 293 | "time": "2017-10-05T14:43:42+00:00" 294 | } 295 | ], 296 | "packages-dev": [ 297 | { 298 | "name": "doctrine/instantiator", 299 | "version": "1.1.0", 300 | "source": { 301 | "type": "git", 302 | "url": "https://github.com/doctrine/instantiator.git", 303 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 304 | }, 305 | "dist": { 306 | "type": "zip", 307 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 308 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 309 | "shasum": "" 310 | }, 311 | "require": { 312 | "php": "^7.1" 313 | }, 314 | "require-dev": { 315 | "athletic/athletic": "~0.1.8", 316 | "ext-pdo": "*", 317 | "ext-phar": "*", 318 | "phpunit/phpunit": "^6.2.3", 319 | "squizlabs/php_codesniffer": "^3.0.2" 320 | }, 321 | "type": "library", 322 | "extra": { 323 | "branch-alias": { 324 | "dev-master": "1.2.x-dev" 325 | } 326 | }, 327 | "autoload": { 328 | "psr-4": { 329 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 330 | } 331 | }, 332 | "notification-url": "https://packagist.org/downloads/", 333 | "license": [ 334 | "MIT" 335 | ], 336 | "authors": [ 337 | { 338 | "name": "Marco Pivetta", 339 | "email": "ocramius@gmail.com", 340 | "homepage": "http://ocramius.github.com/" 341 | } 342 | ], 343 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 344 | "homepage": "https://github.com/doctrine/instantiator", 345 | "keywords": [ 346 | "constructor", 347 | "instantiate" 348 | ], 349 | "time": "2017-07-22T11:58:36+00:00" 350 | }, 351 | { 352 | "name": "myclabs/deep-copy", 353 | "version": "1.6.1", 354 | "source": { 355 | "type": "git", 356 | "url": "https://github.com/myclabs/DeepCopy.git", 357 | "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" 358 | }, 359 | "dist": { 360 | "type": "zip", 361 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", 362 | "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", 363 | "shasum": "" 364 | }, 365 | "require": { 366 | "php": ">=5.4.0" 367 | }, 368 | "require-dev": { 369 | "doctrine/collections": "1.*", 370 | "phpunit/phpunit": "~4.1" 371 | }, 372 | "type": "library", 373 | "autoload": { 374 | "psr-4": { 375 | "DeepCopy\\": "src/DeepCopy/" 376 | } 377 | }, 378 | "notification-url": "https://packagist.org/downloads/", 379 | "license": [ 380 | "MIT" 381 | ], 382 | "description": "Create deep copies (clones) of your objects", 383 | "homepage": "https://github.com/myclabs/DeepCopy", 384 | "keywords": [ 385 | "clone", 386 | "copy", 387 | "duplicate", 388 | "object", 389 | "object graph" 390 | ], 391 | "time": "2017-04-12T18:52:22+00:00" 392 | }, 393 | { 394 | "name": "phpdocumentor/reflection-common", 395 | "version": "1.0.1", 396 | "source": { 397 | "type": "git", 398 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 399 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 400 | }, 401 | "dist": { 402 | "type": "zip", 403 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 404 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 405 | "shasum": "" 406 | }, 407 | "require": { 408 | "php": ">=5.5" 409 | }, 410 | "require-dev": { 411 | "phpunit/phpunit": "^4.6" 412 | }, 413 | "type": "library", 414 | "extra": { 415 | "branch-alias": { 416 | "dev-master": "1.0.x-dev" 417 | } 418 | }, 419 | "autoload": { 420 | "psr-4": { 421 | "phpDocumentor\\Reflection\\": [ 422 | "src" 423 | ] 424 | } 425 | }, 426 | "notification-url": "https://packagist.org/downloads/", 427 | "license": [ 428 | "MIT" 429 | ], 430 | "authors": [ 431 | { 432 | "name": "Jaap van Otterdijk", 433 | "email": "opensource@ijaap.nl" 434 | } 435 | ], 436 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 437 | "homepage": "http://www.phpdoc.org", 438 | "keywords": [ 439 | "FQSEN", 440 | "phpDocumentor", 441 | "phpdoc", 442 | "reflection", 443 | "static analysis" 444 | ], 445 | "time": "2017-09-11T18:02:19+00:00" 446 | }, 447 | { 448 | "name": "phpdocumentor/reflection-docblock", 449 | "version": "4.1.1", 450 | "source": { 451 | "type": "git", 452 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 453 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2" 454 | }, 455 | "dist": { 456 | "type": "zip", 457 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2", 458 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2", 459 | "shasum": "" 460 | }, 461 | "require": { 462 | "php": "^7.0", 463 | "phpdocumentor/reflection-common": "^1.0@dev", 464 | "phpdocumentor/type-resolver": "^0.4.0", 465 | "webmozart/assert": "^1.0" 466 | }, 467 | "require-dev": { 468 | "mockery/mockery": "^0.9.4", 469 | "phpunit/phpunit": "^4.4" 470 | }, 471 | "type": "library", 472 | "autoload": { 473 | "psr-4": { 474 | "phpDocumentor\\Reflection\\": [ 475 | "src/" 476 | ] 477 | } 478 | }, 479 | "notification-url": "https://packagist.org/downloads/", 480 | "license": [ 481 | "MIT" 482 | ], 483 | "authors": [ 484 | { 485 | "name": "Mike van Riel", 486 | "email": "me@mikevanriel.com" 487 | } 488 | ], 489 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 490 | "time": "2017-08-30T18:51:59+00:00" 491 | }, 492 | { 493 | "name": "phpdocumentor/type-resolver", 494 | "version": "0.4.0", 495 | "source": { 496 | "type": "git", 497 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 498 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 499 | }, 500 | "dist": { 501 | "type": "zip", 502 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 503 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 504 | "shasum": "" 505 | }, 506 | "require": { 507 | "php": "^5.5 || ^7.0", 508 | "phpdocumentor/reflection-common": "^1.0" 509 | }, 510 | "require-dev": { 511 | "mockery/mockery": "^0.9.4", 512 | "phpunit/phpunit": "^5.2||^4.8.24" 513 | }, 514 | "type": "library", 515 | "extra": { 516 | "branch-alias": { 517 | "dev-master": "1.0.x-dev" 518 | } 519 | }, 520 | "autoload": { 521 | "psr-4": { 522 | "phpDocumentor\\Reflection\\": [ 523 | "src/" 524 | ] 525 | } 526 | }, 527 | "notification-url": "https://packagist.org/downloads/", 528 | "license": [ 529 | "MIT" 530 | ], 531 | "authors": [ 532 | { 533 | "name": "Mike van Riel", 534 | "email": "me@mikevanriel.com" 535 | } 536 | ], 537 | "time": "2017-07-14T14:27:02+00:00" 538 | }, 539 | { 540 | "name": "phpspec/prophecy", 541 | "version": "v1.7.2", 542 | "source": { 543 | "type": "git", 544 | "url": "https://github.com/phpspec/prophecy.git", 545 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" 546 | }, 547 | "dist": { 548 | "type": "zip", 549 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", 550 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", 551 | "shasum": "" 552 | }, 553 | "require": { 554 | "doctrine/instantiator": "^1.0.2", 555 | "php": "^5.3|^7.0", 556 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 557 | "sebastian/comparator": "^1.1|^2.0", 558 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 559 | }, 560 | "require-dev": { 561 | "phpspec/phpspec": "^2.5|^3.2", 562 | "phpunit/phpunit": "^4.8 || ^5.6.5" 563 | }, 564 | "type": "library", 565 | "extra": { 566 | "branch-alias": { 567 | "dev-master": "1.7.x-dev" 568 | } 569 | }, 570 | "autoload": { 571 | "psr-0": { 572 | "Prophecy\\": "src/" 573 | } 574 | }, 575 | "notification-url": "https://packagist.org/downloads/", 576 | "license": [ 577 | "MIT" 578 | ], 579 | "authors": [ 580 | { 581 | "name": "Konstantin Kudryashov", 582 | "email": "ever.zet@gmail.com", 583 | "homepage": "http://everzet.com" 584 | }, 585 | { 586 | "name": "Marcello Duarte", 587 | "email": "marcello.duarte@gmail.com" 588 | } 589 | ], 590 | "description": "Highly opinionated mocking framework for PHP 5.3+", 591 | "homepage": "https://github.com/phpspec/prophecy", 592 | "keywords": [ 593 | "Double", 594 | "Dummy", 595 | "fake", 596 | "mock", 597 | "spy", 598 | "stub" 599 | ], 600 | "time": "2017-09-04T11:05:03+00:00" 601 | }, 602 | { 603 | "name": "phpunit/php-code-coverage", 604 | "version": "4.0.8", 605 | "source": { 606 | "type": "git", 607 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 608 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" 609 | }, 610 | "dist": { 611 | "type": "zip", 612 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 613 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 614 | "shasum": "" 615 | }, 616 | "require": { 617 | "ext-dom": "*", 618 | "ext-xmlwriter": "*", 619 | "php": "^5.6 || ^7.0", 620 | "phpunit/php-file-iterator": "^1.3", 621 | "phpunit/php-text-template": "^1.2", 622 | "phpunit/php-token-stream": "^1.4.2 || ^2.0", 623 | "sebastian/code-unit-reverse-lookup": "^1.0", 624 | "sebastian/environment": "^1.3.2 || ^2.0", 625 | "sebastian/version": "^1.0 || ^2.0" 626 | }, 627 | "require-dev": { 628 | "ext-xdebug": "^2.1.4", 629 | "phpunit/phpunit": "^5.7" 630 | }, 631 | "suggest": { 632 | "ext-xdebug": "^2.5.1" 633 | }, 634 | "type": "library", 635 | "extra": { 636 | "branch-alias": { 637 | "dev-master": "4.0.x-dev" 638 | } 639 | }, 640 | "autoload": { 641 | "classmap": [ 642 | "src/" 643 | ] 644 | }, 645 | "notification-url": "https://packagist.org/downloads/", 646 | "license": [ 647 | "BSD-3-Clause" 648 | ], 649 | "authors": [ 650 | { 651 | "name": "Sebastian Bergmann", 652 | "email": "sb@sebastian-bergmann.de", 653 | "role": "lead" 654 | } 655 | ], 656 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 657 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 658 | "keywords": [ 659 | "coverage", 660 | "testing", 661 | "xunit" 662 | ], 663 | "time": "2017-04-02T07:44:40+00:00" 664 | }, 665 | { 666 | "name": "phpunit/php-file-iterator", 667 | "version": "1.4.2", 668 | "source": { 669 | "type": "git", 670 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 671 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 672 | }, 673 | "dist": { 674 | "type": "zip", 675 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 676 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 677 | "shasum": "" 678 | }, 679 | "require": { 680 | "php": ">=5.3.3" 681 | }, 682 | "type": "library", 683 | "extra": { 684 | "branch-alias": { 685 | "dev-master": "1.4.x-dev" 686 | } 687 | }, 688 | "autoload": { 689 | "classmap": [ 690 | "src/" 691 | ] 692 | }, 693 | "notification-url": "https://packagist.org/downloads/", 694 | "license": [ 695 | "BSD-3-Clause" 696 | ], 697 | "authors": [ 698 | { 699 | "name": "Sebastian Bergmann", 700 | "email": "sb@sebastian-bergmann.de", 701 | "role": "lead" 702 | } 703 | ], 704 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 705 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 706 | "keywords": [ 707 | "filesystem", 708 | "iterator" 709 | ], 710 | "time": "2016-10-03T07:40:28+00:00" 711 | }, 712 | { 713 | "name": "phpunit/php-text-template", 714 | "version": "1.2.1", 715 | "source": { 716 | "type": "git", 717 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 718 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 719 | }, 720 | "dist": { 721 | "type": "zip", 722 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 723 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 724 | "shasum": "" 725 | }, 726 | "require": { 727 | "php": ">=5.3.3" 728 | }, 729 | "type": "library", 730 | "autoload": { 731 | "classmap": [ 732 | "src/" 733 | ] 734 | }, 735 | "notification-url": "https://packagist.org/downloads/", 736 | "license": [ 737 | "BSD-3-Clause" 738 | ], 739 | "authors": [ 740 | { 741 | "name": "Sebastian Bergmann", 742 | "email": "sebastian@phpunit.de", 743 | "role": "lead" 744 | } 745 | ], 746 | "description": "Simple template engine.", 747 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 748 | "keywords": [ 749 | "template" 750 | ], 751 | "time": "2015-06-21T13:50:34+00:00" 752 | }, 753 | { 754 | "name": "phpunit/php-timer", 755 | "version": "1.0.9", 756 | "source": { 757 | "type": "git", 758 | "url": "https://github.com/sebastianbergmann/php-timer.git", 759 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 760 | }, 761 | "dist": { 762 | "type": "zip", 763 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 764 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 765 | "shasum": "" 766 | }, 767 | "require": { 768 | "php": "^5.3.3 || ^7.0" 769 | }, 770 | "require-dev": { 771 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 772 | }, 773 | "type": "library", 774 | "extra": { 775 | "branch-alias": { 776 | "dev-master": "1.0-dev" 777 | } 778 | }, 779 | "autoload": { 780 | "classmap": [ 781 | "src/" 782 | ] 783 | }, 784 | "notification-url": "https://packagist.org/downloads/", 785 | "license": [ 786 | "BSD-3-Clause" 787 | ], 788 | "authors": [ 789 | { 790 | "name": "Sebastian Bergmann", 791 | "email": "sb@sebastian-bergmann.de", 792 | "role": "lead" 793 | } 794 | ], 795 | "description": "Utility class for timing", 796 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 797 | "keywords": [ 798 | "timer" 799 | ], 800 | "time": "2017-02-26T11:10:40+00:00" 801 | }, 802 | { 803 | "name": "phpunit/php-token-stream", 804 | "version": "2.0.1", 805 | "source": { 806 | "type": "git", 807 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 808 | "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0" 809 | }, 810 | "dist": { 811 | "type": "zip", 812 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0", 813 | "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0", 814 | "shasum": "" 815 | }, 816 | "require": { 817 | "ext-tokenizer": "*", 818 | "php": "^7.0" 819 | }, 820 | "require-dev": { 821 | "phpunit/phpunit": "^6.2.4" 822 | }, 823 | "type": "library", 824 | "extra": { 825 | "branch-alias": { 826 | "dev-master": "2.0-dev" 827 | } 828 | }, 829 | "autoload": { 830 | "classmap": [ 831 | "src/" 832 | ] 833 | }, 834 | "notification-url": "https://packagist.org/downloads/", 835 | "license": [ 836 | "BSD-3-Clause" 837 | ], 838 | "authors": [ 839 | { 840 | "name": "Sebastian Bergmann", 841 | "email": "sebastian@phpunit.de" 842 | } 843 | ], 844 | "description": "Wrapper around PHP's tokenizer extension.", 845 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 846 | "keywords": [ 847 | "tokenizer" 848 | ], 849 | "time": "2017-08-20T05:47:52+00:00" 850 | }, 851 | { 852 | "name": "phpunit/phpunit", 853 | "version": "5.7.23", 854 | "source": { 855 | "type": "git", 856 | "url": "https://github.com/sebastianbergmann/phpunit.git", 857 | "reference": "78532d5269d984660080d8e0f4c99c5c2ea65ffe" 858 | }, 859 | "dist": { 860 | "type": "zip", 861 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/78532d5269d984660080d8e0f4c99c5c2ea65ffe", 862 | "reference": "78532d5269d984660080d8e0f4c99c5c2ea65ffe", 863 | "shasum": "" 864 | }, 865 | "require": { 866 | "ext-dom": "*", 867 | "ext-json": "*", 868 | "ext-libxml": "*", 869 | "ext-mbstring": "*", 870 | "ext-xml": "*", 871 | "myclabs/deep-copy": "~1.3", 872 | "php": "^5.6 || ^7.0", 873 | "phpspec/prophecy": "^1.6.2", 874 | "phpunit/php-code-coverage": "^4.0.4", 875 | "phpunit/php-file-iterator": "~1.4", 876 | "phpunit/php-text-template": "~1.2", 877 | "phpunit/php-timer": "^1.0.6", 878 | "phpunit/phpunit-mock-objects": "^3.2", 879 | "sebastian/comparator": "^1.2.4", 880 | "sebastian/diff": "^1.4.3", 881 | "sebastian/environment": "^1.3.4 || ^2.0", 882 | "sebastian/exporter": "~2.0", 883 | "sebastian/global-state": "^1.1", 884 | "sebastian/object-enumerator": "~2.0", 885 | "sebastian/resource-operations": "~1.0", 886 | "sebastian/version": "~1.0.3|~2.0", 887 | "symfony/yaml": "~2.1|~3.0" 888 | }, 889 | "conflict": { 890 | "phpdocumentor/reflection-docblock": "3.0.2" 891 | }, 892 | "require-dev": { 893 | "ext-pdo": "*" 894 | }, 895 | "suggest": { 896 | "ext-xdebug": "*", 897 | "phpunit/php-invoker": "~1.1" 898 | }, 899 | "bin": [ 900 | "phpunit" 901 | ], 902 | "type": "library", 903 | "extra": { 904 | "branch-alias": { 905 | "dev-master": "5.7.x-dev" 906 | } 907 | }, 908 | "autoload": { 909 | "classmap": [ 910 | "src/" 911 | ] 912 | }, 913 | "notification-url": "https://packagist.org/downloads/", 914 | "license": [ 915 | "BSD-3-Clause" 916 | ], 917 | "authors": [ 918 | { 919 | "name": "Sebastian Bergmann", 920 | "email": "sebastian@phpunit.de", 921 | "role": "lead" 922 | } 923 | ], 924 | "description": "The PHP Unit Testing framework.", 925 | "homepage": "https://phpunit.de/", 926 | "keywords": [ 927 | "phpunit", 928 | "testing", 929 | "xunit" 930 | ], 931 | "time": "2017-10-15T06:13:55+00:00" 932 | }, 933 | { 934 | "name": "phpunit/phpunit-mock-objects", 935 | "version": "3.4.4", 936 | "source": { 937 | "type": "git", 938 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 939 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" 940 | }, 941 | "dist": { 942 | "type": "zip", 943 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", 944 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", 945 | "shasum": "" 946 | }, 947 | "require": { 948 | "doctrine/instantiator": "^1.0.2", 949 | "php": "^5.6 || ^7.0", 950 | "phpunit/php-text-template": "^1.2", 951 | "sebastian/exporter": "^1.2 || ^2.0" 952 | }, 953 | "conflict": { 954 | "phpunit/phpunit": "<5.4.0" 955 | }, 956 | "require-dev": { 957 | "phpunit/phpunit": "^5.4" 958 | }, 959 | "suggest": { 960 | "ext-soap": "*" 961 | }, 962 | "type": "library", 963 | "extra": { 964 | "branch-alias": { 965 | "dev-master": "3.2.x-dev" 966 | } 967 | }, 968 | "autoload": { 969 | "classmap": [ 970 | "src/" 971 | ] 972 | }, 973 | "notification-url": "https://packagist.org/downloads/", 974 | "license": [ 975 | "BSD-3-Clause" 976 | ], 977 | "authors": [ 978 | { 979 | "name": "Sebastian Bergmann", 980 | "email": "sb@sebastian-bergmann.de", 981 | "role": "lead" 982 | } 983 | ], 984 | "description": "Mock Object library for PHPUnit", 985 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 986 | "keywords": [ 987 | "mock", 988 | "xunit" 989 | ], 990 | "time": "2017-06-30T09:13:00+00:00" 991 | }, 992 | { 993 | "name": "sebastian/code-unit-reverse-lookup", 994 | "version": "1.0.1", 995 | "source": { 996 | "type": "git", 997 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 998 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 999 | }, 1000 | "dist": { 1001 | "type": "zip", 1002 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1003 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1004 | "shasum": "" 1005 | }, 1006 | "require": { 1007 | "php": "^5.6 || ^7.0" 1008 | }, 1009 | "require-dev": { 1010 | "phpunit/phpunit": "^5.7 || ^6.0" 1011 | }, 1012 | "type": "library", 1013 | "extra": { 1014 | "branch-alias": { 1015 | "dev-master": "1.0.x-dev" 1016 | } 1017 | }, 1018 | "autoload": { 1019 | "classmap": [ 1020 | "src/" 1021 | ] 1022 | }, 1023 | "notification-url": "https://packagist.org/downloads/", 1024 | "license": [ 1025 | "BSD-3-Clause" 1026 | ], 1027 | "authors": [ 1028 | { 1029 | "name": "Sebastian Bergmann", 1030 | "email": "sebastian@phpunit.de" 1031 | } 1032 | ], 1033 | "description": "Looks up which function or method a line of code belongs to", 1034 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1035 | "time": "2017-03-04T06:30:41+00:00" 1036 | }, 1037 | { 1038 | "name": "sebastian/comparator", 1039 | "version": "1.2.4", 1040 | "source": { 1041 | "type": "git", 1042 | "url": "https://github.com/sebastianbergmann/comparator.git", 1043 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 1044 | }, 1045 | "dist": { 1046 | "type": "zip", 1047 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 1048 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 1049 | "shasum": "" 1050 | }, 1051 | "require": { 1052 | "php": ">=5.3.3", 1053 | "sebastian/diff": "~1.2", 1054 | "sebastian/exporter": "~1.2 || ~2.0" 1055 | }, 1056 | "require-dev": { 1057 | "phpunit/phpunit": "~4.4" 1058 | }, 1059 | "type": "library", 1060 | "extra": { 1061 | "branch-alias": { 1062 | "dev-master": "1.2.x-dev" 1063 | } 1064 | }, 1065 | "autoload": { 1066 | "classmap": [ 1067 | "src/" 1068 | ] 1069 | }, 1070 | "notification-url": "https://packagist.org/downloads/", 1071 | "license": [ 1072 | "BSD-3-Clause" 1073 | ], 1074 | "authors": [ 1075 | { 1076 | "name": "Jeff Welch", 1077 | "email": "whatthejeff@gmail.com" 1078 | }, 1079 | { 1080 | "name": "Volker Dusch", 1081 | "email": "github@wallbash.com" 1082 | }, 1083 | { 1084 | "name": "Bernhard Schussek", 1085 | "email": "bschussek@2bepublished.at" 1086 | }, 1087 | { 1088 | "name": "Sebastian Bergmann", 1089 | "email": "sebastian@phpunit.de" 1090 | } 1091 | ], 1092 | "description": "Provides the functionality to compare PHP values for equality", 1093 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1094 | "keywords": [ 1095 | "comparator", 1096 | "compare", 1097 | "equality" 1098 | ], 1099 | "time": "2017-01-29T09:50:25+00:00" 1100 | }, 1101 | { 1102 | "name": "sebastian/diff", 1103 | "version": "1.4.3", 1104 | "source": { 1105 | "type": "git", 1106 | "url": "https://github.com/sebastianbergmann/diff.git", 1107 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" 1108 | }, 1109 | "dist": { 1110 | "type": "zip", 1111 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", 1112 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", 1113 | "shasum": "" 1114 | }, 1115 | "require": { 1116 | "php": "^5.3.3 || ^7.0" 1117 | }, 1118 | "require-dev": { 1119 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1120 | }, 1121 | "type": "library", 1122 | "extra": { 1123 | "branch-alias": { 1124 | "dev-master": "1.4-dev" 1125 | } 1126 | }, 1127 | "autoload": { 1128 | "classmap": [ 1129 | "src/" 1130 | ] 1131 | }, 1132 | "notification-url": "https://packagist.org/downloads/", 1133 | "license": [ 1134 | "BSD-3-Clause" 1135 | ], 1136 | "authors": [ 1137 | { 1138 | "name": "Kore Nordmann", 1139 | "email": "mail@kore-nordmann.de" 1140 | }, 1141 | { 1142 | "name": "Sebastian Bergmann", 1143 | "email": "sebastian@phpunit.de" 1144 | } 1145 | ], 1146 | "description": "Diff implementation", 1147 | "homepage": "https://github.com/sebastianbergmann/diff", 1148 | "keywords": [ 1149 | "diff" 1150 | ], 1151 | "time": "2017-05-22T07:24:03+00:00" 1152 | }, 1153 | { 1154 | "name": "sebastian/environment", 1155 | "version": "2.0.0", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/sebastianbergmann/environment.git", 1159 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1164 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "php": "^5.6 || ^7.0" 1169 | }, 1170 | "require-dev": { 1171 | "phpunit/phpunit": "^5.0" 1172 | }, 1173 | "type": "library", 1174 | "extra": { 1175 | "branch-alias": { 1176 | "dev-master": "2.0.x-dev" 1177 | } 1178 | }, 1179 | "autoload": { 1180 | "classmap": [ 1181 | "src/" 1182 | ] 1183 | }, 1184 | "notification-url": "https://packagist.org/downloads/", 1185 | "license": [ 1186 | "BSD-3-Clause" 1187 | ], 1188 | "authors": [ 1189 | { 1190 | "name": "Sebastian Bergmann", 1191 | "email": "sebastian@phpunit.de" 1192 | } 1193 | ], 1194 | "description": "Provides functionality to handle HHVM/PHP environments", 1195 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1196 | "keywords": [ 1197 | "Xdebug", 1198 | "environment", 1199 | "hhvm" 1200 | ], 1201 | "time": "2016-11-26T07:53:53+00:00" 1202 | }, 1203 | { 1204 | "name": "sebastian/exporter", 1205 | "version": "2.0.0", 1206 | "source": { 1207 | "type": "git", 1208 | "url": "https://github.com/sebastianbergmann/exporter.git", 1209 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 1210 | }, 1211 | "dist": { 1212 | "type": "zip", 1213 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1214 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1215 | "shasum": "" 1216 | }, 1217 | "require": { 1218 | "php": ">=5.3.3", 1219 | "sebastian/recursion-context": "~2.0" 1220 | }, 1221 | "require-dev": { 1222 | "ext-mbstring": "*", 1223 | "phpunit/phpunit": "~4.4" 1224 | }, 1225 | "type": "library", 1226 | "extra": { 1227 | "branch-alias": { 1228 | "dev-master": "2.0.x-dev" 1229 | } 1230 | }, 1231 | "autoload": { 1232 | "classmap": [ 1233 | "src/" 1234 | ] 1235 | }, 1236 | "notification-url": "https://packagist.org/downloads/", 1237 | "license": [ 1238 | "BSD-3-Clause" 1239 | ], 1240 | "authors": [ 1241 | { 1242 | "name": "Jeff Welch", 1243 | "email": "whatthejeff@gmail.com" 1244 | }, 1245 | { 1246 | "name": "Volker Dusch", 1247 | "email": "github@wallbash.com" 1248 | }, 1249 | { 1250 | "name": "Bernhard Schussek", 1251 | "email": "bschussek@2bepublished.at" 1252 | }, 1253 | { 1254 | "name": "Sebastian Bergmann", 1255 | "email": "sebastian@phpunit.de" 1256 | }, 1257 | { 1258 | "name": "Adam Harvey", 1259 | "email": "aharvey@php.net" 1260 | } 1261 | ], 1262 | "description": "Provides the functionality to export PHP variables for visualization", 1263 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1264 | "keywords": [ 1265 | "export", 1266 | "exporter" 1267 | ], 1268 | "time": "2016-11-19T08:54:04+00:00" 1269 | }, 1270 | { 1271 | "name": "sebastian/global-state", 1272 | "version": "1.1.1", 1273 | "source": { 1274 | "type": "git", 1275 | "url": "https://github.com/sebastianbergmann/global-state.git", 1276 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1277 | }, 1278 | "dist": { 1279 | "type": "zip", 1280 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1281 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1282 | "shasum": "" 1283 | }, 1284 | "require": { 1285 | "php": ">=5.3.3" 1286 | }, 1287 | "require-dev": { 1288 | "phpunit/phpunit": "~4.2" 1289 | }, 1290 | "suggest": { 1291 | "ext-uopz": "*" 1292 | }, 1293 | "type": "library", 1294 | "extra": { 1295 | "branch-alias": { 1296 | "dev-master": "1.0-dev" 1297 | } 1298 | }, 1299 | "autoload": { 1300 | "classmap": [ 1301 | "src/" 1302 | ] 1303 | }, 1304 | "notification-url": "https://packagist.org/downloads/", 1305 | "license": [ 1306 | "BSD-3-Clause" 1307 | ], 1308 | "authors": [ 1309 | { 1310 | "name": "Sebastian Bergmann", 1311 | "email": "sebastian@phpunit.de" 1312 | } 1313 | ], 1314 | "description": "Snapshotting of global state", 1315 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1316 | "keywords": [ 1317 | "global state" 1318 | ], 1319 | "time": "2015-10-12T03:26:01+00:00" 1320 | }, 1321 | { 1322 | "name": "sebastian/object-enumerator", 1323 | "version": "2.0.1", 1324 | "source": { 1325 | "type": "git", 1326 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1327 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" 1328 | }, 1329 | "dist": { 1330 | "type": "zip", 1331 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", 1332 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", 1333 | "shasum": "" 1334 | }, 1335 | "require": { 1336 | "php": ">=5.6", 1337 | "sebastian/recursion-context": "~2.0" 1338 | }, 1339 | "require-dev": { 1340 | "phpunit/phpunit": "~5" 1341 | }, 1342 | "type": "library", 1343 | "extra": { 1344 | "branch-alias": { 1345 | "dev-master": "2.0.x-dev" 1346 | } 1347 | }, 1348 | "autoload": { 1349 | "classmap": [ 1350 | "src/" 1351 | ] 1352 | }, 1353 | "notification-url": "https://packagist.org/downloads/", 1354 | "license": [ 1355 | "BSD-3-Clause" 1356 | ], 1357 | "authors": [ 1358 | { 1359 | "name": "Sebastian Bergmann", 1360 | "email": "sebastian@phpunit.de" 1361 | } 1362 | ], 1363 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1364 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1365 | "time": "2017-02-18T15:18:39+00:00" 1366 | }, 1367 | { 1368 | "name": "sebastian/recursion-context", 1369 | "version": "2.0.0", 1370 | "source": { 1371 | "type": "git", 1372 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1373 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 1374 | }, 1375 | "dist": { 1376 | "type": "zip", 1377 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1378 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1379 | "shasum": "" 1380 | }, 1381 | "require": { 1382 | "php": ">=5.3.3" 1383 | }, 1384 | "require-dev": { 1385 | "phpunit/phpunit": "~4.4" 1386 | }, 1387 | "type": "library", 1388 | "extra": { 1389 | "branch-alias": { 1390 | "dev-master": "2.0.x-dev" 1391 | } 1392 | }, 1393 | "autoload": { 1394 | "classmap": [ 1395 | "src/" 1396 | ] 1397 | }, 1398 | "notification-url": "https://packagist.org/downloads/", 1399 | "license": [ 1400 | "BSD-3-Clause" 1401 | ], 1402 | "authors": [ 1403 | { 1404 | "name": "Jeff Welch", 1405 | "email": "whatthejeff@gmail.com" 1406 | }, 1407 | { 1408 | "name": "Sebastian Bergmann", 1409 | "email": "sebastian@phpunit.de" 1410 | }, 1411 | { 1412 | "name": "Adam Harvey", 1413 | "email": "aharvey@php.net" 1414 | } 1415 | ], 1416 | "description": "Provides functionality to recursively process PHP variables", 1417 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1418 | "time": "2016-11-19T07:33:16+00:00" 1419 | }, 1420 | { 1421 | "name": "sebastian/resource-operations", 1422 | "version": "1.0.0", 1423 | "source": { 1424 | "type": "git", 1425 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1426 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1427 | }, 1428 | "dist": { 1429 | "type": "zip", 1430 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1431 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1432 | "shasum": "" 1433 | }, 1434 | "require": { 1435 | "php": ">=5.6.0" 1436 | }, 1437 | "type": "library", 1438 | "extra": { 1439 | "branch-alias": { 1440 | "dev-master": "1.0.x-dev" 1441 | } 1442 | }, 1443 | "autoload": { 1444 | "classmap": [ 1445 | "src/" 1446 | ] 1447 | }, 1448 | "notification-url": "https://packagist.org/downloads/", 1449 | "license": [ 1450 | "BSD-3-Clause" 1451 | ], 1452 | "authors": [ 1453 | { 1454 | "name": "Sebastian Bergmann", 1455 | "email": "sebastian@phpunit.de" 1456 | } 1457 | ], 1458 | "description": "Provides a list of PHP built-in functions that operate on resources", 1459 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1460 | "time": "2015-07-28T20:34:47+00:00" 1461 | }, 1462 | { 1463 | "name": "sebastian/version", 1464 | "version": "2.0.1", 1465 | "source": { 1466 | "type": "git", 1467 | "url": "https://github.com/sebastianbergmann/version.git", 1468 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1469 | }, 1470 | "dist": { 1471 | "type": "zip", 1472 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1473 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1474 | "shasum": "" 1475 | }, 1476 | "require": { 1477 | "php": ">=5.6" 1478 | }, 1479 | "type": "library", 1480 | "extra": { 1481 | "branch-alias": { 1482 | "dev-master": "2.0.x-dev" 1483 | } 1484 | }, 1485 | "autoload": { 1486 | "classmap": [ 1487 | "src/" 1488 | ] 1489 | }, 1490 | "notification-url": "https://packagist.org/downloads/", 1491 | "license": [ 1492 | "BSD-3-Clause" 1493 | ], 1494 | "authors": [ 1495 | { 1496 | "name": "Sebastian Bergmann", 1497 | "email": "sebastian@phpunit.de", 1498 | "role": "lead" 1499 | } 1500 | ], 1501 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1502 | "homepage": "https://github.com/sebastianbergmann/version", 1503 | "time": "2016-10-03T07:35:21+00:00" 1504 | }, 1505 | { 1506 | "name": "webmozart/assert", 1507 | "version": "1.2.0", 1508 | "source": { 1509 | "type": "git", 1510 | "url": "https://github.com/webmozart/assert.git", 1511 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 1512 | }, 1513 | "dist": { 1514 | "type": "zip", 1515 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 1516 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 1517 | "shasum": "" 1518 | }, 1519 | "require": { 1520 | "php": "^5.3.3 || ^7.0" 1521 | }, 1522 | "require-dev": { 1523 | "phpunit/phpunit": "^4.6", 1524 | "sebastian/version": "^1.0.1" 1525 | }, 1526 | "type": "library", 1527 | "extra": { 1528 | "branch-alias": { 1529 | "dev-master": "1.3-dev" 1530 | } 1531 | }, 1532 | "autoload": { 1533 | "psr-4": { 1534 | "Webmozart\\Assert\\": "src/" 1535 | } 1536 | }, 1537 | "notification-url": "https://packagist.org/downloads/", 1538 | "license": [ 1539 | "MIT" 1540 | ], 1541 | "authors": [ 1542 | { 1543 | "name": "Bernhard Schussek", 1544 | "email": "bschussek@gmail.com" 1545 | } 1546 | ], 1547 | "description": "Assertions to validate method input/output with nice error messages.", 1548 | "keywords": [ 1549 | "assert", 1550 | "check", 1551 | "validate" 1552 | ], 1553 | "time": "2016-11-23T20:04:58+00:00" 1554 | } 1555 | ], 1556 | "aliases": [], 1557 | "minimum-stability": "stable", 1558 | "stability-flags": [], 1559 | "prefer-stable": false, 1560 | "prefer-lowest": false, 1561 | "platform": { 1562 | "php": ">=7.0" 1563 | }, 1564 | "platform-dev": [] 1565 | } 1566 | --------------------------------------------------------------------------------