radarrplexorganizrnginxsonarrdashboardsabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepage
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							115 lines
						
					
					
						
							2.7 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
								 Copyright (c) 2009 hamcrest.org
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Controls the process of extracting @factory doctags
							 | 
						|
								 * and generating factory method files.
							 | 
						|
								 *
							 | 
						|
								 * Uses File_Iterator to scan for PHP files.
							 | 
						|
								 */
							 | 
						|
								class FactoryGenerator
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * Path to the Hamcrest PHP files to process.
							 | 
						|
								     *
							 | 
						|
								     * @var string
							 | 
						|
								     */
							 | 
						|
								    private $path;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var array of FactoryFile
							 | 
						|
								     */
							 | 
						|
								    private $factoryFiles;
							 | 
						|
								
							 | 
						|
								    public function __construct($path)
							 | 
						|
								    {
							 | 
						|
								        $this->path = $path;
							 | 
						|
								        $this->factoryFiles = array();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function addFactoryFile(FactoryFile $factoryFile)
							 | 
						|
								    {
							 | 
						|
								        $this->factoryFiles[] = $factoryFile;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function generate()
							 | 
						|
								    {
							 | 
						|
								        $classes = $this->getClassesWithFactoryMethods();
							 | 
						|
								        foreach ($classes as $class) {
							 | 
						|
								            foreach ($class->getMethods() as $method) {
							 | 
						|
								                foreach ($method->getCalls() as $call) {
							 | 
						|
								                    foreach ($this->factoryFiles as $file) {
							 | 
						|
								                        $file->addCall($call);
							 | 
						|
								                    }
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function write()
							 | 
						|
								    {
							 | 
						|
								        foreach ($this->factoryFiles as $file) {
							 | 
						|
								            $file->build();
							 | 
						|
								            $file->write();
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getClassesWithFactoryMethods()
							 | 
						|
								    {
							 | 
						|
								        $classes = array();
							 | 
						|
								        $files = $this->getSortedFiles();
							 | 
						|
								        foreach ($files as $file) {
							 | 
						|
								            $class = $this->getFactoryClass($file);
							 | 
						|
								            if ($class !== null) {
							 | 
						|
								                $classes[] = $class;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return $classes;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getSortedFiles()
							 | 
						|
								    {
							 | 
						|
								        $iter = \File_Iterator_Factory::getFileIterator($this->path, '.php');
							 | 
						|
								        $files = array();
							 | 
						|
								        foreach ($iter as $file) {
							 | 
						|
								            $files[] = $file;
							 | 
						|
								        }
							 | 
						|
								        sort($files, SORT_STRING);
							 | 
						|
								
							 | 
						|
								        return $files;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getFactoryClass($file)
							 | 
						|
								    {
							 | 
						|
								        $name = $this->getFactoryClassName($file);
							 | 
						|
								        if ($name !== null) {
							 | 
						|
								            require_once $file;
							 | 
						|
								
							 | 
						|
								            if (class_exists($name)) {
							 | 
						|
								                $class = new FactoryClass(substr($file, strpos($file, 'Hamcrest/')), new ReflectionClass($name));
							 | 
						|
								                if ($class->isFactory()) {
							 | 
						|
								                    return $class;
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return null;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getFactoryClassName($file)
							 | 
						|
								    {
							 | 
						|
								        $content = file_get_contents($file);
							 | 
						|
								        if (preg_match('/namespace\s+(.+);/', $content, $namespace)
							 | 
						|
								            && preg_match('/\n\s*class\s+(\w+)\s+extends\b/', $content, $className)
							 | 
						|
								            && preg_match('/@factory\b/', $content)
							 | 
						|
								        ) {
							 | 
						|
								            return $namespace[1] . '\\' . $className[1];
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return null;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |