Compare commits

..
19 Commits
Author SHA1 Message Date
Barry vd. Heuvel facba3a5e6 Merge pull request #45 from bryceray1121/master
Removing \r from generator in order to prevent ^M from being inserted in...
2013-12-06 08:51:01 -08:00
bryce.ray 7d09f324fa Removing \r from generator in order to prevent ^M from being inserted into line endings after generation 2013-12-06 10:24:13 -06:00
Barry vd. Heuvel af34b1cca2 Add extra class for Artisan
Adds the call() command. Fixes #42
2013-11-13 11:55:25 +01:00
Barry vd. Heuvel 463bfdd70a Add doctrine dependancy for L4.1
Fixes #38
2013-10-18 11:16:02 +02:00
Barry vd. Heuvel ff7d2a33b0 Update readme 2013-10-18 10:29:48 +02:00
Barry vd. Heuvel 3ebfcd1c6c Make facade for interface possible
Fixes #36
2013-10-18 10:17:11 +02:00
Barry vd. Heuvel c3afd5f63c Add ignore option
To ignore models, use the --ignore (-I) argument:
php artisan ide-helper:models --ignore="Admin\Model"
php artisan ide-helper:models -I Post,User
Fixes #35
2013-10-18 10:04:46 +02:00
Barry vd. Heuvel 92abb112e9 Force No answer for writing to files
To write to single file instead, use --nowrite or -N (as mentioned in
#35)
2013-10-18 09:52:41 +02:00
Barry vd. Heuvel 7e1c64fb95 Add SessionStore to Session Facade
Because of changes to the session facade. Fixes #37
2013-10-18 09:35:33 +02:00
Barry vd. Heuvel 5e5cfce28c Refactor a bit 2013-08-25 17:56:29 +02:00
Barry vd. Heuvel 098090ed36 Merge pull request #32 from claar/patch-1
Use camel case for model scope generation
2013-08-25 06:31:59 -07:00
Barry vd. Heuvel 7f055cec7e Merge pull request #33 from claar/patch-2
Include return value when generating scope methods
2013-08-25 06:30:45 -07:00
Ben Claar 5a0f8f1b64 Include return value when generating scope methods
It's handy to specify return values in phpDoc comments. This patch sets the return value to the containing class.
2013-08-23 16:25:03 -05:00
Ben Claar 92ec89bf87 Use camel case for model scope generation
In L4, scope functions only work with camel case (http://four.laravel.com/docs/eloquent#query-scopes)
2013-08-23 14:47:14 -05:00
Barry vd. Heuvel afeaf2f28b Add arguments for query scopes
Should fix #31
2013-08-23 13:47:25 +02:00
Barry vd. Heuvel 865bd8d32b Update readme 2013-08-23 13:31:10 +02:00
Barry vd. Heuvel e368338ba7 Make writing to files more default behaviour
But ask before overwriting. You can still force with -W
2013-08-23 13:29:44 +02:00
Barry vd. Heuvel 7bd3e1cc0a Update docblock 2013-08-23 13:19:57 +02:00
Barry vd. Heuvel 28ce1492ad Update namespace for ReflectionDocblock 2013-08-08 19:09:24 +02:00
5 changed files with 89 additions and 26 deletions
+2 -1
View File
@@ -15,7 +15,8 @@
"illuminate/console": "4.x", "illuminate/console": "4.x",
"illuminate/filesystem": "4.x", "illuminate/filesystem": "4.x",
"phpdocumentor/reflection-docblock": "2.0.0", "phpdocumentor/reflection-docblock": "2.0.0",
"symfony/class-loader": "~2.3" "symfony/class-loader": "~2.3",
"doctrine/dbal": "~2.3"
}, },
"autoload": { "autoload": {
"psr-0": { "psr-0": {
+7 -3
View File
@@ -52,9 +52,9 @@ The Illuminate/Support/helpers.php is already set-up, but you can add/remove you
If you don't want to write your properties yourself, you can use the command `ide-helper:models` to generate If you don't want to write your properties yourself, you can use the command `ide-helper:models` to generate
phpDocs, based on table columns, relations and getters/setters. Still in beta, so please provide feedback if you want. phpDocs, based on table columns, relations and getters/setters. Still in beta, so please provide feedback if you want.
Docs are written to a phpfile (_ide_helper_models.php) in the root of the project, so you can move the docs to the real model. You can now also write the comments directly to your Model file, using the `--write (-W)` option. By default, you are asked to overwrite or
write to a seperate file (_ide_helper_models.php) (You can force No with `--nowrite (-N)`).
You can now also write the comments directly to your Model file, using the `--write (-W)` option. Please make sure to backup your models, before writing the info. Please make sure to backup your models, before writing the info.
It should keep the existing comments and only append new properties/methods. The existing phpdoc is replaced, or added if not found. It should keep the existing comments and only append new properties/methods. The existing phpdoc is replaced, or added if not found.
With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly found columns/relations are saved as phpdocs. With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly found columns/relations are saved as phpdocs.
@@ -81,6 +81,10 @@ You can also scan a different directory, using the --dir option (relative from t
php artisan ide-helper:models --dir="app/workbench/name/package/models" php artisan ide-helper:models --dir="app/workbench/name/package/models"
Models can be ignored using the --ignore (-I) option
php artisan ide-helper:models --ignore="Post,User"
Note: With namespaces, wrap your model name in " signs: `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\User`) Note: With namespaces, wrap your model name in " signs: `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\User`)
### License ### License
@@ -147,7 +147,9 @@ exit('Only to be used as an helper for your IDE');\n\n";
try{ try{
//Some classes extend the facade //Some classes extend the facade
if(class_exists($facade)){ if(interface_exists($facade)){
$output .= "interface $alias extends $facade{\n";
}elseif(class_exists($facade)){
$output .= "class $alias extends $facade{\n"; $output .= "class $alias extends $facade{\n";
}else{ }else{
$output .= "class $alias{\n"; $output .= "class $alias{\n";
@@ -324,6 +326,8 @@ exit('Only to be used as an helper for your IDE');\n\n";
/** /**
* @param \ReflectionMethod $method * @param \ReflectionMethod $method
* @param string $alias * @param string $alias
* @param $class
* @param null $methodName
* @return string * @return string
*/ */
protected function parseMethod($method, $alias, $class, $methodName = null){ protected function parseMethod($method, $alias, $class, $methodName = null){
@@ -357,7 +361,7 @@ exit('Only to be used as an helper for your IDE');\n\n";
$output .= $serializer->getDocComment($phpdoc) ."\n\t public static function ".$methodName."("; $output .= $serializer->getDocComment($phpdoc) ."\n\t public static function ".$methodName."(";
$output .= implode($paramsWithDefault, ", "); $output .= implode($paramsWithDefault, ", ");
$output .= "){\r\n"; $output .= "){\n";
//Only return when not a constructor and not void. //Only return when not a constructor and not void.
$return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return' : ''; $return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return' : '';
@@ -367,13 +371,13 @@ exit('Only to be used as an helper for your IDE');\n\n";
$root = $class->getName(); $root = $class->getName();
if($declaringClass->name != $root){ if($declaringClass->name != $root){
$output .= "\t\t//Method inherited from $declaringClass->name\r\n"; $output .= "\t\t//Method inherited from $declaringClass->name\n";
} }
$output .= "\t\t$return $root::"; $output .= "\t\t$return $root::";
//Write the default parameters in the function call //Write the default parameters in the function call
$output .= $method->name."(".implode($params, ", ").");\r\n"; $output .= $method->name."(".implode($params, ", ").");\n";
$output .= "\t }\n\n"; $output .= "\t }\n\n";
return $output; return $output;
+69 -17
View File
@@ -13,10 +13,10 @@ use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\ClassLoader\ClassMapGenerator; use Symfony\Component\ClassLoader\ClassMapGenerator;
use Barryvdh\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context; use phpDocumentor\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer; use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
/** /**
* A command to generate autocomplete information for your IDE * A command to generate autocomplete information for your IDE
* *
@@ -30,6 +30,7 @@ class ModelsCommand extends Command {
* @var string * @var string
*/ */
protected $name = 'ide-helper:models'; protected $name = 'ide-helper:models';
protected $filename = '_ide_helper_models.php';
/** /**
* The console command description. * The console command description.
@@ -57,9 +58,17 @@ class ModelsCommand extends Command {
$this->write = $this->option('write'); $this->write = $this->option('write');
$this->dir = $this->option('dir'); $this->dir = $this->option('dir');
$model = $this->argument('model'); $model = $this->argument('model');
$ignore = $this->option('ignore');
$this->reset = $this->option('reset'); $this->reset = $this->option('reset');
$content = $this->generateDocs($model); //If filename is default and Write is not specified, ask what to do
if(!$this->write && $filename === $this->filename && !$this->option('nowrite')){
if($this->confirm("Do you want to overwrite the existing model files for '$model'? Choose no to write to $filename instead? (Yes/No): ")){
$this->write = true;
}
}
$content = $this->generateDocs($model, $ignore);
if(!$this->write){ if(!$this->write){
$written = \File::put($filename, $content); $written = \File::put($filename, $content);
@@ -69,7 +78,6 @@ class ModelsCommand extends Command {
$this->error("Failed to write model information to $filename"); $this->error("Failed to write model information to $filename");
} }
} }
} }
@@ -82,7 +90,6 @@ class ModelsCommand extends Command {
{ {
return array( return array(
array('model', InputArgument::OPTIONAL, 'Which models to include', '*'), array('model', InputArgument::OPTIONAL, 'Which models to include', '*'),
); );
} }
@@ -94,14 +101,16 @@ class ModelsCommand extends Command {
protected function getOptions() protected function getOptions()
{ {
return array( return array(
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', '_ide_helper_models.php'), array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', $this->filename),
array('dir', 'D', InputOption::VALUE_OPTIONAL, 'The model dir','app/models'), array('dir', 'D', InputOption::VALUE_OPTIONAL, 'The model dir','app/models'),
array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'), array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'),
array('nowrite', 'N', InputOption::VALUE_NONE, 'Don\'t write to Model file'),
array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'), array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'),
array('ignore', 'I', InputOption::VALUE_OPTIONAL, 'Which models to ignore', ''),
); );
} }
protected function generateDocs($model){ protected function generateDocs($model, $ignore = ''){
$output = "<?php $output = "<?php
@@ -120,7 +129,15 @@ class ModelsCommand extends Command {
$models = explode(',', $model); $models = explode(',', $model);
} }
$ignore = explode(',', $ignore);
foreach($models as $name){ foreach($models as $name){
if(in_array($name, $ignore)){
$this->comment("Ignoring model '$name'");
continue;
}else{
$this->comment("Loading model '$name'");
}
$this->properties = array(); $this->properties = array();
$this->methods = array(); $this->methods = array();
if(class_exists($name)){ if(class_exists($name)){
@@ -225,9 +242,13 @@ class ModelsCommand extends Command {
} }
}elseif(\Str::startsWith($method, 'scope') && $method !== 'scopeQuery'){ }elseif(\Str::startsWith($method, 'scope') && $method !== 'scopeQuery'){
//Magic set<name>Attribute //Magic set<name>Attribute
$name = \Str::snake(substr($method, 5)); $name = \Str::camel(substr($method, 5));
if(!empty($name)){ if(!empty($name)){
$this->setMethod($name, 'static'); $reflection = new \ReflectionMethod($model, $method);
$args = $this->getParameters($reflection);
//Remove the first ($query) argument
array_shift($args);
$this->setMethod($name, $reflection->class, $args);
} }
}elseif(!method_exists('Eloquent', $method) && !\Str::startsWith($method, 'get')){ }elseif(!method_exists('Eloquent', $method) && !\Str::startsWith($method, 'get')){
@@ -293,13 +314,11 @@ class ModelsCommand extends Command {
} }
} }
protected function setMethod($name, $type = null){ protected function setMethod($name, $type = '', $arguments=array()){
if(!isset($this->methods[$name])){ if(!isset($this->methods[$name])){
$this->methods[$name] = array(); $this->methods[$name] = array();
$this->methods[$name]['type'] = 'static';
}
if($type !== null){
$this->methods[$name]['type'] = $type; $this->methods[$name]['type'] = $type;
$this->methods[$name]['arguments'] = $arguments;
} }
} }
@@ -355,8 +374,8 @@ class ModelsCommand extends Command {
if(in_array($name, $methods)){ if(in_array($name, $methods)){
continue; continue;
} }
$name = "$name()"; $arguments = implode(', ',$method['arguments']);
$tag = Tag::createInstance("@method {$method['type']} {$name}", $phpdoc); $tag = Tag::createInstance("@method static {$method['type']} {$name}({$arguments}) ", $phpdoc);
$phpdoc->appendTag($tag); $phpdoc->appendTag($tag);
} }
@@ -387,4 +406,37 @@ class ModelsCommand extends Command {
return $output; return $output;
} }
/**
* Get the parameters and format them correctly
*
* @param $method
* @return array
*/
public function getParameters($method){
//Loop through the default values for paremeters, and make the correct output string
$params = array();
$paramsWithDefault = array();
foreach ($method->getParameters() as $param) {
$paramStr = '$'.$param->getName();
$params[] = $paramStr;
if ($param->isOptional()) {
$default = $param->getDefaultValue();
if(is_bool($default)){
$default = $default? 'true':'false';
}elseif(is_array($default)){
$default = 'array()';
}elseif(is_null($default)){
$default = 'null';
}elseif(is_int($default)){
//$default = $default;
}else{
$default = "'".trim($default)."'";
}
$paramStr .= " = $default";
}
$paramsWithDefault[] = $paramStr;
}
return $paramsWithDefault;
}
} }
+3 -1
View File
@@ -40,7 +40,9 @@ return array(
*/ */
'extra' => array( 'extra' => array(
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'), 'Artisan' => array('Illuminate\Foundation\Artisan'),
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
'Session' => array('Illuminate\Session\Store'),
), ),
'magic' => array( 'magic' => array(