[limb-svn] r7110 - in 3.x/trunk/limb/bundle: . src tests tests/cases tests/fixture tests/fixture/subfolder
svn at limb-project.com
svn at limb-project.com
Thu Jul 10 13:29:34 MSD 2008
Author: korchasa
Date: 2008-07-10 13:29:34 +0400 (Thu, 10 Jul 2008)
New Revision: 7110
URL: http://fisheye.limb-project.com/changelog/limb/?cs=7110
Added:
3.x/trunk/limb/bundle/cli/
3.x/trunk/limb/bundle/src/
3.x/trunk/limb/bundle/src/lmbBundler.class.php
3.x/trunk/limb/bundle/tests/
3.x/trunk/limb/bundle/tests/cases/
3.x/trunk/limb/bundle/tests/cases/.setup.php
3.x/trunk/limb/bundle/tests/cases/lmbBundlerTest.class.php
3.x/trunk/limb/bundle/tests/fixture/
3.x/trunk/limb/bundle/tests/fixture/first-level.php
3.x/trunk/limb/bundle/tests/fixture/lmb_require.php
3.x/trunk/limb/bundle/tests/fixture/require.php
3.x/trunk/limb/bundle/tests/fixture/require_once.php
3.x/trunk/limb/bundle/tests/fixture/second-level.php
3.x/trunk/limb/bundle/tests/fixture/sub_folder_depended.php
3.x/trunk/limb/bundle/tests/fixture/subfolder/
3.x/trunk/limb/bundle/tests/fixture/subfolder/require.php
3.x/trunk/limb/bundle/tests/fixture/subfolder/sub_folder.php
3.x/trunk/limb/bundle/tests/fixture/with_comments.php
Log:
-- initial bundle implementation
Added: 3.x/trunk/limb/bundle/src/lmbBundler.class.php
===================================================================
--- 3.x/trunk/limb/bundle/src/lmbBundler.class.php (rev 0)
+++ 3.x/trunk/limb/bundle/src/lmbBundler.class.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,134 @@
+<?php
+
+class lmbBundler
+{
+ static public $regexp_for_requires = '/^\s*((lmb_)?require(_once)?)\s*\([\'|\"]([a-zA-z0-9\-_.\/]+).*$/m';
+ public $include_paths;
+ protected $_includes = array();
+ protected $_verbose;
+
+ function __construct($include_path, $verbose = false)
+ {
+ $this->include_paths = explode(':', $include_path);
+ foreach($this->include_paths as $key => $path)
+ {
+ if(!strlen($path))
+ unset($this->include_paths[$key]);
+ }
+
+ $this->_verbose = $verbose;
+ }
+
+ static function getDependenciesFromFile($file)
+ {
+ $file = trim($file);
+ $matches = array();
+ preg_match_all(self::$regexp_for_requires, file_get_contents($file), $matches);
+ if(!isset($matches[4]))
+ return array();
+
+ $matches = array_unique($matches[4]);
+ //array_walk($matches,'array_trim');
+ return $matches;
+ }
+
+ function resolvePath($file)
+ {
+ if($this->isPathAbsolute($file))
+ return $file;
+
+ $file_path = false;
+ foreach($this->include_paths as $include_path)
+ {
+ $full_path = $include_path . '/' . $file;
+
+ if(!file_exists($full_path)) {
+ continue;
+ } else {
+ $file_path = $full_path;
+ break;
+ }
+ }
+
+ return $file_path;
+ }
+
+ function isPathAbsolute($path)
+ {
+ return ('/' === $path{0});
+ }
+
+ function add($file)
+ {
+ $file = realpath(trim($file));
+ if(in_array($file, $this->_includes))
+ {
+ if($this->_verbose)
+ echo 'exist: '.$file.PHP_EOL;
+ return;
+ }
+
+ if($this->_verbose)
+ echo 'add: '.$file.PHP_EOL;
+
+ $deps = self::getDependenciesFromFile($file);
+
+ foreach($deps as $dependency)
+ {
+ $dependency_path = $this->resolvePath($dependency);
+
+ if(in_array($dependency_path, $this->_includes))
+ continue;
+
+ if($this->_verbose)
+ echo 'dependency: '.$dependency_path.PHP_EOL;
+
+ $this->add($dependency_path);
+ }
+
+ if($this->_verbose)
+ echo 'pushed: '.$file.PHP_EOL;
+
+ if(!in_array($file, $this->_includes))
+ array_push($this->_includes, $file);
+ }
+
+ function getIncludes()
+ {
+ return $this->_includes;
+ }
+
+ static function cleanUpFile($file)
+ {
+ $lines = file(trim($file));
+
+ if(!is_array($lines))
+ return '';
+ //removing <?php stuff
+ array_shift($lines);
+
+ if(false !== strpos($lines[count($lines)-1], '?>'))
+ array_pop($lines);
+
+ $lines_count = count($lines);
+
+ //filter unneccessary require's
+ for($i = 0;$i<$lines_count;$i++)
+ {
+ if(preg_match(self::$regexp_for_requires, $lines[$i]))
+ unset($lines[$i]);
+ }
+
+ return implode("", $lines);
+ }
+
+ function makeBundle($without_tags = false)
+ {
+ echo $without_tags ? '' : "<?php\n";
+ foreach(array_unique($this->_includes) as $file)
+ {
+ echo "//-----------".$file."------------".PHP_EOL;
+ echo self::cleanUpFile($file);
+ }
+ }
+}
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/cases/.setup.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/cases/.setup.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/cases/.setup.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,9 @@
+<?php
+if(!defined('LIMB_VAR_DIR'))
+{
+ @define('LIMB_VAR_DIR', dirname(__FILE__) . '/../../../var');
+ if(!is_dir(LIMB_VAR_DIR) && !mkdir(LIMB_VAR_DIR))
+ throw new Exception("Could not create LIMB_VAR_DIR at '" . LIMB_VAR_DIR . "' during tests execution");
+}
+
+
Added: 3.x/trunk/limb/bundle/tests/cases/lmbBundlerTest.class.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/cases/lmbBundlerTest.class.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/cases/lmbBundlerTest.class.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,119 @@
+<?php
+
+require_once(dirname(__FILE__) . '/../../src/lmbBundler.class.php');
+
+class lmbBundlerTest extends UnitTestCase
+{
+ var $fixture_dir;
+
+ function __construct()
+ {
+ $this->fixture_dir = dirname(__FILE__).'/../fixture/';
+ }
+
+ function testGetDependenciesFromFile()
+ {
+ $file = $this->fixture_dir . 'first-level.php';
+
+ $deps = lmbBundler::getDependenciesFromFile($file);
+ $this->assertEqual(3, count($deps));
+ $this->assertTrue('./require.php', $deps[0]);
+ $this->assertTrue('require_once.php', $deps[1]);
+ $this->assertTrue('lmb_require.php', $deps[2]);
+ }
+
+ function testGetDependenciesFromFile_WithoutComments()
+ {
+ $file = $this->fixture_dir . 'with_comments.php';
+
+ $deps = lmbBundler::getDependenciesFromFile($file);
+ $this->assertEqual(0, count($deps));
+ }
+
+ function testGetNewDependencies_emptyIncludesList()
+ {
+ $file = $this->fixture_dir . 'second-level.php';
+
+ $bundler = new lmbBundler($include_path = $this->fixture_dir . PATH_SEPARATOR);
+ $bundler->add($file);
+ $includes = $bundler->getIncludes();
+
+ $this->assertEqual(5, count($includes));
+ $this->assertTrue(strpos($includes[0], './require.php'));
+ $this->assertTrue(false !== strpos($includes[0], $this->fixture_dir));
+ $this->assertTrue(strpos($includes[1], 'require_once.php'));
+ $this->assertTrue(false !== strpos($includes[1], $this->fixture_dir));
+ $this->assertTrue(strpos($includes[2], 'lmb_require.php'));
+ $this->assertTrue(false !== strpos($includes[2], $this->fixture_dir));
+ $this->assertTrue(strpos($includes[3], 'first-level.php'));
+ $this->assertTrue(false !== strpos($includes[3], $this->fixture_dir));
+ $this->assertTrue(strpos($includes[4], 'second-level.php'));
+ $this->assertTrue(false !== strpos($includes[4], $this->fixture_dir));
+ }
+
+ function estGetNewDependencies_filledIncludesList()
+ {
+ $file = $this->fixture_dir . 'second-level.php';
+
+ $bundler = new lmbBundler($include_path = $this->fixture_dir . PATH_SEPARATOR);
+
+ $bundler->add($file);
+ $includes1 = $bundler->getIncludes();
+
+ $bundler->add($file);
+ $includes2 = $bundler->getIncludes();
+
+ $this->assertIdentical($includes1, $includes2);
+ }
+
+ function testGetNewDependencies_properlyResolveIncludePaths_findInFirstIncludePaths()
+ {
+ $fixture_sub_folder = $this->fixture_dir . 'subfolder/';
+
+ $bundler = new lmbBundler($include_path = $this->fixture_dir . PATH_SEPARATOR . $fixture_sub_folder);
+
+ $file = $this->fixture_dir . 'first-level.php';
+
+ $bundler->add($file);
+ $includes = $bundler->getIncludes();
+
+ $this->assertEqual(4, count($includes));
+ $this->assertTrue(strpos($includes[0], './require.php'));
+ $this->assertTrue(false === strpos($includes[0], $fixture_sub_folder));
+ }
+
+ function testGetNewDependencies_properlyResolveIncludePaths_findNotInFirstIncludePath()
+ {
+ $fixture_sub_folder = $this->fixture_dir . '/subfolder/';
+
+ $bundler = new lmbBundler($include_path = $this->fixture_dir . PATH_SEPARATOR . $fixture_sub_folder);
+
+ $file = $this->fixture_dir . 'sub_folder_depended.php';
+
+ $bundler->add($file);
+ $includes = $bundler->getIncludes();
+
+ $this->assertEqual(2, count($includes));
+ $this->assertTrue(strpos($includes[0], 'sub_folder.php'));
+ $this->assertTrue(false !== strpos($includes[0], $fixture_sub_folder));
+ }
+
+ function testCleanUpFile()
+ {
+ $cleaned = lmbBundler::cleanUpFile($this->fixture_dir . 'first-level.php');
+ $this->assertIdentical('bundler!', trim($cleaned));
+ }
+
+ function testMakeBundle()
+ {
+ $bundler = new lmbBundler($include_path = $this->fixture_dir . PATH_SEPARATOR);
+ $bundler->add($this->fixture_dir . 'first-level.php');
+
+ ob_start();
+ $bundler->makeBundle($without_tags = true);
+ $content = ob_get_contents();
+ ob_end_clean();
+ $this->assertIdentical(trim($content), 'hello world from bundler!');
+ }
+}
+
Added: 3.x/trunk/limb/bundle/tests/fixture/first-level.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/first-level.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/first-level.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,6 @@
+<?php
+ require ('./require.php');
+require_once('require_once.php');
+lmb_require('lmb_require.php');
+ bundler!
+?>
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/lmb_require.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/lmb_require.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/lmb_require.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,2 @@
+<?php
+ from
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/require.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/require.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/require.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,2 @@
+<?php
+ hello
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/require_once.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/require_once.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/require_once.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,2 @@
+<?php
+ world
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/second-level.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/second-level.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/second-level.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,2 @@
+<?php
+require('./first-level.php');
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/sub_folder_depended.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/sub_folder_depended.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/sub_folder_depended.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,2 @@
+<?php
+require('sub_folder.php');
\ No newline at end of file
Added: 3.x/trunk/limb/bundle/tests/fixture/subfolder/require.php
===================================================================
Added: 3.x/trunk/limb/bundle/tests/fixture/subfolder/sub_folder.php
===================================================================
Added: 3.x/trunk/limb/bundle/tests/fixture/with_comments.php
===================================================================
--- 3.x/trunk/limb/bundle/tests/fixture/with_comments.php (rev 0)
+++ 3.x/trunk/limb/bundle/tests/fixture/with_comments.php 2008-07-10 09:29:34 UTC (rev 7110)
@@ -0,0 +1,5 @@
+<?php
+/**
+ * require('block_comment.php');
+ */
+//require('inline_comment.php');
\ No newline at end of file
More information about the limb-svn
mailing list