[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