├── .gitignore ├── composer.json ├── src ├── zend │ ├── mod.rs │ ├── types.rs │ └── module.rs ├── macros.rs ├── lib.rs ├── fmt.rs └── info.rs ├── examples └── helloworld │ ├── Cargo.toml │ └── src │ └── lib.rs ├── scripts └── run-tests ├── tests └── HelloWorldTest.php ├── Cargo.toml ├── phpunit.xml.dist ├── LICENSE └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | target/ 3 | **/*.rs.bk 4 | Cargo.lock 5 | vendor/ 6 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "phpunit/phpunit": "^7.5" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/zend/mod.rs: -------------------------------------------------------------------------------- 1 | pub use self::module::*; 2 | pub use self::types::*; 3 | 4 | mod module; 5 | mod types; -------------------------------------------------------------------------------- /src/macros.rs: -------------------------------------------------------------------------------- 1 | 2 | #[macro_export] 3 | macro_rules! c_str { 4 | ($s:expr) => { { 5 | concat!($s, "\0").as_ptr() as *const c_char 6 | } } 7 | } -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code)] 2 | #![allow(unused_variables)] 3 | #![feature(link_args)] 4 | #![feature(c_variadic)] 5 | 6 | extern crate libc; 7 | 8 | #[macro_use] 9 | pub mod macros; 10 | 11 | pub mod zend; 12 | pub mod info; 13 | pub mod fmt; 14 | -------------------------------------------------------------------------------- /examples/helloworld/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "helloworld" 3 | version = "0.1.0" 4 | authors = ["Jin Hu "] 5 | edition = "2018" 6 | 7 | [dependencies] 8 | libc = "0.2.0" 9 | php-rs = { path = "../.." } 10 | 11 | [lib] 12 | name = "helloworld" 13 | crate-type = ["dylib"] 14 | -------------------------------------------------------------------------------- /scripts/run-tests: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | dir=examples/helloworld 4 | 5 | function do_build 6 | { 7 | cd $dir 8 | cargo rustc -- -C link-args='-Wl,-undefined,dynamic_lookup' 9 | cd - 10 | } 11 | 12 | function do_test 13 | { 14 | php -d extension=$dir/target/debug/libhelloworld.dylib vendor/bin/phpunit $* 15 | } 16 | 17 | do_build 18 | do_test $* 19 | -------------------------------------------------------------------------------- /tests/HelloWorldTest.php: -------------------------------------------------------------------------------- 1 | assertEquals('Hello world, Rust!', ob_get_clean()); 12 | $this->assertEquals('Rust', $result); 13 | } 14 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "php-rs" 3 | version = "0.1.0" 4 | authors = ["Jin Hu "] 5 | keywords = ["php", "php-extension"] 6 | description = "A library to build PHP extensions in Rust." 7 | license = "MIT" 8 | repository = "https://github.com/rethinkphp/php-rs" 9 | edition = "2018" 10 | 11 | [dependencies] 12 | libc = "0.2.0" 13 | 14 | [lib] 15 | name = "php" 16 | 17 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | ./tests/ 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/fmt.rs: -------------------------------------------------------------------------------- 1 | use libc::{c_char, size_t}; 2 | use std::ffi::CString; 3 | 4 | 5 | extern { 6 | pub fn php_printf(format: *const c_char , ...) -> size_t; 7 | } 8 | 9 | #[macro_export] 10 | macro_rules! printf { 11 | ($format:expr) => { 12 | let c_format = CString::new($format).unwrap(); 13 | unsafe { 14 | php::fmt::php_printf(c_format.as_ptr() as *const c_char); 15 | } 16 | }; 17 | ($format:expr, $($arg:expr), *) => { 18 | let c_format = CString::new($format).unwrap(); 19 | unsafe { 20 | php::fmt::php_printf(c_format.as_ptr() as *const c_char, $($arg), *); 21 | } 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /src/info.rs: -------------------------------------------------------------------------------- 1 | use libc::*; 2 | use std::ffi::CString; 3 | 4 | extern { 5 | pub fn php_info_print_table_start(); 6 | pub fn php_info_print_table_row(num_cols: c_int, ...) -> c_void; 7 | pub fn php_info_print_table_end(); 8 | } 9 | 10 | pub fn print_table_row(values: &[&str]) { 11 | let nargs = values.len() as i32; 12 | 13 | if nargs != 2 { 14 | unimplemented!(); 15 | } 16 | 17 | let v1 = CString::new(values[0]).unwrap(); 18 | let v2 = CString::new(values[1]).unwrap(); 19 | 20 | unsafe { 21 | php_info_print_table_row(nargs, v1.as_ptr(), v2.as_ptr()); 22 | }; 23 | } 24 | 25 | pub fn print_table_start() { 26 | unsafe { php_info_print_table_start() }; 27 | } 28 | 29 | pub fn print_table_end() { 30 | unsafe { php_info_print_table_end() } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 RethinkPHP 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/helloworld/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_variables)] 2 | 3 | extern crate libc; 4 | extern crate php; 5 | 6 | use libc::{c_int,c_char}; 7 | use php::*; 8 | use zend::*; 9 | use php::info::*; 10 | use std::ffi::CString; 11 | 12 | #[no_mangle] 13 | pub extern fn php_module_startup(type_: c_int, module_number: c_int) -> c_int { 14 | 0 15 | } 16 | 17 | #[no_mangle] 18 | pub extern fn php_module_shutdown(type_: c_int, module_number: c_int) -> c_int { 19 | 0 20 | } 21 | 22 | #[no_mangle] 23 | pub extern fn php_module_info() { 24 | print_table_start(); 25 | print_table_row(&["A demo PHP extension written in Rust", "enabled"]); 26 | print_table_end(); 27 | } 28 | 29 | #[no_mangle] 30 | pub extern fn say_hello(data: &ExecuteData, retval: &mut Zval) { 31 | let zs = zend_string_ptr_new(); 32 | zend_parse_parameters!(data.num_args(), "S", &zs); 33 | printf!("Hello world, Rust!"); 34 | zs.into_zval(retval) 35 | } 36 | 37 | #[no_mangle] 38 | pub extern fn get_module() -> *mut zend::Module { 39 | 40 | let mut entry = Box::new(zend::Module::new( 41 | c_str!("demo"), 42 | c_str!("0.1.0-dev"), 43 | 20180731, 44 | c_str!("API20180731,NTS") 45 | )); 46 | 47 | entry.set_info_func(php_module_info); 48 | 49 | let args = Box::new([ 50 | ArgInfo::new(1 as *const c_char, 0, 0, 0), 51 | ArgInfo::new(c_str!("name"), 0, 0, 0), 52 | ]); 53 | 54 | let funcs = Box::new([ 55 | Function::new(c_str!("say_hello"), say_hello), 56 | Function::new_with_args(c_str!("helloworld2"), say_hello, args), 57 | Function::end(), 58 | ]); 59 | 60 | entry.set_functions(funcs); 61 | 62 | Box::into_raw(entry) 63 | } 64 | -------------------------------------------------------------------------------- /src/zend/types.rs: -------------------------------------------------------------------------------- 1 | use libc::*; 2 | use std::ffi::CString; 3 | 4 | // Zend Types and Zval 5 | //https://github.com/php/php-src/blob/d0754b86b1cb4774c4af64498641ddaaab745418/Zend/zend_types.h#L176-L233 6 | #[repr(C)] 7 | pub union ZendValue { 8 | pub long_value: c_long, 9 | pub double_value: c_double, 10 | pub string: *mut ZendString, 11 | } 12 | 13 | #[repr(C)] 14 | pub union U1 { 15 | pub type_info: libc::uint32_t, 16 | } 17 | 18 | #[repr(C)] 19 | pub union U2 { 20 | pub next: libc::uint32_t, 21 | pub num_args: libc::uint32_t, 22 | } 23 | 24 | #[repr(C)] 25 | pub struct ZendRefCounted { 26 | pub ref_count: libc::uint32_t, 27 | pub type_info: libc::uint32_t, 28 | } 29 | 30 | #[repr(C)] 31 | pub struct ZendString { 32 | pub gc: ZendRefCounted, 33 | pub hash: libc::uint32_t, 34 | pub len: libc::size_t, 35 | pub value: *mut libc::c_char, 36 | } 37 | 38 | type ZendStringPtr = *mut ZendString; 39 | 40 | #[repr(C)] 41 | pub struct Zval { 42 | pub value: ZendValue, 43 | pub u1: U1, 44 | pub u2: U2, 45 | } 46 | 47 | extern "C" { 48 | fn zend_strpprintf(max_len: libc::size_t, format: *const c_char, ...) -> *mut ZendString; 49 | } 50 | 51 | fn zend_string(max_len: libc::size_t, format: &str) -> *mut ZendString { 52 | let c_format = CString::new(format).unwrap(); 53 | unsafe { 54 | let strg = zend_strpprintf(max_len, c_format.as_ptr()); 55 | strg 56 | } 57 | } 58 | 59 | pub fn zend_string_ptr_new() -> ZendStringPtr { 60 | std::ptr::null_mut() 61 | } 62 | 63 | impl From<&str> for ZendValue { 64 | fn from(rust_str: &str) -> Self { 65 | ZendValue { 66 | string: zend_string(rust_str.len(), rust_str), 67 | } 68 | } 69 | } 70 | 71 | pub trait IntoZval { 72 | fn into_zval(self, zval: &mut Zval); 73 | } 74 | 75 | impl IntoZval for &str { 76 | fn into_zval(self, zval: &mut Zval) { 77 | (*zval).u1.type_info = 6; 78 | (*zval).value = ZendValue::from(self); 79 | } 80 | } 81 | impl IntoZval for &mut ZendString { 82 | fn into_zval(self, zval: &mut Zval) { 83 | (*zval).u1.type_info = 6; 84 | (*zval).value.string = self 85 | } 86 | } 87 | 88 | impl IntoZval for ZendStringPtr { 89 | fn into_zval(self, zval: &mut Zval) { 90 | (*zval).u1.type_info = 6; 91 | (*zval).value.string = self 92 | } 93 | } 94 | 95 | impl IntoZval for i64 { 96 | fn into_zval(self, zval: &mut Zval) { 97 | (*zval).u1.type_info = 4; 98 | (*zval).value.long_value = self; 99 | } 100 | } 101 | 102 | impl IntoZval for u32 { 103 | fn into_zval(self, zval: &mut Zval) { 104 | (*zval).u1.type_info = 4; 105 | (*zval).value.long_value = i64::from(self); 106 | } 107 | } 108 | 109 | impl IntoZval for i32 { 110 | fn into_zval(self, zval: &mut Zval) { 111 | (*zval).u1.type_info = 4; 112 | (*zval).value.long_value = i64::from(self); 113 | } 114 | } -------------------------------------------------------------------------------- /src/zend/module.rs: -------------------------------------------------------------------------------- 1 | use std; 2 | use std::mem; 3 | use libc::*; 4 | use std::ffi::CString; 5 | use super::types::*; 6 | 7 | type StartupFunc = extern fn (type_: c_int, module_number: c_int) -> c_int; 8 | type ShutdownFunc = extern fn (type_: c_int, module_number: c_int) -> c_int; 9 | type InfoFunc = extern fn () ; 10 | type GlobalsCtorFunc = extern fn (global: *const c_void) -> c_void; 11 | type GlobalsDtorFunc = extern fn (global: *const c_void) -> c_void; 12 | type PostDeactivateFunc = extern fn () -> c_int; 13 | type HandlerFunc = extern fn (execute_data: &ExecuteData, retval: &mut Zval); 14 | 15 | #[repr(C)] 16 | pub struct zend_op { 17 | 18 | } 19 | 20 | #[repr(C)] 21 | pub struct zend_function { 22 | 23 | } 24 | 25 | #[repr(C)] 26 | pub struct ExecuteData { 27 | opline: *const zend_op, 28 | call: *mut ExecuteData, 29 | return_value: *mut Zval, 30 | func: *mut zend_function, 31 | this: Zval, 32 | } 33 | 34 | impl ExecuteData { 35 | pub fn num_args(&self) -> i32 36 | { 37 | unsafe { 38 | self.this.u2.num_args as i32 39 | } 40 | } 41 | } 42 | 43 | #[macro_export] 44 | macro_rules! zend_parse_parameters { 45 | ($num_args:expr, $format:expr, $($arg:expr), +) => { 46 | let c_format = CString::new($format).unwrap(); 47 | unsafe { 48 | php::zend::zend_parse_parameters($num_args, c_format.as_ptr(), $($arg), +); 49 | } 50 | } 51 | } 52 | 53 | pub struct ModuleDep {} 54 | 55 | #[repr(C)] 56 | pub struct ArgInfo { 57 | name: *const c_char, 58 | class_name: *const c_char, 59 | type_hint: c_uchar, 60 | pass_by_reference: c_uchar, 61 | allow_null: c_uchar, 62 | is_variadic: c_uchar, 63 | } 64 | 65 | impl ArgInfo { 66 | pub fn new(name: *const c_char, allow_null: c_uchar, is_variadic: c_uchar, by_reference: c_uchar) -> ArgInfo { 67 | ArgInfo { 68 | name: name, 69 | class_name: std::ptr::null(), 70 | type_hint: 0, 71 | pass_by_reference: by_reference, 72 | allow_null: allow_null, 73 | is_variadic: is_variadic, 74 | } 75 | } 76 | } 77 | 78 | #[repr(C)] 79 | pub struct Function { 80 | fname: *const c_char, 81 | handler: Option, 82 | arg_info: *const ArgInfo, 83 | num_args: u32, 84 | flags: u32, 85 | } 86 | 87 | impl Function { 88 | pub fn new(name: *const c_char, handler: HandlerFunc) -> Function { 89 | Function { 90 | fname: name, 91 | handler: Some(handler), 92 | arg_info: std::ptr::null(), 93 | num_args: 0, 94 | flags: 0, 95 | } 96 | } 97 | 98 | pub fn new_with_args(name: *const c_char, handler: HandlerFunc, args: Box<[ArgInfo]>) -> Function { 99 | let num_args = args.len() as u32; 100 | 101 | Function { 102 | fname: name, 103 | handler: Some(handler), 104 | arg_info: Box::into_raw(args) as *const ArgInfo, 105 | num_args: num_args - 1, 106 | flags: 0, 107 | } 108 | } 109 | 110 | pub fn end() -> Function { 111 | Function { 112 | fname: std::ptr::null(), 113 | handler: None, 114 | arg_info: std::ptr::null(), 115 | num_args: 0, 116 | flags: 0, 117 | } 118 | } 119 | 120 | } 121 | 122 | pub struct INI {} 123 | 124 | #[repr(C)] 125 | pub struct Module { 126 | size: c_ushort, 127 | zend_api: c_uint, 128 | zend_debug: c_uchar, 129 | zts: c_uchar, 130 | ini_entry: *const INI, 131 | deps: *const ModuleDep, 132 | name: *const c_char, 133 | functions: *const Function, 134 | module_startup_func: Option, 135 | module_shutdown_func: Option, 136 | request_startup_func: Option, 137 | request_shutdown_func: Option, 138 | info_func: Option, 139 | version: *const c_char, 140 | globals_size: size_t, 141 | globals_ptr: *const c_void, 142 | globals_ctor: Option, 143 | globals_dtor: Option, 144 | post_deactivate_func: Option, 145 | module_started: c_int, 146 | type_: c_uchar, 147 | handle: *const c_void, 148 | module_number: c_int, 149 | build_id: *const c_char, 150 | } 151 | 152 | impl Module { 153 | pub fn new(name: *const c_char, version: *const c_char, zend_api: c_uint, build_id: *const c_char) -> Module { 154 | Module { 155 | size: mem::size_of::() as u16, 156 | zend_api: zend_api, 157 | zend_debug: 0, 158 | zts: 0, 159 | ini_entry: std::ptr::null(), 160 | deps: std::ptr::null(), 161 | name: name, 162 | functions: std::ptr::null(), 163 | module_startup_func: None, 164 | module_shutdown_func: None, 165 | request_startup_func: None, 166 | request_shutdown_func: None, 167 | info_func: None, 168 | version: version, 169 | globals_size: 0, 170 | globals_ptr: std::ptr::null(), 171 | globals_ctor: None, 172 | globals_dtor: None, 173 | post_deactivate_func: None, 174 | module_started: 0, 175 | type_: 0, 176 | handle: std::ptr::null(), 177 | module_number: 0, 178 | build_id: build_id, 179 | } 180 | } 181 | 182 | pub fn set_startup_func(&mut self, func: StartupFunc) { 183 | self.module_startup_func = Some(func); 184 | } 185 | 186 | pub fn set_shutdown_func(&mut self, func: ShutdownFunc) { 187 | self.module_shutdown_func = Some(func); 188 | } 189 | 190 | pub fn set_info_func(&mut self, func: InfoFunc) { 191 | self.info_func = Some(func); 192 | } 193 | 194 | pub fn set_functions(&mut self, funcs: Box<[Function]>) { 195 | self.functions = Box::into_raw(funcs) as *const Function; 196 | } 197 | } 198 | 199 | unsafe impl Sync for Module {} 200 | 201 | 202 | extern "C" { 203 | pub fn zend_parse_parameters(num_args: i32, format: *const c_char, ...) -> i32; 204 | } 205 | -------------------------------------------------------------------------------- /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": "bec89288d8d3632a5bb9137d5261f755", 8 | "packages": [ 9 | { 10 | "name": "doctrine/instantiator", 11 | "version": "1.2.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/instantiator.git", 15 | "reference": "a2c590166b2133a4633738648b6b064edae0814a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", 20 | "reference": "a2c590166b2133a4633738648b6b064edae0814a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1" 25 | }, 26 | "require-dev": { 27 | "doctrine/coding-standard": "^6.0", 28 | "ext-pdo": "*", 29 | "ext-phar": "*", 30 | "phpbench/phpbench": "^0.13", 31 | "phpstan/phpstan-phpunit": "^0.11", 32 | "phpstan/phpstan-shim": "^0.11", 33 | "phpunit/phpunit": "^7.0" 34 | }, 35 | "type": "library", 36 | "extra": { 37 | "branch-alias": { 38 | "dev-master": "1.2.x-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Marco Pivetta", 53 | "email": "ocramius@gmail.com", 54 | "homepage": "http://ocramius.github.com/" 55 | } 56 | ], 57 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 58 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 59 | "keywords": [ 60 | "constructor", 61 | "instantiate" 62 | ], 63 | "time": "2019-03-17T17:37:11+00:00" 64 | }, 65 | { 66 | "name": "myclabs/deep-copy", 67 | "version": "1.9.3", 68 | "source": { 69 | "type": "git", 70 | "url": "https://github.com/myclabs/DeepCopy.git", 71 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" 72 | }, 73 | "dist": { 74 | "type": "zip", 75 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", 76 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", 77 | "shasum": "" 78 | }, 79 | "require": { 80 | "php": "^7.1" 81 | }, 82 | "replace": { 83 | "myclabs/deep-copy": "self.version" 84 | }, 85 | "require-dev": { 86 | "doctrine/collections": "^1.0", 87 | "doctrine/common": "^2.6", 88 | "phpunit/phpunit": "^7.1" 89 | }, 90 | "type": "library", 91 | "autoload": { 92 | "psr-4": { 93 | "DeepCopy\\": "src/DeepCopy/" 94 | }, 95 | "files": [ 96 | "src/DeepCopy/deep_copy.php" 97 | ] 98 | }, 99 | "notification-url": "https://packagist.org/downloads/", 100 | "license": [ 101 | "MIT" 102 | ], 103 | "description": "Create deep copies (clones) of your objects", 104 | "keywords": [ 105 | "clone", 106 | "copy", 107 | "duplicate", 108 | "object", 109 | "object graph" 110 | ], 111 | "time": "2019-08-09T12:45:53+00:00" 112 | }, 113 | { 114 | "name": "phar-io/manifest", 115 | "version": "1.0.3", 116 | "source": { 117 | "type": "git", 118 | "url": "https://github.com/phar-io/manifest.git", 119 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 120 | }, 121 | "dist": { 122 | "type": "zip", 123 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 124 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 125 | "shasum": "" 126 | }, 127 | "require": { 128 | "ext-dom": "*", 129 | "ext-phar": "*", 130 | "phar-io/version": "^2.0", 131 | "php": "^5.6 || ^7.0" 132 | }, 133 | "type": "library", 134 | "extra": { 135 | "branch-alias": { 136 | "dev-master": "1.0.x-dev" 137 | } 138 | }, 139 | "autoload": { 140 | "classmap": [ 141 | "src/" 142 | ] 143 | }, 144 | "notification-url": "https://packagist.org/downloads/", 145 | "license": [ 146 | "BSD-3-Clause" 147 | ], 148 | "authors": [ 149 | { 150 | "name": "Arne Blankerts", 151 | "role": "Developer", 152 | "email": "arne@blankerts.de" 153 | }, 154 | { 155 | "name": "Sebastian Heuer", 156 | "role": "Developer", 157 | "email": "sebastian@phpeople.de" 158 | }, 159 | { 160 | "name": "Sebastian Bergmann", 161 | "role": "Developer", 162 | "email": "sebastian@phpunit.de" 163 | } 164 | ], 165 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 166 | "time": "2018-07-08T19:23:20+00:00" 167 | }, 168 | { 169 | "name": "phar-io/version", 170 | "version": "2.0.1", 171 | "source": { 172 | "type": "git", 173 | "url": "https://github.com/phar-io/version.git", 174 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 175 | }, 176 | "dist": { 177 | "type": "zip", 178 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 179 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 180 | "shasum": "" 181 | }, 182 | "require": { 183 | "php": "^5.6 || ^7.0" 184 | }, 185 | "type": "library", 186 | "autoload": { 187 | "classmap": [ 188 | "src/" 189 | ] 190 | }, 191 | "notification-url": "https://packagist.org/downloads/", 192 | "license": [ 193 | "BSD-3-Clause" 194 | ], 195 | "authors": [ 196 | { 197 | "name": "Arne Blankerts", 198 | "email": "arne@blankerts.de", 199 | "role": "Developer" 200 | }, 201 | { 202 | "name": "Sebastian Heuer", 203 | "email": "sebastian@phpeople.de", 204 | "role": "Developer" 205 | }, 206 | { 207 | "name": "Sebastian Bergmann", 208 | "email": "sebastian@phpunit.de", 209 | "role": "Developer" 210 | } 211 | ], 212 | "description": "Library for handling version information and constraints", 213 | "time": "2018-07-08T19:19:57+00:00" 214 | }, 215 | { 216 | "name": "phpdocumentor/reflection-common", 217 | "version": "1.0.1", 218 | "source": { 219 | "type": "git", 220 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 221 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 222 | }, 223 | "dist": { 224 | "type": "zip", 225 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 226 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 227 | "shasum": "" 228 | }, 229 | "require": { 230 | "php": ">=5.5" 231 | }, 232 | "require-dev": { 233 | "phpunit/phpunit": "^4.6" 234 | }, 235 | "type": "library", 236 | "extra": { 237 | "branch-alias": { 238 | "dev-master": "1.0.x-dev" 239 | } 240 | }, 241 | "autoload": { 242 | "psr-4": { 243 | "phpDocumentor\\Reflection\\": [ 244 | "src" 245 | ] 246 | } 247 | }, 248 | "notification-url": "https://packagist.org/downloads/", 249 | "license": [ 250 | "MIT" 251 | ], 252 | "authors": [ 253 | { 254 | "name": "Jaap van Otterdijk", 255 | "email": "opensource@ijaap.nl" 256 | } 257 | ], 258 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 259 | "homepage": "http://www.phpdoc.org", 260 | "keywords": [ 261 | "FQSEN", 262 | "phpDocumentor", 263 | "phpdoc", 264 | "reflection", 265 | "static analysis" 266 | ], 267 | "time": "2017-09-11T18:02:19+00:00" 268 | }, 269 | { 270 | "name": "phpdocumentor/reflection-docblock", 271 | "version": "4.3.1", 272 | "source": { 273 | "type": "git", 274 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 275 | "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" 276 | }, 277 | "dist": { 278 | "type": "zip", 279 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", 280 | "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", 281 | "shasum": "" 282 | }, 283 | "require": { 284 | "php": "^7.0", 285 | "phpdocumentor/reflection-common": "^1.0.0", 286 | "phpdocumentor/type-resolver": "^0.4.0", 287 | "webmozart/assert": "^1.0" 288 | }, 289 | "require-dev": { 290 | "doctrine/instantiator": "~1.0.5", 291 | "mockery/mockery": "^1.0", 292 | "phpunit/phpunit": "^6.4" 293 | }, 294 | "type": "library", 295 | "extra": { 296 | "branch-alias": { 297 | "dev-master": "4.x-dev" 298 | } 299 | }, 300 | "autoload": { 301 | "psr-4": { 302 | "phpDocumentor\\Reflection\\": [ 303 | "src/" 304 | ] 305 | } 306 | }, 307 | "notification-url": "https://packagist.org/downloads/", 308 | "license": [ 309 | "MIT" 310 | ], 311 | "authors": [ 312 | { 313 | "name": "Mike van Riel", 314 | "email": "me@mikevanriel.com" 315 | } 316 | ], 317 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 318 | "time": "2019-04-30T17:48:53+00:00" 319 | }, 320 | { 321 | "name": "phpdocumentor/type-resolver", 322 | "version": "0.4.0", 323 | "source": { 324 | "type": "git", 325 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 326 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 327 | }, 328 | "dist": { 329 | "type": "zip", 330 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 331 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 332 | "shasum": "" 333 | }, 334 | "require": { 335 | "php": "^5.5 || ^7.0", 336 | "phpdocumentor/reflection-common": "^1.0" 337 | }, 338 | "require-dev": { 339 | "mockery/mockery": "^0.9.4", 340 | "phpunit/phpunit": "^5.2||^4.8.24" 341 | }, 342 | "type": "library", 343 | "extra": { 344 | "branch-alias": { 345 | "dev-master": "1.0.x-dev" 346 | } 347 | }, 348 | "autoload": { 349 | "psr-4": { 350 | "phpDocumentor\\Reflection\\": [ 351 | "src/" 352 | ] 353 | } 354 | }, 355 | "notification-url": "https://packagist.org/downloads/", 356 | "license": [ 357 | "MIT" 358 | ], 359 | "authors": [ 360 | { 361 | "name": "Mike van Riel", 362 | "email": "me@mikevanriel.com" 363 | } 364 | ], 365 | "time": "2017-07-14T14:27:02+00:00" 366 | }, 367 | { 368 | "name": "phpspec/prophecy", 369 | "version": "1.8.1", 370 | "source": { 371 | "type": "git", 372 | "url": "https://github.com/phpspec/prophecy.git", 373 | "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76" 374 | }, 375 | "dist": { 376 | "type": "zip", 377 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76", 378 | "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76", 379 | "shasum": "" 380 | }, 381 | "require": { 382 | "doctrine/instantiator": "^1.0.2", 383 | "php": "^5.3|^7.0", 384 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 385 | "sebastian/comparator": "^1.1|^2.0|^3.0", 386 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 387 | }, 388 | "require-dev": { 389 | "phpspec/phpspec": "^2.5|^3.2", 390 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 391 | }, 392 | "type": "library", 393 | "extra": { 394 | "branch-alias": { 395 | "dev-master": "1.8.x-dev" 396 | } 397 | }, 398 | "autoload": { 399 | "psr-4": { 400 | "Prophecy\\": "src/Prophecy" 401 | } 402 | }, 403 | "notification-url": "https://packagist.org/downloads/", 404 | "license": [ 405 | "MIT" 406 | ], 407 | "authors": [ 408 | { 409 | "name": "Konstantin Kudryashov", 410 | "email": "ever.zet@gmail.com", 411 | "homepage": "http://everzet.com" 412 | }, 413 | { 414 | "name": "Marcello Duarte", 415 | "email": "marcello.duarte@gmail.com" 416 | } 417 | ], 418 | "description": "Highly opinionated mocking framework for PHP 5.3+", 419 | "homepage": "https://github.com/phpspec/prophecy", 420 | "keywords": [ 421 | "Double", 422 | "Dummy", 423 | "fake", 424 | "mock", 425 | "spy", 426 | "stub" 427 | ], 428 | "time": "2019-06-13T12:50:23+00:00" 429 | }, 430 | { 431 | "name": "phpunit/php-code-coverage", 432 | "version": "6.1.4", 433 | "source": { 434 | "type": "git", 435 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 436 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" 437 | }, 438 | "dist": { 439 | "type": "zip", 440 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 441 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 442 | "shasum": "" 443 | }, 444 | "require": { 445 | "ext-dom": "*", 446 | "ext-xmlwriter": "*", 447 | "php": "^7.1", 448 | "phpunit/php-file-iterator": "^2.0", 449 | "phpunit/php-text-template": "^1.2.1", 450 | "phpunit/php-token-stream": "^3.0", 451 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 452 | "sebastian/environment": "^3.1 || ^4.0", 453 | "sebastian/version": "^2.0.1", 454 | "theseer/tokenizer": "^1.1" 455 | }, 456 | "require-dev": { 457 | "phpunit/phpunit": "^7.0" 458 | }, 459 | "suggest": { 460 | "ext-xdebug": "^2.6.0" 461 | }, 462 | "type": "library", 463 | "extra": { 464 | "branch-alias": { 465 | "dev-master": "6.1-dev" 466 | } 467 | }, 468 | "autoload": { 469 | "classmap": [ 470 | "src/" 471 | ] 472 | }, 473 | "notification-url": "https://packagist.org/downloads/", 474 | "license": [ 475 | "BSD-3-Clause" 476 | ], 477 | "authors": [ 478 | { 479 | "name": "Sebastian Bergmann", 480 | "email": "sebastian@phpunit.de", 481 | "role": "lead" 482 | } 483 | ], 484 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 485 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 486 | "keywords": [ 487 | "coverage", 488 | "testing", 489 | "xunit" 490 | ], 491 | "time": "2018-10-31T16:06:48+00:00" 492 | }, 493 | { 494 | "name": "phpunit/php-file-iterator", 495 | "version": "2.0.2", 496 | "source": { 497 | "type": "git", 498 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 499 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 500 | }, 501 | "dist": { 502 | "type": "zip", 503 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 504 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 505 | "shasum": "" 506 | }, 507 | "require": { 508 | "php": "^7.1" 509 | }, 510 | "require-dev": { 511 | "phpunit/phpunit": "^7.1" 512 | }, 513 | "type": "library", 514 | "extra": { 515 | "branch-alias": { 516 | "dev-master": "2.0.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": "sebastian@phpunit.de", 532 | "role": "lead" 533 | } 534 | ], 535 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 536 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 537 | "keywords": [ 538 | "filesystem", 539 | "iterator" 540 | ], 541 | "time": "2018-09-13T20:33:42+00:00" 542 | }, 543 | { 544 | "name": "phpunit/php-text-template", 545 | "version": "1.2.1", 546 | "source": { 547 | "type": "git", 548 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 549 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 550 | }, 551 | "dist": { 552 | "type": "zip", 553 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 554 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 555 | "shasum": "" 556 | }, 557 | "require": { 558 | "php": ">=5.3.3" 559 | }, 560 | "type": "library", 561 | "autoload": { 562 | "classmap": [ 563 | "src/" 564 | ] 565 | }, 566 | "notification-url": "https://packagist.org/downloads/", 567 | "license": [ 568 | "BSD-3-Clause" 569 | ], 570 | "authors": [ 571 | { 572 | "name": "Sebastian Bergmann", 573 | "email": "sebastian@phpunit.de", 574 | "role": "lead" 575 | } 576 | ], 577 | "description": "Simple template engine.", 578 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 579 | "keywords": [ 580 | "template" 581 | ], 582 | "time": "2015-06-21T13:50:34+00:00" 583 | }, 584 | { 585 | "name": "phpunit/php-timer", 586 | "version": "2.1.2", 587 | "source": { 588 | "type": "git", 589 | "url": "https://github.com/sebastianbergmann/php-timer.git", 590 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 591 | }, 592 | "dist": { 593 | "type": "zip", 594 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 595 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 596 | "shasum": "" 597 | }, 598 | "require": { 599 | "php": "^7.1" 600 | }, 601 | "require-dev": { 602 | "phpunit/phpunit": "^7.0" 603 | }, 604 | "type": "library", 605 | "extra": { 606 | "branch-alias": { 607 | "dev-master": "2.1-dev" 608 | } 609 | }, 610 | "autoload": { 611 | "classmap": [ 612 | "src/" 613 | ] 614 | }, 615 | "notification-url": "https://packagist.org/downloads/", 616 | "license": [ 617 | "BSD-3-Clause" 618 | ], 619 | "authors": [ 620 | { 621 | "name": "Sebastian Bergmann", 622 | "email": "sebastian@phpunit.de", 623 | "role": "lead" 624 | } 625 | ], 626 | "description": "Utility class for timing", 627 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 628 | "keywords": [ 629 | "timer" 630 | ], 631 | "time": "2019-06-07T04:22:29+00:00" 632 | }, 633 | { 634 | "name": "phpunit/php-token-stream", 635 | "version": "3.1.0", 636 | "source": { 637 | "type": "git", 638 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 639 | "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a" 640 | }, 641 | "dist": { 642 | "type": "zip", 643 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e899757bb3df5ff6e95089132f32cd59aac2220a", 644 | "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a", 645 | "shasum": "" 646 | }, 647 | "require": { 648 | "ext-tokenizer": "*", 649 | "php": "^7.1" 650 | }, 651 | "require-dev": { 652 | "phpunit/phpunit": "^7.0" 653 | }, 654 | "type": "library", 655 | "extra": { 656 | "branch-alias": { 657 | "dev-master": "3.1-dev" 658 | } 659 | }, 660 | "autoload": { 661 | "classmap": [ 662 | "src/" 663 | ] 664 | }, 665 | "notification-url": "https://packagist.org/downloads/", 666 | "license": [ 667 | "BSD-3-Clause" 668 | ], 669 | "authors": [ 670 | { 671 | "name": "Sebastian Bergmann", 672 | "email": "sebastian@phpunit.de" 673 | } 674 | ], 675 | "description": "Wrapper around PHP's tokenizer extension.", 676 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 677 | "keywords": [ 678 | "tokenizer" 679 | ], 680 | "time": "2019-07-25T05:29:42+00:00" 681 | }, 682 | { 683 | "name": "phpunit/phpunit", 684 | "version": "7.5.15", 685 | "source": { 686 | "type": "git", 687 | "url": "https://github.com/sebastianbergmann/phpunit.git", 688 | "reference": "d79c053d972856b8b941bb233e39dc521a5093f0" 689 | }, 690 | "dist": { 691 | "type": "zip", 692 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d79c053d972856b8b941bb233e39dc521a5093f0", 693 | "reference": "d79c053d972856b8b941bb233e39dc521a5093f0", 694 | "shasum": "" 695 | }, 696 | "require": { 697 | "doctrine/instantiator": "^1.1", 698 | "ext-dom": "*", 699 | "ext-json": "*", 700 | "ext-libxml": "*", 701 | "ext-mbstring": "*", 702 | "ext-xml": "*", 703 | "myclabs/deep-copy": "^1.7", 704 | "phar-io/manifest": "^1.0.2", 705 | "phar-io/version": "^2.0", 706 | "php": "^7.1", 707 | "phpspec/prophecy": "^1.7", 708 | "phpunit/php-code-coverage": "^6.0.7", 709 | "phpunit/php-file-iterator": "^2.0.1", 710 | "phpunit/php-text-template": "^1.2.1", 711 | "phpunit/php-timer": "^2.1", 712 | "sebastian/comparator": "^3.0", 713 | "sebastian/diff": "^3.0", 714 | "sebastian/environment": "^4.0", 715 | "sebastian/exporter": "^3.1", 716 | "sebastian/global-state": "^2.0", 717 | "sebastian/object-enumerator": "^3.0.3", 718 | "sebastian/resource-operations": "^2.0", 719 | "sebastian/version": "^2.0.1" 720 | }, 721 | "conflict": { 722 | "phpunit/phpunit-mock-objects": "*" 723 | }, 724 | "require-dev": { 725 | "ext-pdo": "*" 726 | }, 727 | "suggest": { 728 | "ext-soap": "*", 729 | "ext-xdebug": "*", 730 | "phpunit/php-invoker": "^2.0" 731 | }, 732 | "bin": [ 733 | "phpunit" 734 | ], 735 | "type": "library", 736 | "extra": { 737 | "branch-alias": { 738 | "dev-master": "7.5-dev" 739 | } 740 | }, 741 | "autoload": { 742 | "classmap": [ 743 | "src/" 744 | ] 745 | }, 746 | "notification-url": "https://packagist.org/downloads/", 747 | "license": [ 748 | "BSD-3-Clause" 749 | ], 750 | "authors": [ 751 | { 752 | "name": "Sebastian Bergmann", 753 | "email": "sebastian@phpunit.de", 754 | "role": "lead" 755 | } 756 | ], 757 | "description": "The PHP Unit Testing framework.", 758 | "homepage": "https://phpunit.de/", 759 | "keywords": [ 760 | "phpunit", 761 | "testing", 762 | "xunit" 763 | ], 764 | "time": "2019-08-21T07:05:16+00:00" 765 | }, 766 | { 767 | "name": "sebastian/code-unit-reverse-lookup", 768 | "version": "1.0.1", 769 | "source": { 770 | "type": "git", 771 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 772 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 773 | }, 774 | "dist": { 775 | "type": "zip", 776 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 777 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 778 | "shasum": "" 779 | }, 780 | "require": { 781 | "php": "^5.6 || ^7.0" 782 | }, 783 | "require-dev": { 784 | "phpunit/phpunit": "^5.7 || ^6.0" 785 | }, 786 | "type": "library", 787 | "extra": { 788 | "branch-alias": { 789 | "dev-master": "1.0.x-dev" 790 | } 791 | }, 792 | "autoload": { 793 | "classmap": [ 794 | "src/" 795 | ] 796 | }, 797 | "notification-url": "https://packagist.org/downloads/", 798 | "license": [ 799 | "BSD-3-Clause" 800 | ], 801 | "authors": [ 802 | { 803 | "name": "Sebastian Bergmann", 804 | "email": "sebastian@phpunit.de" 805 | } 806 | ], 807 | "description": "Looks up which function or method a line of code belongs to", 808 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 809 | "time": "2017-03-04T06:30:41+00:00" 810 | }, 811 | { 812 | "name": "sebastian/comparator", 813 | "version": "3.0.2", 814 | "source": { 815 | "type": "git", 816 | "url": "https://github.com/sebastianbergmann/comparator.git", 817 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 818 | }, 819 | "dist": { 820 | "type": "zip", 821 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 822 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 823 | "shasum": "" 824 | }, 825 | "require": { 826 | "php": "^7.1", 827 | "sebastian/diff": "^3.0", 828 | "sebastian/exporter": "^3.1" 829 | }, 830 | "require-dev": { 831 | "phpunit/phpunit": "^7.1" 832 | }, 833 | "type": "library", 834 | "extra": { 835 | "branch-alias": { 836 | "dev-master": "3.0-dev" 837 | } 838 | }, 839 | "autoload": { 840 | "classmap": [ 841 | "src/" 842 | ] 843 | }, 844 | "notification-url": "https://packagist.org/downloads/", 845 | "license": [ 846 | "BSD-3-Clause" 847 | ], 848 | "authors": [ 849 | { 850 | "name": "Jeff Welch", 851 | "email": "whatthejeff@gmail.com" 852 | }, 853 | { 854 | "name": "Volker Dusch", 855 | "email": "github@wallbash.com" 856 | }, 857 | { 858 | "name": "Bernhard Schussek", 859 | "email": "bschussek@2bepublished.at" 860 | }, 861 | { 862 | "name": "Sebastian Bergmann", 863 | "email": "sebastian@phpunit.de" 864 | } 865 | ], 866 | "description": "Provides the functionality to compare PHP values for equality", 867 | "homepage": "https://github.com/sebastianbergmann/comparator", 868 | "keywords": [ 869 | "comparator", 870 | "compare", 871 | "equality" 872 | ], 873 | "time": "2018-07-12T15:12:46+00:00" 874 | }, 875 | { 876 | "name": "sebastian/diff", 877 | "version": "3.0.2", 878 | "source": { 879 | "type": "git", 880 | "url": "https://github.com/sebastianbergmann/diff.git", 881 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 882 | }, 883 | "dist": { 884 | "type": "zip", 885 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 886 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 887 | "shasum": "" 888 | }, 889 | "require": { 890 | "php": "^7.1" 891 | }, 892 | "require-dev": { 893 | "phpunit/phpunit": "^7.5 || ^8.0", 894 | "symfony/process": "^2 || ^3.3 || ^4" 895 | }, 896 | "type": "library", 897 | "extra": { 898 | "branch-alias": { 899 | "dev-master": "3.0-dev" 900 | } 901 | }, 902 | "autoload": { 903 | "classmap": [ 904 | "src/" 905 | ] 906 | }, 907 | "notification-url": "https://packagist.org/downloads/", 908 | "license": [ 909 | "BSD-3-Clause" 910 | ], 911 | "authors": [ 912 | { 913 | "name": "Kore Nordmann", 914 | "email": "mail@kore-nordmann.de" 915 | }, 916 | { 917 | "name": "Sebastian Bergmann", 918 | "email": "sebastian@phpunit.de" 919 | } 920 | ], 921 | "description": "Diff implementation", 922 | "homepage": "https://github.com/sebastianbergmann/diff", 923 | "keywords": [ 924 | "diff", 925 | "udiff", 926 | "unidiff", 927 | "unified diff" 928 | ], 929 | "time": "2019-02-04T06:01:07+00:00" 930 | }, 931 | { 932 | "name": "sebastian/environment", 933 | "version": "4.2.2", 934 | "source": { 935 | "type": "git", 936 | "url": "https://github.com/sebastianbergmann/environment.git", 937 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" 938 | }, 939 | "dist": { 940 | "type": "zip", 941 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 942 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 943 | "shasum": "" 944 | }, 945 | "require": { 946 | "php": "^7.1" 947 | }, 948 | "require-dev": { 949 | "phpunit/phpunit": "^7.5" 950 | }, 951 | "suggest": { 952 | "ext-posix": "*" 953 | }, 954 | "type": "library", 955 | "extra": { 956 | "branch-alias": { 957 | "dev-master": "4.2-dev" 958 | } 959 | }, 960 | "autoload": { 961 | "classmap": [ 962 | "src/" 963 | ] 964 | }, 965 | "notification-url": "https://packagist.org/downloads/", 966 | "license": [ 967 | "BSD-3-Clause" 968 | ], 969 | "authors": [ 970 | { 971 | "name": "Sebastian Bergmann", 972 | "email": "sebastian@phpunit.de" 973 | } 974 | ], 975 | "description": "Provides functionality to handle HHVM/PHP environments", 976 | "homepage": "http://www.github.com/sebastianbergmann/environment", 977 | "keywords": [ 978 | "Xdebug", 979 | "environment", 980 | "hhvm" 981 | ], 982 | "time": "2019-05-05T09:05:15+00:00" 983 | }, 984 | { 985 | "name": "sebastian/exporter", 986 | "version": "3.1.1", 987 | "source": { 988 | "type": "git", 989 | "url": "https://github.com/sebastianbergmann/exporter.git", 990 | "reference": "06a9a5947f47b3029d76118eb5c22802e5869687" 991 | }, 992 | "dist": { 993 | "type": "zip", 994 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/06a9a5947f47b3029d76118eb5c22802e5869687", 995 | "reference": "06a9a5947f47b3029d76118eb5c22802e5869687", 996 | "shasum": "" 997 | }, 998 | "require": { 999 | "php": "^7.0", 1000 | "sebastian/recursion-context": "^3.0" 1001 | }, 1002 | "require-dev": { 1003 | "ext-mbstring": "*", 1004 | "phpunit/phpunit": "^6.0" 1005 | }, 1006 | "type": "library", 1007 | "extra": { 1008 | "branch-alias": { 1009 | "dev-master": "3.1.x-dev" 1010 | } 1011 | }, 1012 | "autoload": { 1013 | "classmap": [ 1014 | "src/" 1015 | ] 1016 | }, 1017 | "notification-url": "https://packagist.org/downloads/", 1018 | "license": [ 1019 | "BSD-3-Clause" 1020 | ], 1021 | "authors": [ 1022 | { 1023 | "name": "Sebastian Bergmann", 1024 | "email": "sebastian@phpunit.de" 1025 | }, 1026 | { 1027 | "name": "Jeff Welch", 1028 | "email": "whatthejeff@gmail.com" 1029 | }, 1030 | { 1031 | "name": "Volker Dusch", 1032 | "email": "github@wallbash.com" 1033 | }, 1034 | { 1035 | "name": "Adam Harvey", 1036 | "email": "aharvey@php.net" 1037 | }, 1038 | { 1039 | "name": "Bernhard Schussek", 1040 | "email": "bschussek@gmail.com" 1041 | } 1042 | ], 1043 | "description": "Provides the functionality to export PHP variables for visualization", 1044 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1045 | "keywords": [ 1046 | "export", 1047 | "exporter" 1048 | ], 1049 | "time": "2019-08-11T12:43:14+00:00" 1050 | }, 1051 | { 1052 | "name": "sebastian/global-state", 1053 | "version": "2.0.0", 1054 | "source": { 1055 | "type": "git", 1056 | "url": "https://github.com/sebastianbergmann/global-state.git", 1057 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1058 | }, 1059 | "dist": { 1060 | "type": "zip", 1061 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1062 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1063 | "shasum": "" 1064 | }, 1065 | "require": { 1066 | "php": "^7.0" 1067 | }, 1068 | "require-dev": { 1069 | "phpunit/phpunit": "^6.0" 1070 | }, 1071 | "suggest": { 1072 | "ext-uopz": "*" 1073 | }, 1074 | "type": "library", 1075 | "extra": { 1076 | "branch-alias": { 1077 | "dev-master": "2.0-dev" 1078 | } 1079 | }, 1080 | "autoload": { 1081 | "classmap": [ 1082 | "src/" 1083 | ] 1084 | }, 1085 | "notification-url": "https://packagist.org/downloads/", 1086 | "license": [ 1087 | "BSD-3-Clause" 1088 | ], 1089 | "authors": [ 1090 | { 1091 | "name": "Sebastian Bergmann", 1092 | "email": "sebastian@phpunit.de" 1093 | } 1094 | ], 1095 | "description": "Snapshotting of global state", 1096 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1097 | "keywords": [ 1098 | "global state" 1099 | ], 1100 | "time": "2017-04-27T15:39:26+00:00" 1101 | }, 1102 | { 1103 | "name": "sebastian/object-enumerator", 1104 | "version": "3.0.3", 1105 | "source": { 1106 | "type": "git", 1107 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1108 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1109 | }, 1110 | "dist": { 1111 | "type": "zip", 1112 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1113 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1114 | "shasum": "" 1115 | }, 1116 | "require": { 1117 | "php": "^7.0", 1118 | "sebastian/object-reflector": "^1.1.1", 1119 | "sebastian/recursion-context": "^3.0" 1120 | }, 1121 | "require-dev": { 1122 | "phpunit/phpunit": "^6.0" 1123 | }, 1124 | "type": "library", 1125 | "extra": { 1126 | "branch-alias": { 1127 | "dev-master": "3.0.x-dev" 1128 | } 1129 | }, 1130 | "autoload": { 1131 | "classmap": [ 1132 | "src/" 1133 | ] 1134 | }, 1135 | "notification-url": "https://packagist.org/downloads/", 1136 | "license": [ 1137 | "BSD-3-Clause" 1138 | ], 1139 | "authors": [ 1140 | { 1141 | "name": "Sebastian Bergmann", 1142 | "email": "sebastian@phpunit.de" 1143 | } 1144 | ], 1145 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1146 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1147 | "time": "2017-08-03T12:35:26+00:00" 1148 | }, 1149 | { 1150 | "name": "sebastian/object-reflector", 1151 | "version": "1.1.1", 1152 | "source": { 1153 | "type": "git", 1154 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1155 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1156 | }, 1157 | "dist": { 1158 | "type": "zip", 1159 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1160 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1161 | "shasum": "" 1162 | }, 1163 | "require": { 1164 | "php": "^7.0" 1165 | }, 1166 | "require-dev": { 1167 | "phpunit/phpunit": "^6.0" 1168 | }, 1169 | "type": "library", 1170 | "extra": { 1171 | "branch-alias": { 1172 | "dev-master": "1.1-dev" 1173 | } 1174 | }, 1175 | "autoload": { 1176 | "classmap": [ 1177 | "src/" 1178 | ] 1179 | }, 1180 | "notification-url": "https://packagist.org/downloads/", 1181 | "license": [ 1182 | "BSD-3-Clause" 1183 | ], 1184 | "authors": [ 1185 | { 1186 | "name": "Sebastian Bergmann", 1187 | "email": "sebastian@phpunit.de" 1188 | } 1189 | ], 1190 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1191 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1192 | "time": "2017-03-29T09:07:27+00:00" 1193 | }, 1194 | { 1195 | "name": "sebastian/recursion-context", 1196 | "version": "3.0.0", 1197 | "source": { 1198 | "type": "git", 1199 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1200 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1201 | }, 1202 | "dist": { 1203 | "type": "zip", 1204 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1205 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1206 | "shasum": "" 1207 | }, 1208 | "require": { 1209 | "php": "^7.0" 1210 | }, 1211 | "require-dev": { 1212 | "phpunit/phpunit": "^6.0" 1213 | }, 1214 | "type": "library", 1215 | "extra": { 1216 | "branch-alias": { 1217 | "dev-master": "3.0.x-dev" 1218 | } 1219 | }, 1220 | "autoload": { 1221 | "classmap": [ 1222 | "src/" 1223 | ] 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "BSD-3-Clause" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "Jeff Welch", 1232 | "email": "whatthejeff@gmail.com" 1233 | }, 1234 | { 1235 | "name": "Sebastian Bergmann", 1236 | "email": "sebastian@phpunit.de" 1237 | }, 1238 | { 1239 | "name": "Adam Harvey", 1240 | "email": "aharvey@php.net" 1241 | } 1242 | ], 1243 | "description": "Provides functionality to recursively process PHP variables", 1244 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1245 | "time": "2017-03-03T06:23:57+00:00" 1246 | }, 1247 | { 1248 | "name": "sebastian/resource-operations", 1249 | "version": "2.0.1", 1250 | "source": { 1251 | "type": "git", 1252 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1253 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1254 | }, 1255 | "dist": { 1256 | "type": "zip", 1257 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1258 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1259 | "shasum": "" 1260 | }, 1261 | "require": { 1262 | "php": "^7.1" 1263 | }, 1264 | "type": "library", 1265 | "extra": { 1266 | "branch-alias": { 1267 | "dev-master": "2.0-dev" 1268 | } 1269 | }, 1270 | "autoload": { 1271 | "classmap": [ 1272 | "src/" 1273 | ] 1274 | }, 1275 | "notification-url": "https://packagist.org/downloads/", 1276 | "license": [ 1277 | "BSD-3-Clause" 1278 | ], 1279 | "authors": [ 1280 | { 1281 | "name": "Sebastian Bergmann", 1282 | "email": "sebastian@phpunit.de" 1283 | } 1284 | ], 1285 | "description": "Provides a list of PHP built-in functions that operate on resources", 1286 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1287 | "time": "2018-10-04T04:07:39+00:00" 1288 | }, 1289 | { 1290 | "name": "sebastian/version", 1291 | "version": "2.0.1", 1292 | "source": { 1293 | "type": "git", 1294 | "url": "https://github.com/sebastianbergmann/version.git", 1295 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1296 | }, 1297 | "dist": { 1298 | "type": "zip", 1299 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1300 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1301 | "shasum": "" 1302 | }, 1303 | "require": { 1304 | "php": ">=5.6" 1305 | }, 1306 | "type": "library", 1307 | "extra": { 1308 | "branch-alias": { 1309 | "dev-master": "2.0.x-dev" 1310 | } 1311 | }, 1312 | "autoload": { 1313 | "classmap": [ 1314 | "src/" 1315 | ] 1316 | }, 1317 | "notification-url": "https://packagist.org/downloads/", 1318 | "license": [ 1319 | "BSD-3-Clause" 1320 | ], 1321 | "authors": [ 1322 | { 1323 | "name": "Sebastian Bergmann", 1324 | "email": "sebastian@phpunit.de", 1325 | "role": "lead" 1326 | } 1327 | ], 1328 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1329 | "homepage": "https://github.com/sebastianbergmann/version", 1330 | "time": "2016-10-03T07:35:21+00:00" 1331 | }, 1332 | { 1333 | "name": "symfony/polyfill-ctype", 1334 | "version": "v1.12.0", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/symfony/polyfill-ctype.git", 1338 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", 1343 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": ">=5.3.3" 1348 | }, 1349 | "suggest": { 1350 | "ext-ctype": "For best performance" 1351 | }, 1352 | "type": "library", 1353 | "extra": { 1354 | "branch-alias": { 1355 | "dev-master": "1.12-dev" 1356 | } 1357 | }, 1358 | "autoload": { 1359 | "psr-4": { 1360 | "Symfony\\Polyfill\\Ctype\\": "" 1361 | }, 1362 | "files": [ 1363 | "bootstrap.php" 1364 | ] 1365 | }, 1366 | "notification-url": "https://packagist.org/downloads/", 1367 | "license": [ 1368 | "MIT" 1369 | ], 1370 | "authors": [ 1371 | { 1372 | "name": "Gert de Pagter", 1373 | "email": "BackEndTea@gmail.com" 1374 | }, 1375 | { 1376 | "name": "Symfony Community", 1377 | "homepage": "https://symfony.com/contributors" 1378 | } 1379 | ], 1380 | "description": "Symfony polyfill for ctype functions", 1381 | "homepage": "https://symfony.com", 1382 | "keywords": [ 1383 | "compatibility", 1384 | "ctype", 1385 | "polyfill", 1386 | "portable" 1387 | ], 1388 | "time": "2019-08-06T08:03:45+00:00" 1389 | }, 1390 | { 1391 | "name": "theseer/tokenizer", 1392 | "version": "1.1.3", 1393 | "source": { 1394 | "type": "git", 1395 | "url": "https://github.com/theseer/tokenizer.git", 1396 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 1397 | }, 1398 | "dist": { 1399 | "type": "zip", 1400 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1401 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1402 | "shasum": "" 1403 | }, 1404 | "require": { 1405 | "ext-dom": "*", 1406 | "ext-tokenizer": "*", 1407 | "ext-xmlwriter": "*", 1408 | "php": "^7.0" 1409 | }, 1410 | "type": "library", 1411 | "autoload": { 1412 | "classmap": [ 1413 | "src/" 1414 | ] 1415 | }, 1416 | "notification-url": "https://packagist.org/downloads/", 1417 | "license": [ 1418 | "BSD-3-Clause" 1419 | ], 1420 | "authors": [ 1421 | { 1422 | "name": "Arne Blankerts", 1423 | "role": "Developer", 1424 | "email": "arne@blankerts.de" 1425 | } 1426 | ], 1427 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1428 | "time": "2019-06-13T22:48:21+00:00" 1429 | }, 1430 | { 1431 | "name": "webmozart/assert", 1432 | "version": "1.5.0", 1433 | "source": { 1434 | "type": "git", 1435 | "url": "https://github.com/webmozart/assert.git", 1436 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" 1437 | }, 1438 | "dist": { 1439 | "type": "zip", 1440 | "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", 1441 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", 1442 | "shasum": "" 1443 | }, 1444 | "require": { 1445 | "php": "^5.3.3 || ^7.0", 1446 | "symfony/polyfill-ctype": "^1.8" 1447 | }, 1448 | "require-dev": { 1449 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1450 | }, 1451 | "type": "library", 1452 | "extra": { 1453 | "branch-alias": { 1454 | "dev-master": "1.3-dev" 1455 | } 1456 | }, 1457 | "autoload": { 1458 | "psr-4": { 1459 | "Webmozart\\Assert\\": "src/" 1460 | } 1461 | }, 1462 | "notification-url": "https://packagist.org/downloads/", 1463 | "license": [ 1464 | "MIT" 1465 | ], 1466 | "authors": [ 1467 | { 1468 | "name": "Bernhard Schussek", 1469 | "email": "bschussek@gmail.com" 1470 | } 1471 | ], 1472 | "description": "Assertions to validate method input/output with nice error messages.", 1473 | "keywords": [ 1474 | "assert", 1475 | "check", 1476 | "validate" 1477 | ], 1478 | "time": "2019-08-24T08:43:50+00:00" 1479 | } 1480 | ], 1481 | "packages-dev": [], 1482 | "aliases": [], 1483 | "minimum-stability": "stable", 1484 | "stability-flags": [], 1485 | "prefer-stable": false, 1486 | "prefer-lowest": false, 1487 | "platform": [], 1488 | "platform-dev": [] 1489 | } 1490 | --------------------------------------------------------------------------------