From 56ec6daf60ff205b6f08665ef807a03ca1d28c7c Mon Sep 17 00:00:00 2001 From: Austin White Date: Mon, 10 Dec 2012 01:17:29 -0800 Subject: [PATCH 01/73] JSON_NUMERIC_CHECK patch to avoid numeric types from being cast to strings --- formatter.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/formatter.php b/formatter.php index b80e175..71795f6 100644 --- a/formatter.php +++ b/formatter.php @@ -10,7 +10,7 @@ * @version 1.0 * @author Daniel Berry * @license MIT License (see LICENSE.readme included in the bundle) - * + * */ /** @@ -29,7 +29,7 @@ class FormatterException extends Exception {} * * @package Formatter * @author Daniel Berry - * + * */ class Formatter { @@ -57,7 +57,7 @@ public static function make($data = null, $from_type = null) * * Constructs our class and sets up some vars we will be using throughout * the conversion process. - * + * * @param mixed $data data we will be converting * @param string $from_type what we are converting form */ @@ -229,7 +229,7 @@ public function to_json($data = null, $pretty = false) // To allow exporting ArrayAccess objects like Orm\Model instances they need to be // converted to an array first $data = (is_array($data) or is_object($data)) ? $this->to_array($data) : $data; - return $pretty ? static::pretty_json($data) : json_encode($data); + return $pretty ? static::pretty_json($data) : json_encode($data, JSON_NUMERIC_CHECK); } /** From be52c39c8c83e602fc2c0aab5180a0a6fb405bb3 Mon Sep 17 00:00:00 2001 From: Daniel Berry Date: Mon, 10 Dec 2012 10:05:43 -0600 Subject: [PATCH 02/73] adds the config file I forgot and allows attributes to be passed to the to_csv() Signed-off-by: Daniel Berry --- config/formatter.php | 14 ++++++++++++++ formatter.php | 12 ++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 config/formatter.php diff --git a/config/formatter.php b/config/formatter.php new file mode 100644 index 0000000..10ae79a --- /dev/null +++ b/config/formatter.php @@ -0,0 +1,14 @@ + array( + 'delimiter' => ',', + 'enclosure' => '"', + 'newline' => "\n", + 'regex_newline' => '\n', + 'escape' => '\\', + ), + 'xml' => array( + 'basenode' => 'xml', + ), +); \ No newline at end of file diff --git a/formatter.php b/formatter.php index 71795f6..e57df96 100644 --- a/formatter.php +++ b/formatter.php @@ -136,16 +136,16 @@ public function to_array($data = null) * @param mixed $delimiter * @return string */ - public function to_csv($data = null, $delimiter = null) + public function to_csv($data = null, $attributes = null) { // let's get the config file - $config = Config::get('formatter::format.csv'); + $config = Config::get('formatter::formatter.csv'); // csv format settings - $newline = array_get($config, 'delimiter', "\n"); - $delimiter or $delimiter = array_get($config, 'delimiter', ","); - $enclosure = array_get($config, 'delimiter', '"'); - $escape = array_get($config, 'delimiter', "\\"); + $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n"))); + $delimiter or $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', "\n"))); + $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\n"))); + $escape = array_get($attributes, 'escape', array_get($config, 'escape', "\n"))); // escape function $escaper = function($items) use($enclosure, $escape) { From 87ec32274851356c32363d1c65a15d7f75be7cdc Mon Sep 17 00:00:00 2001 From: Daniel Berry Date: Mon, 10 Dec 2012 10:57:38 -0600 Subject: [PATCH 03/73] added example files and task Signed-off-by: Daniel Berry --- files/example_csv.csv | 5 + files/example_json.json | 1 + files/example_xml.xml | 27 ++++++ files/readme.md | 1 + formatter.php | 31 +++--- tasks/examples.php | 207 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 257 insertions(+), 15 deletions(-) create mode 100644 files/example_csv.csv create mode 100644 files/example_json.json create mode 100644 files/example_xml.xml create mode 100644 files/readme.md create mode 100644 tasks/examples.php diff --git a/files/example_csv.csv b/files/example_csv.csv new file mode 100644 index 0000000..9bb5525 --- /dev/null +++ b/files/example_csv.csv @@ -0,0 +1,5 @@ +"first_name","last_name","email","state" +"Daniel","Berry","danielberrytn@gmail.com","TX" +"John","Doe","john.doe@fakepeople.com","AL" +"Jane","Doe","jane.doe@fakepeople.com","TN" +"James","Smith","james.smith@fakepeople.com","OK" \ No newline at end of file diff --git a/files/example_json.json b/files/example_json.json new file mode 100644 index 0000000..0a20122 --- /dev/null +++ b/files/example_json.json @@ -0,0 +1 @@ +[{"first_name":"Daniel","last_name":"Berry","email":"danielberrytn@gmail.com","state":"TX"},{"first_name":"John","last_name":"Doe","email":"john.doe@fakepeople.com","state":"AL"},{"first_name":"Jane","last_name":"Doe","email":"jane.doe@fakepeople.com","state":"TN"},{"first_name":"James","last_name":"Smith","email":"james.smith@fakepeople.com","state":"OK"}] \ No newline at end of file diff --git a/files/example_xml.xml b/files/example_xml.xml new file mode 100644 index 0000000..0219cda --- /dev/null +++ b/files/example_xml.xml @@ -0,0 +1,27 @@ + + + + Daniel + Berry + danielberrytn@gmail.com + TX + + + John + Doe + john.doe@fakepeople.com + AL + + + Jane + Doe + jane.doe@fakepeople.com + TN + + + James + Smith + james.smith@fakepeople.com + OK + + \ No newline at end of file diff --git a/files/readme.md b/files/readme.md new file mode 100644 index 0000000..fd7f39e --- /dev/null +++ b/files/readme.md @@ -0,0 +1 @@ +These are just test files for checking the various methods/conversions for example purposes. \ No newline at end of file diff --git a/formatter.php b/formatter.php index e57df96..64dede6 100644 --- a/formatter.php +++ b/formatter.php @@ -46,9 +46,9 @@ class Formatter * @param [type] $from_type what we want to convert to * @return Formatter */ - public static function make($data = null, $from_type = null) + public static function make($data = null, $from_type = null, $attributes = array()) { - return new self($data, $from_type); + return new self($data, $from_type, $attributes); } @@ -61,7 +61,7 @@ public static function make($data = null, $from_type = null) * @param mixed $data data we will be converting * @param string $from_type what we are converting form */ - public function __construct($data = null, $from_type = null) + public function __construct($data = null, $from_type = null, $attributes = array()) { // make sure we have data to convert to if (empty($data)) @@ -75,7 +75,7 @@ public function __construct($data = null, $from_type = null) // check to make sure the method exists if (method_exists($this, "_from_{$from_type}")) { - $data = call_user_func(array($this, '_from_' . $from_type), $data); + $data = call_user_func(array($this, '_from_' . $from_type), $data, $attributes); } else { @@ -142,10 +142,10 @@ public function to_csv($data = null, $attributes = null) $config = Config::get('formatter::formatter.csv'); // csv format settings - $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n"))); - $delimiter or $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', "\n"))); - $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\n"))); - $escape = array_get($attributes, 'escape', array_get($config, 'escape', "\n"))); + $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n")); + $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); + $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\"")); + $escape = array_get($attributes, 'escape', array_get($config, 'escape', '\\')); // escape function $escaper = function($items) use($enclosure, $escape) { @@ -388,14 +388,16 @@ protected function _from_csv($string) $data = array(); // let's get the config file - $config = Config::get('formatter::format.csv'); + $config = Config::get('formatter::formatter.csv'); - $rows = preg_split('/(?<='.preg_quote(Config::get('format.csv.enclosure', '"')).')'.Config::get('format.csv.regex_newline', '\n').'/', trim($string)); + // csv format settings + $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n")); + $delimiter or $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); + $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\"")); + $escape = array_get($attributes, 'escape', array_get($config, 'escape', '\\')); + $regex_newline = array_get($attributes, 'regex_newline', array_get($config, 'regex_newline', '\n')); - // csv config - $delimiter = array_get($config, 'delimiter', ","); - $enclosure = array_get($config, 'enclosure', '"'); - $escape = array_get($config, 'escape', "\\"); + $rows = preg_split('/(?<='.preg_quote($enclosure).')'.$regex_newline.'/', trim($string)); // Get the headings $headings = str_replace($escape.$enclosure, $enclosure, str_getcsv(array_shift($rows), $delimiter, $enclosure, $escape)); @@ -452,5 +454,4 @@ public static function is_assoc($arr) } return false; } - } \ No newline at end of file diff --git a/tasks/examples.php b/tasks/examples.php new file mode 100644 index 0000000..93e52fc --- /dev/null +++ b/tasks/examples.php @@ -0,0 +1,207 @@ +_sample_array = array( + array( + 'first_name' => 'Daniel', + 'last_name' => 'Berry', + 'email' => 'danielberrytn@gmail.com', + 'state' => 'TX' + ), + array( + 'first_name' => 'John', + 'last_name' => 'Doe', + 'email' => 'john.doe@fakepeople.com', + 'state' => 'AL' + ), + + array( + 'first_name' => 'Jane', + 'last_name' => 'Doe', + 'email' => 'jane.doe@fakepeople.com', + 'state' => 'TN' + ), + + array( + 'first_name' => 'James', + 'last_name' => 'Smith', + 'email' => 'james.smith@fakepeople.com', + 'state' => 'OK' + ), + ); + + + // path to our example files + $this->_example_file_path = Bundle::path('formatter').'files/'; + } + + /** + * Default run functio. + * This does nothing other than tells you to look at the code examples here in this file. + * + * @return void + */ + public function run() + { + echo 'Look through the examples and choose a task to run to view the results.'; + } + + /** + * Converts a standard PHP array to JSON + * + * @return string our json encoded string + */ + public function array_to_json() + { + $results = Formatter::make($this->_sample_array)->to_json(); + + echo $results; + } + + + /** + * Converts our PHP array to XML + * + * @return string our generated XML + */ + public function array_to_xml() + { + $results = Formatter::make($this->_sample_array)->to_xml(); + + echo $results; + } + + + /** + * Converts our PHP array to usable PHP code + * + * @return string our generated array code. + */ + public function array_to_php() + { + $results = Formatter::make($this->_sample_array)->to_php(); + + echo $results; + } + + /** + * Converts our PHP array to CSV + * + * @return string our generated CSV + */ + public function array_to_csv() + { + $results = Formatter::make($this->_sample_array)->to_csv(); + + echo $results; + } + + /** + * Fetches a JSON file and then converts it to an array if the + * file exists. + * + * @return array + */ + public function json_to_array() + { + + // dd($this->_example_file_path); + // we will use the Laravel's File class to fetch our JSON file. + $file_path = $this->_example_file_path.'example_json.json'; + + if ( file_exists($file_path)) + { + $file = File::get($file_path); + + if ( ! empty($file)) + { + $results = Formatter::make($file, 'json')->to_array(); + + print_r($results); + } + } + else + { + echo 'Sorry, but the file you requested does not exist.'; + } + } + + + /** + * Fetches a XML file and then converts it to an array if the + * file exists. + * + * @return array + */ + public function xml_to_array() + { + + // dd($this->_example_file_path); + // we will use the Laravel's File class to fetch our JSON file. + $file_path = $this->_example_file_path.'example_xml.xml'; + + if ( file_exists($file_path)) + { + $file = File::get($file_path); + + if ( ! empty($file)) + { + $results = Formatter::make($file, 'xml')->to_array(); + + print_r($results); + } + } + else + { + echo 'Sorry, but the file you requested does not exist.'; + } + } + + + /** + * Fetches a CSV file and then converts it to an array if the + * file exists. + * + * NOTE:: default configuration values for the CSV such as + * escape cahrater, newline, enclosure, etc... Are stored in the + * bundle's config file. + * + * If you have a specific case, you can pass custom config attributes + * as a third paramter to the make(). Example + * + * $custom_config = array( + * 'enclosure' => '*' + * ); + * + * Formatter::make($csv_data, 'csv', $custom_config); + * + * @return array + */ + public function csv_to_array() + { + + // dd($this->_example_file_path); + // we will use the Laravel's File class to fetch our JSON file. + $file_path = $this->_example_file_path.'example_csv.csv'; + + if ( file_exists($file_path)) + { + $file = File::get($file_path); + + if ( ! empty($file)) + { + $results = Formatter::make($file, 'csv')->to_array(); + + print_r($results); + } + } + else + { + echo 'Sorry, but the file you requested does not exist.'; + } + } +} \ No newline at end of file From d794c72de79efe16e9efa6e9eba0e0cbebac3c22 Mon Sep 17 00:00:00 2001 From: Daniel Berry Date: Sun, 16 Dec 2012 00:22:56 -0600 Subject: [PATCH 04/73] added attributes to the _to_csv method to allow custom attributes to be passed. Signed-off-by: Daniel Berry --- formatter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formatter.php b/formatter.php index 64dede6..3c96a6b 100644 --- a/formatter.php +++ b/formatter.php @@ -383,7 +383,7 @@ protected function _from_xml($string) * @param string $string * @return array */ - protected function _from_csv($string) + protected function _from_csv($string, $attributes = array()) { $data = array(); From 606fb29ab8dfc870bd7603aed64de42cd5cb5424 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelmsen Date: Sun, 24 Mar 2013 16:58:57 -0300 Subject: [PATCH 05/73] Remove delimiter boolean logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The boolean logic in the delimiter was causing an error.   In the original FuelPHP class, it's checking for a delimiter either  passed into the method, or in the config.  Since the delimiter is  now passed through the attributes array, the 'or' can't find a default '$delimiter' and throws a undefined variable error.   The array get checks for the delimiter in both the attribute array and the config array, so it's safe to remove.   --- formatter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/formatter.php b/formatter.php index 3c96a6b..34280a6 100644 --- a/formatter.php +++ b/formatter.php @@ -392,7 +392,7 @@ protected function _from_csv($string, $attributes = array()) // csv format settings $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n")); - $delimiter or $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); + $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\"")); $escape = array_get($attributes, 'escape', array_get($config, 'escape', '\\')); $regex_newline = array_get($attributes, 'regex_newline', array_get($config, 'regex_newline', '\n')); @@ -454,4 +454,4 @@ public static function is_assoc($arr) } return false; } -} \ No newline at end of file +} From eb609d88998a7593be85a5e9b9668f0300b4e2c6 Mon Sep 17 00:00:00 2001 From: Daniel Berry Date: Mon, 25 Mar 2013 10:06:18 -0500 Subject: [PATCH 06/73] Update formatter.php Converts our booleans to integer values so that they are not converted to blank values when processed. --- formatter.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/formatter.php b/formatter.php index 34280a6..fb6abef 100644 --- a/formatter.php +++ b/formatter.php @@ -300,6 +300,13 @@ public function to_xml($data = null, $structure = null, $basenode = 'xml') foreach ($data as $key => $value) { + // convert our booleans to 0/1 integer values so they are + // not converted to blanks. + if(is_bool($value)) + { + $value = (int) $value; + } + // no numeric keys in our xml please! if (is_numeric($key)) { From cdc26104a5fd3fff8d7f28ab9a4a15a5c9eab38f Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Fri, 28 Jun 2013 13:01:14 -0400 Subject: [PATCH 07/73] Updated codebase for Laravel 4 Package Management. I used Laravel 4's Workbench to build it. --- .DS_Store | Bin 0 -> 6148 bytes files/example_csv.csv | 5 - files/example_json.json | 1 - files/example_xml.xml | 27 - files/readme.md | 1 - hitsend/.DS_Store | Bin 0 -> 6148 bytes hitsend/formatter/.gitignore | 4 + hitsend/formatter/.travis.yml | 11 + hitsend/formatter/composer.json | 26 + hitsend/formatter/phpunit.xml | 18 + .../Hitsend/Formatter/Facades/Formatter.php | 14 + .../src/Hitsend/Formatter/Formatter.php | 182 ++- .../Formatter/FormatterServiceProvider.php | 48 + hitsend/formatter/src/config/.gitkeep | 0 .../formatter/src/config/config.php | 0 hitsend/formatter/src/lang/.gitkeep | 0 .../formatter/src/lang}/en/formatter.php | 6 +- hitsend/formatter/tests/.gitkeep | 0 readme.md | 35 +- start.php | 30 - tasks/examples.php | 207 ---- vendors/spyc/COPYING | 21 - vendors/spyc/README | 159 --- vendors/spyc/examples/yaml-dump.php | 25 - vendors/spyc/examples/yaml-load.php | 21 - vendors/spyc/php4/5to4.php | 17 - vendors/spyc/php4/spyc.php4 | 1023 ---------------- vendors/spyc/php4/test.php4 | 162 --- vendors/spyc/spyc.php | 1046 ----------------- vendors/spyc/spyc.yaml | 203 ---- vendors/spyc/tests/DumpTest.php | 130 -- vendors/spyc/tests/IndentTest.php | 65 - vendors/spyc/tests/ParseTest.php | 322 ----- vendors/spyc/tests/RoundTripTest.php | 61 - vendors/spyc/tests/failing1.yaml | 2 - vendors/spyc/tests/indent_1.yaml | 59 - vendors/spyc/tests/quotes.yaml | 8 - 37 files changed, 210 insertions(+), 3729 deletions(-) create mode 100644 .DS_Store delete mode 100644 files/example_csv.csv delete mode 100644 files/example_json.json delete mode 100644 files/example_xml.xml delete mode 100644 files/readme.md create mode 100644 hitsend/.DS_Store create mode 100644 hitsend/formatter/.gitignore create mode 100644 hitsend/formatter/.travis.yml create mode 100644 hitsend/formatter/composer.json create mode 100644 hitsend/formatter/phpunit.xml create mode 100644 hitsend/formatter/src/Hitsend/Formatter/Facades/Formatter.php rename formatter.php => hitsend/formatter/src/Hitsend/Formatter/Formatter.php (75%) create mode 100644 hitsend/formatter/src/Hitsend/Formatter/FormatterServiceProvider.php create mode 100644 hitsend/formatter/src/config/.gitkeep rename config/formatter.php => hitsend/formatter/src/config/config.php (100%) create mode 100644 hitsend/formatter/src/lang/.gitkeep rename {language => hitsend/formatter/src/lang}/en/formatter.php (59%) create mode 100644 hitsend/formatter/tests/.gitkeep delete mode 100644 start.php delete mode 100644 tasks/examples.php delete mode 100644 vendors/spyc/COPYING delete mode 100644 vendors/spyc/README delete mode 100644 vendors/spyc/examples/yaml-dump.php delete mode 100644 vendors/spyc/examples/yaml-load.php delete mode 100644 vendors/spyc/php4/5to4.php delete mode 100644 vendors/spyc/php4/spyc.php4 delete mode 100644 vendors/spyc/php4/test.php4 delete mode 100644 vendors/spyc/spyc.php delete mode 100644 vendors/spyc/spyc.yaml delete mode 100644 vendors/spyc/tests/DumpTest.php delete mode 100644 vendors/spyc/tests/IndentTest.php delete mode 100644 vendors/spyc/tests/ParseTest.php delete mode 100644 vendors/spyc/tests/RoundTripTest.php delete mode 100644 vendors/spyc/tests/failing1.yaml delete mode 100644 vendors/spyc/tests/indent_1.yaml delete mode 100644 vendors/spyc/tests/quotes.yaml diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 - - - Daniel - Berry - danielberrytn@gmail.com - TX - - - John - Doe - john.doe@fakepeople.com - AL - - - Jane - Doe - jane.doe@fakepeople.com - TN - - - James - Smith - james.smith@fakepeople.com - OK - - \ No newline at end of file diff --git a/files/readme.md b/files/readme.md deleted file mode 100644 index fd7f39e..0000000 --- a/files/readme.md +++ /dev/null @@ -1 +0,0 @@ -These are just test files for checking the various methods/conversions for example purposes. \ No newline at end of file diff --git a/hitsend/.DS_Store b/hitsend/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=5.3.0", + "illuminate/support": "4.0.x" + }, + "autoload": { + "psr-0": { + "Spyc": "vendor/spyc/", + "Hitsend\\Formatter": "src/" + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/hitsend/formatter/phpunit.xml b/hitsend/formatter/phpunit.xml new file mode 100644 index 0000000..12bee7a --- /dev/null +++ b/hitsend/formatter/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./tests/ + + + \ No newline at end of file diff --git a/hitsend/formatter/src/Hitsend/Formatter/Facades/Formatter.php b/hitsend/formatter/src/Hitsend/Formatter/Facades/Formatter.php new file mode 100644 index 0000000..2dc59cc --- /dev/null +++ b/hitsend/formatter/src/Hitsend/Formatter/Facades/Formatter.php @@ -0,0 +1,14 @@ + * */ -class Formatter -{ +class Formatter { /** * Holds the data that we are converting @@ -40,6 +38,12 @@ class Formatter */ protected $_data = array(); + /** + * Holds the errors. For now only works with from_csv + * @var array + */ + public static $errors = array(); + /** * Returns an instance of the Formatter Bundle * @param mixex $data the data we are converting @@ -64,22 +68,17 @@ public static function make($data = null, $from_type = null, $attributes = array public function __construct($data = null, $from_type = null, $attributes = array()) { // make sure we have data to convert to - if (empty($data)) - { - throw new FormatterException(__('formatter::formatter.no_data', array('from_type' => $from_type))); + if (!is_array($data) && empty($data)) { + array_push(self::$errors, Lang::get('formatter::formatter.no_data', array('from_type' => $from_type))); } // make sure our from type has been specified. - if ($from_type !== null) - { + if ($from_type !== null) { // check to make sure the method exists - if (method_exists($this, "_from_{$from_type}")) - { + if (method_exists($this, "_from_{$from_type}")) { $data = call_user_func(array($this, '_from_' . $from_type), $data, $attributes); - } - else - { - throw new FormatterException(__('formatter::formatter.from_type_not_supported', array('from_type' => $from_type))); + } else { + array_push(self::$errors, Lang::get('formatter::formatter.from_type_not_supported', array('from_type' => $from_type))); } } @@ -97,31 +96,24 @@ public function __construct($data = null, $from_type = null, $attributes = array */ public function to_array($data = null) { - if ($data === null) - { + if ($data === null) { $data = $this->_data; } $array = array(); - if (is_object($data) and ! $data instanceof \Iterator) - { + if (is_object($data) and ! $data instanceof \Iterator) { $data = get_object_vars($data); } - if (empty($data)) - { + if (empty($data)) { return array(); } - foreach ($data as $key => $value) - { - if (is_object($value) or is_array($value)) - { + foreach ($data as $key => $value) { + if (is_object($value) or is_array($value)) { $array[$key] = $this->to_array($value); - } - else - { + } else { $array[$key] = $value; } } @@ -136,8 +128,8 @@ public function to_array($data = null) * @param mixed $delimiter * @return string */ - public function to_csv($data = null, $attributes = null) - { + public function to_csv($data = null, $attributes = null) { + // let's get the config file $config = Config::get('formatter::formatter.csv'); @@ -154,41 +146,33 @@ public function to_csv($data = null, $attributes = null) }, $items); }; - if ($data === null) - { + if ($data === null) { $data = $this->_data; } - if (is_object($data) and ! $data instanceof \Iterator) - { + if (is_object($data) and ! $data instanceof \Iterator) { $data = $this->to_array($data); } // Multi-dimensional array - if (is_array($data) and self::is_multi($data)) - { + if (is_array($data) and self::is_multi($data)) { $data = array_values($data); - if (self::is_assoc($data[0])) - { + if (self::is_assoc($data[0])) { $headings = array_keys($data[0]); - } - else - { + } else { $headings = array_shift($data); } } // Single array - else - { + else { $headings = array_keys((array) $data); $data = array($data); } $output = $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper($headings)).$enclosure.$newline; - foreach ($data as $row) - { + foreach ($data as $row) { $output .= $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper((array) $row)).$enclosure.$newline; } @@ -202,10 +186,8 @@ public function to_csv($data = null, $attributes = null) * @param mixed $data * @return string */ - public function to_serialized($data = null) - { - if ($data == null) - { + public function to_serialized($data = null) { + if ($data == null) { $data = $this->_data; } @@ -219,10 +201,8 @@ public function to_serialized($data = null) * @param bool wether to make the json pretty * @return string */ - public function to_json($data = null, $pretty = false) - { - if ($data == null) - { + public function to_json($data = null, $pretty = false) { + if ($data == null) { $data = $this->_data; } @@ -238,10 +218,8 @@ public function to_json($data = null, $pretty = false) * @param mixed $data * @return string */ - public function to_php($data = null) - { - if ($data == null) - { + public function to_php($data = null) { + if ($data == null) { $data = $this->_data; } @@ -254,10 +232,8 @@ public function to_php($data = null) * @param mixed $data * @return string */ - public function to_yaml($data = null) - { - if ($data == null) - { + public function to_yaml($data = null) { + if ($data == null) { $data = $this->_data; } @@ -274,42 +250,34 @@ public function to_yaml($data = null) * @param null|string $basenode * @return string */ - public function to_xml($data = null, $structure = null, $basenode = 'xml') - { - if ($data == null) - { + public function to_xml($data = null, $structure = null, $basenode = 'xml') { + if ($data == null) { $data = $this->_data; } // turn off compatibility mode as simple xml throws a wobbly if you don't. - if (ini_get('zend.ze1_compatibility_mode') == 1) - { + if (ini_get('zend.ze1_compatibility_mode') == 1) { ini_set('zend.ze1_compatibility_mode', 0); } - if ($structure == null) - { + if ($structure == null) { $structure = simplexml_load_string("<$basenode />"); } // Force it to be something useful - if ( ! is_array($data) and ! is_object($data)) - { + if ( ! is_array($data) and ! is_object($data)) { $data = (array) $data; } - foreach ($data as $key => $value) - { + foreach ($data as $key => $value) { // convert our booleans to 0/1 integer values so they are - // not converted to blanks. - if(is_bool($value)) - { + // not converted to blanks. + if(is_bool($value)) { $value = (int) $value; } // no numeric keys in our xml please! - if (is_numeric($key)) - { + if (is_numeric($key)) { // make string key... $key = (\Str::singular($basenode) != $basenode) ? \Str::singular($basenode) : 'item'; } @@ -318,19 +286,14 @@ public function to_xml($data = null, $structure = null, $basenode = 'xml') $key = preg_replace('/[^a-z_\-0-9]/i', '', $key); // if there is another array found recrusively call this function - if (is_array($value) or is_object($value)) - { + if (is_array($value) or is_object($value)) { $node = $structure->addChild($key); // recursive call if value is not empty - if( ! empty($value)) - { + if( ! empty($value)) { $this->to_xml($value, $node, $key); } - } - - else - { + } else { // add single node. $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8"); @@ -348,8 +311,7 @@ public function to_xml($data = null, $structure = null, $basenode = 'xml') * @param string $string * @return mixed */ - private function _from_json($string) - { + private function _from_json($string) { return json_decode(trim($string)); } @@ -359,8 +321,7 @@ private function _from_json($string) * @param string $string * @return mixed */ - private function _from_serialize($string) - { + private function _from_serialize($string) { return unserialize(trim($string)); } @@ -370,14 +331,12 @@ private function _from_serialize($string) * @param string $string * @return array */ - protected function _from_xml($string) - { + protected function _from_xml($string) { $_arr = is_string($string) ? simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : $string; $arr = array(); // Convert all objects SimpleXMLElement to array recursively - foreach ((array)$_arr as $key => $val) - { + foreach ((array)$_arr as $key => $val) { $arr[$key] = (is_array($val) or is_object($val)) ? $this->_from_xml($val) : $val; } @@ -390,8 +349,7 @@ protected function _from_xml($string) * @param string $string * @return array */ - protected function _from_csv($string, $attributes = array()) - { + protected function _from_csv($string, $attributes = array()) { $data = array(); // let's get the config file @@ -409,15 +367,16 @@ protected function _from_csv($string, $attributes = array()) // Get the headings $headings = str_replace($escape.$enclosure, $enclosure, str_getcsv(array_shift($rows), $delimiter, $enclosure, $escape)); - foreach ($rows as $row) - { + foreach ($rows as $row) { $data_fields = str_replace($escape.$enclosure, $enclosure, str_getcsv($row, $delimiter, $enclosure, $escape)); - if (count($data_fields) == count($headings)) - { + if (count($data_fields) > count($headings)) { + array_push(self::$errors, Lang::get('formatter::formatter.more_data', array('line_number' => $line_number ) )); + } else if (count($data_fields) < count($headings)) { + array_push(self::$errors, Lang::get('formatter::formatter.less_data', array('line_number' => $line_number ) )); + } else { $data[] = array_combine($headings, $data_fields); } - } return $data; @@ -431,8 +390,7 @@ protected function _from_csv($string, $attributes = array()) * @param array $all_keys if true, check that all elements are arrays * @return bool true if its a multidimensional array, false if not */ - protected static function is_multi($arr, $all_keys = false) - { + protected static function is_multi($arr, $all_keys = false) { $values = array_filter($arr, 'is_array'); return $all_keys ? count($arr) === count($values) : count($values) > 0; } @@ -443,19 +401,15 @@ protected static function is_multi($arr, $all_keys = false) * @param array $arr the array to check * @return bool true if its an assoc array, false if not */ - public static function is_assoc($arr) - { - if ( ! is_array($arr)) - { - throw new FormatterException('The parameter must be an array.'); + public static function is_assoc($arr) { + if ( ! is_array($arr)) { + array_push(self::$errors, Lang::get('formatter::formatter.must_be_array')); } $counter = 0; - foreach ($arr as $key => $unused) - { - if ( ! is_int($key) or $key !== $counter++) - { + foreach ($arr as $key => $unused) { + if ( ! is_int($key) or $key !== $counter++) { return true; } } diff --git a/hitsend/formatter/src/Hitsend/Formatter/FormatterServiceProvider.php b/hitsend/formatter/src/Hitsend/Formatter/FormatterServiceProvider.php new file mode 100644 index 0000000..688bf66 --- /dev/null +++ b/hitsend/formatter/src/Hitsend/Formatter/FormatterServiceProvider.php @@ -0,0 +1,48 @@ +package('hitsend/formatter'); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() { + $this->app['formatter'] = $this->app->share(function($app) { + return new Formatter; + }); + + $this->app->booting(function() { + $loader = \Illuminate\Foundation\AliasLoader::getInstance(); + $loader->alias('Formatter', 'Hitsend\Formatter\Facades\Formatter'); + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() { + return array('formatter'); + } + +} \ No newline at end of file diff --git a/hitsend/formatter/src/config/.gitkeep b/hitsend/formatter/src/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/formatter.php b/hitsend/formatter/src/config/config.php similarity index 100% rename from config/formatter.php rename to hitsend/formatter/src/config/config.php diff --git a/hitsend/formatter/src/lang/.gitkeep b/hitsend/formatter/src/lang/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/language/en/formatter.php b/hitsend/formatter/src/lang/en/formatter.php similarity index 59% rename from language/en/formatter.php rename to hitsend/formatter/src/lang/en/formatter.php index 4e07bb8..aacd26c 100644 --- a/language/en/formatter.php +++ b/hitsend/formatter/src/lang/en/formatter.php @@ -10,11 +10,13 @@ * @version 1.0 * @author Daniel Berry * @license MIT License (see LICENSE.readme included in the bundle) - * + * */ return array( - 'no_data' => 'No data to convert.', + 'no_data' => 'No data to convert', 'from_type_not_supported' => ':from_type is not a supported type to convert from.', + 'more_data' => 'The line :line_number contains more data fields than the heading.', + 'less_data' => 'The line :line_number contains less data fields than the heading.' ); \ No newline at end of file diff --git a/hitsend/formatter/tests/.gitkeep b/hitsend/formatter/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/readme.md b/readme.md index 8a66c1c..e14f27e 100644 --- a/readme.md +++ b/readme.md @@ -1,36 +1,26 @@ Formatter Bundle ================ -Laravel Bundle ported from the FuelPHP Format class, that helps you easily convert between various formats such as XML, JSON, CSV, etc... +Laravel 4 Workbench Package based off the work done by @dberry37388 to create a Laravel 3 Bundle porterd from the FuelPHP Format class. Thhis class helps you easily convert between various formats such as XML, JSON, CSV, etc... + +I've also implemented the error handling code created by @rodrigore Installation ------------ -Using artisan to install the bundle - -``` -php artisan bundle:install formatter -``` - -Or you can clone the bundle straight from github. Run the following command inside your bundles folder: -``` -git clone git@github.com:dberry37388/laravel-formatter.git formatter -``` +Not exactly sure... I used the Artisan Workbench to create a package in my Laravel 4 instance. -Add the Following to your application/bundles.php file: +To learn more about packages read http://laravel.com/docs/packages -``` -'formatter' => array('auto' => true) // you can leave out the auto => true -``` +when you add this to your vendor directory, you will need to run `php artisan dump-autoload` -That's it, Formatter should now be installed and ready to go! +I'll try to make this installation better once I get more time. Usage ----- The best way to learn how to use Formatter is to look through the code, where you can familiarize yourself with all of the available methods. ###Calling Formatter - Formatter::make($data_to_convert, 'type of data')->to_the_format_you_want(); ### Available Formats to Convert From @@ -50,7 +40,16 @@ Formatter::make($data_to_convert, 'type of data')->to_the_format_you_want(); ``` $json_string = '{"foo":"bar","baz":"qux"}'; -print_r(Formater::make($json_string, 'json')->to_array()); +$result = Formater::make($json_string, 'json')->to_array(); + +if ( empty(Formatter::$errors) ) { + //show the results + print_r(result); +} else { + // Show the errors + print_r(Formatter::$errors); + return; +} // Returns Array diff --git a/start.php b/start.php deleted file mode 100644 index f5eedf6..0000000 --- a/start.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @license MIT License (see LICENSE.readme included in the bundle) - * - */ - -/** - * Setup the Septu namespace - */ -// Autoload classes -Autoloader::namespaces(array( - 'Formatter' => Bundle::path('formatter'), -)); - -// Set the global alias for Sentry -Autoloader::alias('Formatter\\Formatter', 'Formatter'); -Autoloader::alias('Formatter\\FormatterException', 'FormatterException'); - -Autoloader::map(array( - 'Spyc' => path('bundle').'formatter/vendors/spyc/spyc.php' -)); \ No newline at end of file diff --git a/tasks/examples.php b/tasks/examples.php deleted file mode 100644 index 93e52fc..0000000 --- a/tasks/examples.php +++ /dev/null @@ -1,207 +0,0 @@ -_sample_array = array( - array( - 'first_name' => 'Daniel', - 'last_name' => 'Berry', - 'email' => 'danielberrytn@gmail.com', - 'state' => 'TX' - ), - array( - 'first_name' => 'John', - 'last_name' => 'Doe', - 'email' => 'john.doe@fakepeople.com', - 'state' => 'AL' - ), - - array( - 'first_name' => 'Jane', - 'last_name' => 'Doe', - 'email' => 'jane.doe@fakepeople.com', - 'state' => 'TN' - ), - - array( - 'first_name' => 'James', - 'last_name' => 'Smith', - 'email' => 'james.smith@fakepeople.com', - 'state' => 'OK' - ), - ); - - - // path to our example files - $this->_example_file_path = Bundle::path('formatter').'files/'; - } - - /** - * Default run functio. - * This does nothing other than tells you to look at the code examples here in this file. - * - * @return void - */ - public function run() - { - echo 'Look through the examples and choose a task to run to view the results.'; - } - - /** - * Converts a standard PHP array to JSON - * - * @return string our json encoded string - */ - public function array_to_json() - { - $results = Formatter::make($this->_sample_array)->to_json(); - - echo $results; - } - - - /** - * Converts our PHP array to XML - * - * @return string our generated XML - */ - public function array_to_xml() - { - $results = Formatter::make($this->_sample_array)->to_xml(); - - echo $results; - } - - - /** - * Converts our PHP array to usable PHP code - * - * @return string our generated array code. - */ - public function array_to_php() - { - $results = Formatter::make($this->_sample_array)->to_php(); - - echo $results; - } - - /** - * Converts our PHP array to CSV - * - * @return string our generated CSV - */ - public function array_to_csv() - { - $results = Formatter::make($this->_sample_array)->to_csv(); - - echo $results; - } - - /** - * Fetches a JSON file and then converts it to an array if the - * file exists. - * - * @return array - */ - public function json_to_array() - { - - // dd($this->_example_file_path); - // we will use the Laravel's File class to fetch our JSON file. - $file_path = $this->_example_file_path.'example_json.json'; - - if ( file_exists($file_path)) - { - $file = File::get($file_path); - - if ( ! empty($file)) - { - $results = Formatter::make($file, 'json')->to_array(); - - print_r($results); - } - } - else - { - echo 'Sorry, but the file you requested does not exist.'; - } - } - - - /** - * Fetches a XML file and then converts it to an array if the - * file exists. - * - * @return array - */ - public function xml_to_array() - { - - // dd($this->_example_file_path); - // we will use the Laravel's File class to fetch our JSON file. - $file_path = $this->_example_file_path.'example_xml.xml'; - - if ( file_exists($file_path)) - { - $file = File::get($file_path); - - if ( ! empty($file)) - { - $results = Formatter::make($file, 'xml')->to_array(); - - print_r($results); - } - } - else - { - echo 'Sorry, but the file you requested does not exist.'; - } - } - - - /** - * Fetches a CSV file and then converts it to an array if the - * file exists. - * - * NOTE:: default configuration values for the CSV such as - * escape cahrater, newline, enclosure, etc... Are stored in the - * bundle's config file. - * - * If you have a specific case, you can pass custom config attributes - * as a third paramter to the make(). Example - * - * $custom_config = array( - * 'enclosure' => '*' - * ); - * - * Formatter::make($csv_data, 'csv', $custom_config); - * - * @return array - */ - public function csv_to_array() - { - - // dd($this->_example_file_path); - // we will use the Laravel's File class to fetch our JSON file. - $file_path = $this->_example_file_path.'example_csv.csv'; - - if ( file_exists($file_path)) - { - $file = File::get($file_path); - - if ( ! empty($file)) - { - $results = Formatter::make($file, 'csv')->to_array(); - - print_r($results); - } - } - else - { - echo 'Sorry, but the file you requested does not exist.'; - } - } -} \ No newline at end of file diff --git a/vendors/spyc/COPYING b/vendors/spyc/COPYING deleted file mode 100644 index 8e7ddbc..0000000 --- a/vendors/spyc/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2011 Vladimir Andersen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendors/spyc/README b/vendors/spyc/README deleted file mode 100644 index 4d77166..0000000 --- a/vendors/spyc/README +++ /dev/null @@ -1,159 +0,0 @@ -# -# S P Y C -# a simple php yaml class -# -# Load this README! -# >> $readme = Spyc::YAMLLoad('README'); -# ---- %YAML:1.1 -title: Spyc -- a Simple PHP YAML Class -version: 0.5 -authors: [chris wanstrath (chris@ozmm.org), vlad andersen (vlad.andersen@gmail.com)] -websites: [http://www.yaml.org, http://spyc.sourceforge.net] -license: [MIT License, http://www.opensource.org/licenses/mit-license.php] -copyright: "(c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen" -tested on: [php 5.2.x] - -installation: > - Copy spyc.php to a directory you can - access with your YAML-ready PHP script. - - That's it! - -about: > - From www.yaml.org: - - "YAML(tm) (rhymes with 'camel') is a human-friendly, cross language, - Unicode based data serialization language designed around the common - native data structures of agile programming languages. It is broadly - useful for programming needs ranging from configuration files to - Internet messaging to object persistence to data auditing. Together - with the Unicode standard for characters, the YAML specification provides - all the information necessary to understand YAML Version 1.1 and to - creating programs that process YAML information. - - YAML(tm) is a balance of the following design goals: - - YAML documents are very readable by humans. - - YAML interacts well with scripting languages. - - YAML uses host languages' native data structures. - - YAML has a consistent information model. - - YAML enables stream-based processing. - - YAML is expressive and extensible. - - YAML is easy to implement." - - YAML makes a lot of sense. It's easy to use, easy to learn, and cool. - As the lucky stiff named why once said, "YAML is a beacon of light." - - If you're new to YAML, may we suggest YAML In Five Minutes: - - http://yaml.kwiki.org/?YamlInFiveMinutes - - If you don't have five minutes, realize that this README is a completely - valid YAML document. Dig in, load this or any YAML file into an array - with Spyc and see how easy it is to translate friendly text into usable - data. - - The purpose of Spyc is to provide a pure PHP alternative to Syck, a - simple API for loading and dumping YAML documents, a YAML loader which - understands a usable subset of the YAML spec, and to further spread - the glory of YAML to the PHP masses. - - If you're at all hesitant ("usable subset of YAML?!"), navigate - http://yaml.org/start.html. Spyc completely understands the YAML - document shown there, a document which has features way beyond the - scope of what normal config files might require. Try it for yourself, - and then start enjoying the peace of mind YAML brings to your life. - -meat and a few potatoes: - - concept: Loading a YAML document into PHP - brief: > - $yaml will become an array of all the data in wicked.yaml - code: | - - include('spyc.php'); - - $yaml = Spyc::YAMLLoad('wicked.yaml'); - - - concept: Loading a YAML string into PHP - brief: > - $array will look like this: - array('A YAML','document in a','string') - code: | - - include('spyc.php'); - - $yaml = '- A YAML\n- document in a\n- string.'; - $array = Spyc::YAMLLoad($yaml); - - - concept: Dumping a PHP array to YAML - brief: > - $yaml will become a string of a YAML document created from - $array. - code: | - - include('spyc.php'); - - $array['name'] = 'chris'; - $array['sport'] = 'curbing'; - - $yaml = Spyc::YAMLDump($array); - -prior art: - - who: [Brian Ingerson, Clark Evans, Oren Ben-Kiki] - why?: > - The YAML spec is really a piece of work, and these guys - did a great job on it. A simple and elegant language like - YAML was a long time coming and it's refreshing to know - such able minded individuals took the task to heart and - executed it with cunning and strength. In addition to - their various noteworthy contributions to YAML parsers - and related projects, YAML.pm's README is a treasure trove - of information for knowledge seekers. Thanks, guys. - - - who: why the lucky stiff - why?: > - As the author of Syck, the code used in Ruby for the language's - YAML class and methods, why is indirectly (directly?) responsible - for my first exposure to YAML (as a config file in a Ruby web-app) - and the countless hours I spent playing with this sheik new data - format afterwards. Syck's README is a YAML file and thus the - inspiration for this file and, even, this very piece of software. - - - who: Steve Howell - why?: > - Python's YAML implementation. PyYAML's README file is also YAML, - so it too inspired the YAML format of this README file. - - - who: [Rasmus Lerdorf, Zeev Suraski, Andi Gutmans, et al] - why?: > - PHP is great at what it does best. It's also paid a lot of my bills. - Thanks. - -bugs: - report: > - Please see Spyc's Sourceforge project page for information on reporting bugs. - speed: > - This implementation was not designed for speed. Rather, it - was designed for those who need a pure PHP implementation of - a YAML parser and who are not overly concerned with performance. - If you want speed, check out Syck. - depth: > - This parser is by no means a comprehensive YAML parser. For supported - features and future plans, check the website. - unicode: > - YAML is supposed to be unicode, but for now we're just using ASCII. - PHP has crappy unicode support but who knows what the future holds. - -resources: - - http://www.yaml.org - - http://www.yaml.org/spec/ - - http://yaml.kwiki.org/?YamlInFiveMinutes - - http://www.whytheluckystiff.net/syck/ - - http://yaml4r.sourceforge.net/cookbook/ - -thanks: - - Adam Wood - - Daniel Ferreira - - Aaron Jensen - - Mike Thornton - - Fabien Potencier - - Mustafa Kumas \ No newline at end of file diff --git a/vendors/spyc/examples/yaml-dump.php b/vendors/spyc/examples/yaml-dump.php deleted file mode 100644 index 05a8a2f..0000000 --- a/vendors/spyc/examples/yaml-dump.php +++ /dev/null @@ -1,25 +0,0 @@ - 'A sequence','second' => 'of mapped values'); -$array['Mapped'] = array('A sequence','which is mapped'); -$array['A Note'] = 'What if your text is too long?'; -$array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; -$array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; -$array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; -$array['key:withcolon'] = "Should support this to"; - -$yaml = Spyc::YAMLDump($array,4,60); \ No newline at end of file diff --git a/vendors/spyc/examples/yaml-load.php b/vendors/spyc/examples/yaml-load.php deleted file mode 100644 index fba9571..0000000 --- a/vendors/spyc/examples/yaml-load.php +++ /dev/null @@ -1,21 +0,0 @@ -spyc.yaml loaded into PHP:
'; -print_r($array); -echo ''; - - -echo '
YAML Data dumped back:
'; -echo Spyc::YAMLDump($array); -echo '
'; diff --git a/vendors/spyc/php4/5to4.php b/vendors/spyc/php4/5to4.php deleted file mode 100644 index 5a48694..0000000 --- a/vendors/spyc/php4/5to4.php +++ /dev/null @@ -1,17 +0,0 @@ -', $code); - $f = fopen ($dest, 'w'); - fwrite($f, $code); - fclose ($f); - print "Written to $dest.\n"; -} \ No newline at end of file diff --git a/vendors/spyc/php4/spyc.php4 b/vendors/spyc/php4/spyc.php4 deleted file mode 100644 index 73f08cc..0000000 --- a/vendors/spyc/php4/spyc.php4 +++ /dev/null @@ -1,1023 +0,0 @@ - - * @author Chris Wanstrath - * @link http://code.google.com/p/spyc/ - * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2009 Vlad Andersen - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @package Spyc - */ - -if (!function_exists('spyc_load')) { - /** - * Parses YAML to array. - * @param string $string YAML string. - * @return array - */ - function spyc_load ($string) { - return Spyc::YAMLLoadString($string); - } -} - -if (!function_exists('spyc_load_file')) { - /** - * Parses YAML to array. - * @param string $file Path to YAML file. - * @return array - */ - function spyc_load_file ($file) { - return Spyc::YAMLLoad($file); - } -} - -/** - * The Simple PHP YAML Class. - * - * This class can be used to read a YAML file and convert its contents - * into a PHP array. It currently supports a very limited subsection of - * the YAML spec. - * - * Usage: - * - * $Spyc = new Spyc; - * $array = $Spyc->load($file); - * - * or: - * - * $array = Spyc::YAMLLoad($file); - * - * or: - * - * $array = spyc_load_file($file); - * - * @package Spyc - */ -class Spyc { - - // SETTINGS - - /** - * Setting this to true will force YAMLDump to enclose any string value in - * quotes. False by default. - * - * @var bool - */ - var $setting_dump_force_quotes = false; - - /** - * Setting this to true will forse YAMLLoad to use syck_load function when - * possible. False by default. - * @var bool - */ - var $setting_use_syck_is_possible = false; - - - - /**#@+ - * @access private - * @var mixed - */ - var $_dumpIndent; - var $_dumpWordWrap; - var $_containsGroupAnchor = false; - var $_containsGroupAlias = false; - var $path; - var $result; - var $LiteralPlaceHolder = '___YAML_Literal_Block___'; - var $SavedGroups = array(); - var $indent; - /** - * Path modifier that should be applied after adding current element. - * @var array - */ - var $delayedPath = array(); - - /**#@+ - * @access public - * @var mixed - */ - var $_nodeId; - -/** - * Load a valid YAML string to Spyc. - * @param string $input - * @return array - */ - function load ($input) { - return $this->__loadString($input); - } - - /** - * Load a valid YAML file to Spyc. - * @param string $file - * @return array - */ - function loadFile ($file) { - return $this->__load($file); - } - - /** - * Load YAML into a PHP array statically - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. Pretty - * simple. - * Usage: - * - * $array = Spyc::YAMLLoad('lucky.yaml'); - * print_r($array); - * - * @access public - * @return array - * @param string $input Path of YAML file or string containing YAML - */ - function YAMLLoad($input) { - $Spyc = new Spyc; - return $Spyc->__load($input); - } - - /** - * Load a string of YAML into a PHP array statically - * - * The load method, when supplied with a YAML string, will do its best - * to convert YAML in a string into a PHP array. Pretty simple. - * - * Note: use this function if you don't want files from the file system - * loaded and processed as YAML. This is of interest to people concerned - * about security whose input is from a string. - * - * Usage: - * - * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); - * print_r($array); - * - * @access public - * @return array - * @param string $input String containing YAML - */ - function YAMLLoadString($input) { - $Spyc = new Spyc; - return $Spyc->__loadString($input); - } - - /** - * Dump YAML from PHP array statically - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as nothing.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - function YAMLDump($array,$indent = false,$wordwrap = false) { - $spyc = new Spyc; - return $spyc->dump($array,$indent,$wordwrap); - } - - - /** - * Dump PHP array to YAML - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as tasteful.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - function dump($array,$indent = false,$wordwrap = false) { - // Dumps to some very clean YAML. We'll have to add some more features - // and options soon. And better support for folding. - - // New features and options. - if ($indent === false or !is_numeric($indent)) { - $this->_dumpIndent = 2; - } else { - $this->_dumpIndent = $indent; - } - - if ($wordwrap === false or !is_numeric($wordwrap)) { - $this->_dumpWordWrap = 40; - } else { - $this->_dumpWordWrap = $wordwrap; - } - - // New YAML document - $string = "---\n"; - - // Start at the base of the array and move through it. - if ($array) { - $array = (array)$array; - $first_key = key($array); - - $previous_key = -1; - foreach ($array as $key => $value) { - $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key); - $previous_key = $key; - } - } - return $string; - } - - /** - * Attempts to convert a key / value array item to YAML - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0) { - if (is_array($value)) { - if (empty ($value)) - return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key); - // It has children. What to do? - // Make it the right kind of item - $string = $this->_dumpNode($key, NULL, $indent, $previous_key, $first_key); - // Add the indent - $indent += $this->_dumpIndent; - // Yamlize the array - $string .= $this->_yamlizeArray($value,$indent); - } elseif (!is_array($value)) { - // It doesn't have children. Yip. - $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key); - } - return $string; - } - - /** - * Attempts to convert an array to YAML - * @access private - * @return string - * @param $array The array you want to convert - * @param $indent The indent of the current level - */ - function _yamlizeArray($array,$indent) { - if (is_array($array)) { - $string = ''; - $previous_key = -1; - $first_key = key($array); - foreach ($array as $key => $value) { - $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key); - $previous_key = $key; - } - return $string; - } else { - return false; - } - } - - /** - * Returns YAML from a key and a value - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0) { - // do some folding here, for blocks - if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || - strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || substr ($value, -1, 1) == ':')) { - $value = $this->_doLiteralBlock($value,$indent); - } else { - $value = $this->_doFolding($value,$indent); - if (is_bool($value)) { - $value = ($value) ? "true" : "false"; - } - } - - if ($value === array()) $value = '[ ]'; - - $spaces = str_repeat(' ',$indent); - - if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { - // It's a sequence - $string = $spaces.'- '.$value."\n"; - } else { - if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); - // It's mapped - if (strpos($key, ":") !== false) { $key = '"' . $key . '"'; } - $string = $spaces.$key.': '.$value."\n"; - } - return $string; - } - - /** - * Creates a literal block for dumping - * @access private - * @return string - * @param $value - * @param $indent int The value of the indent - */ - function _doLiteralBlock($value,$indent) { - if (strpos($value, "\n") === false && strpos($value, "'") === false) { - return sprintf ("'%s'", $value); - } - if (strpos($value, "\n") === false && strpos($value, '"') === false) { - return sprintf ('"%s"', $value); - } - $exploded = explode("\n",$value); - $newValue = '|'; - $indent += $this->_dumpIndent; - $spaces = str_repeat(' ',$indent); - foreach ($exploded as $line) { - $newValue .= "\n" . $spaces . trim($line); - } - return $newValue; - } - - /** - * Folds a string of text, if necessary - * @access private - * @return string - * @param $value The string you wish to fold - */ - function _doFolding($value,$indent) { - // Don't do anything if wordwrap is set to 0 - - if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { - $indent += $this->_dumpIndent; - $indent = str_repeat(' ',$indent); - $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); - $value = ">\n".$indent.$wrapped; - } else { - if ($this->setting_dump_force_quotes && is_string ($value)) - $value = '"' . $value . '"'; - } - - - return $value; - } - -// LOADING FUNCTIONS - - function __load($input) { - $Source = $this->loadFromSource($input); - return $this->loadWithSource($Source); - } - - function __loadString($input) { - $Source = $this->loadFromString($input); - return $this->loadWithSource($Source); - } - - function loadWithSource($Source) { - if (empty ($Source)) return array(); - if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ('', $Source)); - return is_array($array) ? $array : array(); - } - - $this->path = array(); - $this->result = array(); - - $cnt = count($Source); - for ($i = 0; $i < $cnt; $i++) { - $line = $Source[$i]; - - $this->indent = strlen($line) - strlen(ltrim($line)); - $tempPath = $this->getParentPathByIndent($this->indent); - $line = $this->stripIndent($line, $this->indent); - if ($this->isComment($line)) continue; - if ($this->isEmpty($line)) continue; - $this->path = $tempPath; - - $literalBlockStyle = $this->startsLiteralBlock($line); - if ($literalBlockStyle) { - $line = rtrim ($line, $literalBlockStyle . " \n"); - $literalBlock = ''; - $line .= $this->LiteralPlaceHolder; - - while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { - $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle); - } - $i--; - } - - while (++$i < $cnt && $this->greedilyNeedNextLine($line)) { - $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); - } - $i--; - - - - if (strpos ($line, '#')) { - if (strpos ($line, '"') === false && strpos ($line, "'") === false) - $line = preg_replace('/\s+#(.+)$/','',$line); - } - - $lineArray = $this->_parseLine($line); - - if ($literalBlockStyle) - $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); - - $this->addArray($lineArray, $this->indent); - - foreach ($this->delayedPath as $indent => $delayedPath) - $this->path[$indent] = $delayedPath; - - $this->delayedPath = array(); - - } - return $this->result; - } - - function loadFromSource ($input) { - if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - return file($input); - - return $this->loadFromString($input); - } - - function loadFromString ($input) { - $lines = explode("\n",$input); - foreach ($lines as $k => $_) { - $lines[$k] = rtrim ($_, "\r"); - } - return $lines; - } - - /** - * Parses YAML code and returns an array for a node - * @access private - * @return array - * @param string $line A line from the YAML file - */ - function _parseLine($line) { - if (!$line) return array(); - $line = trim($line); - - if (!$line) return array(); - $array = array(); - - $group = $this->nodeContainsGroup($line); - if ($group) { - $this->addGroup($line, $group); - $line = $this->stripGroup ($line, $group); - } - - if ($this->startsMappedSequence($line)) - return $this->returnMappedSequence($line); - - if ($this->startsMappedValue($line)) - return $this->returnMappedValue($line); - - if ($this->isArrayElement($line)) - return $this->returnArrayElement($line); - - if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - - return $this->returnKeyValuePair($line); - - } - - /** - * Finds the type of the passed value, returns the value as the new type. - * @access private - * @param string $value - * @return mixed - */ - function _toType($value) { - if ($value === '') return null; - $first_character = $value[0]; - $last_character = substr($value, -1, 1); - - $is_quoted = false; - do { - if (!$value) break; - if ($first_character != '"' && $first_character != "'") break; - if ($last_character != '"' && $last_character != "'") break; - $is_quoted = true; - } while (0); - - if ($is_quoted) - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - - if (strpos($value, ' #') !== false) - $value = preg_replace('/\s+#(.+)$/','',$value); - - if ($first_character == '[' && $last_character == ']') { - // Take out strings sequences and mappings - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $value = array(); - foreach ($explode as $v) { - $value[] = $this->_toType($v); - } - return $value; - } - - if (strpos($value,': ')!==false && $first_character != '{') { - $array = explode(': ',$value); - $key = trim($array[0]); - array_shift($array); - $value = trim(implode(': ',$array)); - $value = $this->_toType($value); - return array($key => $value); - } - - if ($first_character == '{' && $last_character == '}') { - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - // Inline Mapping - // Take out strings sequences and mappings - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $array = array(); - foreach ($explode as $v) { - $SubArr = $this->_toType($v); - if (empty($SubArr)) continue; - if (is_array ($SubArr)) { - $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; - } - $array[] = $SubArr; - } - return $array; - } - - if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { - return null; - } - - if (intval($first_character) > 0 && preg_match ('/^[1-9]+[0-9]*$/', $value)) { - $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) - $value = $intvalue; - return $value; - } - - if (in_array($value, - array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { - return true; - } - - if (in_array(strtolower($value), - array('false', 'off', '-', 'no', 'n'))) { - return false; - } - - if (is_numeric($value)) { - if ($value === '0') return 0; - if (trim ($value, 0) === $value) - $value = (float)$value; - return $value; - } - - return $value; - } - - /** - * Used in inlines to check for more inlines or quoted strings - * @access private - * @return array - */ - function _inlineEscape($inline) { - // There's gotta be a cleaner way to do this... - // While pure sequences seem to be nesting just fine, - // pure mappings and mappings with sequences inside can't go very - // deep. This needs to be fixed. - - $seqs = array(); - $maps = array(); - $saved_strings = array(); - - // Check for strings - $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_strings = $strings[0]; - $inline = preg_replace($regex,'YAMLString',$inline); - } - unset($regex); - - $i = 0; - do { - - // Check for sequences - while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { - $seqs[] = $matchseqs[0]; - $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); - } - - // Check for mappings - while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { - $maps[] = $matchmaps[0]; - $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); - } - - if ($i++ >= 10) break; - - } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - - $explode = explode(', ',$inline); - $stringi = 0; $i = 0; - - while (1) { - - // Re-add the sequences - if (!empty($seqs)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - foreach ($seqs as $seqk => $seq) { - $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); - $value = $explode[$key]; - } - } - } - } - - // Re-add the mappings - if (!empty($maps)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLMap') !== false) { - foreach ($maps as $mapk => $map) { - $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); - $value = $explode[$key]; - } - } - } - } - - - // Re-add the strings - if (!empty($saved_strings)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLString') !== false) { - $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); - unset($saved_strings[$stringi]); - ++$stringi; - $value = $explode[$key]; - } - } - } - - $finished = true; - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLMap') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLString') !== false) { - $finished = false; break; - } - } - if ($finished) break; - - $i++; - if ($i > 10) - break; // Prevent infinite loops. - } - - return $explode; - } - - function literalBlockContinues ($line, $lineIndent) { - if (!trim($line)) return true; - if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; - return false; - } - - function referenceContentsByAlias ($alias) { - do { - if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } - $groupPath = $this->SavedGroups[$alias]; - $value = $this->result; - foreach ($groupPath as $k) { - $value = $value[$k]; - } - } while (false); - return $value; - } - - function addArrayInline ($array, $indent) { - $CommonGroupPath = $this->path; - if (empty ($array)) return false; - - foreach ($array as $k => $_) { - $this->addArray(array($k => $_), $indent); - $this->path = $CommonGroupPath; - } - return true; - } - - function addArray ($incoming_data, $incoming_indent) { - - // print_r ($incoming_data); - - if (count ($incoming_data) > 1) - return $this->addArrayInline ($incoming_data, $incoming_indent); - - $key = key ($incoming_data); - $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; - if ($key === '__!YAMLZero') $key = '0'; - - if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. - if ($key || $key === '' || $key === '0') { - $this->result[$key] = $value; - } else { - $this->result[] = $value; end ($this->result); $key = key ($this->result); - } - $this->path[$incoming_indent] = $key; - return; - } - - - - $history = array(); - // Unfolding inner array tree. - $history[] = $_arr = $this->result; - foreach ($this->path as $k) { - $history[] = $_arr = $_arr[$k]; - } - - if ($this->_containsGroupAlias) { - $value = $this->referenceContentsByAlias($this->_containsGroupAlias); - $this->_containsGroupAlias = false; - } - - - // Adding string or numeric key to the innermost level or $this->arr. - if (is_string($key) && $key == '<<') { - if (!is_array ($_arr)) { $_arr = array (); } - $_arr = array_merge ($_arr, $value); - } else if ($key || $key === '' || $key === '0') { - $_arr[$key] = $value; - } else { - if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } - else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } - } - - $reverse_path = array_reverse($this->path); - $reverse_history = array_reverse ($history); - $reverse_history[0] = $_arr; - $cnt = count($reverse_history) - 1; - for ($i = 0; $i < $cnt; $i++) { - $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; - } - $this->result = $reverse_history[$cnt]; - - $this->path[$incoming_indent] = $key; - - if ($this->_containsGroupAnchor) { - $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; - if (is_array ($value)) { - $k = key ($value); - if (!is_int ($k)) { - $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; - } - } - $this->_containsGroupAnchor = false; - } - - } - - function startsLiteralBlock ($line) { - $lastChar = substr (trim($line), -1); - if ($lastChar != '>' && $lastChar != '|') return false; - if ($lastChar == '|') return $lastChar; - // HTML tags should not be counted as literal blocks. - if (preg_match ('#<.*?>$#', $line)) return false; - return $lastChar; - } - - function greedilyNeedNextLine($line) { - $line = trim ($line); - if (!strlen($line)) return false; - if (substr ($line, -1, 1) == ']') return false; - if ($line[0] == '[') return true; - if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; - return false; - } - - function addLiteralLine ($literalBlock, $line, $literalBlockStyle) { - $line = $this->stripIndent($line); - $line = rtrim ($line, "\r\n\t ") . "\n"; - if ($literalBlockStyle == '|') { - return $literalBlock . $line; - } - if (strlen($line) == 0) - return rtrim($literalBlock, ' ') . "\n"; - if ($line == "\n" && $literalBlockStyle == '>') { - return rtrim ($literalBlock, " \t") . "\n"; - } - if ($line != "\n") - $line = trim ($line, "\r\n ") . " "; - return $literalBlock . $line; - } - - function revertLiteralPlaceHolder ($lineArray, $literalBlock) { - foreach ($lineArray as $k => $_) { - if (is_array($_)) - $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); - else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) - $lineArray[$k] = rtrim ($literalBlock, " \r\n"); - } - return $lineArray; - } - - function stripIndent ($line, $indent = -1) { - if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); - return substr ($line, $indent); - } - - function getParentPathByIndent ($indent) { - if ($indent == 0) return array(); - $linePath = $this->path; - do { - end($linePath); $lastIndentInParentPath = key($linePath); - if ($indent <= $lastIndentInParentPath) array_pop ($linePath); - } while ($indent <= $lastIndentInParentPath); - return $linePath; - } - - - function clearBiggerPathValues ($indent) { - - - if ($indent == 0) $this->path = array(); - if (empty ($this->path)) return true; - - foreach ($this->path as $k => $_) { - if ($k > $indent) unset ($this->path[$k]); - } - - return true; - } - - - function isComment ($line) { - if (!$line) return false; - if ($line[0] == '#') return true; - if (trim($line, " \r\n\t") == '---') return true; - return false; - } - - function isEmpty ($line) { - return (trim ($line) === ''); - } - - - function isArrayElement ($line) { - if (!$line) return false; - if ($line[0] != '-') return false; - if (strlen ($line) > 3) - if (substr($line,0,3) == '---') return false; - - return true; - } - - function isHashElement ($line) { - return strpos($line, ':'); - } - - function isLiteral ($line) { - if ($this->isArrayElement($line)) return false; - if ($this->isHashElement($line)) return false; - return true; - } - - - function unquote ($value) { - if (!$value) return $value; - if (!is_string($value)) return $value; - if ($value[0] == '\'') return trim ($value, '\''); - if ($value[0] == '"') return trim ($value, '"'); - return $value; - } - - function startsMappedSequence ($line) { - return ($line[0] == '-' && substr ($line, -1, 1) == ':'); - } - - function returnMappedSequence ($line) { - $array = array(); - $key = $this->unquote(trim(substr($line,1,-1))); - $array[$key] = array(); - $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); - return array($array); - } - - function returnMappedValue ($line) { - $array = array(); - $key = $this->unquote (trim(substr($line,0,-1))); - $array[$key] = ''; - return $array; - } - - function startsMappedValue ($line) { - return (substr ($line, -1, 1) == ':'); - } - - function isPlainArray ($line) { - return ($line[0] == '[' && substr ($line, -1, 1) == ']'); - } - - function returnPlainArray ($line) { - return $this->_toType($line); - } - - function returnKeyValuePair ($line) { - $array = array(); - $key = ''; - if (strpos ($line, ':')) { - // It's a key/value pair most likely - // If the key is in double quotes pull it out - if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { - $value = trim(str_replace($matches[1],'',$line)); - $key = $matches[2]; - } else { - // Do some guesswork as to the key and the value - $explode = explode(':',$line); - $key = trim($explode[0]); - array_shift($explode); - $value = trim(implode(':',$explode)); - } - // Set the type of the value. Int, string, etc - $value = $this->_toType($value); - if ($key === '0') $key = '__!YAMLZero'; - $array[$key] = $value; - } else { - $array = array ($line); - } - return $array; - - } - - - function returnArrayElement ($line) { - if (strlen($line) <= 1) return array(array()); // Weird %) - $array = array(); - $value = trim(substr($line,1)); - $value = $this->_toType($value); - $array[] = $value; - return $array; - } - - - function nodeContainsGroup ($line) { - $symbolsForReference = 'A-z0-9_\-'; - if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) - if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; - if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; - if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; - return false; - - } - - function addGroup ($line, $group) { - if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); - if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); - //print_r ($this->path); - } - - function stripGroup ($line, $group) { - $line = trim(str_replace($group, '', $line)); - return $line; - } -} - -// Enable use of Spyc from command line -// The syntax is the following: php spyc.php spyc.yaml - -define ('SPYC_FROM_COMMAND_LINE', false); - -do { - if (!SPYC_FROM_COMMAND_LINE) break; - if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; - $file = $argv[1]; - printf ("Spyc loading file: %s\n", $file); - print_r (spyc_load_file ($file)); -} while (0); \ No newline at end of file diff --git a/vendors/spyc/php4/test.php4 b/vendors/spyc/php4/test.php4 deleted file mode 100644 index 315f501..0000000 --- a/vendors/spyc/php4/test.php4 +++ /dev/null @@ -1,162 +0,0 @@ - "1.5ghz", "ram" => "1 gig", - "os" => "os x 10.4.1")) - die('Sequence 4 failed'); - -# Mapped sequence -if ($yaml['domains'] != array("yaml.org", "php.net")) - die("Key: 'domains' failed"); - -# A sequence like this. -if ($yaml[5] != array("program" => "Adium", "platform" => "OS X", - "type" => "Chat Client")) - die('Sequence 5 failed'); - -# A folded block as a mapped value -if ($yaml['no time'] != "There isn't any time for your tricks!\nDo you understand?") - die("Key: 'no time' failed"); - -# A literal block as a mapped value -if ($yaml['some time'] != "There is nothing but time\nfor your tricks.") - die("Key: 'some time' failed"); - -# Crazy combinations -if ($yaml['databases'] != array( array("name" => "spartan", "notes" => - array( "Needs to be backed up", - "Needs to be normalized" ), - "type" => "mysql" ))) - die("Key: 'databases' failed"); - -# You can be a bit tricky -if ($yaml["if: you'd"] != "like") - die("Key: 'if: you\'d' failed"); - -# Inline sequences -if ($yaml[6] != array("One", "Two", "Three", "Four")) - die("Sequence 6 failed"); - -# Nested Inline Sequences -if ($yaml[7] != array("One", array("Two", "And", "Three"), "Four", "Five")) - die("Sequence 7 failed"); - -# Nested Nested Inline Sequences -if ($yaml[8] != array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), - "Seriously", array("Show", "Mercy"))) - die("Sequence 8 failed"); - -# Inline mappings -if ($yaml[9] != array("name" => "chris", "age" => "young", "brand" => "lucky strike")) - die("Sequence 9 failed"); - -# Nested inline mappings -if ($yaml[10] != array("name" => "mark", "age" => "older than chris", - "brand" => array("marlboro", "lucky strike"))) - die("Sequence 10 failed"); - -# References -- they're shaky, but functional -if ($yaml['dynamic languages'] != array('Perl', 'Python', 'PHP', 'Ruby')) - die("Key: 'dynamic languages' failed"); - -if ($yaml['compiled languages'] != array('C/C++', 'Java')) - die("Key: 'compiled languages' failed"); - -if ($yaml['all languages'] != array( - array('Perl', 'Python', 'PHP', 'Ruby'), - array('C/C++', 'Java') - )) - die("Key: 'all languages' failed"); - -# Added in .2.2: Escaped quotes -if ($yaml[11] != "you know, this shouldn't work. but it does.") - die("Sequence 11 failed."); - -if ($yaml[12] != "that's my value.") - die("Sequence 12 failed."); - -if ($yaml[13] != "again, that's my value.") - die("Sequence 13 failed."); - -if ($yaml[14] != "here's to \"quotes\", boss.") - die("Sequence 14 failed."); - -if ($yaml[15] != array( 'name' => "Foo, Bar's", 'age' => 20)) - die("Sequence 15 failed."); - -if ($yaml[16] != array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b")) - die("Sequence 16 failed."); - -if ($yaml['endloop'] != "Does this line in the end indeed make Spyc go to an infinite loop?") - die("[endloop] failed."); - - -print "spyc.yaml parsed correctly\n"; - -?> \ No newline at end of file diff --git a/vendors/spyc/spyc.php b/vendors/spyc/spyc.php deleted file mode 100644 index e19d562..0000000 --- a/vendors/spyc/spyc.php +++ /dev/null @@ -1,1046 +0,0 @@ - - * @author Chris Wanstrath - * @link http://code.google.com/p/spyc/ - * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @package Spyc - */ - -if (!function_exists('spyc_load')) { - /** - * Parses YAML to array. - * @param string $string YAML string. - * @return array - */ - function spyc_load ($string) { - return Spyc::YAMLLoadString($string); - } -} - -if (!function_exists('spyc_load_file')) { - /** - * Parses YAML to array. - * @param string $file Path to YAML file. - * @return array - */ - function spyc_load_file ($file) { - return Spyc::YAMLLoad($file); - } -} - -/** - * The Simple PHP YAML Class. - * - * This class can be used to read a YAML file and convert its contents - * into a PHP array. It currently supports a very limited subsection of - * the YAML spec. - * - * Usage: - * - * $Spyc = new Spyc; - * $array = $Spyc->load($file); - * - * or: - * - * $array = Spyc::YAMLLoad($file); - * - * or: - * - * $array = spyc_load_file($file); - * - * @package Spyc - */ -class Spyc { - - // SETTINGS - - const REMPTY = "\0\0\0\0\0"; - - /** - * Setting this to true will force YAMLDump to enclose any string value in - * quotes. False by default. - * - * @var bool - */ - public $setting_dump_force_quotes = false; - - /** - * Setting this to true will forse YAMLLoad to use syck_load function when - * possible. False by default. - * @var bool - */ - public $setting_use_syck_is_possible = false; - - - - /**#@+ - * @access private - * @var mixed - */ - private $_dumpIndent; - private $_dumpWordWrap; - private $_containsGroupAnchor = false; - private $_containsGroupAlias = false; - private $path; - private $result; - private $LiteralPlaceHolder = '___YAML_Literal_Block___'; - private $SavedGroups = array(); - private $indent; - /** - * Path modifier that should be applied after adding current element. - * @var array - */ - private $delayedPath = array(); - - /**#@+ - * @access public - * @var mixed - */ - public $_nodeId; - -/** - * Load a valid YAML string to Spyc. - * @param string $input - * @return array - */ - public function load ($input) { - return $this->__loadString($input); - } - - /** - * Load a valid YAML file to Spyc. - * @param string $file - * @return array - */ - public function loadFile ($file) { - return $this->__load($file); - } - - /** - * Load YAML into a PHP array statically - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. Pretty - * simple. - * Usage: - * - * $array = Spyc::YAMLLoad('lucky.yaml'); - * print_r($array); - * - * @access public - * @return array - * @param string $input Path of YAML file or string containing YAML - */ - public static function YAMLLoad($input) { - $Spyc = new Spyc; - return $Spyc->__load($input); - } - - /** - * Load a string of YAML into a PHP array statically - * - * The load method, when supplied with a YAML string, will do its best - * to convert YAML in a string into a PHP array. Pretty simple. - * - * Note: use this function if you don't want files from the file system - * loaded and processed as YAML. This is of interest to people concerned - * about security whose input is from a string. - * - * Usage: - * - * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); - * print_r($array); - * - * @access public - * @return array - * @param string $input String containing YAML - */ - public static function YAMLLoadString($input) { - $Spyc = new Spyc; - return $Spyc->__loadString($input); - } - - /** - * Dump YAML from PHP array statically - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as nothing.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - public static function YAMLDump($array,$indent = false,$wordwrap = false) { - $spyc = new Spyc; - return $spyc->dump($array,$indent,$wordwrap); - } - - - /** - * Dump PHP array to YAML - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as tasteful.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - public function dump($array,$indent = false,$wordwrap = false) { - // Dumps to some very clean YAML. We'll have to add some more features - // and options soon. And better support for folding. - - // New features and options. - if ($indent === false or !is_numeric($indent)) { - $this->_dumpIndent = 2; - } else { - $this->_dumpIndent = $indent; - } - - if ($wordwrap === false or !is_numeric($wordwrap)) { - $this->_dumpWordWrap = 40; - } else { - $this->_dumpWordWrap = $wordwrap; - } - - // New YAML document - $string = "---\n"; - - // Start at the base of the array and move through it. - if ($array) { - $array = (array)$array; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); - $previous_key = $key; - } - } - return $string; - } - - /** - * Attempts to convert a key / value array item to YAML - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { - if (is_array($value)) { - if (empty ($value)) - return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); - // It has children. What to do? - // Make it the right kind of item - $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); - // Add the indent - $indent += $this->_dumpIndent; - // Yamlize the array - $string .= $this->_yamlizeArray($value,$indent); - } elseif (!is_array($value)) { - // It doesn't have children. Yip. - $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); - } - return $string; - } - - /** - * Attempts to convert an array to YAML - * @access private - * @return string - * @param $array The array you want to convert - * @param $indent The indent of the current level - */ - private function _yamlizeArray($array,$indent) { - if (is_array($array)) { - $string = ''; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); - $previous_key = $key; - } - return $string; - } else { - return false; - } - } - - /** - * Returns YAML from a key and a value - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { - // do some folding here, for blocks - if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, ' ') !== false || - strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || - substr ($value, -1, 1) == ':') - ) { - $value = $this->_doLiteralBlock($value,$indent); - } else { - $value = $this->_doFolding($value,$indent); - } - - if ($value === array()) $value = '[ ]'; - if (in_array ($value, array ('true', 'TRUE', 'false', 'FALSE', 'y', 'Y', 'n', 'N', 'null', 'NULL'), true)) { - $value = $this->_doLiteralBlock($value,$indent); - } - if (trim ($value) != $value) - $value = $this->_doLiteralBlock($value,$indent); - - if (is_bool($value)) { - $value = ($value) ? "true" : "false"; - } - - if ($value === null) $value = 'null'; - if ($value === "'" . self::REMPTY . "'") $value = null; - - $spaces = str_repeat(' ',$indent); - - //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { - if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { - // It's a sequence - $string = $spaces.'- '.$value."\n"; - } else { - // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); - // It's mapped - if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } - $string = rtrim ($spaces.$key.': '.$value)."\n"; - } - return $string; - } - - /** - * Creates a literal block for dumping - * @access private - * @return string - * @param $value - * @param $indent int The value of the indent - */ - private function _doLiteralBlock($value,$indent) { - if ($value === "\n") return '\n'; - if (strpos($value, "\n") === false && strpos($value, "'") === false) { - return sprintf ("'%s'", $value); - } - if (strpos($value, "\n") === false && strpos($value, '"') === false) { - return sprintf ('"%s"', $value); - } - $exploded = explode("\n",$value); - $newValue = '|'; - $indent += $this->_dumpIndent; - $spaces = str_repeat(' ',$indent); - foreach ($exploded as $line) { - $newValue .= "\n" . $spaces . ($line); - } - return $newValue; - } - - /** - * Folds a string of text, if necessary - * @access private - * @return string - * @param $value The string you wish to fold - */ - private function _doFolding($value,$indent) { - // Don't do anything if wordwrap is set to 0 - - if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { - $indent += $this->_dumpIndent; - $indent = str_repeat(' ',$indent); - $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); - $value = ">\n".$indent.$wrapped; - } else { - if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) - $value = '"' . $value . '"'; - } - - - return $value; - } - -// LOADING FUNCTIONS - - private function __load($input) { - $Source = $this->loadFromSource($input); - return $this->loadWithSource($Source); - } - - private function __loadString($input) { - $Source = $this->loadFromString($input); - return $this->loadWithSource($Source); - } - - private function loadWithSource($Source) { - if (empty ($Source)) return array(); - if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ('', $Source)); - return is_array($array) ? $array : array(); - } - - $this->path = array(); - $this->result = array(); - - $cnt = count($Source); - for ($i = 0; $i < $cnt; $i++) { - $line = $Source[$i]; - - $this->indent = strlen($line) - strlen(ltrim($line)); - $tempPath = $this->getParentPathByIndent($this->indent); - $line = self::stripIndent($line, $this->indent); - if (self::isComment($line)) continue; - if (self::isEmpty($line)) continue; - $this->path = $tempPath; - - $literalBlockStyle = self::startsLiteralBlock($line); - if ($literalBlockStyle) { - $line = rtrim ($line, $literalBlockStyle . " \n"); - $literalBlock = ''; - $line .= $this->LiteralPlaceHolder; - $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); - while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { - $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); - } - $i--; - } - - while (++$i < $cnt && self::greedilyNeedNextLine($line)) { - $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); - } - $i--; - - - - if (strpos ($line, '#')) { - if (strpos ($line, '"') === false && strpos ($line, "'") === false) - $line = preg_replace('/\s+#(.+)$/','',$line); - } - - $lineArray = $this->_parseLine($line); - - if ($literalBlockStyle) - $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); - - $this->addArray($lineArray, $this->indent); - - foreach ($this->delayedPath as $indent => $delayedPath) - $this->path[$indent] = $delayedPath; - - $this->delayedPath = array(); - - } - return $this->result; - } - - private function loadFromSource ($input) { - if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - return file($input); - - return $this->loadFromString($input); - } - - private function loadFromString ($input) { - $lines = explode("\n",$input); - foreach ($lines as $k => $_) { - $lines[$k] = rtrim ($_, "\r"); - } - return $lines; - } - - /** - * Parses YAML code and returns an array for a node - * @access private - * @return array - * @param string $line A line from the YAML file - */ - private function _parseLine($line) { - if (!$line) return array(); - $line = trim($line); - if (!$line) return array(); - - $array = array(); - - $group = $this->nodeContainsGroup($line); - if ($group) { - $this->addGroup($line, $group); - $line = $this->stripGroup ($line, $group); - } - - if ($this->startsMappedSequence($line)) - return $this->returnMappedSequence($line); - - if ($this->startsMappedValue($line)) - return $this->returnMappedValue($line); - - if ($this->isArrayElement($line)) - return $this->returnArrayElement($line); - - if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - - return $this->returnKeyValuePair($line); - - } - - /** - * Finds the type of the passed value, returns the value as the new type. - * @access private - * @param string $value - * @return mixed - */ - private function _toType($value) { - if ($value === '') return null; - $first_character = $value[0]; - $last_character = substr($value, -1, 1); - - $is_quoted = false; - do { - if (!$value) break; - if ($first_character != '"' && $first_character != "'") break; - if ($last_character != '"' && $last_character != "'") break; - $is_quoted = true; - } while (0); - - if ($is_quoted) - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - - if (strpos($value, ' #') !== false && !$is_quoted) - $value = preg_replace('/\s+#(.+)$/','',$value); - - if (!$is_quoted) $value = str_replace('\n', "\n", $value); - - if ($first_character == '[' && $last_character == ']') { - // Take out strings sequences and mappings - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $value = array(); - foreach ($explode as $v) { - $value[] = $this->_toType($v); - } - return $value; - } - - if (strpos($value,': ')!==false && $first_character != '{') { - $array = explode(': ',$value); - $key = trim($array[0]); - array_shift($array); - $value = trim(implode(': ',$array)); - $value = $this->_toType($value); - return array($key => $value); - } - - if ($first_character == '{' && $last_character == '}') { - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - // Inline Mapping - // Take out strings sequences and mappings - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $array = array(); - foreach ($explode as $v) { - $SubArr = $this->_toType($v); - if (empty($SubArr)) continue; - if (is_array ($SubArr)) { - $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; - } - $array[] = $SubArr; - } - return $array; - } - - if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { - return null; - } - - if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ - $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) - $value = $intvalue; - return $value; - } - - if (in_array($value, - array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { - return true; - } - - if (in_array(strtolower($value), - array('false', 'off', '-', 'no', 'n'))) { - return false; - } - - if (is_numeric($value)) { - if ($value === '0') return 0; - if (rtrim ($value, 0) === $value) - $value = (float)$value; - return $value; - } - - return $value; - } - - /** - * Used in inlines to check for more inlines or quoted strings - * @access private - * @return array - */ - private function _inlineEscape($inline) { - // There's gotta be a cleaner way to do this... - // While pure sequences seem to be nesting just fine, - // pure mappings and mappings with sequences inside can't go very - // deep. This needs to be fixed. - - $seqs = array(); - $maps = array(); - $saved_strings = array(); - - // Check for strings - $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_strings = $strings[0]; - $inline = preg_replace($regex,'YAMLString',$inline); - } - unset($regex); - - $i = 0; - do { - - // Check for sequences - while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { - $seqs[] = $matchseqs[0]; - $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); - } - - // Check for mappings - while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { - $maps[] = $matchmaps[0]; - $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); - } - - if ($i++ >= 10) break; - - } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - - $explode = explode(', ',$inline); - $stringi = 0; $i = 0; - - while (1) { - - // Re-add the sequences - if (!empty($seqs)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - foreach ($seqs as $seqk => $seq) { - $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); - $value = $explode[$key]; - } - } - } - } - - // Re-add the mappings - if (!empty($maps)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLMap') !== false) { - foreach ($maps as $mapk => $map) { - $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); - $value = $explode[$key]; - } - } - } - } - - - // Re-add the strings - if (!empty($saved_strings)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLString') !== false) { - $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); - unset($saved_strings[$stringi]); - ++$stringi; - $value = $explode[$key]; - } - } - } - - $finished = true; - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLMap') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLString') !== false) { - $finished = false; break; - } - } - if ($finished) break; - - $i++; - if ($i > 10) - break; // Prevent infinite loops. - } - - return $explode; - } - - private function literalBlockContinues ($line, $lineIndent) { - if (!trim($line)) return true; - if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; - return false; - } - - private function referenceContentsByAlias ($alias) { - do { - if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } - $groupPath = $this->SavedGroups[$alias]; - $value = $this->result; - foreach ($groupPath as $k) { - $value = $value[$k]; - } - } while (false); - return $value; - } - - private function addArrayInline ($array, $indent) { - $CommonGroupPath = $this->path; - if (empty ($array)) return false; - - foreach ($array as $k => $_) { - $this->addArray(array($k => $_), $indent); - $this->path = $CommonGroupPath; - } - return true; - } - - private function addArray ($incoming_data, $incoming_indent) { - - // print_r ($incoming_data); - - if (count ($incoming_data) > 1) - return $this->addArrayInline ($incoming_data, $incoming_indent); - - $key = key ($incoming_data); - $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; - if ($key === '__!YAMLZero') $key = '0'; - - if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. - if ($key || $key === '' || $key === '0') { - $this->result[$key] = $value; - } else { - $this->result[] = $value; end ($this->result); $key = key ($this->result); - } - $this->path[$incoming_indent] = $key; - return; - } - - - - $history = array(); - // Unfolding inner array tree. - $history[] = $_arr = $this->result; - foreach ($this->path as $k) { - $history[] = $_arr = $_arr[$k]; - } - - if ($this->_containsGroupAlias) { - $value = $this->referenceContentsByAlias($this->_containsGroupAlias); - $this->_containsGroupAlias = false; - } - - - // Adding string or numeric key to the innermost level or $this->arr. - if (is_string($key) && $key == '<<') { - if (!is_array ($_arr)) { $_arr = array (); } - - $_arr = array_merge ($_arr, $value); - } else if ($key || $key === '' || $key === '0') { - if (!is_array ($_arr)) - $_arr = array ($key=>$value); - else - $_arr[$key] = $value; - } else { - if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } - else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } - } - - $reverse_path = array_reverse($this->path); - $reverse_history = array_reverse ($history); - $reverse_history[0] = $_arr; - $cnt = count($reverse_history) - 1; - for ($i = 0; $i < $cnt; $i++) { - $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; - } - $this->result = $reverse_history[$cnt]; - - $this->path[$incoming_indent] = $key; - - if ($this->_containsGroupAnchor) { - $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; - if (is_array ($value)) { - $k = key ($value); - if (!is_int ($k)) { - $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; - } - } - $this->_containsGroupAnchor = false; - } - - } - - private static function startsLiteralBlock ($line) { - $lastChar = substr (trim($line), -1); - if ($lastChar != '>' && $lastChar != '|') return false; - if ($lastChar == '|') return $lastChar; - // HTML tags should not be counted as literal blocks. - if (preg_match ('#<.*?>$#', $line)) return false; - return $lastChar; - } - - private static function greedilyNeedNextLine($line) { - $line = trim ($line); - if (!strlen($line)) return false; - if (substr ($line, -1, 1) == ']') return false; - if ($line[0] == '[') return true; - if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; - return false; - } - - private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { - $line = self::stripIndent($line, $indent); - if ($literalBlockStyle !== '|') { - $line = self::stripIndent($line); - } - $line = rtrim ($line, "\r\n\t ") . "\n"; - if ($literalBlockStyle == '|') { - return $literalBlock . $line; - } - if (strlen($line) == 0) - return rtrim($literalBlock, ' ') . "\n"; - if ($line == "\n" && $literalBlockStyle == '>') { - return rtrim ($literalBlock, " \t") . "\n"; - } - if ($line != "\n") - $line = trim ($line, "\r\n ") . " "; - return $literalBlock . $line; - } - - function revertLiteralPlaceHolder ($lineArray, $literalBlock) { - foreach ($lineArray as $k => $_) { - if (is_array($_)) - $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); - else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) - $lineArray[$k] = rtrim ($literalBlock, " \r\n"); - } - return $lineArray; - } - - private static function stripIndent ($line, $indent = -1) { - if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); - return substr ($line, $indent); - } - - private function getParentPathByIndent ($indent) { - if ($indent == 0) return array(); - $linePath = $this->path; - do { - end($linePath); $lastIndentInParentPath = key($linePath); - if ($indent <= $lastIndentInParentPath) array_pop ($linePath); - } while ($indent <= $lastIndentInParentPath); - return $linePath; - } - - - private function clearBiggerPathValues ($indent) { - - - if ($indent == 0) $this->path = array(); - if (empty ($this->path)) return true; - - foreach ($this->path as $k => $_) { - if ($k > $indent) unset ($this->path[$k]); - } - - return true; - } - - - private static function isComment ($line) { - if (!$line) return false; - if ($line[0] == '#') return true; - if (trim($line, " \r\n\t") == '---') return true; - return false; - } - - private static function isEmpty ($line) { - return (trim ($line) === ''); - } - - - private function isArrayElement ($line) { - if (!$line) return false; - if ($line[0] != '-') return false; - if (strlen ($line) > 3) - if (substr($line,0,3) == '---') return false; - - return true; - } - - private function isHashElement ($line) { - return strpos($line, ':'); - } - - private function isLiteral ($line) { - if ($this->isArrayElement($line)) return false; - if ($this->isHashElement($line)) return false; - return true; - } - - - private static function unquote ($value) { - if (!$value) return $value; - if (!is_string($value)) return $value; - if ($value[0] == '\'') return trim ($value, '\''); - if ($value[0] == '"') return trim ($value, '"'); - return $value; - } - - private function startsMappedSequence ($line) { - return ($line[0] == '-' && substr ($line, -1, 1) == ':'); - } - - private function returnMappedSequence ($line) { - $array = array(); - $key = self::unquote(trim(substr($line,1,-1))); - $array[$key] = array(); - $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); - return array($array); - } - - private function returnMappedValue ($line) { - $array = array(); - $key = self::unquote (trim(substr($line,0,-1))); - $array[$key] = ''; - return $array; - } - - private function startsMappedValue ($line) { - return (substr ($line, -1, 1) == ':'); - } - - private function isPlainArray ($line) { - return ($line[0] == '[' && substr ($line, -1, 1) == ']'); - } - - private function returnPlainArray ($line) { - return $this->_toType($line); - } - - private function returnKeyValuePair ($line) { - $array = array(); - $key = ''; - if (strpos ($line, ':')) { - // It's a key/value pair most likely - // If the key is in double quotes pull it out - if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { - $value = trim(str_replace($matches[1],'',$line)); - $key = $matches[2]; - } else { - // Do some guesswork as to the key and the value - $explode = explode(':',$line); - $key = trim($explode[0]); - array_shift($explode); - $value = trim(implode(':',$explode)); - } - // Set the type of the value. Int, string, etc - $value = $this->_toType($value); - if ($key === '0') $key = '__!YAMLZero'; - $array[$key] = $value; - } else { - $array = array ($line); - } - return $array; - - } - - - private function returnArrayElement ($line) { - if (strlen($line) <= 1) return array(array()); // Weird %) - $array = array(); - $value = trim(substr($line,1)); - $value = $this->_toType($value); - $array[] = $value; - return $array; - } - - - private function nodeContainsGroup ($line) { - $symbolsForReference = 'A-z0-9_\-'; - if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) - if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; - if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; - if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; - return false; - - } - - private function addGroup ($line, $group) { - if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); - if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); - //print_r ($this->path); - } - - private function stripGroup ($line, $group) { - $line = trim(str_replace($group, '', $line)); - return $line; - } -} - -// Enable use of Spyc from command line -// The syntax is the following: php spyc.php spyc.yaml - -define ('SPYC_FROM_COMMAND_LINE', false); - -do { - if (!SPYC_FROM_COMMAND_LINE) break; - if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; - $file = $argv[1]; - printf ("Spyc loading file: %s\n", $file); - print_r (spyc_load_file ($file)); -} while (0); \ No newline at end of file diff --git a/vendors/spyc/spyc.yaml b/vendors/spyc/spyc.yaml deleted file mode 100644 index 930149e..0000000 --- a/vendors/spyc/spyc.yaml +++ /dev/null @@ -1,203 +0,0 @@ -# -# S P Y C -# a simple php yaml class -# -# authors: [vlad andersen (vlad.andersen@gmail.com), chris wanstrath (chris@ozmm.org)] -# websites: [http://www.yaml.org, http://spyc.sourceforge.net/] -# license: [MIT License, http://www.opensource.org/licenses/mit-license.php] -# copyright: (c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen -# -# spyc.yml - A file containing the YAML that Spyc understands. - ---- - -# Mappings - with proper types -String: Anyone's name, really. -Int: 13 -True: true -False: false -Zero: 0 -Null: NULL -NotNull: 'null' -NotTrue: 'y' -NotBoolTrue: 'true' -NotInt: '5' -Float: 5.34 -Negative: -90 -SmallFloat: 0.7 -NewLine: \n - -# A sequence -- PHP Class -- Basic YAML Loader -- Very Basic YAML Dumper - -# A sequence of a sequence -- - - YAML is so easy to learn. - - Your config files will never be the same. - -# Sequence of mappings -- - cpu: 1.5ghz - ram: 1 gig - os : os x 10.4.1 - -# Mapped sequence -domains: - - yaml.org - - php.net - -# A sequence like this. -- program: Adium - platform: OS X - type: Chat Client - -# A folded block as a mapped value -no time: > - There isn't any time - for your tricks! - - Do you understand? - -# A literal block as a mapped value -some time: | - There is nothing but time - for your tricks. - -# Crazy combinations -databases: - - name: spartan - notes: - - Needs to be backed up - - Needs to be normalized - type: mysql - -# You can be a bit tricky -"if: you'd": like - -# Inline sequences -- [One, Two, Three, Four] - -# Nested Inline Sequences -- [One, [Two, And, Three], Four, Five] - -# Nested Nested Inline Sequences -- [This, [Is, Getting, [Ridiculous, Guys]], Seriously, [Show, Mercy]] - -# Inline mappings -- {name: chris, age: young, brand: lucky strike} - -# Nested inline mappings -- {name: mark, age: older than chris, brand: [marlboro, lucky strike]} - -# References -- they're shaky, but functional -dynamic languages: &DLANGS - - Perl - - Python - - PHP - - Ruby -compiled languages: &CLANGS - - C/C++ - - Java -all languages: - - *DLANGS - - *CLANGS - -# Added in .2.2: Escaped quotes -- you know, this shouldn't work. but it does. -- 'that''s my value.' -- 'again, that\'s my value.' -- "here's to \"quotes\", boss." - -# added in .2.3 -- {name: "Foo, Bar's", age: 20} - -# Added in .2.4: bug [ 1418193 ] Quote Values in Nested Arrays -- [a, ['1', "2"], b] - -# Added in .2.4: malformed YAML -all - javascripts: [dom1.js, dom.js] - -# Added in .2 -1040: Ooo, a numeric key! # And working comments? Wow! Colons in comments: a menace (0.3). - -hash_1: Hash #and a comment -hash_2: "Hash #and a comment" -"hash#3": "Hash (#) can appear in key too" - -float_test: 1.0 -float_test_with_quotes: '1.0' -float_inverse_test: 001 - -a_really_large_number: 115792089237316195423570985008687907853269984665640564039457584007913129639936 # 2^256 - -int array: [ 1, 2, 3 ] - -array on several lines: - [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ] - -morelesskey: "" - -array_of_zero: [0] -sophisticated_array_of_zero: {rx: {tx: [0]} } - -switches: - - { row: 0, col: 0, func: {tx: [0, 1]} } - -empty_sequence: [ ] -empty_hash: { } - -special_characters: "[{]]{{]]" - -asterisks: "*" - -empty_key: - : - key: value - -trailing_colon: "foo:" - -multiline_items: - - type: SomeItem - values: [blah, blah, blah, - blah] - ints: [2, 54, 12, - 2143] - -many_lines: | - A quick - fox - - - jumped - over - - - - - - a lazy - - - - dog - - -werte: - 1: nummer 1 - 0: Stunde 0 - -noindent_records: -- record1: value1 -- record2: value2 - -"a:1": [1000] -"a:2": - - 2000 - -# [Endloop] -endloop: | - Does this line in the end indeed make Spyc go to an infinite loop? \ No newline at end of file diff --git a/vendors/spyc/tests/DumpTest.php b/vendors/spyc/tests/DumpTest.php deleted file mode 100644 index 0b9e5fa..0000000 --- a/vendors/spyc/tests/DumpTest.php +++ /dev/null @@ -1,130 +0,0 @@ -files_to_test = array ('../spyc.yaml', 'failing1.yaml', 'indent_1.yaml', 'quotes.yaml'); - } - - public function testDump() { - foreach ($this->files_to_test as $file) { - $yaml = spyc_load(file_get_contents($file)); - $dump = Spyc::YAMLDump ($yaml); - $yaml_after_dump = Spyc::YAMLLoad ($dump); - $this->assertEquals ($yaml, $yaml_after_dump); - } - } - - public function testDumpWithQuotes() { - $Spyc = new Spyc(); - $Spyc->setting_dump_force_quotes = true; - foreach ($this->files_to_test as $file) { - $yaml = $Spyc->load(file_get_contents($file)); - $dump = $Spyc->dump ($yaml); - $yaml_after_dump = Spyc::YAMLLoad ($dump); - $this->assertEquals ($yaml, $yaml_after_dump); - } - } - - public function testDumpArrays() { - $dump = Spyc::YAMLDump(array ('item1', 'item2', 'item3')); - $awaiting = "---\n- item1\n- item2\n- item3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testNull() { - $dump = Spyc::YAMLDump(array('a' => 1, 'b' => null, 'c' => 3)); - $awaiting = "---\na: 1\nb: null\nc: 3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testNext() { - $array = array("aaa", "bbb", "ccc"); - #set arrays internal pointer to next element - next($array); - $dump = Spyc::YAMLDump($array); - $awaiting = "---\n- aaa\n- bbb\n- ccc\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpingMixedArrays() { - $array = array(); - $array[] = 'Sequence item'; - $array['The Key'] = 'Mapped value'; - $array[] = array('A sequence','of a sequence'); - $array[] = array('first' => 'A sequence','second' => 'of mapped values'); - $array['Mapped'] = array('A sequence','which is mapped'); - $array['A Note'] = 'What if your text is too long?'; - $array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; - $array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; - $array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; - $array['key:withcolon'] = "Should support this to"; - - $yaml = Spyc::YAMLDump($array,4,60); - } - - public function testMixed() { - $dump = Spyc::YAMLDump(array(0 => 1, 'b' => 2, 1 => 3)); - $awaiting = "---\n0: 1\nb: 2\n1: 3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpNumerics() { - $dump = Spyc::YAMLDump(array ('404', '405', '500')); - $awaiting = "---\n- 404\n- 405\n- 500\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpAsterisks() { - $dump = Spyc::YAMLDump(array ('*')); - $awaiting = "---\n- '*'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpAmpersands() { - $dump = Spyc::YAMLDump(array ('some' => '&foo')); - $awaiting = "---\nsome: '&foo'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpExclamations() { - $dump = Spyc::YAMLDump(array ('some' => '!foo')); - $awaiting = "---\nsome: '!foo'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpExclamations2() { - $dump = Spyc::YAMLDump(array ('some' => 'foo!')); - $awaiting = "---\nsome: foo!\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpApostrophes() { - $dump = Spyc::YAMLDump(array ('some' => "'Biz' pimpt bedrijventerreinen")); - $awaiting = "---\nsome: \"'Biz' pimpt bedrijventerreinen\"\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpNumericHashes() { - $dump = Spyc::YAMLDump(array ("titel"=> array("0" => "", 1 => "Dr.", 5 => "Prof.", 6 => "Prof. Dr."))); - $awaiting = "---\ntitel:\n 0:\n 1: Dr.\n 5: Prof.\n 6: Prof. Dr.\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testEmpty() { - $dump = Spyc::YAMLDump(array("foo" => array())); - $awaiting = "---\nfoo: [ ]\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testHashesInKeys() { - $dump = Spyc::YAMLDump(array ('#color' => '#ffffff')); - $awaiting = "---\n\"#color\": '#ffffff'\n"; - $this->assertEquals ($awaiting, $dump); - } - -} \ No newline at end of file diff --git a/vendors/spyc/tests/IndentTest.php b/vendors/spyc/tests/IndentTest.php deleted file mode 100644 index 5b6dc86..0000000 --- a/vendors/spyc/tests/IndentTest.php +++ /dev/null @@ -1,65 +0,0 @@ -Y = Spyc::YAMLLoad("indent_1.yaml"); - } - - public function testIndent_1() { - $this->assertEquals (array ('child_1' => 2, 'child_2' => 0, 'child_3' => 1), $this->Y['root']); - } - - public function testIndent_2() { - $this->assertEquals (array ('child_1' => 1, 'child_2' => 2), $this->Y['root2']); - } - - public function testIndent_3() { - $this->assertEquals (array (array ('resolutions' => array (1024 => 768, 1920 => 1200), 'producer' => 'Nec')), $this->Y['display']); - } - - public function testIndent_4() { - $this->assertEquals (array ( - array ('resolutions' => array (1024 => 768)), - array ('resolutions' => array (1920 => 1200)), - ), $this->Y['displays']); - } - - public function testIndent_5() { - $this->assertEquals (array (array ( - 'row' => 0, - 'col' => 0, - 'headsets_affected' => array ( - array ( - 'ports' => array (0), - 'side' => 'left', - ) - ), - 'switch_function' => array ( - 'ics_ptt' => true - ) - )), $this->Y['nested_hashes_and_seqs']); - } - - public function testIndent_6() { - $this->assertEquals (array ( - 'h' => array ( - array ('a' => 'b', 'a1' => 'b1'), - array ('c' => 'd') - ) - ), $this->Y['easier_nest']); - } - - public function testIndent_space() { - $this->assertEquals ("By four\n spaces", $this->Y['one_space']); - } - - public function testListAndComment() { - $this->assertEquals (array ('one', 'two', 'three'), $this->Y['list_and_comment']); - } - -} \ No newline at end of file diff --git a/vendors/spyc/tests/ParseTest.php b/vendors/spyc/tests/ParseTest.php deleted file mode 100644 index f7045bd..0000000 --- a/vendors/spyc/tests/ParseTest.php +++ /dev/null @@ -1,322 +0,0 @@ -yaml = spyc_load_file('../spyc.yaml'); - } - - public function testMergeHashKeys() { - $Expected = array ( - array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '1mm')), - array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '2mm')), - ); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['steps']); - } - - public function testDeathMasks() { - $Expected = array ('sad' => 2, 'magnificent' => 4); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['death masks are']); - } - - public function testDevDb() { - $Expected = array ('adapter' => 'mysql', 'host' => 'localhost', 'database' => 'rails_dev'); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['development']); - } - - public function testNumericKey() { - $this->assertEquals ("Ooo, a numeric key!", $this->yaml[1040]); - } - - public function testMappingsString() { - $this->assertEquals ("Anyone's name, really.", $this->yaml['String']); - } - - public function testMappingsInt() { - $this->assertSame (13, $this->yaml['Int']); - } - - public function testMappingsBooleanTrue() { - $this->assertSame (true, $this->yaml['True']); - } - - public function testMappingsBooleanFalse() { - $this->assertSame (false, $this->yaml['False']); - } - - public function testMappingsZero() { - $this->assertSame (0, $this->yaml['Zero']); - } - - public function testMappingsNull() { - $this->assertSame (null, $this->yaml['Null']); - } - - public function testMappingsNotNull() { - $this->assertSame ('null', $this->yaml['NotNull']); - } - - public function testMappingsFloat() { - $this->assertSame (5.34, $this->yaml['Float']); - } - - public function testMappingsNegative() { - $this->assertSame (-90, $this->yaml['Negative']); - } - - public function testMappingsSmallFloat() { - $this->assertSame (0.7, $this->yaml['SmallFloat']); - } - - public function testNewline() { - $this->assertSame ("\n", $this->yaml['NewLine']); - } - - - public function testSeq0() { - $this->assertEquals ("PHP Class", $this->yaml[0]); - } - - public function testSeq1() { - $this->assertEquals ("Basic YAML Loader", $this->yaml[1]); - } - - public function testSeq2() { - $this->assertEquals ("Very Basic YAML Dumper", $this->yaml[2]); - } - - public function testSeq3() { - $this->assertEquals (array("YAML is so easy to learn.", - "Your config files will never be the same."), $this->yaml[3]); - } - - public function testSeqMap() { - $this->assertEquals (array("cpu" => "1.5ghz", "ram" => "1 gig", - "os" => "os x 10.4.1"), $this->yaml[4]); - } - - public function testMappedSequence() { - $this->assertEquals (array("yaml.org", "php.net"), $this->yaml['domains']); - } - - public function testAnotherSequence() { - $this->assertEquals (array("program" => "Adium", "platform" => "OS X", - "type" => "Chat Client"), $this->yaml[5]); - } - - public function testFoldedBlock() { - $this->assertEquals ("There isn't any time for your tricks!\nDo you understand?", $this->yaml['no time']); - } - - public function testLiteralAsMapped() { - $this->assertEquals ("There is nothing but time\nfor your tricks.", $this->yaml['some time']); - } - - public function testCrazy() { - $this->assertEquals (array( array("name" => "spartan", "notes" => - array( "Needs to be backed up", - "Needs to be normalized" ), - "type" => "mysql" )), $this->yaml['databases']); - } - - public function testColons() { - $this->assertEquals ("like", $this->yaml["if: you'd"]); - } - - public function testInline() { - $this->assertEquals (array("One", "Two", "Three", "Four"), $this->yaml[6]); - } - - public function testNestedInline() { - $this->assertEquals (array("One", array("Two", "And", "Three"), "Four", "Five"), $this->yaml[7]); - } - - public function testNestedNestedInline() { - $this->assertEquals (array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), - "Seriously", array("Show", "Mercy")), $this->yaml[8]); - } - - public function testInlineMappings() { - $this->assertEquals (array("name" => "chris", "age" => "young", "brand" => "lucky strike"), $this->yaml[9]); - } - - public function testNestedInlineMappings() { - $this->assertEquals (array("name" => "mark", "age" => "older than chris", - "brand" => array("marlboro", "lucky strike")), $this->yaml[10]); - } - - public function testReferences() { - $this->assertEquals (array('Perl', 'Python', 'PHP', 'Ruby'), $this->yaml['dynamic languages']); - } - - public function testReferences2() { - $this->assertEquals (array('C/C++', 'Java'), $this->yaml['compiled languages']); - } - - public function testReferences3() { - $this->assertEquals (array( - array('Perl', 'Python', 'PHP', 'Ruby'), - array('C/C++', 'Java') - ), $this->yaml['all languages']); - } - - public function testEscapedQuotes() { - $this->assertEquals ("you know, this shouldn't work. but it does.", $this->yaml[11]); - } - - public function testEscapedQuotes_2() { - $this->assertEquals ( "that's my value.", $this->yaml[12]); - } - - public function testEscapedQuotes_3() { - $this->assertEquals ("again, that's my value.", $this->yaml[13]); - } - - public function testQuotes() { - $this->assertEquals ("here's to \"quotes\", boss.", $this->yaml[14]); - } - - public function testQuoteSequence() { - $this->assertEquals ( array( 'name' => "Foo, Bar's", 'age' => 20), $this->yaml[15]); - } - - public function testShortSequence() { - $this->assertEquals (array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b"), $this->yaml[16]); - } - - public function testHash_1() { - $this->assertEquals ("Hash", $this->yaml['hash_1']); - } - - public function testHash_2() { - $this->assertEquals ('Hash #and a comment', $this->yaml['hash_2']); - } - - public function testHash_3() { - $this->assertEquals ('Hash (#) can appear in key too', $this->yaml['hash#3']); - } - - public function testEndloop() { - $this->assertEquals ("Does this line in the end indeed make Spyc go to an infinite loop?", $this->yaml['endloop']); - } - - public function testReallyLargeNumber() { - $this->assertEquals ('115792089237316195423570985008687907853269984665640564039457584007913129639936', $this->yaml['a_really_large_number']); - } - - public function testFloatWithZeros() { - $this->assertSame ('1.0', $this->yaml['float_test']); - } - - public function testFloatWithQuotes() { - $this->assertSame ('1.0', $this->yaml['float_test_with_quotes']); - } - - public function testFloatInverse() { - $this->assertEquals ('001', $this->yaml['float_inverse_test']); - } - - public function testIntArray() { - $this->assertEquals (array (1, 2, 3), $this->yaml['int array']); - } - - public function testArrayOnSeveralLines() { - $this->assertEquals (array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), $this->yaml['array on several lines']); - } - - public function testmoreLessKey() { - $this->assertEquals ('', $this->yaml['morelesskey']); - } - - public function testArrayOfZero() { - $this->assertSame (array(0), $this->yaml['array_of_zero']); - } - - public function testSophisticatedArrayOfZero() { - $this->assertSame (array('rx' => array ('tx' => array (0))), $this->yaml['sophisticated_array_of_zero']); - } - - public function testSwitches() { - $this->assertEquals (array (array ('row' => 0, 'col' => 0, 'func' => array ('tx' => array(0, 1)))), $this->yaml['switches']); - } - - public function testEmptySequence() { - $this->assertSame (array(), $this->yaml['empty_sequence']); - } - - public function testEmptyHash() { - $this->assertSame (array(), $this->yaml['empty_hash']); - } - - public function testEmptykey() { - $this->assertSame (array('' => array ('key' => 'value')), $this->yaml['empty_key']); - } - - public function testMultilines() { - $this->assertSame (array(array('type' => 'SomeItem', 'values' => array ('blah', 'blah', 'blah', 'blah'), 'ints' => array(2, 54, 12, 2143))), $this->yaml['multiline_items']); - } - - public function testManyNewlines() { - $this->assertSame ('A quick -fox - - -jumped -over - - - - - -a lazy - - - -dog', $this->yaml['many_lines']); - } - - public function testWerte() { - $this->assertSame (array ('1' => 'nummer 1', '0' => 'Stunde 0'), $this->yaml['werte']); - } - - /* public function testNoIndent() { - $this->assertSame (array( - array ('record1'=>'value1'), - array ('record2'=>'value2') - ) - , $this->yaml['noindent_records']); - } */ - - public function testColonsInKeys() { - $this->assertSame (array (1000), $this->yaml['a:1']); - } - - public function testColonsInKeys2() { - $this->assertSame (array (2000), $this->yaml['a:2']); - } - - public function testSpecialCharacters() { - $this->assertSame ('[{]]{{]]', $this->yaml['special_characters']); - } - - public function testAngleQuotes() { - $Quotes = Spyc::YAMLLoad('quotes.yaml'); - $this->assertEquals (array ('html_tags' => array ('
', '

'), 'html_content' => array ('

hello world

', 'hello
world'), 'text_content' => array ('hello world')), - $Quotes); - } - - public function testFailingColons() { - $Failing = Spyc::YAMLLoad('failing1.yaml'); - $this->assertSame (array ('MyObject' => array ('Prop1' => array ('key1:val1'))), - $Failing); - } - -} \ No newline at end of file diff --git a/vendors/spyc/tests/RoundTripTest.php b/vendors/spyc/tests/RoundTripTest.php deleted file mode 100644 index 4a906e2..0000000 --- a/vendors/spyc/tests/RoundTripTest.php +++ /dev/null @@ -1,61 +0,0 @@ - $a))); } - - -class RoundTripTest extends PHPUnit_Framework_TestCase { - - protected function setUp() { - } - - public function testNull() { - $this->assertEquals (array ('x' => null), roundTrip (null)); - } - - public function testY() { - $this->assertEquals (array ('x' => 'y'), roundTrip ('y')); - } - - public function testExclam() { - $this->assertEquals (array ('x' => '!yeah'), roundTrip ('!yeah')); - } - - public function test5() { - $this->assertEquals (array ('x' => '5'), roundTrip ('5')); - } - - public function testSpaces() { - $this->assertEquals (array ('x' => 'x '), roundTrip ('x ')); - } - - public function testApostrophes() { - $this->assertEquals (array ('x' => "'biz'"), roundTrip ("'biz'")); - } - - public function testNewLines() { - $this->assertEquals (array ('x' => "\n"), roundTrip ("\n")); - } - - public function testHashes() { - $this->assertEquals (array ('x' => array ("#color" => '#fff')), roundTrip (array ("#color" => '#fff'))); - } - - public function testWordWrap() { - $this->assertEquals (array ('x' => "aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), roundTrip ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); - } - - public function testABCD() { - $this->assertEquals (array ('a', 'b', 'c', 'd'), Spyc::YAMLLoad(Spyc::YAMLDump(array('a', 'b', 'c', 'd')))); - } - - public function testABCD2() { - $a = array('a', 'b', 'c', 'd'); // Create a simple list - $b = Spyc::YAMLDump($a); // Dump the list as YAML - $c = Spyc::YAMLLoad($b); // Load the dumped YAML - $d = Spyc::YAMLDump($c); // Re-dump the data - $this->assertSame($b, $d); - } - -} \ No newline at end of file diff --git a/vendors/spyc/tests/failing1.yaml b/vendors/spyc/tests/failing1.yaml deleted file mode 100644 index 6906a51..0000000 --- a/vendors/spyc/tests/failing1.yaml +++ /dev/null @@ -1,2 +0,0 @@ -MyObject: - Prop1: {key1:val1} \ No newline at end of file diff --git a/vendors/spyc/tests/indent_1.yaml b/vendors/spyc/tests/indent_1.yaml deleted file mode 100644 index 85a0b59..0000000 --- a/vendors/spyc/tests/indent_1.yaml +++ /dev/null @@ -1,59 +0,0 @@ -root: - child_1: 2 - - child_2: 0 - child_3: 1 - -root2: - child_1: 1 -# A comment - child_2: 2 - -displays: - - resolutions: - 1024: 768 - - resolutions: - 1920: 1200 - -display: - - resolutions: - 1024: 768 - 1920: 1200 - producer: "Nec" - -nested_hashes_and_seqs: - - { row: 0, col: 0, headsets_affected: [{ports: [0], side: left}], switch_function: {ics_ptt: true} } - -easier_nest: { h: [{a: b, a1: b1}, {c: d}] } - -one_space: | - By four - spaces - -steps: - - step: &id001 - instrument: Lasik 2000 - pulseEnergy: 5.4 - pulseDuration: 12 - repetition: 1000 - spotSize: 1mm - - step: - <<: *id001 - spotSize: 2mm - -death masks are: - sad: 2 - <<: {magnificent: 4} - -login: &login - adapter: mysql - host: localhost - -development: - database: rails_dev - <<: *login - -"key": "value:" -colon_only: ":" - -list_and_comment: [one, two, three] # comment \ No newline at end of file diff --git a/vendors/spyc/tests/quotes.yaml b/vendors/spyc/tests/quotes.yaml deleted file mode 100644 index 2ceea86..0000000 --- a/vendors/spyc/tests/quotes.yaml +++ /dev/null @@ -1,8 +0,0 @@ -html_tags: - -
- -

-html_content: - -

hello world

- - hello
world -text_content: - - hello world \ No newline at end of file From 19918e1d0cd5376563fe546e4bfcc232760b0727 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Fri, 28 Jun 2013 13:05:19 -0400 Subject: [PATCH 08/73] update to composer file forgot to set the homepage to hitsend. --- hitsend/formatter/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hitsend/formatter/composer.json b/hitsend/formatter/composer.json index 9159e9c..08490b9 100644 --- a/hitsend/formatter/composer.json +++ b/hitsend/formatter/composer.json @@ -3,7 +3,7 @@ "type": "library", "description": "Port of Daniel Berry's Formatter Bundle for Laravel 3, to Laravel 4 using the Composer Package management", "keywords": ["laravel", "formatter"], - "homepage": "http://github.com/grahammccarthy/laravel-formatter", + "homepage": "http://github.com/hitsend/laravel-formatter", "license": "MIT", "authors": [ { From ce5156a715101e0662ee9f0c712c4bca70d46323 Mon Sep 17 00:00:00 2001 From: Graham Date: Fri, 20 Sep 2013 07:45:30 -0400 Subject: [PATCH 09/73] updated to put on packagist.org --- hitsend/formatter/.gitignore => .gitignore | 0 hitsend/formatter/.travis.yml => .travis.yml | 0 hitsend/formatter/composer.json => composer.json | 0 hitsend/.DS_Store | Bin 6148 -> 0 bytes hitsend/formatter/phpunit.xml => phpunit.xml | 0 .../Hitsend/Formatter/Facades/Formatter.php | 0 .../src => src}/Hitsend/Formatter/Formatter.php | 0 .../Formatter/FormatterServiceProvider.php | 0 {hitsend/formatter/src => src}/config/.gitkeep | 0 {hitsend/formatter/src => src}/config/config.php | 0 {hitsend/formatter/src => src}/lang/.gitkeep | 0 .../formatter/src => src}/lang/en/formatter.php | 0 {hitsend/formatter/tests => tests}/.gitkeep | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename hitsend/formatter/.gitignore => .gitignore (100%) rename hitsend/formatter/.travis.yml => .travis.yml (100%) rename hitsend/formatter/composer.json => composer.json (100%) delete mode 100644 hitsend/.DS_Store rename hitsend/formatter/phpunit.xml => phpunit.xml (100%) rename {hitsend/formatter/src => src}/Hitsend/Formatter/Facades/Formatter.php (100%) rename {hitsend/formatter/src => src}/Hitsend/Formatter/Formatter.php (100%) rename {hitsend/formatter/src => src}/Hitsend/Formatter/FormatterServiceProvider.php (100%) rename {hitsend/formatter/src => src}/config/.gitkeep (100%) rename {hitsend/formatter/src => src}/config/config.php (100%) rename {hitsend/formatter/src => src}/lang/.gitkeep (100%) rename {hitsend/formatter/src => src}/lang/en/formatter.php (100%) rename {hitsend/formatter/tests => tests}/.gitkeep (100%) diff --git a/hitsend/formatter/.gitignore b/.gitignore similarity index 100% rename from hitsend/formatter/.gitignore rename to .gitignore diff --git a/hitsend/formatter/.travis.yml b/.travis.yml similarity index 100% rename from hitsend/formatter/.travis.yml rename to .travis.yml diff --git a/hitsend/formatter/composer.json b/composer.json similarity index 100% rename from hitsend/formatter/composer.json rename to composer.json diff --git a/hitsend/.DS_Store b/hitsend/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Fri, 20 Sep 2013 07:46:56 -0400 Subject: [PATCH 10/73] renaming project --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 08490b9..98d6c01 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "hitsend/formatter", + "name": "hitsend/laravel-formatter", "type": "library", "description": "Port of Daniel Berry's Formatter Bundle for Laravel 3, to Laravel 4 using the Composer Package management", "keywords": ["laravel", "formatter"], @@ -19,7 +19,7 @@ "autoload": { "psr-0": { "Spyc": "vendor/spyc/", - "Hitsend\\Formatter": "src/" + "Formatter": "src/" } }, "minimum-stability": "dev" From 00270382c207753361ef5a24e985bf5e8d4ccb83 Mon Sep 17 00:00:00 2001 From: Graham Date: Fri, 20 Sep 2013 07:47:13 -0400 Subject: [PATCH 11/73] asdf --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 98d6c01..db1018d 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "autoload": { "psr-0": { "Spyc": "vendor/spyc/", - "Formatter": "src/" + "Hitsend\\Formatter": "src/" } }, "minimum-stability": "dev" From de40f7c5fc6ea008b615d3ec4f2b3df5ad0688b0 Mon Sep 17 00:00:00 2001 From: Graham Date: Fri, 20 Sep 2013 07:49:09 -0400 Subject: [PATCH 12/73] remove DS_Stores! --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2c1fc0c..5826402 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /vendor composer.phar composer.lock -.DS_Store \ No newline at end of file +.DS_Store From a0e5602d18b498c73d77277a8b2f513e273cf338 Mon Sep 17 00:00:00 2001 From: Graham Date: Fri, 20 Sep 2013 08:22:42 -0400 Subject: [PATCH 13/73] moving spyc into src instead of as part of vendor suite. --- composer.json | 2 +- src/spyc/COPYING | 21 + src/spyc/README | 159 +++++ src/spyc/examples/yaml-dump.php | 25 + src/spyc/examples/yaml-load.php | 21 + src/spyc/php4/5to4.php | 17 + src/spyc/php4/spyc.php4 | 1023 +++++++++++++++++++++++++++++ src/spyc/php4/test.php4 | 162 +++++ src/spyc/spyc.php | 1046 ++++++++++++++++++++++++++++++ src/spyc/spyc.yaml | 203 ++++++ src/spyc/tests/DumpTest.php | 130 ++++ src/spyc/tests/IndentTest.php | 65 ++ src/spyc/tests/ParseTest.php | 322 +++++++++ src/spyc/tests/RoundTripTest.php | 61 ++ src/spyc/tests/failing1.yaml | 2 + src/spyc/tests/indent_1.yaml | 59 ++ src/spyc/tests/quotes.yaml | 8 + 17 files changed, 3325 insertions(+), 1 deletion(-) create mode 100644 src/spyc/COPYING create mode 100644 src/spyc/README create mode 100644 src/spyc/examples/yaml-dump.php create mode 100644 src/spyc/examples/yaml-load.php create mode 100644 src/spyc/php4/5to4.php create mode 100644 src/spyc/php4/spyc.php4 create mode 100644 src/spyc/php4/test.php4 create mode 100644 src/spyc/spyc.php create mode 100644 src/spyc/spyc.yaml create mode 100644 src/spyc/tests/DumpTest.php create mode 100644 src/spyc/tests/IndentTest.php create mode 100644 src/spyc/tests/ParseTest.php create mode 100644 src/spyc/tests/RoundTripTest.php create mode 100644 src/spyc/tests/failing1.yaml create mode 100644 src/spyc/tests/indent_1.yaml create mode 100644 src/spyc/tests/quotes.yaml diff --git a/composer.json b/composer.json index db1018d..c68df58 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ }, "autoload": { "psr-0": { - "Spyc": "vendor/spyc/", + "Spyc": "src/spyc/", "Hitsend\\Formatter": "src/" } }, diff --git a/src/spyc/COPYING b/src/spyc/COPYING new file mode 100644 index 0000000..8e7ddbc --- /dev/null +++ b/src/spyc/COPYING @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011 Vladimir Andersen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/src/spyc/README b/src/spyc/README new file mode 100644 index 0000000..4d77166 --- /dev/null +++ b/src/spyc/README @@ -0,0 +1,159 @@ +# +# S P Y C +# a simple php yaml class +# +# Load this README! +# >> $readme = Spyc::YAMLLoad('README'); +# +--- %YAML:1.1 +title: Spyc -- a Simple PHP YAML Class +version: 0.5 +authors: [chris wanstrath (chris@ozmm.org), vlad andersen (vlad.andersen@gmail.com)] +websites: [http://www.yaml.org, http://spyc.sourceforge.net] +license: [MIT License, http://www.opensource.org/licenses/mit-license.php] +copyright: "(c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen" +tested on: [php 5.2.x] + +installation: > + Copy spyc.php to a directory you can + access with your YAML-ready PHP script. + + That's it! + +about: > + From www.yaml.org: + + "YAML(tm) (rhymes with 'camel') is a human-friendly, cross language, + Unicode based data serialization language designed around the common + native data structures of agile programming languages. It is broadly + useful for programming needs ranging from configuration files to + Internet messaging to object persistence to data auditing. Together + with the Unicode standard for characters, the YAML specification provides + all the information necessary to understand YAML Version 1.1 and to + creating programs that process YAML information. + + YAML(tm) is a balance of the following design goals: + - YAML documents are very readable by humans. + - YAML interacts well with scripting languages. + - YAML uses host languages' native data structures. + - YAML has a consistent information model. + - YAML enables stream-based processing. + - YAML is expressive and extensible. + - YAML is easy to implement." + + YAML makes a lot of sense. It's easy to use, easy to learn, and cool. + As the lucky stiff named why once said, "YAML is a beacon of light." + + If you're new to YAML, may we suggest YAML In Five Minutes: + - http://yaml.kwiki.org/?YamlInFiveMinutes + + If you don't have five minutes, realize that this README is a completely + valid YAML document. Dig in, load this or any YAML file into an array + with Spyc and see how easy it is to translate friendly text into usable + data. + + The purpose of Spyc is to provide a pure PHP alternative to Syck, a + simple API for loading and dumping YAML documents, a YAML loader which + understands a usable subset of the YAML spec, and to further spread + the glory of YAML to the PHP masses. + + If you're at all hesitant ("usable subset of YAML?!"), navigate + http://yaml.org/start.html. Spyc completely understands the YAML + document shown there, a document which has features way beyond the + scope of what normal config files might require. Try it for yourself, + and then start enjoying the peace of mind YAML brings to your life. + +meat and a few potatoes: + - concept: Loading a YAML document into PHP + brief: > + $yaml will become an array of all the data in wicked.yaml + code: | + + include('spyc.php'); + + $yaml = Spyc::YAMLLoad('wicked.yaml'); + + - concept: Loading a YAML string into PHP + brief: > + $array will look like this: + array('A YAML','document in a','string') + code: | + + include('spyc.php'); + + $yaml = '- A YAML\n- document in a\n- string.'; + $array = Spyc::YAMLLoad($yaml); + + - concept: Dumping a PHP array to YAML + brief: > + $yaml will become a string of a YAML document created from + $array. + code: | + + include('spyc.php'); + + $array['name'] = 'chris'; + $array['sport'] = 'curbing'; + + $yaml = Spyc::YAMLDump($array); + +prior art: + - who: [Brian Ingerson, Clark Evans, Oren Ben-Kiki] + why?: > + The YAML spec is really a piece of work, and these guys + did a great job on it. A simple and elegant language like + YAML was a long time coming and it's refreshing to know + such able minded individuals took the task to heart and + executed it with cunning and strength. In addition to + their various noteworthy contributions to YAML parsers + and related projects, YAML.pm's README is a treasure trove + of information for knowledge seekers. Thanks, guys. + + - who: why the lucky stiff + why?: > + As the author of Syck, the code used in Ruby for the language's + YAML class and methods, why is indirectly (directly?) responsible + for my first exposure to YAML (as a config file in a Ruby web-app) + and the countless hours I spent playing with this sheik new data + format afterwards. Syck's README is a YAML file and thus the + inspiration for this file and, even, this very piece of software. + + - who: Steve Howell + why?: > + Python's YAML implementation. PyYAML's README file is also YAML, + so it too inspired the YAML format of this README file. + + - who: [Rasmus Lerdorf, Zeev Suraski, Andi Gutmans, et al] + why?: > + PHP is great at what it does best. It's also paid a lot of my bills. + Thanks. + +bugs: + report: > + Please see Spyc's Sourceforge project page for information on reporting bugs. + speed: > + This implementation was not designed for speed. Rather, it + was designed for those who need a pure PHP implementation of + a YAML parser and who are not overly concerned with performance. + If you want speed, check out Syck. + depth: > + This parser is by no means a comprehensive YAML parser. For supported + features and future plans, check the website. + unicode: > + YAML is supposed to be unicode, but for now we're just using ASCII. + PHP has crappy unicode support but who knows what the future holds. + +resources: + - http://www.yaml.org + - http://www.yaml.org/spec/ + - http://yaml.kwiki.org/?YamlInFiveMinutes + - http://www.whytheluckystiff.net/syck/ + - http://yaml4r.sourceforge.net/cookbook/ + +thanks: + - Adam Wood + - Daniel Ferreira + - Aaron Jensen + - Mike Thornton + - Fabien Potencier + - Mustafa Kumas \ No newline at end of file diff --git a/src/spyc/examples/yaml-dump.php b/src/spyc/examples/yaml-dump.php new file mode 100644 index 0000000..05a8a2f --- /dev/null +++ b/src/spyc/examples/yaml-dump.php @@ -0,0 +1,25 @@ + 'A sequence','second' => 'of mapped values'); +$array['Mapped'] = array('A sequence','which is mapped'); +$array['A Note'] = 'What if your text is too long?'; +$array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; +$array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; +$array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; +$array['key:withcolon'] = "Should support this to"; + +$yaml = Spyc::YAMLDump($array,4,60); \ No newline at end of file diff --git a/src/spyc/examples/yaml-load.php b/src/spyc/examples/yaml-load.php new file mode 100644 index 0000000..fba9571 --- /dev/null +++ b/src/spyc/examples/yaml-load.php @@ -0,0 +1,21 @@ +spyc.yaml loaded into PHP:
'; +print_r($array); +echo ''; + + +echo '
YAML Data dumped back:
'; +echo Spyc::YAMLDump($array); +echo '
'; diff --git a/src/spyc/php4/5to4.php b/src/spyc/php4/5to4.php new file mode 100644 index 0000000..5a48694 --- /dev/null +++ b/src/spyc/php4/5to4.php @@ -0,0 +1,17 @@ +', $code); + $f = fopen ($dest, 'w'); + fwrite($f, $code); + fclose ($f); + print "Written to $dest.\n"; +} \ No newline at end of file diff --git a/src/spyc/php4/spyc.php4 b/src/spyc/php4/spyc.php4 new file mode 100644 index 0000000..73f08cc --- /dev/null +++ b/src/spyc/php4/spyc.php4 @@ -0,0 +1,1023 @@ + + * @author Chris Wanstrath + * @link http://code.google.com/p/spyc/ + * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2009 Vlad Andersen + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @package Spyc + */ + +if (!function_exists('spyc_load')) { + /** + * Parses YAML to array. + * @param string $string YAML string. + * @return array + */ + function spyc_load ($string) { + return Spyc::YAMLLoadString($string); + } +} + +if (!function_exists('spyc_load_file')) { + /** + * Parses YAML to array. + * @param string $file Path to YAML file. + * @return array + */ + function spyc_load_file ($file) { + return Spyc::YAMLLoad($file); + } +} + +/** + * The Simple PHP YAML Class. + * + * This class can be used to read a YAML file and convert its contents + * into a PHP array. It currently supports a very limited subsection of + * the YAML spec. + * + * Usage: + * + * $Spyc = new Spyc; + * $array = $Spyc->load($file); + * + * or: + * + * $array = Spyc::YAMLLoad($file); + * + * or: + * + * $array = spyc_load_file($file); + * + * @package Spyc + */ +class Spyc { + + // SETTINGS + + /** + * Setting this to true will force YAMLDump to enclose any string value in + * quotes. False by default. + * + * @var bool + */ + var $setting_dump_force_quotes = false; + + /** + * Setting this to true will forse YAMLLoad to use syck_load function when + * possible. False by default. + * @var bool + */ + var $setting_use_syck_is_possible = false; + + + + /**#@+ + * @access private + * @var mixed + */ + var $_dumpIndent; + var $_dumpWordWrap; + var $_containsGroupAnchor = false; + var $_containsGroupAlias = false; + var $path; + var $result; + var $LiteralPlaceHolder = '___YAML_Literal_Block___'; + var $SavedGroups = array(); + var $indent; + /** + * Path modifier that should be applied after adding current element. + * @var array + */ + var $delayedPath = array(); + + /**#@+ + * @access public + * @var mixed + */ + var $_nodeId; + +/** + * Load a valid YAML string to Spyc. + * @param string $input + * @return array + */ + function load ($input) { + return $this->__loadString($input); + } + + /** + * Load a valid YAML file to Spyc. + * @param string $file + * @return array + */ + function loadFile ($file) { + return $this->__load($file); + } + + /** + * Load YAML into a PHP array statically + * + * The load method, when supplied with a YAML stream (string or file), + * will do its best to convert YAML in a file into a PHP array. Pretty + * simple. + * Usage: + * + * $array = Spyc::YAMLLoad('lucky.yaml'); + * print_r($array); + * + * @access public + * @return array + * @param string $input Path of YAML file or string containing YAML + */ + function YAMLLoad($input) { + $Spyc = new Spyc; + return $Spyc->__load($input); + } + + /** + * Load a string of YAML into a PHP array statically + * + * The load method, when supplied with a YAML string, will do its best + * to convert YAML in a string into a PHP array. Pretty simple. + * + * Note: use this function if you don't want files from the file system + * loaded and processed as YAML. This is of interest to people concerned + * about security whose input is from a string. + * + * Usage: + * + * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); + * print_r($array); + * + * @access public + * @return array + * @param string $input String containing YAML + */ + function YAMLLoadString($input) { + $Spyc = new Spyc; + return $Spyc->__loadString($input); + } + + /** + * Dump YAML from PHP array statically + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as nothing.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + */ + function YAMLDump($array,$indent = false,$wordwrap = false) { + $spyc = new Spyc; + return $spyc->dump($array,$indent,$wordwrap); + } + + + /** + * Dump PHP array to YAML + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as tasteful.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + */ + function dump($array,$indent = false,$wordwrap = false) { + // Dumps to some very clean YAML. We'll have to add some more features + // and options soon. And better support for folding. + + // New features and options. + if ($indent === false or !is_numeric($indent)) { + $this->_dumpIndent = 2; + } else { + $this->_dumpIndent = $indent; + } + + if ($wordwrap === false or !is_numeric($wordwrap)) { + $this->_dumpWordWrap = 40; + } else { + $this->_dumpWordWrap = $wordwrap; + } + + // New YAML document + $string = "---\n"; + + // Start at the base of the array and move through it. + if ($array) { + $array = (array)$array; + $first_key = key($array); + + $previous_key = -1; + foreach ($array as $key => $value) { + $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key); + $previous_key = $key; + } + } + return $string; + } + + /** + * Attempts to convert a key / value array item to YAML + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0) { + if (is_array($value)) { + if (empty ($value)) + return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key); + // It has children. What to do? + // Make it the right kind of item + $string = $this->_dumpNode($key, NULL, $indent, $previous_key, $first_key); + // Add the indent + $indent += $this->_dumpIndent; + // Yamlize the array + $string .= $this->_yamlizeArray($value,$indent); + } elseif (!is_array($value)) { + // It doesn't have children. Yip. + $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key); + } + return $string; + } + + /** + * Attempts to convert an array to YAML + * @access private + * @return string + * @param $array The array you want to convert + * @param $indent The indent of the current level + */ + function _yamlizeArray($array,$indent) { + if (is_array($array)) { + $string = ''; + $previous_key = -1; + $first_key = key($array); + foreach ($array as $key => $value) { + $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key); + $previous_key = $key; + } + return $string; + } else { + return false; + } + } + + /** + * Returns YAML from a key and a value + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0) { + // do some folding here, for blocks + if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || + strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || + strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || substr ($value, -1, 1) == ':')) { + $value = $this->_doLiteralBlock($value,$indent); + } else { + $value = $this->_doFolding($value,$indent); + if (is_bool($value)) { + $value = ($value) ? "true" : "false"; + } + } + + if ($value === array()) $value = '[ ]'; + + $spaces = str_repeat(' ',$indent); + + if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { + // It's a sequence + $string = $spaces.'- '.$value."\n"; + } else { + if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); + // It's mapped + if (strpos($key, ":") !== false) { $key = '"' . $key . '"'; } + $string = $spaces.$key.': '.$value."\n"; + } + return $string; + } + + /** + * Creates a literal block for dumping + * @access private + * @return string + * @param $value + * @param $indent int The value of the indent + */ + function _doLiteralBlock($value,$indent) { + if (strpos($value, "\n") === false && strpos($value, "'") === false) { + return sprintf ("'%s'", $value); + } + if (strpos($value, "\n") === false && strpos($value, '"') === false) { + return sprintf ('"%s"', $value); + } + $exploded = explode("\n",$value); + $newValue = '|'; + $indent += $this->_dumpIndent; + $spaces = str_repeat(' ',$indent); + foreach ($exploded as $line) { + $newValue .= "\n" . $spaces . trim($line); + } + return $newValue; + } + + /** + * Folds a string of text, if necessary + * @access private + * @return string + * @param $value The string you wish to fold + */ + function _doFolding($value,$indent) { + // Don't do anything if wordwrap is set to 0 + + if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { + $indent += $this->_dumpIndent; + $indent = str_repeat(' ',$indent); + $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); + $value = ">\n".$indent.$wrapped; + } else { + if ($this->setting_dump_force_quotes && is_string ($value)) + $value = '"' . $value . '"'; + } + + + return $value; + } + +// LOADING FUNCTIONS + + function __load($input) { + $Source = $this->loadFromSource($input); + return $this->loadWithSource($Source); + } + + function __loadString($input) { + $Source = $this->loadFromString($input); + return $this->loadWithSource($Source); + } + + function loadWithSource($Source) { + if (empty ($Source)) return array(); + if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { + $array = syck_load (implode ('', $Source)); + return is_array($array) ? $array : array(); + } + + $this->path = array(); + $this->result = array(); + + $cnt = count($Source); + for ($i = 0; $i < $cnt; $i++) { + $line = $Source[$i]; + + $this->indent = strlen($line) - strlen(ltrim($line)); + $tempPath = $this->getParentPathByIndent($this->indent); + $line = $this->stripIndent($line, $this->indent); + if ($this->isComment($line)) continue; + if ($this->isEmpty($line)) continue; + $this->path = $tempPath; + + $literalBlockStyle = $this->startsLiteralBlock($line); + if ($literalBlockStyle) { + $line = rtrim ($line, $literalBlockStyle . " \n"); + $literalBlock = ''; + $line .= $this->LiteralPlaceHolder; + + while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { + $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle); + } + $i--; + } + + while (++$i < $cnt && $this->greedilyNeedNextLine($line)) { + $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); + } + $i--; + + + + if (strpos ($line, '#')) { + if (strpos ($line, '"') === false && strpos ($line, "'") === false) + $line = preg_replace('/\s+#(.+)$/','',$line); + } + + $lineArray = $this->_parseLine($line); + + if ($literalBlockStyle) + $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); + + $this->addArray($lineArray, $this->indent); + + foreach ($this->delayedPath as $indent => $delayedPath) + $this->path[$indent] = $delayedPath; + + $this->delayedPath = array(); + + } + return $this->result; + } + + function loadFromSource ($input) { + if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) + return file($input); + + return $this->loadFromString($input); + } + + function loadFromString ($input) { + $lines = explode("\n",$input); + foreach ($lines as $k => $_) { + $lines[$k] = rtrim ($_, "\r"); + } + return $lines; + } + + /** + * Parses YAML code and returns an array for a node + * @access private + * @return array + * @param string $line A line from the YAML file + */ + function _parseLine($line) { + if (!$line) return array(); + $line = trim($line); + + if (!$line) return array(); + $array = array(); + + $group = $this->nodeContainsGroup($line); + if ($group) { + $this->addGroup($line, $group); + $line = $this->stripGroup ($line, $group); + } + + if ($this->startsMappedSequence($line)) + return $this->returnMappedSequence($line); + + if ($this->startsMappedValue($line)) + return $this->returnMappedValue($line); + + if ($this->isArrayElement($line)) + return $this->returnArrayElement($line); + + if ($this->isPlainArray($line)) + return $this->returnPlainArray($line); + + + return $this->returnKeyValuePair($line); + + } + + /** + * Finds the type of the passed value, returns the value as the new type. + * @access private + * @param string $value + * @return mixed + */ + function _toType($value) { + if ($value === '') return null; + $first_character = $value[0]; + $last_character = substr($value, -1, 1); + + $is_quoted = false; + do { + if (!$value) break; + if ($first_character != '"' && $first_character != "'") break; + if ($last_character != '"' && $last_character != "'") break; + $is_quoted = true; + } while (0); + + if ($is_quoted) + return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); + + if (strpos($value, ' #') !== false) + $value = preg_replace('/\s+#(.+)$/','',$value); + + if ($first_character == '[' && $last_character == ']') { + // Take out strings sequences and mappings + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $value = array(); + foreach ($explode as $v) { + $value[] = $this->_toType($v); + } + return $value; + } + + if (strpos($value,': ')!==false && $first_character != '{') { + $array = explode(': ',$value); + $key = trim($array[0]); + array_shift($array); + $value = trim(implode(': ',$array)); + $value = $this->_toType($value); + return array($key => $value); + } + + if ($first_character == '{' && $last_character == '}') { + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + // Inline Mapping + // Take out strings sequences and mappings + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $array = array(); + foreach ($explode as $v) { + $SubArr = $this->_toType($v); + if (empty($SubArr)) continue; + if (is_array ($SubArr)) { + $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; + } + $array[] = $SubArr; + } + return $array; + } + + if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { + return null; + } + + if (intval($first_character) > 0 && preg_match ('/^[1-9]+[0-9]*$/', $value)) { + $intvalue = (int)$value; + if ($intvalue != PHP_INT_MAX) + $value = $intvalue; + return $value; + } + + if (in_array($value, + array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { + return true; + } + + if (in_array(strtolower($value), + array('false', 'off', '-', 'no', 'n'))) { + return false; + } + + if (is_numeric($value)) { + if ($value === '0') return 0; + if (trim ($value, 0) === $value) + $value = (float)$value; + return $value; + } + + return $value; + } + + /** + * Used in inlines to check for more inlines or quoted strings + * @access private + * @return array + */ + function _inlineEscape($inline) { + // There's gotta be a cleaner way to do this... + // While pure sequences seem to be nesting just fine, + // pure mappings and mappings with sequences inside can't go very + // deep. This needs to be fixed. + + $seqs = array(); + $maps = array(); + $saved_strings = array(); + + // Check for strings + $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; + if (preg_match_all($regex,$inline,$strings)) { + $saved_strings = $strings[0]; + $inline = preg_replace($regex,'YAMLString',$inline); + } + unset($regex); + + $i = 0; + do { + + // Check for sequences + while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { + $seqs[] = $matchseqs[0]; + $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); + } + + // Check for mappings + while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { + $maps[] = $matchmaps[0]; + $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); + } + + if ($i++ >= 10) break; + + } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); + + $explode = explode(', ',$inline); + $stringi = 0; $i = 0; + + while (1) { + + // Re-add the sequences + if (!empty($seqs)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + foreach ($seqs as $seqk => $seq) { + $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); + $value = $explode[$key]; + } + } + } + } + + // Re-add the mappings + if (!empty($maps)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLMap') !== false) { + foreach ($maps as $mapk => $map) { + $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); + $value = $explode[$key]; + } + } + } + } + + + // Re-add the strings + if (!empty($saved_strings)) { + foreach ($explode as $key => $value) { + while (strpos($value,'YAMLString') !== false) { + $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); + unset($saved_strings[$stringi]); + ++$stringi; + $value = $explode[$key]; + } + } + } + + $finished = true; + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLMap') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLString') !== false) { + $finished = false; break; + } + } + if ($finished) break; + + $i++; + if ($i > 10) + break; // Prevent infinite loops. + } + + return $explode; + } + + function literalBlockContinues ($line, $lineIndent) { + if (!trim($line)) return true; + if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; + return false; + } + + function referenceContentsByAlias ($alias) { + do { + if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } + $groupPath = $this->SavedGroups[$alias]; + $value = $this->result; + foreach ($groupPath as $k) { + $value = $value[$k]; + } + } while (false); + return $value; + } + + function addArrayInline ($array, $indent) { + $CommonGroupPath = $this->path; + if (empty ($array)) return false; + + foreach ($array as $k => $_) { + $this->addArray(array($k => $_), $indent); + $this->path = $CommonGroupPath; + } + return true; + } + + function addArray ($incoming_data, $incoming_indent) { + + // print_r ($incoming_data); + + if (count ($incoming_data) > 1) + return $this->addArrayInline ($incoming_data, $incoming_indent); + + $key = key ($incoming_data); + $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; + if ($key === '__!YAMLZero') $key = '0'; + + if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. + if ($key || $key === '' || $key === '0') { + $this->result[$key] = $value; + } else { + $this->result[] = $value; end ($this->result); $key = key ($this->result); + } + $this->path[$incoming_indent] = $key; + return; + } + + + + $history = array(); + // Unfolding inner array tree. + $history[] = $_arr = $this->result; + foreach ($this->path as $k) { + $history[] = $_arr = $_arr[$k]; + } + + if ($this->_containsGroupAlias) { + $value = $this->referenceContentsByAlias($this->_containsGroupAlias); + $this->_containsGroupAlias = false; + } + + + // Adding string or numeric key to the innermost level or $this->arr. + if (is_string($key) && $key == '<<') { + if (!is_array ($_arr)) { $_arr = array (); } + $_arr = array_merge ($_arr, $value); + } else if ($key || $key === '' || $key === '0') { + $_arr[$key] = $value; + } else { + if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } + else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } + } + + $reverse_path = array_reverse($this->path); + $reverse_history = array_reverse ($history); + $reverse_history[0] = $_arr; + $cnt = count($reverse_history) - 1; + for ($i = 0; $i < $cnt; $i++) { + $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; + } + $this->result = $reverse_history[$cnt]; + + $this->path[$incoming_indent] = $key; + + if ($this->_containsGroupAnchor) { + $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; + if (is_array ($value)) { + $k = key ($value); + if (!is_int ($k)) { + $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; + } + } + $this->_containsGroupAnchor = false; + } + + } + + function startsLiteralBlock ($line) { + $lastChar = substr (trim($line), -1); + if ($lastChar != '>' && $lastChar != '|') return false; + if ($lastChar == '|') return $lastChar; + // HTML tags should not be counted as literal blocks. + if (preg_match ('#<.*?>$#', $line)) return false; + return $lastChar; + } + + function greedilyNeedNextLine($line) { + $line = trim ($line); + if (!strlen($line)) return false; + if (substr ($line, -1, 1) == ']') return false; + if ($line[0] == '[') return true; + if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; + return false; + } + + function addLiteralLine ($literalBlock, $line, $literalBlockStyle) { + $line = $this->stripIndent($line); + $line = rtrim ($line, "\r\n\t ") . "\n"; + if ($literalBlockStyle == '|') { + return $literalBlock . $line; + } + if (strlen($line) == 0) + return rtrim($literalBlock, ' ') . "\n"; + if ($line == "\n" && $literalBlockStyle == '>') { + return rtrim ($literalBlock, " \t") . "\n"; + } + if ($line != "\n") + $line = trim ($line, "\r\n ") . " "; + return $literalBlock . $line; + } + + function revertLiteralPlaceHolder ($lineArray, $literalBlock) { + foreach ($lineArray as $k => $_) { + if (is_array($_)) + $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); + else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) + $lineArray[$k] = rtrim ($literalBlock, " \r\n"); + } + return $lineArray; + } + + function stripIndent ($line, $indent = -1) { + if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); + return substr ($line, $indent); + } + + function getParentPathByIndent ($indent) { + if ($indent == 0) return array(); + $linePath = $this->path; + do { + end($linePath); $lastIndentInParentPath = key($linePath); + if ($indent <= $lastIndentInParentPath) array_pop ($linePath); + } while ($indent <= $lastIndentInParentPath); + return $linePath; + } + + + function clearBiggerPathValues ($indent) { + + + if ($indent == 0) $this->path = array(); + if (empty ($this->path)) return true; + + foreach ($this->path as $k => $_) { + if ($k > $indent) unset ($this->path[$k]); + } + + return true; + } + + + function isComment ($line) { + if (!$line) return false; + if ($line[0] == '#') return true; + if (trim($line, " \r\n\t") == '---') return true; + return false; + } + + function isEmpty ($line) { + return (trim ($line) === ''); + } + + + function isArrayElement ($line) { + if (!$line) return false; + if ($line[0] != '-') return false; + if (strlen ($line) > 3) + if (substr($line,0,3) == '---') return false; + + return true; + } + + function isHashElement ($line) { + return strpos($line, ':'); + } + + function isLiteral ($line) { + if ($this->isArrayElement($line)) return false; + if ($this->isHashElement($line)) return false; + return true; + } + + + function unquote ($value) { + if (!$value) return $value; + if (!is_string($value)) return $value; + if ($value[0] == '\'') return trim ($value, '\''); + if ($value[0] == '"') return trim ($value, '"'); + return $value; + } + + function startsMappedSequence ($line) { + return ($line[0] == '-' && substr ($line, -1, 1) == ':'); + } + + function returnMappedSequence ($line) { + $array = array(); + $key = $this->unquote(trim(substr($line,1,-1))); + $array[$key] = array(); + $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); + return array($array); + } + + function returnMappedValue ($line) { + $array = array(); + $key = $this->unquote (trim(substr($line,0,-1))); + $array[$key] = ''; + return $array; + } + + function startsMappedValue ($line) { + return (substr ($line, -1, 1) == ':'); + } + + function isPlainArray ($line) { + return ($line[0] == '[' && substr ($line, -1, 1) == ']'); + } + + function returnPlainArray ($line) { + return $this->_toType($line); + } + + function returnKeyValuePair ($line) { + $array = array(); + $key = ''; + if (strpos ($line, ':')) { + // It's a key/value pair most likely + // If the key is in double quotes pull it out + if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { + $value = trim(str_replace($matches[1],'',$line)); + $key = $matches[2]; + } else { + // Do some guesswork as to the key and the value + $explode = explode(':',$line); + $key = trim($explode[0]); + array_shift($explode); + $value = trim(implode(':',$explode)); + } + // Set the type of the value. Int, string, etc + $value = $this->_toType($value); + if ($key === '0') $key = '__!YAMLZero'; + $array[$key] = $value; + } else { + $array = array ($line); + } + return $array; + + } + + + function returnArrayElement ($line) { + if (strlen($line) <= 1) return array(array()); // Weird %) + $array = array(); + $value = trim(substr($line,1)); + $value = $this->_toType($value); + $array[] = $value; + return $array; + } + + + function nodeContainsGroup ($line) { + $symbolsForReference = 'A-z0-9_\-'; + if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) + if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; + if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; + if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; + return false; + + } + + function addGroup ($line, $group) { + if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); + if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); + //print_r ($this->path); + } + + function stripGroup ($line, $group) { + $line = trim(str_replace($group, '', $line)); + return $line; + } +} + +// Enable use of Spyc from command line +// The syntax is the following: php spyc.php spyc.yaml + +define ('SPYC_FROM_COMMAND_LINE', false); + +do { + if (!SPYC_FROM_COMMAND_LINE) break; + if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; + if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; + $file = $argv[1]; + printf ("Spyc loading file: %s\n", $file); + print_r (spyc_load_file ($file)); +} while (0); \ No newline at end of file diff --git a/src/spyc/php4/test.php4 b/src/spyc/php4/test.php4 new file mode 100644 index 0000000..315f501 --- /dev/null +++ b/src/spyc/php4/test.php4 @@ -0,0 +1,162 @@ + "1.5ghz", "ram" => "1 gig", + "os" => "os x 10.4.1")) + die('Sequence 4 failed'); + +# Mapped sequence +if ($yaml['domains'] != array("yaml.org", "php.net")) + die("Key: 'domains' failed"); + +# A sequence like this. +if ($yaml[5] != array("program" => "Adium", "platform" => "OS X", + "type" => "Chat Client")) + die('Sequence 5 failed'); + +# A folded block as a mapped value +if ($yaml['no time'] != "There isn't any time for your tricks!\nDo you understand?") + die("Key: 'no time' failed"); + +# A literal block as a mapped value +if ($yaml['some time'] != "There is nothing but time\nfor your tricks.") + die("Key: 'some time' failed"); + +# Crazy combinations +if ($yaml['databases'] != array( array("name" => "spartan", "notes" => + array( "Needs to be backed up", + "Needs to be normalized" ), + "type" => "mysql" ))) + die("Key: 'databases' failed"); + +# You can be a bit tricky +if ($yaml["if: you'd"] != "like") + die("Key: 'if: you\'d' failed"); + +# Inline sequences +if ($yaml[6] != array("One", "Two", "Three", "Four")) + die("Sequence 6 failed"); + +# Nested Inline Sequences +if ($yaml[7] != array("One", array("Two", "And", "Three"), "Four", "Five")) + die("Sequence 7 failed"); + +# Nested Nested Inline Sequences +if ($yaml[8] != array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), + "Seriously", array("Show", "Mercy"))) + die("Sequence 8 failed"); + +# Inline mappings +if ($yaml[9] != array("name" => "chris", "age" => "young", "brand" => "lucky strike")) + die("Sequence 9 failed"); + +# Nested inline mappings +if ($yaml[10] != array("name" => "mark", "age" => "older than chris", + "brand" => array("marlboro", "lucky strike"))) + die("Sequence 10 failed"); + +# References -- they're shaky, but functional +if ($yaml['dynamic languages'] != array('Perl', 'Python', 'PHP', 'Ruby')) + die("Key: 'dynamic languages' failed"); + +if ($yaml['compiled languages'] != array('C/C++', 'Java')) + die("Key: 'compiled languages' failed"); + +if ($yaml['all languages'] != array( + array('Perl', 'Python', 'PHP', 'Ruby'), + array('C/C++', 'Java') + )) + die("Key: 'all languages' failed"); + +# Added in .2.2: Escaped quotes +if ($yaml[11] != "you know, this shouldn't work. but it does.") + die("Sequence 11 failed."); + +if ($yaml[12] != "that's my value.") + die("Sequence 12 failed."); + +if ($yaml[13] != "again, that's my value.") + die("Sequence 13 failed."); + +if ($yaml[14] != "here's to \"quotes\", boss.") + die("Sequence 14 failed."); + +if ($yaml[15] != array( 'name' => "Foo, Bar's", 'age' => 20)) + die("Sequence 15 failed."); + +if ($yaml[16] != array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b")) + die("Sequence 16 failed."); + +if ($yaml['endloop'] != "Does this line in the end indeed make Spyc go to an infinite loop?") + die("[endloop] failed."); + + +print "spyc.yaml parsed correctly\n"; + +?> \ No newline at end of file diff --git a/src/spyc/spyc.php b/src/spyc/spyc.php new file mode 100644 index 0000000..8b67c82 --- /dev/null +++ b/src/spyc/spyc.php @@ -0,0 +1,1046 @@ + + * @author Chris Wanstrath + * @link http://code.google.com/p/spyc/ + * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @package Spyc + **/ + +if (!function_exists('spyc_load')) { + /** + * Parses YAML to array. + * @param string $string YAML string. + * @return array + */ + function spyc_load ($string) { + return Spyc::YAMLLoadString($string); + } +} + +if (!function_exists('spyc_load_file')) { + /** + * Parses YAML to array. + * @param string $file Path to YAML file. + * @return array + */ + function spyc_load_file ($file) { + return Spyc::YAMLLoad($file); + } +} + +/** +* The Simple PHP YAML Class. +* +* This class can be used to read a YAML file and convert its contents +* into a PHP array. It currently supports a very limited subsection of +* the YAML spec. +* +* Usage: +* +* $Spyc = new Spyc; +* $array = $Spyc->load($file); +* +* or: +* +* $array = Spyc::YAMLLoad($file); +* +* or: +* +* $array = spyc_load_file($file); +* +* @package Spyc +**/ +class Spyc { + + // SETTINGS + + const REMPTY = "\0\0\0\0\0"; + + /** + * Setting this to true will force YAMLDump to enclose any string value in + * quotes. False by default. + * + * @var bool + */ + public $setting_dump_force_quotes = false; + + /** + * Setting this to true will forse YAMLLoad to use syck_load function when + * possible. False by default. + * @var bool + */ + public $setting_use_syck_is_possible = false; + + + + /**#@+ + * @access private + * @var mixed + */ + private $_dumpIndent; + private $_dumpWordWrap; + private $_containsGroupAnchor = false; + private $_containsGroupAlias = false; + private $path; + private $result; + private $LiteralPlaceHolder = '___YAML_Literal_Block___'; + private $SavedGroups = array(); + private $indent; + /** + * Path modifier that should be applied after adding current element. + * @var array + */ + private $delayedPath = array(); + + /**#@+ + * @access public + * @var mixed + */ + public $_nodeId; + +/** + * Load a valid YAML string to Spyc. + * @param string $input + * @return array + */ + public function load ($input) { + return $this->__loadString($input); + } + + /** + * Load a valid YAML file to Spyc. + * @param string $file + * @return array + */ + public function loadFile ($file) { + return $this->__load($file); + } + + /** + * Load YAML into a PHP array statically + * + * The load method, when supplied with a YAML stream (string or file), + * will do its best to convert YAML in a file into a PHP array. Pretty + * simple. + * Usage: + * + * $array = Spyc::YAMLLoad('lucky.yaml'); + * print_r($array); + * + * @access public + * @return array + * @param string $input Path of YAML file or string containing YAML + */ + public static function YAMLLoad($input) { + $Spyc = new Spyc; + return $Spyc->__load($input); + } + + /** + * Load a string of YAML into a PHP array statically + * + * The load method, when supplied with a YAML string, will do its best + * to convert YAML in a string into a PHP array. Pretty simple. + * + * Note: use this function if you don't want files from the file system + * loaded and processed as YAML. This is of interest to people concerned + * about security whose input is from a string. + * + * Usage: + * + * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); + * print_r($array); + * + * @access public + * @return array + * @param string $input String containing YAML + */ + public static function YAMLLoadString($input) { + $Spyc = new Spyc; + return $Spyc->__loadString($input); + } + + /** + * Dump YAML from PHP array statically + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as nothing.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + */ + public static function YAMLDump($array,$indent = false,$wordwrap = false) { + $spyc = new Spyc; + return $spyc->dump($array,$indent,$wordwrap); + } + + + /** + * Dump PHP array to YAML + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as tasteful.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + */ + public function dump($array,$indent = false,$wordwrap = false) { + // Dumps to some very clean YAML. We'll have to add some more features + // and options soon. And better support for folding. + + // New features and options. + if ($indent === false or !is_numeric($indent)) { + $this->_dumpIndent = 2; + } else { + $this->_dumpIndent = $indent; + } + + if ($wordwrap === false or !is_numeric($wordwrap)) { + $this->_dumpWordWrap = 40; + } else { + $this->_dumpWordWrap = $wordwrap; + } + + // New YAML document + $string = "---\n"; + + // Start at the base of the array and move through it. + if ($array) { + $array = (array)$array; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); + $previous_key = $key; + } + } + return $string; + } + + /** + * Attempts to convert a key / value array item to YAML + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { + if (is_array($value)) { + if (empty ($value)) + return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); + // It has children. What to do? + // Make it the right kind of item + $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); + // Add the indent + $indent += $this->_dumpIndent; + // Yamlize the array + $string .= $this->_yamlizeArray($value,$indent); + } elseif (!is_array($value)) { + // It doesn't have children. Yip. + $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); + } + return $string; + } + + /** + * Attempts to convert an array to YAML + * @access private + * @return string + * @param $array The array you want to convert + * @param $indent The indent of the current level + */ + private function _yamlizeArray($array,$indent) { + if (is_array($array)) { + $string = ''; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); + $previous_key = $key; + } + return $string; + } else { + return false; + } + } + + /** + * Returns YAML from a key and a value + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { + // do some folding here, for blocks + if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || + strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, ' ') !== false || + strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || + substr ($value, -1, 1) == ':') + ) { + $value = $this->_doLiteralBlock($value,$indent); + } else { + $value = $this->_doFolding($value,$indent); + } + + if ($value === array()) $value = '[ ]'; + if (in_array ($value, array ('true', 'TRUE', 'false', 'FALSE', 'y', 'Y', 'n', 'N', 'null', 'NULL'), true)) { + $value = $this->_doLiteralBlock($value,$indent); + } + if (trim ($value) != $value) + $value = $this->_doLiteralBlock($value,$indent); + + if (is_bool($value)) { + $value = ($value) ? "true" : "false"; + } + + if ($value === null) $value = 'null'; + if ($value === "'" . self::REMPTY . "'") $value = null; + + $spaces = str_repeat(' ',$indent); + + //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { + if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { + // It's a sequence + $string = $spaces.'- '.$value."\n"; + } else { + // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); + // It's mapped + if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } + $string = rtrim ($spaces.$key.': '.$value)."\n"; + } + return $string; + } + + /** + * Creates a literal block for dumping + * @access private + * @return string + * @param $value + * @param $indent int The value of the indent + */ + private function _doLiteralBlock($value,$indent) { + if ($value === "\n") return '\n'; + if (strpos($value, "\n") === false && strpos($value, "'") === false) { + return sprintf ("'%s'", $value); + } + if (strpos($value, "\n") === false && strpos($value, '"') === false) { + return sprintf ('"%s"', $value); + } + $exploded = explode("\n",$value); + $newValue = '|'; + $indent += $this->_dumpIndent; + $spaces = str_repeat(' ',$indent); + foreach ($exploded as $line) { + $newValue .= "\n" . $spaces . ($line); + } + return $newValue; + } + + /** + * Folds a string of text, if necessary + * @access private + * @return string + * @param $value The string you wish to fold + */ + private function _doFolding($value,$indent) { + // Don't do anything if wordwrap is set to 0 + + if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { + $indent += $this->_dumpIndent; + $indent = str_repeat(' ',$indent); + $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); + $value = ">\n".$indent.$wrapped; + } else { + if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) + $value = '"' . $value . '"'; + } + + + return $value; + } + +// LOADING FUNCTIONS + + private function __load($input) { + $Source = $this->loadFromSource($input); + return $this->loadWithSource($Source); + } + + private function __loadString($input) { + $Source = $this->loadFromString($input); + return $this->loadWithSource($Source); + } + + private function loadWithSource($Source) { + if (empty ($Source)) return array(); + if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { + $array = syck_load (implode ('', $Source)); + return is_array($array) ? $array : array(); + } + + $this->path = array(); + $this->result = array(); + + $cnt = count($Source); + for ($i = 0; $i < $cnt; $i++) { + $line = $Source[$i]; + + $this->indent = strlen($line) - strlen(ltrim($line)); + $tempPath = $this->getParentPathByIndent($this->indent); + $line = self::stripIndent($line, $this->indent); + if (self::isComment($line)) continue; + if (self::isEmpty($line)) continue; + $this->path = $tempPath; + + $literalBlockStyle = self::startsLiteralBlock($line); + if ($literalBlockStyle) { + $line = rtrim ($line, $literalBlockStyle . " \n"); + $literalBlock = ''; + $line .= $this->LiteralPlaceHolder; + $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); + while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { + $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); + } + $i--; + } + + while (++$i < $cnt && self::greedilyNeedNextLine($line)) { + $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); + } + $i--; + + + + if (strpos ($line, '#')) { + if (strpos ($line, '"') === false && strpos ($line, "'") === false) + $line = preg_replace('/\s+#(.+)$/','',$line); + } + + $lineArray = $this->_parseLine($line); + + if ($literalBlockStyle) + $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); + + $this->addArray($lineArray, $this->indent); + + foreach ($this->delayedPath as $indent => $delayedPath) + $this->path[$indent] = $delayedPath; + + $this->delayedPath = array(); + + } + return $this->result; + } + + private function loadFromSource ($input) { + if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) + return file($input); + + return $this->loadFromString($input); + } + + private function loadFromString ($input) { + $lines = explode("\n",$input); + foreach ($lines as $k => $_) { + $lines[$k] = rtrim ($_, "\r"); + } + return $lines; + } + + /** + * Parses YAML code and returns an array for a node + * @access private + * @return array + * @param string $line A line from the YAML file + */ + private function _parseLine($line) { + if (!$line) return array(); + $line = trim($line); + if (!$line) return array(); + + $array = array(); + + $group = $this->nodeContainsGroup($line); + if ($group) { + $this->addGroup($line, $group); + $line = $this->stripGroup ($line, $group); + } + + if ($this->startsMappedSequence($line)) + return $this->returnMappedSequence($line); + + if ($this->startsMappedValue($line)) + return $this->returnMappedValue($line); + + if ($this->isArrayElement($line)) + return $this->returnArrayElement($line); + + if ($this->isPlainArray($line)) + return $this->returnPlainArray($line); + + + return $this->returnKeyValuePair($line); + + } + + /** + * Finds the type of the passed value, returns the value as the new type. + * @access private + * @param string $value + * @return mixed + */ + private function _toType($value) { + if ($value === '') return null; + $first_character = $value[0]; + $last_character = substr($value, -1, 1); + + $is_quoted = false; + do { + if (!$value) break; + if ($first_character != '"' && $first_character != "'") break; + if ($last_character != '"' && $last_character != "'") break; + $is_quoted = true; + } while (0); + + if ($is_quoted) + return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); + + if (strpos($value, ' #') !== false && !$is_quoted) + $value = preg_replace('/\s+#(.+)$/','',$value); + + if (!$is_quoted) $value = str_replace('\n', "\n", $value); + + if ($first_character == '[' && $last_character == ']') { + // Take out strings sequences and mappings + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $value = array(); + foreach ($explode as $v) { + $value[] = $this->_toType($v); + } + return $value; + } + + if (strpos($value,': ')!==false && $first_character != '{') { + $array = explode(': ',$value); + $key = trim($array[0]); + array_shift($array); + $value = trim(implode(': ',$array)); + $value = $this->_toType($value); + return array($key => $value); + } + + if ($first_character == '{' && $last_character == '}') { + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + // Inline Mapping + // Take out strings sequences and mappings + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $array = array(); + foreach ($explode as $v) { + $SubArr = $this->_toType($v); + if (empty($SubArr)) continue; + if (is_array ($SubArr)) { + $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; + } + $array[] = $SubArr; + } + return $array; + } + + if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { + return null; + } + + if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ + $intvalue = (int)$value; + if ($intvalue != PHP_INT_MAX) + $value = $intvalue; + return $value; + } + + if (in_array($value, + array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { + return true; + } + + if (in_array(strtolower($value), + array('false', 'off', '-', 'no', 'n'))) { + return false; + } + + if (is_numeric($value)) { + if ($value === '0') return 0; + if (rtrim ($value, 0) === $value) + $value = (float)$value; + return $value; + } + + return $value; + } + + /** + * Used in inlines to check for more inlines or quoted strings + * @access private + * @return array + */ + private function _inlineEscape($inline) { + // There's gotta be a cleaner way to do this... + // While pure sequences seem to be nesting just fine, + // pure mappings and mappings with sequences inside can't go very + // deep. This needs to be fixed. + + $seqs = array(); + $maps = array(); + $saved_strings = array(); + + // Check for strings + $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; + if (preg_match_all($regex,$inline,$strings)) { + $saved_strings = $strings[0]; + $inline = preg_replace($regex,'YAMLString',$inline); + } + unset($regex); + + $i = 0; + do { + + // Check for sequences + while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { + $seqs[] = $matchseqs[0]; + $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); + } + + // Check for mappings + while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { + $maps[] = $matchmaps[0]; + $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); + } + + if ($i++ >= 10) break; + + } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); + + $explode = explode(', ',$inline); + $stringi = 0; $i = 0; + + while (1) { + + // Re-add the sequences + if (!empty($seqs)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + foreach ($seqs as $seqk => $seq) { + $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); + $value = $explode[$key]; + } + } + } + } + + // Re-add the mappings + if (!empty($maps)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLMap') !== false) { + foreach ($maps as $mapk => $map) { + $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); + $value = $explode[$key]; + } + } + } + } + + + // Re-add the strings + if (!empty($saved_strings)) { + foreach ($explode as $key => $value) { + while (strpos($value,'YAMLString') !== false) { + $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); + unset($saved_strings[$stringi]); + ++$stringi; + $value = $explode[$key]; + } + } + } + + $finished = true; + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLMap') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLString') !== false) { + $finished = false; break; + } + } + if ($finished) break; + + $i++; + if ($i > 10) + break; // Prevent infinite loops. + } + + return $explode; + } + + private function literalBlockContinues ($line, $lineIndent) { + if (!trim($line)) return true; + if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; + return false; + } + + private function referenceContentsByAlias ($alias) { + do { + if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } + $groupPath = $this->SavedGroups[$alias]; + $value = $this->result; + foreach ($groupPath as $k) { + $value = $value[$k]; + } + } while (false); + return $value; + } + + private function addArrayInline ($array, $indent) { + $CommonGroupPath = $this->path; + if (empty ($array)) return false; + + foreach ($array as $k => $_) { + $this->addArray(array($k => $_), $indent); + $this->path = $CommonGroupPath; + } + return true; + } + + private function addArray ($incoming_data, $incoming_indent) { + + // print_r ($incoming_data); + + if (count ($incoming_data) > 1) + return $this->addArrayInline ($incoming_data, $incoming_indent); + + $key = key ($incoming_data); + $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; + if ($key === '__!YAMLZero') $key = '0'; + + if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. + if ($key || $key === '' || $key === '0') { + $this->result[$key] = $value; + } else { + $this->result[] = $value; end ($this->result); $key = key ($this->result); + } + $this->path[$incoming_indent] = $key; + return; + } + + + + $history = array(); + // Unfolding inner array tree. + $history[] = $_arr = $this->result; + foreach ($this->path as $k) { + $history[] = $_arr = $_arr[$k]; + } + + if ($this->_containsGroupAlias) { + $value = $this->referenceContentsByAlias($this->_containsGroupAlias); + $this->_containsGroupAlias = false; + } + + + // Adding string or numeric key to the innermost level or $this->arr. + if (is_string($key) && $key == '<<') { + if (!is_array ($_arr)) { $_arr = array (); } + + $_arr = array_merge ($_arr, $value); + } else if ($key || $key === '' || $key === '0') { + if (!is_array ($_arr)) + $_arr = array ($key=>$value); + else + $_arr[$key] = $value; + } else { + if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } + else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } + } + + $reverse_path = array_reverse($this->path); + $reverse_history = array_reverse ($history); + $reverse_history[0] = $_arr; + $cnt = count($reverse_history) - 1; + for ($i = 0; $i < $cnt; $i++) { + $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; + } + $this->result = $reverse_history[$cnt]; + + $this->path[$incoming_indent] = $key; + + if ($this->_containsGroupAnchor) { + $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; + if (is_array ($value)) { + $k = key ($value); + if (!is_int ($k)) { + $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; + } + } + $this->_containsGroupAnchor = false; + } + + } + + private static function startsLiteralBlock ($line) { + $lastChar = substr (trim($line), -1); + if ($lastChar != '>' && $lastChar != '|') return false; + if ($lastChar == '|') return $lastChar; + // HTML tags should not be counted as literal blocks. + if (preg_match ('#<.*?>$#', $line)) return false; + return $lastChar; + } + + private static function greedilyNeedNextLine($line) { + $line = trim ($line); + if (!strlen($line)) return false; + if (substr ($line, -1, 1) == ']') return false; + if ($line[0] == '[') return true; + if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; + return false; + } + + private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { + $line = self::stripIndent($line, $indent); + if ($literalBlockStyle !== '|') { + $line = self::stripIndent($line); + } + $line = rtrim ($line, "\r\n\t ") . "\n"; + if ($literalBlockStyle == '|') { + return $literalBlock . $line; + } + if (strlen($line) == 0) + return rtrim($literalBlock, ' ') . "\n"; + if ($line == "\n" && $literalBlockStyle == '>') { + return rtrim ($literalBlock, " \t") . "\n"; + } + if ($line != "\n") + $line = trim ($line, "\r\n ") . " "; + return $literalBlock . $line; + } + + function revertLiteralPlaceHolder ($lineArray, $literalBlock) { + foreach ($lineArray as $k => $_) { + if (is_array($_)) + $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); + else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) + $lineArray[$k] = rtrim ($literalBlock, " \r\n"); + } + return $lineArray; + } + + private static function stripIndent ($line, $indent = -1) { + if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); + return substr ($line, $indent); + } + + private function getParentPathByIndent ($indent) { + if ($indent == 0) return array(); + $linePath = $this->path; + do { + end($linePath); $lastIndentInParentPath = key($linePath); + if ($indent <= $lastIndentInParentPath) array_pop ($linePath); + } while ($indent <= $lastIndentInParentPath); + return $linePath; + } + + + private function clearBiggerPathValues ($indent) { + + + if ($indent == 0) $this->path = array(); + if (empty ($this->path)) return true; + + foreach ($this->path as $k => $_) { + if ($k > $indent) unset ($this->path[$k]); + } + + return true; + } + + + private static function isComment ($line) { + if (!$line) return false; + if ($line[0] == '#') return true; + if (trim($line, " \r\n\t") == '---') return true; + return false; + } + + private static function isEmpty ($line) { + return (trim ($line) === ''); + } + + + private function isArrayElement ($line) { + if (!$line) return false; + if ($line[0] != '-') return false; + if (strlen ($line) > 3) + if (substr($line,0,3) == '---') return false; + + return true; + } + + private function isHashElement ($line) { + return strpos($line, ':'); + } + + private function isLiteral ($line) { + if ($this->isArrayElement($line)) return false; + if ($this->isHashElement($line)) return false; + return true; + } + + + private static function unquote ($value) { + if (!$value) return $value; + if (!is_string($value)) return $value; + if ($value[0] == '\'') return trim ($value, '\''); + if ($value[0] == '"') return trim ($value, '"'); + return $value; + } + + private function startsMappedSequence ($line) { + return ($line[0] == '-' && substr ($line, -1, 1) == ':'); + } + + private function returnMappedSequence ($line) { + $array = array(); + $key = self::unquote(trim(substr($line,1,-1))); + $array[$key] = array(); + $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); + return array($array); + } + + private function returnMappedValue ($line) { + $array = array(); + $key = self::unquote (trim(substr($line,0,-1))); + $array[$key] = ''; + return $array; + } + + private function startsMappedValue ($line) { + return (substr ($line, -1, 1) == ':'); + } + + private function isPlainArray ($line) { + return ($line[0] == '[' && substr ($line, -1, 1) == ']'); + } + + private function returnPlainArray ($line) { + return $this->_toType($line); + } + + private function returnKeyValuePair ($line) { + $array = array(); + $key = ''; + if (strpos ($line, ':')) { + // It's a key/value pair most likely + // If the key is in double quotes pull it out + if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { + $value = trim(str_replace($matches[1],'',$line)); + $key = $matches[2]; + } else { + // Do some guesswork as to the key and the value + $explode = explode(':',$line); + $key = trim($explode[0]); + array_shift($explode); + $value = trim(implode(':',$explode)); + } + // Set the type of the value. Int, string, etc + $value = $this->_toType($value); + if ($key === '0') $key = '__!YAMLZero'; + $array[$key] = $value; + } else { + $array = array ($line); + } + return $array; + + } + + + private function returnArrayElement ($line) { + if (strlen($line) <= 1) return array(array()); // Weird %) + $array = array(); + $value = trim(substr($line,1)); + $value = $this->_toType($value); + $array[] = $value; + return $array; + } + + + private function nodeContainsGroup ($line) { + $symbolsForReference = 'A-z0-9_\-'; + if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) + if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; + if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; + if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; + return false; + + } + + private function addGroup ($line, $group) { + if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); + if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); + //print_r ($this->path); + } + + private function stripGroup ($line, $group) { + $line = trim(str_replace($group, '', $line)); + return $line; + } +} + +// Enable use of Spyc from command line +// The syntax is the following: php spyc.php spyc.yaml + +define ('SPYC_FROM_COMMAND_LINE', false); + +do { + if (!SPYC_FROM_COMMAND_LINE) break; + if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; + if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; + $file = $argv[1]; + printf ("Spyc loading file: %s\n", $file); + print_r (spyc_load_file ($file)); +} while (0); \ No newline at end of file diff --git a/src/spyc/spyc.yaml b/src/spyc/spyc.yaml new file mode 100644 index 0000000..930149e --- /dev/null +++ b/src/spyc/spyc.yaml @@ -0,0 +1,203 @@ +# +# S P Y C +# a simple php yaml class +# +# authors: [vlad andersen (vlad.andersen@gmail.com), chris wanstrath (chris@ozmm.org)] +# websites: [http://www.yaml.org, http://spyc.sourceforge.net/] +# license: [MIT License, http://www.opensource.org/licenses/mit-license.php] +# copyright: (c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen +# +# spyc.yml - A file containing the YAML that Spyc understands. + +--- + +# Mappings - with proper types +String: Anyone's name, really. +Int: 13 +True: true +False: false +Zero: 0 +Null: NULL +NotNull: 'null' +NotTrue: 'y' +NotBoolTrue: 'true' +NotInt: '5' +Float: 5.34 +Negative: -90 +SmallFloat: 0.7 +NewLine: \n + +# A sequence +- PHP Class +- Basic YAML Loader +- Very Basic YAML Dumper + +# A sequence of a sequence +- + - YAML is so easy to learn. + - Your config files will never be the same. + +# Sequence of mappings +- + cpu: 1.5ghz + ram: 1 gig + os : os x 10.4.1 + +# Mapped sequence +domains: + - yaml.org + - php.net + +# A sequence like this. +- program: Adium + platform: OS X + type: Chat Client + +# A folded block as a mapped value +no time: > + There isn't any time + for your tricks! + + Do you understand? + +# A literal block as a mapped value +some time: | + There is nothing but time + for your tricks. + +# Crazy combinations +databases: + - name: spartan + notes: + - Needs to be backed up + - Needs to be normalized + type: mysql + +# You can be a bit tricky +"if: you'd": like + +# Inline sequences +- [One, Two, Three, Four] + +# Nested Inline Sequences +- [One, [Two, And, Three], Four, Five] + +# Nested Nested Inline Sequences +- [This, [Is, Getting, [Ridiculous, Guys]], Seriously, [Show, Mercy]] + +# Inline mappings +- {name: chris, age: young, brand: lucky strike} + +# Nested inline mappings +- {name: mark, age: older than chris, brand: [marlboro, lucky strike]} + +# References -- they're shaky, but functional +dynamic languages: &DLANGS + - Perl + - Python + - PHP + - Ruby +compiled languages: &CLANGS + - C/C++ + - Java +all languages: + - *DLANGS + - *CLANGS + +# Added in .2.2: Escaped quotes +- you know, this shouldn't work. but it does. +- 'that''s my value.' +- 'again, that\'s my value.' +- "here's to \"quotes\", boss." + +# added in .2.3 +- {name: "Foo, Bar's", age: 20} + +# Added in .2.4: bug [ 1418193 ] Quote Values in Nested Arrays +- [a, ['1', "2"], b] + +# Added in .2.4: malformed YAML +all + javascripts: [dom1.js, dom.js] + +# Added in .2 +1040: Ooo, a numeric key! # And working comments? Wow! Colons in comments: a menace (0.3). + +hash_1: Hash #and a comment +hash_2: "Hash #and a comment" +"hash#3": "Hash (#) can appear in key too" + +float_test: 1.0 +float_test_with_quotes: '1.0' +float_inverse_test: 001 + +a_really_large_number: 115792089237316195423570985008687907853269984665640564039457584007913129639936 # 2^256 + +int array: [ 1, 2, 3 ] + +array on several lines: + [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ] + +morelesskey: "" + +array_of_zero: [0] +sophisticated_array_of_zero: {rx: {tx: [0]} } + +switches: + - { row: 0, col: 0, func: {tx: [0, 1]} } + +empty_sequence: [ ] +empty_hash: { } + +special_characters: "[{]]{{]]" + +asterisks: "*" + +empty_key: + : + key: value + +trailing_colon: "foo:" + +multiline_items: + - type: SomeItem + values: [blah, blah, blah, + blah] + ints: [2, 54, 12, + 2143] + +many_lines: | + A quick + fox + + + jumped + over + + + + + + a lazy + + + + dog + + +werte: + 1: nummer 1 + 0: Stunde 0 + +noindent_records: +- record1: value1 +- record2: value2 + +"a:1": [1000] +"a:2": + - 2000 + +# [Endloop] +endloop: | + Does this line in the end indeed make Spyc go to an infinite loop? \ No newline at end of file diff --git a/src/spyc/tests/DumpTest.php b/src/spyc/tests/DumpTest.php new file mode 100644 index 0000000..0b9e5fa --- /dev/null +++ b/src/spyc/tests/DumpTest.php @@ -0,0 +1,130 @@ +files_to_test = array ('../spyc.yaml', 'failing1.yaml', 'indent_1.yaml', 'quotes.yaml'); + } + + public function testDump() { + foreach ($this->files_to_test as $file) { + $yaml = spyc_load(file_get_contents($file)); + $dump = Spyc::YAMLDump ($yaml); + $yaml_after_dump = Spyc::YAMLLoad ($dump); + $this->assertEquals ($yaml, $yaml_after_dump); + } + } + + public function testDumpWithQuotes() { + $Spyc = new Spyc(); + $Spyc->setting_dump_force_quotes = true; + foreach ($this->files_to_test as $file) { + $yaml = $Spyc->load(file_get_contents($file)); + $dump = $Spyc->dump ($yaml); + $yaml_after_dump = Spyc::YAMLLoad ($dump); + $this->assertEquals ($yaml, $yaml_after_dump); + } + } + + public function testDumpArrays() { + $dump = Spyc::YAMLDump(array ('item1', 'item2', 'item3')); + $awaiting = "---\n- item1\n- item2\n- item3\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testNull() { + $dump = Spyc::YAMLDump(array('a' => 1, 'b' => null, 'c' => 3)); + $awaiting = "---\na: 1\nb: null\nc: 3\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testNext() { + $array = array("aaa", "bbb", "ccc"); + #set arrays internal pointer to next element + next($array); + $dump = Spyc::YAMLDump($array); + $awaiting = "---\n- aaa\n- bbb\n- ccc\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpingMixedArrays() { + $array = array(); + $array[] = 'Sequence item'; + $array['The Key'] = 'Mapped value'; + $array[] = array('A sequence','of a sequence'); + $array[] = array('first' => 'A sequence','second' => 'of mapped values'); + $array['Mapped'] = array('A sequence','which is mapped'); + $array['A Note'] = 'What if your text is too long?'; + $array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; + $array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; + $array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; + $array['key:withcolon'] = "Should support this to"; + + $yaml = Spyc::YAMLDump($array,4,60); + } + + public function testMixed() { + $dump = Spyc::YAMLDump(array(0 => 1, 'b' => 2, 1 => 3)); + $awaiting = "---\n0: 1\nb: 2\n1: 3\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpNumerics() { + $dump = Spyc::YAMLDump(array ('404', '405', '500')); + $awaiting = "---\n- 404\n- 405\n- 500\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpAsterisks() { + $dump = Spyc::YAMLDump(array ('*')); + $awaiting = "---\n- '*'\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpAmpersands() { + $dump = Spyc::YAMLDump(array ('some' => '&foo')); + $awaiting = "---\nsome: '&foo'\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpExclamations() { + $dump = Spyc::YAMLDump(array ('some' => '!foo')); + $awaiting = "---\nsome: '!foo'\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpExclamations2() { + $dump = Spyc::YAMLDump(array ('some' => 'foo!')); + $awaiting = "---\nsome: foo!\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpApostrophes() { + $dump = Spyc::YAMLDump(array ('some' => "'Biz' pimpt bedrijventerreinen")); + $awaiting = "---\nsome: \"'Biz' pimpt bedrijventerreinen\"\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testDumpNumericHashes() { + $dump = Spyc::YAMLDump(array ("titel"=> array("0" => "", 1 => "Dr.", 5 => "Prof.", 6 => "Prof. Dr."))); + $awaiting = "---\ntitel:\n 0:\n 1: Dr.\n 5: Prof.\n 6: Prof. Dr.\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testEmpty() { + $dump = Spyc::YAMLDump(array("foo" => array())); + $awaiting = "---\nfoo: [ ]\n"; + $this->assertEquals ($awaiting, $dump); + } + + public function testHashesInKeys() { + $dump = Spyc::YAMLDump(array ('#color' => '#ffffff')); + $awaiting = "---\n\"#color\": '#ffffff'\n"; + $this->assertEquals ($awaiting, $dump); + } + +} \ No newline at end of file diff --git a/src/spyc/tests/IndentTest.php b/src/spyc/tests/IndentTest.php new file mode 100644 index 0000000..5b6dc86 --- /dev/null +++ b/src/spyc/tests/IndentTest.php @@ -0,0 +1,65 @@ +Y = Spyc::YAMLLoad("indent_1.yaml"); + } + + public function testIndent_1() { + $this->assertEquals (array ('child_1' => 2, 'child_2' => 0, 'child_3' => 1), $this->Y['root']); + } + + public function testIndent_2() { + $this->assertEquals (array ('child_1' => 1, 'child_2' => 2), $this->Y['root2']); + } + + public function testIndent_3() { + $this->assertEquals (array (array ('resolutions' => array (1024 => 768, 1920 => 1200), 'producer' => 'Nec')), $this->Y['display']); + } + + public function testIndent_4() { + $this->assertEquals (array ( + array ('resolutions' => array (1024 => 768)), + array ('resolutions' => array (1920 => 1200)), + ), $this->Y['displays']); + } + + public function testIndent_5() { + $this->assertEquals (array (array ( + 'row' => 0, + 'col' => 0, + 'headsets_affected' => array ( + array ( + 'ports' => array (0), + 'side' => 'left', + ) + ), + 'switch_function' => array ( + 'ics_ptt' => true + ) + )), $this->Y['nested_hashes_and_seqs']); + } + + public function testIndent_6() { + $this->assertEquals (array ( + 'h' => array ( + array ('a' => 'b', 'a1' => 'b1'), + array ('c' => 'd') + ) + ), $this->Y['easier_nest']); + } + + public function testIndent_space() { + $this->assertEquals ("By four\n spaces", $this->Y['one_space']); + } + + public function testListAndComment() { + $this->assertEquals (array ('one', 'two', 'three'), $this->Y['list_and_comment']); + } + +} \ No newline at end of file diff --git a/src/spyc/tests/ParseTest.php b/src/spyc/tests/ParseTest.php new file mode 100644 index 0000000..f7045bd --- /dev/null +++ b/src/spyc/tests/ParseTest.php @@ -0,0 +1,322 @@ +yaml = spyc_load_file('../spyc.yaml'); + } + + public function testMergeHashKeys() { + $Expected = array ( + array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '1mm')), + array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '2mm')), + ); + $Actual = spyc_load_file ('indent_1.yaml'); + $this->assertEquals ($Expected, $Actual['steps']); + } + + public function testDeathMasks() { + $Expected = array ('sad' => 2, 'magnificent' => 4); + $Actual = spyc_load_file ('indent_1.yaml'); + $this->assertEquals ($Expected, $Actual['death masks are']); + } + + public function testDevDb() { + $Expected = array ('adapter' => 'mysql', 'host' => 'localhost', 'database' => 'rails_dev'); + $Actual = spyc_load_file ('indent_1.yaml'); + $this->assertEquals ($Expected, $Actual['development']); + } + + public function testNumericKey() { + $this->assertEquals ("Ooo, a numeric key!", $this->yaml[1040]); + } + + public function testMappingsString() { + $this->assertEquals ("Anyone's name, really.", $this->yaml['String']); + } + + public function testMappingsInt() { + $this->assertSame (13, $this->yaml['Int']); + } + + public function testMappingsBooleanTrue() { + $this->assertSame (true, $this->yaml['True']); + } + + public function testMappingsBooleanFalse() { + $this->assertSame (false, $this->yaml['False']); + } + + public function testMappingsZero() { + $this->assertSame (0, $this->yaml['Zero']); + } + + public function testMappingsNull() { + $this->assertSame (null, $this->yaml['Null']); + } + + public function testMappingsNotNull() { + $this->assertSame ('null', $this->yaml['NotNull']); + } + + public function testMappingsFloat() { + $this->assertSame (5.34, $this->yaml['Float']); + } + + public function testMappingsNegative() { + $this->assertSame (-90, $this->yaml['Negative']); + } + + public function testMappingsSmallFloat() { + $this->assertSame (0.7, $this->yaml['SmallFloat']); + } + + public function testNewline() { + $this->assertSame ("\n", $this->yaml['NewLine']); + } + + + public function testSeq0() { + $this->assertEquals ("PHP Class", $this->yaml[0]); + } + + public function testSeq1() { + $this->assertEquals ("Basic YAML Loader", $this->yaml[1]); + } + + public function testSeq2() { + $this->assertEquals ("Very Basic YAML Dumper", $this->yaml[2]); + } + + public function testSeq3() { + $this->assertEquals (array("YAML is so easy to learn.", + "Your config files will never be the same."), $this->yaml[3]); + } + + public function testSeqMap() { + $this->assertEquals (array("cpu" => "1.5ghz", "ram" => "1 gig", + "os" => "os x 10.4.1"), $this->yaml[4]); + } + + public function testMappedSequence() { + $this->assertEquals (array("yaml.org", "php.net"), $this->yaml['domains']); + } + + public function testAnotherSequence() { + $this->assertEquals (array("program" => "Adium", "platform" => "OS X", + "type" => "Chat Client"), $this->yaml[5]); + } + + public function testFoldedBlock() { + $this->assertEquals ("There isn't any time for your tricks!\nDo you understand?", $this->yaml['no time']); + } + + public function testLiteralAsMapped() { + $this->assertEquals ("There is nothing but time\nfor your tricks.", $this->yaml['some time']); + } + + public function testCrazy() { + $this->assertEquals (array( array("name" => "spartan", "notes" => + array( "Needs to be backed up", + "Needs to be normalized" ), + "type" => "mysql" )), $this->yaml['databases']); + } + + public function testColons() { + $this->assertEquals ("like", $this->yaml["if: you'd"]); + } + + public function testInline() { + $this->assertEquals (array("One", "Two", "Three", "Four"), $this->yaml[6]); + } + + public function testNestedInline() { + $this->assertEquals (array("One", array("Two", "And", "Three"), "Four", "Five"), $this->yaml[7]); + } + + public function testNestedNestedInline() { + $this->assertEquals (array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), + "Seriously", array("Show", "Mercy")), $this->yaml[8]); + } + + public function testInlineMappings() { + $this->assertEquals (array("name" => "chris", "age" => "young", "brand" => "lucky strike"), $this->yaml[9]); + } + + public function testNestedInlineMappings() { + $this->assertEquals (array("name" => "mark", "age" => "older than chris", + "brand" => array("marlboro", "lucky strike")), $this->yaml[10]); + } + + public function testReferences() { + $this->assertEquals (array('Perl', 'Python', 'PHP', 'Ruby'), $this->yaml['dynamic languages']); + } + + public function testReferences2() { + $this->assertEquals (array('C/C++', 'Java'), $this->yaml['compiled languages']); + } + + public function testReferences3() { + $this->assertEquals (array( + array('Perl', 'Python', 'PHP', 'Ruby'), + array('C/C++', 'Java') + ), $this->yaml['all languages']); + } + + public function testEscapedQuotes() { + $this->assertEquals ("you know, this shouldn't work. but it does.", $this->yaml[11]); + } + + public function testEscapedQuotes_2() { + $this->assertEquals ( "that's my value.", $this->yaml[12]); + } + + public function testEscapedQuotes_3() { + $this->assertEquals ("again, that's my value.", $this->yaml[13]); + } + + public function testQuotes() { + $this->assertEquals ("here's to \"quotes\", boss.", $this->yaml[14]); + } + + public function testQuoteSequence() { + $this->assertEquals ( array( 'name' => "Foo, Bar's", 'age' => 20), $this->yaml[15]); + } + + public function testShortSequence() { + $this->assertEquals (array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b"), $this->yaml[16]); + } + + public function testHash_1() { + $this->assertEquals ("Hash", $this->yaml['hash_1']); + } + + public function testHash_2() { + $this->assertEquals ('Hash #and a comment', $this->yaml['hash_2']); + } + + public function testHash_3() { + $this->assertEquals ('Hash (#) can appear in key too', $this->yaml['hash#3']); + } + + public function testEndloop() { + $this->assertEquals ("Does this line in the end indeed make Spyc go to an infinite loop?", $this->yaml['endloop']); + } + + public function testReallyLargeNumber() { + $this->assertEquals ('115792089237316195423570985008687907853269984665640564039457584007913129639936', $this->yaml['a_really_large_number']); + } + + public function testFloatWithZeros() { + $this->assertSame ('1.0', $this->yaml['float_test']); + } + + public function testFloatWithQuotes() { + $this->assertSame ('1.0', $this->yaml['float_test_with_quotes']); + } + + public function testFloatInverse() { + $this->assertEquals ('001', $this->yaml['float_inverse_test']); + } + + public function testIntArray() { + $this->assertEquals (array (1, 2, 3), $this->yaml['int array']); + } + + public function testArrayOnSeveralLines() { + $this->assertEquals (array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), $this->yaml['array on several lines']); + } + + public function testmoreLessKey() { + $this->assertEquals ('', $this->yaml['morelesskey']); + } + + public function testArrayOfZero() { + $this->assertSame (array(0), $this->yaml['array_of_zero']); + } + + public function testSophisticatedArrayOfZero() { + $this->assertSame (array('rx' => array ('tx' => array (0))), $this->yaml['sophisticated_array_of_zero']); + } + + public function testSwitches() { + $this->assertEquals (array (array ('row' => 0, 'col' => 0, 'func' => array ('tx' => array(0, 1)))), $this->yaml['switches']); + } + + public function testEmptySequence() { + $this->assertSame (array(), $this->yaml['empty_sequence']); + } + + public function testEmptyHash() { + $this->assertSame (array(), $this->yaml['empty_hash']); + } + + public function testEmptykey() { + $this->assertSame (array('' => array ('key' => 'value')), $this->yaml['empty_key']); + } + + public function testMultilines() { + $this->assertSame (array(array('type' => 'SomeItem', 'values' => array ('blah', 'blah', 'blah', 'blah'), 'ints' => array(2, 54, 12, 2143))), $this->yaml['multiline_items']); + } + + public function testManyNewlines() { + $this->assertSame ('A quick +fox + + +jumped +over + + + + + +a lazy + + + +dog', $this->yaml['many_lines']); + } + + public function testWerte() { + $this->assertSame (array ('1' => 'nummer 1', '0' => 'Stunde 0'), $this->yaml['werte']); + } + + /* public function testNoIndent() { + $this->assertSame (array( + array ('record1'=>'value1'), + array ('record2'=>'value2') + ) + , $this->yaml['noindent_records']); + } */ + + public function testColonsInKeys() { + $this->assertSame (array (1000), $this->yaml['a:1']); + } + + public function testColonsInKeys2() { + $this->assertSame (array (2000), $this->yaml['a:2']); + } + + public function testSpecialCharacters() { + $this->assertSame ('[{]]{{]]', $this->yaml['special_characters']); + } + + public function testAngleQuotes() { + $Quotes = Spyc::YAMLLoad('quotes.yaml'); + $this->assertEquals (array ('html_tags' => array ('
', '

'), 'html_content' => array ('

hello world

', 'hello
world'), 'text_content' => array ('hello world')), + $Quotes); + } + + public function testFailingColons() { + $Failing = Spyc::YAMLLoad('failing1.yaml'); + $this->assertSame (array ('MyObject' => array ('Prop1' => array ('key1:val1'))), + $Failing); + } + +} \ No newline at end of file diff --git a/src/spyc/tests/RoundTripTest.php b/src/spyc/tests/RoundTripTest.php new file mode 100644 index 0000000..4a906e2 --- /dev/null +++ b/src/spyc/tests/RoundTripTest.php @@ -0,0 +1,61 @@ + $a))); } + + +class RoundTripTest extends PHPUnit_Framework_TestCase { + + protected function setUp() { + } + + public function testNull() { + $this->assertEquals (array ('x' => null), roundTrip (null)); + } + + public function testY() { + $this->assertEquals (array ('x' => 'y'), roundTrip ('y')); + } + + public function testExclam() { + $this->assertEquals (array ('x' => '!yeah'), roundTrip ('!yeah')); + } + + public function test5() { + $this->assertEquals (array ('x' => '5'), roundTrip ('5')); + } + + public function testSpaces() { + $this->assertEquals (array ('x' => 'x '), roundTrip ('x ')); + } + + public function testApostrophes() { + $this->assertEquals (array ('x' => "'biz'"), roundTrip ("'biz'")); + } + + public function testNewLines() { + $this->assertEquals (array ('x' => "\n"), roundTrip ("\n")); + } + + public function testHashes() { + $this->assertEquals (array ('x' => array ("#color" => '#fff')), roundTrip (array ("#color" => '#fff'))); + } + + public function testWordWrap() { + $this->assertEquals (array ('x' => "aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), roundTrip ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); + } + + public function testABCD() { + $this->assertEquals (array ('a', 'b', 'c', 'd'), Spyc::YAMLLoad(Spyc::YAMLDump(array('a', 'b', 'c', 'd')))); + } + + public function testABCD2() { + $a = array('a', 'b', 'c', 'd'); // Create a simple list + $b = Spyc::YAMLDump($a); // Dump the list as YAML + $c = Spyc::YAMLLoad($b); // Load the dumped YAML + $d = Spyc::YAMLDump($c); // Re-dump the data + $this->assertSame($b, $d); + } + +} \ No newline at end of file diff --git a/src/spyc/tests/failing1.yaml b/src/spyc/tests/failing1.yaml new file mode 100644 index 0000000..6906a51 --- /dev/null +++ b/src/spyc/tests/failing1.yaml @@ -0,0 +1,2 @@ +MyObject: + Prop1: {key1:val1} \ No newline at end of file diff --git a/src/spyc/tests/indent_1.yaml b/src/spyc/tests/indent_1.yaml new file mode 100644 index 0000000..85a0b59 --- /dev/null +++ b/src/spyc/tests/indent_1.yaml @@ -0,0 +1,59 @@ +root: + child_1: 2 + + child_2: 0 + child_3: 1 + +root2: + child_1: 1 +# A comment + child_2: 2 + +displays: + - resolutions: + 1024: 768 + - resolutions: + 1920: 1200 + +display: + - resolutions: + 1024: 768 + 1920: 1200 + producer: "Nec" + +nested_hashes_and_seqs: + - { row: 0, col: 0, headsets_affected: [{ports: [0], side: left}], switch_function: {ics_ptt: true} } + +easier_nest: { h: [{a: b, a1: b1}, {c: d}] } + +one_space: | + By four + spaces + +steps: + - step: &id001 + instrument: Lasik 2000 + pulseEnergy: 5.4 + pulseDuration: 12 + repetition: 1000 + spotSize: 1mm + - step: + <<: *id001 + spotSize: 2mm + +death masks are: + sad: 2 + <<: {magnificent: 4} + +login: &login + adapter: mysql + host: localhost + +development: + database: rails_dev + <<: *login + +"key": "value:" +colon_only: ":" + +list_and_comment: [one, two, three] # comment \ No newline at end of file diff --git a/src/spyc/tests/quotes.yaml b/src/spyc/tests/quotes.yaml new file mode 100644 index 0000000..2ceea86 --- /dev/null +++ b/src/spyc/tests/quotes.yaml @@ -0,0 +1,8 @@ +html_tags: + -
+ -

+html_content: + -

hello world

+ - hello
world +text_content: + - hello world \ No newline at end of file From aa8c1cabe7408f70dc3da9cd6b7e874eda7f1688 Mon Sep 17 00:00:00 2001 From: Gareth Davies Date: Fri, 11 Oct 2013 13:12:47 -0700 Subject: [PATCH 14/73] Updated readme with installation instructions and fixed example typos --- readme.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index e14f27e..5965f72 100644 --- a/readme.md +++ b/readme.md @@ -8,13 +8,20 @@ I've also implemented the error handling code created by @rodrigore Installation ------------ -Not exactly sure... I used the Artisan Workbench to create a package in my Laravel 4 instance. +Begin by installing this package through Composer. Edit your project's `composer.json` file to require `hitsend/laravel-formatter`. -To learn more about packages read http://laravel.com/docs/packages + "require": { + "hitsend/laravel-formatter": "dev-master" + } -when you add this to your vendor directory, you will need to run `php artisan dump-autoload` +Next, update Composer from the Terminal: + + composer update + +Once this operation completes, the final step is to add the service provider. Open `app/config/app.php`, and add a new item to the providers array. + + 'Hitsend\Formatter\FormatterServiceProvider' -I'll try to make this installation better once I get more time. Usage ----- @@ -40,11 +47,11 @@ Formatter::make($data_to_convert, 'type of data')->to_the_format_you_want(); ``` $json_string = '{"foo":"bar","baz":"qux"}'; -$result = Formater::make($json_string, 'json')->to_array(); +$result = Formatter::make($json_string, 'json')->to_array(); if ( empty(Formatter::$errors) ) { //show the results - print_r(result); + print_r($result); } else { // Show the errors print_r(Formatter::$errors); @@ -57,4 +64,4 @@ Array [foo] => bar [baz] => qux ) -``` \ No newline at end of file +``` From b2cad08da446ae40afd2d8610d9f84be46c8d56a Mon Sep 17 00:00:00 2001 From: Gareth Davies Date: Fri, 20 Dec 2013 19:54:44 -0800 Subject: [PATCH 15/73] Update composer.json Make compatible with Laravel 4.1 --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index c68df58..e69ad2b 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ ], "require": { "php": ">=5.3.0", - "illuminate/support": "4.0.x" + "illuminate/support": "4.*" }, "autoload": { "psr-0": { @@ -23,4 +23,4 @@ } }, "minimum-stability": "dev" -} \ No newline at end of file +} From 3cb5701ae3d86332ddf5f19f662064f04eb899ed Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Mon, 23 Dec 2013 13:30:23 -0500 Subject: [PATCH 16/73] update to composer file for company name change. --- composer.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index e69ad2b..5a01f3b 100644 --- a/composer.json +++ b/composer.json @@ -1,14 +1,14 @@ { - "name": "hitsend/laravel-formatter", + "name": "SoapBox/laravel-formatter", "type": "library", - "description": "Port of Daniel Berry's Formatter Bundle for Laravel 3, to Laravel 4 using the Composer Package management", - "keywords": ["laravel", "formatter"], - "homepage": "http://github.com/hitsend/laravel-formatter", + "description": "A Laravel 4 formatting library. Convert data output between XML/CSV/JSON/TXT/YAML/etc. The project builds on the work of Daniel Berry's Laravel 3 Formatter Bundle.", + "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], + "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", "authors": [ { "name": "Graham McCarthy", - "email": "graham@hitsend.ca", + "email": "graham@soapboxhq.com", "homepage": "http://grahammccarthy.com" } ], From 4a13e8e4be20ba64917fb930c1a33942cac44043 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Mon, 23 Dec 2013 13:32:31 -0500 Subject: [PATCH 17/73] update library to reflect company name --- readme.md | 6 +++--- src/{Hitsend => SoapBox}/Formatter/Facades/Formatter.php | 2 +- src/{Hitsend => SoapBox}/Formatter/Formatter.php | 2 +- .../Formatter/FormatterServiceProvider.php | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/{Hitsend => SoapBox}/Formatter/Facades/Formatter.php (83%) rename src/{Hitsend => SoapBox}/Formatter/Formatter.php (99%) rename src/{Hitsend => SoapBox}/Formatter/FormatterServiceProvider.php (80%) diff --git a/readme.md b/readme.md index 5965f72..f4b5aa8 100644 --- a/readme.md +++ b/readme.md @@ -8,10 +8,10 @@ I've also implemented the error handling code created by @rodrigore Installation ------------ -Begin by installing this package through Composer. Edit your project's `composer.json` file to require `hitsend/laravel-formatter`. +Begin by installing this package through Composer. Edit your project's `composer.json` file to require `SoapBox/laravel-formatter`. "require": { - "hitsend/laravel-formatter": "dev-master" + "SoapBox/laravel-formatter": "dev-master" } Next, update Composer from the Terminal: @@ -20,7 +20,7 @@ Next, update Composer from the Terminal: Once this operation completes, the final step is to add the service provider. Open `app/config/app.php`, and add a new item to the providers array. - 'Hitsend\Formatter\FormatterServiceProvider' + 'SoapBox\Formatter\FormatterServiceProvider' Usage diff --git a/src/Hitsend/Formatter/Facades/Formatter.php b/src/SoapBox/Formatter/Facades/Formatter.php similarity index 83% rename from src/Hitsend/Formatter/Facades/Formatter.php rename to src/SoapBox/Formatter/Facades/Formatter.php index 2dc59cc..76fd8e0 100644 --- a/src/Hitsend/Formatter/Facades/Formatter.php +++ b/src/SoapBox/Formatter/Facades/Formatter.php @@ -1,4 +1,4 @@ -package('hitsend/formatter'); + $this->package('SoapBox/formatter'); } /** @@ -32,7 +32,7 @@ public function register() { $this->app->booting(function() { $loader = \Illuminate\Foundation\AliasLoader::getInstance(); - $loader->alias('Formatter', 'Hitsend\Formatter\Facades\Formatter'); + $loader->alias('Formatter', 'SoapBox\Formatter\Facades\Formatter'); }); } From f7de5aa1797a3e6150110f5dc0608f86c7fb1e4d Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Mon, 23 Dec 2013 13:41:11 -0500 Subject: [PATCH 18/73] just updating github. --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index f4b5aa8..ffca3e7 100644 --- a/readme.md +++ b/readme.md @@ -65,3 +65,4 @@ Array [baz] => qux ) ``` + From efa55580edef24360a18214e1fbb23ed4d88b7f7 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Mon, 23 Dec 2013 13:50:02 -0500 Subject: [PATCH 19/73] updates --- composer.json | 2 +- readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5a01f3b..35c3f50 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "SoapBox/laravel-formatter", + "name": "soapbox/laravel-formatter", "type": "library", "description": "A Laravel 4 formatting library. Convert data output between XML/CSV/JSON/TXT/YAML/etc. The project builds on the work of Daniel Berry's Laravel 3 Formatter Bundle.", "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], diff --git a/readme.md b/readme.md index ffca3e7..4bffb78 100644 --- a/readme.md +++ b/readme.md @@ -11,7 +11,7 @@ Installation Begin by installing this package through Composer. Edit your project's `composer.json` file to require `SoapBox/laravel-formatter`. "require": { - "SoapBox/laravel-formatter": "dev-master" + "soapbox/laravel-formatter": "dev-master" } Next, update Composer from the Terminal: From 332fd8914066be1e168ec89024e09509b2f14b5d Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Tue, 7 Jan 2014 08:27:39 -0500 Subject: [PATCH 20/73] whoops! fixing a broken namespace declaration --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 35c3f50..02135ab 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "autoload": { "psr-0": { "Spyc": "src/spyc/", - "Hitsend\\Formatter": "src/" + "SoapBox\\Formatter": "src/" } }, "minimum-stability": "dev" From 197dc75ea87699a975fc73301d3789a803c0d1f6 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Tue, 7 Jan 2014 17:36:23 -0500 Subject: [PATCH 21/73] update to read me. --- readme.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 4bffb78..425708c 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,10 @@ Formatter Bundle ================ -Laravel 4 Workbench Package based off the work done by @dberry37388 to create a Laravel 3 Bundle porterd from the FuelPHP Format class. Thhis class helps you easily convert between various formats such as XML, JSON, CSV, etc... +A Laravel 4 Formatter Package based on the work done by @dberry37388 with FuelPHP's Formatter class. + +This package will help you to easily convert between various formats such as XML, JSON, CSV, etc... -I've also implemented the error handling code created by @rodrigore Installation ------------ From 086d42323a37564d8eed051ed78d6e69f06cafcf Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 26 Mar 2014 12:11:40 -0400 Subject: [PATCH 22/73] updating my travis file, just to trigger a travis build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0edb59c..a198238 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: php -php: +php: - 5.3 - 5.4 From 9c488bc35ab2f2ad71fef40d3c83986570f2aa37 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 26 Mar 2014 12:15:01 -0400 Subject: [PATCH 23/73] updating travis and composer information. --- .travis.yml | 3 ++- composer.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a198238..b1eb5d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,4 +8,5 @@ before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev -script: phpunit \ No newline at end of file +script: phpunit + diff --git a/composer.json b/composer.json index 02135ab..a417118 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "soapbox/laravel-formatter", "type": "library", - "description": "A Laravel 4 formatting library. Convert data output between XML/CSV/JSON/TXT/YAML/etc. The project builds on the work of Daniel Berry's Laravel 3 Formatter Bundle.", + "description": "A Laravel 4 formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others. ", "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", From 080cc9fc8b62dbbaf118458e222f9e74dcd2ee11 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 26 Mar 2014 12:40:33 -0400 Subject: [PATCH 24/73] added a build status and am currently working through doing test cases for #3 --- readme.md | 4 +++- tests/FormatterTest.php | 27 +++++++++++++++++++++++++++ tests/bootstrap.php | 3 +++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/FormatterTest.php create mode 100644 tests/bootstrap.php diff --git a/readme.md b/readme.md index 425708c..c3991a7 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,9 @@ Formatter Bundle ================ -A Laravel 4 Formatter Package based on the work done by @dberry37388 with FuelPHP's Formatter class. +[![Build Status](https://travis-ci.org/SoapBox/laravel-formatter.svg?branch=master)](https://travis-ci.org/SoapBox/laravel-formatter) + +A Laravel 4 Formatter Package based on the work done by @dberry37388 with FuelPHP's Formatter class. This package will help you to easily convert between various formats such as XML, JSON, CSV, etc... diff --git a/tests/FormatterTest.php b/tests/FormatterTest.php new file mode 100644 index 0000000..1828b81 --- /dev/null +++ b/tests/FormatterTest.php @@ -0,0 +1,27 @@ +assertTrue(true); + } + +/* + public function testFormatter() { + //$formatted = SoapBox\Formatter::make('hello')=>array(); + //var_dump($formatted); + + //$expected = array('hello'); + //$this->assertEquals($expected, $formatted); + } +*/ + +} \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..5e74e53 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,3 @@ + Date: Wed, 26 Mar 2014 16:31:14 -0400 Subject: [PATCH 25/73] this fixes #3 added all the necessary test cases. --- composer.json | 14 ++++- src/SoapBox/Formatter/Formatter.php | 5 +- src/lang/en/formatter.php | 5 +- tests/FormatterTest.php | 89 +++++++++++++++++++++++++---- 4 files changed, 94 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index a417118..149e924 100644 --- a/composer.json +++ b/composer.json @@ -5,6 +5,7 @@ "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", + "version": "1.1", "authors": [ { "name": "Graham McCarthy", @@ -14,7 +15,16 @@ ], "require": { "php": ">=5.3.0", - "illuminate/support": "4.*" + "illuminate/support": ">=4.0,<4.2", + "illuminate/foundation": ">=4.0,<4.2", + "illuminate/config": ">=4.0,<4.2", + "illuminate/session": ">=4.0,<4.2", + "illuminate/filesystem": ">=4.0,<4.2", + "illuminate/view": ">=4.0,<4.2" + }, + "require-dev": { + "orchestra/testbench": "2.1.*", + "mockery/mockery": "dev-master" }, "autoload": { "psr-0": { @@ -23,4 +33,4 @@ } }, "minimum-stability": "dev" -} +} \ No newline at end of file diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 7a8e13b..f1795d7 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -19,7 +19,9 @@ //namespace Formatter; namespace SoapBox\Formatter; -use Config, Lang; +//use Config, Lang; +use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\Lang; /** * The Formatter Class @@ -55,7 +57,6 @@ public static function make($data = null, $from_type = null, $attributes = array return new self($data, $from_type, $attributes); } - /** * Should not be called directly. You should be using Formatter::make() * diff --git a/src/lang/en/formatter.php b/src/lang/en/formatter.php index aacd26c..8749c10 100644 --- a/src/lang/en/formatter.php +++ b/src/lang/en/formatter.php @@ -14,9 +14,8 @@ */ return array( - 'no_data' => 'No data to convert', 'from_type_not_supported' => ':from_type is not a supported type to convert from.', - 'more_data' => 'The line :line_number contains more data fields than the heading.', - 'less_data' => 'The line :line_number contains less data fields than the heading.' + 'more_data' => 'The line :line_number contains more data fields than the heading.', + 'less_data' => 'The line :line_number contains less data fields than the heading.' ); \ No newline at end of file diff --git a/tests/FormatterTest.php b/tests/FormatterTest.php index 1828b81..b4489f2 100644 --- a/tests/FormatterTest.php +++ b/tests/FormatterTest.php @@ -1,27 +1,92 @@ shouldReceive('instance')->once()->andReturn($app); + + //Illuminate\Support\Facades\Facade::setFacadeApplication($app); + //Illuminate\Support\Facades\Config::swap($config = m::mock('ConfigMock')); + //Illuminate\Support\Facades\Lang::swap($lang = m::mock('ConfigLang')); + + //$config->shouldReceive('get')->once()->with('logviewer::log_dirs')->andReturn(array('app' => 'app/storage/logs')); + //$this->logviewer = new Logviewer('app', 'cgi-fcgi', '2013-06-01'); + } + /** + * A basic functional test for JSON to Array conversion + * + * @return void + */ + public function testJsonToArray() { + $data = '{"foo":"bar","bar":"foo"}'; + $result = Formatter::make($data, 'json')->to_array(); + $expected = array('foo'=>'bar', 'bar'=>'foo'); + $this->assertEquals($expected, $result); + } /** - * A basic functional test example. + * A basic functional test for Array to JSON conversion * * @return void */ - public function testBasicExample() { - $this->assertTrue(true); + public function testArrayToJson() { + $data = array('foo'=>'bar', 'bar'=>'foo'); + + $result = Formatter::make($data)->to_json(); + $expected = '{"foo":"bar","bar":"foo"}'; + $this->assertEquals($expected, $result); } -/* - public function testFormatter() { - //$formatted = SoapBox\Formatter::make('hello')=>array(); - //var_dump($formatted); + /** + * A basic functional test for testJSONToXMLToArrayToJsonToArray data to array + * + * @return void + */ + public function testJSONToXMLToArrayToJsonToArray() { + $data = '{"foo":"bar","bar":"foo"}'; + + $result = Formatter::make($data, 'json')->to_xml(); + $result = Formatter::make($result, 'xml')->to_array(); + $result = Formatter::make($result, 'array')->to_json(); + $result = Formatter::make($result, 'json')->to_array(); + + $expected = array('foo'=>'bar', 'bar'=>'foo'); + + $this->assertEquals($expected, $result); + } - //$expected = array('hello'); - //$this->assertEquals($expected, $formatted); + /** + * A basic functional test for CSV data to array + * + * @return void + */ + public function testCSVToArray() { + $data = "foo,bar,bing,bam,boom"; + $result = Formatter::make($data, 'csv')->to_array(); + $expected = array('foo'=>'bar', 'bar'=>'foo'); + var_dump($result); + var_dump($expected); + die('dead'); + $this->assertEquals($expected, $result); } -*/ + /** + * A basic functional test for CSV data to array + * + * @return void + */ + public function testArrayToCSV() { + $expected = array('foo'=>'bar', 'bar'=>'foo'); + $result = Formatter::make($data, 'array')->to_csv(); + var_dump($result); + + $expected = "foo,bar,bing,bam,boom"; + $this->assertEquals($expected, $result); + } } \ No newline at end of file From b99510966f73b14f6edbf9e33221abfe0c0162a1 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 26 Mar 2014 18:52:09 -0400 Subject: [PATCH 26/73] this fixes #4 one line CSV conversions will now work. --- src/SoapBox/Formatter/Formatter.php | 5 ++++- src/config/config.php | 1 - tests/FormatterTest.php | 33 ++--------------------------- 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index f1795d7..bfb0d0f 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -370,7 +370,6 @@ protected function _from_csv($string, $attributes = array()) { foreach ($rows as $row) { $data_fields = str_replace($escape.$enclosure, $enclosure, str_getcsv($row, $delimiter, $enclosure, $escape)); - if (count($data_fields) > count($headings)) { array_push(self::$errors, Lang::get('formatter::formatter.more_data', array('line_number' => $line_number ) )); } else if (count($data_fields) < count($headings)) { @@ -380,6 +379,10 @@ protected function _from_csv($string, $attributes = array()) { } } + if(empty($rows) && !empty($headings) && count($headings) > 0) { + $data = $headings; + } + return $data; } diff --git a/src/config/config.php b/src/config/config.php index 10ae79a..2d4f3af 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -1,5 +1,4 @@ array( 'delimiter' => ',', diff --git a/tests/FormatterTest.php b/tests/FormatterTest.php index b4489f2..4a68d0b 100644 --- a/tests/FormatterTest.php +++ b/tests/FormatterTest.php @@ -8,15 +8,6 @@ class FormatterTest extends Orchestra\Testbench\TestCase { public function setUp() { parent::setUp(); - //$app = m::mock('AppMock'); - //$app->shouldReceive('instance')->once()->andReturn($app); - - //Illuminate\Support\Facades\Facade::setFacadeApplication($app); - //Illuminate\Support\Facades\Config::swap($config = m::mock('ConfigMock')); - //Illuminate\Support\Facades\Lang::swap($lang = m::mock('ConfigLang')); - - //$config->shouldReceive('get')->once()->with('logviewer::log_dirs')->andReturn(array('app' => 'app/storage/logs')); - //$this->logviewer = new Logviewer('app', 'cgi-fcgi', '2013-06-01'); } /** * A basic functional test for JSON to Array conversion @@ -37,7 +28,6 @@ public function testJsonToArray() { */ public function testArrayToJson() { $data = array('foo'=>'bar', 'bar'=>'foo'); - $result = Formatter::make($data)->to_json(); $expected = '{"foo":"bar","bar":"foo"}'; $this->assertEquals($expected, $result); @@ -50,14 +40,11 @@ public function testArrayToJson() { */ public function testJSONToXMLToArrayToJsonToArray() { $data = '{"foo":"bar","bar":"foo"}'; - $result = Formatter::make($data, 'json')->to_xml(); $result = Formatter::make($result, 'xml')->to_array(); $result = Formatter::make($result, 'array')->to_json(); $result = Formatter::make($result, 'json')->to_array(); - $expected = array('foo'=>'bar', 'bar'=>'foo'); - $this->assertEquals($expected, $result); } @@ -67,26 +54,10 @@ public function testJSONToXMLToArrayToJsonToArray() { * @return void */ public function testCSVToArray() { - $data = "foo,bar,bing,bam,boom"; + $data = 'foo,bar,bing,bam,boom'; $result = Formatter::make($data, 'csv')->to_array(); - $expected = array('foo'=>'bar', 'bar'=>'foo'); - var_dump($result); - var_dump($expected); - die('dead'); + $expected = array('foo','bar','bing','bam','boom'); $this->assertEquals($expected, $result); } - /** - * A basic functional test for CSV data to array - * - * @return void - */ - public function testArrayToCSV() { - $expected = array('foo'=>'bar', 'bar'=>'foo'); - $result = Formatter::make($data, 'array')->to_csv(); - var_dump($result); - - $expected = "foo,bar,bing,bam,boom"; - $this->assertEquals($expected, $result); - } } \ No newline at end of file From 2f2a28a3ef74a7112a073424ce315a2d969d102b Mon Sep 17 00:00:00 2001 From: Tamas Erdelyi Date: Thu, 10 Apr 2014 13:03:00 +0200 Subject: [PATCH 27/73] Fixed line_number variable, Errors method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Variable line_number declaration was missing in method _from_csv. Now it gets the key number of $row and add 1 to equal the correct line number. I also created a separate errors() method to get errors from the object, because getting the static variable couldn’t work for me. --- .DS_Store | Bin 6148 -> 0 bytes src/SoapBox/Formatter/Formatter.php | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 $row) { $data_fields = str_replace($escape.$enclosure, $enclosure, str_getcsv($row, $delimiter, $enclosure, $escape)); if (count($data_fields) > count($headings)) { - array_push(self::$errors, Lang::get('formatter::formatter.more_data', array('line_number' => $line_number ) )); + array_push(self::$errors, Lang::get('formatter::formatter.more_data', array('line_number' => $line_number + 1) )); } else if (count($data_fields) < count($headings)) { - array_push(self::$errors, Lang::get('formatter::formatter.less_data', array('line_number' => $line_number ) )); + array_push(self::$errors, Lang::get('formatter::formatter.less_data', array('line_number' => $line_number + 1) )); } else { $data[] = array_combine($headings, $data_fields); } @@ -419,4 +419,13 @@ public static function is_assoc($arr) { } return false; } + + /** + * Returns with errors + * @return array + */ + public function errors() + { + return self::$errors; + } } From c4bd03b6704f11fe14509d53a0540652dc029c69 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 21 May 2014 13:55:18 -0400 Subject: [PATCH 28/73] removing the limits on illuminate --- composer.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 149e924..0f39d0a 100644 --- a/composer.json +++ b/composer.json @@ -15,12 +15,12 @@ ], "require": { "php": ">=5.3.0", - "illuminate/support": ">=4.0,<4.2", - "illuminate/foundation": ">=4.0,<4.2", - "illuminate/config": ">=4.0,<4.2", - "illuminate/session": ">=4.0,<4.2", - "illuminate/filesystem": ">=4.0,<4.2", - "illuminate/view": ">=4.0,<4.2" + "illuminate/support": ">=4.0", + "illuminate/foundation": ">=4.0", + "illuminate/config": ">=4.0", + "illuminate/session": ">=4.0", + "illuminate/filesystem": ">=4.0", + "illuminate/view": ">=4.0" }, "require-dev": { "orchestra/testbench": "2.1.*", @@ -33,4 +33,4 @@ } }, "minimum-stability": "dev" -} \ No newline at end of file +} From e75883e0d6552717990a67f83c39824265eba819 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 21 May 2014 13:58:44 -0400 Subject: [PATCH 29/73] version update to 1.3 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0f39d0a..34f8b96 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", - "version": "1.1", + "version": "1.3", "authors": [ { "name": "Graham McCarthy", From 2c9037ab856b34def593c5eaa157646794f8d130 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Tue, 19 Aug 2014 16:44:38 -0400 Subject: [PATCH 30/73] fixing problem with string values returning as numeric data. and the beginnings of my work on getting complex CSV data to work. --- src/SoapBox/Formatter/Formatter.php | 3 +- tests/FormatterTest.php | 44 ++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 1f86635..576cc81 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -164,6 +164,7 @@ public function to_csv($data = null, $attributes = null) { } else { $headings = array_shift($data); } + } // Single array else { @@ -210,7 +211,7 @@ public function to_json($data = null, $pretty = false) { // To allow exporting ArrayAccess objects like Orm\Model instances they need to be // converted to an array first $data = (is_array($data) or is_object($data)) ? $this->to_array($data) : $data; - return $pretty ? static::pretty_json($data) : json_encode($data, JSON_NUMERIC_CHECK); + return $pretty ? static::pretty_json($data) : json_encode($data); } /** diff --git a/tests/FormatterTest.php b/tests/FormatterTest.php index 4a68d0b..6e8f579 100644 --- a/tests/FormatterTest.php +++ b/tests/FormatterTest.php @@ -60,4 +60,46 @@ public function testCSVToArray() { $this->assertEquals($expected, $result); } -} \ No newline at end of file + /** + * A complex multi-dimentional test for CSV data to array + * + * @return void + */ + public function testComplexCSVToArray() { +/* + $data = ' + { + "simple":"118", + "date":"2014-05-20 21:03:59.333", + "time":"4067", + "duration_onset":null, + "devicename":"My Device", + "calc_data":[ + [ + 1400609039, + 0, + 37, + 0, + 0, + 1 + ], + [ + 1400609039, + 0, + 37, + 0, + 0, + 1 + ] + ] + } + '; + + $result = Formatter::make($data, 'json')->to_csv(); + + dd($result); +*/ + $this->assertEquals(true,true); + } + +} From 20e26d2d96e55f22838421cf19dd30a007d70b19 Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Tue, 19 Aug 2014 16:47:41 -0400 Subject: [PATCH 31/73] 1.4 vbump --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 34f8b96..a554ad8 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", - "version": "1.3", + "version": "1.4", "authors": [ { "name": "Graham McCarthy", From ffd5744dcb525c94c5b5d5fad42bf36530fb85b5 Mon Sep 17 00:00:00 2001 From: Gareth Drew Date: Tue, 16 Sep 2014 18:59:24 +0100 Subject: [PATCH 32/73] Update readme.md Typo fix on readme --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index c3991a7..e020937 100644 --- a/readme.md +++ b/readme.md @@ -39,7 +39,7 @@ Formatter::make($data_to_convert, 'type of data')->to_the_format_you_want(); - XML - CSV -### Available Formates to Convert To +### Available Formats to Convert To - Json - Serializaed Array - XML From b2d18f0cc45bdf4a20cf856a208c5a459b8efc1a Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sat, 18 Oct 2014 15:04:44 -0400 Subject: [PATCH 33/73] Rename config.php to formatter.php --- src/config/{config.php => formatter.php} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/config/{config.php => formatter.php} (98%) diff --git a/src/config/config.php b/src/config/formatter.php similarity index 98% rename from src/config/config.php rename to src/config/formatter.php index 2d4f3af..2716b5e 100644 --- a/src/config/config.php +++ b/src/config/formatter.php @@ -10,4 +10,4 @@ 'xml' => array( 'basenode' => 'xml', ), -); \ No newline at end of file +); From 0b41be543291e52a7a9719b25fdca2862a170e54 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 11:43:52 -0400 Subject: [PATCH 34/73] Cleaning house for v2.0 --- .gitignore | 1 + composer.json | 22 +- readme.md | 67 +- src/SoapBox/Formatter/Facades/Formatter.php | 14 - src/SoapBox/Formatter/Formatter.php | 432 ------- .../Formatter/FormatterServiceProvider.php | 48 - src/config/config.php | 13 - src/lang/en/formatter.php | 21 - src/spyc/COPYING | 21 - src/spyc/README | 159 --- src/spyc/examples/yaml-dump.php | 25 - src/spyc/examples/yaml-load.php | 21 - src/spyc/php4/5to4.php | 17 - src/spyc/php4/spyc.php4 | 1023 ---------------- src/spyc/php4/test.php4 | 162 --- src/spyc/spyc.php | 1046 ----------------- src/spyc/spyc.yaml | 203 ---- src/spyc/tests/DumpTest.php | 130 -- src/spyc/tests/IndentTest.php | 65 - src/spyc/tests/ParseTest.php | 322 ----- src/spyc/tests/RoundTripTest.php | 61 - src/spyc/tests/failing1.yaml | 2 - src/spyc/tests/indent_1.yaml | 59 - src/spyc/tests/quotes.yaml | 8 - tests/Bootstrap.php | 5 + tests/FormatterTest.php | 105 -- tests/TestCase.php | 17 + tests/bootstrap.php | 3 - 28 files changed, 33 insertions(+), 4039 deletions(-) delete mode 100644 src/SoapBox/Formatter/Facades/Formatter.php delete mode 100644 src/SoapBox/Formatter/Formatter.php delete mode 100644 src/SoapBox/Formatter/FormatterServiceProvider.php delete mode 100644 src/config/config.php delete mode 100644 src/lang/en/formatter.php delete mode 100644 src/spyc/COPYING delete mode 100644 src/spyc/README delete mode 100644 src/spyc/examples/yaml-dump.php delete mode 100644 src/spyc/examples/yaml-load.php delete mode 100644 src/spyc/php4/5to4.php delete mode 100644 src/spyc/php4/spyc.php4 delete mode 100644 src/spyc/php4/test.php4 delete mode 100644 src/spyc/spyc.php delete mode 100644 src/spyc/spyc.yaml delete mode 100644 src/spyc/tests/DumpTest.php delete mode 100644 src/spyc/tests/IndentTest.php delete mode 100644 src/spyc/tests/ParseTest.php delete mode 100644 src/spyc/tests/RoundTripTest.php delete mode 100644 src/spyc/tests/failing1.yaml delete mode 100644 src/spyc/tests/indent_1.yaml delete mode 100644 src/spyc/tests/quotes.yaml create mode 100644 tests/Bootstrap.php delete mode 100644 tests/FormatterTest.php create mode 100644 tests/TestCase.php delete mode 100644 tests/bootstrap.php diff --git a/.gitignore b/.gitignore index 5826402..02ceb5d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ composer.phar composer.lock .DS_Store +notes diff --git a/composer.json b/composer.json index a554ad8..047cc69 100644 --- a/composer.json +++ b/composer.json @@ -1,34 +1,30 @@ { "name": "soapbox/laravel-formatter", "type": "library", - "description": "A Laravel 4 formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others. ", - "keywords": ["laravel", "formatter", "data","convert","csv", "xml", "yaml"], + "description": "A formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others.", + "keywords": ["laravel", "formatter", "data", "convert", "csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", - "version": "1.4", + "version": "2.0", "authors": [ { "name": "Graham McCarthy", "email": "graham@soapboxhq.com", "homepage": "http://grahammccarthy.com" + }, + { + "name": "Jaspaul Bola", + "email": "jaspaul.b@gamil.com", + "homepage": "http://jaspaulbola.com" } ], "require": { "php": ">=5.3.0", "illuminate/support": ">=4.0", - "illuminate/foundation": ">=4.0", - "illuminate/config": ">=4.0", - "illuminate/session": ">=4.0", - "illuminate/filesystem": ">=4.0", - "illuminate/view": ">=4.0" - }, - "require-dev": { - "orchestra/testbench": "2.1.*", - "mockery/mockery": "dev-master" + "illuminate/config": ">=4.0" }, "autoload": { "psr-0": { - "Spyc": "src/spyc/", "SoapBox\\Formatter": "src/" } }, diff --git a/readme.md b/readme.md index c3991a7..c5e7bfe 100644 --- a/readme.md +++ b/readme.md @@ -3,69 +3,4 @@ Formatter Bundle [![Build Status](https://travis-ci.org/SoapBox/laravel-formatter.svg?branch=master)](https://travis-ci.org/SoapBox/laravel-formatter) -A Laravel 4 Formatter Package based on the work done by @dberry37388 with FuelPHP's Formatter class. - -This package will help you to easily convert between various formats such as XML, JSON, CSV, etc... - - -Installation ------------- - -Begin by installing this package through Composer. Edit your project's `composer.json` file to require `SoapBox/laravel-formatter`. - - "require": { - "soapbox/laravel-formatter": "dev-master" - } - -Next, update Composer from the Terminal: - - composer update - -Once this operation completes, the final step is to add the service provider. Open `app/config/app.php`, and add a new item to the providers array. - - 'SoapBox\Formatter\FormatterServiceProvider' - - -Usage ------ -The best way to learn how to use Formatter is to look through the code, where you can familiarize yourself with all of the available methods. - -###Calling Formatter -Formatter::make($data_to_convert, 'type of data')->to_the_format_you_want(); - -### Available Formats to Convert From -- Json -- Serialized Array -- XML -- CSV - -### Available Formates to Convert To -- Json -- Serializaed Array -- XML -- CSV -- PHP Array -- PHP Export -- YAML - -``` -$json_string = '{"foo":"bar","baz":"qux"}'; -$result = Formatter::make($json_string, 'json')->to_array(); - -if ( empty(Formatter::$errors) ) { - //show the results - print_r($result); -} else { - // Show the errors - print_r(Formatter::$errors); - return; -} - -// Returns -Array -( - [foo] => bar - [baz] => qux -) -``` - +A formatter package that will help you to easily convert between various formats such as XML, JSON, CSV, etc... diff --git a/src/SoapBox/Formatter/Facades/Formatter.php b/src/SoapBox/Formatter/Facades/Formatter.php deleted file mode 100644 index 76fd8e0..0000000 --- a/src/SoapBox/Formatter/Facades/Formatter.php +++ /dev/null @@ -1,14 +0,0 @@ - - * @license MIT License (see LICENSE.readme included in the bundle) - * - */ - -/** - * Setup the Formatter namespace - */ -//namespace Formatter; -namespace SoapBox\Formatter; - -//use Config, Lang; -use Illuminate\Support\Facades\Config; -use Illuminate\Support\Facades\Lang; - -/** - * The Formatter Class - * - * Makes it quick and easy to convert data between several different formats. - * - * @package Formatter - * @author Daniel Berry - * - */ -class Formatter { - - /** - * Holds the data that we are converting - * @var array - */ - protected $_data = array(); - - /** - * Holds the errors. For now only works with from_csv - * @var array - */ - public static $errors = array(); - - /** - * Returns an instance of the Formatter Bundle - * @param mixex $data the data we are converting - * @param [type] $from_type what we want to convert to - * @return Formatter - */ - public static function make($data = null, $from_type = null, $attributes = array()) - { - return new self($data, $from_type, $attributes); - } - - /** - * Should not be called directly. You should be using Formatter::make() - * - * Constructs our class and sets up some vars we will be using throughout - * the conversion process. - * - * @param mixed $data data we will be converting - * @param string $from_type what we are converting form - */ - public function __construct($data = null, $from_type = null, $attributes = array()) - { - // make sure we have data to convert to - if (!is_array($data) && empty($data)) { - array_push(self::$errors, Lang::get('formatter::formatter.no_data', array('from_type' => $from_type))); - } - - // make sure our from type has been specified. - if ($from_type !== null) { - // check to make sure the method exists - if (method_exists($this, "_from_{$from_type}")) { - $data = call_user_func(array($this, '_from_' . $from_type), $data, $attributes); - } else { - array_push(self::$errors, Lang::get('formatter::formatter.from_type_not_supported', array('from_type' => $from_type))); - } - } - - // set up our data. - $this->_data = $data; - } - - /** - * To array conversion - * - * Goes through the input and makes sure everything is either a scalar value or array - * - * @param mixed $data - * @return array - */ - public function to_array($data = null) - { - if ($data === null) { - $data = $this->_data; - } - - $array = array(); - - if (is_object($data) and ! $data instanceof \Iterator) { - $data = get_object_vars($data); - } - - if (empty($data)) { - return array(); - } - - foreach ($data as $key => $value) { - if (is_object($value) or is_array($value)) { - $array[$key] = $this->to_array($value); - } else { - $array[$key] = $value; - } - } - - return $array; - } - - /** - * To CSV conversion - * - * @param mixed $data - * @param mixed $delimiter - * @return string - */ - public function to_csv($data = null, $attributes = null) { - - // let's get the config file - $config = Config::get('formatter::formatter.csv'); - - // csv format settings - $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n")); - $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); - $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\"")); - $escape = array_get($attributes, 'escape', array_get($config, 'escape', '\\')); - - // escape function - $escaper = function($items) use($enclosure, $escape) { - return array_map(function($item) use($enclosure, $escape) { - return str_replace($enclosure, $escape.$enclosure, $item); - }, $items); - }; - - if ($data === null) { - $data = $this->_data; - } - - if (is_object($data) and ! $data instanceof \Iterator) { - $data = $this->to_array($data); - } - - // Multi-dimensional array - if (is_array($data) and self::is_multi($data)) { - $data = array_values($data); - - if (self::is_assoc($data[0])) { - $headings = array_keys($data[0]); - } else { - $headings = array_shift($data); - } - - } - // Single array - else { - $headings = array_keys((array) $data); - $data = array($data); - } - - $output = $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper($headings)).$enclosure.$newline; - - foreach ($data as $row) { - $output .= $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper((array) $row)).$enclosure.$newline; - } - - return rtrim($output, $newline); - } - - - /** - * Serialize - * - * @param mixed $data - * @return string - */ - public function to_serialized($data = null) { - if ($data == null) { - $data = $this->_data; - } - - return serialize($data); - } - - /** - * To JSON conversion - * - * @param mixed $data - * @param bool wether to make the json pretty - * @return string - */ - public function to_json($data = null, $pretty = false) { - if ($data == null) { - $data = $this->_data; - } - - // To allow exporting ArrayAccess objects like Orm\Model instances they need to be - // converted to an array first - $data = (is_array($data) or is_object($data)) ? $this->to_array($data) : $data; - return $pretty ? static::pretty_json($data) : json_encode($data); - } - - /** - * Return as a string representing the PHP structure - * - * @param mixed $data - * @return string - */ - public function to_php($data = null) { - if ($data == null) { - $data = $this->_data; - } - - return var_export($data, true); - } - - /** - * Convert to YAML - * - * @param mixed $data - * @return string - */ - public function to_yaml($data = null) { - if ($data == null) { - $data = $this->_data; - } - - $data = (is_array($data) or is_object($data)) ? $this->to_array($data) : $data; - - return \Spyc::YAMLDump($data); - } - - /** - * To XML conversion - * - * @param mixed $data - * @param null $structure - * @param null|string $basenode - * @return string - */ - public function to_xml($data = null, $structure = null, $basenode = 'xml') { - if ($data == null) { - $data = $this->_data; - } - - // turn off compatibility mode as simple xml throws a wobbly if you don't. - if (ini_get('zend.ze1_compatibility_mode') == 1) { - ini_set('zend.ze1_compatibility_mode', 0); - } - - if ($structure == null) { - $structure = simplexml_load_string("<$basenode />"); - } - - // Force it to be something useful - if ( ! is_array($data) and ! is_object($data)) { - $data = (array) $data; - } - - foreach ($data as $key => $value) { - // convert our booleans to 0/1 integer values so they are - // not converted to blanks. - if(is_bool($value)) { - $value = (int) $value; - } - - // no numeric keys in our xml please! - if (is_numeric($key)) { - // make string key... - $key = (\Str::singular($basenode) != $basenode) ? \Str::singular($basenode) : 'item'; - } - - // replace anything not alpha numeric - $key = preg_replace('/[^a-z_\-0-9]/i', '', $key); - - // if there is another array found recrusively call this function - if (is_array($value) or is_object($value)) { - $node = $structure->addChild($key); - - // recursive call if value is not empty - if( ! empty($value)) { - $this->to_xml($value, $node, $key); - } - } else { - // add single node. - $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8"); - - $structure->addChild($key, $value); - } - } - - // pass back as string. or simple xml object if you want! - return $structure->asXML(); - } - - /** - * Import JSON data - * - * @param string $string - * @return mixed - */ - private function _from_json($string) { - return json_decode(trim($string)); - } - - /** - * Import Serialized data - * - * @param string $string - * @return mixed - */ - private function _from_serialize($string) { - return unserialize(trim($string)); - } - - /** - * Import XML data - * - * @param string $string - * @return array - */ - protected function _from_xml($string) { - $_arr = is_string($string) ? simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : $string; - $arr = array(); - - // Convert all objects SimpleXMLElement to array recursively - foreach ((array)$_arr as $key => $val) { - $arr[$key] = (is_array($val) or is_object($val)) ? $this->_from_xml($val) : $val; - } - - return $arr; - } - - /** - * Import CSV data - * - * @param string $string - * @return array - */ - protected function _from_csv($string, $attributes = array()) { - $data = array(); - - // let's get the config file - $config = Config::get('formatter::formatter.csv'); - - // csv format settings - $newline = array_get($attributes, 'newline', array_get($config, 'newline', "\n")); - $delimiter = array_get($attributes, 'delimiter', array_get($config, 'delimiter', ",")); - $enclosure = array_get($attributes, 'enclosure', array_get($config, 'enclosure', "\"")); - $escape = array_get($attributes, 'escape', array_get($config, 'escape', '\\')); - $regex_newline = array_get($attributes, 'regex_newline', array_get($config, 'regex_newline', '\n')); - - $rows = preg_split('/(?<='.preg_quote($enclosure).')'.$regex_newline.'/', trim($string)); - - // Get the headings - $headings = str_replace($escape.$enclosure, $enclosure, str_getcsv(array_shift($rows), $delimiter, $enclosure, $escape)); - - foreach ($rows as $line_number => $row) { - $data_fields = str_replace($escape.$enclosure, $enclosure, str_getcsv($row, $delimiter, $enclosure, $escape)); - if (count($data_fields) > count($headings)) { - array_push(self::$errors, Lang::get('formatter::formatter.more_data', array('line_number' => $line_number + 1) )); - } else if (count($data_fields) < count($headings)) { - array_push(self::$errors, Lang::get('formatter::formatter.less_data', array('line_number' => $line_number + 1) )); - } else { - $data[] = array_combine($headings, $data_fields); - } - } - - if(empty($rows) && !empty($headings) && count($headings) > 0) { - $data = $headings; - } - - return $data; - } - - - /** - * Checks if the given array is a multidimensional array. - * - * @param array $arr the array to check - * @param array $all_keys if true, check that all elements are arrays - * @return bool true if its a multidimensional array, false if not - */ - protected static function is_multi($arr, $all_keys = false) { - $values = array_filter($arr, 'is_array'); - return $all_keys ? count($arr) === count($values) : count($values) > 0; - } - - /** - * Checks if the given array is an assoc array. - * - * @param array $arr the array to check - * @return bool true if its an assoc array, false if not - */ - public static function is_assoc($arr) { - if ( ! is_array($arr)) { - array_push(self::$errors, Lang::get('formatter::formatter.must_be_array')); - } - - $counter = 0; - - foreach ($arr as $key => $unused) { - if ( ! is_int($key) or $key !== $counter++) { - return true; - } - } - return false; - } - - /** - * Returns with errors - * @return array - */ - public function errors() - { - return self::$errors; - } -} diff --git a/src/SoapBox/Formatter/FormatterServiceProvider.php b/src/SoapBox/Formatter/FormatterServiceProvider.php deleted file mode 100644 index 9a97fd7..0000000 --- a/src/SoapBox/Formatter/FormatterServiceProvider.php +++ /dev/null @@ -1,48 +0,0 @@ -package('SoapBox/formatter'); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() { - $this->app['formatter'] = $this->app->share(function($app) { - return new Formatter; - }); - - $this->app->booting(function() { - $loader = \Illuminate\Foundation\AliasLoader::getInstance(); - $loader->alias('Formatter', 'SoapBox\Formatter\Facades\Formatter'); - }); - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() { - return array('formatter'); - } - -} \ No newline at end of file diff --git a/src/config/config.php b/src/config/config.php deleted file mode 100644 index 2d4f3af..0000000 --- a/src/config/config.php +++ /dev/null @@ -1,13 +0,0 @@ - array( - 'delimiter' => ',', - 'enclosure' => '"', - 'newline' => "\n", - 'regex_newline' => '\n', - 'escape' => '\\', - ), - 'xml' => array( - 'basenode' => 'xml', - ), -); \ No newline at end of file diff --git a/src/lang/en/formatter.php b/src/lang/en/formatter.php deleted file mode 100644 index 8749c10..0000000 --- a/src/lang/en/formatter.php +++ /dev/null @@ -1,21 +0,0 @@ - - * @license MIT License (see LICENSE.readme included in the bundle) - * - */ - -return array( - 'no_data' => 'No data to convert', - 'from_type_not_supported' => ':from_type is not a supported type to convert from.', - 'more_data' => 'The line :line_number contains more data fields than the heading.', - 'less_data' => 'The line :line_number contains less data fields than the heading.' -); \ No newline at end of file diff --git a/src/spyc/COPYING b/src/spyc/COPYING deleted file mode 100644 index 8e7ddbc..0000000 --- a/src/spyc/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2011 Vladimir Andersen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/src/spyc/README b/src/spyc/README deleted file mode 100644 index 4d77166..0000000 --- a/src/spyc/README +++ /dev/null @@ -1,159 +0,0 @@ -# -# S P Y C -# a simple php yaml class -# -# Load this README! -# >> $readme = Spyc::YAMLLoad('README'); -# ---- %YAML:1.1 -title: Spyc -- a Simple PHP YAML Class -version: 0.5 -authors: [chris wanstrath (chris@ozmm.org), vlad andersen (vlad.andersen@gmail.com)] -websites: [http://www.yaml.org, http://spyc.sourceforge.net] -license: [MIT License, http://www.opensource.org/licenses/mit-license.php] -copyright: "(c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen" -tested on: [php 5.2.x] - -installation: > - Copy spyc.php to a directory you can - access with your YAML-ready PHP script. - - That's it! - -about: > - From www.yaml.org: - - "YAML(tm) (rhymes with 'camel') is a human-friendly, cross language, - Unicode based data serialization language designed around the common - native data structures of agile programming languages. It is broadly - useful for programming needs ranging from configuration files to - Internet messaging to object persistence to data auditing. Together - with the Unicode standard for characters, the YAML specification provides - all the information necessary to understand YAML Version 1.1 and to - creating programs that process YAML information. - - YAML(tm) is a balance of the following design goals: - - YAML documents are very readable by humans. - - YAML interacts well with scripting languages. - - YAML uses host languages' native data structures. - - YAML has a consistent information model. - - YAML enables stream-based processing. - - YAML is expressive and extensible. - - YAML is easy to implement." - - YAML makes a lot of sense. It's easy to use, easy to learn, and cool. - As the lucky stiff named why once said, "YAML is a beacon of light." - - If you're new to YAML, may we suggest YAML In Five Minutes: - - http://yaml.kwiki.org/?YamlInFiveMinutes - - If you don't have five minutes, realize that this README is a completely - valid YAML document. Dig in, load this or any YAML file into an array - with Spyc and see how easy it is to translate friendly text into usable - data. - - The purpose of Spyc is to provide a pure PHP alternative to Syck, a - simple API for loading and dumping YAML documents, a YAML loader which - understands a usable subset of the YAML spec, and to further spread - the glory of YAML to the PHP masses. - - If you're at all hesitant ("usable subset of YAML?!"), navigate - http://yaml.org/start.html. Spyc completely understands the YAML - document shown there, a document which has features way beyond the - scope of what normal config files might require. Try it for yourself, - and then start enjoying the peace of mind YAML brings to your life. - -meat and a few potatoes: - - concept: Loading a YAML document into PHP - brief: > - $yaml will become an array of all the data in wicked.yaml - code: | - - include('spyc.php'); - - $yaml = Spyc::YAMLLoad('wicked.yaml'); - - - concept: Loading a YAML string into PHP - brief: > - $array will look like this: - array('A YAML','document in a','string') - code: | - - include('spyc.php'); - - $yaml = '- A YAML\n- document in a\n- string.'; - $array = Spyc::YAMLLoad($yaml); - - - concept: Dumping a PHP array to YAML - brief: > - $yaml will become a string of a YAML document created from - $array. - code: | - - include('spyc.php'); - - $array['name'] = 'chris'; - $array['sport'] = 'curbing'; - - $yaml = Spyc::YAMLDump($array); - -prior art: - - who: [Brian Ingerson, Clark Evans, Oren Ben-Kiki] - why?: > - The YAML spec is really a piece of work, and these guys - did a great job on it. A simple and elegant language like - YAML was a long time coming and it's refreshing to know - such able minded individuals took the task to heart and - executed it with cunning and strength. In addition to - their various noteworthy contributions to YAML parsers - and related projects, YAML.pm's README is a treasure trove - of information for knowledge seekers. Thanks, guys. - - - who: why the lucky stiff - why?: > - As the author of Syck, the code used in Ruby for the language's - YAML class and methods, why is indirectly (directly?) responsible - for my first exposure to YAML (as a config file in a Ruby web-app) - and the countless hours I spent playing with this sheik new data - format afterwards. Syck's README is a YAML file and thus the - inspiration for this file and, even, this very piece of software. - - - who: Steve Howell - why?: > - Python's YAML implementation. PyYAML's README file is also YAML, - so it too inspired the YAML format of this README file. - - - who: [Rasmus Lerdorf, Zeev Suraski, Andi Gutmans, et al] - why?: > - PHP is great at what it does best. It's also paid a lot of my bills. - Thanks. - -bugs: - report: > - Please see Spyc's Sourceforge project page for information on reporting bugs. - speed: > - This implementation was not designed for speed. Rather, it - was designed for those who need a pure PHP implementation of - a YAML parser and who are not overly concerned with performance. - If you want speed, check out Syck. - depth: > - This parser is by no means a comprehensive YAML parser. For supported - features and future plans, check the website. - unicode: > - YAML is supposed to be unicode, but for now we're just using ASCII. - PHP has crappy unicode support but who knows what the future holds. - -resources: - - http://www.yaml.org - - http://www.yaml.org/spec/ - - http://yaml.kwiki.org/?YamlInFiveMinutes - - http://www.whytheluckystiff.net/syck/ - - http://yaml4r.sourceforge.net/cookbook/ - -thanks: - - Adam Wood - - Daniel Ferreira - - Aaron Jensen - - Mike Thornton - - Fabien Potencier - - Mustafa Kumas \ No newline at end of file diff --git a/src/spyc/examples/yaml-dump.php b/src/spyc/examples/yaml-dump.php deleted file mode 100644 index 05a8a2f..0000000 --- a/src/spyc/examples/yaml-dump.php +++ /dev/null @@ -1,25 +0,0 @@ - 'A sequence','second' => 'of mapped values'); -$array['Mapped'] = array('A sequence','which is mapped'); -$array['A Note'] = 'What if your text is too long?'; -$array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; -$array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; -$array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; -$array['key:withcolon'] = "Should support this to"; - -$yaml = Spyc::YAMLDump($array,4,60); \ No newline at end of file diff --git a/src/spyc/examples/yaml-load.php b/src/spyc/examples/yaml-load.php deleted file mode 100644 index fba9571..0000000 --- a/src/spyc/examples/yaml-load.php +++ /dev/null @@ -1,21 +0,0 @@ -spyc.yaml loaded into PHP:
'; -print_r($array); -echo ''; - - -echo '
YAML Data dumped back:
'; -echo Spyc::YAMLDump($array); -echo '
'; diff --git a/src/spyc/php4/5to4.php b/src/spyc/php4/5to4.php deleted file mode 100644 index 5a48694..0000000 --- a/src/spyc/php4/5to4.php +++ /dev/null @@ -1,17 +0,0 @@ -', $code); - $f = fopen ($dest, 'w'); - fwrite($f, $code); - fclose ($f); - print "Written to $dest.\n"; -} \ No newline at end of file diff --git a/src/spyc/php4/spyc.php4 b/src/spyc/php4/spyc.php4 deleted file mode 100644 index 73f08cc..0000000 --- a/src/spyc/php4/spyc.php4 +++ /dev/null @@ -1,1023 +0,0 @@ - - * @author Chris Wanstrath - * @link http://code.google.com/p/spyc/ - * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2009 Vlad Andersen - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @package Spyc - */ - -if (!function_exists('spyc_load')) { - /** - * Parses YAML to array. - * @param string $string YAML string. - * @return array - */ - function spyc_load ($string) { - return Spyc::YAMLLoadString($string); - } -} - -if (!function_exists('spyc_load_file')) { - /** - * Parses YAML to array. - * @param string $file Path to YAML file. - * @return array - */ - function spyc_load_file ($file) { - return Spyc::YAMLLoad($file); - } -} - -/** - * The Simple PHP YAML Class. - * - * This class can be used to read a YAML file and convert its contents - * into a PHP array. It currently supports a very limited subsection of - * the YAML spec. - * - * Usage: - * - * $Spyc = new Spyc; - * $array = $Spyc->load($file); - * - * or: - * - * $array = Spyc::YAMLLoad($file); - * - * or: - * - * $array = spyc_load_file($file); - * - * @package Spyc - */ -class Spyc { - - // SETTINGS - - /** - * Setting this to true will force YAMLDump to enclose any string value in - * quotes. False by default. - * - * @var bool - */ - var $setting_dump_force_quotes = false; - - /** - * Setting this to true will forse YAMLLoad to use syck_load function when - * possible. False by default. - * @var bool - */ - var $setting_use_syck_is_possible = false; - - - - /**#@+ - * @access private - * @var mixed - */ - var $_dumpIndent; - var $_dumpWordWrap; - var $_containsGroupAnchor = false; - var $_containsGroupAlias = false; - var $path; - var $result; - var $LiteralPlaceHolder = '___YAML_Literal_Block___'; - var $SavedGroups = array(); - var $indent; - /** - * Path modifier that should be applied after adding current element. - * @var array - */ - var $delayedPath = array(); - - /**#@+ - * @access public - * @var mixed - */ - var $_nodeId; - -/** - * Load a valid YAML string to Spyc. - * @param string $input - * @return array - */ - function load ($input) { - return $this->__loadString($input); - } - - /** - * Load a valid YAML file to Spyc. - * @param string $file - * @return array - */ - function loadFile ($file) { - return $this->__load($file); - } - - /** - * Load YAML into a PHP array statically - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. Pretty - * simple. - * Usage: - * - * $array = Spyc::YAMLLoad('lucky.yaml'); - * print_r($array); - * - * @access public - * @return array - * @param string $input Path of YAML file or string containing YAML - */ - function YAMLLoad($input) { - $Spyc = new Spyc; - return $Spyc->__load($input); - } - - /** - * Load a string of YAML into a PHP array statically - * - * The load method, when supplied with a YAML string, will do its best - * to convert YAML in a string into a PHP array. Pretty simple. - * - * Note: use this function if you don't want files from the file system - * loaded and processed as YAML. This is of interest to people concerned - * about security whose input is from a string. - * - * Usage: - * - * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); - * print_r($array); - * - * @access public - * @return array - * @param string $input String containing YAML - */ - function YAMLLoadString($input) { - $Spyc = new Spyc; - return $Spyc->__loadString($input); - } - - /** - * Dump YAML from PHP array statically - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as nothing.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - function YAMLDump($array,$indent = false,$wordwrap = false) { - $spyc = new Spyc; - return $spyc->dump($array,$indent,$wordwrap); - } - - - /** - * Dump PHP array to YAML - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as tasteful.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - function dump($array,$indent = false,$wordwrap = false) { - // Dumps to some very clean YAML. We'll have to add some more features - // and options soon. And better support for folding. - - // New features and options. - if ($indent === false or !is_numeric($indent)) { - $this->_dumpIndent = 2; - } else { - $this->_dumpIndent = $indent; - } - - if ($wordwrap === false or !is_numeric($wordwrap)) { - $this->_dumpWordWrap = 40; - } else { - $this->_dumpWordWrap = $wordwrap; - } - - // New YAML document - $string = "---\n"; - - // Start at the base of the array and move through it. - if ($array) { - $array = (array)$array; - $first_key = key($array); - - $previous_key = -1; - foreach ($array as $key => $value) { - $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key); - $previous_key = $key; - } - } - return $string; - } - - /** - * Attempts to convert a key / value array item to YAML - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0) { - if (is_array($value)) { - if (empty ($value)) - return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key); - // It has children. What to do? - // Make it the right kind of item - $string = $this->_dumpNode($key, NULL, $indent, $previous_key, $first_key); - // Add the indent - $indent += $this->_dumpIndent; - // Yamlize the array - $string .= $this->_yamlizeArray($value,$indent); - } elseif (!is_array($value)) { - // It doesn't have children. Yip. - $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key); - } - return $string; - } - - /** - * Attempts to convert an array to YAML - * @access private - * @return string - * @param $array The array you want to convert - * @param $indent The indent of the current level - */ - function _yamlizeArray($array,$indent) { - if (is_array($array)) { - $string = ''; - $previous_key = -1; - $first_key = key($array); - foreach ($array as $key => $value) { - $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key); - $previous_key = $key; - } - return $string; - } else { - return false; - } - } - - /** - * Returns YAML from a key and a value - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0) { - // do some folding here, for blocks - if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || - strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || substr ($value, -1, 1) == ':')) { - $value = $this->_doLiteralBlock($value,$indent); - } else { - $value = $this->_doFolding($value,$indent); - if (is_bool($value)) { - $value = ($value) ? "true" : "false"; - } - } - - if ($value === array()) $value = '[ ]'; - - $spaces = str_repeat(' ',$indent); - - if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { - // It's a sequence - $string = $spaces.'- '.$value."\n"; - } else { - if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); - // It's mapped - if (strpos($key, ":") !== false) { $key = '"' . $key . '"'; } - $string = $spaces.$key.': '.$value."\n"; - } - return $string; - } - - /** - * Creates a literal block for dumping - * @access private - * @return string - * @param $value - * @param $indent int The value of the indent - */ - function _doLiteralBlock($value,$indent) { - if (strpos($value, "\n") === false && strpos($value, "'") === false) { - return sprintf ("'%s'", $value); - } - if (strpos($value, "\n") === false && strpos($value, '"') === false) { - return sprintf ('"%s"', $value); - } - $exploded = explode("\n",$value); - $newValue = '|'; - $indent += $this->_dumpIndent; - $spaces = str_repeat(' ',$indent); - foreach ($exploded as $line) { - $newValue .= "\n" . $spaces . trim($line); - } - return $newValue; - } - - /** - * Folds a string of text, if necessary - * @access private - * @return string - * @param $value The string you wish to fold - */ - function _doFolding($value,$indent) { - // Don't do anything if wordwrap is set to 0 - - if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { - $indent += $this->_dumpIndent; - $indent = str_repeat(' ',$indent); - $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); - $value = ">\n".$indent.$wrapped; - } else { - if ($this->setting_dump_force_quotes && is_string ($value)) - $value = '"' . $value . '"'; - } - - - return $value; - } - -// LOADING FUNCTIONS - - function __load($input) { - $Source = $this->loadFromSource($input); - return $this->loadWithSource($Source); - } - - function __loadString($input) { - $Source = $this->loadFromString($input); - return $this->loadWithSource($Source); - } - - function loadWithSource($Source) { - if (empty ($Source)) return array(); - if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ('', $Source)); - return is_array($array) ? $array : array(); - } - - $this->path = array(); - $this->result = array(); - - $cnt = count($Source); - for ($i = 0; $i < $cnt; $i++) { - $line = $Source[$i]; - - $this->indent = strlen($line) - strlen(ltrim($line)); - $tempPath = $this->getParentPathByIndent($this->indent); - $line = $this->stripIndent($line, $this->indent); - if ($this->isComment($line)) continue; - if ($this->isEmpty($line)) continue; - $this->path = $tempPath; - - $literalBlockStyle = $this->startsLiteralBlock($line); - if ($literalBlockStyle) { - $line = rtrim ($line, $literalBlockStyle . " \n"); - $literalBlock = ''; - $line .= $this->LiteralPlaceHolder; - - while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { - $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle); - } - $i--; - } - - while (++$i < $cnt && $this->greedilyNeedNextLine($line)) { - $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); - } - $i--; - - - - if (strpos ($line, '#')) { - if (strpos ($line, '"') === false && strpos ($line, "'") === false) - $line = preg_replace('/\s+#(.+)$/','',$line); - } - - $lineArray = $this->_parseLine($line); - - if ($literalBlockStyle) - $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); - - $this->addArray($lineArray, $this->indent); - - foreach ($this->delayedPath as $indent => $delayedPath) - $this->path[$indent] = $delayedPath; - - $this->delayedPath = array(); - - } - return $this->result; - } - - function loadFromSource ($input) { - if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - return file($input); - - return $this->loadFromString($input); - } - - function loadFromString ($input) { - $lines = explode("\n",$input); - foreach ($lines as $k => $_) { - $lines[$k] = rtrim ($_, "\r"); - } - return $lines; - } - - /** - * Parses YAML code and returns an array for a node - * @access private - * @return array - * @param string $line A line from the YAML file - */ - function _parseLine($line) { - if (!$line) return array(); - $line = trim($line); - - if (!$line) return array(); - $array = array(); - - $group = $this->nodeContainsGroup($line); - if ($group) { - $this->addGroup($line, $group); - $line = $this->stripGroup ($line, $group); - } - - if ($this->startsMappedSequence($line)) - return $this->returnMappedSequence($line); - - if ($this->startsMappedValue($line)) - return $this->returnMappedValue($line); - - if ($this->isArrayElement($line)) - return $this->returnArrayElement($line); - - if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - - return $this->returnKeyValuePair($line); - - } - - /** - * Finds the type of the passed value, returns the value as the new type. - * @access private - * @param string $value - * @return mixed - */ - function _toType($value) { - if ($value === '') return null; - $first_character = $value[0]; - $last_character = substr($value, -1, 1); - - $is_quoted = false; - do { - if (!$value) break; - if ($first_character != '"' && $first_character != "'") break; - if ($last_character != '"' && $last_character != "'") break; - $is_quoted = true; - } while (0); - - if ($is_quoted) - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - - if (strpos($value, ' #') !== false) - $value = preg_replace('/\s+#(.+)$/','',$value); - - if ($first_character == '[' && $last_character == ']') { - // Take out strings sequences and mappings - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $value = array(); - foreach ($explode as $v) { - $value[] = $this->_toType($v); - } - return $value; - } - - if (strpos($value,': ')!==false && $first_character != '{') { - $array = explode(': ',$value); - $key = trim($array[0]); - array_shift($array); - $value = trim(implode(': ',$array)); - $value = $this->_toType($value); - return array($key => $value); - } - - if ($first_character == '{' && $last_character == '}') { - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - // Inline Mapping - // Take out strings sequences and mappings - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $array = array(); - foreach ($explode as $v) { - $SubArr = $this->_toType($v); - if (empty($SubArr)) continue; - if (is_array ($SubArr)) { - $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; - } - $array[] = $SubArr; - } - return $array; - } - - if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { - return null; - } - - if (intval($first_character) > 0 && preg_match ('/^[1-9]+[0-9]*$/', $value)) { - $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) - $value = $intvalue; - return $value; - } - - if (in_array($value, - array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { - return true; - } - - if (in_array(strtolower($value), - array('false', 'off', '-', 'no', 'n'))) { - return false; - } - - if (is_numeric($value)) { - if ($value === '0') return 0; - if (trim ($value, 0) === $value) - $value = (float)$value; - return $value; - } - - return $value; - } - - /** - * Used in inlines to check for more inlines or quoted strings - * @access private - * @return array - */ - function _inlineEscape($inline) { - // There's gotta be a cleaner way to do this... - // While pure sequences seem to be nesting just fine, - // pure mappings and mappings with sequences inside can't go very - // deep. This needs to be fixed. - - $seqs = array(); - $maps = array(); - $saved_strings = array(); - - // Check for strings - $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_strings = $strings[0]; - $inline = preg_replace($regex,'YAMLString',$inline); - } - unset($regex); - - $i = 0; - do { - - // Check for sequences - while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { - $seqs[] = $matchseqs[0]; - $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); - } - - // Check for mappings - while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { - $maps[] = $matchmaps[0]; - $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); - } - - if ($i++ >= 10) break; - - } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - - $explode = explode(', ',$inline); - $stringi = 0; $i = 0; - - while (1) { - - // Re-add the sequences - if (!empty($seqs)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - foreach ($seqs as $seqk => $seq) { - $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); - $value = $explode[$key]; - } - } - } - } - - // Re-add the mappings - if (!empty($maps)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLMap') !== false) { - foreach ($maps as $mapk => $map) { - $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); - $value = $explode[$key]; - } - } - } - } - - - // Re-add the strings - if (!empty($saved_strings)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLString') !== false) { - $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); - unset($saved_strings[$stringi]); - ++$stringi; - $value = $explode[$key]; - } - } - } - - $finished = true; - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLMap') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLString') !== false) { - $finished = false; break; - } - } - if ($finished) break; - - $i++; - if ($i > 10) - break; // Prevent infinite loops. - } - - return $explode; - } - - function literalBlockContinues ($line, $lineIndent) { - if (!trim($line)) return true; - if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; - return false; - } - - function referenceContentsByAlias ($alias) { - do { - if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } - $groupPath = $this->SavedGroups[$alias]; - $value = $this->result; - foreach ($groupPath as $k) { - $value = $value[$k]; - } - } while (false); - return $value; - } - - function addArrayInline ($array, $indent) { - $CommonGroupPath = $this->path; - if (empty ($array)) return false; - - foreach ($array as $k => $_) { - $this->addArray(array($k => $_), $indent); - $this->path = $CommonGroupPath; - } - return true; - } - - function addArray ($incoming_data, $incoming_indent) { - - // print_r ($incoming_data); - - if (count ($incoming_data) > 1) - return $this->addArrayInline ($incoming_data, $incoming_indent); - - $key = key ($incoming_data); - $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; - if ($key === '__!YAMLZero') $key = '0'; - - if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. - if ($key || $key === '' || $key === '0') { - $this->result[$key] = $value; - } else { - $this->result[] = $value; end ($this->result); $key = key ($this->result); - } - $this->path[$incoming_indent] = $key; - return; - } - - - - $history = array(); - // Unfolding inner array tree. - $history[] = $_arr = $this->result; - foreach ($this->path as $k) { - $history[] = $_arr = $_arr[$k]; - } - - if ($this->_containsGroupAlias) { - $value = $this->referenceContentsByAlias($this->_containsGroupAlias); - $this->_containsGroupAlias = false; - } - - - // Adding string or numeric key to the innermost level or $this->arr. - if (is_string($key) && $key == '<<') { - if (!is_array ($_arr)) { $_arr = array (); } - $_arr = array_merge ($_arr, $value); - } else if ($key || $key === '' || $key === '0') { - $_arr[$key] = $value; - } else { - if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } - else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } - } - - $reverse_path = array_reverse($this->path); - $reverse_history = array_reverse ($history); - $reverse_history[0] = $_arr; - $cnt = count($reverse_history) - 1; - for ($i = 0; $i < $cnt; $i++) { - $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; - } - $this->result = $reverse_history[$cnt]; - - $this->path[$incoming_indent] = $key; - - if ($this->_containsGroupAnchor) { - $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; - if (is_array ($value)) { - $k = key ($value); - if (!is_int ($k)) { - $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; - } - } - $this->_containsGroupAnchor = false; - } - - } - - function startsLiteralBlock ($line) { - $lastChar = substr (trim($line), -1); - if ($lastChar != '>' && $lastChar != '|') return false; - if ($lastChar == '|') return $lastChar; - // HTML tags should not be counted as literal blocks. - if (preg_match ('#<.*?>$#', $line)) return false; - return $lastChar; - } - - function greedilyNeedNextLine($line) { - $line = trim ($line); - if (!strlen($line)) return false; - if (substr ($line, -1, 1) == ']') return false; - if ($line[0] == '[') return true; - if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; - return false; - } - - function addLiteralLine ($literalBlock, $line, $literalBlockStyle) { - $line = $this->stripIndent($line); - $line = rtrim ($line, "\r\n\t ") . "\n"; - if ($literalBlockStyle == '|') { - return $literalBlock . $line; - } - if (strlen($line) == 0) - return rtrim($literalBlock, ' ') . "\n"; - if ($line == "\n" && $literalBlockStyle == '>') { - return rtrim ($literalBlock, " \t") . "\n"; - } - if ($line != "\n") - $line = trim ($line, "\r\n ") . " "; - return $literalBlock . $line; - } - - function revertLiteralPlaceHolder ($lineArray, $literalBlock) { - foreach ($lineArray as $k => $_) { - if (is_array($_)) - $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); - else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) - $lineArray[$k] = rtrim ($literalBlock, " \r\n"); - } - return $lineArray; - } - - function stripIndent ($line, $indent = -1) { - if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); - return substr ($line, $indent); - } - - function getParentPathByIndent ($indent) { - if ($indent == 0) return array(); - $linePath = $this->path; - do { - end($linePath); $lastIndentInParentPath = key($linePath); - if ($indent <= $lastIndentInParentPath) array_pop ($linePath); - } while ($indent <= $lastIndentInParentPath); - return $linePath; - } - - - function clearBiggerPathValues ($indent) { - - - if ($indent == 0) $this->path = array(); - if (empty ($this->path)) return true; - - foreach ($this->path as $k => $_) { - if ($k > $indent) unset ($this->path[$k]); - } - - return true; - } - - - function isComment ($line) { - if (!$line) return false; - if ($line[0] == '#') return true; - if (trim($line, " \r\n\t") == '---') return true; - return false; - } - - function isEmpty ($line) { - return (trim ($line) === ''); - } - - - function isArrayElement ($line) { - if (!$line) return false; - if ($line[0] != '-') return false; - if (strlen ($line) > 3) - if (substr($line,0,3) == '---') return false; - - return true; - } - - function isHashElement ($line) { - return strpos($line, ':'); - } - - function isLiteral ($line) { - if ($this->isArrayElement($line)) return false; - if ($this->isHashElement($line)) return false; - return true; - } - - - function unquote ($value) { - if (!$value) return $value; - if (!is_string($value)) return $value; - if ($value[0] == '\'') return trim ($value, '\''); - if ($value[0] == '"') return trim ($value, '"'); - return $value; - } - - function startsMappedSequence ($line) { - return ($line[0] == '-' && substr ($line, -1, 1) == ':'); - } - - function returnMappedSequence ($line) { - $array = array(); - $key = $this->unquote(trim(substr($line,1,-1))); - $array[$key] = array(); - $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); - return array($array); - } - - function returnMappedValue ($line) { - $array = array(); - $key = $this->unquote (trim(substr($line,0,-1))); - $array[$key] = ''; - return $array; - } - - function startsMappedValue ($line) { - return (substr ($line, -1, 1) == ':'); - } - - function isPlainArray ($line) { - return ($line[0] == '[' && substr ($line, -1, 1) == ']'); - } - - function returnPlainArray ($line) { - return $this->_toType($line); - } - - function returnKeyValuePair ($line) { - $array = array(); - $key = ''; - if (strpos ($line, ':')) { - // It's a key/value pair most likely - // If the key is in double quotes pull it out - if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { - $value = trim(str_replace($matches[1],'',$line)); - $key = $matches[2]; - } else { - // Do some guesswork as to the key and the value - $explode = explode(':',$line); - $key = trim($explode[0]); - array_shift($explode); - $value = trim(implode(':',$explode)); - } - // Set the type of the value. Int, string, etc - $value = $this->_toType($value); - if ($key === '0') $key = '__!YAMLZero'; - $array[$key] = $value; - } else { - $array = array ($line); - } - return $array; - - } - - - function returnArrayElement ($line) { - if (strlen($line) <= 1) return array(array()); // Weird %) - $array = array(); - $value = trim(substr($line,1)); - $value = $this->_toType($value); - $array[] = $value; - return $array; - } - - - function nodeContainsGroup ($line) { - $symbolsForReference = 'A-z0-9_\-'; - if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) - if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; - if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; - if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; - return false; - - } - - function addGroup ($line, $group) { - if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); - if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); - //print_r ($this->path); - } - - function stripGroup ($line, $group) { - $line = trim(str_replace($group, '', $line)); - return $line; - } -} - -// Enable use of Spyc from command line -// The syntax is the following: php spyc.php spyc.yaml - -define ('SPYC_FROM_COMMAND_LINE', false); - -do { - if (!SPYC_FROM_COMMAND_LINE) break; - if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; - $file = $argv[1]; - printf ("Spyc loading file: %s\n", $file); - print_r (spyc_load_file ($file)); -} while (0); \ No newline at end of file diff --git a/src/spyc/php4/test.php4 b/src/spyc/php4/test.php4 deleted file mode 100644 index 315f501..0000000 --- a/src/spyc/php4/test.php4 +++ /dev/null @@ -1,162 +0,0 @@ - "1.5ghz", "ram" => "1 gig", - "os" => "os x 10.4.1")) - die('Sequence 4 failed'); - -# Mapped sequence -if ($yaml['domains'] != array("yaml.org", "php.net")) - die("Key: 'domains' failed"); - -# A sequence like this. -if ($yaml[5] != array("program" => "Adium", "platform" => "OS X", - "type" => "Chat Client")) - die('Sequence 5 failed'); - -# A folded block as a mapped value -if ($yaml['no time'] != "There isn't any time for your tricks!\nDo you understand?") - die("Key: 'no time' failed"); - -# A literal block as a mapped value -if ($yaml['some time'] != "There is nothing but time\nfor your tricks.") - die("Key: 'some time' failed"); - -# Crazy combinations -if ($yaml['databases'] != array( array("name" => "spartan", "notes" => - array( "Needs to be backed up", - "Needs to be normalized" ), - "type" => "mysql" ))) - die("Key: 'databases' failed"); - -# You can be a bit tricky -if ($yaml["if: you'd"] != "like") - die("Key: 'if: you\'d' failed"); - -# Inline sequences -if ($yaml[6] != array("One", "Two", "Three", "Four")) - die("Sequence 6 failed"); - -# Nested Inline Sequences -if ($yaml[7] != array("One", array("Two", "And", "Three"), "Four", "Five")) - die("Sequence 7 failed"); - -# Nested Nested Inline Sequences -if ($yaml[8] != array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), - "Seriously", array("Show", "Mercy"))) - die("Sequence 8 failed"); - -# Inline mappings -if ($yaml[9] != array("name" => "chris", "age" => "young", "brand" => "lucky strike")) - die("Sequence 9 failed"); - -# Nested inline mappings -if ($yaml[10] != array("name" => "mark", "age" => "older than chris", - "brand" => array("marlboro", "lucky strike"))) - die("Sequence 10 failed"); - -# References -- they're shaky, but functional -if ($yaml['dynamic languages'] != array('Perl', 'Python', 'PHP', 'Ruby')) - die("Key: 'dynamic languages' failed"); - -if ($yaml['compiled languages'] != array('C/C++', 'Java')) - die("Key: 'compiled languages' failed"); - -if ($yaml['all languages'] != array( - array('Perl', 'Python', 'PHP', 'Ruby'), - array('C/C++', 'Java') - )) - die("Key: 'all languages' failed"); - -# Added in .2.2: Escaped quotes -if ($yaml[11] != "you know, this shouldn't work. but it does.") - die("Sequence 11 failed."); - -if ($yaml[12] != "that's my value.") - die("Sequence 12 failed."); - -if ($yaml[13] != "again, that's my value.") - die("Sequence 13 failed."); - -if ($yaml[14] != "here's to \"quotes\", boss.") - die("Sequence 14 failed."); - -if ($yaml[15] != array( 'name' => "Foo, Bar's", 'age' => 20)) - die("Sequence 15 failed."); - -if ($yaml[16] != array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b")) - die("Sequence 16 failed."); - -if ($yaml['endloop'] != "Does this line in the end indeed make Spyc go to an infinite loop?") - die("[endloop] failed."); - - -print "spyc.yaml parsed correctly\n"; - -?> \ No newline at end of file diff --git a/src/spyc/spyc.php b/src/spyc/spyc.php deleted file mode 100644 index 8b67c82..0000000 --- a/src/spyc/spyc.php +++ /dev/null @@ -1,1046 +0,0 @@ - - * @author Chris Wanstrath - * @link http://code.google.com/p/spyc/ - * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @package Spyc - **/ - -if (!function_exists('spyc_load')) { - /** - * Parses YAML to array. - * @param string $string YAML string. - * @return array - */ - function spyc_load ($string) { - return Spyc::YAMLLoadString($string); - } -} - -if (!function_exists('spyc_load_file')) { - /** - * Parses YAML to array. - * @param string $file Path to YAML file. - * @return array - */ - function spyc_load_file ($file) { - return Spyc::YAMLLoad($file); - } -} - -/** -* The Simple PHP YAML Class. -* -* This class can be used to read a YAML file and convert its contents -* into a PHP array. It currently supports a very limited subsection of -* the YAML spec. -* -* Usage: -* -* $Spyc = new Spyc; -* $array = $Spyc->load($file); -* -* or: -* -* $array = Spyc::YAMLLoad($file); -* -* or: -* -* $array = spyc_load_file($file); -* -* @package Spyc -**/ -class Spyc { - - // SETTINGS - - const REMPTY = "\0\0\0\0\0"; - - /** - * Setting this to true will force YAMLDump to enclose any string value in - * quotes. False by default. - * - * @var bool - */ - public $setting_dump_force_quotes = false; - - /** - * Setting this to true will forse YAMLLoad to use syck_load function when - * possible. False by default. - * @var bool - */ - public $setting_use_syck_is_possible = false; - - - - /**#@+ - * @access private - * @var mixed - */ - private $_dumpIndent; - private $_dumpWordWrap; - private $_containsGroupAnchor = false; - private $_containsGroupAlias = false; - private $path; - private $result; - private $LiteralPlaceHolder = '___YAML_Literal_Block___'; - private $SavedGroups = array(); - private $indent; - /** - * Path modifier that should be applied after adding current element. - * @var array - */ - private $delayedPath = array(); - - /**#@+ - * @access public - * @var mixed - */ - public $_nodeId; - -/** - * Load a valid YAML string to Spyc. - * @param string $input - * @return array - */ - public function load ($input) { - return $this->__loadString($input); - } - - /** - * Load a valid YAML file to Spyc. - * @param string $file - * @return array - */ - public function loadFile ($file) { - return $this->__load($file); - } - - /** - * Load YAML into a PHP array statically - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. Pretty - * simple. - * Usage: - * - * $array = Spyc::YAMLLoad('lucky.yaml'); - * print_r($array); - * - * @access public - * @return array - * @param string $input Path of YAML file or string containing YAML - */ - public static function YAMLLoad($input) { - $Spyc = new Spyc; - return $Spyc->__load($input); - } - - /** - * Load a string of YAML into a PHP array statically - * - * The load method, when supplied with a YAML string, will do its best - * to convert YAML in a string into a PHP array. Pretty simple. - * - * Note: use this function if you don't want files from the file system - * loaded and processed as YAML. This is of interest to people concerned - * about security whose input is from a string. - * - * Usage: - * - * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); - * print_r($array); - * - * @access public - * @return array - * @param string $input String containing YAML - */ - public static function YAMLLoadString($input) { - $Spyc = new Spyc; - return $Spyc->__loadString($input); - } - - /** - * Dump YAML from PHP array statically - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as nothing.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - public static function YAMLDump($array,$indent = false,$wordwrap = false) { - $spyc = new Spyc; - return $spyc->dump($array,$indent,$wordwrap); - } - - - /** - * Dump PHP array to YAML - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as tasteful.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - public function dump($array,$indent = false,$wordwrap = false) { - // Dumps to some very clean YAML. We'll have to add some more features - // and options soon. And better support for folding. - - // New features and options. - if ($indent === false or !is_numeric($indent)) { - $this->_dumpIndent = 2; - } else { - $this->_dumpIndent = $indent; - } - - if ($wordwrap === false or !is_numeric($wordwrap)) { - $this->_dumpWordWrap = 40; - } else { - $this->_dumpWordWrap = $wordwrap; - } - - // New YAML document - $string = "---\n"; - - // Start at the base of the array and move through it. - if ($array) { - $array = (array)$array; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); - $previous_key = $key; - } - } - return $string; - } - - /** - * Attempts to convert a key / value array item to YAML - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { - if (is_array($value)) { - if (empty ($value)) - return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); - // It has children. What to do? - // Make it the right kind of item - $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); - // Add the indent - $indent += $this->_dumpIndent; - // Yamlize the array - $string .= $this->_yamlizeArray($value,$indent); - } elseif (!is_array($value)) { - // It doesn't have children. Yip. - $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); - } - return $string; - } - - /** - * Attempts to convert an array to YAML - * @access private - * @return string - * @param $array The array you want to convert - * @param $indent The indent of the current level - */ - private function _yamlizeArray($array,$indent) { - if (is_array($array)) { - $string = ''; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); - $previous_key = $key; - } - return $string; - } else { - return false; - } - } - - /** - * Returns YAML from a key and a value - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { - // do some folding here, for blocks - if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, ' ') !== false || - strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || - substr ($value, -1, 1) == ':') - ) { - $value = $this->_doLiteralBlock($value,$indent); - } else { - $value = $this->_doFolding($value,$indent); - } - - if ($value === array()) $value = '[ ]'; - if (in_array ($value, array ('true', 'TRUE', 'false', 'FALSE', 'y', 'Y', 'n', 'N', 'null', 'NULL'), true)) { - $value = $this->_doLiteralBlock($value,$indent); - } - if (trim ($value) != $value) - $value = $this->_doLiteralBlock($value,$indent); - - if (is_bool($value)) { - $value = ($value) ? "true" : "false"; - } - - if ($value === null) $value = 'null'; - if ($value === "'" . self::REMPTY . "'") $value = null; - - $spaces = str_repeat(' ',$indent); - - //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { - if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { - // It's a sequence - $string = $spaces.'- '.$value."\n"; - } else { - // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); - // It's mapped - if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } - $string = rtrim ($spaces.$key.': '.$value)."\n"; - } - return $string; - } - - /** - * Creates a literal block for dumping - * @access private - * @return string - * @param $value - * @param $indent int The value of the indent - */ - private function _doLiteralBlock($value,$indent) { - if ($value === "\n") return '\n'; - if (strpos($value, "\n") === false && strpos($value, "'") === false) { - return sprintf ("'%s'", $value); - } - if (strpos($value, "\n") === false && strpos($value, '"') === false) { - return sprintf ('"%s"', $value); - } - $exploded = explode("\n",$value); - $newValue = '|'; - $indent += $this->_dumpIndent; - $spaces = str_repeat(' ',$indent); - foreach ($exploded as $line) { - $newValue .= "\n" . $spaces . ($line); - } - return $newValue; - } - - /** - * Folds a string of text, if necessary - * @access private - * @return string - * @param $value The string you wish to fold - */ - private function _doFolding($value,$indent) { - // Don't do anything if wordwrap is set to 0 - - if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { - $indent += $this->_dumpIndent; - $indent = str_repeat(' ',$indent); - $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); - $value = ">\n".$indent.$wrapped; - } else { - if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) - $value = '"' . $value . '"'; - } - - - return $value; - } - -// LOADING FUNCTIONS - - private function __load($input) { - $Source = $this->loadFromSource($input); - return $this->loadWithSource($Source); - } - - private function __loadString($input) { - $Source = $this->loadFromString($input); - return $this->loadWithSource($Source); - } - - private function loadWithSource($Source) { - if (empty ($Source)) return array(); - if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ('', $Source)); - return is_array($array) ? $array : array(); - } - - $this->path = array(); - $this->result = array(); - - $cnt = count($Source); - for ($i = 0; $i < $cnt; $i++) { - $line = $Source[$i]; - - $this->indent = strlen($line) - strlen(ltrim($line)); - $tempPath = $this->getParentPathByIndent($this->indent); - $line = self::stripIndent($line, $this->indent); - if (self::isComment($line)) continue; - if (self::isEmpty($line)) continue; - $this->path = $tempPath; - - $literalBlockStyle = self::startsLiteralBlock($line); - if ($literalBlockStyle) { - $line = rtrim ($line, $literalBlockStyle . " \n"); - $literalBlock = ''; - $line .= $this->LiteralPlaceHolder; - $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); - while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { - $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); - } - $i--; - } - - while (++$i < $cnt && self::greedilyNeedNextLine($line)) { - $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); - } - $i--; - - - - if (strpos ($line, '#')) { - if (strpos ($line, '"') === false && strpos ($line, "'") === false) - $line = preg_replace('/\s+#(.+)$/','',$line); - } - - $lineArray = $this->_parseLine($line); - - if ($literalBlockStyle) - $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); - - $this->addArray($lineArray, $this->indent); - - foreach ($this->delayedPath as $indent => $delayedPath) - $this->path[$indent] = $delayedPath; - - $this->delayedPath = array(); - - } - return $this->result; - } - - private function loadFromSource ($input) { - if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - return file($input); - - return $this->loadFromString($input); - } - - private function loadFromString ($input) { - $lines = explode("\n",$input); - foreach ($lines as $k => $_) { - $lines[$k] = rtrim ($_, "\r"); - } - return $lines; - } - - /** - * Parses YAML code and returns an array for a node - * @access private - * @return array - * @param string $line A line from the YAML file - */ - private function _parseLine($line) { - if (!$line) return array(); - $line = trim($line); - if (!$line) return array(); - - $array = array(); - - $group = $this->nodeContainsGroup($line); - if ($group) { - $this->addGroup($line, $group); - $line = $this->stripGroup ($line, $group); - } - - if ($this->startsMappedSequence($line)) - return $this->returnMappedSequence($line); - - if ($this->startsMappedValue($line)) - return $this->returnMappedValue($line); - - if ($this->isArrayElement($line)) - return $this->returnArrayElement($line); - - if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - - return $this->returnKeyValuePair($line); - - } - - /** - * Finds the type of the passed value, returns the value as the new type. - * @access private - * @param string $value - * @return mixed - */ - private function _toType($value) { - if ($value === '') return null; - $first_character = $value[0]; - $last_character = substr($value, -1, 1); - - $is_quoted = false; - do { - if (!$value) break; - if ($first_character != '"' && $first_character != "'") break; - if ($last_character != '"' && $last_character != "'") break; - $is_quoted = true; - } while (0); - - if ($is_quoted) - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - - if (strpos($value, ' #') !== false && !$is_quoted) - $value = preg_replace('/\s+#(.+)$/','',$value); - - if (!$is_quoted) $value = str_replace('\n', "\n", $value); - - if ($first_character == '[' && $last_character == ']') { - // Take out strings sequences and mappings - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $value = array(); - foreach ($explode as $v) { - $value[] = $this->_toType($v); - } - return $value; - } - - if (strpos($value,': ')!==false && $first_character != '{') { - $array = explode(': ',$value); - $key = trim($array[0]); - array_shift($array); - $value = trim(implode(': ',$array)); - $value = $this->_toType($value); - return array($key => $value); - } - - if ($first_character == '{' && $last_character == '}') { - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - // Inline Mapping - // Take out strings sequences and mappings - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $array = array(); - foreach ($explode as $v) { - $SubArr = $this->_toType($v); - if (empty($SubArr)) continue; - if (is_array ($SubArr)) { - $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; - } - $array[] = $SubArr; - } - return $array; - } - - if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { - return null; - } - - if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ - $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) - $value = $intvalue; - return $value; - } - - if (in_array($value, - array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { - return true; - } - - if (in_array(strtolower($value), - array('false', 'off', '-', 'no', 'n'))) { - return false; - } - - if (is_numeric($value)) { - if ($value === '0') return 0; - if (rtrim ($value, 0) === $value) - $value = (float)$value; - return $value; - } - - return $value; - } - - /** - * Used in inlines to check for more inlines or quoted strings - * @access private - * @return array - */ - private function _inlineEscape($inline) { - // There's gotta be a cleaner way to do this... - // While pure sequences seem to be nesting just fine, - // pure mappings and mappings with sequences inside can't go very - // deep. This needs to be fixed. - - $seqs = array(); - $maps = array(); - $saved_strings = array(); - - // Check for strings - $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_strings = $strings[0]; - $inline = preg_replace($regex,'YAMLString',$inline); - } - unset($regex); - - $i = 0; - do { - - // Check for sequences - while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { - $seqs[] = $matchseqs[0]; - $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); - } - - // Check for mappings - while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { - $maps[] = $matchmaps[0]; - $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); - } - - if ($i++ >= 10) break; - - } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - - $explode = explode(', ',$inline); - $stringi = 0; $i = 0; - - while (1) { - - // Re-add the sequences - if (!empty($seqs)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - foreach ($seqs as $seqk => $seq) { - $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); - $value = $explode[$key]; - } - } - } - } - - // Re-add the mappings - if (!empty($maps)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLMap') !== false) { - foreach ($maps as $mapk => $map) { - $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); - $value = $explode[$key]; - } - } - } - } - - - // Re-add the strings - if (!empty($saved_strings)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLString') !== false) { - $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); - unset($saved_strings[$stringi]); - ++$stringi; - $value = $explode[$key]; - } - } - } - - $finished = true; - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLMap') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLString') !== false) { - $finished = false; break; - } - } - if ($finished) break; - - $i++; - if ($i > 10) - break; // Prevent infinite loops. - } - - return $explode; - } - - private function literalBlockContinues ($line, $lineIndent) { - if (!trim($line)) return true; - if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; - return false; - } - - private function referenceContentsByAlias ($alias) { - do { - if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } - $groupPath = $this->SavedGroups[$alias]; - $value = $this->result; - foreach ($groupPath as $k) { - $value = $value[$k]; - } - } while (false); - return $value; - } - - private function addArrayInline ($array, $indent) { - $CommonGroupPath = $this->path; - if (empty ($array)) return false; - - foreach ($array as $k => $_) { - $this->addArray(array($k => $_), $indent); - $this->path = $CommonGroupPath; - } - return true; - } - - private function addArray ($incoming_data, $incoming_indent) { - - // print_r ($incoming_data); - - if (count ($incoming_data) > 1) - return $this->addArrayInline ($incoming_data, $incoming_indent); - - $key = key ($incoming_data); - $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; - if ($key === '__!YAMLZero') $key = '0'; - - if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. - if ($key || $key === '' || $key === '0') { - $this->result[$key] = $value; - } else { - $this->result[] = $value; end ($this->result); $key = key ($this->result); - } - $this->path[$incoming_indent] = $key; - return; - } - - - - $history = array(); - // Unfolding inner array tree. - $history[] = $_arr = $this->result; - foreach ($this->path as $k) { - $history[] = $_arr = $_arr[$k]; - } - - if ($this->_containsGroupAlias) { - $value = $this->referenceContentsByAlias($this->_containsGroupAlias); - $this->_containsGroupAlias = false; - } - - - // Adding string or numeric key to the innermost level or $this->arr. - if (is_string($key) && $key == '<<') { - if (!is_array ($_arr)) { $_arr = array (); } - - $_arr = array_merge ($_arr, $value); - } else if ($key || $key === '' || $key === '0') { - if (!is_array ($_arr)) - $_arr = array ($key=>$value); - else - $_arr[$key] = $value; - } else { - if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } - else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } - } - - $reverse_path = array_reverse($this->path); - $reverse_history = array_reverse ($history); - $reverse_history[0] = $_arr; - $cnt = count($reverse_history) - 1; - for ($i = 0; $i < $cnt; $i++) { - $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; - } - $this->result = $reverse_history[$cnt]; - - $this->path[$incoming_indent] = $key; - - if ($this->_containsGroupAnchor) { - $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; - if (is_array ($value)) { - $k = key ($value); - if (!is_int ($k)) { - $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; - } - } - $this->_containsGroupAnchor = false; - } - - } - - private static function startsLiteralBlock ($line) { - $lastChar = substr (trim($line), -1); - if ($lastChar != '>' && $lastChar != '|') return false; - if ($lastChar == '|') return $lastChar; - // HTML tags should not be counted as literal blocks. - if (preg_match ('#<.*?>$#', $line)) return false; - return $lastChar; - } - - private static function greedilyNeedNextLine($line) { - $line = trim ($line); - if (!strlen($line)) return false; - if (substr ($line, -1, 1) == ']') return false; - if ($line[0] == '[') return true; - if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; - return false; - } - - private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { - $line = self::stripIndent($line, $indent); - if ($literalBlockStyle !== '|') { - $line = self::stripIndent($line); - } - $line = rtrim ($line, "\r\n\t ") . "\n"; - if ($literalBlockStyle == '|') { - return $literalBlock . $line; - } - if (strlen($line) == 0) - return rtrim($literalBlock, ' ') . "\n"; - if ($line == "\n" && $literalBlockStyle == '>') { - return rtrim ($literalBlock, " \t") . "\n"; - } - if ($line != "\n") - $line = trim ($line, "\r\n ") . " "; - return $literalBlock . $line; - } - - function revertLiteralPlaceHolder ($lineArray, $literalBlock) { - foreach ($lineArray as $k => $_) { - if (is_array($_)) - $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); - else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) - $lineArray[$k] = rtrim ($literalBlock, " \r\n"); - } - return $lineArray; - } - - private static function stripIndent ($line, $indent = -1) { - if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); - return substr ($line, $indent); - } - - private function getParentPathByIndent ($indent) { - if ($indent == 0) return array(); - $linePath = $this->path; - do { - end($linePath); $lastIndentInParentPath = key($linePath); - if ($indent <= $lastIndentInParentPath) array_pop ($linePath); - } while ($indent <= $lastIndentInParentPath); - return $linePath; - } - - - private function clearBiggerPathValues ($indent) { - - - if ($indent == 0) $this->path = array(); - if (empty ($this->path)) return true; - - foreach ($this->path as $k => $_) { - if ($k > $indent) unset ($this->path[$k]); - } - - return true; - } - - - private static function isComment ($line) { - if (!$line) return false; - if ($line[0] == '#') return true; - if (trim($line, " \r\n\t") == '---') return true; - return false; - } - - private static function isEmpty ($line) { - return (trim ($line) === ''); - } - - - private function isArrayElement ($line) { - if (!$line) return false; - if ($line[0] != '-') return false; - if (strlen ($line) > 3) - if (substr($line,0,3) == '---') return false; - - return true; - } - - private function isHashElement ($line) { - return strpos($line, ':'); - } - - private function isLiteral ($line) { - if ($this->isArrayElement($line)) return false; - if ($this->isHashElement($line)) return false; - return true; - } - - - private static function unquote ($value) { - if (!$value) return $value; - if (!is_string($value)) return $value; - if ($value[0] == '\'') return trim ($value, '\''); - if ($value[0] == '"') return trim ($value, '"'); - return $value; - } - - private function startsMappedSequence ($line) { - return ($line[0] == '-' && substr ($line, -1, 1) == ':'); - } - - private function returnMappedSequence ($line) { - $array = array(); - $key = self::unquote(trim(substr($line,1,-1))); - $array[$key] = array(); - $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); - return array($array); - } - - private function returnMappedValue ($line) { - $array = array(); - $key = self::unquote (trim(substr($line,0,-1))); - $array[$key] = ''; - return $array; - } - - private function startsMappedValue ($line) { - return (substr ($line, -1, 1) == ':'); - } - - private function isPlainArray ($line) { - return ($line[0] == '[' && substr ($line, -1, 1) == ']'); - } - - private function returnPlainArray ($line) { - return $this->_toType($line); - } - - private function returnKeyValuePair ($line) { - $array = array(); - $key = ''; - if (strpos ($line, ':')) { - // It's a key/value pair most likely - // If the key is in double quotes pull it out - if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { - $value = trim(str_replace($matches[1],'',$line)); - $key = $matches[2]; - } else { - // Do some guesswork as to the key and the value - $explode = explode(':',$line); - $key = trim($explode[0]); - array_shift($explode); - $value = trim(implode(':',$explode)); - } - // Set the type of the value. Int, string, etc - $value = $this->_toType($value); - if ($key === '0') $key = '__!YAMLZero'; - $array[$key] = $value; - } else { - $array = array ($line); - } - return $array; - - } - - - private function returnArrayElement ($line) { - if (strlen($line) <= 1) return array(array()); // Weird %) - $array = array(); - $value = trim(substr($line,1)); - $value = $this->_toType($value); - $array[] = $value; - return $array; - } - - - private function nodeContainsGroup ($line) { - $symbolsForReference = 'A-z0-9_\-'; - if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) - if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; - if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; - if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; - return false; - - } - - private function addGroup ($line, $group) { - if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); - if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); - //print_r ($this->path); - } - - private function stripGroup ($line, $group) { - $line = trim(str_replace($group, '', $line)); - return $line; - } -} - -// Enable use of Spyc from command line -// The syntax is the following: php spyc.php spyc.yaml - -define ('SPYC_FROM_COMMAND_LINE', false); - -do { - if (!SPYC_FROM_COMMAND_LINE) break; - if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; - $file = $argv[1]; - printf ("Spyc loading file: %s\n", $file); - print_r (spyc_load_file ($file)); -} while (0); \ No newline at end of file diff --git a/src/spyc/spyc.yaml b/src/spyc/spyc.yaml deleted file mode 100644 index 930149e..0000000 --- a/src/spyc/spyc.yaml +++ /dev/null @@ -1,203 +0,0 @@ -# -# S P Y C -# a simple php yaml class -# -# authors: [vlad andersen (vlad.andersen@gmail.com), chris wanstrath (chris@ozmm.org)] -# websites: [http://www.yaml.org, http://spyc.sourceforge.net/] -# license: [MIT License, http://www.opensource.org/licenses/mit-license.php] -# copyright: (c) 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen -# -# spyc.yml - A file containing the YAML that Spyc understands. - ---- - -# Mappings - with proper types -String: Anyone's name, really. -Int: 13 -True: true -False: false -Zero: 0 -Null: NULL -NotNull: 'null' -NotTrue: 'y' -NotBoolTrue: 'true' -NotInt: '5' -Float: 5.34 -Negative: -90 -SmallFloat: 0.7 -NewLine: \n - -# A sequence -- PHP Class -- Basic YAML Loader -- Very Basic YAML Dumper - -# A sequence of a sequence -- - - YAML is so easy to learn. - - Your config files will never be the same. - -# Sequence of mappings -- - cpu: 1.5ghz - ram: 1 gig - os : os x 10.4.1 - -# Mapped sequence -domains: - - yaml.org - - php.net - -# A sequence like this. -- program: Adium - platform: OS X - type: Chat Client - -# A folded block as a mapped value -no time: > - There isn't any time - for your tricks! - - Do you understand? - -# A literal block as a mapped value -some time: | - There is nothing but time - for your tricks. - -# Crazy combinations -databases: - - name: spartan - notes: - - Needs to be backed up - - Needs to be normalized - type: mysql - -# You can be a bit tricky -"if: you'd": like - -# Inline sequences -- [One, Two, Three, Four] - -# Nested Inline Sequences -- [One, [Two, And, Three], Four, Five] - -# Nested Nested Inline Sequences -- [This, [Is, Getting, [Ridiculous, Guys]], Seriously, [Show, Mercy]] - -# Inline mappings -- {name: chris, age: young, brand: lucky strike} - -# Nested inline mappings -- {name: mark, age: older than chris, brand: [marlboro, lucky strike]} - -# References -- they're shaky, but functional -dynamic languages: &DLANGS - - Perl - - Python - - PHP - - Ruby -compiled languages: &CLANGS - - C/C++ - - Java -all languages: - - *DLANGS - - *CLANGS - -# Added in .2.2: Escaped quotes -- you know, this shouldn't work. but it does. -- 'that''s my value.' -- 'again, that\'s my value.' -- "here's to \"quotes\", boss." - -# added in .2.3 -- {name: "Foo, Bar's", age: 20} - -# Added in .2.4: bug [ 1418193 ] Quote Values in Nested Arrays -- [a, ['1', "2"], b] - -# Added in .2.4: malformed YAML -all - javascripts: [dom1.js, dom.js] - -# Added in .2 -1040: Ooo, a numeric key! # And working comments? Wow! Colons in comments: a menace (0.3). - -hash_1: Hash #and a comment -hash_2: "Hash #and a comment" -"hash#3": "Hash (#) can appear in key too" - -float_test: 1.0 -float_test_with_quotes: '1.0' -float_inverse_test: 001 - -a_really_large_number: 115792089237316195423570985008687907853269984665640564039457584007913129639936 # 2^256 - -int array: [ 1, 2, 3 ] - -array on several lines: - [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ] - -morelesskey: "" - -array_of_zero: [0] -sophisticated_array_of_zero: {rx: {tx: [0]} } - -switches: - - { row: 0, col: 0, func: {tx: [0, 1]} } - -empty_sequence: [ ] -empty_hash: { } - -special_characters: "[{]]{{]]" - -asterisks: "*" - -empty_key: - : - key: value - -trailing_colon: "foo:" - -multiline_items: - - type: SomeItem - values: [blah, blah, blah, - blah] - ints: [2, 54, 12, - 2143] - -many_lines: | - A quick - fox - - - jumped - over - - - - - - a lazy - - - - dog - - -werte: - 1: nummer 1 - 0: Stunde 0 - -noindent_records: -- record1: value1 -- record2: value2 - -"a:1": [1000] -"a:2": - - 2000 - -# [Endloop] -endloop: | - Does this line in the end indeed make Spyc go to an infinite loop? \ No newline at end of file diff --git a/src/spyc/tests/DumpTest.php b/src/spyc/tests/DumpTest.php deleted file mode 100644 index 0b9e5fa..0000000 --- a/src/spyc/tests/DumpTest.php +++ /dev/null @@ -1,130 +0,0 @@ -files_to_test = array ('../spyc.yaml', 'failing1.yaml', 'indent_1.yaml', 'quotes.yaml'); - } - - public function testDump() { - foreach ($this->files_to_test as $file) { - $yaml = spyc_load(file_get_contents($file)); - $dump = Spyc::YAMLDump ($yaml); - $yaml_after_dump = Spyc::YAMLLoad ($dump); - $this->assertEquals ($yaml, $yaml_after_dump); - } - } - - public function testDumpWithQuotes() { - $Spyc = new Spyc(); - $Spyc->setting_dump_force_quotes = true; - foreach ($this->files_to_test as $file) { - $yaml = $Spyc->load(file_get_contents($file)); - $dump = $Spyc->dump ($yaml); - $yaml_after_dump = Spyc::YAMLLoad ($dump); - $this->assertEquals ($yaml, $yaml_after_dump); - } - } - - public function testDumpArrays() { - $dump = Spyc::YAMLDump(array ('item1', 'item2', 'item3')); - $awaiting = "---\n- item1\n- item2\n- item3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testNull() { - $dump = Spyc::YAMLDump(array('a' => 1, 'b' => null, 'c' => 3)); - $awaiting = "---\na: 1\nb: null\nc: 3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testNext() { - $array = array("aaa", "bbb", "ccc"); - #set arrays internal pointer to next element - next($array); - $dump = Spyc::YAMLDump($array); - $awaiting = "---\n- aaa\n- bbb\n- ccc\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpingMixedArrays() { - $array = array(); - $array[] = 'Sequence item'; - $array['The Key'] = 'Mapped value'; - $array[] = array('A sequence','of a sequence'); - $array[] = array('first' => 'A sequence','second' => 'of mapped values'); - $array['Mapped'] = array('A sequence','which is mapped'); - $array['A Note'] = 'What if your text is too long?'; - $array['Another Note'] = 'If that is the case, the dumper will probably fold your text by using a block. Kinda like this.'; - $array['The trick?'] = 'The trick is that we overrode the default indent, 2, to 4 and the default wordwrap, 40, to 60.'; - $array['Old Dog'] = "And if you want\n to preserve line breaks, \ngo ahead!"; - $array['key:withcolon'] = "Should support this to"; - - $yaml = Spyc::YAMLDump($array,4,60); - } - - public function testMixed() { - $dump = Spyc::YAMLDump(array(0 => 1, 'b' => 2, 1 => 3)); - $awaiting = "---\n0: 1\nb: 2\n1: 3\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpNumerics() { - $dump = Spyc::YAMLDump(array ('404', '405', '500')); - $awaiting = "---\n- 404\n- 405\n- 500\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpAsterisks() { - $dump = Spyc::YAMLDump(array ('*')); - $awaiting = "---\n- '*'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpAmpersands() { - $dump = Spyc::YAMLDump(array ('some' => '&foo')); - $awaiting = "---\nsome: '&foo'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpExclamations() { - $dump = Spyc::YAMLDump(array ('some' => '!foo')); - $awaiting = "---\nsome: '!foo'\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpExclamations2() { - $dump = Spyc::YAMLDump(array ('some' => 'foo!')); - $awaiting = "---\nsome: foo!\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpApostrophes() { - $dump = Spyc::YAMLDump(array ('some' => "'Biz' pimpt bedrijventerreinen")); - $awaiting = "---\nsome: \"'Biz' pimpt bedrijventerreinen\"\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testDumpNumericHashes() { - $dump = Spyc::YAMLDump(array ("titel"=> array("0" => "", 1 => "Dr.", 5 => "Prof.", 6 => "Prof. Dr."))); - $awaiting = "---\ntitel:\n 0:\n 1: Dr.\n 5: Prof.\n 6: Prof. Dr.\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testEmpty() { - $dump = Spyc::YAMLDump(array("foo" => array())); - $awaiting = "---\nfoo: [ ]\n"; - $this->assertEquals ($awaiting, $dump); - } - - public function testHashesInKeys() { - $dump = Spyc::YAMLDump(array ('#color' => '#ffffff')); - $awaiting = "---\n\"#color\": '#ffffff'\n"; - $this->assertEquals ($awaiting, $dump); - } - -} \ No newline at end of file diff --git a/src/spyc/tests/IndentTest.php b/src/spyc/tests/IndentTest.php deleted file mode 100644 index 5b6dc86..0000000 --- a/src/spyc/tests/IndentTest.php +++ /dev/null @@ -1,65 +0,0 @@ -Y = Spyc::YAMLLoad("indent_1.yaml"); - } - - public function testIndent_1() { - $this->assertEquals (array ('child_1' => 2, 'child_2' => 0, 'child_3' => 1), $this->Y['root']); - } - - public function testIndent_2() { - $this->assertEquals (array ('child_1' => 1, 'child_2' => 2), $this->Y['root2']); - } - - public function testIndent_3() { - $this->assertEquals (array (array ('resolutions' => array (1024 => 768, 1920 => 1200), 'producer' => 'Nec')), $this->Y['display']); - } - - public function testIndent_4() { - $this->assertEquals (array ( - array ('resolutions' => array (1024 => 768)), - array ('resolutions' => array (1920 => 1200)), - ), $this->Y['displays']); - } - - public function testIndent_5() { - $this->assertEquals (array (array ( - 'row' => 0, - 'col' => 0, - 'headsets_affected' => array ( - array ( - 'ports' => array (0), - 'side' => 'left', - ) - ), - 'switch_function' => array ( - 'ics_ptt' => true - ) - )), $this->Y['nested_hashes_and_seqs']); - } - - public function testIndent_6() { - $this->assertEquals (array ( - 'h' => array ( - array ('a' => 'b', 'a1' => 'b1'), - array ('c' => 'd') - ) - ), $this->Y['easier_nest']); - } - - public function testIndent_space() { - $this->assertEquals ("By four\n spaces", $this->Y['one_space']); - } - - public function testListAndComment() { - $this->assertEquals (array ('one', 'two', 'three'), $this->Y['list_and_comment']); - } - -} \ No newline at end of file diff --git a/src/spyc/tests/ParseTest.php b/src/spyc/tests/ParseTest.php deleted file mode 100644 index f7045bd..0000000 --- a/src/spyc/tests/ParseTest.php +++ /dev/null @@ -1,322 +0,0 @@ -yaml = spyc_load_file('../spyc.yaml'); - } - - public function testMergeHashKeys() { - $Expected = array ( - array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '1mm')), - array ('step' => array('instrument' => 'Lasik 2000', 'pulseEnergy' => 5.4, 'pulseDuration' => 12, 'repetition' => 1000, 'spotSize' => '2mm')), - ); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['steps']); - } - - public function testDeathMasks() { - $Expected = array ('sad' => 2, 'magnificent' => 4); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['death masks are']); - } - - public function testDevDb() { - $Expected = array ('adapter' => 'mysql', 'host' => 'localhost', 'database' => 'rails_dev'); - $Actual = spyc_load_file ('indent_1.yaml'); - $this->assertEquals ($Expected, $Actual['development']); - } - - public function testNumericKey() { - $this->assertEquals ("Ooo, a numeric key!", $this->yaml[1040]); - } - - public function testMappingsString() { - $this->assertEquals ("Anyone's name, really.", $this->yaml['String']); - } - - public function testMappingsInt() { - $this->assertSame (13, $this->yaml['Int']); - } - - public function testMappingsBooleanTrue() { - $this->assertSame (true, $this->yaml['True']); - } - - public function testMappingsBooleanFalse() { - $this->assertSame (false, $this->yaml['False']); - } - - public function testMappingsZero() { - $this->assertSame (0, $this->yaml['Zero']); - } - - public function testMappingsNull() { - $this->assertSame (null, $this->yaml['Null']); - } - - public function testMappingsNotNull() { - $this->assertSame ('null', $this->yaml['NotNull']); - } - - public function testMappingsFloat() { - $this->assertSame (5.34, $this->yaml['Float']); - } - - public function testMappingsNegative() { - $this->assertSame (-90, $this->yaml['Negative']); - } - - public function testMappingsSmallFloat() { - $this->assertSame (0.7, $this->yaml['SmallFloat']); - } - - public function testNewline() { - $this->assertSame ("\n", $this->yaml['NewLine']); - } - - - public function testSeq0() { - $this->assertEquals ("PHP Class", $this->yaml[0]); - } - - public function testSeq1() { - $this->assertEquals ("Basic YAML Loader", $this->yaml[1]); - } - - public function testSeq2() { - $this->assertEquals ("Very Basic YAML Dumper", $this->yaml[2]); - } - - public function testSeq3() { - $this->assertEquals (array("YAML is so easy to learn.", - "Your config files will never be the same."), $this->yaml[3]); - } - - public function testSeqMap() { - $this->assertEquals (array("cpu" => "1.5ghz", "ram" => "1 gig", - "os" => "os x 10.4.1"), $this->yaml[4]); - } - - public function testMappedSequence() { - $this->assertEquals (array("yaml.org", "php.net"), $this->yaml['domains']); - } - - public function testAnotherSequence() { - $this->assertEquals (array("program" => "Adium", "platform" => "OS X", - "type" => "Chat Client"), $this->yaml[5]); - } - - public function testFoldedBlock() { - $this->assertEquals ("There isn't any time for your tricks!\nDo you understand?", $this->yaml['no time']); - } - - public function testLiteralAsMapped() { - $this->assertEquals ("There is nothing but time\nfor your tricks.", $this->yaml['some time']); - } - - public function testCrazy() { - $this->assertEquals (array( array("name" => "spartan", "notes" => - array( "Needs to be backed up", - "Needs to be normalized" ), - "type" => "mysql" )), $this->yaml['databases']); - } - - public function testColons() { - $this->assertEquals ("like", $this->yaml["if: you'd"]); - } - - public function testInline() { - $this->assertEquals (array("One", "Two", "Three", "Four"), $this->yaml[6]); - } - - public function testNestedInline() { - $this->assertEquals (array("One", array("Two", "And", "Three"), "Four", "Five"), $this->yaml[7]); - } - - public function testNestedNestedInline() { - $this->assertEquals (array( "This", array("Is", "Getting", array("Ridiculous", "Guys")), - "Seriously", array("Show", "Mercy")), $this->yaml[8]); - } - - public function testInlineMappings() { - $this->assertEquals (array("name" => "chris", "age" => "young", "brand" => "lucky strike"), $this->yaml[9]); - } - - public function testNestedInlineMappings() { - $this->assertEquals (array("name" => "mark", "age" => "older than chris", - "brand" => array("marlboro", "lucky strike")), $this->yaml[10]); - } - - public function testReferences() { - $this->assertEquals (array('Perl', 'Python', 'PHP', 'Ruby'), $this->yaml['dynamic languages']); - } - - public function testReferences2() { - $this->assertEquals (array('C/C++', 'Java'), $this->yaml['compiled languages']); - } - - public function testReferences3() { - $this->assertEquals (array( - array('Perl', 'Python', 'PHP', 'Ruby'), - array('C/C++', 'Java') - ), $this->yaml['all languages']); - } - - public function testEscapedQuotes() { - $this->assertEquals ("you know, this shouldn't work. but it does.", $this->yaml[11]); - } - - public function testEscapedQuotes_2() { - $this->assertEquals ( "that's my value.", $this->yaml[12]); - } - - public function testEscapedQuotes_3() { - $this->assertEquals ("again, that's my value.", $this->yaml[13]); - } - - public function testQuotes() { - $this->assertEquals ("here's to \"quotes\", boss.", $this->yaml[14]); - } - - public function testQuoteSequence() { - $this->assertEquals ( array( 'name' => "Foo, Bar's", 'age' => 20), $this->yaml[15]); - } - - public function testShortSequence() { - $this->assertEquals (array( 0 => "a", 1 => array (0 => 1, 1 => 2), 2 => "b"), $this->yaml[16]); - } - - public function testHash_1() { - $this->assertEquals ("Hash", $this->yaml['hash_1']); - } - - public function testHash_2() { - $this->assertEquals ('Hash #and a comment', $this->yaml['hash_2']); - } - - public function testHash_3() { - $this->assertEquals ('Hash (#) can appear in key too', $this->yaml['hash#3']); - } - - public function testEndloop() { - $this->assertEquals ("Does this line in the end indeed make Spyc go to an infinite loop?", $this->yaml['endloop']); - } - - public function testReallyLargeNumber() { - $this->assertEquals ('115792089237316195423570985008687907853269984665640564039457584007913129639936', $this->yaml['a_really_large_number']); - } - - public function testFloatWithZeros() { - $this->assertSame ('1.0', $this->yaml['float_test']); - } - - public function testFloatWithQuotes() { - $this->assertSame ('1.0', $this->yaml['float_test_with_quotes']); - } - - public function testFloatInverse() { - $this->assertEquals ('001', $this->yaml['float_inverse_test']); - } - - public function testIntArray() { - $this->assertEquals (array (1, 2, 3), $this->yaml['int array']); - } - - public function testArrayOnSeveralLines() { - $this->assertEquals (array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), $this->yaml['array on several lines']); - } - - public function testmoreLessKey() { - $this->assertEquals ('', $this->yaml['morelesskey']); - } - - public function testArrayOfZero() { - $this->assertSame (array(0), $this->yaml['array_of_zero']); - } - - public function testSophisticatedArrayOfZero() { - $this->assertSame (array('rx' => array ('tx' => array (0))), $this->yaml['sophisticated_array_of_zero']); - } - - public function testSwitches() { - $this->assertEquals (array (array ('row' => 0, 'col' => 0, 'func' => array ('tx' => array(0, 1)))), $this->yaml['switches']); - } - - public function testEmptySequence() { - $this->assertSame (array(), $this->yaml['empty_sequence']); - } - - public function testEmptyHash() { - $this->assertSame (array(), $this->yaml['empty_hash']); - } - - public function testEmptykey() { - $this->assertSame (array('' => array ('key' => 'value')), $this->yaml['empty_key']); - } - - public function testMultilines() { - $this->assertSame (array(array('type' => 'SomeItem', 'values' => array ('blah', 'blah', 'blah', 'blah'), 'ints' => array(2, 54, 12, 2143))), $this->yaml['multiline_items']); - } - - public function testManyNewlines() { - $this->assertSame ('A quick -fox - - -jumped -over - - - - - -a lazy - - - -dog', $this->yaml['many_lines']); - } - - public function testWerte() { - $this->assertSame (array ('1' => 'nummer 1', '0' => 'Stunde 0'), $this->yaml['werte']); - } - - /* public function testNoIndent() { - $this->assertSame (array( - array ('record1'=>'value1'), - array ('record2'=>'value2') - ) - , $this->yaml['noindent_records']); - } */ - - public function testColonsInKeys() { - $this->assertSame (array (1000), $this->yaml['a:1']); - } - - public function testColonsInKeys2() { - $this->assertSame (array (2000), $this->yaml['a:2']); - } - - public function testSpecialCharacters() { - $this->assertSame ('[{]]{{]]', $this->yaml['special_characters']); - } - - public function testAngleQuotes() { - $Quotes = Spyc::YAMLLoad('quotes.yaml'); - $this->assertEquals (array ('html_tags' => array ('
', '

'), 'html_content' => array ('

hello world

', 'hello
world'), 'text_content' => array ('hello world')), - $Quotes); - } - - public function testFailingColons() { - $Failing = Spyc::YAMLLoad('failing1.yaml'); - $this->assertSame (array ('MyObject' => array ('Prop1' => array ('key1:val1'))), - $Failing); - } - -} \ No newline at end of file diff --git a/src/spyc/tests/RoundTripTest.php b/src/spyc/tests/RoundTripTest.php deleted file mode 100644 index 4a906e2..0000000 --- a/src/spyc/tests/RoundTripTest.php +++ /dev/null @@ -1,61 +0,0 @@ - $a))); } - - -class RoundTripTest extends PHPUnit_Framework_TestCase { - - protected function setUp() { - } - - public function testNull() { - $this->assertEquals (array ('x' => null), roundTrip (null)); - } - - public function testY() { - $this->assertEquals (array ('x' => 'y'), roundTrip ('y')); - } - - public function testExclam() { - $this->assertEquals (array ('x' => '!yeah'), roundTrip ('!yeah')); - } - - public function test5() { - $this->assertEquals (array ('x' => '5'), roundTrip ('5')); - } - - public function testSpaces() { - $this->assertEquals (array ('x' => 'x '), roundTrip ('x ')); - } - - public function testApostrophes() { - $this->assertEquals (array ('x' => "'biz'"), roundTrip ("'biz'")); - } - - public function testNewLines() { - $this->assertEquals (array ('x' => "\n"), roundTrip ("\n")); - } - - public function testHashes() { - $this->assertEquals (array ('x' => array ("#color" => '#fff')), roundTrip (array ("#color" => '#fff'))); - } - - public function testWordWrap() { - $this->assertEquals (array ('x' => "aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), roundTrip ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); - } - - public function testABCD() { - $this->assertEquals (array ('a', 'b', 'c', 'd'), Spyc::YAMLLoad(Spyc::YAMLDump(array('a', 'b', 'c', 'd')))); - } - - public function testABCD2() { - $a = array('a', 'b', 'c', 'd'); // Create a simple list - $b = Spyc::YAMLDump($a); // Dump the list as YAML - $c = Spyc::YAMLLoad($b); // Load the dumped YAML - $d = Spyc::YAMLDump($c); // Re-dump the data - $this->assertSame($b, $d); - } - -} \ No newline at end of file diff --git a/src/spyc/tests/failing1.yaml b/src/spyc/tests/failing1.yaml deleted file mode 100644 index 6906a51..0000000 --- a/src/spyc/tests/failing1.yaml +++ /dev/null @@ -1,2 +0,0 @@ -MyObject: - Prop1: {key1:val1} \ No newline at end of file diff --git a/src/spyc/tests/indent_1.yaml b/src/spyc/tests/indent_1.yaml deleted file mode 100644 index 85a0b59..0000000 --- a/src/spyc/tests/indent_1.yaml +++ /dev/null @@ -1,59 +0,0 @@ -root: - child_1: 2 - - child_2: 0 - child_3: 1 - -root2: - child_1: 1 -# A comment - child_2: 2 - -displays: - - resolutions: - 1024: 768 - - resolutions: - 1920: 1200 - -display: - - resolutions: - 1024: 768 - 1920: 1200 - producer: "Nec" - -nested_hashes_and_seqs: - - { row: 0, col: 0, headsets_affected: [{ports: [0], side: left}], switch_function: {ics_ptt: true} } - -easier_nest: { h: [{a: b, a1: b1}, {c: d}] } - -one_space: | - By four - spaces - -steps: - - step: &id001 - instrument: Lasik 2000 - pulseEnergy: 5.4 - pulseDuration: 12 - repetition: 1000 - spotSize: 1mm - - step: - <<: *id001 - spotSize: 2mm - -death masks are: - sad: 2 - <<: {magnificent: 4} - -login: &login - adapter: mysql - host: localhost - -development: - database: rails_dev - <<: *login - -"key": "value:" -colon_only: ":" - -list_and_comment: [one, two, three] # comment \ No newline at end of file diff --git a/src/spyc/tests/quotes.yaml b/src/spyc/tests/quotes.yaml deleted file mode 100644 index 2ceea86..0000000 --- a/src/spyc/tests/quotes.yaml +++ /dev/null @@ -1,8 +0,0 @@ -html_tags: - -
- -

-html_content: - -

hello world

- - hello
world -text_content: - - hello world \ No newline at end of file diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php new file mode 100644 index 0000000..728f2cb --- /dev/null +++ b/tests/Bootstrap.php @@ -0,0 +1,5 @@ +to_array(); - $expected = array('foo'=>'bar', 'bar'=>'foo'); - $this->assertEquals($expected, $result); - } - - /** - * A basic functional test for Array to JSON conversion - * - * @return void - */ - public function testArrayToJson() { - $data = array('foo'=>'bar', 'bar'=>'foo'); - $result = Formatter::make($data)->to_json(); - $expected = '{"foo":"bar","bar":"foo"}'; - $this->assertEquals($expected, $result); - } - - /** - * A basic functional test for testJSONToXMLToArrayToJsonToArray data to array - * - * @return void - */ - public function testJSONToXMLToArrayToJsonToArray() { - $data = '{"foo":"bar","bar":"foo"}'; - $result = Formatter::make($data, 'json')->to_xml(); - $result = Formatter::make($result, 'xml')->to_array(); - $result = Formatter::make($result, 'array')->to_json(); - $result = Formatter::make($result, 'json')->to_array(); - $expected = array('foo'=>'bar', 'bar'=>'foo'); - $this->assertEquals($expected, $result); - } - - /** - * A basic functional test for CSV data to array - * - * @return void - */ - public function testCSVToArray() { - $data = 'foo,bar,bing,bam,boom'; - $result = Formatter::make($data, 'csv')->to_array(); - $expected = array('foo','bar','bing','bam','boom'); - $this->assertEquals($expected, $result); - } - - /** - * A complex multi-dimentional test for CSV data to array - * - * @return void - */ - public function testComplexCSVToArray() { -/* - $data = ' - { - "simple":"118", - "date":"2014-05-20 21:03:59.333", - "time":"4067", - "duration_onset":null, - "devicename":"My Device", - "calc_data":[ - [ - 1400609039, - 0, - 37, - 0, - 0, - 1 - ], - [ - 1400609039, - 0, - 37, - 0, - 0, - 1 - ] - ] - } - '; - - $result = Formatter::make($data, 'json')->to_csv(); - - dd($result); -*/ - $this->assertEquals(true,true); - } - -} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..8b16b03 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,17 @@ + Date: Sun, 19 Oct 2014 12:28:21 -0400 Subject: [PATCH 35/73] Add constants for formats --- src/SoapBox/Formatter/Formatter.php | 11 +++++++++ tests/unit/FormatterTest.php | 35 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/SoapBox/Formatter/Formatter.php create mode 100644 tests/unit/FormatterTest.php diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php new file mode 100644 index 0000000..9be5d2d --- /dev/null +++ b/src/SoapBox/Formatter/Formatter.php @@ -0,0 +1,11 @@ +assertEquals($expected, $actual); + } + + public function testFormatterProvidesJsonConstant() { + $expected = 'json'; + $actual = Formatter::Json; + + $this->assertEquals($expected, $actual); + } + + public function testFormatterProvidesXmlConstant() { + $expected = 'xml'; + $actual = Formatter::Xml; + + $this->assertEquals($expected, $actual); + } + + public function testFormatterProvidesArrayConstant() { + $expected = 'array'; + $actual = Formatter::Arr; + + $this->assertEquals($expected, $actual); + } + +} From a09e3db0e348d62e784d43b9f8132299f682b51f Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 13:58:43 -0400 Subject: [PATCH 36/73] Add Formatter::make --- composer.json | 4 +--- src/SoapBox/Formatter/Formatter.php | 16 ++++++++++++++++ src/config/.gitkeep | 0 src/lang/.gitkeep | 0 tests/unit/FormatterTest.php | 7 +++++++ 5 files changed, 24 insertions(+), 3 deletions(-) delete mode 100644 src/config/.gitkeep delete mode 100644 src/lang/.gitkeep diff --git a/composer.json b/composer.json index 047cc69..7bf2d59 100644 --- a/composer.json +++ b/composer.json @@ -19,9 +19,7 @@ } ], "require": { - "php": ">=5.3.0", - "illuminate/support": ">=4.0", - "illuminate/config": ">=4.0" + "php": ">=5.3.0" }, "autoload": { "psr-0": { diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 9be5d2d..84acedd 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -1,5 +1,7 @@ assertEquals($expected, $actual); } + /** + * @expectedException InvalidArgumentException + */ + public function testFormatterMakeThrowsInvalidTypeException() { + $formatter = Formatter::make('', 'blue'); + } + } From 956c715d35e81f879b8571df6c8391e8eca2f7ed Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:06:55 -0400 Subject: [PATCH 37/73] Add private constructor for Formatter --- src/SoapBox/Formatter/Formatter.php | 9 +++++++++ tests/unit/FormatterTest.php | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 84acedd..9ae870d 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -11,6 +11,8 @@ class Formatter { const Xml = 'xml'; const Arr = 'array'; + private static $supportedTypes = [self::Csv, self::Json, self::Xml, self::Arr]; + /** * Make: Returns an instance of formatter initialized with data and type * @@ -20,8 +22,15 @@ class Formatter { * @return Formatter */ public static function make($data, $type) { + if (in_array($type, self::$supportedTypes)) { + return new Formatter($data, $type); + } throw new InvalidArgumentException( 'make function only accepts [csv, json, xml, array] for $type but ' . $type . ' was provided.' ); } + + private function __construct($data, $type) { + + } } diff --git a/tests/unit/FormatterTest.php b/tests/unit/FormatterTest.php index 9363d7b..fa86ae5 100644 --- a/tests/unit/FormatterTest.php +++ b/tests/unit/FormatterTest.php @@ -39,4 +39,9 @@ public function testFormatterMakeThrowsInvalidTypeException() { $formatter = Formatter::make('', 'blue'); } + public function testFormatterMakeReturnsInstanceOfFormatter() { + $formatter = Formatter::make('', Formatter::Csv); + $this->assertTrue($formatter instanceof Formatter); + } + } From 81a9ed7e8cd82042e554fb6b38c2d630fa9b761a Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:12:58 -0400 Subject: [PATCH 38/73] Add interface for parsers --- .../Formatter/Parsers/ParserInterface.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/SoapBox/Formatter/Parsers/ParserInterface.php diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php new file mode 100644 index 0000000..fa6c1ad --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -0,0 +1,18 @@ + Date: Sun, 19 Oct 2014 14:21:21 -0400 Subject: [PATCH 39/73] Add outline for CsvParser --- src/SoapBox/Formatter/Parsers/CsvParser.php | 12 ++++++++++++ src/SoapBox/Formatter/Parsers/ParserInterface.php | 13 ++++++++++--- tests/unit/Parsers/CsvParserTest.php | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/SoapBox/Formatter/Parsers/CsvParser.php create mode 100644 tests/unit/Parsers/CsvParserTest.php diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php new file mode 100644 index 0000000..e80c8b1 --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -0,0 +1,12 @@ +data = $data; + } + + public function asObject() { + } + +} diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php index fa6c1ad..a6ee099 100644 --- a/src/SoapBox/Formatter/Parsers/ParserInterface.php +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -7,12 +7,19 @@ * inputs to the object type. */ interface ParserInterface { + /** - * asObject takes in $data and transforms it into a php object + * Constructor is used to initialize the parser * - * @param mixed $data The input sharing a type with the parser. + * @param mixed $data The input sharing a type with the parser + */ + public function __construct($data); + + /** + * asObject takes in $data and transforms it into a php object * * @return stdClass An object representation of the input data. */ - public function asObject($data); + public function asObject(); + } diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php new file mode 100644 index 0000000..c65c498 --- /dev/null +++ b/tests/unit/Parsers/CsvParserTest.php @@ -0,0 +1,14 @@ +assertTrue($parser instanceof ParserInterface); + } + +} From eaaeee528ae2de1df50daaed7bd9aacb72179c55 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:37:17 -0400 Subject: [PATCH 40/73] Update CsvParser and interface --- composer.json | 3 ++- src/SoapBox/Formatter/Formatter.php | 19 +++++++++++++++++-- src/SoapBox/Formatter/Parsers/CsvParser.php | 9 +++++---- .../Formatter/Parsers/ParserInterface.php | 7 ------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 7bf2d59..456eaf5 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=5.3.0", + "league/csv": "~6.0" }, "autoload": { "psr-0": { diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 9ae870d..1419dbe 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -23,14 +23,29 @@ class Formatter { */ public static function make($data, $type) { if (in_array($type, self::$supportedTypes)) { - return new Formatter($data, $type); + $parser = null; + // switch ($type) { + // case self::Csv: + // $parser = new CsvParser($data); + // break; + // case self::Json: + // $parser = new JsonParser($data); + // break; + // case self::Xml: + // $parser = new XmlParser($data); + // break; + // case self::Arr: + // $parser = new ArrayParser($data); + // break; + // } + return new Formatter($parser, $type); } throw new InvalidArgumentException( 'make function only accepts [csv, json, xml, array] for $type but ' . $type . ' was provided.' ); } - private function __construct($data, $type) { + private function __construct($parser, $type) { } } diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php index e80c8b1..345d329 100644 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -1,12 +1,13 @@ data = $data; - } + private $csv; - public function asObject() { + public function __construct($data) { + $this->csv = Reader::createFromString($data); } } diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php index a6ee099..44899fb 100644 --- a/src/SoapBox/Formatter/Parsers/ParserInterface.php +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -15,11 +15,4 @@ interface ParserInterface { */ public function __construct($data); - /** - * asObject takes in $data and transforms it into a php object - * - * @return stdClass An object representation of the input data. - */ - public function asObject(); - } From ab5ee9f454e1d0e6c4febb39ada44722fc414ceb Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:40:59 -0400 Subject: [PATCH 41/73] Add JsonParser --- src/SoapBox/Formatter/Parsers/JsonParser.php | 11 +++++++++++ tests/unit/Parsers/CsvParserTest.php | 2 +- tests/unit/Parsers/JsonParserTest.php | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/SoapBox/Formatter/Parsers/JsonParser.php create mode 100644 tests/unit/Parsers/JsonParserTest.php diff --git a/src/SoapBox/Formatter/Parsers/JsonParser.php b/src/SoapBox/Formatter/Parsers/JsonParser.php new file mode 100644 index 0000000..221eeda --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/JsonParser.php @@ -0,0 +1,11 @@ +json = json_decode(trim($data)); + } + +} diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index c65c498..026080c 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -4,7 +4,7 @@ use SoapBox\Formatter\Parsers\ParserInterface; use SoapBox\Formatter\Parsers\CsvParser; -class FormatterTest extends TestCase { +class CsvParserTest extends TestCase { public function testCsvParserIsInstanceOfParserInterface() { $parser = new CsvParser(''); diff --git a/tests/unit/Parsers/JsonParserTest.php b/tests/unit/Parsers/JsonParserTest.php new file mode 100644 index 0000000..29c609d --- /dev/null +++ b/tests/unit/Parsers/JsonParserTest.php @@ -0,0 +1,14 @@ +assertTrue($parser instanceof ParserInterface); + } + +} From 1034c531c1aeff5cf6a120d66787d161d43aeab9 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:52:33 -0400 Subject: [PATCH 42/73] Add XmlParser --- src/SoapBox/Formatter/Parsers/XmlParser.php | 33 +++++++++++++++++++++ tests/unit/Parsers/XmlParserTest.php | 14 +++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/SoapBox/Formatter/Parsers/XmlParser.php create mode 100644 tests/unit/Parsers/XmlParserTest.php diff --git a/src/SoapBox/Formatter/Parsers/XmlParser.php b/src/SoapBox/Formatter/Parsers/XmlParser.php new file mode 100644 index 0000000..3903f1c --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/XmlParser.php @@ -0,0 +1,33 @@ + + * @license MIT License (see LICENSE.readme included in the bundle) + * + */ + private function objectify($value) { + $temp = is_string($value) ? + simplexml_load_string($value, 'SimpleXMLElement', LIBXML_NOCDATA) : + $value; + + $result = []; + + foreach ((array) $temp as $key => $value) { + $result[$key] = (is_array($value) or is_object($value)) ? $this->objectify($value) : $value; + } + + return $result; + } + + public function __construct($data) { + $this->xml = $this->objectify($data); + } + +} diff --git a/tests/unit/Parsers/XmlParserTest.php b/tests/unit/Parsers/XmlParserTest.php new file mode 100644 index 0000000..1a9f894 --- /dev/null +++ b/tests/unit/Parsers/XmlParserTest.php @@ -0,0 +1,14 @@ +assertTrue($parser instanceof ParserInterface); + } + +} From e503b4d0a64fc08a4b4ccfe5fcf95f0f96a1f514 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:55:21 -0400 Subject: [PATCH 43/73] Add Array Parser --- src/SoapBox/Formatter/Parsers/ArrayParser.php | 11 +++++++++++ tests/unit/Parsers/ArrayParserTest.php | 14 ++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/SoapBox/Formatter/Parsers/ArrayParser.php create mode 100644 tests/unit/Parsers/ArrayParserTest.php diff --git a/src/SoapBox/Formatter/Parsers/ArrayParser.php b/src/SoapBox/Formatter/Parsers/ArrayParser.php new file mode 100644 index 0000000..bac9db7 --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/ArrayParser.php @@ -0,0 +1,11 @@ +array = $data; + } + +} diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php new file mode 100644 index 0000000..02d47d2 --- /dev/null +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -0,0 +1,14 @@ +assertTrue($parser instanceof ParserInterface); + } + +} From e5f5bc982a6c7d3ff75d56a07a74dec6cd3fc0ec Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 14:59:59 -0400 Subject: [PATCH 44/73] Add parser generation --- src/SoapBox/Formatter/Formatter.php | 37 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 1419dbe..c8fcd25 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -1,6 +1,10 @@ parser = $parser; } } From 4ee929d28e5ab421430214bbdc0464695da14239 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 15:03:54 -0400 Subject: [PATCH 45/73] Rename constants to follow convention --- src/SoapBox/Formatter/Formatter.php | 18 +++++++++--------- tests/unit/FormatterTest.php | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index c8fcd25..6410592 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -10,12 +10,12 @@ class Formatter { /** * Add class constants that help define input format */ - const Csv = 'csv'; - const Json = 'json'; - const Xml = 'xml'; - const Arr = 'array'; + const CSV = 'csv'; + const JSON = 'json'; + const XML = 'xml'; + const ARR = 'array'; - private static $supportedTypes = [self::Csv, self::Json, self::Xml, self::Arr]; + private static $supportedTypes = [self::CSV, self::JSON, self::XML, self::ARR]; private $parser; /** @@ -30,16 +30,16 @@ public static function make($data, $type) { if (in_array($type, self::$supportedTypes)) { $parser = null; switch ($type) { - case self::Csv: + case self::CSV: $parser = new CsvParser($data); break; - case self::Json: + case self::JSON: $parser = new JsonParser($data); break; - case self::Xml: + case self::XML: $parser = new XmlParser($data); break; - case self::Arr: + case self::ARR: $parser = new ArrayParser($data); break; } diff --git a/tests/unit/FormatterTest.php b/tests/unit/FormatterTest.php index fa86ae5..96cd93c 100644 --- a/tests/unit/FormatterTest.php +++ b/tests/unit/FormatterTest.php @@ -6,28 +6,28 @@ class FormatterTest extends TestCase { public function testFormatterProvidesCsvConstant() { $expected = 'csv'; - $actual = Formatter::Csv; + $actual = Formatter::CSV; $this->assertEquals($expected, $actual); } public function testFormatterProvidesJsonConstant() { $expected = 'json'; - $actual = Formatter::Json; + $actual = Formatter::JSON; $this->assertEquals($expected, $actual); } public function testFormatterProvidesXmlConstant() { $expected = 'xml'; - $actual = Formatter::Xml; + $actual = Formatter::XML; $this->assertEquals($expected, $actual); } public function testFormatterProvidesArrayConstant() { $expected = 'array'; - $actual = Formatter::Arr; + $actual = Formatter::ARR; $this->assertEquals($expected, $actual); } @@ -40,7 +40,7 @@ public function testFormatterMakeThrowsInvalidTypeException() { } public function testFormatterMakeReturnsInstanceOfFormatter() { - $formatter = Formatter::make('', Formatter::Csv); + $formatter = Formatter::make('', Formatter::CSV); $this->assertTrue($formatter instanceof Formatter); } From b8066dc2f6b7904084fa04b47bebef00d6d34caa Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 16:14:32 -0400 Subject: [PATCH 46/73] Add basic toArray support for all parsers --- src/SoapBox/Formatter/Formatter.php | 4 +++ src/SoapBox/Formatter/Parsers/ArrayParser.php | 19 ++++++++++-- src/SoapBox/Formatter/Parsers/CsvParser.php | 27 +++++++++++++++-- src/SoapBox/Formatter/Parsers/JsonParser.php | 6 +++- .../Formatter/Parsers/ParserInterface.php | 20 +++++++++++-- src/SoapBox/Formatter/Parsers/XmlParser.php | 5 +++- tests/unit/Parsers/ArrayParserTest.php | 29 ++++++++++++++++++- tests/unit/Parsers/CsvParserTest.php | 16 ++++++++++ tests/unit/Parsers/JsonParserTest.php | 6 ++++ tests/unit/Parsers/XmlParserTest.php | 5 ++++ 10 files changed, 128 insertions(+), 9 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 6410592..5ef2167 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -53,4 +53,8 @@ public static function make($data, $type) { private function __construct($parser) { $this->parser = $parser; } + + public function toJson() { + return $this->parser->toJson(); + } } diff --git a/src/SoapBox/Formatter/Parsers/ArrayParser.php b/src/SoapBox/Formatter/Parsers/ArrayParser.php index bac9db7..3db71cd 100644 --- a/src/SoapBox/Formatter/Parsers/ArrayParser.php +++ b/src/SoapBox/Formatter/Parsers/ArrayParser.php @@ -1,11 +1,26 @@ array = $data; + if (is_string($data)) { + $data = unserialize($data); + } + + if (is_array($data) || is_object($data)) { + $this->array = (array) $data; + } else { + throw new InvalidArgumentException( + 'ArrayParser only accepts (optionally serialized) [object, array] for $data.' + ); + } } + public function toArray() { + return $this->array; + } } diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php index 345d329..f089d3c 100644 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -1,13 +1,36 @@ csv = Reader::createFromString($data); + if (is_string($data)) { + $this->csv = Reader::createFromString($data); + } else { + throw new InvalidArgumentException( + 'CsvParser only accepts (string) [csv] for $data.' + ); + } } + public function toArray() { + $temp = $this->csv->jsonSerialize(); + + $headings = $temp[0]; + + $result = []; + for ($i = 1; $i < count($temp); ++$i) { + $row = []; + for ($j = 0; $j < count($headings); ++$j) { + $row[$headings[$j]] = $temp[$i][$j]; + } + $result[] = $row; + } + + return $result; + } } diff --git a/src/SoapBox/Formatter/Parsers/JsonParser.php b/src/SoapBox/Formatter/Parsers/JsonParser.php index 221eeda..5877aa9 100644 --- a/src/SoapBox/Formatter/Parsers/JsonParser.php +++ b/src/SoapBox/Formatter/Parsers/JsonParser.php @@ -1,6 +1,6 @@ json = json_decode(trim($data)); } + public function toArray() { + return (array) $this->json; + } + } diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php index 44899fb..fa96c43 100644 --- a/src/SoapBox/Formatter/Parsers/ParserInterface.php +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -6,13 +6,29 @@ * This interface describes the abilities of a parser which is able to transform * inputs to the object type. */ -interface ParserInterface { +abstract class ParserInterface { /** * Constructor is used to initialize the parser * * @param mixed $data The input sharing a type with the parser */ - public function __construct($data); + abstract public function __construct($data); + + /** + * Used to retrieve a (php) array representation of the data encapsulated within our Parser. + * + * @return array + */ + abstract public function toArray(); + + /** + * Return a json representation of the data stored in the parser + * + * @return string A json string representing the encapsulated data + */ + public function toJson() { + return json_encode($this->toArray()); + } } diff --git a/src/SoapBox/Formatter/Parsers/XmlParser.php b/src/SoapBox/Formatter/Parsers/XmlParser.php index 3903f1c..3fbdf5a 100644 --- a/src/SoapBox/Formatter/Parsers/XmlParser.php +++ b/src/SoapBox/Formatter/Parsers/XmlParser.php @@ -1,6 +1,6 @@ xml = $this->objectify($data); } + public function toArray() { + return (array) $this->xml; + } } diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index 02d47d2..e9e439d 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -1,5 +1,6 @@ assertTrue($parser instanceof ParserInterface); } + public function testConstructorAcceptsSerializedArray() { + $expected = [0, 1, 2]; + $parser = new ArrayParser(serialize($expected)); + $this->assertEquals($expected, $parser->toArray()); + } + + public function testConstructorAcceptsObject() { + $expected = ['foo' => 'bar']; + $input = new stdClass; + $input->foo = 'bar'; + $parser = new ArrayParser($input); + $this->assertEquals($expected, $parser->toArray()); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testArrayParserThrowsExceptionWithInvalidInputOfEmptyString() { + $parser = new ArrayParser(''); + } + + public function testtoArrayReturnsArray() { + $parser = new ArrayParser(serialize([0, 1, 2])); + $this->assertTrue(is_array($parser->toArray())); + } + } diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 026080c..11b7986 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -11,4 +11,20 @@ public function testCsvParserIsInstanceOfParserInterface() { $this->assertTrue($parser instanceof ParserInterface); } + /** + * @expectedException InvalidArgumentException + */ + public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() { + $parser = new CsvParser([0, 1, 3]); + } + + public function testtoArrayReturnsCsvArrayRepresentation() { + $expected = [['foo' => 'bar', 'boo' => 'far']]; + + $csv = 'foo,boo +bar,far'; + $parser = new CsvParser($csv); + + $this->assertEquals($expected, $parser->toArray()); + } } diff --git a/tests/unit/Parsers/JsonParserTest.php b/tests/unit/Parsers/JsonParserTest.php index 29c609d..c4a3dfa 100644 --- a/tests/unit/Parsers/JsonParserTest.php +++ b/tests/unit/Parsers/JsonParserTest.php @@ -11,4 +11,10 @@ public function testJsonParserIsInstanceOfParserInterface() { $this->assertTrue($parser instanceof ParserInterface); } + public function testtoArrayReturnsArrayRepresentationOfJsonObject() { + $expected = ['foo' => 'bar']; + $parser = new JsonParser('{"foo": "bar"}'); + $this->assertEquals($expected, $parser->toArray()); + } + } diff --git a/tests/unit/Parsers/XmlParserTest.php b/tests/unit/Parsers/XmlParserTest.php index 1a9f894..48688aa 100644 --- a/tests/unit/Parsers/XmlParserTest.php +++ b/tests/unit/Parsers/XmlParserTest.php @@ -11,4 +11,9 @@ public function testXmlParserIsInstanceOfParserInterface() { $this->assertTrue($parser instanceof ParserInterface); } + public function testtoArrayReturnsArrayRepresenationOfXmlObject() { + $expected = ['foo' => 'bar']; + $parser = new XmlParser('bar'); + $this->assertEquals($expected, $parser->toArray()); + } } From dc08dfb08cc0a85ad61c10e251b74336d3b112ab Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 16:27:14 -0400 Subject: [PATCH 47/73] Add tests to validate toJson method for parsers --- tests/unit/Parsers/ArrayParserTest.php | 11 +++++++++++ tests/unit/Parsers/CsvParserTest.php | 15 ++++++++++----- tests/unit/Parsers/JsonParserTest.php | 11 +++++++++++ tests/unit/Parsers/XmlParserTest.php | 6 ++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index e9e439d..0b8ea61 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -38,4 +38,15 @@ public function testtoArrayReturnsArray() { $this->assertTrue(is_array($parser->toArray())); } + public function testtoJsonReturnsJsonRepresentationOfArray() { + $expected = '[0,1,2]'; + $parser = new ArrayParser([0, 1, 2]); + $this->assertEquals($expected, $parser->toJson()); + } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() { + $expected = '{"foo":"bar"}'; + $parser = new ArrayParser(['foo' => 'bar']); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 11b7986..33f427b 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -6,6 +6,9 @@ class CsvParserTest extends TestCase { + private $simpleCsv = 'foo,boo +bar,far'; + public function testCsvParserIsInstanceOfParserInterface() { $parser = new CsvParser(''); $this->assertTrue($parser instanceof ParserInterface); @@ -20,11 +23,13 @@ public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() { public function testtoArrayReturnsCsvArrayRepresentation() { $expected = [['foo' => 'bar', 'boo' => 'far']]; - - $csv = 'foo,boo -bar,far'; - $parser = new CsvParser($csv); - + $parser = new CsvParser($this->simpleCsv); $this->assertEquals($expected, $parser->toArray()); } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() { + $expected = '[{"foo":"bar","boo":"far"}]'; + $parser = new CsvParser($this->simpleCsv); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/JsonParserTest.php b/tests/unit/Parsers/JsonParserTest.php index c4a3dfa..a695f2d 100644 --- a/tests/unit/Parsers/JsonParserTest.php +++ b/tests/unit/Parsers/JsonParserTest.php @@ -17,4 +17,15 @@ public function testtoArrayReturnsArrayRepresentationOfJsonObject() { $this->assertEquals($expected, $parser->toArray()); } + public function testtoJsonReturnsArrayRepresentationOfArray() { + $expected = '[0,1,2]'; + $parser = new JsonParser($expected); + $this->assertEquals($expected, $parser->toJson()); + } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() { + $expected = '{"foo":"bar"}'; + $parser = new JsonParser($expected); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/XmlParserTest.php b/tests/unit/Parsers/XmlParserTest.php index 48688aa..33be91b 100644 --- a/tests/unit/Parsers/XmlParserTest.php +++ b/tests/unit/Parsers/XmlParserTest.php @@ -16,4 +16,10 @@ public function testtoArrayReturnsArrayRepresenationOfXmlObject() { $parser = new XmlParser('bar'); $this->assertEquals($expected, $parser->toArray()); } + + public function testtoJsonReturnsJsonRepresentationOfXmlObject() { + $expected = '{"foo":"bar"}'; + $parser = new XmlParser('bar'); + $this->assertEquals($expected, $parser->toJson()); + } } From 23ceda6e19ad46e05ddceb00d77111f2c84381ad Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 16:33:29 -0400 Subject: [PATCH 48/73] Add Yaml output support --- composer.json | 3 ++- src/SoapBox/Formatter/Parsers/ParserInterface.php | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 456eaf5..0842528 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,8 @@ ], "require": { "php": ">=5.3.0", - "league/csv": "~6.0" + "league/csv": "~6.0", + "mustangostang/spyc": "0.5.*@dev" }, "autoload": { "psr-0": { diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php index fa96c43..32e4a29 100644 --- a/src/SoapBox/Formatter/Parsers/ParserInterface.php +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -1,5 +1,7 @@ toArray()); } + /** + * Return a yaml representation of the data stored in the parser + * + * @return string A yaml string representing the encapsulated data + */ + public function toYaml() { + return Spyc::YAMLDump($this->toArray()); + } } From d49335873eb4dfc35defea818c4935db81efae0d Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 16:56:21 -0400 Subject: [PATCH 49/73] Add support for toXml from v1.4 --- composer.json | 3 +- .../Formatter/Parsers/ParserInterface.php | 75 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0842528..6f61add 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,8 @@ "require": { "php": ">=5.3.0", "league/csv": "~6.0", - "mustangostang/spyc": "0.5.*@dev" + "mustangostang/spyc": "0.5.*@dev", + "illuminate/support": ">=4.0" }, "autoload": { "psr-0": { diff --git a/src/SoapBox/Formatter/Parsers/ParserInterface.php b/src/SoapBox/Formatter/Parsers/ParserInterface.php index 32e4a29..2b913f2 100644 --- a/src/SoapBox/Formatter/Parsers/ParserInterface.php +++ b/src/SoapBox/Formatter/Parsers/ParserInterface.php @@ -1,6 +1,7 @@ toArray()); } + + /** + * To XML conversion + * + * @param mixed $data + * @param null $structure + * @param null|string $basenode + * @return string + */ + private function xmlify($data, $structure = null, $basenode = 'xml') { + // turn off compatibility mode as simple xml throws a wobbly if you don't. + if (ini_get('zend.ze1_compatibility_mode') == 1) { + ini_set('zend.ze1_compatibility_mode', 0); + } + + if ($structure == null) { + $structure = simplexml_load_string("<$basenode />"); + } + + // Force it to be something useful + if (!is_array($data) && !is_object($data)) { + $data = (array) $data; + } + + foreach ($data as $key => $value) { + // convert our booleans to 0/1 integer values so they are + // not converted to blanks. + if (is_bool($value)) { + $value = (int) $value; + } + + // no numeric keys in our xml please! + if (is_numeric($key)) { + // make string key... + $key = (Str::singular($basenode) != $basenode) ? Str::singular($basenode) : 'item'; + } + + // replace anything not alpha numeric + $key = preg_replace('/[^a-z_\-0-9]/i', '', $key); + + // if there is another array found recrusively call this function + if (is_array($value) or is_object($value)) { + $node = $structure->addChild($key); + + // recursive call if value is not empty + if (!empty($value)) { + $this->xmlify($value, $node, $key); + } + } else { + // add single node. + $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8"); + + $structure->addChild($key, $value); + } + } + + // pass back as string. or simple xml object if you want! + return $structure->asXML(); + } + + /** + * Return an xml representation of the data stored in the parser + * + * @return string An xml string representing the encapsulated data + */ + public function toXml() { + return $this->xmlify($this->toArray()); + } + + /** + * Return a csv representation of the data stored in the parser + * + * @return string An xml string representing the encapsulated data + */ } From 9ed2995378822b1616af1f5dfc410df491248daa Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 17:07:00 -0400 Subject: [PATCH 50/73] Add YamlParser support --- src/SoapBox/Formatter/Parsers/YamlParser.php | 24 ++++++++++++++++++++ tests/unit/Parsers/YamlParserTest.php | 22 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/SoapBox/Formatter/Parsers/YamlParser.php create mode 100644 tests/unit/Parsers/YamlParserTest.php diff --git a/src/SoapBox/Formatter/Parsers/YamlParser.php b/src/SoapBox/Formatter/Parsers/YamlParser.php new file mode 100644 index 0000000..dbd8664 --- /dev/null +++ b/src/SoapBox/Formatter/Parsers/YamlParser.php @@ -0,0 +1,24 @@ +array = Spyc::YAMLLoadString($data); + } else { + throw new InvalidArgumentException( + 'YamlParser only accepts (string) [yaml] for $data.' + ); + } + } + + public function toArray() { + return $this->array; + } + +} diff --git a/tests/unit/Parsers/YamlParserTest.php b/tests/unit/Parsers/YamlParserTest.php new file mode 100644 index 0000000..fa36a82 --- /dev/null +++ b/tests/unit/Parsers/YamlParserTest.php @@ -0,0 +1,22 @@ +assertTrue($parser instanceof ParserInterface); + } + + public function testtoArrayReturnsArrayRepresenationOfYamlObject() { + $expected = ['foo' => 'bar']; + $parser = new XmlParser('bar'); + $x = new YamlParser($parser->toYaml()); + $this->assertEquals($expected, $x->toArray()); + } + +} From 57438d3a073644ab124b355fda30bb000ffc0d09 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 17:11:27 -0400 Subject: [PATCH 51/73] Add YAML support to Formatter --- src/SoapBox/Formatter/Formatter.php | 7 ++++++- tests/unit/FormatterTest.php | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 5ef2167..ee0b7f6 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -5,6 +5,7 @@ use SoapBox\Formatter\Parsers\CsvParser; use SoapBox\Formatter\Parsers\JsonParser; use SoapBox\Formatter\Parsers\XmlParser; +use SoapBox\Formatter\Parsers\YamlParser; class Formatter { /** @@ -14,8 +15,9 @@ class Formatter { const JSON = 'json'; const XML = 'xml'; const ARR = 'array'; + const YAML = 'yaml'; - private static $supportedTypes = [self::CSV, self::JSON, self::XML, self::ARR]; + private static $supportedTypes = [self::CSV, self::JSON, self::XML, self::ARR, self::YAML]; private $parser; /** @@ -42,6 +44,9 @@ public static function make($data, $type) { case self::ARR: $parser = new ArrayParser($data); break; + case self::YAML: + $parser = new YamlParser($data); + break; } return new Formatter($parser, $type); } diff --git a/tests/unit/FormatterTest.php b/tests/unit/FormatterTest.php index 96cd93c..d1e96a5 100644 --- a/tests/unit/FormatterTest.php +++ b/tests/unit/FormatterTest.php @@ -32,6 +32,13 @@ public function testFormatterProvidesArrayConstant() { $this->assertEquals($expected, $actual); } + public function testFormatterProvidesYamlConstant() { + $expected = 'yaml'; + $actual = Formatter::YAML; + + $this->assertEquals($expected, $actual); + } + /** * @expectedException InvalidArgumentException */ From b1808e3ba4bec343a320cde50d2eed19db8dfa1a Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 17:14:14 -0400 Subject: [PATCH 52/73] Add methods for Formatter to output array, xml, and yaml --- src/SoapBox/Formatter/Formatter.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index ee0b7f6..01757b9 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -62,4 +62,16 @@ private function __construct($parser) { public function toJson() { return $this->parser->toJson(); } + + public function toArray() { + return $this->parser->toArray(); + } + + public function toYaml() { + return $this->parser->toYaml(); + } + + public function toXml() { + return $this->parser->toXml(); + } } From 5d6cf5f43f092670da795f542131f2e493a6c452 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 17:16:53 -0400 Subject: [PATCH 53/73] Rename ParserInterface to Parser --- src/SoapBox/Formatter/Parsers/ArrayParser.php | 2 +- src/SoapBox/Formatter/Parsers/CsvParser.php | 2 +- src/SoapBox/Formatter/Parsers/JsonParser.php | 2 +- .../Formatter/Parsers/{ParserInterface.php => Parser.php} | 2 +- src/SoapBox/Formatter/Parsers/XmlParser.php | 2 +- src/SoapBox/Formatter/Parsers/YamlParser.php | 2 +- tests/unit/Parsers/ArrayParserTest.php | 4 ++-- tests/unit/Parsers/CsvParserTest.php | 4 ++-- tests/unit/Parsers/JsonParserTest.php | 4 ++-- tests/unit/Parsers/XmlParserTest.php | 4 ++-- tests/unit/Parsers/YamlParserTest.php | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) rename src/SoapBox/Formatter/Parsers/{ParserInterface.php => Parser.php} (98%) diff --git a/src/SoapBox/Formatter/Parsers/ArrayParser.php b/src/SoapBox/Formatter/Parsers/ArrayParser.php index 3db71cd..aa569cb 100644 --- a/src/SoapBox/Formatter/Parsers/ArrayParser.php +++ b/src/SoapBox/Formatter/Parsers/ArrayParser.php @@ -2,7 +2,7 @@ use InvalidArgumentException; -class ArrayParser extends ParserInterface { +class ArrayParser extends Parser { private $array; diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php index f089d3c..24015cb 100644 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -3,7 +3,7 @@ use InvalidArgumentException; use League\Csv\Reader; -class CsvParser extends ParserInterface { +class CsvParser extends Parser { private $csv; diff --git a/src/SoapBox/Formatter/Parsers/JsonParser.php b/src/SoapBox/Formatter/Parsers/JsonParser.php index 5877aa9..372ec68 100644 --- a/src/SoapBox/Formatter/Parsers/JsonParser.php +++ b/src/SoapBox/Formatter/Parsers/JsonParser.php @@ -1,6 +1,6 @@ assertTrue($parser instanceof ParserInterface); + $this->assertTrue($parser instanceof Parser); } public function testConstructorAcceptsSerializedArray() { diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 33f427b..69e715c 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -1,7 +1,7 @@ assertTrue($parser instanceof ParserInterface); + $this->assertTrue($parser instanceof Parser); } /** diff --git a/tests/unit/Parsers/JsonParserTest.php b/tests/unit/Parsers/JsonParserTest.php index a695f2d..9bca418 100644 --- a/tests/unit/Parsers/JsonParserTest.php +++ b/tests/unit/Parsers/JsonParserTest.php @@ -1,14 +1,14 @@ assertTrue($parser instanceof ParserInterface); + $this->assertTrue($parser instanceof Parser); } public function testtoArrayReturnsArrayRepresentationOfJsonObject() { diff --git a/tests/unit/Parsers/XmlParserTest.php b/tests/unit/Parsers/XmlParserTest.php index 33be91b..614be06 100644 --- a/tests/unit/Parsers/XmlParserTest.php +++ b/tests/unit/Parsers/XmlParserTest.php @@ -1,14 +1,14 @@ assertTrue($parser instanceof ParserInterface); + $this->assertTrue($parser instanceof Parser); } public function testtoArrayReturnsArrayRepresenationOfXmlObject() { diff --git a/tests/unit/Parsers/YamlParserTest.php b/tests/unit/Parsers/YamlParserTest.php index fa36a82..bf0edac 100644 --- a/tests/unit/Parsers/YamlParserTest.php +++ b/tests/unit/Parsers/YamlParserTest.php @@ -1,7 +1,7 @@ assertTrue($parser instanceof ParserInterface); + $this->assertTrue($parser instanceof Parser); } public function testtoArrayReturnsArrayRepresenationOfYamlObject() { From cff98803a968b0d01ab2eecd969e832fb9afcb10 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 20:52:31 -0400 Subject: [PATCH 54/73] Add basic csv output --- src/SoapBox/Formatter/ArrayHelpers.php | 19 ++++++++++++++ src/SoapBox/Formatter/Parsers/Parser.php | 33 +++++++++++++++++++++++- tests/unit/Parsers/ArrayParserTest.php | 5 ++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/SoapBox/Formatter/ArrayHelpers.php diff --git a/src/SoapBox/Formatter/ArrayHelpers.php b/src/SoapBox/Formatter/ArrayHelpers.php new file mode 100644 index 0000000..17f1ca2 --- /dev/null +++ b/src/SoapBox/Formatter/ArrayHelpers.php @@ -0,0 +1,19 @@ +xmlify($this->toArray()); } + private function csvify($data) { + $results = []; + foreach ($data as $row) { + $results[] = array_values(ArrayHelpers::dot($row)); + } + return $results; + } + /** * Return a csv representation of the data stored in the parser * - * @return string An xml string representing the encapsulated data + * @return string An csv string representing the encapsulated data */ + public function toCsv() { + $data = $this->toArray(); + + if (ArrayHelpers::isAssociative($data) || !is_array($data[0])) { + $data = [$data]; + } + + $result = []; + + $result[] = ArrayHelpers::dotKeys($data[0]); + + foreach ($data as $row) { + $result[] = array_values(ArrayHelpers::dot($row)); + } + + $output = ''; + foreach ($result as $row) { + $output .= implode(',', $row) . "\r\n"; + } + + return $output; + } } diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index b05415e..c1e519a 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -49,4 +49,9 @@ public function testtoJsonReturnsJsonRepresentationOfNamedArray() { $parser = new ArrayParser(['foo' => 'bar']); $this->assertEquals($expected, $parser->toJson()); } + + public function testFunTimes() { + $parser = new ArrayParser([[0,1,2], [2,3,4]]); + var_dump($parser->toCsv()); + } } From f23030f6b9ce19f7f4e130f9653f16b69e0984f9 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 21:07:30 -0400 Subject: [PATCH 55/73] Add multidimensional csv support --- src/SoapBox/Formatter/ArrayHelpers.php | 4 ++++ src/SoapBox/Formatter/Parsers/CsvParser.php | 7 ++++++- tests/unit/Parsers/ArrayParserTest.php | 4 ---- tests/unit/Parsers/CsvParserTest.php | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/SoapBox/Formatter/ArrayHelpers.php b/src/SoapBox/Formatter/ArrayHelpers.php index 17f1ca2..42ec4e3 100644 --- a/src/SoapBox/Formatter/ArrayHelpers.php +++ b/src/SoapBox/Formatter/ArrayHelpers.php @@ -16,4 +16,8 @@ public static function dot(array $data) { return Arr::dot($data); } + public static function set(array &$data, $key, $value) { + Arr::set($data, $key, $value); + } + } diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php index 24015cb..892ba10 100644 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -2,6 +2,7 @@ use InvalidArgumentException; use League\Csv\Reader; +use SoapBox\Formatter\ArrayHelpers; class CsvParser extends Parser { @@ -28,7 +29,11 @@ public function toArray() { for ($j = 0; $j < count($headings); ++$j) { $row[$headings[$j]] = $temp[$i][$j]; } - $result[] = $row; + $expanded = []; + foreach ($row as $key => $value) { + ArrayHelpers::set($expanded, $key, $value); + } + $result[] = $expanded; } return $result; diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index c1e519a..8c85db9 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -50,8 +50,4 @@ public function testtoJsonReturnsJsonRepresentationOfNamedArray() { $this->assertEquals($expected, $parser->toJson()); } - public function testFunTimes() { - $parser = new ArrayParser([[0,1,2], [2,3,4]]); - var_dump($parser->toCsv()); - } } diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 69e715c..39547c0 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -32,4 +32,5 @@ public function testtoJsonReturnsJsonRepresentationOfNamedArray() { $parser = new CsvParser($this->simpleCsv); $this->assertEquals($expected, $parser->toJson()); } + } From 0457dc3eea07de38345872bad73987c68a4193b2 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 21:43:02 -0400 Subject: [PATCH 56/73] Add missing test cases from v1.4 --- src/SoapBox/Formatter/Formatter.php | 4 + src/SoapBox/Formatter/Parsers/CsvParser.php | 25 ++--- src/SoapBox/Formatter/Parsers/Parser.php | 9 +- tests/unit/ParserTest.php | 101 ++++++++++++++++++++ 4 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 tests/unit/ParserTest.php diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 01757b9..9029d13 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -74,4 +74,8 @@ public function toYaml() { public function toXml() { return $this->parser->toXml(); } + + public function toCsv() { + return $this->parser->toCsv(); + } } diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php index 892ba10..5f57fb6 100644 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ b/src/SoapBox/Formatter/Parsers/CsvParser.php @@ -22,18 +22,21 @@ public function toArray() { $temp = $this->csv->jsonSerialize(); $headings = $temp[0]; - - $result = []; - for ($i = 1; $i < count($temp); ++$i) { - $row = []; - for ($j = 0; $j < count($headings); ++$j) { - $row[$headings[$j]] = $temp[$i][$j]; - } - $expanded = []; - foreach ($row as $key => $value) { - ArrayHelpers::set($expanded, $key, $value); + $result = $headings; + + if (count($temp) > 1) { + $result = []; + for ($i = 1; $i < count($temp); ++$i) { + $row = []; + for ($j = 0; $j < count($headings); ++$j) { + $row[$headings[$j]] = $temp[$i][$j]; + } + $expanded = []; + foreach ($row as $key => $value) { + ArrayHelpers::set($expanded, $key, $value); + } + $result[] = $expanded; } - $result[] = $expanded; } return $result; diff --git a/src/SoapBox/Formatter/Parsers/Parser.php b/src/SoapBox/Formatter/Parsers/Parser.php index 7ed6f61..0d33f81 100644 --- a/src/SoapBox/Formatter/Parsers/Parser.php +++ b/src/SoapBox/Formatter/Parsers/Parser.php @@ -1,7 +1,7 @@ toArray(); + $expected = ['foo'=>'bar', 'bar'=>'foo']; + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for Array to JSON conversion + * + * @return void + */ + public function testArrayToJson() { + $data = ['foo'=>'bar', 'bar'=>'foo']; + + $actual = Formatter::make($data, Formatter::ARR)->toJson(); + $expected = '{"foo":"bar","bar":"foo"}'; + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for CSV data to array + * + * @return void + */ + public function testCSVToArray() { + $data = 'foo,bar,bing,bam,boom'; + + $actual = Formatter::make($data, Formatter::CSV)->toArray(); + $expected = array('foo','bar','bing','bam','boom'); + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for testJSONToXMLToArrayToJsonToArray data to array + * + * @return void + */ + public function testJSONToXMLToArrayToJsonToArray() { + $data = '{"foo":"bar","bar":"foo"}'; + + $result = Formatter::make($data, Formatter::JSON)->toXml(); + $result = Formatter::make($result, Formatter::XML)->toArray(); + $result = Formatter::make($result, Formatter::ARR)->toJson(); + $actual = Formatter::make($result, Formatter::JSON)->toArray(); + + $expected = ['foo'=>'bar', 'bar'=>'foo']; + + $this->assertEquals($expected, $actual); + } + + public function testMultiDimensionalArrayFromJsonToCsv() { + $expected = "simple,date,time,duration_onset,devicename,calc_data.0.0,calc_data.0.1,calc_data.0.2,calc_data.0.3,calc_data.0.4,calc_data.0.5,calc_data.1.0,calc_data.1.1,calc_data.1.2,calc_data.1.3,calc_data.1.4,calc_data.1.5\r\n118,2014-05-20 21:03:59.333,4067,,My Device,1400609039,0,37,0,0,1,1400609039,0,37,0,0,1"; + + $json = +'{ + "simple":"118", + "date":"2014-05-20 21:03:59.333", + "time":"4067", + "duration_onset":null, + "devicename":"My Device", + "calc_data":[ + [ + 1400609039, + 0, + 37, + 0, + 0, + 1 + ], + [ + 1400609039, + 0, + 37, + 0, + 0, + 1 + ] + ] +}'; + $jsonParser = Formatter::make($json, Formatter::JSON); + + $this->assertEquals($expected, $jsonParser->toCsv()); + } + +} From 179097534a5e99314ae6f9857e685ff497272874 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 21:49:52 -0400 Subject: [PATCH 57/73] Dropping support for php 5.3 due to league/csv --- .travis.yml | 3 ++- composer.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b1eb5d4..c08b8d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: php php: - - 5.3 - 5.4 + - 5.5 + - 5.6 before_script: - curl -s http://getcomposer.org/installer | php diff --git a/composer.json b/composer.json index 6f61add..36d7598 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ } ], "require": { - "php": ">=5.3.0", + "php": ">=5.4.0", "league/csv": "~6.0", "mustangostang/spyc": "0.5.*@dev", "illuminate/support": ">=4.0" From d358e01f91971c7086f7d2091f2cb8eb3ab99eb2 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 22:15:34 -0400 Subject: [PATCH 58/73] Update readme.md file --- readme.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/readme.md b/readme.md index c5e7bfe..0861435 100644 --- a/readme.md +++ b/readme.md @@ -4,3 +4,90 @@ Formatter Bundle [![Build Status](https://travis-ci.org/SoapBox/laravel-formatter.svg?branch=master)](https://travis-ci.org/SoapBox/laravel-formatter) A formatter package that will help you to easily convert between various formats such as XML, JSON, CSV, etc... + +# Goals +The goals of this library to to allow the transfomation of data formats from one type to another. See Parsers and Formats to see supported input / output formats. + +# Installation + +Through command line: + +```bash +composer require soapbox/laravel-formatter +``` + +Through composer.json: + +```json +{ + "require": { + "soapbox/laravel-formatter": "2.x" + } +} + +``` + +## Parsers +All of the following are supported formats that the formatter can read from. +* Array +* CSV +* JSON +* XML +* YAML + +## Formats +All of the following are formats that are supported for output. +* Array +* CSV +* JSON +* XML +* YAML + +## General Usage (See tests for most up to date examples) + +__Including The Formatter__ + +```php +use SoapBox\Formatter\Formatter; +``` + +__Supported Types__ + +```php +Formatter::JSON; //json +Formatter::CSV; //csv +Formatter::XML; //xml +Formatter::ARR; //array +Formatter::YAML; //yaml +``` + +__Making Your First Formatter__ + +```php +$formatter = Formatter::make($jsonString, Formatter::JSON); +``` + +__Outputting From Your Formatter__ + +```php +$csv = $formatter->toCsv(); +$json = $formatter->toJson(); +$xml = $formatter->toXml(); +$array = $formatter->toArray(); +$yaml = $formatter->toYaml(); +``` + +## Deprecated Functionality +The following have been deprecated from the library, however you can easily continue using them in your application + +__Serialized Array__ + +```php +$serialized = serialize($formatter->toArray()); +``` + +__PHP Export__ + +```php +$export = var_export($formatter->toArray()); +``` From ab586748e1ce8e65dd4ff179340956598f5cac1a Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 22:18:06 -0400 Subject: [PATCH 59/73] Update readme file --- readme.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index 0861435..99ec0ec 100644 --- a/readme.md +++ b/readme.md @@ -6,7 +6,8 @@ Formatter Bundle A formatter package that will help you to easily convert between various formats such as XML, JSON, CSV, etc... # Goals -The goals of this library to to allow the transfomation of data formats from one type to another. See Parsers and Formats to see supported input / output formats. +The goals of this library are to allow the transfomation of data formats from one type to another. +See Parsers and Formats to see supported input / output formats. # Installation @@ -43,7 +44,7 @@ All of the following are formats that are supported for output. * XML * YAML -## General Usage (See tests for most up to date examples) +## General Usage __Including The Formatter__ @@ -61,20 +62,23 @@ Formatter::ARR; //array Formatter::YAML; //yaml ``` -__Making Your First Formatter__ +__Making Your First Formatter(s)__ ```php $formatter = Formatter::make($jsonString, Formatter::JSON); +$formatter = Formatter::make($yamlString, Formatter::YAML); +$formatter = Formatter::make($array, Formatter::ARR); +... ``` __Outputting From Your Formatter__ ```php -$csv = $formatter->toCsv(); -$json = $formatter->toJson(); -$xml = $formatter->toXml(); +$csv = $formatter->toCsv(); +$json = $formatter->toJson(); +$xml = $formatter->toXml(); $array = $formatter->toArray(); -$yaml = $formatter->toYaml(); +$yaml = $formatter->toYaml(); ``` ## Deprecated Functionality From 2fa52041e12f0bcfaa337482f4793bda0a1bec40 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sun, 19 Oct 2014 23:31:38 -0400 Subject: [PATCH 60/73] Add FormatterServiceProvider --- .../Formatter/FormatterServiceProvider.php | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/SoapBox/Formatter/FormatterServiceProvider.php diff --git a/src/SoapBox/Formatter/FormatterServiceProvider.php b/src/SoapBox/Formatter/FormatterServiceProvider.php new file mode 100644 index 0000000..903ee2e --- /dev/null +++ b/src/SoapBox/Formatter/FormatterServiceProvider.php @@ -0,0 +1,43 @@ +package('soapbox/laravel-formatter'); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() { + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() { + return array(); + } + +} From dc3f996696babf2529232ada0b95997c9168e370 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Sat, 25 Oct 2014 19:55:21 -0400 Subject: [PATCH 61/73] Update csv export to include escape characters and custom delimiters --- src/SoapBox/Formatter/Parsers/Parser.php | 34 +++++++++++++++--------- tests/unit/ParserTest.php | 2 +- tests/unit/Parsers/ArrayParserTest.php | 5 ++++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/SoapBox/Formatter/Parsers/Parser.php b/src/SoapBox/Formatter/Parsers/Parser.php index 0d33f81..109367e 100644 --- a/src/SoapBox/Formatter/Parsers/Parser.php +++ b/src/SoapBox/Formatter/Parsers/Parser.php @@ -121,35 +121,45 @@ private function csvify($data) { } /** + * Ported from laravel-formatter + * https://github.com/SoapBox/laravel-formatter + * + * @author Daniel Berry + * @license MIT License (see LICENSE.readme included in the bundle) + * * Return a csv representation of the data stored in the parser * * @return string An csv string representing the encapsulated data */ - public function toCsv() { + public function toCsv($newline = "\n", $delimiter = ",", $enclosure = '"', $escape = "\\") { $data = $this->toArray(); if (ArrayHelpers::isAssociative($data) || !is_array($data[0])) { $data = [$data]; } - $result = []; + $escaper = function($items) use($enclosure, $escape) { + return array_map(function($item) use($enclosure, $escape) { + return str_replace($enclosure, $escape.$enclosure, $item); + }, $items); + }; - $result[] = ArrayHelpers::dotKeys($data[0]); + $headings = ArrayHelpers::dotKeys($data[0]); + $result = []; foreach ($data as $row) { $result[] = array_values(ArrayHelpers::dot($row)); } - $output = ''; - $count = 0; - foreach ($result as $row) { - if ($count != 0) { - $output .= "\r\n"; - } - $count++; - $output .= implode(',', $row); + $data = $result; + + $output = $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper($headings)).$enclosure.$newline; + + foreach ($data as $row) + { + $output .= $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper((array) $row)).$enclosure.$newline; } - return $output; + return rtrim($output, $newline); } } diff --git a/tests/unit/ParserTest.php b/tests/unit/ParserTest.php index b2ac0d5..8afd6bd 100644 --- a/tests/unit/ParserTest.php +++ b/tests/unit/ParserTest.php @@ -65,7 +65,7 @@ public function testJSONToXMLToArrayToJsonToArray() { } public function testMultiDimensionalArrayFromJsonToCsv() { - $expected = "simple,date,time,duration_onset,devicename,calc_data.0.0,calc_data.0.1,calc_data.0.2,calc_data.0.3,calc_data.0.4,calc_data.0.5,calc_data.1.0,calc_data.1.1,calc_data.1.2,calc_data.1.3,calc_data.1.4,calc_data.1.5\r\n118,2014-05-20 21:03:59.333,4067,,My Device,1400609039,0,37,0,0,1,1400609039,0,37,0,0,1"; + $expected = "\"simple\",\"date\",\"time\",\"duration_onset\",\"devicename\",\"calc_data.0.0\",\"calc_data.0.1\",\"calc_data.0.2\",\"calc_data.0.3\",\"calc_data.0.4\",\"calc_data.0.5\",\"calc_data.1.0\",\"calc_data.1.1\",\"calc_data.1.2\",\"calc_data.1.3\",\"calc_data.1.4\",\"calc_data.1.5\"\n\"118\",\"2014-05-20 21:03:59.333\",\"4067\",\"\",\"My Device\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\""; $json = '{ diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index 8c85db9..d18c0b3 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -50,4 +50,9 @@ public function testtoJsonReturnsJsonRepresentationOfNamedArray() { $this->assertEquals($expected, $parser->toJson()); } + public function testtoCSVFromArrayContainingContentWithCommasWorks() { + $expected = "\"0\",\"1\",\"2\",\"3\"\n\"a\",\"b\",\"c,e\",\"d\""; + $parser = new ArrayParser(['a','b','c,e','d']); + $this->assertEquals($expected, $parser->toCsv()); + } } From 35e08ff7adc97648fb0b3cc9ade864d2e06dd421 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 29 Nov 2014 11:35:01 +0200 Subject: [PATCH 62/73] fixes #19 Added the possibility to add the base node for xml export --- src/SoapBox/Formatter/Formatter.php | 4 ++-- src/SoapBox/Formatter/Parsers/Parser.php | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/SoapBox/Formatter/Formatter.php b/src/SoapBox/Formatter/Formatter.php index 9029d13..2556fa0 100644 --- a/src/SoapBox/Formatter/Formatter.php +++ b/src/SoapBox/Formatter/Formatter.php @@ -71,8 +71,8 @@ public function toYaml() { return $this->parser->toYaml(); } - public function toXml() { - return $this->parser->toXml(); + public function toXml($baseNode = 'xml') { + return $this->parser->toXml($baseNode); } public function toCsv() { diff --git a/src/SoapBox/Formatter/Parsers/Parser.php b/src/SoapBox/Formatter/Parsers/Parser.php index 109367e..83eebe5 100644 --- a/src/SoapBox/Formatter/Parsers/Parser.php +++ b/src/SoapBox/Formatter/Parsers/Parser.php @@ -106,10 +106,12 @@ private function xmlify($data, $structure = null, $basenode = 'xml') { /** * Return an xml representation of the data stored in the parser * + * @param string $baseNode + * * @return string An xml string representing the encapsulated data */ - public function toXml() { - return $this->xmlify($this->toArray()); + public function toXml($baseNode = 'xml') { + return $this->xmlify($this->toArray(), null, $baseNode); } private function csvify($data) { From eeabfc49922a73814f8f953b894abae79d8fd300 Mon Sep 17 00:00:00 2001 From: Leandro Ross Date: Wed, 31 Jan 2018 15:52:10 -0200 Subject: [PATCH 63/73] Multiple updates - Update composer.json - Upgrade to PSR-4 - add parameter newline, delimiter, enclosure, and escape to export csv - When converting a XML to an array, convert @attributes to _attribute_ - add parameter encoding and formated to export xml - JSON parse fix (Instead of only converting the first level to array, use the associative array parameter with true, so all levels will be decoded to array structure) - Add support for laravel 5 - add package discovery for laravel 5 --- composer.json | 68 +++--- readme.md | 12 ++ src/ArrayHelpers.php | 27 +++ src/Formatter.php | 93 +++++++++ src/FormatterServiceProvider.php | 63 ++++++ src/Parsers/ArrayParser.php | 29 +++ src/Parsers/CsvParser.php | 47 +++++ src/Parsers/JsonParser.php | 18 ++ src/Parsers/Parser.php | 194 ++++++++++++++++++ src/Parsers/XmlParser.php | 45 ++++ .../Formatter => }/Parsers/YamlParser.php | 0 src/SoapBox/Formatter/ArrayHelpers.php | 23 --- src/SoapBox/Formatter/Formatter.php | 81 -------- .../Formatter/FormatterServiceProvider.php | 43 ---- src/SoapBox/Formatter/Parsers/ArrayParser.php | 26 --- src/SoapBox/Formatter/Parsers/CsvParser.php | 44 ---- src/SoapBox/Formatter/Parsers/JsonParser.php | 15 -- src/SoapBox/Formatter/Parsers/Parser.php | 167 --------------- src/SoapBox/Formatter/Parsers/XmlParser.php | 36 ---- tests/Bootstrap.php | 2 +- tests/TestCase.php | 25 ++- tests/unit/ParserTest.php | 146 ++++++------- 22 files changed, 658 insertions(+), 546 deletions(-) create mode 100644 src/ArrayHelpers.php create mode 100644 src/Formatter.php create mode 100644 src/FormatterServiceProvider.php create mode 100644 src/Parsers/ArrayParser.php create mode 100644 src/Parsers/CsvParser.php create mode 100644 src/Parsers/JsonParser.php create mode 100644 src/Parsers/Parser.php create mode 100644 src/Parsers/XmlParser.php rename src/{SoapBox/Formatter => }/Parsers/YamlParser.php (100%) delete mode 100644 src/SoapBox/Formatter/ArrayHelpers.php delete mode 100644 src/SoapBox/Formatter/Formatter.php delete mode 100644 src/SoapBox/Formatter/FormatterServiceProvider.php delete mode 100644 src/SoapBox/Formatter/Parsers/ArrayParser.php delete mode 100644 src/SoapBox/Formatter/Parsers/CsvParser.php delete mode 100644 src/SoapBox/Formatter/Parsers/JsonParser.php delete mode 100644 src/SoapBox/Formatter/Parsers/Parser.php delete mode 100644 src/SoapBox/Formatter/Parsers/XmlParser.php diff --git a/composer.json b/composer.json index 36d7598..a71a691 100644 --- a/composer.json +++ b/composer.json @@ -1,33 +1,43 @@ { - "name": "soapbox/laravel-formatter", - "type": "library", - "description": "A formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others.", - "keywords": ["laravel", "formatter", "data", "convert", "csv", "xml", "yaml"], + "name": "soapbox/laravel-formatter", + "type": "library", + "description": "A formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others.", + "keywords": ["laravel", "formatter", "data", "convert", "csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", - "version": "2.0", - "authors": [ - { - "name": "Graham McCarthy", - "email": "graham@soapboxhq.com", - "homepage": "http://grahammccarthy.com" - }, - { - "name": "Jaspaul Bola", - "email": "jaspaul.b@gamil.com", - "homepage": "http://jaspaulbola.com" - } - ], - "require": { - "php": ">=5.4.0", - "league/csv": "~6.0", - "mustangostang/spyc": "0.5.*@dev", - "illuminate/support": ">=4.0" - }, - "autoload": { - "psr-0": { - "SoapBox\\Formatter": "src/" - } - }, - "minimum-stability": "dev" + "version": "3.0", + "authors": [ + { + "name": "Graham McCarthy", + "email": "graham@soapboxhq.com", + "homepage": "http://grahammccarthy.com" + }, + { + "name": "Jaspaul Bola", + "email": "jaspaul.b@gamil.com", + "homepage": "http://jaspaulbola.com" + } + ], + "require": { + "php" : ">=7.0.10", + "league/csv": "~9.0", + "mustangostang/spyc": "~0.6", + "illuminate/support": "5.5.x" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5" + }, + "autoload": { + "psr-4": { + "SoapBox\\Formatter\\": "src/" + } + }, + "extra": { + "laravel": { + "aliases": { + "Formatter": "SoapBox\\Formatter" + } + } + }, + "minimum-stability": "stable" } diff --git a/readme.md b/readme.md index a1dfc9f..01741fc 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,15 @@ +Changelog +================ + +- Update composer.json +- Upgrade to PSR-4 +- add parameter newline, delimiter, enclosure, and escape to export csv +- When converting a XML to an array, convert @attributes to _attribute_ +- add parameter encoding and formated to export xml +- JSON parse fix (Instead of only converting the first level to array, use the associative array parameter with true, so all levels will be decoded to array structure) +- Add support for laravel 5 +- add package discovery for laravel 5 + Formatter Bundle ================ diff --git a/src/ArrayHelpers.php b/src/ArrayHelpers.php new file mode 100644 index 0000000..d6a9d09 --- /dev/null +++ b/src/ArrayHelpers.php @@ -0,0 +1,27 @@ +parser = $parser; + } + + public function toJson() + { + return $this->parser->toJson(); + } + + public function toArray() + { + return $this->parser->toArray(); + } + + public function toYaml() + { + return $this->parser->toYaml(); + } + + public function toXml($baseNode = 'xml', $encoding = 'utf-8', $formated = false) + { + return $this->parser->toXml($baseNode, $encoding, $formated); + } + + public function toCsv($newline = "\n", $delimiter = ",", $enclosure = '"', $escape = "\\") + { + return $this->parser->toCsv($newline, $delimiter, $enclosure, $escape); + } +} diff --git a/src/FormatterServiceProvider.php b/src/FormatterServiceProvider.php new file mode 100644 index 0000000..dc8702a --- /dev/null +++ b/src/FormatterServiceProvider.php @@ -0,0 +1,63 @@ +package('soapbox/laravel-formatter'); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app['formatter'] = $this->app->share(function ($app) { + return new Formatter; + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return ['formatter']; + } + +} diff --git a/src/Parsers/ArrayParser.php b/src/Parsers/ArrayParser.php new file mode 100644 index 0000000..4950957 --- /dev/null +++ b/src/Parsers/ArrayParser.php @@ -0,0 +1,29 @@ +array = (array) $data; + } else { + throw new InvalidArgumentException( + 'ArrayParser only accepts (optionally serialized) [object, array] for $data.' + ); + } + } + + public function toArray() + { + return $this->array; + } +} diff --git a/src/Parsers/CsvParser.php b/src/Parsers/CsvParser.php new file mode 100644 index 0000000..40248c1 --- /dev/null +++ b/src/Parsers/CsvParser.php @@ -0,0 +1,47 @@ +csv = Reader::createFromString($data); + } else { + throw new InvalidArgumentException( + 'CsvParser only accepts (string) [csv] for $data.' + ); + } + } + + public function toArray() + { + $temp = $this->csv->jsonSerialize(); + + $headings = $temp[0]; + $result = $headings; + + if (count($temp) > 1) { + $result = []; + for ($i = 1; $i < count($temp); ++$i) { + $row = []; + for ($j = 0; $j < count($headings); ++$j) { + $row[$headings[$j]] = $temp[$i][$j]; + } + $expanded = []; + foreach ($row as $key => $value) { + ArrayHelpers::set($expanded, $key, $value); + } + $result[] = $expanded; + } + } + + return $result; + } +} diff --git a/src/Parsers/JsonParser.php b/src/Parsers/JsonParser.php new file mode 100644 index 0000000..a83b70e --- /dev/null +++ b/src/Parsers/JsonParser.php @@ -0,0 +1,18 @@ +json = json_decode(trim($data), true); + } + + public function toArray() + { + return $this->json; + } + +} diff --git a/src/Parsers/Parser.php b/src/Parsers/Parser.php new file mode 100644 index 0000000..190ab48 --- /dev/null +++ b/src/Parsers/Parser.php @@ -0,0 +1,194 @@ +toArray()); + } + + /** + * Return a yaml representation of the data stored in the parser + * + * @return string A yaml string representing the encapsulated data + */ + public function toYaml() + { + return Spyc::YAMLDump($this->toArray()); + } + + /** + * To XML conversion + * + * @param mixed $data + * @param null $structure + * @param null|string $basenode + * @param null|string $encoding + * @return string + */ + private function xmlify($data, $structure = null, $basenode = 'xml', $encoding = 'utf-8', $formatted = false) + { + // turn off compatibility mode as simple xml throws a wobbly if you don't. + if (ini_get('zend.ze1_compatibility_mode') == 1) { + ini_set('zend.ze1_compatibility_mode', 0); + } + + if ($structure == null) { + $structure = simplexml_load_string("<$basenode />"); + } + + // Force it to be something useful + if (!is_array($data) && !is_object($data)) { + $data = (array) $data; + } + + foreach ($data as $key => $value) { + // checking for xml tag having attributes + if ($key === '@attributes') { + //STRICT IS NECESSARY because if key is numeric @attributes will be cast to integer and 0 == 0! + foreach ($data[$key] as $attrName => $attrValue) { + $structure->addAttribute($attrName, $attrValue); + } + } else { + // convert our booleans to 0/1 integer values so they are + // not converted to blanks. + if (is_bool($value)) { + $value = (int) $value; + } + + // no numeric keys in our xml please! + if (is_numeric($key)) { + // make string key... + if (isset($value['@name']) && is_string($value['@name'])) { + $key = $value['@name']; + } else { + $key = (Str::singular($basenode) != $basenode) ? Str::singular($basenode) : 'item'; + } + + unset($value['@name']); + } + + // replace anything not alpha numeric AND '@' because of '@attributes' + $key = preg_replace('/[^a-z_@\-0-9]/i', '', $key); + + // if there is another array found recursively call this function + if (is_array($value) or is_object($value)) { + $node = $structure->addChild($key); + + // recursive call if value is not empty + if (!empty($value)) { + $this->xmlify($value, $node, $key); + } + } else { + // add single node. + $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8"); + $structure->addChild($key, $value); + } + } + } + + // return formatted xml + if ($formatted) { + $dom = dom_import_simplexml($structure)->ownerDocument; + $dom->formatOutput = true; + return $dom->saveXML(); + } + + // pass back as string. or simple xml object if you want! + return $structure->asXML(); + } + + /** + * Return an xml representation of the data stored in the parser + * + * @param string $baseNode + * @param string $encoding + * @param bool $formatted + * @return string An xml string representing the encapsulated data + */ + public function toXml($baseNode = 'xml', $encoding = 'utf-8', $formatted = false) + { + return $this->xmlify($this->toArray(), null, $baseNode, $encoding, $formatted); + } + + private function csvify($data) + { + $results = []; + foreach ($data as $row) { + $results[] = array_values(ArrayHelpers::dot($row)); + } + return $results; + } + + /** + * Ported from laravel-formatter + * https://github.com/SoapBox/laravel-formatter + * + * Return a csv representation of the data stored in the parser + * @author Daniel Berry + * @license MIT License (see LICENSE.readme included in the bundle) + * + * @return string An csv string representing the encapsulated data + */ + public function toCsv($newline = "\n", $delimiter = ",", $enclosure = '"', $escape = "\\") + { + $data = $this->toArray(); + + if (ArrayHelpers::isAssociative($data) || !is_array($data[0])) { + $data = [$data]; + } + + $escaper = function ($items) use ($enclosure, $escape) { + return array_map(function ($item) use ($enclosure, $escape) { + return str_replace($enclosure, $escape . $enclosure, $item); + }, $items); + }; + + $headings = ArrayHelpers::dotKeys($data[0]); + $result = []; + + foreach ($data as $row) { + $result[] = array_values(ArrayHelpers::dot($row)); + } + + $data = $result; + + $output = $enclosure . implode($enclosure . $delimiter . $enclosure, $escaper($headings)) . $enclosure . $newline; + + foreach ($data as $row) { + $output .= $enclosure . implode($enclosure . $delimiter . $enclosure, $escaper((array) $row)) . $enclosure . $newline; + } + + return rtrim($output, $newline); + } +} diff --git a/src/Parsers/XmlParser.php b/src/Parsers/XmlParser.php new file mode 100644 index 0000000..973d555 --- /dev/null +++ b/src/Parsers/XmlParser.php @@ -0,0 +1,45 @@ + + * @license MIT License (see LICENSE.readme included in the bundle) + */ + private function objectify($value) + { + $temp = is_string($value) ? + simplexml_load_string($value, 'SimpleXMLElement', LIBXML_NOCDATA) : + $value; + + $result = []; + + foreach ((array) $temp as $key => $value) { + if ($key === "@attributes") { + $result['_' . key($value)] = $value[key($value)]; + } elseif (count($value) < 1) { + $result[$key] = ''; + } else { + $result[$key] = (is_array($value) or is_object($value)) ? $this->objectify($value) : $value; + } + } + + return $result; + } + + public function __construct($data) + { + $this->xml = $this->objectify($data); + } + + public function toArray() + { + return (array) $this->xml; + } +} diff --git a/src/SoapBox/Formatter/Parsers/YamlParser.php b/src/Parsers/YamlParser.php similarity index 100% rename from src/SoapBox/Formatter/Parsers/YamlParser.php rename to src/Parsers/YamlParser.php diff --git a/src/SoapBox/Formatter/ArrayHelpers.php b/src/SoapBox/Formatter/ArrayHelpers.php deleted file mode 100644 index 42ec4e3..0000000 --- a/src/SoapBox/Formatter/ArrayHelpers.php +++ /dev/null @@ -1,23 +0,0 @@ -parser = $parser; - } - - public function toJson() { - return $this->parser->toJson(); - } - - public function toArray() { - return $this->parser->toArray(); - } - - public function toYaml() { - return $this->parser->toYaml(); - } - - public function toXml($baseNode = 'xml') { - return $this->parser->toXml($baseNode); - } - - public function toCsv() { - return $this->parser->toCsv(); - } -} diff --git a/src/SoapBox/Formatter/FormatterServiceProvider.php b/src/SoapBox/Formatter/FormatterServiceProvider.php deleted file mode 100644 index 903ee2e..0000000 --- a/src/SoapBox/Formatter/FormatterServiceProvider.php +++ /dev/null @@ -1,43 +0,0 @@ -package('soapbox/laravel-formatter'); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() { - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() { - return array(); - } - -} diff --git a/src/SoapBox/Formatter/Parsers/ArrayParser.php b/src/SoapBox/Formatter/Parsers/ArrayParser.php deleted file mode 100644 index aa569cb..0000000 --- a/src/SoapBox/Formatter/Parsers/ArrayParser.php +++ /dev/null @@ -1,26 +0,0 @@ -array = (array) $data; - } else { - throw new InvalidArgumentException( - 'ArrayParser only accepts (optionally serialized) [object, array] for $data.' - ); - } - } - - public function toArray() { - return $this->array; - } -} diff --git a/src/SoapBox/Formatter/Parsers/CsvParser.php b/src/SoapBox/Formatter/Parsers/CsvParser.php deleted file mode 100644 index 5f57fb6..0000000 --- a/src/SoapBox/Formatter/Parsers/CsvParser.php +++ /dev/null @@ -1,44 +0,0 @@ -csv = Reader::createFromString($data); - } else { - throw new InvalidArgumentException( - 'CsvParser only accepts (string) [csv] for $data.' - ); - } - } - - public function toArray() { - $temp = $this->csv->jsonSerialize(); - - $headings = $temp[0]; - $result = $headings; - - if (count($temp) > 1) { - $result = []; - for ($i = 1; $i < count($temp); ++$i) { - $row = []; - for ($j = 0; $j < count($headings); ++$j) { - $row[$headings[$j]] = $temp[$i][$j]; - } - $expanded = []; - foreach ($row as $key => $value) { - ArrayHelpers::set($expanded, $key, $value); - } - $result[] = $expanded; - } - } - - return $result; - } -} diff --git a/src/SoapBox/Formatter/Parsers/JsonParser.php b/src/SoapBox/Formatter/Parsers/JsonParser.php deleted file mode 100644 index 372ec68..0000000 --- a/src/SoapBox/Formatter/Parsers/JsonParser.php +++ /dev/null @@ -1,15 +0,0 @@ -json = json_decode(trim($data)); - } - - public function toArray() { - return (array) $this->json; - } - -} diff --git a/src/SoapBox/Formatter/Parsers/Parser.php b/src/SoapBox/Formatter/Parsers/Parser.php deleted file mode 100644 index 83eebe5..0000000 --- a/src/SoapBox/Formatter/Parsers/Parser.php +++ /dev/null @@ -1,167 +0,0 @@ -toArray()); - } - - /** - * Return a yaml representation of the data stored in the parser - * - * @return string A yaml string representing the encapsulated data - */ - public function toYaml() { - return Spyc::YAMLDump($this->toArray()); - } - - /** - * To XML conversion - * - * @param mixed $data - * @param null $structure - * @param null|string $basenode - * @return string - */ - private function xmlify($data, $structure = null, $basenode = 'xml') { - // turn off compatibility mode as simple xml throws a wobbly if you don't. - if (ini_get('zend.ze1_compatibility_mode') == 1) { - ini_set('zend.ze1_compatibility_mode', 0); - } - - if ($structure == null) { - $structure = simplexml_load_string("<$basenode />"); - } - - // Force it to be something useful - if (!is_array($data) && !is_object($data)) { - $data = (array) $data; - } - - foreach ($data as $key => $value) { - // convert our booleans to 0/1 integer values so they are - // not converted to blanks. - if (is_bool($value)) { - $value = (int) $value; - } - - // no numeric keys in our xml please! - if (is_numeric($key)) { - // make string key... - $key = (Str::singular($basenode) != $basenode) ? Str::singular($basenode) : 'item'; - } - - // replace anything not alpha numeric - $key = preg_replace('/[^a-z_\-0-9]/i', '', $key); - - // if there is another array found recrusively call this function - if (is_array($value) or is_object($value)) { - $node = $structure->addChild($key); - - // recursive call if value is not empty - if (!empty($value)) { - $this->xmlify($value, $node, $key); - } - } else { - // add single node. - $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8"); - - $structure->addChild($key, $value); - } - } - - // pass back as string. or simple xml object if you want! - return $structure->asXML(); - } - - /** - * Return an xml representation of the data stored in the parser - * - * @param string $baseNode - * - * @return string An xml string representing the encapsulated data - */ - public function toXml($baseNode = 'xml') { - return $this->xmlify($this->toArray(), null, $baseNode); - } - - private function csvify($data) { - $results = []; - foreach ($data as $row) { - $results[] = array_values(ArrayHelpers::dot($row)); - } - return $results; - } - - /** - * Ported from laravel-formatter - * https://github.com/SoapBox/laravel-formatter - * - * @author Daniel Berry - * @license MIT License (see LICENSE.readme included in the bundle) - * - * Return a csv representation of the data stored in the parser - * - * @return string An csv string representing the encapsulated data - */ - public function toCsv($newline = "\n", $delimiter = ",", $enclosure = '"', $escape = "\\") { - $data = $this->toArray(); - - if (ArrayHelpers::isAssociative($data) || !is_array($data[0])) { - $data = [$data]; - } - - $escaper = function($items) use($enclosure, $escape) { - return array_map(function($item) use($enclosure, $escape) { - return str_replace($enclosure, $escape.$enclosure, $item); - }, $items); - }; - - $headings = ArrayHelpers::dotKeys($data[0]); - $result = []; - - foreach ($data as $row) { - $result[] = array_values(ArrayHelpers::dot($row)); - } - - $data = $result; - - $output = $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper($headings)).$enclosure.$newline; - - foreach ($data as $row) - { - $output .= $enclosure.implode($enclosure.$delimiter.$enclosure, $escaper((array) $row)).$enclosure.$newline; - } - - return rtrim($output, $newline); - } -} diff --git a/src/SoapBox/Formatter/Parsers/XmlParser.php b/src/SoapBox/Formatter/Parsers/XmlParser.php deleted file mode 100644 index 100786d..0000000 --- a/src/SoapBox/Formatter/Parsers/XmlParser.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @license MIT License (see LICENSE.readme included in the bundle) - * - */ - private function objectify($value) { - $temp = is_string($value) ? - simplexml_load_string($value, 'SimpleXMLElement', LIBXML_NOCDATA) : - $value; - - $result = []; - - foreach ((array) $temp as $key => $value) { - $result[$key] = (is_array($value) or is_object($value)) ? $this->objectify($value) : $value; - } - - return $result; - } - - public function __construct($data) { - $this->xml = $this->objectify($data); - } - - public function toArray() { - return (array) $this->xml; - } -} diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 728f2cb..f81daa6 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -1,5 +1,5 @@ toArray(); - $expected = ['foo'=>'bar', 'bar'=>'foo']; - - $this->assertEquals($expected, $actual); - } - - /** - * A basic functional test for Array to JSON conversion - * - * @return void - */ - public function testArrayToJson() { - $data = ['foo'=>'bar', 'bar'=>'foo']; - - $actual = Formatter::make($data, Formatter::ARR)->toJson(); - $expected = '{"foo":"bar","bar":"foo"}'; - - $this->assertEquals($expected, $actual); - } - - /** - * A basic functional test for CSV data to array - * - * @return void - */ - public function testCSVToArray() { - $data = 'foo,bar,bing,bam,boom'; - - $actual = Formatter::make($data, Formatter::CSV)->toArray(); - $expected = array('foo','bar','bing','bam','boom'); - - $this->assertEquals($expected, $actual); - } - - /** - * A basic functional test for testJSONToXMLToArrayToJsonToArray data to array - * - * @return void - */ - public function testJSONToXMLToArrayToJsonToArray() { - $data = '{"foo":"bar","bar":"foo"}'; - - $result = Formatter::make($data, Formatter::JSON)->toXml(); - $result = Formatter::make($result, Formatter::XML)->toArray(); - $result = Formatter::make($result, Formatter::ARR)->toJson(); - $actual = Formatter::make($result, Formatter::JSON)->toArray(); - - $expected = ['foo'=>'bar', 'bar'=>'foo']; - - $this->assertEquals($expected, $actual); - } - - public function testMultiDimensionalArrayFromJsonToCsv() { - $expected = "\"simple\",\"date\",\"time\",\"duration_onset\",\"devicename\",\"calc_data.0.0\",\"calc_data.0.1\",\"calc_data.0.2\",\"calc_data.0.3\",\"calc_data.0.4\",\"calc_data.0.5\",\"calc_data.1.0\",\"calc_data.1.1\",\"calc_data.1.2\",\"calc_data.1.3\",\"calc_data.1.4\",\"calc_data.1.5\"\n\"118\",\"2014-05-20 21:03:59.333\",\"4067\",\"\",\"My Device\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\""; - - $json = -'{ +class ParserTest extends TestCase +{ + + /** + * A basic functional test for JSON to Array conversion + * + * @return void + */ + public function testJsonToArray() + { + $data = '{"foo":"bar","bar":"foo"}'; + + $actual = Formatter::make($data, Formatter::JSON)->toArray(); + $expected = ['foo' => 'bar', 'bar' => 'foo']; + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for Array to JSON conversion + * + * @return void + */ + public function testArrayToJson() + { + $data = ['foo' => 'bar', 'bar' => 'foo']; + + $actual = Formatter::make($data, Formatter::ARR)->toJson(); + $expected = '{"foo":"bar","bar":"foo"}'; + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for CSV data to array + * + * @return void + */ + public function testCSVToArray() + { + $data = 'foo,bar,bing,bam,boom'; + + $actual = Formatter::make($data, Formatter::CSV)->toArray(); + $expected = ['foo', 'bar', 'bing', 'bam', 'boom']; + + $this->assertEquals($expected, $actual); + } + + /** + * A basic functional test for testJSONToXMLToArrayToJsonToArray data to array + * + * @return void + */ + public function testJSONToXMLToArrayToJsonToArray() + { + $data = '{"foo":"bar","bar":"foo"}'; + + $result = Formatter::make($data, Formatter::JSON)->toXml(); + $result = Formatter::make($result, Formatter::XML)->toArray(); + $result = Formatter::make($result, Formatter::ARR)->toJson(); + $actual = Formatter::make($result, Formatter::JSON)->toArray(); + + $expected = ['foo' => 'bar', 'bar' => 'foo']; + + $this->assertEquals($expected, $actual); + } + + public function testMultiDimensionalArrayFromJsonToCsv() + { + $expected = "\"simple\",\"date\",\"time\",\"duration_onset\",\"devicename\",\"calc_data.0.0\",\"calc_data.0.1\",\"calc_data.0.2\",\"calc_data.0.3\",\"calc_data.0.4\",\"calc_data.0.5\",\"calc_data.1.0\",\"calc_data.1.1\",\"calc_data.1.2\",\"calc_data.1.3\",\"calc_data.1.4\",\"calc_data.1.5\"\n\"118\",\"2014-05-20 21:03:59.333\",\"4067\",\"\",\"My Device\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\",\"1400609039\",\"0\",\"37\",\"0\",\"0\",\"1\""; + + $json = + '{ "simple":"118", "date":"2014-05-20 21:03:59.333", "time":"4067", @@ -93,9 +99,9 @@ public function testMultiDimensionalArrayFromJsonToCsv() { ] ] }'; - $jsonParser = Formatter::make($json, Formatter::JSON); + $jsonParser = Formatter::make($json, Formatter::JSON); - $this->assertEquals($expected, $jsonParser->toCsv()); - } + $this->assertEquals($expected, $jsonParser->toCsv()); + } } From 572429ac0b87f23a90f7d89014f7c8cba20b436d Mon Sep 17 00:00:00 2001 From: Leandro Ross Date: Wed, 31 Jan 2018 15:58:24 -0200 Subject: [PATCH 64/73] update travis --- .travis.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index c08b8d6..2c5f8b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,17 @@ language: php php: - - 5.4 - - 5.5 - - 5.6 + - 7.0 + - 7.1 + - 7.2 -before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install --dev +matrix: + allow_failures: + - php: 7.2 -script: phpunit +before_script: + - composer self-update + - composer install --no-interaction +script: + - vendor/bin/phpunit \ No newline at end of file From 9b497e00873afb3f4536c1715832401d32b88e88 Mon Sep 17 00:00:00 2001 From: Leandro Ross Date: Wed, 31 Jan 2018 16:19:34 -0200 Subject: [PATCH 65/73] Added delimiter to CSV --- readme.md | 1 + src/Formatter.php | 9 +- src/Parsers/CsvParser.php | 7 +- tests/unit/FormatterTest.php | 76 +++++++------ tests/unit/Parsers/ArrayParserTest.php | 101 ++++++++++-------- tests/unit/Parsers/CsvParserDelemiterTest.php | 41 +++++++ tests/unit/Parsers/CsvParserTest.php | 51 +++++---- tests/unit/Parsers/JsonParserTest.php | 49 +++++---- tests/unit/Parsers/XmlParserTest.php | 36 ++++--- tests/unit/Parsers/YamlParserTest.php | 29 ++--- 10 files changed, 240 insertions(+), 160 deletions(-) create mode 100644 tests/unit/Parsers/CsvParserDelemiterTest.php diff --git a/readme.md b/readme.md index 01741fc..3d13aeb 100644 --- a/readme.md +++ b/readme.md @@ -9,6 +9,7 @@ Changelog - JSON parse fix (Instead of only converting the first level to array, use the associative array parameter with true, so all levels will be decoded to array structure) - Add support for laravel 5 - add package discovery for laravel 5 +- add support delimiter to a csv Formatter Bundle ================ diff --git a/src/Formatter.php b/src/Formatter.php index 5e47b79..d28210c 100644 --- a/src/Formatter.php +++ b/src/Formatter.php @@ -29,17 +29,18 @@ class Formatter /** * Make: Returns an instance of formatter initialized with data and type * - * @param mixed $data The data that formatter should parse - * @param string $type The type of data formatter is expected to parse + * @param mixed $data The data that formatter should parse + * @param string $type The type of data formatter is expected to parse + * @param string $delimiter The delimitation of data formatter to csv * @return Formatter */ - public static function make($data, $type) + public static function make($data, $type, $delimiter = null) { if (in_array($type, self::$supportedTypes)) { $parser = null; switch ($type) { case self::CSV: - $parser = new CsvParser($data); + $parser = new CsvParser($data, $delimiter); break; case self::JSON: $parser = new JsonParser($data); diff --git a/src/Parsers/CsvParser.php b/src/Parsers/CsvParser.php index 40248c1..3dbd236 100644 --- a/src/Parsers/CsvParser.php +++ b/src/Parsers/CsvParser.php @@ -6,13 +6,16 @@ class CsvParser extends Parser { - private $csv; - public function __construct($data) + public function __construct($data, $delimiter = null) { if (is_string($data)) { $this->csv = Reader::createFromString($data); + if ($delimiter) { + $this->csv->setDelimiter($delimiter); + } + $this->csv->setEnclosure('|'); } else { throw new InvalidArgumentException( 'CsvParser only accepts (string) [csv] for $data.' diff --git a/tests/unit/FormatterTest.php b/tests/unit/FormatterTest.php index d1e96a5..88e5948 100644 --- a/tests/unit/FormatterTest.php +++ b/tests/unit/FormatterTest.php @@ -2,53 +2,61 @@ use SoapBox\Formatter\Formatter; -class FormatterTest extends TestCase { +class FormatterTest extends TestCase +{ - public function testFormatterProvidesCsvConstant() { - $expected = 'csv'; - $actual = Formatter::CSV; + public function testFormatterProvidesCsvConstant() + { + $expected = 'csv'; + $actual = Formatter::CSV; - $this->assertEquals($expected, $actual); - } + $this->assertEquals($expected, $actual); + } - public function testFormatterProvidesJsonConstant() { - $expected = 'json'; - $actual = Formatter::JSON; + public function testFormatterProvidesJsonConstant() + { + $expected = 'json'; + $actual = Formatter::JSON; - $this->assertEquals($expected, $actual); - } + $this->assertEquals($expected, $actual); + } - public function testFormatterProvidesXmlConstant() { - $expected = 'xml'; - $actual = Formatter::XML; + public function testFormatterProvidesXmlConstant() + { + $expected = 'xml'; + $actual = Formatter::XML; - $this->assertEquals($expected, $actual); - } + $this->assertEquals($expected, $actual); + } - public function testFormatterProvidesArrayConstant() { - $expected = 'array'; - $actual = Formatter::ARR; + public function testFormatterProvidesArrayConstant() + { + $expected = 'array'; + $actual = Formatter::ARR; - $this->assertEquals($expected, $actual); - } + $this->assertEquals($expected, $actual); + } - public function testFormatterProvidesYamlConstant() { - $expected = 'yaml'; - $actual = Formatter::YAML; + public function testFormatterProvidesYamlConstant() + { + $expected = 'yaml'; + $actual = Formatter::YAML; - $this->assertEquals($expected, $actual); - } + $this->assertEquals($expected, $actual); + } /** * @expectedException InvalidArgumentException */ - public function testFormatterMakeThrowsInvalidTypeException() { - $formatter = Formatter::make('', 'blue'); - } - - public function testFormatterMakeReturnsInstanceOfFormatter() { - $formatter = Formatter::make('', Formatter::CSV); - $this->assertTrue($formatter instanceof Formatter); - } + public function testFormatterMakeThrowsInvalidTypeException() + { + $formatter = Formatter::make('', 'blue'); + } + + public function testFormatterMakeReturnsInstanceOfFormatter() + { + $formatter = Formatter::make('', Formatter::CSV); + $this->assertTrue($formatter instanceof Formatter); + } } diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index d18c0b3..ebe609e 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -1,58 +1,67 @@ assertTrue($parser instanceof Parser); - } + public function testArrayParserIsInstanceOfParserInterface() + { + $parser = new ArrayParser(new \stdClass); + $this->assertTrue($parser instanceof Parser); + } - public function testConstructorAcceptsSerializedArray() { - $expected = [0, 1, 2]; - $parser = new ArrayParser(serialize($expected)); - $this->assertEquals($expected, $parser->toArray()); - } + public function testConstructorAcceptsSerializedArray() + { + $expected = [0, 1, 2]; + $parser = new ArrayParser(serialize($expected)); + $this->assertEquals($expected, $parser->toArray()); + } - public function testConstructorAcceptsObject() { - $expected = ['foo' => 'bar']; - $input = new stdClass; - $input->foo = 'bar'; - $parser = new ArrayParser($input); - $this->assertEquals($expected, $parser->toArray()); - } + public function testConstructorAcceptsObject() + { + $expected = ['foo' => 'bar']; + $input = new stdClass; + $input->foo = 'bar'; + $parser = new ArrayParser($input); + $this->assertEquals($expected, $parser->toArray()); + } /** * @expectedException InvalidArgumentException */ - public function testArrayParserThrowsExceptionWithInvalidInputOfEmptyString() { - $parser = new ArrayParser(''); - } - - public function testtoArrayReturnsArray() { - $parser = new ArrayParser(serialize([0, 1, 2])); - $this->assertTrue(is_array($parser->toArray())); - } - - public function testtoJsonReturnsJsonRepresentationOfArray() { - $expected = '[0,1,2]'; - $parser = new ArrayParser([0, 1, 2]); - $this->assertEquals($expected, $parser->toJson()); - } - - public function testtoJsonReturnsJsonRepresentationOfNamedArray() { - $expected = '{"foo":"bar"}'; - $parser = new ArrayParser(['foo' => 'bar']); - $this->assertEquals($expected, $parser->toJson()); - } - - public function testtoCSVFromArrayContainingContentWithCommasWorks() { - $expected = "\"0\",\"1\",\"2\",\"3\"\n\"a\",\"b\",\"c,e\",\"d\""; - $parser = new ArrayParser(['a','b','c,e','d']); - $this->assertEquals($expected, $parser->toCsv()); - } + public function testArrayParserThrowsExceptionWithInvalidInputOfEmptyString() + { + $parser = new ArrayParser(''); + } + + public function testtoArrayReturnsArray() + { + $parser = new ArrayParser(serialize([0, 1, 2])); + $this->assertTrue(is_array($parser->toArray())); + } + + public function testtoJsonReturnsJsonRepresentationOfArray() + { + $expected = '[0,1,2]'; + $parser = new ArrayParser([0, 1, 2]); + $this->assertEquals($expected, $parser->toJson()); + } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() + { + $expected = '{"foo":"bar"}'; + $parser = new ArrayParser(['foo' => 'bar']); + $this->assertEquals($expected, $parser->toJson()); + } + + public function testtoCSVFromArrayContainingContentWithCommasWorks() + { + $expected = "\"0\",\"1\",\"2\",\"3\"\n\"a\",\"b\",\"c,e\",\"d\""; + $parser = new ArrayParser(['a', 'b', 'c,e', 'd']); + $this->assertEquals($expected, $parser->toCsv()); + } } diff --git a/tests/unit/Parsers/CsvParserDelemiterTest.php b/tests/unit/Parsers/CsvParserDelemiterTest.php new file mode 100644 index 0000000..87d11bd --- /dev/null +++ b/tests/unit/Parsers/CsvParserDelemiterTest.php @@ -0,0 +1,41 @@ +assertTrue($parser instanceof Parser); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() + { + $parser = new CsvParser([0, 1, 3], ';'); + } + + public function testtoArrayReturnsCsvArrayRepresentation() + { + $expected = [['foo' => 'bar', 'boo' => 'far']]; + $parser = new CsvParser($this->simpleCsv, ';'); + $this->assertEquals($expected, $parser->toArray()); + } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() + { + $expected = '[{"foo":"bar","boo":"far"}]'; + $parser = new CsvParser($this->simpleCsv, ';'); + $this->assertEquals($expected, $parser->toJson()); + } + +} diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 39547c0..246416e 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -1,36 +1,41 @@ assertTrue($parser instanceof Parser); - } + public function testCsvParserIsInstanceOfParserInterface() + { + $parser = new CsvParser(''); + $this->assertTrue($parser instanceof Parser); + } /** * @expectedException InvalidArgumentException */ - public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() { - $parser = new CsvParser([0, 1, 3]); - } - - public function testtoArrayReturnsCsvArrayRepresentation() { - $expected = [['foo' => 'bar', 'boo' => 'far']]; - $parser = new CsvParser($this->simpleCsv); - $this->assertEquals($expected, $parser->toArray()); - } - - public function testtoJsonReturnsJsonRepresentationOfNamedArray() { - $expected = '[{"foo":"bar","boo":"far"}]'; - $parser = new CsvParser($this->simpleCsv); - $this->assertEquals($expected, $parser->toJson()); - } + public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() + { + $parser = new CsvParser([0, 1, 3]); + } + + public function testtoArrayReturnsCsvArrayRepresentation() + { + $expected = [['foo' => 'bar', 'boo' => 'far']]; + $parser = new CsvParser($this->simpleCsv); + $this->assertEquals($expected, $parser->toArray()); + } + + public function testtoJsonReturnsJsonRepresentationOfNamedArray() + { + $expected = '[{"foo":"bar","boo":"far"}]'; + $parser = new CsvParser($this->simpleCsv); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/JsonParserTest.php b/tests/unit/Parsers/JsonParserTest.php index 9bca418..17ebba7 100644 --- a/tests/unit/Parsers/JsonParserTest.php +++ b/tests/unit/Parsers/JsonParserTest.php @@ -1,31 +1,36 @@ assertTrue($parser instanceof Parser); - } + public function testJsonParserIsInstanceOfParserInterface() + { + $parser = new JsonParser(''); + $this->assertTrue($parser instanceof Parser); + } - public function testtoArrayReturnsArrayRepresentationOfJsonObject() { - $expected = ['foo' => 'bar']; - $parser = new JsonParser('{"foo": "bar"}'); - $this->assertEquals($expected, $parser->toArray()); - } + public function testtoArrayReturnsArrayRepresentationOfJsonObject() + { + $expected = ['foo' => 'bar']; + $parser = new JsonParser('{"foo": "bar"}'); + $this->assertEquals($expected, $parser->toArray()); + } - public function testtoJsonReturnsArrayRepresentationOfArray() { - $expected = '[0,1,2]'; - $parser = new JsonParser($expected); - $this->assertEquals($expected, $parser->toJson()); - } + public function testtoJsonReturnsArrayRepresentationOfArray() + { + $expected = '[0,1,2]'; + $parser = new JsonParser($expected); + $this->assertEquals($expected, $parser->toJson()); + } - public function testtoJsonReturnsJsonRepresentationOfNamedArray() { - $expected = '{"foo":"bar"}'; - $parser = new JsonParser($expected); - $this->assertEquals($expected, $parser->toJson()); - } + public function testtoJsonReturnsJsonRepresentationOfNamedArray() + { + $expected = '{"foo":"bar"}'; + $parser = new JsonParser($expected); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/XmlParserTest.php b/tests/unit/Parsers/XmlParserTest.php index 614be06..7f1b93b 100644 --- a/tests/unit/Parsers/XmlParserTest.php +++ b/tests/unit/Parsers/XmlParserTest.php @@ -1,25 +1,29 @@ assertTrue($parser instanceof Parser); - } + public function testXmlParserIsInstanceOfParserInterface() + { + $parser = new XmlParser(''); + $this->assertTrue($parser instanceof Parser); + } - public function testtoArrayReturnsArrayRepresenationOfXmlObject() { - $expected = ['foo' => 'bar']; - $parser = new XmlParser('bar'); - $this->assertEquals($expected, $parser->toArray()); - } + public function testtoArrayReturnsArrayRepresenationOfXmlObject() + { + $expected = ['foo' => 'bar']; + $parser = new XmlParser('bar'); + $this->assertEquals($expected, $parser->toArray()); + } - public function testtoJsonReturnsJsonRepresentationOfXmlObject() { - $expected = '{"foo":"bar"}'; - $parser = new XmlParser('bar'); - $this->assertEquals($expected, $parser->toJson()); - } + public function testtoJsonReturnsJsonRepresentationOfXmlObject() + { + $expected = '{"foo":"bar"}'; + $parser = new XmlParser('bar'); + $this->assertEquals($expected, $parser->toJson()); + } } diff --git a/tests/unit/Parsers/YamlParserTest.php b/tests/unit/Parsers/YamlParserTest.php index bf0edac..e25c53c 100644 --- a/tests/unit/Parsers/YamlParserTest.php +++ b/tests/unit/Parsers/YamlParserTest.php @@ -1,22 +1,25 @@ assertTrue($parser instanceof Parser); - } + public function testYamlParserIsInstanceOfParserInterface() + { + $parser = new YamlParser(''); + $this->assertTrue($parser instanceof Parser); + } - public function testtoArrayReturnsArrayRepresenationOfYamlObject() { - $expected = ['foo' => 'bar']; - $parser = new XmlParser('bar'); - $x = new YamlParser($parser->toYaml()); - $this->assertEquals($expected, $x->toArray()); - } + public function testtoArrayReturnsArrayRepresenationOfYamlObject() + { + $expected = ['foo' => 'bar']; + $parser = new XmlParser('bar'); + $x = new YamlParser($parser->toYaml()); + $this->assertEquals($expected, $x->toArray()); + } } From ce1307f446acc12aafb0d31fa1570ca8fa7d74b7 Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Fri, 23 Feb 2018 15:41:31 -0500 Subject: [PATCH 66/73] Update the xml parser to be compatible with php7.2 --- src/Parsers/XmlParser.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Parsers/XmlParser.php b/src/Parsers/XmlParser.php index 973d555..6f29104 100644 --- a/src/Parsers/XmlParser.php +++ b/src/Parsers/XmlParser.php @@ -2,7 +2,6 @@ class XmlParser extends Parser { - private $xml; /** @@ -23,7 +22,7 @@ private function objectify($value) foreach ((array) $temp as $key => $value) { if ($key === "@attributes") { $result['_' . key($value)] = $value[key($value)]; - } elseif (count($value) < 1) { + } elseif (is_array($value) && count($value) < 1) { $result[$key] = ''; } else { $result[$key] = (is_array($value) or is_object($value)) ? $this->objectify($value) : $value; From 92caea2feafcd99c0b28bb210cb1c6920377abbf Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Fri, 23 Feb 2018 15:41:50 -0500 Subject: [PATCH 67/73] Do not allow failures on PHP7.2 --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2c5f8b6..d5d034b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,6 @@ php: - 7.1 - 7.2 -matrix: - allow_failures: - - php: 7.2 - before_script: - composer self-update - composer install --no-interaction From f905d1695f2fd386c7af59722786aad21c736bde Mon Sep 17 00:00:00 2001 From: Jaspaul Bola Date: Fri, 23 Feb 2018 15:45:28 -0500 Subject: [PATCH 68/73] Removes commented out and duplicate use statements --- src/FormatterServiceProvider.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/FormatterServiceProvider.php b/src/FormatterServiceProvider.php index dc8702a..254b0d7 100644 --- a/src/FormatterServiceProvider.php +++ b/src/FormatterServiceProvider.php @@ -1,19 +1,6 @@ Date: Fri, 23 Feb 2018 15:48:57 -0500 Subject: [PATCH 69/73] Allow users to install illuminate/support 5.6.* if they choose --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a71a691..1dc12bc 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "php" : ">=7.0.10", "league/csv": "~9.0", "mustangostang/spyc": "~0.6", - "illuminate/support": "5.5.x" + "illuminate/support": "~5.5" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.5" From b47330b7810608bb729aba6c5afa44a36cf0e960 Mon Sep 17 00:00:00 2001 From: Resubaka Date: Thu, 7 Jun 2018 13:18:51 +0200 Subject: [PATCH 70/73] Fixed problem for composer require The problem was that the version of the tag and the version in composer json are not the same in tag 3.1 so it couldn't get found by composer. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a71a691..13d3de6 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "keywords": ["laravel", "formatter", "data", "convert", "csv", "xml", "yaml"], "homepage": "http://github.com/SoapBox/laravel-formatter", "license": "MIT", - "version": "3.0", + "version": "3.1.1", "authors": [ { "name": "Graham McCarthy", From 303d51f88f1c1b992e9c1a3d2c2db1e98dad7e5b Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Wed, 4 Sep 2019 08:00:00 -0400 Subject: [PATCH 71/73] update to Laravel 6 and fix test to be compatible with phpunit 8 --- .gitignore | 1 + composer.json | 6 +++--- phpunit.xml | 1 - tests/TestCase.php | 4 ++-- tests/unit/FormatterTest.php | 5 ++--- tests/unit/Parsers/ArrayParserTest.php | 5 ++--- tests/unit/Parsers/CsvParserDelemiterTest.php | 7 +++---- tests/unit/Parsers/CsvParserTest.php | 7 +++---- 8 files changed, 16 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 02ceb5d..9b1f65b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ composer.phar composer.lock .DS_Store notes +.phpunit.result.cache diff --git a/composer.json b/composer.json index e50a304..d36f01e 100644 --- a/composer.json +++ b/composer.json @@ -19,13 +19,13 @@ } ], "require": { - "php" : ">=7.0.10", + "php": "^7.2", "league/csv": "~9.0", "mustangostang/spyc": "~0.6", - "illuminate/support": "~5.5" + "illuminate/support": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5" + "phpunit/phpunit": "~8.0" }, "autoload": { "psr-4": { diff --git a/phpunit.xml b/phpunit.xml index 12bee7a..394c1b8 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" > diff --git a/tests/TestCase.php b/tests/TestCase.php index 0677586..40d0243 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -6,14 +6,14 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase /** * Runs prior to every test in the suite. */ - public function setUp() + public function setUp(): void { } /** * Runs after every test in the suite. */ - protected function tearDown() + protected function tearDown(): void { } diff --git a/tests/unit/FormatterTest.php b/tests/unit/FormatterTest.php index 88e5948..ea4ff36 100644 --- a/tests/unit/FormatterTest.php +++ b/tests/unit/FormatterTest.php @@ -45,11 +45,10 @@ public function testFormatterProvidesYamlConstant() $this->assertEquals($expected, $actual); } - /** - * @expectedException InvalidArgumentException - */ public function testFormatterMakeThrowsInvalidTypeException() { + $this->expectException(\InvalidArgumentException::class); + $formatter = Formatter::make('', 'blue'); } diff --git a/tests/unit/Parsers/ArrayParserTest.php b/tests/unit/Parsers/ArrayParserTest.php index ebe609e..fbce45c 100644 --- a/tests/unit/Parsers/ArrayParserTest.php +++ b/tests/unit/Parsers/ArrayParserTest.php @@ -30,11 +30,10 @@ public function testConstructorAcceptsObject() $this->assertEquals($expected, $parser->toArray()); } - /** - * @expectedException InvalidArgumentException - */ public function testArrayParserThrowsExceptionWithInvalidInputOfEmptyString() { + $this->expectException(\InvalidArgumentException::class); + $parser = new ArrayParser(''); } diff --git a/tests/unit/Parsers/CsvParserDelemiterTest.php b/tests/unit/Parsers/CsvParserDelemiterTest.php index 87d11bd..5dd3c37 100644 --- a/tests/unit/Parsers/CsvParserDelemiterTest.php +++ b/tests/unit/Parsers/CsvParserDelemiterTest.php @@ -15,12 +15,11 @@ public function testCsvParserIsInstanceOfParserInterface() $parser = new CsvParser('', ';'); $this->assertTrue($parser instanceof Parser); } - - /** - * @expectedException InvalidArgumentException - */ + public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() { + $this->expectException(\InvalidArgumentException::class); + $parser = new CsvParser([0, 1, 3], ';'); } diff --git a/tests/unit/Parsers/CsvParserTest.php b/tests/unit/Parsers/CsvParserTest.php index 246416e..e96553b 100644 --- a/tests/unit/Parsers/CsvParserTest.php +++ b/tests/unit/Parsers/CsvParserTest.php @@ -15,12 +15,11 @@ public function testCsvParserIsInstanceOfParserInterface() $parser = new CsvParser(''); $this->assertTrue($parser instanceof Parser); } - - /** - * @expectedException InvalidArgumentException - */ + public function testConstructorThrowsInvalidExecptionWhenArrayDataIsProvided() { + $this->expectException(\InvalidArgumentException::class); + $parser = new CsvParser([0, 1, 3]); } From 9f4454f44ef8279eb2c9b168ba0ac6edd64e278c Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Wed, 4 Sep 2019 08:05:26 -0400 Subject: [PATCH 72/73] update readme file --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 3d13aeb..acdf286 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,7 @@ Changelog ================ +- Update support for Laravel 6 & phpunit 8 - Update composer.json - Upgrade to PSR-4 - add parameter newline, delimiter, enclosure, and escape to export csv From 2855a8dc0cc94bed55a88ccc91daaa7c42769c50 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Wed, 4 Sep 2019 08:13:05 -0400 Subject: [PATCH 73/73] Update .travis.yml --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d5d034b..fd40cb3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: php php: - - 7.0 - - 7.1 - 7.2 + - 7.3 before_script: - composer self-update