Skip to content

Commit

Permalink
Merge pull request #29 from vimeo/config-nesting
Browse files Browse the repository at this point in the history
re-Config-uration
  • Loading branch information
muglug committed Dec 30, 2016
2 parents 641ffc0 + 90fee45 commit 2709198
Show file tree
Hide file tree
Showing 20 changed files with 633 additions and 321 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ cat > psalm.xml << EOF
stopOnFirstError="false"
useDocblockTypes="true"
>
<inspectFiles>
<projectFiles>
<directory name="src" />
</inspectFiles>
</projectFiles>
</psalm>
EOF
```
Expand Down
159 changes: 159 additions & 0 deletions config.xsd
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="psalm" type="PsalmType" />

<xs:complexType name="PsalmType">
<xs:sequence>
<xs:element name="projectFiles" type="ProjectFilesType" minOccurs="1" maxOccurs="1" />
<xs:element name="fileExtensions" type="FileExtensionsType" minOccurs="0" maxOccurs="1" />
<xs:element name="mockClasses" type="MockClassesType" minOccurs="0" maxOccurs="1" />
<xs:element name="plugins" type="PluginsType" minOccurs="0" maxOccurs="1" />
<xs:element name="issueHandlers" type="IssueHandlersType" minOccurs="0" maxOccurs="1" />
</xs:sequence>

<xs:attribute name="name" type="xs:string" />
<xs:attribute name="stopOnFirstError" type="xs:string" />
<xs:attribute name="useDocblockTypes" type="xs:string" />
<xs:attribute name="throwExceptionOnError" type="xs:string" />
<xs:attribute name="hideExternalErrors" type="xs:string" />
<xs:attribute name="autoloader" type="xs:string" />
<xs:attribute name="cacheDirectory" type="xs:string" />
<xs:attribute name="usePropertyDefaultForType" type="xs:string" />
<xs:attribute name="allowFileIncludes" type="xs:string" />
<xs:attribute name="totallyTyped" type="xs:string" />
<xs:attribute name="strictBinaryOperands" type="xs:string" />
</xs:complexType>

<xs:complexType name="ProjectFilesType">
<xs:choice maxOccurs="unbounded">
<xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
<xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
<xs:element name="ignoreFiles" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
<xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>

<xs:complexType name="NameAttributeType">
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>

<xs:complexType name="FileExtensionsType">
<xs:sequence>
<xs:element name="extension">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="filetypeHandler" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="MockClassesType">
<xs:sequence>
<xs:element name="class" maxOccurs="unbounded" type="NameAttributeType" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="PluginsType">
<xs:sequence>
<xs:element name="plugin" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="filename" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="IssueHandlersType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="ContinueOutsideLoop" type="IssueHandlerType" minOccurs="0" />
<xs:element name="DeprecatedMethod" type="IssueHandlerType" minOccurs="0" />
<xs:element name="FailedTypeResolution" type="IssueHandlerType" minOccurs="0" />
<xs:element name="ForbiddenCode" type="IssueHandlerType" minOccurs="0" />
<xs:element name="ImplicitToStringCast" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InaccessibleClassConstant" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InaccessibleMethod" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InaccessibleProperty" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidArgument" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidArrayAccess" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidArrayAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidClass" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidDocblock" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidGlobal" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidIterator" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidNamespace" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidOperand" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidPropertyFetch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidReturnType" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidScalarArgument" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidScope" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidStaticInvocation" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidStaticVariable" type="IssueHandlerType" minOccurs="0" />
<xs:element name="InvalidToString" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MethodSignatureMismatch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MissingPropertyDeclaration" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MissingPropertyType" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MissingReturnType" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedArgument" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedArrayAccess" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedArrayOffset" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedInferredReturnType" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedMethodCall" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedOperand" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedPropertyFetch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="MixedStringOffsetAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NoInterfaceProperties" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullArgument" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullArrayAccess" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullOperand" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullPropertyFetch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="NullReference" type="IssueHandlerType" minOccurs="0" />
<xs:element name="ParentNotFound" type="IssueHandlerType" minOccurs="0" />
<xs:element name="PossiblyUndefinedVariable" type="IssueHandlerType" minOccurs="0" />
<xs:element name="TooFewArguments" type="IssueHandlerType" minOccurs="0" />
<xs:element name="TooManyArguments" type="IssueHandlerType" minOccurs="0" />
<xs:element name="TypeCoercion" type="IssueHandlerType" minOccurs="0" />
<xs:element name="TypeDoesNotContainType" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedClass" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedConstant" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedFunction" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedMethod" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedPropertyFetch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedThisPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedThisPropertyFetch" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedTrait" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UndefinedVariable" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UnimplementedInterfaceMethod" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UnrecognizedExpression" type="IssueHandlerType" minOccurs="0" />
<xs:element name="UnrecognizedStatement" type="IssueHandlerType" minOccurs="0" />
</xs:choice>
</xs:complexType>

<xs:complexType name="IssueHandlerType">
<xs:sequence>
<xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
<xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
</xs:choice>

<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>

<xs:attribute name="errorLevel" type="xs:string" />
</xs:complexType>
</xs:schema>
8 changes: 4 additions & 4 deletions examples/psalm.default.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
useDocblockTypes="true"
totallyTyped="false"
>
<inspectFiles>
<projectFiles>
<directory name="src" />
</inspectFiles>
</projectFiles>

<issueHandler>
<issueHandlers>
<InvalidDocblock errorLevel="info" />
<MissingPropertyType errorLevel="info" />
<MissingReturnType errorLevel="info" />
<DeprecatedMethod errorLevel="info" />
<PossiblyUndefinedVariable errorLevel="info" />
</issueHandler>
</issueHandlers>
</psalm>
44 changes: 22 additions & 22 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,66 +6,66 @@
totallyTyped="true"
strictBinaryOperands="false"
>
<inspectFiles>
<projectFiles>
<directory name="src" />
<directory name="tests" />
</inspectFiles>
</projectFiles>

<issueHandler>
<issueHandlers>
<NullOperand errorLevel="suppress" />

<MissingReturnType>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</MissingReturnType>

<MissingPropertyType>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</MissingPropertyType>

<MixedArgument>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</MixedArgument>

<MixedOperand>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</MixedOperand>

<MixedPropertyFetch>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</MixedPropertyFetch>

<NoInterfaceProperties>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</NoInterfaceProperties>

<NullArrayAccess>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</NullArrayAccess>

<NullPropertyFetch>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</NullPropertyFetch>

<NullArgument>
<excludeFiles>
<errorLevel type="suppress">
<directory name="tests" />
</excludeFiles>
</errorLevel>
</NullArgument>
</issueHandler>
</issueHandlers>
</psalm>
10 changes: 5 additions & 5 deletions src/Psalm/Checker/ProjectChecker.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ public function check($debug = false, $is_diff = false, $update_docblocks = fals
$deleted_files = FileChecker::getDeletedReferencedFiles();
$diff_files = $deleted_files;

foreach ($this->config->getIncludeDirs() as $dir_name) {
foreach ($this->config->getProjectDirectories() as $dir_name) {
$diff_files = array_merge($diff_files, self::getDiffFilesInDir($dir_name, $this->config));
}
}

$files_checked = [];

if ($diff_files === null || $deleted_files === null || count($diff_files) > 200) {
foreach ($this->config->getIncludeDirs() as $dir_name) {
foreach ($this->config->getProjectDirectories() as $dir_name) {
$this->checkDirWithConfig($dir_name, $this->config, $debug, $update_docblocks);
}
} else {
Expand Down Expand Up @@ -211,7 +211,7 @@ protected function getAllFiles(Config $config)
$file_extensions = $config->getFileExtensions();
$file_names = [];

foreach ($config->getIncludeDirs() as $dir_name) {
foreach ($config->getProjectDirectories() as $dir_name) {
/** @var RecursiveDirectoryIterator */
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir_name));
$iterator->rewind();
Expand Down Expand Up @@ -371,7 +371,7 @@ protected static function getConfigForPath($path)
$maybe_path = $dir_path . Config::DEFAULT_FILE_NAME;

if (file_exists($maybe_path)) {
$config = Config::loadFromXML($maybe_path);
$config = Config::loadFromXMLFile($maybe_path);

if ($config->autoloader) {
require_once($dir_path . $config->autoloader);
Expand Down Expand Up @@ -405,7 +405,7 @@ public function setConfigXML($path_to_config)

$dir_path = dirname($path_to_config) . '/';

$this->config = Config::loadFromXML($path_to_config);
$this->config = Config::loadFromXMLFile($path_to_config);

if ($this->config->autoloader) {
require_once($dir_path . $this->config->autoloader);
Expand Down
Loading

0 comments on commit 2709198

Please sign in to comment.